Lines Matching refs:info
155 static void change_speed(struct e100_serial *info);
164 static int get_lsr_info(struct e100_serial *info, unsigned int *value);
197 #define FORCE_EOP(info) *R_SET_EOP = 1U << info->iseteop; argument
902 #define E100_RTS_GET(info) ((info)->rx_ctrl & E100_RTS_MASK) argument
904 #define E100_CTS_GET(info) ((info)->ioport[REG_STATUS] & E100_CTS_MASK) argument
908 #define E100_DTR_GET(info) ((*e100_modem_pins[(info)->line].dtr_shadow) & e100_modem_pins[(info)->l… argument
911 #define E100_RI_GET(info) ((*e100_modem_pins[(info)->line].ri_port) & e100_modem_pins[(info)->line]… argument
912 #define E100_CD_GET(info) ((*e100_modem_pins[(info)->line].cd_port) & e100_modem_pins[(info)->line]… argument
915 #define E100_DSR_GET(info) ((*e100_modem_pins[(info)->line].dsr_port) & e100_modem_pins[(info)->lin… argument
918 static void update_char_time(struct e100_serial * info) in update_char_time() argument
920 tcflag_t cflags = info->port.tty->termios.c_cflag; in update_char_time()
937 info->char_time_usec = ((bits * 1000000) / info->baud) + 1; in update_char_time()
938 info->flush_time_usec = 4*info->char_time_usec; in update_char_time()
939 if (info->flush_time_usec < MIN_FLUSH_TIME_USEC) in update_char_time()
940 info->flush_time_usec = MIN_FLUSH_TIME_USEC; in update_char_time()
1003 e100_dtr(struct e100_serial *info, int set) in e100_dtr() argument
1005 unsigned char mask = e100_modem_pins[info->line].dtr_mask; in e100_dtr()
1008 printk("ser%i dtr %i mask: 0x%02X\n", info->line, set, mask); in e100_dtr()
1010 info->line, *e100_modem_pins[info->line].dtr_shadow, in e100_dtr()
1011 E100_DTR_GET(info)); in e100_dtr()
1018 *e100_modem_pins[info->line].dtr_shadow &= ~mask; in e100_dtr()
1019 *e100_modem_pins[info->line].dtr_shadow |= (set ? 0 : mask); in e100_dtr()
1020 *e100_modem_pins[info->line].dtr_port = *e100_modem_pins[info->line].dtr_shadow; in e100_dtr()
1026 info->line, *e100_modem_pins[info->line].dtr_shadow, in e100_dtr()
1027 E100_DTR_GET(info)); in e100_dtr()
1035 e100_rts(struct e100_serial *info, int set) in e100_rts() argument
1039 info->rx_ctrl &= ~E100_RTS_MASK; in e100_rts()
1040 info->rx_ctrl |= (set ? 0 : E100_RTS_MASK); /* RTS is active low */ in e100_rts()
1041 info->ioport[REG_REC_CTRL] = info->rx_ctrl; in e100_rts()
1044 printk("ser%i rts %i\n", info->line, set); in e100_rts()
1051 e100_ri_out(struct e100_serial *info, int set) in e100_ri_out() argument
1055 unsigned char mask = e100_modem_pins[info->line].ri_mask; in e100_ri_out()
1059 *e100_modem_pins[info->line].ri_shadow &= ~mask; in e100_ri_out()
1060 *e100_modem_pins[info->line].ri_shadow |= (set ? 0 : mask); in e100_ri_out()
1061 *e100_modem_pins[info->line].ri_port = *e100_modem_pins[info->line].ri_shadow; in e100_ri_out()
1066 e100_cd_out(struct e100_serial *info, int set) in e100_cd_out() argument
1070 unsigned char mask = e100_modem_pins[info->line].cd_mask; in e100_cd_out()
1074 *e100_modem_pins[info->line].cd_shadow &= ~mask; in e100_cd_out()
1075 *e100_modem_pins[info->line].cd_shadow |= (set ? 0 : mask); in e100_cd_out()
1076 *e100_modem_pins[info->line].cd_port = *e100_modem_pins[info->line].cd_shadow; in e100_cd_out()
1082 e100_disable_rx(struct e100_serial *info) in e100_disable_rx() argument
1085 info->ioport[REG_REC_CTRL] = in e100_disable_rx()
1086 (info->rx_ctrl &= ~IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); in e100_disable_rx()
1090 e100_enable_rx(struct e100_serial *info) in e100_enable_rx() argument
1093 info->ioport[REG_REC_CTRL] = in e100_enable_rx()
1094 (info->rx_ctrl |= IO_MASK(R_SERIAL0_REC_CTRL, rec_enable)); in e100_enable_rx()
1100 e100_disable_rxdma_irq(struct e100_serial *info) in e100_disable_rxdma_irq() argument
1103 printk("rxdma_irq(%d): 0\n",info->line); in e100_disable_rxdma_irq()
1105 DINTR1(DEBUG_LOG(info->line,"IRQ disable_rxdma_irq %i\n", info->line)); in e100_disable_rxdma_irq()
1106 *R_IRQ_MASK2_CLR = (info->irq << 2) | (info->irq << 3); in e100_disable_rxdma_irq()
1110 e100_enable_rxdma_irq(struct e100_serial *info) in e100_enable_rxdma_irq() argument
1113 printk("rxdma_irq(%d): 1\n",info->line); in e100_enable_rxdma_irq()
1115 DINTR1(DEBUG_LOG(info->line,"IRQ enable_rxdma_irq %i\n", info->line)); in e100_enable_rxdma_irq()
1116 *R_IRQ_MASK2_SET = (info->irq << 2) | (info->irq << 3); in e100_enable_rxdma_irq()
1121 static void e100_disable_txdma_irq(struct e100_serial *info) in e100_disable_txdma_irq() argument
1124 printk("txdma_irq(%d): 0\n",info->line); in e100_disable_txdma_irq()
1126 DINTR1(DEBUG_LOG(info->line,"IRQ disable_txdma_irq %i\n", info->line)); in e100_disable_txdma_irq()
1127 *R_IRQ_MASK2_CLR = info->irq; in e100_disable_txdma_irq()
1130 static void e100_enable_txdma_irq(struct e100_serial *info) in e100_enable_txdma_irq() argument
1133 printk("txdma_irq(%d): 1\n",info->line); in e100_enable_txdma_irq()
1135 DINTR1(DEBUG_LOG(info->line,"IRQ enable_txdma_irq %i\n", info->line)); in e100_enable_txdma_irq()
1136 *R_IRQ_MASK2_SET = info->irq; in e100_enable_txdma_irq()
1139 static void e100_disable_txdma_channel(struct e100_serial *info) in e100_disable_txdma_channel() argument
1147 DFLOW(DEBUG_LOG(info->line, "disable_txdma_channel %i\n", info->line)); in e100_disable_txdma_channel()
1148 if (info->line == 0) { in e100_disable_txdma_channel()
1154 } else if (info->line == 1) { in e100_disable_txdma_channel()
1160 } else if (info->line == 2) { in e100_disable_txdma_channel()
1166 } else if (info->line == 3) { in e100_disable_txdma_channel()
1178 static void e100_enable_txdma_channel(struct e100_serial *info) in e100_enable_txdma_channel() argument
1183 DFLOW(DEBUG_LOG(info->line, "enable_txdma_channel %i\n", info->line)); in e100_enable_txdma_channel()
1185 if (info->line == 0) { in e100_enable_txdma_channel()
1188 } else if (info->line == 1) { in e100_enable_txdma_channel()
1191 } else if (info->line == 2) { in e100_enable_txdma_channel()
1194 } else if (info->line == 3) { in e100_enable_txdma_channel()
1202 static void e100_disable_rxdma_channel(struct e100_serial *info) in e100_disable_rxdma_channel() argument
1210 if (info->line == 0) { in e100_disable_rxdma_channel()
1216 } else if (info->line == 1) { in e100_disable_rxdma_channel()
1222 } else if (info->line == 2) { in e100_disable_rxdma_channel()
1228 } else if (info->line == 3) { in e100_disable_rxdma_channel()
1240 static void e100_enable_rxdma_channel(struct e100_serial *info) in e100_enable_rxdma_channel() argument
1246 if (info->line == 0) { in e100_enable_rxdma_channel()
1249 } else if (info->line == 1) { in e100_enable_rxdma_channel()
1252 } else if (info->line == 2) { in e100_enable_rxdma_channel()
1255 } else if (info->line == 3) { in e100_enable_rxdma_channel()
1268 e100_disable_serial_data_irq(struct e100_serial *info) in e100_disable_serial_data_irq() argument
1271 printk("ser_irq(%d): 0\n",info->line); in e100_disable_serial_data_irq()
1273 DINTR1(DEBUG_LOG(info->line,"IRQ disable data_irq %i\n", info->line)); in e100_disable_serial_data_irq()
1274 *R_IRQ_MASK1_CLR = (1U << (8+2*info->line)); in e100_disable_serial_data_irq()
1278 e100_enable_serial_data_irq(struct e100_serial *info) in e100_enable_serial_data_irq() argument
1281 printk("ser_irq(%d): 1\n",info->line); in e100_enable_serial_data_irq()
1283 (8+2*info->line), in e100_enable_serial_data_irq()
1284 (1U << (8+2*info->line))); in e100_enable_serial_data_irq()
1286 DINTR1(DEBUG_LOG(info->line,"IRQ enable data_irq %i\n", info->line)); in e100_enable_serial_data_irq()
1287 *R_IRQ_MASK1_SET = (1U << (8+2*info->line)); in e100_enable_serial_data_irq()
1292 e100_disable_serial_tx_ready_irq(struct e100_serial *info) in e100_disable_serial_tx_ready_irq() argument
1295 printk("ser_tx_irq(%d): 0\n",info->line); in e100_disable_serial_tx_ready_irq()
1297 DINTR1(DEBUG_LOG(info->line,"IRQ disable ready_irq %i\n", info->line)); in e100_disable_serial_tx_ready_irq()
1298 *R_IRQ_MASK1_CLR = (1U << (8+1+2*info->line)); in e100_disable_serial_tx_ready_irq()
1302 e100_enable_serial_tx_ready_irq(struct e100_serial *info) in e100_enable_serial_tx_ready_irq() argument
1305 printk("ser_tx_irq(%d): 1\n",info->line); in e100_enable_serial_tx_ready_irq()
1307 (8+1+2*info->line), in e100_enable_serial_tx_ready_irq()
1308 (1U << (8+1+2*info->line))); in e100_enable_serial_tx_ready_irq()
1310 DINTR2(DEBUG_LOG(info->line,"IRQ enable ready_irq %i\n", info->line)); in e100_enable_serial_tx_ready_irq()
1311 *R_IRQ_MASK1_SET = (1U << (8+1+2*info->line)); in e100_enable_serial_tx_ready_irq()
1314 static inline void e100_enable_rx_irq(struct e100_serial *info) in e100_enable_rx_irq() argument
1316 if (info->uses_dma_in) in e100_enable_rx_irq()
1317 e100_enable_rxdma_irq(info); in e100_enable_rx_irq()
1319 e100_enable_serial_data_irq(info); in e100_enable_rx_irq()
1321 static inline void e100_disable_rx_irq(struct e100_serial *info) in e100_disable_rx_irq() argument
1323 if (info->uses_dma_in) in e100_disable_rx_irq()
1324 e100_disable_rxdma_irq(info); in e100_disable_rx_irq()
1326 e100_disable_serial_data_irq(info); in e100_disable_rx_irq()
1334 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in e100_enable_rs485() local
1340 info->rs485 = *r; in e100_enable_rs485()
1343 if (info->rs485.delay_rts_before_send >= 1000) in e100_enable_rs485()
1344 info->rs485.delay_rts_before_send = 1000; in e100_enable_rs485()
1359 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in e100_write_rs485() local
1360 int old_value = (info->rs485.flags) & SER_RS485_ENABLED; in e100_write_rs485()
1367 info->rs485.flags |= SER_RS485_ENABLED; in e100_write_rs485()
1371 info->rs485.flags &= ~(SER_RS485_ENABLED); in e100_write_rs485()
1379 struct e100_serial *info = (struct e100_serial *)data; in rs485_toggle_rts_timer_function() local
1381 fast_timers_rs485[info->line].function = NULL; in rs485_toggle_rts_timer_function()
1382 e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND)); in rs485_toggle_rts_timer_function()
1384 e100_enable_rx(info); in rs485_toggle_rts_timer_function()
1385 e100_enable_rx_irq(info); in rs485_toggle_rts_timer_function()
1403 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_stop() local
1404 if (info) { in rs_stop()
1409 DFLOW(DEBUG_LOG(info->line, "XOFF rs_stop xmit %i\n", in rs_stop()
1410 CIRC_CNT(info->xmit.head, in rs_stop()
1411 info->xmit.tail,SERIAL_XMIT_SIZE))); in rs_stop()
1414 STOP_CHAR(info->port.tty)); in rs_stop()
1420 *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; in rs_stop()
1428 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_start() local
1429 if (info) { in rs_start()
1434 DFLOW(DEBUG_LOG(info->line, "XOFF rs_start xmit %i\n", in rs_start()
1435 CIRC_CNT(info->xmit.head, in rs_start()
1436 info->xmit.tail,SERIAL_XMIT_SIZE))); in rs_start()
1443 *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; in rs_start()
1444 if (!info->uses_dma_out && in rs_start()
1445 info->xmit.head != info->xmit.tail && info->xmit.buf) in rs_start()
1446 e100_enable_serial_tx_ready_irq(info); in rs_start()
1477 static void rs_sched_event(struct e100_serial *info, int event) in rs_sched_event() argument
1479 if (info->event & (1 << event)) in rs_sched_event()
1481 info->event |= 1 << event; in rs_sched_event()
1482 schedule_work(&info->work); in rs_sched_event()
1497 transmit_chars_dma(struct e100_serial *info) in transmit_chars_dma() argument
1503 *info->oclrintradr = in transmit_chars_dma()
1508 if (info->line == SERIAL_DEBUG_LINE) in transmit_chars_dma()
1511 if (!info->tr_running) { in transmit_chars_dma()
1517 descr = &info->tr_descr; in transmit_chars_dma()
1529 DFLOW(DEBUG_LOG(info->line, "TX %i done\n", sentl)); in transmit_chars_dma()
1532 info->icount.tx += sentl; in transmit_chars_dma()
1535 info->xmit.tail = (info->xmit.tail + sentl) & (SERIAL_XMIT_SIZE - 1); in transmit_chars_dma()
1539 if (CIRC_CNT(info->xmit.head, in transmit_chars_dma()
1540 info->xmit.tail, in transmit_chars_dma()
1542 rs_sched_event(info, RS_EVENT_WRITE_WAKEUP); in transmit_chars_dma()
1546 c = CIRC_CNT_TO_END(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in transmit_chars_dma()
1557 info->tr_running = 0; in transmit_chars_dma()
1560 if (info->rs485.flags & SER_RS485_ENABLED) { in transmit_chars_dma()
1562 start_one_shot_timer(&fast_timers_rs485[info->line], in transmit_chars_dma()
1564 (unsigned long)info, in transmit_chars_dma()
1565 info->char_time_usec*2, in transmit_chars_dma()
1574 DFLOW(DEBUG_LOG(info->line, "TX %i\n", c)); in transmit_chars_dma()
1577 descr->buf = virt_to_phys(info->xmit.buf + info->xmit.tail); in transmit_chars_dma()
1580 *info->ofirstadr = virt_to_phys(descr); /* write to R_DMAx_FIRST */ in transmit_chars_dma()
1581 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, start); in transmit_chars_dma()
1587 start_transmit(struct e100_serial *info) in start_transmit() argument
1590 if (info->line == SERIAL_DEBUG_LINE) in start_transmit()
1594 info->tr_descr.sw_len = 0; in start_transmit()
1595 info->tr_descr.hw_len = 0; in start_transmit()
1596 info->tr_descr.status = 0; in start_transmit()
1597 info->tr_running = 1; in start_transmit()
1598 if (info->uses_dma_out) in start_transmit()
1599 transmit_chars_dma(info); in start_transmit()
1601 e100_enable_serial_tx_ready_irq(info); in start_transmit()
1608 #define START_FLUSH_FAST_TIMER_TIME(info, string, usec) {\ argument
1611 if (fast_timers[info->line].function == NULL) { \
1613 TIMERD(DEBUG_LOG(info->line, "start_timer %i ", info->line)); \
1614 TIMERD(DEBUG_LOG(info->line, "num started: %i\n", serial_fast_timer_started)); \
1615 start_one_shot_timer(&fast_timers[info->line], \
1617 (unsigned long)info, \
1622 TIMERD(DEBUG_LOG(info->line, "timer %i already running\n", info->line)); \
1626 #define START_FLUSH_FAST_TIMER(info, string) START_FLUSH_FAST_TIMER_TIME(info, string, info->flush_… argument
1629 #define START_FLUSH_FAST_TIMER_TIME(info, string, usec) argument
1630 #define START_FLUSH_FAST_TIMER(info, string) argument
1650 append_recv_buffer(struct e100_serial *info, struct etrax_recv_buffer *buffer) in append_recv_buffer() argument
1656 if (!info->first_recv_buffer) in append_recv_buffer()
1657 info->first_recv_buffer = buffer; in append_recv_buffer()
1659 info->last_recv_buffer->next = buffer; in append_recv_buffer()
1661 info->last_recv_buffer = buffer; in append_recv_buffer()
1663 info->recv_cnt += buffer->length; in append_recv_buffer()
1664 if (info->recv_cnt > info->max_recv_cnt) in append_recv_buffer()
1665 info->max_recv_cnt = info->recv_cnt; in append_recv_buffer()
1671 add_char_and_flag(struct e100_serial *info, unsigned char data, unsigned char flag) in add_char_and_flag() argument
1674 if (info->uses_dma_in) { in add_char_and_flag()
1683 append_recv_buffer(info, buffer); in add_char_and_flag()
1685 info->icount.rx++; in add_char_and_flag()
1687 tty_insert_flip_char(&info->port, data, flag); in add_char_and_flag()
1688 info->icount.rx++; in add_char_and_flag()
1694 static unsigned int handle_descr_data(struct e100_serial *info, in handle_descr_data() argument
1700 if (info->recv_cnt + recvl > 65536) { in handle_descr_data()
1708 if (info->errorcode == ERRCODE_SET_BREAK) in handle_descr_data()
1710 info->errorcode = 0; in handle_descr_data()
1712 append_recv_buffer(info, buffer); in handle_descr_data()
1723 static unsigned int handle_all_descr_data(struct e100_serial *info) in handle_all_descr_data() argument
1731 descr = &info->rec_descr[info->cur_rec_descr]; in handle_all_descr_data()
1733 if (descr == phys_to_virt(*info->idescradr)) in handle_all_descr_data()
1736 if (++info->cur_rec_descr == SERIAL_RECV_DESCRIPTORS) in handle_all_descr_data()
1737 info->cur_rec_descr = 0; in handle_all_descr_data()
1752 DFLOW( DEBUG_LOG(info->line, "RX %lu\n", recvl); in handle_all_descr_data()
1753 if (info->port.tty->stopped) { in handle_all_descr_data()
1755 DEBUG_LOG(info->line, "rx 0x%02X\n", buf[0]); in handle_all_descr_data()
1756 DEBUG_LOG(info->line, "rx 0x%02X\n", buf[1]); in handle_all_descr_data()
1757 DEBUG_LOG(info->line, "rx 0x%02X\n", buf[2]); in handle_all_descr_data()
1762 info->icount.rx += recvl; in handle_all_descr_data()
1764 ret += handle_descr_data(info, descr, recvl); in handle_all_descr_data()
1770 static void receive_chars_dma(struct e100_serial *info) in receive_chars_dma() argument
1776 *info->iclrintradr = in receive_chars_dma()
1780 tty = info->port.tty; in receive_chars_dma()
1785 if (info->uses_dma_in) in receive_chars_dma()
1786 e100_enable_serial_data_irq(info); in receive_chars_dma()
1789 if (info->errorcode == ERRCODE_INSERT_BREAK) in receive_chars_dma()
1790 add_char_and_flag(info, '\0', TTY_BREAK); in receive_chars_dma()
1792 handle_all_descr_data(info); in receive_chars_dma()
1795 rstat = info->ioport[REG_STATUS]; in receive_chars_dma()
1797 DFLOW(DEBUG_LOG(info->line, "XOFF detect stat %x\n", rstat)); in receive_chars_dma()
1804 unsigned char data = info->ioport[REG_DATA]; in receive_chars_dma()
1806 DEBUG_LOG(info->line, "#dERR: s d 0x%04X\n", in receive_chars_dma()
1810 add_char_and_flag(info, data, TTY_PARITY); in receive_chars_dma()
1812 add_char_and_flag(info, data, TTY_OVERRUN); in receive_chars_dma()
1814 add_char_and_flag(info, data, TTY_FRAME); in receive_chars_dma()
1817 START_FLUSH_FAST_TIMER(info, "receive_chars"); in receive_chars_dma()
1820 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart); in receive_chars_dma()
1823 static int start_recv_dma(struct e100_serial *info) in start_recv_dma() argument
1825 struct etrax_dma_descr *descr = info->rec_descr; in start_recv_dma()
1847 info->cur_rec_descr = 0; in start_recv_dma()
1850 *info->ifirstadr = virt_to_phys(&descr[info->cur_rec_descr]); in start_recv_dma()
1851 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, start); in start_recv_dma()
1858 start_receive(struct e100_serial *info) in start_receive() argument
1860 if (info->uses_dma_in) { in start_receive()
1863 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in start_receive()
1864 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) == in start_receive()
1867 start_recv_dma(info); in start_receive()
1887 struct e100_serial *info; in tr_interrupt() local
1897 info = rs_table + i; in tr_interrupt()
1898 if (!info->enabled || !info->uses_dma_out) in tr_interrupt()
1901 if (ireg & info->irq) { in tr_interrupt()
1904 DINTR2(DEBUG_LOG(info->line, "tr_interrupt %i\n", i)); in tr_interrupt()
1908 info->last_tx_active_usec = GET_JIFFIES_USEC(); in tr_interrupt()
1909 info->last_tx_active = jiffies; in tr_interrupt()
1910 transmit_chars_dma(info); in tr_interrupt()
1924 struct e100_serial *info; in rec_interrupt() local
1934 info = rs_table + i; in rec_interrupt()
1935 if (!info->enabled || !info->uses_dma_in) in rec_interrupt()
1938 if (ireg & ((info->irq << 2) | (info->irq << 3))) { in rec_interrupt()
1941 receive_chars_dma(info); in rec_interrupt()
1950 static int force_eop_if_needed(struct e100_serial *info) in force_eop_if_needed() argument
1955 unsigned char rstat = info->ioport[REG_STATUS]; in force_eop_if_needed()
1964 DEBUG_LOG(info->line, "timeout err: rstat 0x%03X\n", in force_eop_if_needed()
1965 rstat | (info->line << 8)); in force_eop_if_needed()
1971 TIMERD(DEBUG_LOG(info->line, "timeout: rstat 0x%03X\n", in force_eop_if_needed()
1972 rstat | (info->line << 8))); in force_eop_if_needed()
1974 (void)info->ioport[REG_DATA]; in force_eop_if_needed()
1976 info->forced_eop = 0; in force_eop_if_needed()
1977 START_FLUSH_FAST_TIMER(info, "magic"); in force_eop_if_needed()
1984 if (!info->forced_eop) { in force_eop_if_needed()
1985 info->forced_eop = 1; in force_eop_if_needed()
1986 TIMERD(DEBUG_LOG(info->line, "timeout EOP %i\n", info->line)); in force_eop_if_needed()
1987 FORCE_EOP(info); in force_eop_if_needed()
1993 static void flush_to_flip_buffer(struct e100_serial *info) in flush_to_flip_buffer() argument
2000 while ((buffer = info->first_recv_buffer) != NULL) { in flush_to_flip_buffer()
2003 tty_insert_flip_string(&info->port, buffer->buffer, count); in flush_to_flip_buffer()
2004 info->recv_cnt -= count; in flush_to_flip_buffer()
2007 info->first_recv_buffer = buffer->next; in flush_to_flip_buffer()
2016 if (!info->first_recv_buffer) in flush_to_flip_buffer()
2017 info->last_recv_buffer = NULL; in flush_to_flip_buffer()
2022 tty_flip_buffer_push(&info->port); in flush_to_flip_buffer()
2025 static void check_flush_timeout(struct e100_serial *info) in check_flush_timeout() argument
2028 flush_to_flip_buffer(info); in check_flush_timeout()
2032 if (info->first_recv_buffer) in check_flush_timeout()
2033 START_FLUSH_FAST_TIMER_TIME(info, "flip", 2000); in check_flush_timeout()
2039 force_eop_if_needed(info); in check_flush_timeout()
2045 struct e100_serial *info = (struct e100_serial *)data; in flush_timeout_function() local
2047 fast_timers[info->line].function = NULL; in flush_timeout_function()
2049 TIMERD(DEBUG_LOG(info->line, "flush_timeout %i ", info->line)); in flush_timeout_function()
2050 TIMERD(DEBUG_LOG(info->line, "num expired: %i\n", serial_fast_timer_expired)); in flush_timeout_function()
2051 check_flush_timeout(info); in flush_timeout_function()
2066 struct e100_serial *info; in timed_flush_handler() local
2070 info = rs_table + i; in timed_flush_handler()
2071 if (info->uses_dma_in) in timed_flush_handler()
2072 check_flush_timeout(info); in timed_flush_handler()
2150 static void handle_ser_rx_interrupt_no_dma(struct e100_serial *info) in handle_ser_rx_interrupt_no_dma() argument
2155 data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]); in handle_ser_rx_interrupt_no_dma()
2158 DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); in handle_ser_rx_interrupt_no_dma()
2160 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()
2166 info->last_rx_active_usec = GET_JIFFIES_USEC(); in handle_ser_rx_interrupt_no_dma()
2167 info->last_rx_active = jiffies; in handle_ser_rx_interrupt_no_dma()
2168 DINTR1(DEBUG_LOG(info->line, "ser_rx err stat_data %04X\n", data_read)); in handle_ser_rx_interrupt_no_dma()
2183 if (!info->break_detected_cnt) { in handle_ser_rx_interrupt_no_dma()
2184 DEBUG_LOG(info->line, "#BRK start\n", 0); in handle_ser_rx_interrupt_no_dma()
2194 DEBUG_LOG(info->line, "# BL BRK\n", 0); in handle_ser_rx_interrupt_no_dma()
2195 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt_no_dma()
2197 info->break_detected_cnt++; in handle_ser_rx_interrupt_no_dma()
2202 if (info->break_detected_cnt) { in handle_ser_rx_interrupt_no_dma()
2203 DEBUG_LOG(info->line, "EBRK %i\n", info->break_detected_cnt); in handle_ser_rx_interrupt_no_dma()
2204 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt_no_dma()
2209 if (info->errorcode == ERRCODE_INSERT_BREAK) { in handle_ser_rx_interrupt_no_dma()
2210 tty_insert_flip_char(&info->port, 0, flag); in handle_ser_rx_interrupt_no_dma()
2211 info->icount.rx++; in handle_ser_rx_interrupt_no_dma()
2215 info->icount.parity++; in handle_ser_rx_interrupt_no_dma()
2218 info->icount.overrun++; in handle_ser_rx_interrupt_no_dma()
2221 info->icount.frame++; in handle_ser_rx_interrupt_no_dma()
2224 tty_insert_flip_char(&info->port, data, flag); in handle_ser_rx_interrupt_no_dma()
2225 info->errorcode = 0; in handle_ser_rx_interrupt_no_dma()
2227 info->break_detected_cnt = 0; in handle_ser_rx_interrupt_no_dma()
2240 tty_insert_flip_char(&info->port, in handle_ser_rx_interrupt_no_dma()
2244 DEBUG_LOG(info->line, "ser_rx int but no data_avail %08lX\n", data_read); in handle_ser_rx_interrupt_no_dma()
2248 info->icount.rx++; in handle_ser_rx_interrupt_no_dma()
2249 data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]); in handle_ser_rx_interrupt_no_dma()
2251 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()
2255 tty_flip_buffer_push(&info->port); in handle_ser_rx_interrupt_no_dma()
2258 static void handle_ser_rx_interrupt(struct e100_serial *info) in handle_ser_rx_interrupt() argument
2266 if (!info->uses_dma_in) { in handle_ser_rx_interrupt()
2267 handle_ser_rx_interrupt_no_dma(info); in handle_ser_rx_interrupt()
2271 rstat = info->ioport[REG_STATUS]; in handle_ser_rx_interrupt()
2273 DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0)); in handle_ser_rx_interrupt()
2279 info->last_rx_active_usec = GET_JIFFIES_USEC(); in handle_ser_rx_interrupt()
2280 info->last_rx_active = jiffies; in handle_ser_rx_interrupt()
2284 data = info->ioport[REG_DATA]; in handle_ser_rx_interrupt()
2285 DINTR1(DEBUG_LOG(info->line, "ser_rx! %c\n", data)); in handle_ser_rx_interrupt()
2286 DINTR1(DEBUG_LOG(info->line, "ser_rx err stat %02X\n", rstat)); in handle_ser_rx_interrupt()
2292 if (!info->break_detected_cnt) { in handle_ser_rx_interrupt()
2293 DEBUG_LOG(info->line, "#BRK start\n", 0); in handle_ser_rx_interrupt()
2303 DEBUG_LOG(info->line, "# BL BRK\n", 0); in handle_ser_rx_interrupt()
2304 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt()
2306 info->break_detected_cnt++; in handle_ser_rx_interrupt()
2311 if (info->break_detected_cnt) { in handle_ser_rx_interrupt()
2312 DEBUG_LOG(info->line, "EBRK %i\n", info->break_detected_cnt); in handle_ser_rx_interrupt()
2313 info->errorcode = ERRCODE_INSERT_BREAK; in handle_ser_rx_interrupt()
2315 if (info->errorcode == ERRCODE_INSERT_BREAK) { in handle_ser_rx_interrupt()
2316 info->icount.brk++; in handle_ser_rx_interrupt()
2317 add_char_and_flag(info, '\0', TTY_BREAK); in handle_ser_rx_interrupt()
2321 info->icount.parity++; in handle_ser_rx_interrupt()
2322 add_char_and_flag(info, data, TTY_PARITY); in handle_ser_rx_interrupt()
2324 info->icount.overrun++; in handle_ser_rx_interrupt()
2325 add_char_and_flag(info, data, TTY_OVERRUN); in handle_ser_rx_interrupt()
2327 info->icount.frame++; in handle_ser_rx_interrupt()
2328 add_char_and_flag(info, data, TTY_FRAME); in handle_ser_rx_interrupt()
2331 info->errorcode = 0; in handle_ser_rx_interrupt()
2333 info->break_detected_cnt = 0; in handle_ser_rx_interrupt()
2334 DEBUG_LOG(info->line, "#iERR s d %04X\n", in handle_ser_rx_interrupt()
2341 if (info->break_detected_cnt) { in handle_ser_rx_interrupt()
2348 (curr_time - info->last_rx_active) * (1000000/HZ) + in handle_ser_rx_interrupt()
2349 curr_time_u - info->last_rx_active_usec; in handle_ser_rx_interrupt()
2350 if (elapsed_usec < 2*info->char_time_usec) { in handle_ser_rx_interrupt()
2351 DEBUG_LOG(info->line, "FBRK %i\n", info->line); in handle_ser_rx_interrupt()
2355 info->errorcode = ERRCODE_SET_BREAK; in handle_ser_rx_interrupt()
2357 DEBUG_LOG(info->line, "Not end of BRK (V)%i\n", info->line); in handle_ser_rx_interrupt()
2359 DEBUG_LOG(info->line, "num brk %i\n", info->break_detected_cnt); in handle_ser_rx_interrupt()
2365 e100_disable_serial_data_irq(info); in handle_ser_rx_interrupt()
2366 DINTR2(DEBUG_LOG(info->line, "ser_rx OK %d\n", info->line)); in handle_ser_rx_interrupt()
2367 info->break_detected_cnt = 0; in handle_ser_rx_interrupt()
2371 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart); in handle_ser_rx_interrupt()
2372 START_FLUSH_FAST_TIMER(info, "ser_int"); in handle_ser_rx_interrupt()
2375 static void handle_ser_tx_interrupt(struct e100_serial *info) in handle_ser_tx_interrupt() argument
2379 if (info->x_char) { in handle_ser_tx_interrupt()
2381 DFLOW(DEBUG_LOG(info->line, "tx_int: xchar 0x%02X\n", info->x_char)); in handle_ser_tx_interrupt()
2383 rstat = info->ioport[REG_STATUS]; in handle_ser_tx_interrupt()
2384 DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); in handle_ser_tx_interrupt()
2386 info->ioport[REG_TR_DATA] = info->x_char; in handle_ser_tx_interrupt()
2387 info->icount.tx++; in handle_ser_tx_interrupt()
2388 info->x_char = 0; in handle_ser_tx_interrupt()
2390 e100_enable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2394 if (info->uses_dma_out) { in handle_ser_tx_interrupt()
2398 DFLOW(DEBUG_LOG(info->line, "tx_int: xchar sent\n", 0)); in handle_ser_tx_interrupt()
2400 rstat = info->ioport[REG_STATUS]; in handle_ser_tx_interrupt()
2401 DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat)); in handle_ser_tx_interrupt()
2402 e100_disable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2403 if (info->port.tty->stopped) in handle_ser_tx_interrupt()
2404 rs_stop(info->port.tty); in handle_ser_tx_interrupt()
2406 e100_enable_txdma_channel(info); in handle_ser_tx_interrupt()
2411 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, continue); in handle_ser_tx_interrupt()
2416 if (info->xmit.head == info->xmit.tail in handle_ser_tx_interrupt()
2417 || info->port.tty->stopped) { in handle_ser_tx_interrupt()
2418 DFLOW(DEBUG_LOG(info->line, "tx_int: stopped %i\n", in handle_ser_tx_interrupt()
2419 info->port.tty->stopped)); in handle_ser_tx_interrupt()
2420 e100_disable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2421 info->tr_running = 0; in handle_ser_tx_interrupt()
2424 DINTR2(DEBUG_LOG(info->line, "tx_int %c\n", info->xmit.buf[info->xmit.tail])); in handle_ser_tx_interrupt()
2427 info->ioport[REG_TR_DATA] = info->xmit.buf[info->xmit.tail]; in handle_ser_tx_interrupt()
2428 info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1); in handle_ser_tx_interrupt()
2429 info->icount.tx++; in handle_ser_tx_interrupt()
2430 if (info->xmit.head == info->xmit.tail) { in handle_ser_tx_interrupt()
2432 if (info->rs485.flags & SER_RS485_ENABLED) { in handle_ser_tx_interrupt()
2434 start_one_shot_timer(&fast_timers_rs485[info->line], in handle_ser_tx_interrupt()
2436 (unsigned long)info, in handle_ser_tx_interrupt()
2437 info->char_time_usec*2, in handle_ser_tx_interrupt()
2441 info->last_tx_active_usec = GET_JIFFIES_USEC(); in handle_ser_tx_interrupt()
2442 info->last_tx_active = jiffies; in handle_ser_tx_interrupt()
2443 e100_disable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2444 info->tr_running = 0; in handle_ser_tx_interrupt()
2445 DFLOW(DEBUG_LOG(info->line, "tx_int: stop2\n", 0)); in handle_ser_tx_interrupt()
2448 e100_enable_serial_tx_ready_irq(info); in handle_ser_tx_interrupt()
2452 if (CIRC_CNT(info->xmit.head, in handle_ser_tx_interrupt()
2453 info->xmit.tail, in handle_ser_tx_interrupt()
2455 rs_sched_event(info, RS_EVENT_WRITE_WAKEUP); in handle_ser_tx_interrupt()
2467 struct e100_serial *info; in ser_interrupt() local
2478 info = rs_table; in ser_interrupt()
2484 handle_ser_rx_interrupt(info); in ser_interrupt()
2486 info += 1; in ser_interrupt()
2522 info = rs_table; in ser_interrupt()
2527 handle_ser_tx_interrupt(info); in ser_interrupt()
2529 info += 1; in ser_interrupt()
2576 struct e100_serial *info; in do_softint() local
2579 info = container_of(work, struct e100_serial, work); in do_softint()
2581 tty = info->port.tty; in do_softint()
2585 if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) in do_softint()
2590 startup(struct e100_serial * info) in startup() argument
2604 if (info->port.flags & ASYNC_INITIALIZED) { in startup()
2610 if (info->xmit.buf) in startup()
2613 info->xmit.buf = (unsigned char *) xmit_page; in startup()
2616 printk("starting up ttyS%d (xmit_buf 0x%p)...\n", info->line, info->xmit.buf); in startup()
2628 if (info->dma_in_enabled) { in startup()
2629 info->uses_dma_in = 1; in startup()
2630 e100_enable_rxdma_channel(info); in startup()
2632 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in startup()
2635 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) == in startup()
2639 *info->iclrintradr = in startup()
2643 e100_disable_rxdma_channel(info); in startup()
2646 if (info->dma_out_enabled) { in startup()
2647 info->uses_dma_out = 1; in startup()
2648 e100_enable_txdma_channel(info); in startup()
2649 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in startup()
2651 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) == in startup()
2655 *info->oclrintradr = in startup()
2659 e100_disable_txdma_channel(info); in startup()
2662 if (info->port.tty) in startup()
2663 clear_bit(TTY_IO_ERROR, &info->port.tty->flags); in startup()
2665 info->xmit.head = info->xmit.tail = 0; in startup()
2666 info->first_recv_buffer = info->last_recv_buffer = NULL; in startup()
2667 info->recv_cnt = info->max_recv_cnt = 0; in startup()
2670 info->rec_descr[i].buf = 0; in startup()
2677 e100_enable_serial_data_irq(info); in startup()
2679 change_speed(info); in startup()
2683 (void)info->ioport[REG_DATA]; in startup()
2686 if (info->uses_dma_out) in startup()
2687 e100_enable_txdma_irq(info); in startup()
2689 e100_enable_rx_irq(info); in startup()
2691 info->tr_running = 0; /* to be sure we don't lock up the transmitter */ in startup()
2695 start_receive(info); in startup()
2699 info->tr_descr.sw_len = 0; in startup()
2700 info->tr_descr.hw_len = 0; in startup()
2701 info->tr_descr.status = 0; in startup()
2705 e100_rts(info, 1); in startup()
2706 e100_dtr(info, 1); in startup()
2708 info->port.flags |= ASYNC_INITIALIZED; in startup()
2719 shutdown(struct e100_serial * info) in shutdown() argument
2722 struct etrax_dma_descr *descr = info->rec_descr; in shutdown()
2727 DFLOW(DEBUG_LOG(info->line, "shutdown %i\n", info->line)); in shutdown()
2728 e100_disable_rx(info); in shutdown()
2729 info->ioport[REG_TR_CTRL] = (info->tx_ctrl &= ~0x40); in shutdown()
2732 if (info->uses_dma_in) { in shutdown()
2733 e100_disable_rxdma_irq(info); in shutdown()
2734 *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in shutdown()
2735 info->uses_dma_in = 0; in shutdown()
2737 e100_disable_serial_data_irq(info); in shutdown()
2740 if (info->uses_dma_out) { in shutdown()
2741 e100_disable_txdma_irq(info); in shutdown()
2742 info->tr_running = 0; in shutdown()
2743 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset); in shutdown()
2744 info->uses_dma_out = 0; in shutdown()
2746 e100_disable_serial_tx_ready_irq(info); in shutdown()
2747 info->tr_running = 0; in shutdown()
2750 if (!(info->port.flags & ASYNC_INITIALIZED)) in shutdown()
2754 printk("Shutting down serial port %d (irq %d)....\n", info->line, in shutdown()
2755 info->irq); in shutdown()
2760 if (info->xmit.buf) { in shutdown()
2761 free_page((unsigned long)info->xmit.buf); in shutdown()
2762 info->xmit.buf = NULL; in shutdown()
2772 if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) { in shutdown()
2774 e100_dtr(info, 0); in shutdown()
2775 e100_rts(info, 0); /* could check CRTSCTS before doing this */ in shutdown()
2778 if (info->port.tty) in shutdown()
2779 set_bit(TTY_IO_ERROR, &info->port.tty->flags); in shutdown()
2781 info->port.flags &= ~ASYNC_INITIALIZED; in shutdown()
2789 change_speed(struct e100_serial *info) in change_speed() argument
2796 if (!info->port.tty) in change_speed()
2798 if (!info->ioport) in change_speed()
2801 cflag = info->port.tty->termios.c_cflag; in change_speed()
2806 if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) { in change_speed()
2808 u32 mask = 0xFF << (info->line*8); /* Each port has 8 bits */ in change_speed()
2814 (unsigned long)info->baud_base, info->custom_divisor)); in change_speed()
2815 if (info->baud_base == SERIAL_PRESCALE_BASE) { in change_speed()
2817 u16 divisor = info->custom_divisor; in change_speed()
2826 info->baud = SERIAL_PRESCALE_BASE/divisor; in change_speed()
2834 (unsigned long)info->baud_base, info->custom_divisor); in change_speed()
2837 r_alt_ser_baudrate_shadow |= (alt_source << (info->line*8)); in change_speed()
2842 u32 mask = 0xFF << (info->line*8); /* Each port has 8 bits */ in change_speed()
2847 r_alt_ser_baudrate_shadow |= (alt_source << (info->line*8)); in change_speed()
2850 info->baud = cflag_to_baud(cflag); in change_speed()
2851 info->ioport[REG_BAUD] = cflag_to_etrax_baud(cflag); in change_speed()
2857 info->rx_ctrl &= ~(IO_MASK(R_SERIAL0_REC_CTRL, rec_bitnr) | in change_speed()
2862 info->tx_ctrl &= ~(IO_MASK(R_SERIAL0_TR_CTRL, tr_bitnr) | in change_speed()
2870 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_bitnr, tr_7bit); in change_speed()
2871 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_bitnr, rec_7bit); in change_speed()
2876 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, stop_bits, two_bits); in change_speed()
2881 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_par_en, enable); in change_speed()
2882 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_par_en, enable); in change_speed()
2887 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_stick_par, stick); in change_speed()
2888 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_stick_par, stick); in change_speed()
2892 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_par, odd); in change_speed()
2893 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_par, odd); in change_speed()
2898 DFLOW(DEBUG_LOG(info->line, "FLOW auto_cts enabled\n", 0)); in change_speed()
2899 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, auto_cts, active); in change_speed()
2904 info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_enable, enable); in change_speed()
2905 info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_enable, enable); in change_speed()
2909 info->ioport[REG_TR_CTRL] = info->tx_ctrl; in change_speed()
2910 info->ioport[REG_REC_CTRL] = info->rx_ctrl; in change_speed()
2911 xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty)); in change_speed()
2913 if (info->port.tty->termios.c_iflag & IXON ) { in change_speed()
2914 DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n", in change_speed()
2915 STOP_CHAR(info->port.tty))); in change_speed()
2919 *((unsigned long *)&info->ioport[REG_XOFF]) = xoff; in change_speed()
2922 update_char_time(info); in change_speed()
2931 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_flush_chars() local
2934 if (info->tr_running || in rs_flush_chars()
2935 info->xmit.head == info->xmit.tail || in rs_flush_chars()
2937 !info->xmit.buf) in rs_flush_chars()
2947 start_transmit(info); in rs_flush_chars()
2955 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_raw_write() local
2960 if (!info->xmit.buf) in rs_raw_write()
2964 if (info->line == SERIAL_DEBUG_LINE) in rs_raw_write()
2966 count, info->ioport[REG_STATUS]); in rs_raw_write()
2970 DFLOW(DEBUG_LOG(info->line, "write count %i ", count)); in rs_raw_write()
2971 DFLOW(DEBUG_LOG(info->line, "ldisc %i\n", tty->ldisc.chars_in_buffer(tty))); in rs_raw_write()
2983 c = CIRC_SPACE_TO_END(info->xmit.head, in rs_raw_write()
2984 info->xmit.tail, in rs_raw_write()
2992 memcpy(info->xmit.buf + info->xmit.head, buf, c); in rs_raw_write()
2993 info->xmit.head = (info->xmit.head + c) & in rs_raw_write()
3005 DFLOW(DEBUG_LOG(info->line, "write ret %i\n", ret)); in rs_raw_write()
3007 if (info->xmit.head != info->xmit.tail && in rs_raw_write()
3009 !info->tr_running) { in rs_raw_write()
3010 start_transmit(info); in rs_raw_write()
3021 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_write() local
3023 if (info->rs485.flags & SER_RS485_ENABLED) in rs_write()
3030 fast_timers_rs485[info->line].function = NULL; in rs_write()
3031 del_fast_timer(&fast_timers_rs485[info->line]); in rs_write()
3033 e100_rts(info, (info->rs485.flags & SER_RS485_RTS_ON_SEND)); in rs_write()
3035 e100_disable_rx(info); in rs_write()
3036 e100_enable_rx_irq(info); in rs_write()
3038 if (info->rs485.delay_rts_before_send > 0) in rs_write()
3039 msleep(info->rs485.delay_rts_before_send); in rs_write()
3046 if (info->rs485.flags & SER_RS485_ENABLED) in rs_write()
3060 schedule_usleep(info->char_time_usec * 2); in rs_write()
3064 get_lsr_info(info, &val); in rs_write()
3067 e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND)); in rs_write()
3070 e100_enable_rx(info); in rs_write()
3071 e100_enable_rxdma_irq(info); in rs_write()
3085 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_write_room() local
3087 return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in rs_write_room()
3098 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_chars_in_buffer() local
3100 return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in rs_chars_in_buffer()
3108 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_flush_buffer() local
3112 info->xmit.head = info->xmit.tail = 0; in rs_flush_buffer()
3129 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_send_xchar() local
3132 if (info->uses_dma_out) { in rs_send_xchar()
3134 *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, hold); in rs_send_xchar()
3135 while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) != in rs_send_xchar()
3137 e100_disable_txdma_channel(info); in rs_send_xchar()
3145 DFLOW(DEBUG_LOG(info->line, "rs_send_xchar 0x%02X\n", ch)); in rs_send_xchar()
3146 info->x_char = ch; in rs_send_xchar()
3147 e100_enable_serial_tx_ready_irq(info); in rs_send_xchar()
3162 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_throttle() local
3167 DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty))); in rs_throttle()
3172 e100_rts(info, 0); in rs_throttle()
3182 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_unthrottle() local
3187 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty))); in rs_unthrottle()
3188 DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count)); in rs_unthrottle()
3192 e100_rts(info, 1); in rs_unthrottle()
3196 if (info->x_char) in rs_unthrottle()
3197 info->x_char = 0; in rs_unthrottle()
3211 get_serial_info(struct e100_serial * info, in get_serial_info() argument
3224 tmp.type = info->type; in get_serial_info()
3225 tmp.line = info->line; in get_serial_info()
3226 tmp.port = (int)info->ioport; in get_serial_info()
3227 tmp.irq = info->irq; in get_serial_info()
3228 tmp.flags = info->port.flags; in get_serial_info()
3229 tmp.baud_base = info->baud_base; in get_serial_info()
3230 tmp.close_delay = info->port.close_delay; in get_serial_info()
3231 tmp.closing_wait = info->port.closing_wait; in get_serial_info()
3232 tmp.custom_divisor = info->custom_divisor; in get_serial_info()
3239 set_serial_info(struct e100_serial *info, in set_serial_info() argument
3249 old_info = *info; in set_serial_info()
3252 if ((new_serial.type != info->type) || in set_serial_info()
3253 (new_serial.close_delay != info->port.close_delay) || in set_serial_info()
3255 (info->port.flags & ~ASYNC_USR_MASK))) in set_serial_info()
3257 info->port.flags = ((info->port.flags & ~ASYNC_USR_MASK) | in set_serial_info()
3262 if (info->port.count > 1) in set_serial_info()
3270 info->baud_base = new_serial.baud_base; in set_serial_info()
3271 info->port.flags = ((info->port.flags & ~ASYNC_FLAGS) | in set_serial_info()
3273 info->custom_divisor = new_serial.custom_divisor; in set_serial_info()
3274 info->type = new_serial.type; in set_serial_info()
3275 info->port.close_delay = new_serial.close_delay; in set_serial_info()
3276 info->port.closing_wait = new_serial.closing_wait; in set_serial_info()
3277 info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; in set_serial_info()
3280 if (info->port.flags & ASYNC_INITIALIZED) { in set_serial_info()
3281 change_speed(info); in set_serial_info()
3283 retval = startup(info); in set_serial_info()
3298 get_lsr_info(struct e100_serial * info, unsigned int *value) in get_lsr_info() argument
3304 (curr_time - info->last_tx_active) * 1000000/HZ + in get_lsr_info()
3305 curr_time_usec - info->last_tx_active_usec; in get_lsr_info()
3307 if (info->xmit.head != info->xmit.tail || in get_lsr_info()
3308 elapsed_usec < 2*info->char_time_usec) { in get_lsr_info()
3357 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_break() local
3360 if (!info->ioport) in rs_break()
3367 info->tx_ctrl &= 0x3F; in rs_break()
3370 info->tx_ctrl |= (0x80 | 0x40); in rs_break()
3372 info->ioport[REG_TR_CTRL] = info->tx_ctrl; in rs_break()
3380 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_tiocmset() local
3386 e100_rts(info, 0); in rs_tiocmset()
3388 e100_dtr(info, 0); in rs_tiocmset()
3391 e100_ri_out(info, 0); in rs_tiocmset()
3393 e100_cd_out(info, 0); in rs_tiocmset()
3396 e100_rts(info, 1); in rs_tiocmset()
3398 e100_dtr(info, 1); in rs_tiocmset()
3401 e100_ri_out(info, 1); in rs_tiocmset()
3403 e100_cd_out(info, 1); in rs_tiocmset()
3412 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_tiocmget() local
3419 (!E100_RTS_GET(info) ? TIOCM_RTS : 0) in rs_tiocmget()
3420 | (!E100_DTR_GET(info) ? TIOCM_DTR : 0) in rs_tiocmget()
3421 | (!E100_RI_GET(info) ? TIOCM_RNG : 0) in rs_tiocmget()
3422 | (!E100_DSR_GET(info) ? TIOCM_DSR : 0) in rs_tiocmget()
3423 | (!E100_CD_GET(info) ? TIOCM_CAR : 0) in rs_tiocmget()
3424 | (!E100_CTS_GET(info) ? TIOCM_CTS : 0); in rs_tiocmget()
3430 info->line, result, result); in rs_tiocmget()
3447 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in rs_ioctl() local
3458 return get_serial_info(info, in rs_ioctl()
3461 return set_serial_info(info, in rs_ioctl()
3464 return get_lsr_info(info, (unsigned int *) arg); in rs_ioctl()
3468 info, sizeof(struct e100_serial))) in rs_ioctl()
3553 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_set_termios() local
3555 change_speed(info); in rs_set_termios()
3577 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in rs_close() local
3580 if (!info) in rs_close()
3594 info->line, info->count); in rs_close()
3596 if ((tty->count == 1) && (info->port.count != 1)) { in rs_close()
3606 "info->count is %d\n", info->port.count); in rs_close()
3607 info->port.count = 1; in rs_close()
3609 if (--info->port.count < 0) { in rs_close()
3611 info->line, info->port.count); in rs_close()
3612 info->port.count = 0; in rs_close()
3614 if (info->port.count) { in rs_close()
3618 info->port.flags |= ASYNC_CLOSING; in rs_close()
3624 if (info->port.closing_wait != ASYNC_CLOSING_WAIT_NONE) in rs_close()
3625 tty_wait_until_sent(tty, info->port.closing_wait); in rs_close()
3631 e100_disable_serial_data_irq(info); in rs_close()
3634 e100_disable_rx(info); in rs_close()
3635 e100_disable_rx_irq(info); in rs_close()
3637 if (info->port.flags & ASYNC_INITIALIZED) { in rs_close()
3646 shutdown(info); in rs_close()
3650 info->event = 0; in rs_close()
3651 info->port.tty = NULL; in rs_close()
3652 if (info->port.blocked_open) { in rs_close()
3653 if (info->port.close_delay) in rs_close()
3654 schedule_timeout_interruptible(info->port.close_delay); in rs_close()
3655 wake_up_interruptible(&info->port.open_wait); in rs_close()
3657 info->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); in rs_close()
3663 if (info->rs485.flags & SER_RS485_ENABLED) { in rs_close()
3664 info->rs485.flags &= ~(SER_RS485_ENABLED); in rs_close()
3674 if (info->dma_in_enabled) { in rs_close()
3675 free_irq(info->dma_in_irq_nbr, info); in rs_close()
3676 cris_free_dma(info->dma_in_nbr, info->dma_in_irq_description); in rs_close()
3677 info->uses_dma_in = 0; in rs_close()
3680 info->dma_in_irq_description); in rs_close()
3683 if (info->dma_out_enabled) { in rs_close()
3684 free_irq(info->dma_out_irq_nbr, info); in rs_close()
3685 cris_free_dma(info->dma_out_nbr, info->dma_out_irq_description); in rs_close()
3686 info->uses_dma_out = 0; in rs_close()
3689 info->dma_out_irq_description); in rs_close()
3700 struct e100_serial *info = (struct e100_serial *)tty->driver_data; in rs_wait_until_sent() local
3704 (curr_time - info->last_tx_active) * (1000000/HZ) + in rs_wait_until_sent()
3705 curr_time_usec - info->last_tx_active_usec; in rs_wait_until_sent()
3712 while (info->xmit.head != info->xmit.tail || /* More in send queue */ in rs_wait_until_sent()
3713 (*info->ostatusadr & 0x007f) || /* more in FIFO */ in rs_wait_until_sent()
3714 (elapsed_usec < 2*info->char_time_usec)) { in rs_wait_until_sent()
3723 (curr_time - info->last_tx_active) * (1000000/HZ) + in rs_wait_until_sent()
3724 curr_time_usec - info->last_tx_active_usec; in rs_wait_until_sent()
3735 struct e100_serial * info = (struct e100_serial *)tty->driver_data; in rs_hangup() local
3738 shutdown(info); in rs_hangup()
3739 info->event = 0; in rs_hangup()
3740 info->port.count = 0; in rs_hangup()
3741 info->port.flags &= ~ASYNC_NORMAL_ACTIVE; in rs_hangup()
3742 info->port.tty = NULL; in rs_hangup()
3743 wake_up_interruptible(&info->port.open_wait); in rs_hangup()
3753 struct e100_serial *info) in block_til_ready() argument
3766 info->port.flags |= ASYNC_NORMAL_ACTIVE; in block_til_ready()
3782 add_wait_queue(&info->port.open_wait, &wait); in block_til_ready()
3785 info->line, info->port.count); in block_til_ready()
3788 info->port.count--; in block_til_ready()
3790 info->port.blocked_open++; in block_til_ready()
3794 e100_rts(info, 1); in block_til_ready()
3795 e100_dtr(info, 1); in block_til_ready()
3799 !(info->port.flags & ASYNC_INITIALIZED)) { in block_til_ready()
3801 if (info->port.flags & ASYNC_HUP_NOTIFY) in block_til_ready()
3819 info->line, info->port.count); in block_til_ready()
3826 remove_wait_queue(&info->port.open_wait, &wait); in block_til_ready()
3828 info->port.count++; in block_til_ready()
3829 info->port.blocked_open--; in block_til_ready()
3832 info->line, info->port.count); in block_til_ready()
3836 info->port.flags |= ASYNC_NORMAL_ACTIVE; in block_til_ready()
3841 deinit_port(struct e100_serial *info) in deinit_port() argument
3843 if (info->dma_out_enabled) { in deinit_port()
3844 cris_free_dma(info->dma_out_nbr, info->dma_out_irq_description); in deinit_port()
3845 free_irq(info->dma_out_irq_nbr, info); in deinit_port()
3847 if (info->dma_in_enabled) { in deinit_port()
3848 cris_free_dma(info->dma_in_nbr, info->dma_in_irq_description); in deinit_port()
3849 free_irq(info->dma_in_irq_nbr, info); in deinit_port()
3860 struct e100_serial *info; in rs_open() local
3864 info = rs_table + tty->index; in rs_open()
3865 if (!info->enabled) in rs_open()
3870 info->port.count); in rs_open()
3873 info->port.count++; in rs_open()
3874 tty->driver_data = info; in rs_open()
3875 info->port.tty = tty; in rs_open()
3877 info->port.low_latency = !!(info->port.flags & ASYNC_LOW_LATENCY); in rs_open()
3882 if (info->port.count == 1) { in rs_open()
3884 if (info->dma_in_enabled) { in rs_open()
3885 if (request_irq(info->dma_in_irq_nbr, in rs_open()
3887 info->dma_in_irq_flags, in rs_open()
3888 info->dma_in_irq_description, in rs_open()
3889 info)) { in rs_open()
3892 info->dma_in_irq_description); in rs_open()
3895 info->dma_in_enabled = 0; in rs_open()
3896 } else if (cris_request_dma(info->dma_in_nbr, in rs_open()
3897 info->dma_in_irq_description, in rs_open()
3899 info->dma_owner)) { in rs_open()
3900 free_irq(info->dma_in_irq_nbr, info); in rs_open()
3903 info->dma_in_irq_description); in rs_open()
3906 info->dma_in_enabled = 0; in rs_open()
3911 info->dma_in_irq_description); in rs_open()
3914 if (info->dma_out_enabled) { in rs_open()
3915 if (request_irq(info->dma_out_irq_nbr, in rs_open()
3917 info->dma_out_irq_flags, in rs_open()
3918 info->dma_out_irq_description, in rs_open()
3919 info)) { in rs_open()
3922 info->dma_out_irq_description); in rs_open()
3925 info->dma_out_enabled = 0; in rs_open()
3926 } else if (cris_request_dma(info->dma_out_nbr, in rs_open()
3927 info->dma_out_irq_description, in rs_open()
3929 info->dma_owner)) { in rs_open()
3930 free_irq(info->dma_out_irq_nbr, info); in rs_open()
3933 info->dma_out_irq_description); in rs_open()
3936 info->dma_out_enabled = 0; in rs_open()
3941 info->dma_out_irq_description); in rs_open()
3950 retval = startup(info); in rs_open()
3953 deinit_port(info); in rs_open()
3960 retval = block_til_ready(tty, filp, info); in rs_open()
3967 deinit_port(info); in rs_open()
3973 printk("rs_open ttyS%d successful...\n", info->line); in rs_open()
3977 DFLIP( if (info->line == SERIAL_DEBUG_LINE) { in rs_open()
3978 info->icount.rx = 0; in rs_open()
3989 static void seq_line_info(struct seq_file *m, struct e100_serial *info) in seq_line_info() argument
3994 info->line, (unsigned long)info->ioport, info->irq); in seq_line_info()
3996 if (!info->ioport || (info->type == PORT_UNKNOWN)) { in seq_line_info()
4001 seq_printf(m, " baud:%d", info->baud); in seq_line_info()
4003 (unsigned long)info->icount.tx, in seq_line_info()
4004 (unsigned long)info->icount.rx); in seq_line_info()
4005 tmp = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); in seq_line_info()
4012 (unsigned long)info->recv_cnt, in seq_line_info()
4013 (unsigned long)info->max_recv_cnt); in seq_line_info()
4016 if (info->port.tty) { in seq_line_info()
4017 if (info->port.tty->stopped) in seq_line_info()
4019 (int)info->port.tty->stopped); in seq_line_info()
4023 unsigned char rstat = info->ioport[REG_STATUS]; in seq_line_info()
4030 if (info->icount.frame) in seq_line_info()
4031 seq_printf(m, " fe:%lu", (unsigned long)info->icount.frame); in seq_line_info()
4033 if (info->icount.parity) in seq_line_info()
4034 seq_printf(m, " pe:%lu", (unsigned long)info->icount.parity); in seq_line_info()
4036 if (info->icount.brk) in seq_line_info()
4037 seq_printf(m, " brk:%lu", (unsigned long)info->icount.brk); in seq_line_info()
4039 if (info->icount.overrun) in seq_line_info()
4040 seq_printf(m, " oe:%lu", (unsigned long)info->icount.overrun); in seq_line_info()
4045 if (!E100_RTS_GET(info)) in seq_line_info()
4047 if (!E100_CTS_GET(info)) in seq_line_info()
4049 if (!E100_DTR_GET(info)) in seq_line_info()
4051 if (!E100_DSR_GET(info)) in seq_line_info()
4053 if (!E100_CD_GET(info)) in seq_line_info()
4055 if (!E100_RI_GET(info)) in seq_line_info()
4140 struct e100_serial *info; in rs_init() local
4186 for (i = 0, info = rs_table; i < NR_PORTS; i++,info++) { in rs_init()
4187 if (info->enabled) { in rs_init()
4188 if (cris_request_io_interface(info->io_if, in rs_init()
4189 info->io_if_description)) { in rs_init()
4193 info->io_if_description, i); in rs_init()
4194 info->enabled = 0; in rs_init()
4197 tty_port_init(&info->port); in rs_init()
4198 info->uses_dma_in = 0; in rs_init()
4199 info->uses_dma_out = 0; in rs_init()
4200 info->line = i; in rs_init()
4201 info->port.tty = NULL; in rs_init()
4202 info->type = PORT_ETRAX; in rs_init()
4203 info->tr_running = 0; in rs_init()
4204 info->forced_eop = 0; in rs_init()
4205 info->baud_base = DEF_BAUD_BASE; in rs_init()
4206 info->custom_divisor = 0; in rs_init()
4207 info->x_char = 0; in rs_init()
4208 info->event = 0; in rs_init()
4209 info->xmit.buf = NULL; in rs_init()
4210 info->xmit.tail = info->xmit.head = 0; in rs_init()
4211 info->first_recv_buffer = info->last_recv_buffer = NULL; in rs_init()
4212 info->recv_cnt = info->max_recv_cnt = 0; in rs_init()
4213 info->last_tx_active_usec = 0; in rs_init()
4214 info->last_tx_active = 0; in rs_init()
4218 info->rs485.flags &= ~(SER_RS485_RTS_ON_SEND); in rs_init()
4219 info->rs485.flags |= SER_RS485_RTS_AFTER_SEND; in rs_init()
4220 info->rs485.delay_rts_before_send = 0; in rs_init()
4221 info->rs485.flags &= ~(SER_RS485_ENABLED); in rs_init()
4223 INIT_WORK(&info->work, do_softint); in rs_init()
4225 if (info->enabled) { in rs_init()
4227 serial_driver->name, info->line, info->ioport); in rs_init()
4229 tty_port_link_device(&info->port, driver, i); in rs_init()