Lines Matching refs:sc
73 extern int ucom_modem(struct ucom_softc *sc, int sigon, int sigoff);
122 static void ucom_close(struct ucom_softc *sc);
171 ucom_attach(struct ucom_super_softc *ssc, struct ucom_softc *sc,
180 if ((sc == NULL) ||
213 sc[subunit].sc_subunit = subunit;
214 sc[subunit].sc_super = ssc;
215 sc[subunit].sc_mtx = umtx;
216 sc[subunit].sc_parent = parent;
217 sc[subunit].sc_callback = callback;
219 error = ucom_attach_tty(ssc, &sc[subunit]);
221 ucom_detach(ssc, &sc[0]);
228 sc[subunit].sc_flag = UCOM_FLAG_ATTACHED;
240 * by "ssc" and "sc" is zero or has already been detached.
243 ucom_detach(struct ucom_super_softc *ssc, struct ucom_softc *sc)
252 if (sc[subunit].sc_flag & UCOM_FLAG_ATTACHED) {
253 ucom_detach_tty(ssc, &sc[subunit]);
256 sc[subunit].sc_flag &= ~UCOM_FLAG_ATTACHED;
306 ucom_attach_tty(struct ucom_super_softc *ssc, struct ucom_softc *sc)
310 ret = snprintf_s(sc->sc_name, TTY_NAME_LEN, TTY_NAME_LEN - 1, "/dev/ttyUSB%d", sc->sc_subunit);
315 (void)register_driver(sc->sc_name, &tty_usb_fops, 0666, sc);
317 ssc->sc_unit, sc->sc_subunit);
320 ucom_cons_softc = sc;
334 ucom_detach_tty(struct ucom_super_softc *ssc, struct ucom_softc *sc)
338 UCOM_MTX_LOCK(sc);
339 sc->sc_flag |= UCOM_FLAG_GONE;
340 sc->sc_flag &= ~(UCOM_FLAG_HL_READY | UCOM_FLAG_LL_READY);
341 ucom_close(sc); /* close, if any */
342 UCOM_MTX_UNLOCK(sc);
344 (void)unregister_driver(sc->sc_name);
346 UCOM_MTX_LOCK(sc);
350 if (sc->sc_callback->ucom_stop_read)
351 (sc->sc_callback->ucom_stop_read) (sc);
352 if (sc->sc_callback->ucom_stop_write)
353 (sc->sc_callback->ucom_stop_write) (sc);
354 UCOM_MTX_UNLOCK(sc);
382 ucom_queue_command(struct ucom_softc *sc,
386 struct ucom_super_softc *ssc = sc->sc_super;
389 UCOM_MTX_ASSERT(sc, MA_OWNED);
405 task->sc = sc;
425 sc->sc_last_start_xfer = &task->hdr;
429 ucom_shutdown(struct ucom_softc *sc)
439 ucom_cfg_is_gone(struct ucom_softc *sc)
441 struct ucom_super_softc *ssc = sc->sc_super;
451 struct ucom_softc *sc = task->sc;
453 if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) {
456 if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) {
461 if (_task == sc->sc_last_start_xfer)
462 sc->sc_flag |= UCOM_FLAG_GP_DATA;
464 if (sc->sc_callback->ucom_start_read) {
465 (sc->sc_callback->ucom_start_read) (sc);
467 if (sc->sc_callback->ucom_start_write) {
468 (sc->sc_callback->ucom_start_write) (sc);
473 ucom_start_transfers(struct ucom_softc *sc)
475 if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) {
482 if (sc->sc_callback->ucom_start_read) {
483 (sc->sc_callback->ucom_start_read) (sc);
485 if (sc->sc_callback->ucom_start_write) {
486 (sc->sc_callback->ucom_start_write) (sc);
495 struct ucom_softc *sc = task->sc;
499 if (sc->sc_flag & UCOM_FLAG_LL_READY) {
503 sc->sc_flag |= UCOM_FLAG_LL_READY;
505 if (sc->sc_callback->ucom_cfg_open) {
506 (sc->sc_callback->ucom_cfg_open) (sc);
509 usb_pause_mtx(sc->sc_mtx, hz / 10);
515 ucom_open(struct ucom_softc *sc)
519 UCOM_MTX_ASSERT(sc, MA_OWNED);
521 if (sc->sc_flag & UCOM_FLAG_GONE) {
524 if (sc->sc_flag & UCOM_FLAG_HL_READY) {
528 DPRINTF("sc = %p\n", sc);
530 if (sc->sc_callback->ucom_pre_open) {
535 error = (sc->sc_callback->ucom_pre_open) (sc);
541 sc->sc_flag |= UCOM_FLAG_HL_READY;
544 sc->sc_flag &= ~UCOM_FLAG_GP_DATA;
546 sc->sc_lsr = 0;
547 sc->sc_msr = 0;
548 sc->sc_mcr = 0;
551 sc->sc_pls_curr = 0;
552 sc->sc_pls_set = 0;
553 sc->sc_pls_clr = 0;
556 sc->sc_jitterbuf_in = 0;
557 sc->sc_jitterbuf_out = 0;
559 ucom_queue_command(sc, ucom_cfg_open, NULL,
560 &sc->sc_open_task[0].hdr,
561 &sc->sc_open_task[1].hdr);
564 ucom_queue_command(sc, ucom_cfg_start_transfers, NULL,
565 &sc->sc_start_task[0].hdr,
566 &sc->sc_start_task[1].hdr);
568 (void)ucom_modem(sc, SER_DTR | SER_RTS, 0);
570 ucom_ring(sc, 0);
572 ucom_break(sc, 0);
582 struct ucom_softc *sc = task->sc;
586 if (sc->sc_flag & UCOM_FLAG_LL_READY) {
587 sc->sc_flag &= ~UCOM_FLAG_LL_READY;
588 if (sc->sc_callback->ucom_cfg_close)
589 (sc->sc_callback->ucom_cfg_close) (sc);
596 ucom_close(struct ucom_softc *sc)
598 UCOM_MTX_ASSERT(sc, MA_OWNED);
600 if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) {
601 DPRINTF("tp=%p already closed\n", sc);
604 ucom_shutdown(sc);
606 ucom_queue_command(sc, ucom_cfg_close, NULL,
607 &sc->sc_close_task[0].hdr,
608 &sc->sc_close_task[1].hdr);
610 sc->sc_flag &= ~(UCOM_FLAG_HL_READY | UCOM_FLAG_RTS_IFLOW);
612 if (sc->sc_callback->ucom_stop_read) {
613 (sc->sc_callback->ucom_stop_read) (sc);
625 ucom_modem(struct ucom_softc *sc, int sigon, int sigoff)
629 UCOM_MTX_ASSERT(sc, MA_OWNED);
631 if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) {
635 if (sc->sc_mcr & SER_DTR) {
638 if (sc->sc_mcr & SER_RTS) {
641 if (sc->sc_msr & SER_CTS) {
644 if (sc->sc_msr & SER_DCD) {
647 if (sc->sc_msr & SER_DSR) {
650 if (sc->sc_msr & SER_RI) {
656 sc->sc_mcr |= SER_DTR;
659 sc->sc_mcr &= ~SER_DTR;
662 sc->sc_mcr |= SER_RTS;
665 sc->sc_mcr &= ~SER_RTS;
667 onoff = (sc->sc_mcr & SER_DTR) ? 1 : 0;
668 ucom_dtr(sc, onoff);
670 onoff = (sc->sc_mcr & SER_RTS) ? 1 : 0;
671 ucom_rts(sc, onoff);
681 struct ucom_softc *sc = task->sc;
688 if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) {
694 if (sc->sc_callback->ucom_cfg_set_dtr)
696 if (sc->sc_callback->ucom_cfg_set_rts)
698 if (sc->sc_callback->ucom_cfg_set_break)
700 if (sc->sc_callback->ucom_cfg_set_ring)
704 notch_bits = (sc->sc_pls_set & sc->sc_pls_clr) & mask;
705 any_bits = (sc->sc_pls_set | sc->sc_pls_clr) & mask;
706 prev_value = sc->sc_pls_curr ^ notch_bits;
707 last_value = sc->sc_pls_curr;
710 sc->sc_pls_curr = 0;
711 sc->sc_pls_set = 0;
712 sc->sc_pls_clr = 0;
716 sc->sc_callback->ucom_cfg_set_dtr(sc,
719 sc->sc_callback->ucom_cfg_set_rts(sc,
722 sc->sc_callback->ucom_cfg_set_break(sc,
725 sc->sc_callback->ucom_cfg_set_ring(sc,
730 sc->sc_callback->ucom_cfg_set_dtr(sc,
733 sc->sc_callback->ucom_cfg_set_rts(sc,
736 sc->sc_callback->ucom_cfg_set_break(sc,
739 sc->sc_callback->ucom_cfg_set_ring(sc,
744 ucom_line_state(struct ucom_softc *sc,
747 UCOM_MTX_ASSERT(sc, MA_OWNED);
749 if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) {
756 sc->sc_pls_curr |= set_bits;
757 sc->sc_pls_curr &= ~clear_bits;
758 sc->sc_pls_set |= set_bits;
759 sc->sc_pls_clr |= clear_bits;
762 ucom_queue_command(sc, ucom_cfg_line_state, NULL,
763 &sc->sc_line_state_task[0].hdr,
764 &sc->sc_line_state_task[1].hdr);
768 ucom_ring(struct ucom_softc *sc, uint8_t onoff)
773 ucom_line_state(sc, UCOM_LS_RING, 0);
775 ucom_line_state(sc, 0, UCOM_LS_RING);
779 ucom_break(struct ucom_softc *sc, uint8_t onoff)
784 ucom_line_state(sc, UCOM_LS_BREAK, 0);
786 ucom_line_state(sc, 0, UCOM_LS_BREAK);
790 ucom_dtr(struct ucom_softc *sc, uint8_t onoff)
795 ucom_line_state(sc, UCOM_LS_DTR, 0);
797 ucom_line_state(sc, 0, UCOM_LS_DTR);
801 ucom_rts(struct ucom_softc *sc, uint8_t onoff)
806 ucom_line_state(sc, UCOM_LS_RTS, 0);
808 ucom_line_state(sc, 0, UCOM_LS_RTS);
816 struct ucom_softc *sc = task->sc;
822 UCOM_MTX_ASSERT(sc, MA_OWNED);
824 if (!(sc->sc_flag & UCOM_FLAG_LL_READY)) {
827 if (sc->sc_callback->ucom_cfg_get_status == NULL) {
835 (sc->sc_callback->ucom_cfg_get_status) (sc, &new_lsr, &new_msr);
837 if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) {
841 onoff = ((sc->sc_msr ^ new_msr) & SER_DCD);
842 lsr_delta = (sc->sc_lsr ^ new_lsr);
844 sc->sc_msr = new_msr;
845 sc->sc_lsr = new_lsr;
848 onoff = (sc->sc_msr & SER_DCD) ? 1 : 0;
852 if ((lsr_delta & ULSR_BI) && (sc->sc_lsr & ULSR_BI)) {
856 if ((lsr_delta & ULSR_FE) && (sc->sc_lsr & ULSR_FE)) {
860 if ((lsr_delta & ULSR_PE) && (sc->sc_lsr & ULSR_PE)) {
866 ucom_status_change(struct ucom_softc *sc)
868 UCOM_MTX_ASSERT(sc, MA_OWNED);
870 if (sc->sc_flag & UCOM_FLAG_CONSOLE)
873 if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) {
878 ucom_queue_command(sc, ucom_cfg_status_change, NULL,
879 &sc->sc_status_task[0].hdr,
880 &sc->sc_status_task[1].hdr);
884 ucom_outwakeup(struct ucom_softc *sc)
886 UCOM_MTX_ASSERT(sc, MA_OWNED);
888 DPRINTF("sc = %p\n", sc);
890 ucom_start_transfers(sc);
901 ucom_get_data(struct ucom_softc *sc, struct usb_page_cache *pc,
905 UCOM_MTX_ASSERT(sc, MA_OWNED);
936 ucom_put_data(struct ucom_softc *sc, struct usb_page_cache *pc,
940 UCOM_MTX_ASSERT(sc, MA_OWNED);
1022 tx_data_copy_in(struct ucom_softc *sc, const void *tx_data, unsigned int len)
1027 UCOM_MTX_LOCK(sc);
1045 UCOM_MTX_UNLOCK(sc);
1052 UCOM_MTX_UNLOCK(sc);
1060 UCOM_MTX_UNLOCK(sc);
1070 UCOM_MTX_UNLOCK(sc);
1351 struct ucom_softc *sc = (struct ucom_softc *)drvData->priv;
1354 UCOM_MTX_LOCK(sc);
1356 UCOM_MTX_UNLOCK(sc);
1360 ret = -ucom_open(sc);
1361 UCOM_MTX_UNLOCK(sc);
1370 struct ucom_softc *sc = (struct ucom_softc *)drvData->priv;
1372 UCOM_MTX_LOCK(sc);
1374 ucom_close(sc);
1375 UCOM_MTX_UNLOCK(sc);
1384 struct ucom_softc *sc = (struct ucom_softc *)drvData->priv;
1387 UCOM_MTX_LOCK(sc);
1404 UCOM_MTX_UNLOCK(sc);
1411 UCOM_MTX_UNLOCK(sc);
1419 UCOM_MTX_UNLOCK(sc);
1433 ucom_outwakeup(sc);
1435 UCOM_MTX_UNLOCK(sc);
1443 struct ucom_softc *sc = (struct ucom_softc *)drvData->priv;
1445 tx_data_copy_in(sc, (void *)buffer, buflen);
1446 ucom_outwakeup(sc);