• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/char/

Lines Matching refs:portp

412 static int	stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp);
413 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp);
418 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value);
419 static int stl_cd1400getreg(struct stlport *portp, int regnr);
420 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value);
422 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
423 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp);
424 static int stl_cd1400getsignals(struct stlport *portp);
425 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts);
426 static void stl_cd1400ccrwait(struct stlport *portp);
427 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx);
428 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx);
429 static void stl_cd1400disableintrs(struct stlport *portp);
430 static void stl_cd1400sendbreak(struct stlport *portp, int len);
431 static void stl_cd1400flowctrl(struct stlport *portp, int state);
432 static void stl_cd1400sendflow(struct stlport *portp, int state);
433 static void stl_cd1400flush(struct stlport *portp);
434 static int stl_cd1400datastate(struct stlport *portp);
441 static inline int stl_cd1400breakisr(struct stlport *portp, int ioaddr);
446 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value);
447 static int stl_sc26198getreg(struct stlport *portp, int regnr);
448 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value);
449 static int stl_sc26198getglobreg(struct stlport *portp, int regnr);
451 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
452 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp);
453 static int stl_sc26198getsignals(struct stlport *portp);
454 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts);
455 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx);
456 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx);
457 static void stl_sc26198disableintrs(struct stlport *portp);
458 static void stl_sc26198sendbreak(struct stlport *portp, int len);
459 static void stl_sc26198flowctrl(struct stlport *portp, int state);
460 static void stl_sc26198sendflow(struct stlport *portp, int state);
461 static void stl_sc26198flush(struct stlport *portp);
462 static int stl_sc26198datastate(struct stlport *portp);
463 static void stl_sc26198wait(struct stlport *portp);
464 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty);
468 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch);
469 static void stl_sc26198rxbadchars(struct stlport *portp);
479 void (*portinit)(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
480 void (*setport)(struct stlport *portp, struct ktermios *tiosp);
481 int (*getsignals)(struct stlport *portp);
482 void (*setsignals)(struct stlport *portp, int dtr, int rts);
483 void (*enablerxtx)(struct stlport *portp, int rx, int tx);
484 void (*startrxtx)(struct stlport *portp, int rx, int tx);
485 void (*disableintrs)(struct stlport *portp);
486 void (*sendbreak)(struct stlport *portp, int len);
487 void (*flowctrl)(struct stlport *portp, int state);
488 void (*sendflow)(struct stlport *portp, int state);
489 void (*flush)(struct stlport *portp);
490 int (*datastate)(struct stlport *portp);
498 #define stl_portinit (* ((uart_t *) portp->uartp)->portinit)
499 #define stl_setport (* ((uart_t *) portp->uartp)->setport)
500 #define stl_getsignals (* ((uart_t *) portp->uartp)->getsignals)
501 #define stl_setsignals (* ((uart_t *) portp->uartp)->setsignals)
502 #define stl_enablerxtx (* ((uart_t *) portp->uartp)->enablerxtx)
503 #define stl_startrxtx (* ((uart_t *) portp->uartp)->startrxtx)
504 #define stl_disableintrs (* ((uart_t *) portp->uartp)->disableintrs)
505 #define stl_sendbreak (* ((uart_t *) portp->uartp)->sendbreak)
506 #define stl_flowctrl (* ((uart_t *) portp->uartp)->flowctrl)
507 #define stl_sendflow (* ((uart_t *) portp->uartp)->sendflow)
508 #define stl_flush (* ((uart_t *) portp->uartp)->flush)
509 #define stl_datastate (* ((uart_t *) portp->uartp)->datastate)
615 static void stl_cd_change(struct stlport *portp)
617 unsigned int oldsigs = portp->sigs;
618 struct tty_struct *tty = tty_port_tty_get(&portp->port);
623 portp->sigs = stl_getsignals(portp);
625 if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
626 wake_up_interruptible(&portp->port.open_wait);
628 if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
629 if (portp->port.flags & ASYNC_CHECK_CD)
707 struct stlport *portp = container_of(port, struct stlport, port);
708 if (!portp->tx.buf) {
709 portp->tx.buf = kmalloc(STL_TXBUFSIZE, GFP_KERNEL);
710 if (!portp->tx.buf)
712 portp->tx.head = portp->tx.buf;
713 portp->tx.tail = portp->tx.buf;
715 stl_setport(portp, tty->termios);
716 portp->sigs = stl_getsignals(portp);
717 stl_setsignals(portp, 1, 1);
718 stl_enablerxtx(portp, 1, 1);
719 stl_startrxtx(portp, 1, 0);
725 struct stlport *portp;
753 portp = brdp->panels[panelnr]->ports[portnr];
754 if (portp == NULL)
757 tty->driver_data = portp;
758 return tty_port_open(&portp->port, tty, filp);
766 struct stlport *portp = container_of(port, struct stlport, port);
767 return (portp->sigs & TIOCM_CD) ? 1 : 0;
772 struct stlport *portp = container_of(port, struct stlport, port);
774 stl_setsignals(portp, on, on);
781 struct stlport *portp;
785 portp = tty->driver_data;
786 if (portp == NULL)
789 stl_flush(portp);
797 struct stlport *portp;
802 portp = tty->driver_data;
803 if (portp == NULL)
810 while (stl_datastate(portp)) {
823 struct stlport *portp = container_of(port, struct stlport, port);
824 stl_disableintrs(portp);
825 stl_enablerxtx(portp, 0, 0);
826 stl_flush(portp);
827 portp->istate = 0;
828 if (portp->tx.buf != NULL) {
829 kfree(portp->tx.buf);
830 portp->tx.buf = NULL;
831 portp->tx.head = NULL;
832 portp->tx.tail = NULL;
838 struct stlport*portp;
841 portp = tty->driver_data;
842 if(portp == NULL)
844 tty_port_close(&portp->port, tty, filp);
856 struct stlport *portp;
863 portp = tty->driver_data;
864 if (portp == NULL)
866 if (portp->tx.buf == NULL)
877 head = portp->tx.head;
878 tail = portp->tx.tail;
881 stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
896 if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
897 head = portp->tx.buf;
901 portp->tx.head = head;
903 clear_bit(ASYI_TXLOW, &portp->istate);
904 stl_startrxtx(portp, -1, 1);
913 struct stlport *portp;
919 portp = tty->driver_data;
920 if (portp == NULL)
922 if (portp->tx.buf == NULL)
925 head = portp->tx.head;
926 tail = portp->tx.tail;
933 if (head >= (portp->tx.buf + STL_TXBUFSIZE))
934 head = portp->tx.buf;
936 portp->tx.head = head;
950 struct stlport *portp;
954 portp = tty->driver_data;
955 if (portp == NULL)
957 if (portp->tx.buf == NULL)
960 stl_startrxtx(portp, -1, 1);
967 struct stlport *portp;
972 portp = tty->driver_data;
973 if (portp == NULL)
975 if (portp->tx.buf == NULL)
978 head = portp->tx.head;
979 tail = portp->tx.tail;
996 struct stlport *portp;
1002 portp = tty->driver_data;
1003 if (portp == NULL)
1005 if (portp->tx.buf == NULL)
1008 head = portp->tx.head;
1009 tail = portp->tx.tail;
1011 if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
1022 static int stl_getserial(struct stlport *portp, struct serial_struct __user *sp)
1027 pr_debug("stl_getserial(portp=%p,sp=%p)\n", portp, sp);
1031 mutex_lock(&portp->port.mutex);
1032 sio.line = portp->portnr;
1033 sio.port = portp->ioaddr;
1034 sio.flags = portp->port.flags;
1035 sio.baud_base = portp->baud_base;
1036 sio.close_delay = portp->close_delay;
1037 sio.closing_wait = portp->closing_wait;
1038 sio.custom_divisor = portp->custom_divisor;
1040 if (portp->uartp == &stl_cd1400uart) {
1048 brdp = stl_brds[portp->brdnr];
1051 mutex_unlock(&portp->port.mutex);
1066 struct stlport * portp = tty->driver_data;
1069 pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp);
1073 mutex_lock(&portp->port.mutex);
1075 if ((sio.baud_base != portp->baud_base) ||
1076 (sio.close_delay != portp->close_delay) ||
1078 (portp->port.flags & ~ASYNC_USR_MASK))) {
1079 mutex_unlock(&portp->port.mutex);
1084 portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
1086 portp->baud_base = sio.baud_base;
1087 portp->close_delay = sio.close_delay;
1088 portp->closing_wait = sio.closing_wait;
1089 portp->custom_divisor = sio.custom_divisor;
1090 mutex_unlock(&portp->port.mutex);
1091 stl_setport(portp, tty->termios);
1099 struct stlport *portp;
1101 portp = tty->driver_data;
1102 if (portp == NULL)
1107 return stl_getsignals(portp);
1113 struct stlport *portp;
1116 portp = tty->driver_data;
1117 if (portp == NULL)
1131 stl_setsignals(portp, dtr, rts);
1137 struct stlport *portp;
1144 portp = tty->driver_data;
1145 if (portp == NULL)
1157 rc = stl_getserial(portp, argp);
1163 rc = stl_getportstats(tty, portp, argp);
1166 rc = stl_clrportstats(portp, argp);
1190 struct stlport *portp;
1194 portp = tty->driver_data;
1195 if (portp == NULL)
1197 stl_startrxtx(portp, -1, 1);
1204 struct stlport *portp;
1209 portp = tty->driver_data;
1210 if (portp == NULL)
1218 stl_setport(portp, tiosp);
1219 stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
1226 wake_up_interruptible(&portp->port.open_wait);
1238 struct stlport *portp;
1242 portp = tty->driver_data;
1243 if (portp == NULL)
1245 stl_flowctrl(portp, 0);
1256 struct stlport *portp;
1260 portp = tty->driver_data;
1261 if (portp == NULL)
1263 stl_flowctrl(portp, 1);
1275 struct stlport *portp;
1279 portp = tty->driver_data;
1280 if (portp == NULL)
1282 stl_startrxtx(portp, -1, 0);
1295 struct stlport *portp = tty->driver_data;
1298 if (portp == NULL)
1300 tty_port_hangup(&portp->port);
1307 struct stlport *portp;
1311 portp = tty->driver_data;
1312 if (portp == NULL)
1315 stl_sendbreak(portp, ((state == -1) ? 1 : 2));
1323 struct stlport *portp;
1327 portp = tty->driver_data;
1328 if (portp == NULL)
1332 stl_sendflow(portp, 0);
1334 stl_sendflow(portp, 1);
1339 static void stl_portinfo(struct seq_file *m, struct stlport *portp, int portnr)
1345 portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
1346 (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
1348 if (portp->stats.rxframing)
1349 seq_printf(m, " fe:%d", (int) portp->stats.rxframing);
1350 if (portp->stats.rxparity)
1351 seq_printf(m, " pe:%d", (int) portp->stats.rxparity);
1352 if (portp->stats.rxbreaks)
1353 seq_printf(m, " brk:%d", (int) portp->stats.rxbreaks);
1354 if (portp->stats.rxoverrun)
1355 seq_printf(m, " oe:%d", (int) portp->stats.rxoverrun);
1357 sigs = stl_getsignals(portp);
1392 struct stlport *portp;
1419 portp = panelp->ports[portnr];
1420 if (portp == NULL)
1422 stl_portinfo(m, portp, totalport);
1600 struct stlport *portp;
1613 portp = kzalloc(sizeof(struct stlport), GFP_KERNEL);
1614 if (!portp) {
1619 tty_port_init(&portp->port);
1620 portp->port.ops = &stl_port_ops;
1621 portp->magic = STL_PORTMAGIC;
1622 portp->portnr = i;
1623 portp->brdnr = panelp->brdnr;
1624 portp->panelnr = panelp->panelnr;
1625 portp->uartp = panelp->uartp;
1626 portp->clk = brdp->clk;
1627 portp->baud_base = STL_BAUDBASE;
1628 portp->close_delay = STL_CLOSEDELAY;
1629 portp->closing_wait = 30 * HZ;
1630 init_waitqueue_head(&portp->port.open_wait);
1631 init_waitqueue_head(&portp->port.close_wait);
1632 portp->stats.brd = portp->brdnr;
1633 portp->stats.panel = portp->panelnr;
1634 portp->stats.port = portp->portnr;
1635 panelp->ports[i] = portp;
1636 stl_portinit(brdp, panelp, portp);
1645 struct stlport *portp;
1654 portp = panelp->ports[k];
1655 if (portp == NULL)
1657 tty = tty_port_tty_get(&portp->port);
1662 kfree(portp->tx.buf);
1663 kfree(portp);
2317 static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp)
2323 if (!portp) {
2326 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2328 if (portp == NULL)
2332 mutex_lock(&portp->port.mutex);
2333 portp->stats.state = portp->istate;
2334 portp->stats.flags = portp->port.flags;
2335 portp->stats.hwid = portp->hwid;
2337 portp->stats.ttystate = 0;
2338 portp->stats.cflags = 0;
2339 portp->stats.iflags = 0;
2340 portp->stats.oflags = 0;
2341 portp->stats.lflags = 0;
2342 portp->stats.rxbuffered = 0;
2345 if (tty != NULL && portp->port.tty == tty) {
2346 portp->stats.ttystate = tty->flags;
2348 portp->stats.rxbuffered = 1; /*tty->flip.count; */
2350 portp->stats.cflags = tty->termios->c_cflag;
2351 portp->stats.iflags = tty->termios->c_iflag;
2352 portp->stats.oflags = tty->termios->c_oflag;
2353 portp->stats.lflags = tty->termios->c_lflag;
2358 head = portp->tx.head;
2359 tail = portp->tx.tail;
2360 portp->stats.txbuffered = (head >= tail) ? (head - tail) :
2363 portp->stats.signals = (unsigned long) stl_getsignals(portp);
2364 mutex_unlock(&portp->port.mutex);
2366 return copy_to_user(cp, &portp->stats,
2376 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp)
2380 if (!portp) {
2383 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2385 if (portp == NULL)
2389 mutex_lock(&portp->port.mutex);
2390 memset(&portp->stats, 0, sizeof(comstats_t));
2391 portp->stats.brd = portp->brdnr;
2392 portp->stats.panel = portp->panelnr;
2393 portp->stats.port = portp->portnr;
2394 mutex_unlock(&portp->port.mutex);
2395 return copy_to_user(cp, &portp->stats,
2408 struct stlport *portp;
2412 portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr,
2414 if (!portp)
2416 return copy_to_user(arg, portp, sizeof(struct stlport)) ? -EFAULT : 0;
2524 static int stl_cd1400getreg(struct stlport *portp, int regnr)
2526 outb((regnr + portp->uartaddr), portp->ioaddr);
2527 return inb(portp->ioaddr + EREG_DATA);
2530 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value)
2532 outb(regnr + portp->uartaddr, portp->ioaddr);
2533 outb(value, portp->ioaddr + EREG_DATA);
2536 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value)
2538 outb(regnr + portp->uartaddr, portp->ioaddr);
2539 if (inb(portp->ioaddr + EREG_DATA) != value) {
2540 outb(value, portp->ioaddr + EREG_DATA);
2610 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
2613 pr_debug("stl_cd1400portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
2614 panelp, portp);
2617 (portp == NULL))
2621 portp->ioaddr = panelp->iobase + (((brdp->brdtype == BRD_ECHPCI) ||
2622 (portp->portnr < 8)) ? 0 : EREG_BANKSIZE);
2623 portp->uartaddr = (portp->portnr & 0x04) << 5;
2624 portp->pagenr = panelp->pagenr + (portp->portnr >> 3);
2626 BRDENABLE(portp->brdnr, portp->pagenr);
2627 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2628 stl_cd1400setreg(portp, LIVR, (portp->portnr << 3));
2629 portp->hwid = stl_cd1400getreg(portp, GFRCR);
2630 BRDDISABLE(portp->brdnr);
2641 static void stl_cd1400ccrwait(struct stlport *portp)
2646 if (stl_cd1400getreg(portp, CCR) == 0)
2650 portp->portnr, portp->panelnr, portp->brdnr);
2660 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp)
2685 brdp = stl_brds[portp->brdnr];
2694 portp->rxignoremsk = 0;
2696 portp->rxignoremsk |= (ST_PARITY | ST_FRAMING | ST_OVERRUN);
2700 portp->rxignoremsk |= ST_BREAK;
2704 portp->rxmarkmsk = ST_OVERRUN;
2706 portp->rxmarkmsk |= (ST_PARITY | ST_FRAMING);
2708 portp->rxmarkmsk |= ST_BREAK;
2768 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
2770 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
2772 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
2774 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
2776 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
2777 baudrate = (portp->baud_base / portp->custom_divisor);
2784 clkdiv = (portp->clk / stl_cd1400clkdivs[clk]) / baudrate;
2798 portp->port.flags |= ASYNC_CHECK_CD;
2800 portp->port.flags &= ~ASYNC_CHECK_CD;
2826 portp->portnr, portp->panelnr, portp->brdnr);
2837 BRDENABLE(portp->brdnr, portp->pagenr);
2838 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x3));
2839 srer = stl_cd1400getreg(portp, SRER);
2840 stl_cd1400setreg(portp, SRER, 0);
2841 if (stl_cd1400updatereg(portp, COR1, cor1))
2843 if (stl_cd1400updatereg(portp, COR2, cor2))
2845 if (stl_cd1400updatereg(portp, COR3, cor3))
2848 stl_cd1400ccrwait(portp);
2849 stl_cd1400setreg(portp, CCR, CCR_CORCHANGE);
2851 stl_cd1400setreg(portp, COR4, cor4);
2852 stl_cd1400setreg(portp, COR5, cor5);
2853 stl_cd1400setreg(portp, MCOR1, mcor1);
2854 stl_cd1400setreg(portp, MCOR2, mcor2);
2856 stl_cd1400setreg(portp, TCOR, clk);
2857 stl_cd1400setreg(portp, TBPR, div);
2858 stl_cd1400setreg(portp, RCOR, clk);
2859 stl_cd1400setreg(portp, RBPR, div);
2861 stl_cd1400setreg(portp, SCHR1, tiosp->c_cc[VSTART]);
2862 stl_cd1400setreg(portp, SCHR2, tiosp->c_cc[VSTOP]);
2863 stl_cd1400setreg(portp, SCHR3, tiosp->c_cc[VSTART]);
2864 stl_cd1400setreg(portp, SCHR4, tiosp->c_cc[VSTOP]);
2865 stl_cd1400setreg(portp, RTPR, rtpr);
2866 mcor1 = stl_cd1400getreg(portp, MSVR1);
2868 portp->sigs |= TIOCM_CD;
2870 portp->sigs &= ~TIOCM_CD;
2871 stl_cd1400setreg(portp, SRER, ((srer & ~sreroff) | sreron));
2872 BRDDISABLE(portp->brdnr);
2882 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts)
2887 pr_debug("stl_cd1400setsignals(portp=%p,dtr=%d,rts=%d)\n",
2888 portp, dtr, rts);
2898 BRDENABLE(portp->brdnr, portp->pagenr);
2899 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2901 stl_cd1400setreg(portp, MSVR2, msvr2);
2903 stl_cd1400setreg(portp, MSVR1, msvr1);
2904 BRDDISABLE(portp->brdnr);
2914 static int stl_cd1400getsignals(struct stlport *portp)
2920 pr_debug("stl_cd1400getsignals(portp=%p)\n", portp);
2923 BRDENABLE(portp->brdnr, portp->pagenr);
2924 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2925 msvr1 = stl_cd1400getreg(portp, MSVR1);
2926 msvr2 = stl_cd1400getreg(portp, MSVR2);
2927 BRDDISABLE(portp->brdnr);
2945 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx)
2950 pr_debug("stl_cd1400enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
2964 BRDENABLE(portp->brdnr, portp->pagenr);
2965 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2966 stl_cd1400ccrwait(portp);
2967 stl_cd1400setreg(portp, CCR, ccr);
2968 stl_cd1400ccrwait(portp);
2969 BRDDISABLE(portp->brdnr);
2979 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx)
2984 pr_debug("stl_cd1400startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
3000 BRDENABLE(portp->brdnr, portp->pagenr);
3001 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3002 stl_cd1400setreg(portp, SRER,
3003 ((stl_cd1400getreg(portp, SRER) & ~sreroff) | sreron));
3004 BRDDISABLE(portp->brdnr);
3006 set_bit(ASYI_TXBUSY, &portp->istate);
3016 static void stl_cd1400disableintrs(struct stlport *portp)
3020 pr_debug("stl_cd1400disableintrs(portp=%p)\n", portp);
3023 BRDENABLE(portp->brdnr, portp->pagenr);
3024 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3025 stl_cd1400setreg(portp, SRER, 0);
3026 BRDDISABLE(portp->brdnr);
3032 static void stl_cd1400sendbreak(struct stlport *portp, int len)
3036 pr_debug("stl_cd1400sendbreak(portp=%p,len=%d)\n", portp, len);
3039 BRDENABLE(portp->brdnr, portp->pagenr);
3040 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3041 stl_cd1400setreg(portp, SRER,
3042 ((stl_cd1400getreg(portp, SRER) & ~SRER_TXDATA) |
3044 BRDDISABLE(portp->brdnr);
3045 portp->brklen = len;
3047 portp->stats.txbreaks++;
3057 static void stl_cd1400flowctrl(struct stlport *portp, int state)
3062 pr_debug("stl_cd1400flowctrl(portp=%p,state=%x)\n", portp, state);
3064 if (portp == NULL)
3066 tty = tty_port_tty_get(&portp->port);
3071 BRDENABLE(portp->brdnr, portp->pagenr);
3072 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3076 stl_cd1400ccrwait(portp);
3077 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3078 portp->stats.rxxon++;
3079 stl_cd1400ccrwait(portp);
3088 stl_cd1400setreg(portp, MCOR1,
3089 (stl_cd1400getreg(portp, MCOR1) |
3091 stl_cd1400setreg(portp, MSVR2, MSVR2_RTS);
3092 portp->stats.rxrtson++;
3096 stl_cd1400ccrwait(portp);
3097 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3098 portp->stats.rxxoff++;
3099 stl_cd1400ccrwait(portp);
3102 stl_cd1400setreg(portp, MCOR1,
3103 (stl_cd1400getreg(portp, MCOR1) & 0xf0));
3104 stl_cd1400setreg(portp, MSVR2, 0);
3105 portp->stats.rxrtsoff++;
3109 BRDDISABLE(portp->brdnr);
3120 static void stl_cd1400sendflow(struct stlport *portp, int state)
3125 pr_debug("stl_cd1400sendflow(portp=%p,state=%x)\n", portp, state);
3127 if (portp == NULL)
3129 tty = tty_port_tty_get(&portp->port);
3134 BRDENABLE(portp->brdnr, portp->pagenr);
3135 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3137 stl_cd1400ccrwait(portp);
3138 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3139 portp->stats.rxxon++;
3140 stl_cd1400ccrwait(portp);
3142 stl_cd1400ccrwait(portp);
3143 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3144 portp->stats.rxxoff++;
3145 stl_cd1400ccrwait(portp);
3147 BRDDISABLE(portp->brdnr);
3154 static void stl_cd1400flush(struct stlport *portp)
3158 pr_debug("stl_cd1400flush(portp=%p)\n", portp);
3160 if (portp == NULL)
3164 BRDENABLE(portp->brdnr, portp->pagenr);
3165 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3166 stl_cd1400ccrwait(portp);
3167 stl_cd1400setreg(portp, CCR, CCR_TXFLUSHFIFO);
3168 stl_cd1400ccrwait(portp);
3169 portp->tx.tail = portp->tx.head;
3170 BRDDISABLE(portp->brdnr);
3183 static int stl_cd1400datastate(struct stlport *portp)
3185 pr_debug("stl_cd1400datastate(portp=%p)\n", portp);
3187 if (portp == NULL)
3190 return test_bit(ASYI_TXBUSY, &portp->istate) ? 1 : 0;
3255 static int stl_cd1400breakisr(struct stlport *portp, int ioaddr)
3257 if (portp->brklen == 1) {
3258 outb((COR2 + portp->uartaddr), ioaddr);
3261 outb((TDR + portp->uartaddr), ioaddr);
3264 outb((SRER + portp->uartaddr), ioaddr);
3268 } else if (portp->brklen > 1) {
3269 outb((TDR + portp->uartaddr), ioaddr);
3272 portp->brklen = -1;
3275 outb((COR2 + portp->uartaddr), ioaddr);
3278 portp->brklen = 0;
3299 struct stlport *portp;
3313 portp = panelp->ports[(ioack >> 3)];
3320 if (portp->brklen != 0)
3321 if (stl_cd1400breakisr(portp, ioaddr))
3324 head = portp->tx.head;
3325 tail = portp->tx.tail;
3328 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
3329 set_bit(ASYI_TXLOW, &portp->istate);
3330 tty = tty_port_tty_get(&portp->port);
3338 outb((SRER + portp->uartaddr), ioaddr);
3344 clear_bit(ASYI_TXBUSY, &portp->istate);
3349 portp->stats.txtotal += len;
3351 (portp->tx.buf + STL_TXBUFSIZE) - tail);
3352 outb((TDR + portp->uartaddr), ioaddr);
3356 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
3357 tail = portp->tx.buf;
3362 portp->tx.tail = tail;
3366 outb((EOSRR + portp->uartaddr), ioaddr);
3384 struct stlport *portp;
3397 portp = panelp->ports[(ioack >> 3)];
3398 tty = tty_port_tty_get(&portp->port);
3401 outb((RDCR + portp->uartaddr), ioaddr);
3405 outb((RDSR + portp->uartaddr), ioaddr);
3407 portp->stats.rxlost += len;
3408 portp->stats.rxtotal += len;
3413 outb((RDSR + portp->uartaddr), ioaddr);
3417 portp->stats.rxtotal += len;
3421 outb((RDSR + portp->uartaddr), ioaddr);
3425 portp->stats.rxparity++;
3427 portp->stats.rxframing++;
3429 portp->stats.rxoverrun++;
3431 portp->stats.rxbreaks++;
3434 portp->stats.txxon++;
3436 portp->stats.txxoff++;
3439 if (tty != NULL && (portp->rxignoremsk & status) == 0) {
3440 if (portp->rxmarkmsk & status) {
3443 if (portp->port.flags & ASYNC_SAK) {
3445 BRDENABLE(portp->brdnr, portp->pagenr);
3468 outb((EOSRR + portp->uartaddr), ioaddr);
3482 struct stlport *portp;
3494 portp = panelp->ports[(ioack >> 3)];
3496 outb((MISR + portp->uartaddr), ioaddr);
3499 stl_cd_change(portp);
3500 portp->stats.modem++;
3503 outb((EOSRR + portp->uartaddr), ioaddr);
3517 static int stl_sc26198getreg(struct stlport *portp, int regnr)
3519 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3520 return inb(portp->ioaddr + XP_DATA);
3523 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value)
3525 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3526 outb(value, (portp->ioaddr + XP_DATA));
3529 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value)
3531 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3532 if (inb(portp->ioaddr + XP_DATA) != value) {
3533 outb(value, (portp->ioaddr + XP_DATA));
3545 static int stl_sc26198getglobreg(struct stlport *portp, int regnr)
3547 outb(regnr, (portp->ioaddr + XP_ADDR));
3548 return inb(portp->ioaddr + XP_DATA);
3605 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
3607 pr_debug("stl_sc26198portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
3608 panelp, portp);
3611 (portp == NULL))
3614 portp->ioaddr = panelp->iobase + ((portp->portnr < 8) ? 0 : 4);
3615 portp->uartaddr = (portp->portnr & 0x07) << 4;
3616 portp->pagenr = panelp->pagenr;
3617 portp->hwid = 0x1;
3619 BRDENABLE(portp->brdnr, portp->pagenr);
3620 stl_sc26198setreg(portp, IOPCR, IOPCR_SETSIGS);
3621 BRDDISABLE(portp->brdnr);
3631 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp)
3647 brdp = stl_brds[portp->brdnr];
3655 portp->rxignoremsk = 0;
3657 portp->rxignoremsk |= (SR_RXPARITY | SR_RXFRAMING |
3660 portp->rxignoremsk |= SR_RXBREAK;
3662 portp->rxmarkmsk = SR_RXOVERRUN;
3664 portp->rxmarkmsk |= (SR_RXPARITY | SR_RXFRAMING);
3666 portp->rxmarkmsk |= SR_RXBREAK;
3724 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
3726 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
3728 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
3730 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
3732 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
3733 baudrate = (portp->baud_base / portp->custom_divisor);
3747 portp->port.flags &= ~ASYNC_CHECK_CD;
3751 portp->port.flags |= ASYNC_CHECK_CD;
3780 portp->portnr, portp->panelnr, portp->brdnr);
3788 BRDENABLE(portp->brdnr, portp->pagenr);
3789 stl_sc26198setreg(portp, IMR, 0);
3790 stl_sc26198updatereg(portp, MR0, mr0);
3791 stl_sc26198updatereg(portp, MR1, mr1);
3792 stl_sc26198setreg(portp, SCCR, CR_RXERRBLOCK);
3793 stl_sc26198updatereg(portp, MR2, mr2);
3794 stl_sc26198updatereg(portp, IOPIOR,
3795 ((stl_sc26198getreg(portp, IOPIOR) & ~IPR_CHANGEMASK) | iopr));
3798 stl_sc26198setreg(portp, TXCSR, clk);
3799 stl_sc26198setreg(portp, RXCSR, clk);
3802 stl_sc26198setreg(portp, XONCR, tiosp->c_cc[VSTART]);
3803 stl_sc26198setreg(portp, XOFFCR, tiosp->c_cc[VSTOP]);
3805 ipr = stl_sc26198getreg(portp, IPR);
3807 portp->sigs &= ~TIOCM_CD;
3809 portp->sigs |= TIOCM_CD;
3811 portp->imr = (portp->imr & ~imroff) | imron;
3812 stl_sc26198setreg(portp, IMR, portp->imr);
3813 BRDDISABLE(portp->brdnr);
3823 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts)
3828 pr_debug("stl_sc26198setsignals(portp=%p,dtr=%d,rts=%d)\n", portp,
3843 BRDENABLE(portp->brdnr, portp->pagenr);
3844 stl_sc26198setreg(portp, IOPIOR,
3845 ((stl_sc26198getreg(portp, IOPIOR) & ~iopioroff) | iopioron));
3846 BRDDISABLE(portp->brdnr);
3856 static int stl_sc26198getsignals(struct stlport *portp)
3862 pr_debug("stl_sc26198getsignals(portp=%p)\n", portp);
3865 BRDENABLE(portp->brdnr, portp->pagenr);
3866 ipr = stl_sc26198getreg(portp, IPR);
3867 BRDDISABLE(portp->brdnr);
3885 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx)
3890 pr_debug("stl_sc26198enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx,tx);
3892 ccr = portp->crenable;
3903 BRDENABLE(portp->brdnr, portp->pagenr);
3904 stl_sc26198setreg(portp, SCCR, ccr);
3905 BRDDISABLE(portp->brdnr);
3906 portp->crenable = ccr;
3916 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx)
3921 pr_debug("stl_sc26198startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
3923 imr = portp->imr;
3934 BRDENABLE(portp->brdnr, portp->pagenr);
3935 stl_sc26198setreg(portp, IMR, imr);
3936 BRDDISABLE(portp->brdnr);
3937 portp->imr = imr;
3939 set_bit(ASYI_TXBUSY, &portp->istate);
3949 static void stl_sc26198disableintrs(struct stlport *portp)
3953 pr_debug("stl_sc26198disableintrs(portp=%p)\n", portp);
3956 BRDENABLE(portp->brdnr, portp->pagenr);
3957 portp->imr = 0;
3958 stl_sc26198setreg(portp, IMR, 0);
3959 BRDDISABLE(portp->brdnr);
3965 static void stl_sc26198sendbreak(struct stlport *portp, int len)
3969 pr_debug("stl_sc26198sendbreak(portp=%p,len=%d)\n", portp, len);
3972 BRDENABLE(portp->brdnr, portp->pagenr);
3974 stl_sc26198setreg(portp, SCCR, CR_TXSTARTBREAK);
3975 portp->stats.txbreaks++;
3977 stl_sc26198setreg(portp, SCCR, CR_TXSTOPBREAK);
3979 BRDDISABLE(portp->brdnr);
3989 static void stl_sc26198flowctrl(struct stlport *portp, int state)
3995 pr_debug("stl_sc26198flowctrl(portp=%p,state=%x)\n", portp, state);
3997 if (portp == NULL)
3999 tty = tty_port_tty_get(&portp->port);
4004 BRDENABLE(portp->brdnr, portp->pagenr);
4008 mr0 = stl_sc26198getreg(portp, MR0);
4009 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4010 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4012 portp->stats.rxxon++;
4013 stl_sc26198wait(portp);
4014 stl_sc26198setreg(portp, MR0, mr0);
4023 stl_sc26198setreg(portp, MR1,
4024 (stl_sc26198getreg(portp, MR1) | MR1_AUTORTS));
4025 stl_sc26198setreg(portp, IOPIOR,
4026 (stl_sc26198getreg(portp, IOPIOR) | IOPR_RTS));
4027 portp->stats.rxrtson++;
4031 mr0 = stl_sc26198getreg(portp, MR0);
4032 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4033 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4035 portp->stats.rxxoff++;
4036 stl_sc26198wait(portp);
4037 stl_sc26198setreg(portp, MR0, mr0);
4040 stl_sc26198setreg(portp, MR1,
4041 (stl_sc26198getreg(portp, MR1) & ~MR1_AUTORTS));
4042 stl_sc26198setreg(portp, IOPIOR,
4043 (stl_sc26198getreg(portp, IOPIOR) & ~IOPR_RTS));
4044 portp->stats.rxrtsoff++;
4048 BRDDISABLE(portp->brdnr);
4059 static void stl_sc26198sendflow(struct stlport *portp, int state)
4065 pr_debug("stl_sc26198sendflow(portp=%p,state=%x)\n", portp, state);
4067 if (portp == NULL)
4069 tty = tty_port_tty_get(&portp->port);
4074 BRDENABLE(portp->brdnr, portp->pagenr);
4076 mr0 = stl_sc26198getreg(portp, MR0);
4077 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4078 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4080 portp->stats.rxxon++;
4081 stl_sc26198wait(portp);
4082 stl_sc26198setreg(portp, MR0, mr0);
4084 mr0 = stl_sc26198getreg(portp, MR0);
4085 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4086 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4088 portp->stats.rxxoff++;
4089 stl_sc26198wait(portp);
4090 stl_sc26198setreg(portp, MR0, mr0);
4092 BRDDISABLE(portp->brdnr);
4099 static void stl_sc26198flush(struct stlport *portp)
4103 pr_debug("stl_sc26198flush(portp=%p)\n", portp);
4105 if (portp == NULL)
4109 BRDENABLE(portp->brdnr, portp->pagenr);
4110 stl_sc26198setreg(portp, SCCR, CR_TXRESET);
4111 stl_sc26198setreg(portp, SCCR, portp->crenable);
4112 BRDDISABLE(portp->brdnr);
4113 portp->tx.tail = portp->tx.head;
4127 static int stl_sc26198datastate(struct stlport *portp)
4132 pr_debug("stl_sc26198datastate(portp=%p)\n", portp);
4134 if (portp == NULL)
4136 if (test_bit(ASYI_TXBUSY, &portp->istate))
4140 BRDENABLE(portp->brdnr, portp->pagenr);
4141 sr = stl_sc26198getreg(portp, SR);
4142 BRDDISABLE(portp->brdnr);
4155 static void stl_sc26198wait(struct stlport *portp)
4159 pr_debug("stl_sc26198wait(portp=%p)\n", portp);
4161 if (portp == NULL)
4165 stl_sc26198getglobreg(portp, TSTR);
4176 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty)
4180 mr0 = stl_sc26198getreg(portp, MR0);
4181 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4182 stl_sc26198setreg(portp, SCCR, CR_HOSTXON);
4183 stl_sc26198wait(portp);
4184 stl_sc26198setreg(portp, MR0, mr0);
4185 clear_bit(ASYI_TXFLOWED, &portp->istate);
4196 struct stlport *portp;
4204 portp = panelp->ports[(iack & IVR_CHANMASK) + ((iobase & 0x4) << 1)];
4207 stl_sc26198rxisr(portp, iack);
4209 stl_sc26198txisr(portp);
4211 stl_sc26198otherisr(portp, iack);
4228 static void stl_sc26198txisr(struct stlport *portp)
4236 pr_debug("stl_sc26198txisr(portp=%p)\n", portp);
4238 ioaddr = portp->ioaddr;
4239 head = portp->tx.head;
4240 tail = portp->tx.tail;
4243 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
4244 set_bit(ASYI_TXLOW, &portp->istate);
4245 tty = tty_port_tty_get(&portp->port);
4253 outb((MR0 | portp->uartaddr), (ioaddr + XP_ADDR));
4256 portp->imr &= ~IR_TXRDY;
4257 outb((IMR | portp->uartaddr), (ioaddr + XP_ADDR));
4258 outb(portp->imr, (ioaddr + XP_DATA));
4259 clear_bit(ASYI_TXBUSY, &portp->istate);
4266 portp->stats.txtotal += len;
4268 (portp->tx.buf + STL_TXBUFSIZE) - tail);
4273 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
4274 tail = portp->tx.buf;
4279 portp->tx.tail = tail;
4295 static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack)
4300 pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack);
4302 tty = tty_port_tty_get(&portp->port);
4303 ioaddr = portp->ioaddr;
4312 portp->stats.rxlost += len;
4313 portp->stats.rxtotal += len;
4322 portp->stats.rxtotal += len;
4326 stl_sc26198rxbadchars(portp);
4334 if (test_bit(ASYI_TXFLOWED, &portp->istate)) {
4338 stl_sc26198txunflow(portp, tty);
4350 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch)
4355 tty = tty_port_tty_get(&portp->port);
4356 ioaddr = portp->ioaddr;
4359 portp->stats.rxparity++;
4361 portp->stats.rxframing++;
4363 portp->stats.rxoverrun++;
4365 portp->stats.rxbreaks++;
4368 ((portp->rxignoremsk & status) == 0)) {
4369 if (portp->rxmarkmsk & status) {
4372 if (portp->port.flags & ASYNC_SAK) {
4374 BRDENABLE(portp->brdnr, portp->pagenr);
4391 portp->stats.rxtotal++;
4407 static void stl_sc26198rxbadchars(struct stlport *portp)
4416 mr1 = stl_sc26198getreg(portp, MR1);
4417 stl_sc26198setreg(portp, MR1, (mr1 & ~MR1_ERRBLOCK));
4419 while ((status = stl_sc26198getreg(portp, SR)) & SR_RXRDY) {
4420 stl_sc26198setreg(portp, SCCR, CR_CLEARRXERR);
4421 ch = stl_sc26198getreg(portp, RXFIFO);
4422 stl_sc26198rxbadch(portp, status, ch);
4429 stl_sc26198setreg(portp, MR1, mr1);
4440 static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack)
4444 pr_debug("stl_sc26198otherisr(portp=%p,iack=%x)\n", portp, iack);
4446 cir = stl_sc26198getglobreg(portp, CIR);
4450 ipr = stl_sc26198getreg(portp, IPR);
4452 stl_cd_change(portp);
4453 portp->stats.modem++;
4457 xisr = stl_sc26198getreg(portp, XISR);
4459 set_bit(ASYI_TXFLOWED, &portp->istate);
4460 portp->stats.txxoff++;
4463 clear_bit(ASYI_TXFLOWED, &portp->istate);
4464 portp->stats.txxon++;
4468 stl_sc26198setreg(portp, SCCR, CR_BREAKRESET);
4469 stl_sc26198rxbadchars(portp);