Lines Matching refs:com

116 #define	sio_getreg(com, off) \  argument
117 (bus_space_read_1((com)->bst, (com)->bsh, (off)))
118 #define sio_setreg(com, off, value) \ argument
119 (bus_space_write_1((com)->bst, (com)->bsh, (off), (value)))
156 #define CE_RECORD(com, errnum) (++(com)->delta_error_counts[errnum]) argument
256 static int espattach(struct com_s *com, Port_t esp_port);
264 static void sioinput(struct com_s *com);
265 static void siointr1(struct com_s *com);
271 static int siosetwater(struct com_s *com, speed_t speed);
334 struct com_s *com; in sysctl_machdep_comdefaultrate() local
348 com = com_addr(comconsole); in sysctl_machdep_comdefaultrate()
349 if (com == NULL) in sysctl_machdep_comdefaultrate()
352 tp = com->tp; in sysctl_machdep_comdefaultrate()
396 struct com_s *com; in siodetach() local
398 com = (struct com_s *) device_get_softc(dev); in siodetach()
399 if (com == NULL) { in siodetach()
403 com->gone = TRUE; in siodetach()
404 if (com->tp) in siodetach()
405 ttyfree(com->tp); in siodetach()
406 if (com->irqres) { in siodetach()
407 bus_teardown_intr(dev, com->irqres, com->cookie); in siodetach()
408 bus_release_resource(dev, SYS_RES_IRQ, 0, com->irqres); in siodetach()
410 if (com->ioportres) in siodetach()
411 bus_release_resource(dev, SYS_RES_IOPORT, com->ioportrid, in siodetach()
412 com->ioportres); in siodetach()
413 if (com->ibuf != NULL) in siodetach()
414 free(com->ibuf, M_DEVBUF); in siodetach()
417 free(com, M_DEVBUF); in siodetach()
432 struct com_s *com; local
453 com = malloc(sizeof(*com), M_DEVBUF, M_NOWAIT | M_ZERO);
454 if (com == NULL) {
458 device_set_softc(dev, com);
459 com->bst = rman_get_bustag(port);
460 com->bsh = rman_get_bushandle(port);
463 com->rclk = rclk;
509 free(com, M_DEVBUF);
571 cfcr = sio_getreg(com, com_cfcr);
572 sio_setreg(com, com_cfcr, CFCR_EFR_ENABLE);
573 efr = sio_getreg(com, com_efr);
575 sio_setreg(com, com_efr, efr | EFR_EFE);
577 sio_setreg(com, com_cfcr, (cfcr != CFCR_EFR_ENABLE) ? cfcr : 0);
579 sio_setreg(com, com_mcr,
580 sio_getreg(com, com_mcr) & ~MCR_PRESCALE);
581 sio_setreg(com, com_cfcr, CFCR_EFR_ENABLE);
582 sio_setreg(com, com_efr, efr);
583 sio_setreg(com, com_cfcr, cfcr);
599 sio_setreg(com, com_cfcr, CFCR_DLAB | CFCR_8BITS);
601 sio_setreg(com, com_dlbl, divisor & 0xff);
602 sio_setreg(com, com_dlbh, divisor >> 8);
603 sio_setreg(com, com_cfcr, CFCR_8BITS);
613 sio_setreg(com, com_mcr, mcr_image);
614 sio_setreg(com, com_ier, 0);
623 sio_setreg(com, com_mcr, mcr_image | MCR_LOOPBACK);
633 sio_setreg(com, com_ier, IER_ETXRDY);
641 sio_setreg(com, com_data, 0);
655 sio_setreg(com, com_mcr, mcr_image);
662 sio_setreg(com, com_cfcr, CFCR_8BITS);
675 failures[6] = sio_getreg(com, com_iir);
685 sio_setreg(com, com_ier, 0);
686 if (sio_getreg(com, com_iir) & IIR_NOPEND) {
692 sio_setreg(com, com_mcr, 0);
698 sio_setreg(com, com_ier, 0);
699 sio_setreg(com, com_cfcr, CFCR_8BITS);
714 free(com, M_DEVBUF);
728 failures[0] = sio_getreg(com, com_cfcr) - CFCR_8BITS;
729 failures[1] = sio_getreg(com, com_ier) - IER_ETXRDY;
730 failures[2] = sio_getreg(com, com_mcr) - mcr_image;
733 failures[4] = (sio_getreg(com, com_iir) & IIR_IMASK) - IIR_TXRDY;
736 failures[6] = (sio_getreg(com, com_iir) & IIR_IMASK) - IIR_NOPEND;
747 sio_setreg(com, com_ier, 0);
748 sio_setreg(com, com_cfcr, CFCR_8BITS); /* dummy to avoid bus echo */
749 failures[7] = sio_getreg(com, com_ier);
752 failures[9] = (sio_getreg(com, com_iir) & IIR_IMASK) - IIR_NOPEND;
774 sio_setreg(com, com_mcr, 0);
798 free(com, M_DEVBUF);
805 espattach(com, esp_port) in espattach() argument
806 struct com_s *com; in espattach()
833 if (rman_get_start(com->ioportres) == likely_com_ports[dips & 0x03])
862 com->esp = TRUE;
863 com->esp_port = esp_port;
874 struct com_s *com; local
895 com = device_get_softc(dev);
912 bzero(com, sizeof *com);
913 com->unit = unit;
914 com->ioportres = port;
915 com->ioportrid = rid;
916 com->bst = rman_get_bustag(port);
917 com->bsh = rman_get_bushandle(port);
918 com->cfcr_image = CFCR_8BITS;
919 com->loses_outints = COM_LOSESOUTINTS(flags) != 0;
920 com->no_irq = bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL) != 0;
921 com->tx_fifo_size = 1;
922 com->obufs[0].l_head = com->obuf1;
923 com->obufs[1].l_head = com->obuf2;
925 com->data_port = iobase + com_data;
926 com->int_ctl_port = iobase + com_ier;
927 com->int_id_port = iobase + com_iir;
928 com->modem_ctl_port = iobase + com_mcr;
929 com->mcr_image = inb(com->modem_ctl_port);
930 com->line_status_port = iobase + com_lsr;
931 com->modem_status_port = iobase + com_msr;
933 tp = com->tp = ttyalloc();
941 tp->t_sc = com;
945 com->rclk = rclk;
949 error = siosetwater(com, tp->t_init_in.c_ispeed);
970 scr = sio_getreg(com, com_scr);
971 sio_setreg(com, com_scr, 0xa5);
972 scr1 = sio_getreg(com, com_scr);
973 sio_setreg(com, com_scr, 0x5a);
974 scr2 = sio_getreg(com, com_scr);
975 sio_setreg(com, com_scr, scr);
981 sio_setreg(com, com_fifo, FIFO_ENABLE | FIFO_RX_HIGH);
983 switch (inb(com->int_id_port) & IIR_FIFO_MASK) {
998 com->hasfifo = TRUE;
1001 com->st16650a = TRUE;
1002 com->tx_fifo_size = 32;
1007 com->tx_fifo_size = 64;
1013 if (espattach(com, *espp)) {
1014 com->tx_fifo_size = 1024;
1017 if (com->esp)
1020 com->tx_fifo_size = COM_FIFOSIZE(flags);
1021 if (com->tx_fifo_size == 0)
1022 com->tx_fifo_size = 16;
1025 com->tx_fifo_size);
1029 if (com->esp) {
1037 outb(com->esp_port + ESP_CMD1, ESP_SETMODE);
1038 outb(com->esp_port + ESP_CMD2, ESP_MODE_RTS | ESP_MODE_FIFO);
1041 outb(com->esp_port + ESP_CMD1, ESP_SETFLOWTYPE);
1042 outb(com->esp_port + ESP_CMD2, ESP_FLOW_RTS);
1043 outb(com->esp_port + ESP_CMD2, ESP_FLOW_CTS);
1046 outb(com->esp_port + ESP_CMD1, ESP_SETRXFLOW);
1047 outb(com->esp_port + ESP_CMD2, HIBYTE(768));
1048 outb(com->esp_port + ESP_CMD2, LOBYTE(768));
1049 outb(com->esp_port + ESP_CMD2, HIBYTE(512));
1050 outb(com->esp_port + ESP_CMD2, LOBYTE(512));
1053 sio_setreg(com, com_fifo, 0);
1060 com->multiport = TRUE;
1067 com->no_irq = (masterdev == NULL || bus_get_resource(masterdev,
1084 com->flags = flags;
1085 com->pps.ppscap = PPS_CAPTUREASSERT | PPS_CAPTURECLEAR;
1086 tp->t_pps = &com->pps;
1089 com->pps_bit = MSR_CTS;
1091 com->pps_bit = MSR_DCD;
1092 pps_init(&com->pps);
1095 com->irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE);
1096 if (com->irqres) {
1097 ret = bus_setup_intr(dev, com->irqres,
1099 siointr, NULL, com,
1100 &com->cookie);
1103 com->irqres, INTR_TYPE_TTY,
1104 NULL, (driver_intr_t *)siointr, com, &com->cookie);
1130 struct com_s *com; in comopen() local
1133 com = tp->t_sc; in comopen()
1134 com->poll = com->no_irq; in comopen()
1135 com->poll_output = com->loses_outints; in comopen()
1136 if (com->hasfifo) { in comopen()
1149 sio_setreg(com, com_fifo, in comopen()
1151 | com->fifo_image); in comopen()
1164 if (!(inb(com->line_status_port) & LSR_RXRDY)) in comopen()
1166 sio_setreg(com, com_fifo, 0); in comopen()
1168 (void) inb(com->data_port); in comopen()
1175 (void) inb(com->line_status_port); in comopen()
1176 (void) inb(com->data_port); in comopen()
1177 com->prev_modem_status = com->last_modem_status in comopen()
1178 = inb(com->modem_status_port); in comopen()
1179 outb(com->int_ctl_port, in comopen()
1181 | (COM_IIR_TXRDYBUG(com->flags) ? 0 : IER_ETXRDY)); in comopen()
1185 if (com->prev_modem_status & MSR_DCD || ISCALLOUT(dev)) in comopen()
1195 struct com_s *com; local
1198 com = tp->t_sc;
1199 com->poll = FALSE;
1200 com->poll_output = FALSE;
1201 sio_setreg(com, com_cfcr, com->cfcr_image &= ~CFCR_SBREAK);
1209 if (com->unit != comconsole)
1212 sio_setreg(com, com_ier, 0);
1222 && !(com->prev_modem_status & MSR_DCD)
1229 if (com->hasfifo) {
1235 sio_setreg(com, com_fifo, 0);
1248 struct com_s *com; local
1251 com = (struct com_s *)chan;
1262 if (com->state & CS_BUSY)
1263 com->extra_state &= ~CSE_BUSYCHECK; /* False alarm. */
1264 else if ((inb(com->line_status_port) & (LSR_TSRE | LSR_TXRDY))
1266 com->tp->t_state &= ~TS_BUSY;
1267 ttwwakeup(com->tp);
1268 com->extra_state &= ~CSE_BUSYCHECK;
1270 timeout(siobusycheck, com, hz / 100);
1309 sioinput(com) in sioinput() argument
1310 struct com_s *com; in sioinput()
1318 buf = com->ibuf;
1319 tp = com->tp;
1321 com_events -= (com->iptr - com->ibuf);
1322 com->iptr = com->ibuf;
1340 incc = com->iptr - buf;
1342 && (com->state & CS_RTS_IFLOW
1346 com->delta_error_counts[CE_TTY_BUF_OVERFLOW]
1361 } while (buf < com->iptr);
1370 line_status = buf[com->ierroff];
1385 } while (buf < com->iptr);
1387 com_events -= (com->iptr - com->ibuf);
1388 com->iptr = com->ibuf;
1395 if ((com->state & CS_RTS_IFLOW) && !(com->mcr_image & MCR_RTS) &&
1397 outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS);
1404 struct com_s *com; local
1407 com = (struct com_s *)arg;
1410 siointr1(com);
1427 com = com_addr(unit);
1432 if (com != NULL
1433 && !com->gone
1434 && (inb(com->int_id_port) & IIR_IMASK)
1436 siointr1(com);
1480 siointr1(com) in siointr1() argument
1481 struct com_s *com; in siointr1()
1494 if (COM_IIR_TXRDYBUG(com->flags)) {
1495 int_ctl = inb(com->int_ctl_port);
1502 while (!com->gone) {
1503 if (com->pps.ppsparam.mode & PPS_CAPTUREBOTH) {
1504 modem_status = inb(com->modem_status_port);
1505 if ((modem_status ^ com->last_modem_status) &
1506 com->pps_bit) {
1507 pps_capture(&com->pps);
1508 pps_event(&com->pps,
1509 (modem_status & com->pps_bit) ?
1513 line_status = inb(com->line_status_port);
1521 recv_data = inb(com->data_port);
1523 if (com->unit == comconsole &&
1524 kdb_alt_break(recv_data, &com->alt_brk_state) != 0)
1542 if (com->unit == comconsole) {
1547 if (com->tp == NULL
1548 || com->tp->t_iflag & IGNBRK)
1551 if (com->tp == NULL
1552 || com->tp->t_iflag & IGNPAR)
1555 if (com->tp->t_state & TS_CAN_BYPASS_L_RINT
1557 || com->tp->t_iflag & INPCK))
1560 ++com->bytes_in;
1561 if (com->tp != NULL &&
1562 com->tp->t_hotchar != 0 && recv_data == com->tp->t_hotchar)
1564 ioptr = com->iptr;
1565 if (ioptr >= com->ibufend)
1566 CE_RECORD(com, CE_INTERRUPT_BUF_OVERFLOW);
1568 if (com->tp != NULL && com->tp->t_do_timestamp)
1569 microtime(&com->tp->t_timestamp);
1573 if (com->iptr - com->ibuf == 8)
1577 ioptr[com->ierroff] = line_status;
1578 com->iptr = ++ioptr;
1579 if (ioptr == com->ihighwater
1580 && com->state & CS_RTS_IFLOW)
1581 outb(com->modem_ctl_port,
1582 com->mcr_image &= ~MCR_RTS);
1584 CE_RECORD(com, CE_OVERRUN);
1588 && com->state >= (CS_BUSY | CS_TTGO | CS_ODEVREADY))
1595 line_status = inb(com->line_status_port) & 0x7F;
1599 modem_status = inb(com->modem_status_port);
1600 if (modem_status != com->last_modem_status) {
1607 com->last_modem_status = modem_status;
1608 if (!(com->state & CS_CHECKMSR)) {
1610 com->state |= CS_CHECKMSR;
1615 if (com->state & CS_CTS_OFLOW) {
1617 com->state |= CS_ODEVREADY;
1619 com->state &= ~CS_ODEVREADY;
1626 && com->state >= (CS_BUSY | CS_TTGO | CS_ODEVREADY)) {
1627 ioptr = com->obufq.l_head;
1628 if (com->tx_fifo_size > 1 && com->unit != siotsunit) {
1631 ocount = com->obufq.l_tail - ioptr;
1632 if (ocount > com->tx_fifo_size)
1633 ocount = com->tx_fifo_size;
1634 com->bytes_out += ocount;
1636 outb(com->data_port, *ioptr++);
1639 outb(com->data_port, *ioptr++);
1640 ++com->bytes_out;
1641 if (com->unit == siotsunit
1645 com->obufq.l_head = ioptr;
1646 if (COM_IIR_TXRDYBUG(com->flags))
1648 if (ioptr >= com->obufq.l_tail) {
1651 qp = com->obufq.l_next;
1655 com->obufq.l_head = qp->l_head;
1656 com->obufq.l_tail = qp->l_tail;
1657 com->obufq.l_next = qp;
1660 if (COM_IIR_TXRDYBUG(com->flags))
1663 com->state &= ~CS_BUSY;
1665 if (!(com->state & CS_ODONE)) {
1667 com->state |= CS_ODONE;
1672 if (COM_IIR_TXRDYBUG(com->flags)
1674 outb(com->int_ctl_port, int_ctl_new);
1679 if ((inb(com->int_id_port) & IIR_IMASK) == IIR_NOPEND)
1695 struct com_s *com; in siopoll() local
1699 com = com_addr(unit); in siopoll()
1700 if (com == NULL) in siopoll()
1702 tp = com->tp; in siopoll()
1703 if (tp == NULL || com->gone) { in siopoll()
1709 incc = com->iptr - com->ibuf; in siopoll()
1710 com->iptr = com->ibuf; in siopoll()
1711 if (com->state & CS_CHECKMSR) { in siopoll()
1713 com->state &= ~CS_CHECKMSR; in siopoll()
1719 if (com->iptr != com->ibuf) { in siopoll()
1721 sioinput(com); in siopoll()
1724 if (com->state & CS_CHECKMSR) { in siopoll()
1728 delta_modem_status = com->last_modem_status in siopoll()
1729 ^ com->prev_modem_status; in siopoll()
1730 com->prev_modem_status = com->last_modem_status; in siopoll()
1732 com->state &= ~CS_CHECKMSR; in siopoll()
1736 com->prev_modem_status & MSR_DCD); in siopoll()
1738 if (com->state & CS_ODONE) { in siopoll()
1741 com->state &= ~CS_ODONE; in siopoll()
1743 if (!(com->state & CS_BUSY) in siopoll()
1744 && !(com->extra_state & CSE_BUSYCHECK)) { in siopoll()
1745 timeout(siobusycheck, com, hz / 100); in siopoll()
1746 com->extra_state |= CSE_BUSYCHECK; in siopoll()
1762 struct com_s *com; local
1764 com = tp->t_sc;
1767 sio_setreg(com, com_cfcr, com->cfcr_image |= CFCR_SBREAK);
1769 sio_setreg(com, com_cfcr, com->cfcr_image &= ~CFCR_SBREAK);
1779 struct com_s *com; local
1786 com = tp->t_sc;
1787 if (com == NULL)
1793 divisor = siodivisor(com->rclk, t->c_ispeed);
1826 if (com->hasfifo) {
1840 com->fifo_image = com->unit == siotsunit ? 0
1849 if (com->esp)
1850 com->fifo_image |= FIFO_DMA_MODE;
1852 sio_setreg(com, com_fifo, com->fifo_image);
1860 (void) siosetwater(com, t->c_ispeed);
1862 sio_setreg(com, com_cfcr, cfcr | CFCR_DLAB);
1869 if (sio_getreg(com, com_dlbl) != dlbl)
1870 sio_setreg(com, com_dlbl, dlbl);
1872 if (sio_getreg(com, com_dlbh) != dlbh)
1873 sio_setreg(com, com_dlbh, dlbh);
1878 com->state |= CS_RTS_IFLOW;
1886 } else if (com->state & CS_RTS_IFLOW) {
1887 com->state &= ~CS_RTS_IFLOW;
1892 outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS);
1900 com->state |= CS_ODEVREADY;
1901 com->state &= ~CS_CTS_OFLOW;
1903 com->state |= CS_CTS_OFLOW;
1905 if (!(com->last_modem_status & MSR_CTS))
1906 com->state &= ~CS_ODEVREADY;
1909 if (com->st16650a) {
1910 sio_setreg(com, com_lcr, LCR_EFR_ENABLE);
1911 sio_setreg(com, com_efr,
1912 (sio_getreg(com, com_efr)
1915 sio_setreg(com, com_cfcr, com->cfcr_image = cfcr);
1923 if (com->ibufold != NULL) {
1924 free(com->ibufold, M_DEVBUF);
1925 com->ibufold = NULL;
1935 siosetwater(com, speed) in siosetwater() argument
1936 struct com_s *com; in siosetwater()
1953 if (ibufsize == com->ibufsize) {
1969 com->ibufold = com->ibuf;
1970 com->ibufsize = ibufsize;
1971 tp = com->tp;
1983 if (com->iptr != com->ibuf)
1984 sioinput(com);
1997 com->iptr = com->ibuf = ibuf;
1998 com->ibufend = ibuf + ibufsize;
1999 com->ierroff = ibufsize;
2000 com->ihighwater = ibuf + 3 * ibufsize / 4;
2008 struct com_s *com; local
2011 com = tp->t_sc;
2012 if (com == NULL)
2017 com->state &= ~CS_TTGO;
2019 com->state |= CS_TTGO;
2021 if (com->mcr_image & MCR_RTS && com->state & CS_RTS_IFLOW)
2022 outb(com->modem_ctl_port, com->mcr_image &= ~MCR_RTS);
2024 if (!(com->mcr_image & MCR_RTS) && com->iptr < com->ihighwater
2025 && com->state & CS_RTS_IFLOW)
2026 outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS);
2038 if (!com->obufs[0].l_queued) {
2039 com->obufs[0].l_tail
2040 = com->obuf1 + q_to_b(&tp->t_outq, com->obuf1,
2041 sizeof com->obuf1);
2042 com->obufs[0].l_next = NULL;
2043 com->obufs[0].l_queued = TRUE;
2045 if (com->state & CS_BUSY) {
2046 qp = com->obufq.l_next;
2049 qp->l_next = &com->obufs[0];
2051 com->obufq.l_head = com->obufs[0].l_head;
2052 com->obufq.l_tail = com->obufs[0].l_tail;
2053 com->obufq.l_next = &com->obufs[0];
2054 com->state |= CS_BUSY;
2058 if (tp->t_outq.c_cc != 0 && !com->obufs[1].l_queued) {
2059 com->obufs[1].l_tail
2060 = com->obuf2 + q_to_b(&tp->t_outq, com->obuf2,
2061 sizeof com->obuf2);
2062 com->obufs[1].l_next = NULL;
2063 com->obufs[1].l_queued = TRUE;
2065 if (com->state & CS_BUSY) {
2066 qp = com->obufq.l_next;
2069 qp->l_next = &com->obufs[1];
2071 com->obufq.l_head = com->obufs[1].l_head;
2072 com->obufq.l_tail = com->obufs[1].l_tail;
2073 com->obufq.l_next = &com->obufs[1];
2074 com->state |= CS_BUSY;
2081 if (com->state >= (CS_BUSY | CS_TTGO))
2082 siointr1(com); /* fake interrupt to start output */
2093 struct com_s *com; local
2095 com = tp->t_sc;
2096 if (com == NULL || com->gone)
2100 if (com->hasfifo)
2103 if (!com->esp)
2105 sio_setreg(com, com_fifo,
2106 FIFO_XMT_RST | com->fifo_image);
2107 com->obufs[0].l_queued = FALSE;
2108 com->obufs[1].l_queued = FALSE;
2109 if (com->state & CS_ODONE)
2111 com->state &= ~(CS_ODONE | CS_BUSY);
2112 com->tp->t_state &= ~TS_BUSY;
2115 if (com->hasfifo)
2118 if (!com->esp)
2120 sio_setreg(com, com_fifo,
2121 FIFO_RCV_RST | com->fifo_image);
2122 com_events -= (com->iptr - com->ibuf);
2123 com->iptr = com->ibuf;
2132 struct com_s *com; in commodem() local
2135 com = tp->t_sc; in commodem()
2136 if (com->gone) in commodem()
2150 com->mcr_image &= bitand; in commodem()
2151 com->mcr_image |= bitor; in commodem()
2152 outb(com->modem_ctl_port, com->mcr_image); in commodem()
2157 if (com->mcr_image & MCR_DTR) in commodem()
2159 if (com->mcr_image & MCR_RTS) in commodem()
2161 msr = com->prev_modem_status; in commodem()
2179 struct com_s *com; in siosettimeout() local
2192 com = com_addr(unit); in siosettimeout()
2193 if (com != NULL && com->tp != NULL in siosettimeout()
2194 && com->tp->t_state & TS_ISOPEN && !com->gone) { in siosettimeout()
2196 if (com->poll || com->poll_output) { in siosettimeout()
2218 struct com_s *com; local
2228 com = com_addr(unit);
2229 if (com != NULL && !com->gone
2230 && (com->state >= (CS_BUSY | CS_TTGO) || com->poll)) {
2232 siointr1(com);
2246 com = com_addr(unit);
2247 if (com == NULL)
2249 if (com->gone)
2256 delta = com->delta_error_counts[errnum];
2257 com->delta_error_counts[errnum] = 0;
2261 total = com->error_counts[errnum] += delta;