Lines Matching refs:info

159 static void change_speed(struct e100_serial *info);
168 static int get_lsr_info(struct e100_serial *info, unsigned int *value);
201 #define FORCE_EOP(info) *R_SET_EOP = 1U << info->iseteop; argument
933 #define E100_RTS_GET(info) ((info)->rx_ctrl & E100_RTS_MASK) argument
935 #define E100_CTS_GET(info) ((info)->ioport[REG_STATUS] & E100_CTS_MASK) argument
939 #define E100_DTR_GET(info) ((*e100_modem_pins[(info)->line].dtr_shadow) & e100_modem_pins[(info)->l… argument
942 #define E100_RI_GET(info) ((*e100_modem_pins[(info)->line].ri_port) & e100_modem_pins[(info)->line]… argument
943 #define E100_CD_GET(info) ((*e100_modem_pins[(info)->line].cd_port) & e100_modem_pins[(info)->line]… argument
946 #define E100_DSR_GET(info) ((*e100_modem_pins[(info)->line].dsr_port) & e100_modem_pins[(info)->lin… argument
949 static void update_char_time(struct e100_serial * info) in update_char_time() argument
951 tcflag_t cflags = info->port.tty->termios.c_cflag; in update_char_time()
968 info->char_time_usec = ((bits * 1000000) / info->baud) + 1; in update_char_time()
969 info->flush_time_usec = 4*info->char_time_usec; in update_char_time()
970 if (info->flush_time_usec < MIN_FLUSH_TIME_USEC) in update_char_time()
971 info->flush_time_usec = MIN_FLUSH_TIME_USEC; in update_char_time()
1034 e100_dtr(struct e100_serial *info, int set) in e100_dtr() argument
1036 unsigned char mask = e100_modem_pins[info->line].dtr_mask; in e100_dtr()
1039 printk("ser%i dtr %i mask: 0x%02X\n", info->line, set, mask); in e100_dtr()
1041 info->line, *e100_modem_pins[info->line].dtr_shadow, in e100_dtr()
1042 E100_DTR_GET(info)); in e100_dtr()
1049 *e100_modem_pins[info->line].dtr_shadow &= ~mask; in e100_dtr()
1050 *e100_modem_pins[info->line].dtr_shadow |= (set ? 0 : mask); in e100_dtr()
1051 *e100_modem_pins[info->line].dtr_port = *e100_modem_pins[info->line].dtr_shadow; in e100_dtr()
1057 info->line, *e100_modem_pins[info->line].dtr_shadow, in e100_dtr()
1058 E100_DTR_GET(info)); in e100_dtr()
1066 e100_rts(struct e100_serial *info, int set) in e100_rts() argument
1070 info->rx_ctrl &= ~E100_RTS_MASK; in e100_rts()
1071 info->rx_ctrl |= (set ? 0 : E100_RTS_MASK); /* RTS is active low */ in e100_rts()
1072 info->ioport[REG_REC_CTRL] = info->rx_ctrl; in e100_rts()
1075 printk("ser%i rts %i\n", info->line, set); in e100_rts()
1082 e100_ri_out(struct e100_serial *info, int set) in e100_ri_out() argument
1086 unsigned char mask = e100_modem_pins[info->line].ri_mask; in e100_ri_out()
1090 *e100_modem_pins[info->line].ri_shadow &= ~mask; in e100_ri_out()
1091 *e100_modem_pins[info->line].ri_shadow |= (set ? 0 : mask); in e100_ri_out()
1092 *e100_modem_pins[info->line].ri_port = *e100_modem_pins[info->line].ri_shadow; in e100_ri_out()
1097 e100_cd_out(struct e100_serial *info, int set) in e100_cd_out() argument
1101 unsigned char mask = e100_modem_pins[info->line].cd_mask; in e100_cd_out()
1105 *e100_modem_pins[info->line].cd_shadow &= ~mask; in e100_cd_out()
1106 *e100_modem_pins[info->line].cd_shadow |= (set ? 0 : mask); in e100_cd_out()
1107 *e100_modem_pins[info->line].cd_port = *e100_modem_pins[info->line].cd_shadow; in e100_cd_out()
1113 e100_disable_rx(struct e100_serial *info) in e100_disable_rx() argument
1116 info->ioport[REG_REC_CTRL] = in e100_disable_rx()
1117 (info->rx_ctrl &= ~IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); in e100_disable_rx()
1121 e100_enable_rx(struct e100_serial *info) in e100_enable_rx() argument
1124 info->ioport[REG_REC_CTRL] = in e100_enable_rx()
1125 (info->rx_ctrl |= IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); in e100_enable_rx()
1131 e100_disable_rxdma_irq(struct e100_serial *info) in e100_disable_rxdma_irq() argument
1134 printk("rxdma_irq(%d): 0\n",info->line); in e100_disable_rxdma_irq()
1136 DINTR1(DEBUG_LOG(info->line,"IRQ disable_rxdma_irq %i\n", info->line)); in e100_disable_rxdma_irq()
1137 *R_IRQ_MASK2_CLR = (info->irq << 2) | (info->irq << 3); in e100_disable_rxdma_irq()
1141 e100_enable_rxdma_irq(struct e100_serial *info) in e100_enable_rxdma_irq() argument
1144 printk("rxdma_irq(%d): 1\n",info->line); in e100_enable_rxdma_irq()
1146 DINTR1(DEBUG_LOG(info->line,"IRQ enable_rxdma_irq %i\n", info->line)); in e100_enable_rxdma_irq()
1147 *R_IRQ_MASK2_SET = (info->irq << 2) | (info->irq << 3); in e100_enable_rxdma_irq()
1152 static void e100_disable_txdma_irq(struct e100_serial *info) in e100_disable_txdma_irq() argument
1155 printk("txdma_irq(%d): 0\n",info->line); in e100_disable_txdma_irq()
1157 DINTR1(DEBUG_LOG(info->line,"IRQ disable_txdma_irq %i\n", info->line)); in e100_disable_txdma_irq()
1158 *R_IRQ_MASK2_CLR = info->irq; in e100_disable_txdma_irq()
1161 static void e100_enable_txdma_irq(struct e100_serial *info) in e100_enable_txdma_irq() argument
1164 printk("txdma_irq(%d): 1\n",info->line); in e100_enable_txdma_irq()
1166 DINTR1(DEBUG_LOG(info->line,"IRQ enable_txdma_irq %i\n", info->line)); in e100_enable_txdma_irq()
1167 *R_IRQ_MASK2_SET = info->irq; in e100_enable_txdma_irq()
1170 static void e100_disable_txdma_channel(struct e100_serial *info) in e100_disable_txdma_channel() argument
1178 DFLOW(DEBUG_LOG(info->line, "disable_txdma_channel %i\n", info->line)); in e100_disable_txdma_channel()
1179 if (info->line == 0) { in e100_disable_txdma_channel()
1185 } else if (info->line == 1) { in e100_disable_txdma_channel()
1191 } else if (info->line == 2) { in e100_disable_txdma_channel()
1197 } else if (info->line == 3) { in e100_disable_txdma_channel()
1209 static void e100_enable_txdma_channel(struct e100_serial *info) in e100_enable_txdma_channel() argument
1214 DFLOW(DEBUG_LOG(info->line, "enable_txdma_channel %i\n", info->line)); in e100_enable_txdma_channel()
1216 if (info->line == 0) { in e100_enable_txdma_channel()
1219 } else if (info->line == 1) { in e100_enable_txdma_channel()
1222 } else if (info->line == 2) { in e100_enable_txdma_channel()
1225 } else if (info->line == 3) { in e100_enable_txdma_channel()
1233 static void e100_disable_rxdma_channel(struct e100_serial *info) in e100_disable_rxdma_channel() argument
1241 if (info->line == 0) { in e100_disable_rxdma_channel()
1247 } else if (info->line == 1) { in e100_disable_rxdma_channel()
1253 } else if (info->line == 2) { in e100_disable_rxdma_channel()
1259 } else if (info->line == 3) { in e100_disable_rxdma_channel()
1271 static void e100_enable_rxdma_channel(struct e100_serial *info) in e100_enable_rxdma_channel() argument
1277 if (info->line == 0) { in e100_enable_rxdma_channel()
1280 } else if (info->line == 1) { in e100_enable_rxdma_channel()
1283 } else if (info->line == 2) { in e100_enable_rxdma_channel()
1286 } else if (info->line == 3) { in e100_enable_rxdma_channel()
1299 e100_disable_serial_data_irq(struct e100_serial *info) in e100_disable_serial_data_irq() argument
1302 printk("ser_irq(%d): 0\n",info->line); in e100_disable_serial_data_irq()
1304 DINTR1(DEBUG_LOG(info->line,"IRQ disable data_irq %i\n", info->line)); in e100_disable_serial_data_irq()
1305 *R_IRQ_MASK1_CLR = (1U << (8+2*info->line)); in e100_disable_serial_data_irq()
1309 e100_enable_serial_data_irq(struct e100_serial *info) in e100_enable_serial_data_irq() argument
1312 printk("ser_irq(%d): 1\n",info->line); in e100_enable_serial_data_irq()
1314 (8+2*info->line), in e100_enable_serial_data_irq()
1315 (1U << (8+2*info->line))); in e100_enable_serial_data_irq()
1317 DINTR1(DEBUG_LOG(info->line,"IRQ enable data_irq %i\n", info->line)); in e100_enable_serial_data_irq()
1318 *R_IRQ_MASK1_SET = (1U << (8+2*info->line)); in e100_enable_serial_data_irq()
1323 e100_disable_serial_tx_ready_irq(struct e100_serial *info) in e100_disable_serial_tx_ready_irq() argument
1326 printk("ser_tx_irq(%d): 0\n",info->line); in e100_disable_serial_tx_ready_irq()
1328 DINTR1(DEBUG_LOG(info->line,"IRQ disable ready_irq %i\n", info->line)); in e100_disable_serial_tx_ready_irq()
1329 *R_IRQ_MASK1_CLR = (1U << (8+1+2*info->line)); in e100_disable_serial_tx_ready_irq()
1333 e100_enable_serial_tx_ready_irq(struct e100_serial *info) in e100_enable_serial_tx_ready_irq() argument
1336 printk("ser_tx_irq(%d): 1\n",info->line); in e100_enable_serial_tx_ready_irq()
1338 (8+1+2*info->line), in e100_enable_serial_tx_ready_irq()
1339 (1U << (8+1+2*info->line))); in e100_enable_serial_tx_ready_irq()
1341 DINTR2(DEBUG_LOG(info->line,"IRQ enable ready_irq %i\n", info->line)); in e100_enable_serial_tx_ready_irq()
1342 *R_IRQ_MASK1_SET = (1U << (8+1+2*info->line)); in e100_enable_serial_tx_ready_irq()
1345 static inline void e100_enable_rx_irq(struct e100_serial *info) in e100_enable_rx_irq() argument
1347 if (info->uses_dma_in) in e100_enable_rx_irq()
1348 e100_enable_rxdma_irq(info); in e100_enable_rx_irq()
1350 e100_enable_serial_data_irq(info); in e100_enable_rx_irq()
1352 static inline void e100_disable_rx_irq(struct e100_serial *info) in e100_disable_rx_irq() argument
1354 if (info->uses_dma_in) in e100_disable_rx_irq()
1355 e100_disable_rxdma_irq(info); in e100_disable_rx_irq()
1357 e100_disable_serial_data_irq(info); in e100_disable_rx_irq()
1365 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in e100_enable_rs485() local
1381 info->rs485 = *r; in e100_enable_rs485()
1384 if (info->rs485.delay_rts_before_send >= 1000) in e100_enable_rs485()
1385 info->rs485.delay_rts_before_send = 1000; in e100_enable_rs485()
1400 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in e100_write_rs485() local
1401 int old_value = (info->rs485.flags) & SER_RS485_ENABLED; in e100_write_rs485()
1408 info->rs485.flags |= SER_RS485_ENABLED; in e100_write_rs485()
1412 info->rs485.flags &= ~(SER_RS485_ENABLED); in e100_write_rs485()
1420 struct e100_serial *info = (struct e100_serial *)data; in rs485_toggle_rts_timer_function() local
1422 fast_timers_rs485[info->line].function = NULL; in rs485_toggle_rts_timer_function()
1423 e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND)); in rs485_toggle_rts_timer_function()
1425 e100_enable_rx(info); in rs485_toggle_rts_timer_function()
1426 e100_enable_rx_irq(info); in rs485_toggle_rts_timer_function()
1444 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_stop() local
1445 if (info) { in rs_stop()
1450 DFLOW(DEBUG_LOG(info->line, "XOFF rs_stop xmit %i\n", in rs_stop()
1451 CIRC_CNT(info->xmit.head, in rs_stop()
1452 info->xmit.tail,SERIAL_XMIT_SIZE))); in rs_stop()
1455 STOP_CHAR(info->port.tty)); in rs_stop()
1461 *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; in rs_stop()
1469 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_start() local
1470 if (info) { in rs_start()
1475 DFLOW(DEBUG_LOG(info->line, "XOFF rs_start xmit %i\n", in rs_start()
1476 CIRC_CNT(info->xmit.head, in rs_start()
1477 info->xmit.tail,SERIAL_XMIT_SIZE))); in rs_start()
1484 *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; in rs_start()
1485 if (!info->uses_dma_out && in rs_start()
1486 info->xmit.head != info->xmit.tail && info->xmit.buf) in rs_start()
1487 e100_enable_serial_tx_ready_irq(info); in rs_start()
1518 static void rs_sched_event(struct e100_serial *info, int event) in rs_sched_event() argument
1520 if (info->event & (1 << event)) in rs_sched_event()
1522 info->event |= 1 << event; in rs_sched_event()
1523 schedule_work(&info->work); in rs_sched_event()
1538 transmit_chars_dma(struct e100_serial *info) in transmit_chars_dma() argument
1544 *info->oclrintradr = in transmit_chars_dma()
1549 if (info->line == SERIAL_DEBUG_LINE) in transmit_chars_dma()
1552 if (!info->tr_running) { in transmit_chars_dma()
1558 descr = &info->tr_descr; in transmit_chars_dma()
1570 DFLOW(DEBUG_LOG(info->line, "TX %i done\n", sentl)); in transmit_chars_dma()
1573 info->icount.tx += sentl; in transmit_chars_dma()
1576 info->xmit.tail = (info->xmit.tail + sentl) & (SERIAL_XMIT_SIZE - 1); in transmit_chars_dma()
1580 if (CIRC_CNT(info->xmit.head, in transmit_chars_dma()
1581 info->xmit.tail, in transmit_chars_dma()
1583 rs_sched_event(info, RS_EVENT_WRITE_WAKEUP); in transmit_chars_dma()
1587 c = CIRC_CNT_TO_END(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in transmit_chars_dma()
1598 info->tr_running = 0; in transmit_chars_dma()
1601 if (info->rs485.flags & SER_RS485_ENABLED) { in transmit_chars_dma()
1603 start_one_shot_timer(&fast_timers_rs485[info->line], in transmit_chars_dma()
1605 (unsigned long)info, in transmit_chars_dma()
1606 info->char_time_usec*2, in transmit_chars_dma()
1615 DFLOW(DEBUG_LOG(info->line, "TX %i\n", c)); in transmit_chars_dma()
1618 descr->buf = virt_to_phys(info->xmit.buf + info->xmit.tail); in transmit_chars_dma()
1621 *info->ofirstadr = virt_to_phys(descr); /* write to R_DMAx_FIRST */ in transmit_chars_dma()
1622 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, start); in transmit_chars_dma()
1628 start_transmit(struct e100_serial *info) in start_transmit() argument
1631 if (info->line == SERIAL_DEBUG_LINE) in start_transmit()
1635 info->tr_descr.sw_len = 0; in start_transmit()
1636 info->tr_descr.hw_len = 0; in start_transmit()
1637 info->tr_descr.status = 0; in start_transmit()
1638 info->tr_running = 1; in start_transmit()
1639 if (info->uses_dma_out) in start_transmit()
1640 transmit_chars_dma(info); in start_transmit()
1642 e100_enable_serial_tx_ready_irq(info); in start_transmit()
1649 #define START_FLUSH_FAST_TIMER_TIME(info, string, usec) {\ argument
1652 if (fast_timers[info->line].function == NULL) { \
1654 TIMERD(DEBUG_LOG(info->line, "start_timer %i ", info->line)); \
1655 TIMERD(DEBUG_LOG(info->line, "num started: %i\n", serial_fast_timer_started)); \
1656 start_one_shot_timer(&fast_timers[info->line], \
1658 (unsigned long)info, \
1663 TIMERD(DEBUG_LOG(info->line, "timer %i already running\n", info->line)); \
1667 #define START_FLUSH_FAST_TIMER(info, string) START_FLUSH_FAST_TIMER_TIME(info, string, info->flush_… argument
1670 #define START_FLUSH_FAST_TIMER_TIME(info, string, usec) argument
1671 #define START_FLUSH_FAST_TIMER(info, string) argument
1690 append_recv_buffer(struct e100_serial *info, struct etrax_recv_buffer *buffer) in append_recv_buffer() argument
1696 if (!info->first_recv_buffer) in append_recv_buffer()
1697 info->first_recv_buffer = buffer; in append_recv_buffer()
1699 info->last_recv_buffer->next = buffer; in append_recv_buffer()
1701 info->last_recv_buffer = buffer; in append_recv_buffer()
1703 info->recv_cnt += buffer->length; in append_recv_buffer()
1704 if (info->recv_cnt > info->max_recv_cnt) in append_recv_buffer()
1705 info->max_recv_cnt = info->recv_cnt; in append_recv_buffer()
1711 add_char_and_flag(struct e100_serial *info, unsigned char data, unsigned char flag) in add_char_and_flag() argument
1714 if (info->uses_dma_in) { in add_char_and_flag()
1722 append_recv_buffer(info, buffer); in add_char_and_flag()
1724 info->icount.rx++; in add_char_and_flag()
1726 tty_insert_flip_char(&info->port, data, flag); in add_char_and_flag()
1727 info->icount.rx++; in add_char_and_flag()
1733 static unsigned int handle_descr_data(struct e100_serial *info, in handle_descr_data() argument
1739 if (info->recv_cnt + recvl > 65536) { in handle_descr_data()
1747 if (info->errorcode == ERRCODE_SET_BREAK) in handle_descr_data()
1749 info->errorcode = 0; in handle_descr_data()
1751 append_recv_buffer(info, buffer); in handle_descr_data()
1761 static unsigned int handle_all_descr_data(struct e100_serial *info) in handle_all_descr_data() argument
1769 descr = &info->rec_descr[info->cur_rec_descr]; in handle_all_descr_data()
1771 if (descr == phys_to_virt(*info->idescradr)) in handle_all_descr_data()
1774 if (++info->cur_rec_descr == SERIAL_RECV_DESCRIPTORS) in handle_all_descr_data()
1775 info->cur_rec_descr = 0; in handle_all_descr_data()
1790 DFLOW( DEBUG_LOG(info->line, "RX %lu\n", recvl); in handle_all_descr_data()
1791 if (info->port.tty->stopped) { in handle_all_descr_data()
1793 DEBUG_LOG(info->line, "rx 0x%02X\n", buf[0]); in handle_all_descr_data()
1794 DEBUG_LOG(info->line, "rx 0x%02X\n", buf[1]); in handle_all_descr_data()
1795 DEBUG_LOG(info->line, "rx 0x%02X\n", buf[2]); in handle_all_descr_data()
1800 info->icount.rx += recvl; in handle_all_descr_data()
1802 ret += handle_descr_data(info, descr, recvl); in handle_all_descr_data()
1808 static void receive_chars_dma(struct e100_serial *info) in receive_chars_dma() argument
1814 *info->iclrintradr = in receive_chars_dma()
1818 tty = info->port.tty; in receive_chars_dma()
1823 if (info->uses_dma_in) in receive_chars_dma()
1824 e100_enable_serial_data_irq(info); in receive_chars_dma()
1827 if (info->errorcode == ERRCODE_INSERT_BREAK) in receive_chars_dma()
1828 add_char_and_flag(info, '\0', TTY_BREAK); in receive_chars_dma()
1830 handle_all_descr_data(info); in receive_chars_dma()
1833 rstat = info->ioport[REG_STATUS]; in receive_chars_dma()
1835 DFLOW(DEBUG_LOG(info->line, "XOFF detect stat %x\n", rstat)); in receive_chars_dma()
1842 unsigned char data = info->ioport[REG_DATA]; in receive_chars_dma()
1844 PROCSTAT(ser_stat[info->line].errors_cnt++); in receive_chars_dma()
1845 DEBUG_LOG(info->line, "#dERR: s d 0x%04X\n", in receive_chars_dma()
1849 add_char_and_flag(info, data, TTY_PARITY); in receive_chars_dma()
1851 add_char_and_flag(info, data, TTY_OVERRUN); in receive_chars_dma()
1853 add_char_and_flag(info, data, TTY_FRAME); in receive_chars_dma()
1856 START_FLUSH_FAST_TIMER(info, "receive_chars"); in receive_chars_dma()
1859 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart); in receive_chars_dma()
1862 static int start_recv_dma(struct e100_serial *info) in start_recv_dma() argument
1864 struct etrax_dma_descr *descr = info->rec_descr; in start_recv_dma()
1885 info->cur_rec_descr = 0; in start_recv_dma()
1888 *info->ifirstadr = virt_to_phys(&descr[info->cur_rec_descr]); in start_recv_dma()
1889 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, start); in start_recv_dma()
1896 start_receive(struct e100_serial *info) in start_receive() argument
1898 if (info->uses_dma_in) { in start_receive()
1901 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in start_receive()
1902 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) == in start_receive()
1905 start_recv_dma(info); in start_receive()
1925 struct e100_serial *info; in tr_interrupt() local
1935 info = rs_table + i; in tr_interrupt()
1936 if (!info->enabled || !info->uses_dma_out) in tr_interrupt()
1939 if (ireg & info->irq) { in tr_interrupt()
1942 DINTR2(DEBUG_LOG(info->line, "tr_interrupt %i\n", i)); in tr_interrupt()
1946 PROCSTAT(ser_stat[info->line].tx_dma_ints++); in tr_interrupt()
1947 info->last_tx_active_usec = GET_JIFFIES_USEC(); in tr_interrupt()
1948 info->last_tx_active = jiffies; in tr_interrupt()
1949 transmit_chars_dma(info); in tr_interrupt()
1963 struct e100_serial *info; in rec_interrupt() local
1973 info = rs_table + i; in rec_interrupt()
1974 if (!info->enabled || !info->uses_dma_in) in rec_interrupt()
1977 if (ireg & ((info->irq << 2) | (info->irq << 3))) { in rec_interrupt()
1980 receive_chars_dma(info); in rec_interrupt()
1989 static int force_eop_if_needed(struct e100_serial *info) in force_eop_if_needed() argument
1994 unsigned char rstat = info->ioport[REG_STATUS]; in force_eop_if_needed()
2003 DEBUG_LOG(info->line, "timeout err: rstat 0x%03X\n", in force_eop_if_needed()
2004 rstat | (info->line << 8)); in force_eop_if_needed()
2010 TIMERD(DEBUG_LOG(info->line, "timeout: rstat 0x%03X\n", in force_eop_if_needed()
2011 rstat | (info->line << 8))); in force_eop_if_needed()
2013 (void)info->ioport[REG_DATA]; in force_eop_if_needed()
2015 info->forced_eop = 0; in force_eop_if_needed()
2016 START_FLUSH_FAST_TIMER(info, "magic"); in force_eop_if_needed()
2023 if (!info->forced_eop) { in force_eop_if_needed()
2024 info->forced_eop = 1; in force_eop_if_needed()
2025 PROCSTAT(ser_stat[info->line].timeout_flush_cnt++); in force_eop_if_needed()
2026 TIMERD(DEBUG_LOG(info->line, "timeout EOP %i\n", info->line)); in force_eop_if_needed()
2027 FORCE_EOP(info); in force_eop_if_needed()
2033 static void flush_to_flip_buffer(struct e100_serial *info) in flush_to_flip_buffer() argument
2040 while ((buffer = info->first_recv_buffer) != NULL) { in flush_to_flip_buffer()
2043 tty_insert_flip_string(&info->port, buffer->buffer, count); in flush_to_flip_buffer()
2044 info->recv_cnt -= count; in flush_to_flip_buffer()
2047 info->first_recv_buffer = buffer->next; in flush_to_flip_buffer()
2056 if (!info->first_recv_buffer) in flush_to_flip_buffer()
2057 info->last_recv_buffer = NULL; in flush_to_flip_buffer()
2062 tty_flip_buffer_push(&info->port); in flush_to_flip_buffer()
2065 static void check_flush_timeout(struct e100_serial *info) in check_flush_timeout() argument
2068 flush_to_flip_buffer(info); in check_flush_timeout()
2072 if (info->first_recv_buffer) in check_flush_timeout()
2073 START_FLUSH_FAST_TIMER_TIME(info, "flip", 2000); in check_flush_timeout()
2079 force_eop_if_needed(info); in check_flush_timeout()
2085 struct e100_serial *info = (struct e100_serial *)data; in flush_timeout_function() local
2087 fast_timers[info->line].function = NULL; in flush_timeout_function()
2089 TIMERD(DEBUG_LOG(info->line, "flush_timeout %i ", info->line)); in flush_timeout_function()
2090 TIMERD(DEBUG_LOG(info->line, "num expired: %i\n", serial_fast_timer_expired)); in flush_timeout_function()
2091 check_flush_timeout(info); in flush_timeout_function()
2106 struct e100_serial *info; in timed_flush_handler() local
2110 info = rs_table + i; in timed_flush_handler()
2111 if (info->uses_dma_in) in timed_flush_handler()
2112 check_flush_timeout(info); in timed_flush_handler()
2190 static void handle_ser_rx_interrupt_no_dma(struct e100_serial *info) in handle_ser_rx_interrupt_no_dma() argument
2195 data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]); in handle_ser_rx_interrupt_no_dma()
2198 DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); in handle_ser_rx_interrupt_no_dma()
2200 DINTR2(DEBUG_LOG(info->line, "ser_rx %c\n", IO_EXTRACT(R_SERIAL0_READ, data_in, data_read))); in handle_ser_rx_interrupt_no_dma()
2206 info->last_rx_active_usec = GET_JIFFIES_USEC(); in handle_ser_rx_interrupt_no_dma()
2207 info->last_rx_active = jiffies; in handle_ser_rx_interrupt_no_dma()
2208 DINTR1(DEBUG_LOG(info->line, "ser_rx err stat_data %04X\n", data_read)); in handle_ser_rx_interrupt_no_dma()
2223 if (!info->break_detected_cnt) { in handle_ser_rx_interrupt_no_dma()
2224 DEBUG_LOG(info->line, "#BRK start\n", 0); in handle_ser_rx_interrupt_no_dma()
2234 DEBUG_LOG(info->line, "# BL BRK\n", 0); in handle_ser_rx_interrupt_no_dma()
2235 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt_no_dma()
2237 info->break_detected_cnt++; in handle_ser_rx_interrupt_no_dma()
2242 if (info->break_detected_cnt) { in handle_ser_rx_interrupt_no_dma()
2243 DEBUG_LOG(info->line, "EBRK %i\n", info->break_detected_cnt); in handle_ser_rx_interrupt_no_dma()
2244 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt_no_dma()
2249 if (info->errorcode == ERRCODE_INSERT_BREAK) { in handle_ser_rx_interrupt_no_dma()
2250 tty_insert_flip_char(&info->port, 0, flag); in handle_ser_rx_interrupt_no_dma()
2251 info->icount.rx++; in handle_ser_rx_interrupt_no_dma()
2255 info->icount.parity++; in handle_ser_rx_interrupt_no_dma()
2258 info->icount.overrun++; in handle_ser_rx_interrupt_no_dma()
2261 info->icount.frame++; in handle_ser_rx_interrupt_no_dma()
2264 tty_insert_flip_char(&info->port, data, flag); in handle_ser_rx_interrupt_no_dma()
2265 info->errorcode = 0; in handle_ser_rx_interrupt_no_dma()
2267 info->break_detected_cnt = 0; in handle_ser_rx_interrupt_no_dma()
2280 tty_insert_flip_char(&info->port, in handle_ser_rx_interrupt_no_dma()
2284 DEBUG_LOG(info->line, "ser_rx int but no data_avail %08lX\n", data_read); in handle_ser_rx_interrupt_no_dma()
2288 info->icount.rx++; in handle_ser_rx_interrupt_no_dma()
2289 data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]); in handle_ser_rx_interrupt_no_dma()
2291 DEBUG_LOG(info->line, "ser_rx %c in loop\n", IO_EXTRACT(R_SERIAL0_READ, data_in, data_read)); in handle_ser_rx_interrupt_no_dma()
2295 tty_flip_buffer_push(&info->port); in handle_ser_rx_interrupt_no_dma()
2298 static void handle_ser_rx_interrupt(struct e100_serial *info) in handle_ser_rx_interrupt() argument
2306 if (!info->uses_dma_in) { in handle_ser_rx_interrupt()
2307 handle_ser_rx_interrupt_no_dma(info); in handle_ser_rx_interrupt()
2311 rstat = info->ioport[REG_STATUS]; in handle_ser_rx_interrupt()
2313 DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); in handle_ser_rx_interrupt()
2319 info->last_rx_active_usec = GET_JIFFIES_USEC(); in handle_ser_rx_interrupt()
2320 info->last_rx_active = jiffies; in handle_ser_rx_interrupt()
2324 data = info->ioport[REG_DATA]; in handle_ser_rx_interrupt()
2325 DINTR1(DEBUG_LOG(info->line, "ser_rx! %c\n", data)); in handle_ser_rx_interrupt()
2326 DINTR1(DEBUG_LOG(info->line, "ser_rx err stat %02X\n", rstat)); in handle_ser_rx_interrupt()
2332 if (!info->break_detected_cnt) { in handle_ser_rx_interrupt()
2333 DEBUG_LOG(info->line, "#BRK start\n", 0); in handle_ser_rx_interrupt()
2343 DEBUG_LOG(info->line, "# BL BRK\n", 0); in handle_ser_rx_interrupt()
2344 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt()
2346 info->break_detected_cnt++; in handle_ser_rx_interrupt()
2351 if (info->break_detected_cnt) { in handle_ser_rx_interrupt()
2352 DEBUG_LOG(info->line, "EBRK %i\n", info->break_detected_cnt); in handle_ser_rx_interrupt()
2353 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt()
2355 if (info->errorcode == ERRCODE_INSERT_BREAK) { in handle_ser_rx_interrupt()
2356 info->icount.brk++; in handle_ser_rx_interrupt()
2357 add_char_and_flag(info, '\0', TTY_BREAK); in handle_ser_rx_interrupt()
2361 info->icount.parity++; in handle_ser_rx_interrupt()
2362 add_char_and_flag(info, data, TTY_PARITY); in handle_ser_rx_interrupt()
2364 info->icount.overrun++; in handle_ser_rx_interrupt()
2365 add_char_and_flag(info, data, TTY_OVERRUN); in handle_ser_rx_interrupt()
2367 info->icount.frame++; in handle_ser_rx_interrupt()
2368 add_char_and_flag(info, data, TTY_FRAME); in handle_ser_rx_interrupt()
2371 info->errorcode = 0; in handle_ser_rx_interrupt()
2373 info->break_detected_cnt = 0; in handle_ser_rx_interrupt()
2374 DEBUG_LOG(info->line, "#iERR s d %04X\n", in handle_ser_rx_interrupt()
2377 PROCSTAT(ser_stat[info->line].early_errors_cnt++); in handle_ser_rx_interrupt()
2382 if (info->break_detected_cnt) { in handle_ser_rx_interrupt()
2389 (curr_time - info->last_rx_active) * (1000000/HZ) + in handle_ser_rx_interrupt()
2390 curr_time_u - info->last_rx_active_usec; in handle_ser_rx_interrupt()
2391 if (elapsed_usec < 2*info->char_time_usec) { in handle_ser_rx_interrupt()
2392 DEBUG_LOG(info->line, "FBRK %i\n", info->line); in handle_ser_rx_interrupt()
2396 info->errorcode = ERRCODE_SET_BREAK; in handle_ser_rx_interrupt()
2398 DEBUG_LOG(info->line, "Not end of BRK (V)%i\n", info->line); in handle_ser_rx_interrupt()
2400 DEBUG_LOG(info->line, "num brk %i\n", info->break_detected_cnt); in handle_ser_rx_interrupt()
2406 e100_disable_serial_data_irq(info); in handle_ser_rx_interrupt()
2407 DINTR2(DEBUG_LOG(info->line, "ser_rx OK %d\n", info->line)); in handle_ser_rx_interrupt()
2408 info->break_detected_cnt = 0; in handle_ser_rx_interrupt()
2410 PROCSTAT(ser_stat[info->line].ser_ints_ok_cnt++); in handle_ser_rx_interrupt()
2413 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart); in handle_ser_rx_interrupt()
2414 START_FLUSH_FAST_TIMER(info, "ser_int"); in handle_ser_rx_interrupt()
2417 static void handle_ser_tx_interrupt(struct e100_serial *info) in handle_ser_tx_interrupt() argument
2421 if (info->x_char) { in handle_ser_tx_interrupt()
2423 DFLOW(DEBUG_LOG(info->line, "tx_int: xchar 0x%02X\n", info->x_char)); in handle_ser_tx_interrupt()
2425 rstat = info->ioport[REG_STATUS]; in handle_ser_tx_interrupt()
2426 DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); in handle_ser_tx_interrupt()
2428 info->ioport[REG_TR_DATA] = info->x_char; in handle_ser_tx_interrupt()
2429 info->icount.tx++; in handle_ser_tx_interrupt()
2430 info->x_char = 0; in handle_ser_tx_interrupt()
2432 e100_enable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2436 if (info->uses_dma_out) { in handle_ser_tx_interrupt()
2440 DFLOW(DEBUG_LOG(info->line, "tx_int: xchar sent\n", 0)); in handle_ser_tx_interrupt()
2442 rstat = info->ioport[REG_STATUS]; in handle_ser_tx_interrupt()
2443 DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); in handle_ser_tx_interrupt()
2444 e100_disable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2445 if (info->port.tty->stopped) in handle_ser_tx_interrupt()
2446 rs_stop(info->port.tty); in handle_ser_tx_interrupt()
2448 e100_enable_txdma_channel(info); in handle_ser_tx_interrupt()
2453 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, continue); in handle_ser_tx_interrupt()
2458 if (info->xmit.head == info->xmit.tail in handle_ser_tx_interrupt()
2459 || info->port.tty->stopped) { in handle_ser_tx_interrupt()
2460 DFLOW(DEBUG_LOG(info->line, "tx_int: stopped %i\n", in handle_ser_tx_interrupt()
2461 info->port.tty->stopped)); in handle_ser_tx_interrupt()
2462 e100_disable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2463 info->tr_running = 0; in handle_ser_tx_interrupt()
2466 DINTR2(DEBUG_LOG(info->line, "tx_int %c\n", info->xmit.buf[info->xmit.tail])); in handle_ser_tx_interrupt()
2469 info->ioport[REG_TR_DATA] = info->xmit.buf[info->xmit.tail]; in handle_ser_tx_interrupt()
2470 info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1); in handle_ser_tx_interrupt()
2471 info->icount.tx++; in handle_ser_tx_interrupt()
2472 if (info->xmit.head == info->xmit.tail) { in handle_ser_tx_interrupt()
2474 if (info->rs485.flags & SER_RS485_ENABLED) { in handle_ser_tx_interrupt()
2476 start_one_shot_timer(&fast_timers_rs485[info->line], in handle_ser_tx_interrupt()
2478 (unsigned long)info, in handle_ser_tx_interrupt()
2479 info->char_time_usec*2, in handle_ser_tx_interrupt()
2483 info->last_tx_active_usec = GET_JIFFIES_USEC(); in handle_ser_tx_interrupt()
2484 info->last_tx_active = jiffies; in handle_ser_tx_interrupt()
2485 e100_disable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2486 info->tr_running = 0; in handle_ser_tx_interrupt()
2487 DFLOW(DEBUG_LOG(info->line, "tx_int: stop2\n", 0)); in handle_ser_tx_interrupt()
2490 e100_enable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2494 if (CIRC_CNT(info->xmit.head, in handle_ser_tx_interrupt()
2495 info->xmit.tail, in handle_ser_tx_interrupt()
2497 rs_sched_event(info, RS_EVENT_WRITE_WAKEUP); in handle_ser_tx_interrupt()
2509 struct e100_serial *info; in ser_interrupt() local
2520 info = rs_table; in ser_interrupt()
2526 handle_ser_rx_interrupt(info); in ser_interrupt()
2528 info += 1; in ser_interrupt()
2564 info = rs_table; in ser_interrupt()
2569 handle_ser_tx_interrupt(info); in ser_interrupt()
2571 info += 1; in ser_interrupt()
2618 struct e100_serial *info; in do_softint() local
2621 info = container_of(work, struct e100_serial, work); in do_softint()
2623 tty = info->port.tty; in do_softint()
2627 if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) in do_softint()
2632 startup(struct e100_serial * info) in startup() argument
2646 if (info->port.flags & ASYNC_INITIALIZED) { in startup()
2652 if (info->xmit.buf) in startup()
2655 info->xmit.buf = (unsigned char *) xmit_page; in startup()
2658 printk("starting up ttyS%d (xmit_buf 0x%p)...\n", info->line, info->xmit.buf); in startup()
2670 if (info->dma_in_enabled) { in startup()
2671 info->uses_dma_in = 1; in startup()
2672 e100_enable_rxdma_channel(info); in startup()
2674 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in startup()
2677 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) == in startup()
2681 *info->iclrintradr = in startup()
2685 e100_disable_rxdma_channel(info); in startup()
2688 if (info->dma_out_enabled) { in startup()
2689 info->uses_dma_out = 1; in startup()
2690 e100_enable_txdma_channel(info); in startup()
2691 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in startup()
2693 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) == in startup()
2697 *info->oclrintradr = in startup()
2701 e100_disable_txdma_channel(info); in startup()
2704 if (info->port.tty) in startup()
2705 clear_bit(TTY_IO_ERROR, &info->port.tty->flags); in startup()
2707 info->xmit.head = info->xmit.tail = 0; in startup()
2708 info->first_recv_buffer = info->last_recv_buffer = NULL; in startup()
2709 info->recv_cnt = info->max_recv_cnt = 0; in startup()
2712 info->rec_descr[i].buf = 0; in startup()
2719 e100_enable_serial_data_irq(info); in startup()
2721 change_speed(info); in startup()
2725 (void)info->ioport[REG_DATA]; in startup()
2728 if (info->uses_dma_out) in startup()
2729 e100_enable_txdma_irq(info); in startup()
2731 e100_enable_rx_irq(info); in startup()
2733 info->tr_running = 0; /* to be sure we don't lock up the transmitter */ in startup()
2737 start_receive(info); in startup()
2741 info->tr_descr.sw_len = 0; in startup()
2742 info->tr_descr.hw_len = 0; in startup()
2743 info->tr_descr.status = 0; in startup()
2747 e100_rts(info, 1); in startup()
2748 e100_dtr(info, 1); in startup()
2750 info->port.flags |= ASYNC_INITIALIZED; in startup()
2761 shutdown(struct e100_serial * info) in shutdown() argument
2764 struct etrax_dma_descr *descr = info->rec_descr; in shutdown()
2769 DFLOW(DEBUG_LOG(info->line, "shutdown %i\n", info->line)); in shutdown()
2770 e100_disable_rx(info); in shutdown()
2771 info->ioport[REG_TR_CTRL] = (info->tx_ctrl &= ~0x40); in shutdown()
2774 if (info->uses_dma_in) { in shutdown()
2775 e100_disable_rxdma_irq(info); in shutdown()
2776 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in shutdown()
2777 info->uses_dma_in = 0; in shutdown()
2779 e100_disable_serial_data_irq(info); in shutdown()
2782 if (info->uses_dma_out) { in shutdown()
2783 e100_disable_txdma_irq(info); in shutdown()
2784 info->tr_running = 0; in shutdown()
2785 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in shutdown()
2786 info->uses_dma_out = 0; in shutdown()
2788 e100_disable_serial_tx_ready_irq(info); in shutdown()
2789 info->tr_running = 0; in shutdown()
2792 if (!(info->port.flags & ASYNC_INITIALIZED)) in shutdown()
2796 printk("Shutting down serial port %d (irq %d)....\n", info->line, in shutdown()
2797 info->irq); in shutdown()
2802 if (info->xmit.buf) { in shutdown()
2803 free_page((unsigned long)info->xmit.buf); in shutdown()
2804 info->xmit.buf = NULL; in shutdown()
2814 if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) { in shutdown()
2816 e100_dtr(info, 0); in shutdown()
2817 e100_rts(info, 0); /* could check CRTSCTS before doing this */ in shutdown()
2820 if (info->port.tty) in shutdown()
2821 set_bit(TTY_IO_ERROR, &info->port.tty->flags); in shutdown()
2823 info->port.flags &= ~ASYNC_INITIALIZED; in shutdown()
2831 change_speed(struct e100_serial *info) in change_speed() argument
2838 if (!info->port.tty) in change_speed()
2840 if (!info->ioport) in change_speed()
2843 cflag = info->port.tty->termios.c_cflag; in change_speed()
2848 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) { in change_speed()
2850 u32 mask = 0xFF << (info->line*8); /* Each port has 8 bits */ in change_speed()
2856 (unsigned long)info->baud_base, info->custom_divisor)); in change_speed()
2857 if (info->baud_base == SERIAL_PRESCALE_BASE) { in change_speed()
2859 u16 divisor = info->custom_divisor; in change_speed()
2868 info->baud = SERIAL_PRESCALE_BASE/divisor; in change_speed()
2871 else if ((info->baud_base==CONFIG_ETRAX_EXTERN_PB6CLK_FREQ/8 && in change_speed()
2872 info->custom_divisor == 1) || in change_speed()
2873 (info->baud_base==CONFIG_ETRAX_EXTERN_PB6CLK_FREQ && in change_speed()
2874 info->custom_divisor == 8)) { in change_speed()
2880 info->baud = CONFIG_ETRAX_EXTERN_PB6CLK_FREQ/8; in change_speed()
2889 (unsigned long)info->baud_base, info->custom_divisor); in change_speed()
2892 r_alt_ser_baudrate_shadow |= (alt_source << (info->line*8)); in change_speed()
2897 u32 mask = 0xFF << (info->line*8); /* Each port has 8 bits */ in change_speed()
2902 r_alt_ser_baudrate_shadow |= (alt_source << (info->line*8)); in change_speed()
2905 info->baud = cflag_to_baud(cflag); in change_speed()
2906 info->ioport[REG_BAUD] = cflag_to_etrax_baud(cflag); in change_speed()
2912 info->rx_ctrl &= ~(IO_MASK(R_SERIAL0_REC_CTRL, rec_bitnr) | in change_speed()
2917 info->tx_ctrl &= ~(IO_MASK(R_SERIAL0_TR_CTRL, tr_bitnr) | in change_speed()
2925 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_bitnr, tr_7bit); in change_speed()
2926 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_bitnr, rec_7bit); in change_speed()
2931 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, stop_bits, two_bits); in change_speed()
2936 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_par_en, enable); in change_speed()
2937 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_par_en, enable); in change_speed()
2942 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_stick_par, stick); in change_speed()
2943 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_stick_par, stick); in change_speed()
2947 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_par, odd); in change_speed()
2948 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_par, odd); in change_speed()
2953 DFLOW(DEBUG_LOG(info->line, "FLOW auto_cts enabled\n", 0)); in change_speed()
2954 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, auto_cts, active); in change_speed()
2959 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_enable, enable); in change_speed()
2960 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_enable, enable); in change_speed()
2964 info->ioport[REG_TR_CTRL] = info->tx_ctrl; in change_speed()
2965 info->ioport[REG_REC_CTRL] = info->rx_ctrl; in change_speed()
2966 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); in change_speed()
2968 if (info->port.tty->termios.c_iflag & IXON ) { in change_speed()
2969 DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n", in change_speed()
2970 STOP_CHAR(info->port.tty))); in change_speed()
2974 *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; in change_speed()
2977 update_char_time(info); in change_speed()
2986 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_flush_chars() local
2989 if (info->tr_running || in rs_flush_chars()
2990 info->xmit.head == info->xmit.tail || in rs_flush_chars()
2992 !info->xmit.buf) in rs_flush_chars()
3002 start_transmit(info); in rs_flush_chars()
3010 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_raw_write() local
3015 if (!info->xmit.buf) in rs_raw_write()
3019 if (info->line == SERIAL_DEBUG_LINE) in rs_raw_write()
3021 count, info->ioport[REG_STATUS]); in rs_raw_write()
3025 DFLOW(DEBUG_LOG(info->line, "write count %i ", count)); in rs_raw_write()
3026 DFLOW(DEBUG_LOG(info->line, "ldisc %i\n", tty->ldisc.chars_in_buffer(tty))); in rs_raw_write()
3038 c = CIRC_SPACE_TO_END(info->xmit.head, in rs_raw_write()
3039 info->xmit.tail, in rs_raw_write()
3047 memcpy(info->xmit.buf + info->xmit.head, buf, c); in rs_raw_write()
3048 info->xmit.head = (info->xmit.head + c) & in rs_raw_write()
3060 DFLOW(DEBUG_LOG(info->line, "write ret %i\n", ret)); in rs_raw_write()
3062 if (info->xmit.head != info->xmit.tail && in rs_raw_write()
3064 !info->tr_running) { in rs_raw_write()
3065 start_transmit(info); in rs_raw_write()
3076 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_write() local
3078 if (info->rs485.flags & SER_RS485_ENABLED) in rs_write()
3085 fast_timers_rs485[info->line].function = NULL; in rs_write()
3086 del_fast_timer(&fast_timers_rs485[info->line]); in rs_write()
3088 e100_rts(info, (info->rs485.flags & SER_RS485_RTS_ON_SEND)); in rs_write()
3090 e100_disable_rx(info); in rs_write()
3091 e100_enable_rx_irq(info); in rs_write()
3093 if (info->rs485.delay_rts_before_send > 0) in rs_write()
3094 msleep(info->rs485.delay_rts_before_send); in rs_write()
3101 if (info->rs485.flags & SER_RS485_ENABLED) in rs_write()
3115 schedule_usleep(info->char_time_usec * 2); in rs_write()
3119 get_lsr_info(info, &val); in rs_write()
3122 e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND)); in rs_write()
3125 e100_enable_rx(info); in rs_write()
3126 e100_enable_rxdma_irq(info); in rs_write()
3140 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_write_room() local
3142 return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in rs_write_room()
3153 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_chars_in_buffer() local
3155 return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in rs_chars_in_buffer()
3163 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_flush_buffer() local
3167 info->xmit.head = info->xmit.tail = 0; in rs_flush_buffer()
3184 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_send_xchar() local
3187 if (info->uses_dma_out) { in rs_send_xchar()
3189 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, hold); in rs_send_xchar()
3190 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) != in rs_send_xchar()
3192 e100_disable_txdma_channel(info); in rs_send_xchar()
3200 DFLOW(DEBUG_LOG(info->line, "rs_send_xchar 0x%02X\n", ch)); in rs_send_xchar()
3201 info->x_char = ch; in rs_send_xchar()
3202 e100_enable_serial_tx_ready_irq(info); in rs_send_xchar()
3217 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_throttle() local
3224 DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty))); in rs_throttle()
3229 e100_rts(info, 0); in rs_throttle()
3239 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_unthrottle() local
3246 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty))); in rs_unthrottle()
3247 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count)); in rs_unthrottle()
3251 e100_rts(info, 1); in rs_unthrottle()
3255 if (info->x_char) in rs_unthrottle()
3256 info->x_char = 0; in rs_unthrottle()
3270 get_serial_info(struct e100_serial * info, in get_serial_info() argument
3283 tmp.type = info->type; in get_serial_info()
3284 tmp.line = info->line; in get_serial_info()
3285 tmp.port = (int)info->ioport; in get_serial_info()
3286 tmp.irq = info->irq; in get_serial_info()
3287 tmp.flags = info->port.flags; in get_serial_info()
3288 tmp.baud_base = info->baud_base; in get_serial_info()
3289 tmp.close_delay = info->port.close_delay; in get_serial_info()
3290 tmp.closing_wait = info->port.closing_wait; in get_serial_info()
3291 tmp.custom_divisor = info->custom_divisor; in get_serial_info()
3298 set_serial_info(struct e100_serial *info, in set_serial_info() argument
3308 old_info = *info; in set_serial_info()
3311 if ((new_serial.type != info->type) || in set_serial_info()
3312 (new_serial.close_delay != info->port.close_delay) || in set_serial_info()
3314 (info->port.flags & ~ASYNC_USR_MASK))) in set_serial_info()
3316 info->port.flags = ((info->port.flags & ~ASYNC_USR_MASK) | in set_serial_info()
3321 if (info->port.count > 1) in set_serial_info()
3329 info->baud_base = new_serial.baud_base; in set_serial_info()
3330 info->port.flags = ((info->port.flags & ~ASYNC_FLAGS) | in set_serial_info()
3332 info->custom_divisor = new_serial.custom_divisor; in set_serial_info()
3333 info->type = new_serial.type; in set_serial_info()
3334 info->port.close_delay = new_serial.close_delay; in set_serial_info()
3335 info->port.closing_wait = new_serial.closing_wait; in set_serial_info()
3336 info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; in set_serial_info()
3339 if (info->port.flags & ASYNC_INITIALIZED) { in set_serial_info()
3340 change_speed(info); in set_serial_info()
3342 retval = startup(info); in set_serial_info()
3357 get_lsr_info(struct e100_serial * info, unsigned int *value) in get_lsr_info() argument
3363 (curr_time - info->last_tx_active) * 1000000/HZ + in get_lsr_info()
3364 curr_time_usec - info->last_tx_active_usec; in get_lsr_info()
3366 if (info->xmit.head != info->xmit.tail || in get_lsr_info()
3367 elapsed_usec < 2*info->char_time_usec) { in get_lsr_info()
3416 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_break() local
3419 if (!info->ioport) in rs_break()
3426 info->tx_ctrl &= 0x3F; in rs_break()
3429 info->tx_ctrl |= (0x80 | 0x40); in rs_break()
3431 info->ioport[REG_TR_CTRL] = info->tx_ctrl; in rs_break()
3439 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_tiocmset() local
3445 e100_rts(info, 0); in rs_tiocmset()
3447 e100_dtr(info, 0); in rs_tiocmset()
3450 e100_ri_out(info, 0); in rs_tiocmset()
3452 e100_cd_out(info, 0); in rs_tiocmset()
3455 e100_rts(info, 1); in rs_tiocmset()
3457 e100_dtr(info, 1); in rs_tiocmset()
3460 e100_ri_out(info, 1); in rs_tiocmset()
3462 e100_cd_out(info, 1); in rs_tiocmset()
3471 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_tiocmget() local
3478 (!E100_RTS_GET(info) ? TIOCM_RTS : 0) in rs_tiocmget()
3479 | (!E100_DTR_GET(info) ? TIOCM_DTR : 0) in rs_tiocmget()
3480 | (!E100_RI_GET(info) ? TIOCM_RNG : 0) in rs_tiocmget()
3481 | (!E100_DSR_GET(info) ? TIOCM_DSR : 0) in rs_tiocmget()
3482 | (!E100_CD_GET(info) ? TIOCM_CAR : 0) in rs_tiocmget()
3483 | (!E100_CTS_GET(info) ? TIOCM_CTS : 0); in rs_tiocmget()
3489 info->line, result, result); in rs_tiocmget()
3506 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in rs_ioctl() local
3517 return get_serial_info(info, in rs_ioctl()
3520 return set_serial_info(info, in rs_ioctl()
3523 return get_lsr_info(info, (unsigned int *) arg); in rs_ioctl()
3527 info, sizeof(struct e100_serial))) in rs_ioctl()
3612 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_set_termios() local
3614 change_speed(info); in rs_set_termios()
3636 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in rs_close() local
3639 if (!info) in rs_close()
3653 info->line, info->count); in rs_close()
3655 if ((tty->count == 1) && (info->port.count != 1)) { in rs_close()
3665 "info->count is %d\n", info->port.count); in rs_close()
3666 info->port.count = 1; in rs_close()
3668 if (--info->port.count < 0) { in rs_close()
3670 info->line, info->port.count); in rs_close()
3671 info->port.count = 0; in rs_close()
3673 if (info->port.count) { in rs_close()
3677 info->port.flags |= ASYNC_CLOSING; in rs_close()
3683 if (info->port.closing_wait != ASYNC_CLOSING_WAIT_NONE) in rs_close()
3684 tty_wait_until_sent(tty, info->port.closing_wait); in rs_close()
3690 e100_disable_serial_data_irq(info); in rs_close()
3693 e100_disable_rx(info); in rs_close()
3694 e100_disable_rx_irq(info); in rs_close()
3696 if (info->port.flags & ASYNC_INITIALIZED) { in rs_close()
3705 shutdown(info); in rs_close()
3709 info->event = 0; in rs_close()
3710 info->port.tty = NULL; in rs_close()
3711 if (info->port.blocked_open) { in rs_close()
3712 if (info->port.close_delay) in rs_close()
3713 schedule_timeout_interruptible(info->port.close_delay); in rs_close()
3714 wake_up_interruptible(&info->port.open_wait); in rs_close()
3716 info->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); in rs_close()
3717 wake_up_interruptible(&info->port.close_wait); in rs_close()
3723 if (info->rs485.flags & SER_RS485_ENABLED) { in rs_close()
3724 info->rs485.flags &= ~(SER_RS485_ENABLED); in rs_close()
3744 if (info->dma_in_enabled) { in rs_close()
3745 free_irq(info->dma_in_irq_nbr, info); in rs_close()
3746 cris_free_dma(info->dma_in_nbr, info->dma_in_irq_description); in rs_close()
3747 info->uses_dma_in = 0; in rs_close()
3750 info->dma_in_irq_description); in rs_close()
3753 if (info->dma_out_enabled) { in rs_close()
3754 free_irq(info->dma_out_irq_nbr, info); in rs_close()
3755 cris_free_dma(info->dma_out_nbr, info->dma_out_irq_description); in rs_close()
3756 info->uses_dma_out = 0; in rs_close()
3759 info->dma_out_irq_description); in rs_close()
3770 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_wait_until_sent() local
3774 (curr_time - info->last_tx_active) * (1000000/HZ) + in rs_wait_until_sent()
3775 curr_time_usec - info->last_tx_active_usec; in rs_wait_until_sent()
3782 while (info->xmit.head != info->xmit.tail || /* More in send queue */ in rs_wait_until_sent()
3783 (*info->ostatusadr & 0x007f) || /* more in FIFO */ in rs_wait_until_sent()
3784 (elapsed_usec < 2*info->char_time_usec)) { in rs_wait_until_sent()
3793 (curr_time - info->last_tx_active) * (1000000/HZ) + in rs_wait_until_sent()
3794 curr_time_usec - info->last_tx_active_usec; in rs_wait_until_sent()
3805 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in rs_hangup() local
3808 shutdown(info); in rs_hangup()
3809 info->event = 0; in rs_hangup()
3810 info->port.count = 0; in rs_hangup()
3811 info->port.flags &= ~ASYNC_NORMAL_ACTIVE; in rs_hangup()
3812 info->port.tty = NULL; in rs_hangup()
3813 wake_up_interruptible(&info->port.open_wait); in rs_hangup()
3823 struct e100_serial *info) in block_til_ready() argument
3834 if (info->port.flags & ASYNC_CLOSING) { in block_til_ready()
3835 wait_event_interruptible_tty(tty, info->port.close_wait, in block_til_ready()
3836 !(info->port.flags & ASYNC_CLOSING)); in block_til_ready()
3838 if (info->port.flags & ASYNC_HUP_NOTIFY) in block_til_ready()
3853 info->port.flags |= ASYNC_NORMAL_ACTIVE; in block_til_ready()
3869 add_wait_queue(&info->port.open_wait, &wait); in block_til_ready()
3872 info->line, info->port.count); in block_til_ready()
3875 info->port.count--; in block_til_ready()
3877 info->port.blocked_open++; in block_til_ready()
3881 e100_rts(info, 1); in block_til_ready()
3882 e100_dtr(info, 1); in block_til_ready()
3886 !(info->port.flags & ASYNC_INITIALIZED)) { in block_til_ready()
3888 if (info->port.flags & ASYNC_HUP_NOTIFY) in block_til_ready()
3897 if (!(info->port.flags & ASYNC_CLOSING) && do_clocal) in block_til_ready()
3906 info->line, info->port.count); in block_til_ready()
3913 remove_wait_queue(&info->port.open_wait, &wait); in block_til_ready()
3915 info->port.count++; in block_til_ready()
3916 info->port.blocked_open--; in block_til_ready()
3919 info->line, info->port.count); in block_til_ready()
3923 info->port.flags |= ASYNC_NORMAL_ACTIVE; in block_til_ready()
3928 deinit_port(struct e100_serial *info) in deinit_port() argument
3930 if (info->dma_out_enabled) { in deinit_port()
3931 cris_free_dma(info->dma_out_nbr, info->dma_out_irq_description); in deinit_port()
3932 free_irq(info->dma_out_irq_nbr, info); in deinit_port()
3934 if (info->dma_in_enabled) { in deinit_port()
3935 cris_free_dma(info->dma_in_nbr, info->dma_in_irq_description); in deinit_port()
3936 free_irq(info->dma_in_irq_nbr, info); in deinit_port()
3947 struct e100_serial *info; in rs_open() local
3951 info = rs_table + tty->index; in rs_open()
3952 if (!info->enabled) in rs_open()
3957 info->port.count); in rs_open()
3960 info->port.count++; in rs_open()
3961 tty->driver_data = info; in rs_open()
3962 info->port.tty = tty; in rs_open()
3964 info->port.low_latency = !!(info->port.flags & ASYNC_LOW_LATENCY); in rs_open()
3969 if (info->port.flags & ASYNC_CLOSING) { in rs_open()
3970 wait_event_interruptible_tty(tty, info->port.close_wait, in rs_open()
3971 !(info->port.flags & ASYNC_CLOSING)); in rs_open()
3973 return ((info->port.flags & ASYNC_HUP_NOTIFY) ? in rs_open()
3983 if (info->port.count == 1) { in rs_open()
3985 if (info->dma_in_enabled) { in rs_open()
3986 if (request_irq(info->dma_in_irq_nbr, in rs_open()
3988 info->dma_in_irq_flags, in rs_open()
3989 info->dma_in_irq_description, in rs_open()
3990 info)) { in rs_open()
3993 info->dma_in_irq_description); in rs_open()
3996 info->dma_in_enabled = 0; in rs_open()
3997 } else if (cris_request_dma(info->dma_in_nbr, in rs_open()
3998 info->dma_in_irq_description, in rs_open()
4000 info->dma_owner)) { in rs_open()
4001 free_irq(info->dma_in_irq_nbr, info); in rs_open()
4004 info->dma_in_irq_description); in rs_open()
4007 info->dma_in_enabled = 0; in rs_open()
4012 info->dma_in_irq_description); in rs_open()
4015 if (info->dma_out_enabled) { in rs_open()
4016 if (request_irq(info->dma_out_irq_nbr, in rs_open()
4018 info->dma_out_irq_flags, in rs_open()
4019 info->dma_out_irq_description, in rs_open()
4020 info)) { in rs_open()
4023 info->dma_out_irq_description); in rs_open()
4026 info->dma_out_enabled = 0; in rs_open()
4027 } else if (cris_request_dma(info->dma_out_nbr, in rs_open()
4028 info->dma_out_irq_description, in rs_open()
4030 info->dma_owner)) { in rs_open()
4031 free_irq(info->dma_out_irq_nbr, info); in rs_open()
4034 info->dma_out_irq_description); in rs_open()
4037 info->dma_out_enabled = 0; in rs_open()
4042 info->dma_out_irq_description); in rs_open()
4051 retval = startup(info); in rs_open()
4054 deinit_port(info); in rs_open()
4061 retval = block_til_ready(tty, filp, info); in rs_open()
4068 deinit_port(info); in rs_open()
4074 printk("rs_open ttyS%d successful...\n", info->line); in rs_open()
4078 DFLIP( if (info->line == SERIAL_DEBUG_LINE) { in rs_open()
4079 info->icount.rx = 0; in rs_open()
4090 static void seq_line_info(struct seq_file *m, struct e100_serial *info) in seq_line_info() argument
4095 info->line, (unsigned long)info->ioport, info->irq); in seq_line_info()
4097 if (!info->ioport || (info->type == PORT_UNKNOWN)) { in seq_line_info()
4102 seq_printf(m, " baud:%d", info->baud); in seq_line_info()
4104 (unsigned long)info->icount.tx, in seq_line_info()
4105 (unsigned long)info->icount.rx); in seq_line_info()
4106 tmp = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in seq_line_info()
4113 (unsigned long)info->recv_cnt, in seq_line_info()
4114 (unsigned long)info->max_recv_cnt); in seq_line_info()
4117 if (info->port.tty) { in seq_line_info()
4118 if (info->port.tty->stopped) in seq_line_info()
4120 (int)info->port.tty->stopped); in seq_line_info()
4124 unsigned char rstat = info->ioport[REG_STATUS]; in seq_line_info()
4131 if (info->icount.frame) in seq_line_info()
4132 seq_printf(m, " fe:%lu", (unsigned long)info->icount.frame); in seq_line_info()
4134 if (info->icount.parity) in seq_line_info()
4135 seq_printf(m, " pe:%lu", (unsigned long)info->icount.parity); in seq_line_info()
4137 if (info->icount.brk) in seq_line_info()
4138 seq_printf(m, " brk:%lu", (unsigned long)info->icount.brk); in seq_line_info()
4140 if (info->icount.overrun) in seq_line_info()
4141 seq_printf(m, " oe:%lu", (unsigned long)info->icount.overrun); in seq_line_info()
4146 if (!E100_RTS_GET(info)) in seq_line_info()
4148 if (!E100_CTS_GET(info)) in seq_line_info()
4150 if (!E100_DTR_GET(info)) in seq_line_info()
4152 if (!E100_DSR_GET(info)) in seq_line_info()
4154 if (!E100_CD_GET(info)) in seq_line_info()
4156 if (!E100_RI_GET(info)) in seq_line_info()
4241 struct e100_serial *info; in rs_init() local
4296 for (i = 0, info = rs_table; i < NR_PORTS; i++,info++) { in rs_init()
4297 if (info->enabled) { in rs_init()
4298 if (cris_request_io_interface(info->io_if, in rs_init()
4299 info->io_if_description)) { in rs_init()
4303 info->io_if_description, i); in rs_init()
4304 info->enabled = 0; in rs_init()
4307 tty_port_init(&info->port); in rs_init()
4308 info->uses_dma_in = 0; in rs_init()
4309 info->uses_dma_out = 0; in rs_init()
4310 info->line = i; in rs_init()
4311 info->port.tty = NULL; in rs_init()
4312 info->type = PORT_ETRAX; in rs_init()
4313 info->tr_running = 0; in rs_init()
4314 info->forced_eop = 0; in rs_init()
4315 info->baud_base = DEF_BAUD_BASE; in rs_init()
4316 info->custom_divisor = 0; in rs_init()
4317 info->x_char = 0; in rs_init()
4318 info->event = 0; in rs_init()
4319 info->xmit.buf = NULL; in rs_init()
4320 info->xmit.tail = info->xmit.head = 0; in rs_init()
4321 info->first_recv_buffer = info->last_recv_buffer = NULL; in rs_init()
4322 info->recv_cnt = info->max_recv_cnt = 0; in rs_init()
4323 info->last_tx_active_usec = 0; in rs_init()
4324 info->last_tx_active = 0; in rs_init()
4328 info->rs485.flags &= ~(SER_RS485_RTS_ON_SEND); in rs_init()
4329 info->rs485.flags |= SER_RS485_RTS_AFTER_SEND; in rs_init()
4330 info->rs485.delay_rts_before_send = 0; in rs_init()
4331 info->rs485.flags &= ~(SER_RS485_ENABLED); in rs_init()
4333 INIT_WORK(&info->work, do_softint); in rs_init()
4335 if (info->enabled) { in rs_init()
4337 serial_driver->name, info->line, info->ioport); in rs_init()
4339 tty_port_link_device(&info->port, driver, i); in rs_init()