Lines Matching refs:sc

94 uart_pps_print_mode(struct uart_softc *sc)
97 device_printf(sc->sc_dev, "PPS capture mode: ");
98 switch(sc->sc_pps_mode & UART_PPS_SIGNAL_MASK) {
112 if (sc->sc_pps_mode & UART_PPS_INVERT_PULSE)
114 if (sc->sc_pps_mode & UART_PPS_NARROW_PULSE)
122 struct uart_softc *sc;
125 sc = arg1;
126 tmp = sc->sc_pps_mode;
132 sc->sc_pps_mode = tmp;
137 uart_pps_process(struct uart_softc *sc, int ser_sig)
143 switch(sc->sc_pps_mode & UART_PPS_SIGNAL_MASK) {
168 pps_capture(&sc->sc_pps);
169 if (sc->sc_pps_mode & UART_PPS_NARROW_PULSE) {
171 if (now > sc->sc_pps_captime + 500 * SBT_1MS) {
172 sc->sc_pps_captime = now;
173 pps_event(&sc->sc_pps, PPS_CAPTUREASSERT);
174 pps_event(&sc->sc_pps, PPS_CAPTURECLEAR);
178 if (sc->sc_pps_mode & UART_PPS_INVERT_PULSE)
180 pps_event(&sc->sc_pps, is_assert ? PPS_CAPTUREASSERT :
186 uart_pps_init(struct uart_softc *sc)
191 ctx = device_get_sysctl_ctx(sc->sc_dev);
192 tree = device_get_sysctl_tree(sc->sc_dev);
202 sc->sc_pps_mode = UART_PPS_CTS;
204 sc->sc_pps_mode = UART_PPS_DCD;
206 TUNABLE_INT_FETCH("hw.uart.pps_mode", &sc->sc_pps_mode);
208 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE, sc, 0,
212 if (!uart_pps_mode_valid(sc->sc_pps_mode)) {
213 device_printf(sc->sc_dev,
215 sc->sc_pps_mode);
216 sc->sc_pps_mode = UART_PPS_DISABLED;
218 uart_pps_print_mode(sc);
221 sc->sc_pps.ppscap = PPS_CAPTUREBOTH;
222 sc->sc_pps.driver_mtx = uart_tty_getlock(sc);
223 sc->sc_pps.driver_abi = PPS_ABI_VERSION;
224 pps_init_abi(&sc->sc_pps);
268 uart_sched_softih(struct uart_softc *sc, uint32_t ipend)
273 old = sc->sc_ttypend;
275 } while (!atomic_cmpset_32(&sc->sc_ttypend, old, new));
278 swi_sched(sc->sc_softih, 0);
293 struct uart_softc *sc = arg;
296 if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) {
301 if (sc->sc_opened)
302 uart_sched_softih(sc, SER_INT_BREAK);
324 struct uart_softc *sc = arg;
326 if (sc->sc_opened) {
327 UART_RECEIVE(sc);
328 if (uart_rx_put(sc, UART_STAT_OVERRUN))
329 sc->sc_rxbuf[sc->sc_rxput] = UART_STAT_OVERRUN;
330 uart_sched_softih(sc, SER_INT_RXREADY);
332 sc->sc_rxoverruns++;
333 UART_FLUSH(sc, UART_FLUSH_RECEIVER);
343 struct uart_softc *sc = arg;
347 rxp = sc->sc_rxput;
349 UART_RECEIVE(sc);
351 if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) {
352 while (rxp != sc->sc_rxput) {
353 kdb_alt_break(sc->sc_rxbuf[rxp++], &sc->sc_altbrk);
354 if (rxp == sc->sc_rxbufsz)
359 if (sc->sc_opened)
360 uart_sched_softih(sc, SER_INT_RXREADY);
362 sc->sc_rxput = sc->sc_rxget; /* Ignore received data. */
376 struct uart_softc *sc = arg;
379 sig = UART_GETSIG(sc);
385 if (sc->sc_pps.ppsparam.mode & PPS_CAPTUREBOTH) {
386 uart_pps_process(sc, sig);
397 old = sc->sc_ttypend;
400 } while (!atomic_cmpset_32(&sc->sc_ttypend, old, new));
402 if (sc->sc_opened)
403 uart_sched_softih(sc, SER_INT_SIGCHG);
413 struct uart_softc *sc = arg;
415 if (sc->sc_txbusy) {
416 sc->sc_txbusy = 0;
417 uart_sched_softih(sc, SER_INT_TXIDLE);
425 struct uart_softc *sc = arg;
428 if (sc->sc_leaving)
432 testintr = sc->sc_testintr;
433 while ((!testintr || cnt < 20) && (ipend = UART_IPEND(sc)) != 0) {
436 uart_intr_overrun(sc);
438 uart_intr_break(sc);
440 uart_intr_rxready(sc);
442 uart_intr_sigchg(sc);
444 uart_intr_txidle(sc);
447 if (sc->sc_polled) {
448 callout_reset(&sc->sc_timer, hz / uart_poll_freq,
449 (callout_func_t *)uart_intr, sc);
479 struct uart_softc *sc;
481 sc = device_get_softc(dev);
482 return (UART_IPEND(sc));
488 struct uart_softc *sc;
490 sc = device_get_softc(dev);
491 return ((sc->sc_sysdev != NULL) ? 1 : 0);
497 struct uart_softc *sc;
501 sc = device_get_softc(dev);
507 if (sc->sc_class == NULL)
517 kobj_init((kobj_t)sc, (kobj_class_t)sc->sc_class);
518 sc->sc_dev = dev;
520 device_set_desc(dev, uart_getname(sc->sc_class));
529 sc->sc_rrid = rid;
530 sc->sc_rtype = SYS_RES_IOPORT;
531 sc->sc_rres = bus_alloc_resource_any(dev, sc->sc_rtype, &sc->sc_rrid,
533 if (sc->sc_rres == NULL) {
534 sc->sc_rrid = rid;
535 sc->sc_rtype = SYS_RES_MEMORY;
536 sc->sc_rres = bus_alloc_resource_any(dev, sc->sc_rtype,
537 &sc->sc_rrid, RF_ACTIVE);
538 if (sc->sc_rres == NULL)
549 sc->sc_bas.bsh = rman_get_bushandle(sc->sc_rres);
550 sc->sc_bas.bst = rman_get_bustag(sc->sc_rres);
551 sc->sc_bas.chan = chan;
552 sc->sc_bas.regshft = regshft;
553 sc->sc_bas.regiowidth = regiowidth;
554 sc->sc_bas.rclk = (rclk == 0) ? sc->sc_class->uc_rclk : rclk;
555 sc->sc_bas.busy_detect = !!(quirks & UART_F_BUSY_DETECT);
559 uart_cpu_eqres(&sc->sc_bas, &sysdev->bas)) {
561 sc->sc_sysdev = sysdev;
562 sysdev->bas.rclk = sc->sc_bas.rclk;
566 error = UART_PROBE(sc);
567 bus_release_resource(dev, sc->sc_rtype, sc->sc_rrid, sc->sc_rres);
574 struct uart_softc *sc, *sc0;
586 sc = malloc(sc0->sc_class->size, M_UART, M_WAITOK|M_ZERO);
587 bcopy(sc0, sc, sizeof(*sc));
588 device_set_softc(dev, sc);
590 sc = sc0;
596 if (sc->sc_sysdev != NULL)
597 sc->sc_sysdev->sc = sc;
604 sc->sc_leaving = 1;
606 mtx_init(&sc->sc_hwmtx_s, "uart_hwmtx", NULL, MTX_SPIN);
607 if (sc->sc_hwmtx == NULL)
608 sc->sc_hwmtx = &sc->sc_hwmtx_s;
614 sc->sc_rres = bus_alloc_resource_any(dev, sc->sc_rtype, &sc->sc_rrid,
616 if (sc->sc_rres == NULL) {
617 mtx_destroy(&sc->sc_hwmtx_s);
620 sc->sc_bas.bsh = rman_get_bushandle(sc->sc_rres);
621 sc->sc_bas.bst = rman_get_bustag(sc->sc_rres);
629 sc->sc_rxbufsz = MAX(384, sc->sc_rxfifosz * 3);
630 sc->sc_rxbuf = malloc(sc->sc_rxbufsz * sizeof(*sc->sc_rxbuf),
632 sc->sc_txbuf = malloc(sc->sc_txfifosz * sizeof(*sc->sc_txbuf),
635 error = UART_ATTACH(sc);
639 if (sc->sc_hwiflow || sc->sc_hwoflow) {
642 if (sc->sc_hwiflow) {
646 if (sc->sc_hwoflow) {
653 if (sc->sc_sysdev != NULL) {
654 if (sc->sc_sysdev->baudrate == 0) {
655 if (UART_IOCTL(sc, UART_IOCTL_BAUD,
656 (intptr_t)&sc->sc_sysdev->baudrate) != 0)
657 sc->sc_sysdev->baudrate = -1;
659 switch (sc->sc_sysdev->type) {
673 printf(" (%d,%c,%d,%d)\n", sc->sc_sysdev->baudrate,
674 "noems"[sc->sc_sysdev->parity], sc->sc_sysdev->databits,
675 sc->sc_sysdev->stopbits);
678 sc->sc_leaving = 0;
679 sc->sc_testintr = 1;
680 filt = uart_intr(sc);
681 sc->sc_testintr = 0;
689 sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ,
690 &sc->sc_irid, RF_ACTIVE | RF_SHAREABLE);
692 if (sc->sc_ires != NULL) {
693 error = bus_setup_intr(dev, sc->sc_ires, INTR_TYPE_TTY,
694 uart_intr, NULL, sc, &sc->sc_icookie);
695 sc->sc_fastintr = (error == 0) ? 1 : 0;
697 if (!sc->sc_fastintr)
698 error = bus_setup_intr(dev, sc->sc_ires,
700 (driver_intr_t *)uart_intr, sc, &sc->sc_icookie);
704 bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irid,
705 sc->sc_ires);
706 sc->sc_ires = NULL;
709 if (sc->sc_ires == NULL) {
711 sc->sc_polled = 1;
712 callout_init(&sc->sc_timer, 1);
713 callout_reset(&sc->sc_timer, hz / uart_poll_freq,
714 (callout_func_t *)uart_intr, sc);
717 if (bootverbose && (sc->sc_fastintr || sc->sc_polled)) {
720 if (sc->sc_fastintr) {
724 if (sc->sc_polled) {
731 if (sc->sc_sysdev != NULL && sc->sc_sysdev->attach != NULL) {
732 if ((error = sc->sc_sysdev->attach(sc)) != 0)
735 if ((error = uart_tty_attach(sc)) != 0)
737 uart_pps_init(sc);
740 if (sc->sc_sysdev != NULL)
741 sc->sc_sysdev->hwmtx = sc->sc_hwmtx;
743 if (sc->sc_rxfifosz > 1)
746 "rx_overruns", CTLFLAG_RD, &sc->sc_rxoverruns, 0,
752 free(sc->sc_txbuf, M_UART);
753 free(sc->sc_rxbuf, M_UART);
755 if (sc->sc_ires != NULL) {
756 bus_teardown_intr(dev, sc->sc_ires, sc->sc_icookie);
757 bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irid,
758 sc->sc_ires);
760 bus_release_resource(dev, sc->sc_rtype, sc->sc_rrid, sc->sc_rres);
762 mtx_destroy(&sc->sc_hwmtx_s);
770 struct uart_softc *sc;
772 sc = device_get_softc(dev);
774 sc->sc_leaving = 1;
776 if (sc->sc_sysdev != NULL)
777 sc->sc_sysdev->hwmtx = NULL;
779 UART_DETACH(sc);
781 if (sc->sc_sysdev != NULL && sc->sc_sysdev->detach != NULL)
782 (*sc->sc_sysdev->detach)(sc);
784 uart_tty_detach(sc);
786 free(sc->sc_txbuf, M_UART);
787 free(sc->sc_rxbuf, M_UART);
789 if (sc->sc_ires != NULL) {
790 bus_teardown_intr(dev, sc->sc_ires, sc->sc_icookie);
791 bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irid,
792 sc->sc_ires);
794 bus_release_resource(dev, sc->sc_rtype, sc->sc_rrid, sc->sc_rres);
796 mtx_destroy(&sc->sc_hwmtx_s);
798 if (sc->sc_class->size > device_get_driver(dev)->size) {
800 free(sc, M_UART);
809 struct uart_softc *sc;
811 sc = device_get_softc(dev);
812 return (UART_ATTACH(sc));
819 if (di->sc)
820 UART_GRAB(di->sc);
827 if (di->sc)
828 UART_UNGRAB(di->sc);