Lines Matching refs:rc

28  * $FreeBSD: releng/11.0/sys/dev/rc/rc.c 298955 2016-05-03 03:41:25Z pfg $
56 #include <dev/rc/rcreg.h>
210 struct rc_chans *rc;
286 rc = sc->sc_channels;
288 for (chan = 0; chan < CD180_NCHAN; chan++, rc++) {
289 rc->rc_rcb = sc;
290 rc->rc_chan = chan;
291 rc->rc_iptr = rc->rc_ibuf;
292 rc->rc_bufend = &rc->rc_ibuf[RC_IBUFSIZE];
293 rc->rc_hiwat = &rc->rc_ibuf[RC_IHIGHWATER];
294 rc->rc_optr = rc->rc_obufend = rc->rc_obuf;
295 callout_init(&rc->rc_dtrcallout, 0);
296 tp = rc->rc_tp = ttyalloc();
297 tp->t_sc = rc;
314 swi_add(&tty_intr_event, "rc", rc_pollcard, sc, SWI_TTY, 0,
327 struct rc_chans *rc;
332 rc = sc->sc_channels;
333 for (i = 0; i < CD180_NCHAN; i++, rc++)
334 ttyfree(rc->rc_tp);
370 struct rc_chans *rc;
407 rc = &sc->sc_channels[chan];
408 t_state = rc->rc_tp->t_state;
410 if ( (rc->rc_flags & RC_RTSFLOW)
416 && (rc->rc_msvr & MSVR_RTS)
419 rc->rc_msvr &= ~MSVR_RTS);
420 else if (!(rc->rc_msvr & MSVR_RTS))
422 rc->rc_msvr |= MSVR_RTS);
429 if ((rc->rc_iptr + ucnt) >= rc->rc_bufend) {
431 ucnt = rc->rc_bufend - rc->rc_iptr;
433 if (!(rc->rc_flags & RC_WAS_BUFOVFL)) {
434 rc->rc_flags |= RC_WAS_BUFOVFL;
438 optr = rc->rc_iptr;
447 if (val != 0 && val == rc->rc_tp->t_hotchar)
457 && !(rc->rc_flags & RC_WAS_SILOVFL)) {
458 rc->rc_flags |= RC_WAS_SILOVFL;
469 || !(rc->rc_tp->t_iflag & IGNPAR))
471 || !(rc->rc_tp->t_iflag & IGNBRK)))) {
476 && (rc->rc_tp->t_iflag & INPCK))))
478 else if (val != 0 && val == rc->rc_tp->t_hotchar)
487 rc->rc_iptr = optr;
488 rc->rc_flags |= RC_DORXFER;
511 rc = &sc->sc_channels[chan];
513 rc->rc_msvr = rcin(sc, CD180_MSVR);
516 printrcflags(rc, "moint");
518 if (rc->rc_flags & RC_CTSFLOW) {
519 if (rc->rc_msvr & MSVR_CTS)
520 rc->rc_flags |= RC_SEND_RDY;
522 rc->rc_flags &= ~RC_SEND_RDY;
524 rc->rc_flags |= RC_SEND_RDY;
525 if ((iack & MCR_CDchg) && !(rc->rc_flags & RC_MODCHG)) {
527 rc->rc_flags |= RC_MODCHG;
540 rc = &sc->sc_channels[chan];
541 if ( (rc->rc_flags & RC_OSUSP)
542 || !(rc->rc_flags & RC_SEND_RDY)
546 if (rc->rc_pendcmd) {
547 rcout(sc, CD180_COR2, rc->rc_cor2 |= COR2_ETC);
549 rcout(sc, CD180_TDR, rc->rc_pendcmd);
550 rcout(sc, CD180_COR2, rc->rc_cor2 &= ~COR2_ETC);
551 rc->rc_pendcmd = 0;
554 optr = rc->rc_optr;
555 resid = rc->rc_obufend - optr;
560 rc->rc_optr = optr;
563 if (optr >= rc->rc_obufend) {
564 rcout(sc, CD180_IER, rc->rc_ier &= ~IER_TxRdy);
568 rc->rc_chan);
570 if (!(rc->rc_flags & RC_DOXXFER)) {
572 rc->rc_flags |= RC_DOXXFER;
589 struct rc_chans *rc;
592 rc = tp->t_sc;
593 if (rc->rc_flags & RC_OSBUSY)
595 sc = rc->rc_rcb;
597 rc->rc_flags |= RC_OSBUSY;
600 rc->rc_flags |= RC_OSUSP;
602 rc->rc_flags &= ~RC_OSUSP;
604 if ( (rc->rc_flags & RC_RTSFLOW)
606 && (rc->rc_msvr & MSVR_RTS)
608 rcout(sc, CD180_CAR, rc->rc_chan);
609 rcout(sc, CD180_MSVR, rc->rc_msvr &= ~MSVR_RTS);
610 } else if (!(rc->rc_msvr & MSVR_RTS)) {
611 rcout(sc, CD180_CAR, rc->rc_chan);
612 rcout(sc, CD180_MSVR, rc->rc_msvr |= MSVR_RTS);
618 printrcflags(rc, "rcstart");
623 tp->t_outq.c_cc, rc->rc_obufend - rc->rc_optr);
632 ocnt = q_to_b(&tp->t_outq, rc->rc_obuf, sizeof rc->rc_obuf);
634 rc->rc_optr = rc->rc_obuf;
635 rc->rc_obufend = rc->rc_optr + ocnt;
637 if (!(rc->rc_ier & IER_TxRdy)) {
640 "channel %d: rcstart enable txint\n", rc->rc_chan);
642 rcout(sc, CD180_CAR, rc->rc_chan);
643 rcout(sc, CD180_IER, rc->rc_ier |= IER_TxRdy);
647 rc->rc_flags &= ~RC_OSBUSY;
656 struct rc_chans *rc;
665 rc = sc->sc_channels;
666 for (chan = 0; chan < CD180_NCHAN; rc++, chan++) {
667 tp = rc->rc_tp;
669 if (rc->rc_flags & (RC_DORXFER|RC_DOXXFER|RC_MODCHG|
671 printrcflags(rc, "rcevent");
673 if (rc->rc_flags & RC_WAS_BUFOVFL) {
675 rc->rc_flags &= ~RC_WAS_BUFOVFL;
682 if (rc->rc_flags & RC_WAS_SILOVFL) {
684 rc->rc_flags &= ~RC_WAS_SILOVFL;
690 if (rc->rc_flags & RC_MODCHG) {
692 rc->rc_flags &= ~RC_MODCHG;
695 ttyld_modem(tp, !!(rc->rc_msvr & MSVR_CD));
697 if (rc->rc_flags & RC_DORXFER) {
699 rc->rc_flags &= ~RC_DORXFER;
700 eptr = rc->rc_iptr;
701 if (rc->rc_bufend == &rc->rc_ibuf[2 * RC_IBUFSIZE])
702 tptr = &rc->rc_ibuf[RC_IBUFSIZE];
704 tptr = rc->rc_ibuf;
707 if (rc->rc_bufend == &rc->rc_ibuf[2 * RC_IBUFSIZE]) {
708 rc->rc_iptr = rc->rc_ibuf;
709 rc->rc_bufend = &rc->rc_ibuf[RC_IBUFSIZE];
710 rc->rc_hiwat = &rc->rc_ibuf[RC_IHIGHWATER];
712 rc->rc_iptr = &rc->rc_ibuf[RC_IBUFSIZE];
713 rc->rc_bufend = &rc->rc_ibuf[2 * RC_IBUFSIZE];
714 rc->rc_hiwat =
715 &rc->rc_ibuf[RC_IBUFSIZE + RC_IHIGHWATER];
717 if ( (rc->rc_flags & RC_RTSFLOW)
720 && !(rc->rc_msvr & MSVR_RTS)
724 rc->rc_msvr |= MSVR_RTS);
736 && ((rc->rc_flags & RC_RTSFLOW) || (tp->t_iflag & IXOFF))
761 if (rc->rc_flags & RC_DOXXFER) {
764 rc->rc_flags &= ~RC_DOXXFER;
765 rc->rc_tp->t_state &= ~TS_BUSY;
779 struct rc_chans *rc;
782 rc = tp->t_sc;
783 sc = rc->rc_rcb;
786 rc->rc_chan, (rw & FWRITE)?"FWRITE ":"", (rw & FREAD)?"FREAD":"");
789 rc_discard_output(rc);
792 rc->rc_flags &= ~RC_DORXFER;
793 eptr = rc->rc_iptr;
794 if (rc->rc_bufend == &rc->rc_ibuf[2 * RC_IBUFSIZE]) {
795 tptr = &rc->rc_ibuf[RC_IBUFSIZE];
796 rc->rc_iptr = &rc->rc_ibuf[RC_IBUFSIZE];
798 tptr = rc->rc_ibuf;
799 rc->rc_iptr = rc->rc_ibuf;
804 rc->rc_flags |= RC_OSUSP;
806 rc->rc_flags &= ~RC_OSUSP;
813 struct rc_chans *rc;
817 rc = tp->t_sc;
818 sc = rc->rc_rcb;
820 rcout(sc, CD180_CAR, rc->rc_chan);
823 rcout(sc, CD180_IER, rc->rc_ier = 0);
825 || (!(rc->rc_flags & RC_ACTOUT)
826 && !(rc->rc_msvr & MSVR_CD)
830 CCRCMD(sc, rc->rc_chan, CCR_ResetChan);
831 WAITFORCCR(sc, rc->rc_chan);
835 rc->rc_flags &= ~RC_ACTOUT;
836 wakeup( &rc->rc_rcb); /* wake bi */
871 struct rc_chans *rc;
883 rc = tp->t_sc;
884 sc = rc->rc_rcb;
888 rcout(sc, CD180_CAR, rc->rc_chan);
892 CCRCMD(sc, rc->rc_chan, CCR_ResetChan);
893 WAITFORCCR(sc, rc->rc_chan);
959 rc->rc_flags &= ~(RC_CTSFLOW|RC_SEND_RDY);
961 rc->rc_flags |= RC_CTSFLOW;
964 rc->rc_flags |= RC_SEND_RDY;
966 rc->rc_flags |= RC_OSUSP;
968 rc->rc_flags &= ~RC_OSUSP;
970 rc->rc_flags |= RC_RTSFLOW;
972 rc->rc_flags &= ~RC_RTSFLOW;
983 rcout(sc, CD180_COR2, rc->rc_cor2 = val);
985 CCRCMD(sc, rc->rc_chan, CCR_CORCHG1 | CCR_CORCHG2 | CCR_CORCHG3);
1001 CCRCMD(sc, rc->rc_chan,
1003 WAITFORCCR(sc, rc->rc_chan);
1005 rc->rc_ier = cflag & CLOCAL ? 0 : IER_CD;
1007 rc->rc_ier |= IER_CTS;
1009 rc->rc_ier |= IER_RxData;
1011 rc->rc_ier |= IER_TxRdy;
1014 if ((cflag & CCTS_OFLOW) && (rc->rc_msvr & MSVR_CTS))
1015 rc->rc_flags |= RC_SEND_RDY;
1016 rcout(sc, CD180_IER, rc->rc_ier);
1025 struct rc_chans *rc;
1029 rc = sc->sc_channels;
1030 for (i = 0; i < CD180_NCHAN; i++, rc++)
1031 (void) rc_param(rc->rc_tp, &rc->rc_tp->t_termios);
1039 struct rc_chans *rc;
1044 rc = tp->t_sc;
1045 sc = rc->rc_rcb;
1047 rcout(sc, CD180_CAR, rc->rc_chan);
1050 msvr = rc->rc_msvr = rcin(sc, CD180_MSVR);
1062 if (~rcin(sc, RC_RIREG) & (1 << rc->rc_chan))
1067 rcout(sc, RC_DTREG, ~(*dtr |= 1 << rc->rc_chan));
1069 rcout(sc, RC_DTREG, ~(*dtr &= ~(1 << rc->rc_chan)));
1086 struct rc_chans *rc;
1088 rc = tp->t_sc;
1091 rc->rc_pendcmd = CD180_C_SBRK;
1093 rc->rc_pendcmd = CD180_C_EBRK;
1242 printrcflags(struct rc_chans *rc, char *comment)
1245 u_short f = rc->rc_flags;
1247 sc = rc->rc_rcb;
1248 printf("rc%d/%d: %s flags: %s%s%s%s%s%s%s%s%s%s%s%s\n",
1249 rc->rc_rcb->rcb_unit, rc->rc_chan, comment,
1263 rcout(sc, CD180_CAR, rc->rc_chan);
1265 printf("rc%d/%d: msvr %02x ier %02x ccsr %02x\n",
1266 rc->rc_rcb->rcb_unit, rc->rc_chan,
1274 rc_discard_output(struct rc_chans *rc)
1277 if (rc->rc_flags & RC_DOXXFER) {
1278 rc->rc_rcb->sc_scheduled_event -= LOTS_OF_EVENTS;
1279 rc->rc_flags &= ~RC_DOXXFER;
1281 rc->rc_optr = rc->rc_obufend;
1282 rc->rc_tp->t_state &= ~TS_BUSY;
1284 ttwwakeup(rc->rc_tp);
1296 "channel %d command timeout, rc.c line: %d\n", chan, line);
1308 "rc",
1312 DRIVER_MODULE(rc, isa, rc_driver, rc_devclass, 0, 0);