Lines Matching +full:cts +full:- +full:override

83 #define COPY_FROM_USER(error,dest,src,size) error = copy_from_user(dest,src,size) ? -EFAULT : 0
85 #define COPY_TO_USER(error,dest,src,size) error = copy_to_user(dest,src,size) ? -EFAULT : 0
197 int if_mode; /* serial interface selection (RS-232, v.35 etc) */
295 #define IRQ_CTS BIT10 // CTS status change
309 #define CTS BIT1 // CTS state macro
321 #define write_reg(info, reg, val) outb((val),(info)->io_base + (reg))
322 #define read_reg(info, reg) inb((info)->io_base + (reg))
324 #define read_reg16(info, reg) inw((info)->io_base + (reg))
325 #define write_reg16(info, reg, val) outw((val), (info)->io_base + (reg))
339 info->imra_value |= mask; in irq_disable()
340 write_reg16(info, CHA + IMR, info->imra_value); in irq_disable()
342 info->imrb_value |= mask; in irq_disable()
343 write_reg16(info, CHB + IMR, info->imrb_value); in irq_disable()
349 info->imra_value &= ~mask; in irq_enable()
350 write_reg16(info, CHA + IMR, info->imra_value); in irq_enable()
352 info->imrb_value &= ~mask; in irq_enable()
353 write_reg16(info, CHB + IMR, info->imrb_value); in irq_enable()
358 { info->pim_value |= (mask); write_reg(info, PIM, info->pim_value); }
361 { info->pim_value &= ~(mask); write_reg(info, PIM, info->pim_value); }
384 #define dev_to_port(D) (dev_to_hdlc(D)->priv)
436 * Set this param to non-zero to load eax with the
438 * This is useful for use with gdb and add-symbol-file command.
478 * (gdb) to get the .text address for the add-symbol-file command.
492 * ldisc_receive_buf - pass receive data to line discipline
503 if (ld->ops->receive_buf) in ldisc_receive_buf()
504 ld->ops->receive_buf(tty, data, flags, count); in ldisc_receive_buf()
525 return -ENOMEM; in mgslpc_probe()
528 info->magic = MGSLPC_MAGIC; in mgslpc_probe()
529 tty_port_init(&info->port); in mgslpc_probe()
530 info->port.ops = &mgslpc_port_ops; in mgslpc_probe()
531 INIT_WORK(&info->task, bh_handler); in mgslpc_probe()
532 info->max_frame_size = 4096; in mgslpc_probe()
533 init_waitqueue_head(&info->status_event_wait_q); in mgslpc_probe()
534 init_waitqueue_head(&info->event_wait_q); in mgslpc_probe()
535 spin_lock_init(&info->lock); in mgslpc_probe()
536 spin_lock_init(&info->netlock); in mgslpc_probe()
537 memcpy(&info->params,&default_params,sizeof(MGSL_PARAMS)); in mgslpc_probe()
538 info->idle_mode = HDLC_TXIDLE_FLAGS; in mgslpc_probe()
539 info->imra_value = 0xffff; in mgslpc_probe()
540 info->imrb_value = 0xffff; in mgslpc_probe()
541 info->pim_value = 0xff; in mgslpc_probe()
543 info->p_dev = link; in mgslpc_probe()
544 link->priv = info; in mgslpc_probe()
561 tty_port_destroy(&info->port); in mgslpc_probe()
576 MGSLPC_INFO *info = link->priv; in mgslpc_config()
582 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; in mgslpc_config()
588 link->config_index = 8; in mgslpc_config()
589 link->config_regs = PRESENT_OPTION; in mgslpc_config()
598 info->io_base = link->resource[0]->start; in mgslpc_config()
599 info->irq_level = link->irq; in mgslpc_config()
604 return -ENODEV; in mgslpc_config()
626 ((MGSLPC_INFO *)link->priv)->stop = 1; in mgslpc_detach()
629 mgslpc_remove_device((MGSLPC_INFO *)link->priv); in mgslpc_detach()
634 MGSLPC_INFO *info = link->priv; in mgslpc_suspend()
636 info->stop = 1; in mgslpc_suspend()
643 MGSLPC_INFO *info = link->priv; in mgslpc_resume()
645 info->stop = 0; in mgslpc_resume()
664 if (info->magic != MGSLPC_MAGIC) { in mgslpc_paranoia_check()
704 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tx_pause()
707 if (mgslpc_paranoia_check(info, tty->name, "tx_pause")) in tx_pause()
710 printk("tx_pause(%s)\n", info->device_name); in tx_pause()
712 spin_lock_irqsave(&info->lock, flags); in tx_pause()
713 if (info->tx_enabled) in tx_pause()
715 spin_unlock_irqrestore(&info->lock, flags); in tx_pause()
720 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tx_release()
723 if (mgslpc_paranoia_check(info, tty->name, "tx_release")) in tx_release()
726 printk("tx_release(%s)\n", info->device_name); in tx_release()
728 spin_lock_irqsave(&info->lock, flags); in tx_release()
729 if (!info->tx_enabled) in tx_release()
731 spin_unlock_irqrestore(&info->lock, flags); in tx_release()
742 spin_lock_irqsave(&info->lock, flags); in bh_action()
744 if (info->pending_bh & BH_RECEIVE) { in bh_action()
745 info->pending_bh &= ~BH_RECEIVE; in bh_action()
747 } else if (info->pending_bh & BH_TRANSMIT) { in bh_action()
748 info->pending_bh &= ~BH_TRANSMIT; in bh_action()
750 } else if (info->pending_bh & BH_STATUS) { in bh_action()
751 info->pending_bh &= ~BH_STATUS; in bh_action()
757 info->bh_running = false; in bh_action()
758 info->bh_requested = false; in bh_action()
761 spin_unlock_irqrestore(&info->lock, flags); in bh_action()
774 __FILE__,__LINE__,info->device_name); in bh_handler()
776 info->bh_running = true; in bh_handler()
777 tty = tty_port_tty_get(&info->port); in bh_handler()
807 __FILE__,__LINE__,info->device_name); in bh_handler()
813 printk("bh_transmit() entry on %s\n", info->device_name); in bh_transmit()
821 info->ri_chkcount = 0; in bh_status()
822 info->dsr_chkcount = 0; in bh_status()
823 info->dcd_chkcount = 0; in bh_status()
824 info->cts_chkcount = 0; in bh_status()
827 /* eom: non-zero = end of frame */
832 RXBUF *buf = (RXBUF*)(info->rx_buf + (info->rx_put * info->rx_buf_size)); in rx_ready_hdlc()
837 if (!info->rx_enabled) in rx_ready_hdlc()
840 if (info->rx_frame_count >= info->rx_buf_count) { in rx_ready_hdlc()
843 info->pending_bh |= BH_RECEIVE; in rx_ready_hdlc()
844 info->rx_overflow = true; in rx_ready_hdlc()
845 info->icount.buf_overrun++; in rx_ready_hdlc()
865 fifo_count -= read_count; in rx_ready_hdlc()
867 buf->status = data[--read_count]; in rx_ready_hdlc()
870 if (buf->count >= info->max_frame_size) { in rx_ready_hdlc()
873 buf->count = 0; in rx_ready_hdlc()
876 *(buf->data + buf->count) = data[i]; in rx_ready_hdlc()
877 buf->count++; in rx_ready_hdlc()
882 info->pending_bh |= BH_RECEIVE; in rx_ready_hdlc()
883 info->rx_frame_count++; in rx_ready_hdlc()
884 info->rx_put++; in rx_ready_hdlc()
885 if (info->rx_put >= info->rx_buf_count) in rx_ready_hdlc()
886 info->rx_put = 0; in rx_ready_hdlc()
893 struct tty_port *port = &info->port; in rx_ready_async()
897 struct mgsl_icount *icount = &info->icount; in rx_ready_async()
916 fifo_count -= 2; in rx_ready_async()
918 icount->rx++; in rx_ready_async()
927 icount->parity++; in rx_ready_async()
929 icount->frame++; in rx_ready_async()
932 if (status & info->ignore_status_mask) in rx_ready_async()
935 status &= info->read_status_mask; in rx_ready_async()
950 __FILE__,__LINE__,icount->rx,icount->brk, in rx_ready_async()
951 icount->parity,icount->frame,icount->overrun); in rx_ready_async()
961 if (!info->tx_active) in tx_done()
964 info->tx_active = false; in tx_done()
965 info->tx_aborting = false; in tx_done()
967 if (info->params.mode == MGSL_MODE_ASYNC) in tx_done()
970 info->tx_count = info->tx_put = info->tx_get = 0; in tx_done()
971 del_timer(&info->tx_timer); in tx_done()
973 if (info->drop_rts_on_tx_done) { in tx_done()
975 if (info->serial_signals & SerialSignal_RTS) { in tx_done()
976 info->serial_signals &= ~SerialSignal_RTS; in tx_done()
979 info->drop_rts_on_tx_done = false; in tx_done()
983 if (info->netcount) in tx_done()
988 if (tty && (tty->flow.stopped || tty->hw_stopped)) { in tx_done()
992 info->pending_bh |= BH_TRANSMIT; in tx_done()
1002 printk("%s(%d):tx_ready(%s)\n", __FILE__, __LINE__, info->device_name); in tx_ready()
1004 if (info->params.mode == MGSL_MODE_HDLC) { in tx_ready()
1005 if (!info->tx_active) in tx_ready()
1008 if (tty && (tty->flow.stopped || tty->hw_stopped)) { in tx_ready()
1012 if (!info->tx_count) in tx_ready()
1013 info->tx_active = false; in tx_ready()
1016 if (!info->tx_count) in tx_ready()
1019 while (info->tx_count && fifo_count) { in tx_ready()
1020 c = min(2, min_t(int, fifo_count, min(info->tx_count, TXBUFSIZE - info->tx_get))); in tx_ready()
1023 write_reg(info, CHA + TXFIFO, *(info->tx_buf + info->tx_get)); in tx_ready()
1026 *((unsigned short*)(info->tx_buf + info->tx_get))); in tx_ready()
1028 info->tx_count -= c; in tx_ready()
1029 info->tx_get = (info->tx_get + c) & (TXBUFSIZE - 1); in tx_ready()
1030 fifo_count -= c; in tx_ready()
1033 if (info->params.mode == MGSL_MODE_ASYNC) { in tx_ready()
1034 if (info->tx_count < WAKEUP_CHARS) in tx_ready()
1035 info->pending_bh |= BH_TRANSMIT; in tx_ready()
1038 if (info->tx_count) in tx_ready()
1048 if ((info->cts_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in cts_change()
1050 info->icount.cts++; in cts_change()
1051 if (info->serial_signals & SerialSignal_CTS) in cts_change()
1052 info->input_signal_events.cts_up++; in cts_change()
1054 info->input_signal_events.cts_down++; in cts_change()
1055 wake_up_interruptible(&info->status_event_wait_q); in cts_change()
1056 wake_up_interruptible(&info->event_wait_q); in cts_change()
1058 if (tty && tty_port_cts_enabled(&info->port)) { in cts_change()
1059 if (tty->hw_stopped) { in cts_change()
1060 if (info->serial_signals & SerialSignal_CTS) { in cts_change()
1062 printk("CTS tx start..."); in cts_change()
1063 tty->hw_stopped = 0; in cts_change()
1065 info->pending_bh |= BH_TRANSMIT; in cts_change()
1069 if (!(info->serial_signals & SerialSignal_CTS)) { in cts_change()
1071 printk("CTS tx stop..."); in cts_change()
1072 tty->hw_stopped = 1; in cts_change()
1077 info->pending_bh |= BH_STATUS; in cts_change()
1083 if ((info->dcd_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in dcd_change()
1085 info->icount.dcd++; in dcd_change()
1086 if (info->serial_signals & SerialSignal_DCD) { in dcd_change()
1087 info->input_signal_events.dcd_up++; in dcd_change()
1090 info->input_signal_events.dcd_down++; in dcd_change()
1092 if (info->netcount) { in dcd_change()
1093 if (info->serial_signals & SerialSignal_DCD) in dcd_change()
1094 netif_carrier_on(info->netdev); in dcd_change()
1096 netif_carrier_off(info->netdev); in dcd_change()
1099 wake_up_interruptible(&info->status_event_wait_q); in dcd_change()
1100 wake_up_interruptible(&info->event_wait_q); in dcd_change()
1102 if (tty_port_check_carrier(&info->port)) { in dcd_change()
1104 printk("%s CD now %s...", info->device_name, in dcd_change()
1105 (info->serial_signals & SerialSignal_DCD) ? "on" : "off"); in dcd_change()
1106 if (info->serial_signals & SerialSignal_DCD) in dcd_change()
1107 wake_up_interruptible(&info->port.open_wait); in dcd_change()
1115 info->pending_bh |= BH_STATUS; in dcd_change()
1121 if ((info->dsr_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in dsr_change()
1123 info->icount.dsr++; in dsr_change()
1124 if (info->serial_signals & SerialSignal_DSR) in dsr_change()
1125 info->input_signal_events.dsr_up++; in dsr_change()
1127 info->input_signal_events.dsr_down++; in dsr_change()
1128 wake_up_interruptible(&info->status_event_wait_q); in dsr_change()
1129 wake_up_interruptible(&info->event_wait_q); in dsr_change()
1130 info->pending_bh |= BH_STATUS; in dsr_change()
1136 if ((info->ri_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in ri_change()
1138 info->icount.rng++; in ri_change()
1139 if (info->serial_signals & SerialSignal_RI) in ri_change()
1140 info->input_signal_events.ri_up++; in ri_change()
1142 info->input_signal_events.ri_down++; in ri_change()
1143 wake_up_interruptible(&info->status_event_wait_q); in ri_change()
1144 wake_up_interruptible(&info->event_wait_q); in ri_change()
1145 info->pending_bh |= BH_STATUS; in ri_change()
1164 printk("mgslpc_isr(%d) entry.\n", info->irq_level); in mgslpc_isr()
1166 if (!(info->p_dev->_locked)) in mgslpc_isr()
1169 tty = tty_port_tty_get(&info->port); in mgslpc_isr()
1171 spin_lock(&info->lock); in mgslpc_isr()
1175 printk("mgslpc_isr %s gis=%04X\n", info->device_name,gis); in mgslpc_isr()
1194 info->irq_occurred = true; in mgslpc_isr()
1200 info->icount.exithunt++; in mgslpc_isr()
1201 wake_up_interruptible(&info->event_wait_q); in mgslpc_isr()
1204 info->icount.brk++; in mgslpc_isr()
1205 if (info->port.flags & ASYNC_SAK) in mgslpc_isr()
1212 if (info->params.mode == MGSL_MODE_HDLC) in mgslpc_isr()
1220 if (info->tx_aborting) in mgslpc_isr()
1221 info->icount.txabort++; in mgslpc_isr()
1223 info->icount.txunder++; in mgslpc_isr()
1227 info->icount.txok++; in mgslpc_isr()
1246 if (info->pending_bh && !info->bh_running && !info->bh_requested) { in mgslpc_isr()
1249 __FILE__,__LINE__,info->device_name); in mgslpc_isr()
1250 schedule_work(&info->task); in mgslpc_isr()
1251 info->bh_requested = true; in mgslpc_isr()
1254 spin_unlock(&info->lock); in mgslpc_isr()
1259 __FILE__, __LINE__, info->irq_level); in mgslpc_isr()
1271 printk("%s(%d):startup(%s)\n", __FILE__, __LINE__, info->device_name); in startup()
1273 if (tty_port_initialized(&info->port)) in startup()
1276 if (!info->tx_buf) { in startup()
1278 info->tx_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL); in startup()
1279 if (!info->tx_buf) { in startup()
1281 __FILE__, __LINE__, info->device_name); in startup()
1282 return -ENOMEM; in startup()
1286 info->pending_bh = 0; in startup()
1288 memset(&info->icount, 0, sizeof(info->icount)); in startup()
1290 timer_setup(&info->tx_timer, tx_timeout, 0); in startup()
1301 set_bit(TTY_IO_ERROR, &tty->flags); in startup()
1310 clear_bit(TTY_IO_ERROR, &tty->flags); in startup()
1312 tty_port_set_initialized(&info->port, 1); in startup()
1323 if (!tty_port_initialized(&info->port)) in shutdown()
1328 __FILE__, __LINE__, info->device_name); in shutdown()
1332 wake_up_interruptible(&info->status_event_wait_q); in shutdown()
1333 wake_up_interruptible(&info->event_wait_q); in shutdown()
1335 del_timer_sync(&info->tx_timer); in shutdown()
1337 if (info->tx_buf) { in shutdown()
1338 free_page((unsigned long) info->tx_buf); in shutdown()
1339 info->tx_buf = NULL; in shutdown()
1342 spin_lock_irqsave(&info->lock, flags); in shutdown()
1351 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in shutdown()
1355 spin_unlock_irqrestore(&info->lock, flags); in shutdown()
1360 set_bit(TTY_IO_ERROR, &tty->flags); in shutdown()
1362 tty_port_set_initialized(&info->port, 0); in shutdown()
1369 spin_lock_irqsave(&info->lock, flags); in mgslpc_program_hw()
1373 info->tx_count = info->tx_put = info->tx_get = 0; in mgslpc_program_hw()
1375 if (info->params.mode == MGSL_MODE_HDLC || info->netcount) in mgslpc_program_hw()
1382 info->dcd_chkcount = 0; in mgslpc_program_hw()
1383 info->cts_chkcount = 0; in mgslpc_program_hw()
1384 info->ri_chkcount = 0; in mgslpc_program_hw()
1385 info->dsr_chkcount = 0; in mgslpc_program_hw()
1391 if (info->netcount || (tty && C_CREAD(tty))) in mgslpc_program_hw()
1394 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_program_hw()
1409 __FILE__, __LINE__, info->device_name); in mgslpc_change_params()
1411 cflag = tty->termios.c_cflag; in mgslpc_change_params()
1416 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in mgslpc_change_params()
1418 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in mgslpc_change_params()
1422 info->params.data_bits = tty_get_char_size(cflag); in mgslpc_change_params()
1425 info->params.stop_bits = 2; in mgslpc_change_params()
1427 info->params.stop_bits = 1; in mgslpc_change_params()
1429 info->params.parity = ASYNC_PARITY_NONE; in mgslpc_change_params()
1432 info->params.parity = ASYNC_PARITY_ODD; in mgslpc_change_params()
1434 info->params.parity = ASYNC_PARITY_EVEN; in mgslpc_change_params()
1437 info->params.parity = ASYNC_PARITY_SPACE; in mgslpc_change_params()
1444 bits_per_char = info->params.data_bits + in mgslpc_change_params()
1445 info->params.stop_bits + 1; in mgslpc_change_params()
1448 * allow tty settings to override, otherwise keep the in mgslpc_change_params()
1451 if (info->params.data_rate <= 460800) { in mgslpc_change_params()
1452 info->params.data_rate = tty_get_baud_rate(tty); in mgslpc_change_params()
1455 if (info->params.data_rate) { in mgslpc_change_params()
1456 info->timeout = (32*HZ*bits_per_char) / in mgslpc_change_params()
1457 info->params.data_rate; in mgslpc_change_params()
1459 info->timeout += HZ/50; /* Add .02 seconds of slop */ in mgslpc_change_params()
1461 tty_port_set_cts_flow(&info->port, cflag & CRTSCTS); in mgslpc_change_params()
1462 tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL); in mgslpc_change_params()
1466 info->read_status_mask = 0; in mgslpc_change_params()
1468 info->read_status_mask |= BIT7 | BIT6; in mgslpc_change_params()
1470 info->ignore_status_mask |= BIT7 | BIT6; in mgslpc_change_params()
1479 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_put_char()
1484 __FILE__, __LINE__, ch, info->device_name); in mgslpc_put_char()
1487 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_put_char")) in mgslpc_put_char()
1490 if (!info->tx_buf) in mgslpc_put_char()
1493 spin_lock_irqsave(&info->lock, flags); in mgslpc_put_char()
1495 if (info->params.mode == MGSL_MODE_ASYNC || !info->tx_active) { in mgslpc_put_char()
1496 if (info->tx_count < TXBUFSIZE - 1) { in mgslpc_put_char()
1497 info->tx_buf[info->tx_put++] = ch; in mgslpc_put_char()
1498 info->tx_put &= TXBUFSIZE-1; in mgslpc_put_char()
1499 info->tx_count++; in mgslpc_put_char()
1503 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_put_char()
1512 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_flush_chars()
1517 __FILE__, __LINE__, info->device_name, info->tx_count); in mgslpc_flush_chars()
1519 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_flush_chars")) in mgslpc_flush_chars()
1522 if (info->tx_count <= 0 || tty->flow.stopped || in mgslpc_flush_chars()
1523 tty->hw_stopped || !info->tx_buf) in mgslpc_flush_chars()
1528 __FILE__, __LINE__, info->device_name); in mgslpc_flush_chars()
1530 spin_lock_irqsave(&info->lock, flags); in mgslpc_flush_chars()
1531 if (!info->tx_active) in mgslpc_flush_chars()
1533 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_flush_chars()
1550 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_write()
1555 __FILE__, __LINE__, info->device_name, count); in mgslpc_write()
1557 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_write") || in mgslpc_write()
1558 !info->tx_buf) in mgslpc_write()
1561 if (info->params.mode == MGSL_MODE_HDLC) { in mgslpc_write()
1563 ret = -EIO; in mgslpc_write()
1566 if (info->tx_active) in mgslpc_write()
1568 else if (info->tx_count) in mgslpc_write()
1574 min(TXBUFSIZE - info->tx_count - 1, in mgslpc_write()
1575 TXBUFSIZE - info->tx_put)); in mgslpc_write()
1579 memcpy(info->tx_buf + info->tx_put, buf, c); in mgslpc_write()
1581 spin_lock_irqsave(&info->lock, flags); in mgslpc_write()
1582 info->tx_put = (info->tx_put + c) & (TXBUFSIZE-1); in mgslpc_write()
1583 info->tx_count += c; in mgslpc_write()
1584 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_write()
1587 count -= c; in mgslpc_write()
1591 if (info->tx_count && !tty->flow.stopped && !tty->hw_stopped) { in mgslpc_write()
1592 spin_lock_irqsave(&info->lock, flags); in mgslpc_write()
1593 if (!info->tx_active) in mgslpc_write()
1595 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_write()
1600 __FILE__, __LINE__, info->device_name, ret); in mgslpc_write()
1608 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_write_room()
1611 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_write_room")) in mgslpc_write_room()
1614 if (info->params.mode == MGSL_MODE_HDLC) { in mgslpc_write_room()
1616 if (info->tx_active) in mgslpc_write_room()
1621 ret = TXBUFSIZE - info->tx_count - 1; in mgslpc_write_room()
1628 __FILE__, __LINE__, info->device_name, ret); in mgslpc_write_room()
1636 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_chars_in_buffer()
1641 __FILE__, __LINE__, info->device_name); in mgslpc_chars_in_buffer()
1643 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_chars_in_buffer")) in mgslpc_chars_in_buffer()
1646 if (info->params.mode == MGSL_MODE_HDLC) in mgslpc_chars_in_buffer()
1647 rc = info->tx_active ? info->max_frame_size : 0; in mgslpc_chars_in_buffer()
1649 rc = info->tx_count; in mgslpc_chars_in_buffer()
1653 __FILE__, __LINE__, info->device_name, rc); in mgslpc_chars_in_buffer()
1662 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_flush_buffer()
1667 __FILE__, __LINE__, info->device_name); in mgslpc_flush_buffer()
1669 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_flush_buffer")) in mgslpc_flush_buffer()
1672 spin_lock_irqsave(&info->lock, flags); in mgslpc_flush_buffer()
1673 info->tx_count = info->tx_put = info->tx_get = 0; in mgslpc_flush_buffer()
1674 del_timer(&info->tx_timer); in mgslpc_flush_buffer()
1675 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_flush_buffer()
1677 wake_up_interruptible(&tty->write_wait); in mgslpc_flush_buffer()
1681 /* Send a high-priority XON/XOFF character
1685 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_send_xchar()
1690 __FILE__, __LINE__, info->device_name, ch); in mgslpc_send_xchar()
1692 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_send_xchar")) in mgslpc_send_xchar()
1695 info->x_char = ch; in mgslpc_send_xchar()
1697 spin_lock_irqsave(&info->lock, flags); in mgslpc_send_xchar()
1698 if (!info->tx_enabled) in mgslpc_send_xchar()
1700 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_send_xchar()
1708 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_throttle()
1713 __FILE__, __LINE__, info->device_name); in mgslpc_throttle()
1715 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_throttle")) in mgslpc_throttle()
1722 spin_lock_irqsave(&info->lock, flags); in mgslpc_throttle()
1723 info->serial_signals &= ~SerialSignal_RTS; in mgslpc_throttle()
1725 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_throttle()
1733 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_unthrottle()
1738 __FILE__, __LINE__, info->device_name); in mgslpc_unthrottle()
1740 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_unthrottle")) in mgslpc_unthrottle()
1744 if (info->x_char) in mgslpc_unthrottle()
1745 info->x_char = 0; in mgslpc_unthrottle()
1751 spin_lock_irqsave(&info->lock, flags); in mgslpc_unthrottle()
1752 info->serial_signals |= SerialSignal_RTS; in mgslpc_unthrottle()
1754 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_unthrottle()
1764 printk("get_params(%s)\n", info->device_name); in get_stats()
1766 memset(&info->icount, 0, sizeof(info->icount)); in get_stats()
1768 COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount)); in get_stats()
1770 return -EFAULT; in get_stats()
1781 printk("get_params(%s)\n", info->device_name); in get_params()
1782 COPY_TO_USER(err,user_params, &info->params, sizeof(MGSL_PARAMS)); in get_params()
1784 return -EFAULT; in get_params()
1805 info->device_name); in set_params()
1810 __FILE__, __LINE__, info->device_name); in set_params()
1811 return -EFAULT; in set_params()
1814 spin_lock_irqsave(&info->lock, flags); in set_params()
1815 memcpy(&info->params,&tmp_params,sizeof(MGSL_PARAMS)); in set_params()
1816 spin_unlock_irqrestore(&info->lock, flags); in set_params()
1827 printk("get_txidle(%s)=%d\n", info->device_name, info->idle_mode); in get_txidle()
1828 COPY_TO_USER(err,idle_mode, &info->idle_mode, sizeof(int)); in get_txidle()
1830 return -EFAULT; in get_txidle()
1838 printk("set_txidle(%s,%d)\n", info->device_name, idle_mode); in set_txidle()
1839 spin_lock_irqsave(&info->lock, flags); in set_txidle()
1840 info->idle_mode = idle_mode; in set_txidle()
1842 spin_unlock_irqrestore(&info->lock, flags); in set_txidle()
1850 printk("get_interface(%s)=%d\n", info->device_name, info->if_mode); in get_interface()
1851 COPY_TO_USER(err,if_mode, &info->if_mode, sizeof(int)); in get_interface()
1853 return -EFAULT; in get_interface()
1862 printk("set_interface(%s,%d)\n", info->device_name, if_mode); in set_interface()
1863 spin_lock_irqsave(&info->lock, flags); in set_interface()
1864 info->if_mode = if_mode; in set_interface()
1867 switch (info->if_mode) in set_interface()
1875 spin_unlock_irqrestore(&info->lock, flags); in set_interface()
1884 printk("set_txenable(%s,%d)\n", info->device_name, enable); in set_txenable()
1886 spin_lock_irqsave(&info->lock, flags); in set_txenable()
1888 if (!info->tx_enabled) in set_txenable()
1891 if (info->tx_enabled) in set_txenable()
1894 spin_unlock_irqrestore(&info->lock, flags); in set_txenable()
1903 printk("tx_abort(%s)\n", info->device_name); in tx_abort()
1905 spin_lock_irqsave(&info->lock, flags); in tx_abort()
1906 if (info->tx_active && info->tx_count && in tx_abort()
1907 info->params.mode == MGSL_MODE_HDLC) { in tx_abort()
1911 info->tx_count = info->tx_put = info->tx_get = 0; in tx_abort()
1912 info->tx_aborting = true; in tx_abort()
1914 spin_unlock_irqrestore(&info->lock, flags); in tx_abort()
1923 printk("set_rxenable(%s,%d)\n", info->device_name, enable); in set_rxenable()
1925 spin_lock_irqsave(&info->lock, flags); in set_rxenable()
1927 if (!info->rx_enabled) in set_rxenable()
1930 if (info->rx_enabled) in set_rxenable()
1933 spin_unlock_irqrestore(&info->lock, flags); in set_rxenable()
1958 return -EFAULT; in wait_events()
1961 printk("wait_events(%s,%d)\n", info->device_name, mask); in wait_events()
1963 spin_lock_irqsave(&info->lock, flags); in wait_events()
1967 s = info->serial_signals; in wait_events()
1974 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
1979 cprev = info->icount; in wait_events()
1980 oldsigs = info->input_signal_events; in wait_events()
1982 if ((info->params.mode == MGSL_MODE_HDLC) && in wait_events()
1987 add_wait_queue(&info->event_wait_q, &wait); in wait_events()
1989 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
1995 rc = -ERESTARTSYS; in wait_events()
2000 spin_lock_irqsave(&info->lock, flags); in wait_events()
2001 cnow = info->icount; in wait_events()
2002 newsigs = info->input_signal_events; in wait_events()
2004 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
2017 rc = -EIO; in wait_events()
2039 remove_wait_queue(&info->event_wait_q, &wait); in wait_events()
2043 spin_lock_irqsave(&info->lock, flags); in wait_events()
2044 if (!waitqueue_active(&info->event_wait_q)) in wait_events()
2046 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
2062 spin_lock_irqsave(&info->lock, flags); in modem_input_wait()
2063 cprev = info->icount; in modem_input_wait()
2064 add_wait_queue(&info->status_event_wait_q, &wait); in modem_input_wait()
2066 spin_unlock_irqrestore(&info->lock, flags); in modem_input_wait()
2071 rc = -ERESTARTSYS; in modem_input_wait()
2076 spin_lock_irqsave(&info->lock, flags); in modem_input_wait()
2077 cnow = info->icount; in modem_input_wait()
2079 spin_unlock_irqrestore(&info->lock, flags); in modem_input_wait()
2083 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) { in modem_input_wait()
2084 rc = -EIO; in modem_input_wait()
2092 (arg & TIOCM_CTS && cnow.cts != cprev.cts)) { in modem_input_wait()
2099 remove_wait_queue(&info->status_event_wait_q, &wait); in modem_input_wait()
2108 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tiocmget()
2112 spin_lock_irqsave(&info->lock, flags); in tiocmget()
2114 spin_unlock_irqrestore(&info->lock, flags); in tiocmget()
2116 result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS:0) + in tiocmget()
2117 ((info->serial_signals & SerialSignal_DTR) ? TIOCM_DTR:0) + in tiocmget()
2118 ((info->serial_signals & SerialSignal_DCD) ? TIOCM_CAR:0) + in tiocmget()
2119 ((info->serial_signals & SerialSignal_RI) ? TIOCM_RNG:0) + in tiocmget()
2120 ((info->serial_signals & SerialSignal_DSR) ? TIOCM_DSR:0) + in tiocmget()
2121 ((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0); in tiocmget()
2125 __FILE__, __LINE__, info->device_name, result); in tiocmget()
2134 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tiocmset()
2139 __FILE__, __LINE__, info->device_name, set, clear); in tiocmset()
2142 info->serial_signals |= SerialSignal_RTS; in tiocmset()
2144 info->serial_signals |= SerialSignal_DTR; in tiocmset()
2146 info->serial_signals &= ~SerialSignal_RTS; in tiocmset()
2148 info->serial_signals &= ~SerialSignal_DTR; in tiocmset()
2150 spin_lock_irqsave(&info->lock, flags); in tiocmset()
2152 spin_unlock_irqrestore(&info->lock, flags); in tiocmset()
2160 * break_state -1=set break condition, 0=clear
2164 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_break()
2169 __FILE__, __LINE__, info->device_name, break_state); in mgslpc_break()
2171 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_break")) in mgslpc_break()
2172 return -EINVAL; in mgslpc_break()
2174 spin_lock_irqsave(&info->lock, flags); in mgslpc_break()
2175 if (break_state == -1) in mgslpc_break()
2179 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_break()
2186 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_get_icount()
2190 spin_lock_irqsave(&info->lock, flags); in mgslpc_get_icount()
2191 cnow = info->icount; in mgslpc_get_icount()
2192 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_get_icount()
2194 icount->cts = cnow.cts; in mgslpc_get_icount()
2195 icount->dsr = cnow.dsr; in mgslpc_get_icount()
2196 icount->rng = cnow.rng; in mgslpc_get_icount()
2197 icount->dcd = cnow.dcd; in mgslpc_get_icount()
2198 icount->rx = cnow.rx; in mgslpc_get_icount()
2199 icount->tx = cnow.tx; in mgslpc_get_icount()
2200 icount->frame = cnow.frame; in mgslpc_get_icount()
2201 icount->overrun = cnow.overrun; in mgslpc_get_icount()
2202 icount->parity = cnow.parity; in mgslpc_get_icount()
2203 icount->brk = cnow.brk; in mgslpc_get_icount()
2204 icount->buf_overrun = cnow.buf_overrun; in mgslpc_get_icount()
2222 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_ioctl()
2227 info->device_name, cmd); in mgslpc_ioctl()
2229 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_ioctl")) in mgslpc_ioctl()
2230 return -ENODEV; in mgslpc_ioctl()
2234 return -EIO; in mgslpc_ioctl()
2263 return -ENOIOCTLCMD; in mgslpc_ioctl()
2277 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_set_termios()
2282 tty->driver->name); in mgslpc_set_termios()
2285 if ((tty->termios.c_cflag == old_termios->c_cflag) in mgslpc_set_termios()
2286 && (RELEVANT_IFLAG(tty->termios.c_iflag) in mgslpc_set_termios()
2287 == RELEVANT_IFLAG(old_termios->c_iflag))) in mgslpc_set_termios()
2293 if ((old_termios->c_cflag & CBAUD) && !C_BAUD(tty)) { in mgslpc_set_termios()
2294 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in mgslpc_set_termios()
2295 spin_lock_irqsave(&info->lock, flags); in mgslpc_set_termios()
2297 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_set_termios()
2301 if (!(old_termios->c_cflag & CBAUD) && C_BAUD(tty)) { in mgslpc_set_termios()
2302 info->serial_signals |= SerialSignal_DTR; in mgslpc_set_termios()
2304 info->serial_signals |= SerialSignal_RTS; in mgslpc_set_termios()
2305 spin_lock_irqsave(&info->lock, flags); in mgslpc_set_termios()
2307 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_set_termios()
2311 if (old_termios->c_cflag & CRTSCTS && !C_CRTSCTS(tty)) { in mgslpc_set_termios()
2312 tty->hw_stopped = 0; in mgslpc_set_termios()
2319 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_close()
2320 struct tty_port *port = &info->port; in mgslpc_close()
2322 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_close")) in mgslpc_close()
2327 __FILE__, __LINE__, info->device_name, port->count); in mgslpc_close()
2333 mgslpc_wait_until_sent(tty, info->timeout); in mgslpc_close()
2345 tty->driver->name, port->count); in mgslpc_close()
2352 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_wait_until_sent()
2360 __FILE__, __LINE__, info->device_name); in mgslpc_wait_until_sent()
2362 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_wait_until_sent")) in mgslpc_wait_until_sent()
2365 if (!tty_port_initialized(&info->port)) in mgslpc_wait_until_sent()
2373 * Note: use tight timings here to satisfy the NIST-PCTS. in mgslpc_wait_until_sent()
2376 if (info->params.data_rate) { in mgslpc_wait_until_sent()
2377 char_time = info->timeout/(32 * 5); in mgslpc_wait_until_sent()
2386 if (info->params.mode == MGSL_MODE_HDLC) { in mgslpc_wait_until_sent()
2387 while (info->tx_active) { in mgslpc_wait_until_sent()
2395 while ((info->tx_count || info->tx_active) && in mgslpc_wait_until_sent()
2396 info->tx_enabled) { in mgslpc_wait_until_sent()
2408 __FILE__, __LINE__, info->device_name); in mgslpc_wait_until_sent()
2416 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_hangup()
2420 __FILE__, __LINE__, info->device_name); in mgslpc_hangup()
2422 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_hangup")) in mgslpc_hangup()
2427 tty_port_hangup(&info->port); in mgslpc_hangup()
2435 spin_lock_irqsave(&info->lock, flags); in carrier_raised()
2437 spin_unlock_irqrestore(&info->lock, flags); in carrier_raised()
2439 if (info->serial_signals & SerialSignal_DCD) in carrier_raised()
2449 spin_lock_irqsave(&info->lock, flags); in dtr_rts()
2451 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in dtr_rts()
2453 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in dtr_rts()
2455 spin_unlock_irqrestore(&info->lock, flags); in dtr_rts()
2467 line = tty->index; in mgslpc_open()
2471 return -ENODEV; in mgslpc_open()
2476 while(info && info->line != line) in mgslpc_open()
2477 info = info->next_device; in mgslpc_open()
2478 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_open")) in mgslpc_open()
2479 return -ENODEV; in mgslpc_open()
2481 port = &info->port; in mgslpc_open()
2482 tty->driver_data = info; in mgslpc_open()
2487 __FILE__, __LINE__, tty->driver->name, port->count); in mgslpc_open()
2489 spin_lock_irqsave(&info->netlock, flags); in mgslpc_open()
2490 if (info->netcount) { in mgslpc_open()
2491 retval = -EBUSY; in mgslpc_open()
2492 spin_unlock_irqrestore(&info->netlock, flags); in mgslpc_open()
2495 spin_lock(&port->lock); in mgslpc_open()
2496 port->count++; in mgslpc_open()
2497 spin_unlock(&port->lock); in mgslpc_open()
2498 spin_unlock_irqrestore(&info->netlock, flags); in mgslpc_open()
2500 if (port->count == 1) { in mgslpc_open()
2507 retval = tty_port_block_til_ready(&info->port, tty, filp); in mgslpc_open()
2511 __FILE__, __LINE__, info->device_name, retval); in mgslpc_open()
2517 __FILE__, __LINE__, info->device_name); in mgslpc_open()
2534 info->device_name, info->io_base, info->irq_level); in line_info()
2537 spin_lock_irqsave(&info->lock, flags); in line_info()
2539 spin_unlock_irqrestore(&info->lock, flags); in line_info()
2543 if (info->serial_signals & SerialSignal_RTS) in line_info()
2545 if (info->serial_signals & SerialSignal_CTS) in line_info()
2546 strcat(stat_buf, "|CTS"); in line_info()
2547 if (info->serial_signals & SerialSignal_DTR) in line_info()
2549 if (info->serial_signals & SerialSignal_DSR) in line_info()
2551 if (info->serial_signals & SerialSignal_DCD) in line_info()
2553 if (info->serial_signals & SerialSignal_RI) in line_info()
2556 if (info->params.mode == MGSL_MODE_HDLC) { in line_info()
2558 info->icount.txok, info->icount.rxok); in line_info()
2559 if (info->icount.txunder) in line_info()
2560 seq_printf(m, " txunder:%d", info->icount.txunder); in line_info()
2561 if (info->icount.txabort) in line_info()
2562 seq_printf(m, " txabort:%d", info->icount.txabort); in line_info()
2563 if (info->icount.rxshort) in line_info()
2564 seq_printf(m, " rxshort:%d", info->icount.rxshort); in line_info()
2565 if (info->icount.rxlong) in line_info()
2566 seq_printf(m, " rxlong:%d", info->icount.rxlong); in line_info()
2567 if (info->icount.rxover) in line_info()
2568 seq_printf(m, " rxover:%d", info->icount.rxover); in line_info()
2569 if (info->icount.rxcrc) in line_info()
2570 seq_printf(m, " rxcrc:%d", info->icount.rxcrc); in line_info()
2573 info->icount.tx, info->icount.rx); in line_info()
2574 if (info->icount.frame) in line_info()
2575 seq_printf(m, " fe:%d", info->icount.frame); in line_info()
2576 if (info->icount.parity) in line_info()
2577 seq_printf(m, " pe:%d", info->icount.parity); in line_info()
2578 if (info->icount.brk) in line_info()
2579 seq_printf(m, " brk:%d", info->icount.brk); in line_info()
2580 if (info->icount.overrun) in line_info()
2581 seq_printf(m, " oe:%d", info->icount.overrun); in line_info()
2588 info->tx_active,info->bh_requested,info->bh_running, in line_info()
2589 info->pending_bh); in line_info()
2603 info = info->next_device; in mgslpc_proc_show()
2611 info->rx_buf_size = sizeof(RXBUF) + info->max_frame_size; in rx_alloc_buffers()
2614 info->rx_buf_total_size = info->rx_buf_size * 8; in rx_alloc_buffers()
2617 if (info->rx_buf_total_size > 0x10000) in rx_alloc_buffers()
2618 info->rx_buf_total_size = 0x10000; in rx_alloc_buffers()
2621 info->rx_buf_count = info->rx_buf_total_size / info->rx_buf_size; in rx_alloc_buffers()
2623 info->rx_buf = kmalloc(info->rx_buf_total_size, GFP_KERNEL); in rx_alloc_buffers()
2624 if (info->rx_buf == NULL) in rx_alloc_buffers()
2625 return -ENOMEM; in rx_alloc_buffers()
2628 info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL); in rx_alloc_buffers()
2629 if (!info->flag_buf) { in rx_alloc_buffers()
2630 kfree(info->rx_buf); in rx_alloc_buffers()
2631 info->rx_buf = NULL; in rx_alloc_buffers()
2632 return -ENOMEM; in rx_alloc_buffers()
2641 kfree(info->rx_buf); in rx_free_buffers()
2642 info->rx_buf = NULL; in rx_free_buffers()
2643 kfree(info->flag_buf); in rx_free_buffers()
2644 info->flag_buf = NULL; in rx_free_buffers()
2650 printk("Can't allocate rx buffer %s\n", info->device_name); in claim_resources()
2652 return -ENODEV; in claim_resources()
2660 printk("release_resources(%s)\n", info->device_name); in release_resources()
2675 info->next_device = NULL; in mgslpc_add_device()
2676 info->line = mgslpc_device_count; in mgslpc_add_device()
2677 sprintf(info->device_name,"ttySLP%d",info->line); in mgslpc_add_device()
2679 if (info->line < MAX_DEVICE_COUNT) { in mgslpc_add_device()
2680 if (maxframe[info->line]) in mgslpc_add_device()
2681 info->max_frame_size = maxframe[info->line]; in mgslpc_add_device()
2690 while (current_dev->next_device) in mgslpc_add_device()
2691 current_dev = current_dev->next_device; in mgslpc_add_device()
2692 current_dev->next_device = info; in mgslpc_add_device()
2695 if (info->max_frame_size < 4096) in mgslpc_add_device()
2696 info->max_frame_size = 4096; in mgslpc_add_device()
2697 else if (info->max_frame_size > 65535) in mgslpc_add_device()
2698 info->max_frame_size = 65535; in mgslpc_add_device()
2701 info->device_name, info->io_base, info->irq_level); in mgslpc_add_device()
2709 tty_dev = tty_port_register_device(&info->port, serial_driver, info->line, in mgslpc_add_device()
2710 &info->p_dev->dev); in mgslpc_add_device()
2723 current_dev->next_device = NULL; in mgslpc_add_device()
2726 mgslpc_device_count--; in mgslpc_add_device()
2738 last->next_device = info->next_device; in mgslpc_remove_device()
2740 mgslpc_device_list = info->next_device; in mgslpc_remove_device()
2741 tty_unregister_device(serial_driver, info->line); in mgslpc_remove_device()
2746 tty_port_destroy(&info->port); in mgslpc_remove_device()
2748 mgslpc_device_count--; in mgslpc_remove_device()
2752 info = info->next_device; in mgslpc_remove_device()
2815 serial_driver->driver_name = "synclink_cs"; in synclink_cs_init()
2816 serial_driver->name = "ttySLP"; in synclink_cs_init()
2817 serial_driver->major = ttymajor; in synclink_cs_init()
2818 serial_driver->minor_start = 64; in synclink_cs_init()
2819 serial_driver->type = TTY_DRIVER_TYPE_SERIAL; in synclink_cs_init()
2820 serial_driver->subtype = SERIAL_TYPE_NORMAL; in synclink_cs_init()
2821 serial_driver->init_termios = tty_std_termios; in synclink_cs_init()
2822 serial_driver->init_termios.c_cflag = in synclink_cs_init()
2838 serial_driver->major); in synclink_cs_init()
2875 N--; in mgslpc_set_rate()
2914 if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed) in enable_auxclk()
2935 * 04 ODS Output Driver Select, 1=TxD is push-pull output in enable_auxclk()
2950 * 01 C32, CRC select, 0=CRC-16, 1=CRC-32 in enable_auxclk()
2955 if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed) in enable_auxclk()
2974 * CTS transitions can be detected (requires TxC) in enable_auxclk()
2976 if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed) in enable_auxclk()
2977 mgslpc_set_rate(info, CHB, info->params.clock_speed); in enable_auxclk()
2995 if (info->params.clock_speed) in loopback_enable()
2996 mgslpc_set_rate(info, CHA, info->params.clock_speed); in loopback_enable()
3017 if (info->params.flags & HDLC_FLAG_RXC_DPLL in hdlc_mode()
3018 && info->params.flags & HDLC_FLAG_TXC_DPLL) { in hdlc_mode()
3021 } else if (info->params.flags & HDLC_FLAG_RXC_BRG in hdlc_mode()
3022 && info->params.flags & HDLC_FLAG_TXC_BRG) { in hdlc_mode()
3026 } else if (info->params.flags & HDLC_FLAG_RXC_DPLL) { in hdlc_mode()
3027 if (info->params.flags & HDLC_FLAG_TXC_BRG) { in hdlc_mode()
3035 } else if (info->params.flags & HDLC_FLAG_TXC_BRG) { in hdlc_mode()
3053 if (info->params.loopback) in hdlc_mode()
3057 if (info->serial_signals & SerialSignal_RTS) in hdlc_mode()
3072 switch (info->params.encoding) in hdlc_mode()
3094 * 04 ODS Output Driver Select, 1=TxD is push-pull output in hdlc_mode()
3110 * 01 C32, CRC select, 0=CRC-16, 1=CRC-32 in hdlc_mode()
3121 if (info->params.crc_type == HDLC_CRC_32_CCITT) in hdlc_mode()
3123 if (info->params.encoding == HDLC_ENCODING_NRZB) in hdlc_mode()
3140 if (info->params.crc_type == HDLC_CRC_NONE) in hdlc_mode()
3142 if (info->params.preamble != HDLC_PREAMBLE_PATTERN_NONE) in hdlc_mode()
3144 switch (info->params.preamble_length) in hdlc_mode()
3158 /* PRE - Preamble pattern */ in hdlc_mode()
3160 switch (info->params.preamble) in hdlc_mode()
3182 if (info->params.flags & HDLC_FLAG_RXC_DPLL) in hdlc_mode()
3183 mgslpc_set_rate(info, CHA, info->params.clock_speed * 16); in hdlc_mode()
3185 mgslpc_set_rate(info, CHA, info->params.clock_speed); in hdlc_mode()
3205 if (info->params.flags & HDLC_FLAG_AUTO_DCD) in hdlc_mode()
3209 if (info->params.loopback || info->testing_irq) in hdlc_mode()
3211 if (info->params.flags & HDLC_FLAG_AUTO_CTS) in hdlc_mode()
3214 /* PVR[3] 1=AUTO CTS active */ in hdlc_mode()
3236 if (!info->testing_irq) in hdlc_mode()
3249 __FILE__, __LINE__, info->device_name); in rx_stop()
3254 info->rx_enabled = false; in rx_stop()
3255 info->rx_overflow = false; in rx_stop()
3262 __FILE__, __LINE__, info->device_name); in rx_start()
3265 info->rx_enabled = false; in rx_start()
3266 info->rx_overflow = false; in rx_start()
3271 info->rx_enabled = true; in rx_start()
3278 __FILE__, __LINE__, info->device_name); in tx_start()
3280 if (info->tx_count) { in tx_start()
3284 info->drop_rts_on_tx_done = false; in tx_start()
3286 if (info->params.flags & HDLC_FLAG_AUTO_RTS) { in tx_start()
3288 if (!(info->serial_signals & SerialSignal_RTS)) { in tx_start()
3289 info->serial_signals |= SerialSignal_RTS; in tx_start()
3291 info->drop_rts_on_tx_done = true; in tx_start()
3295 if (info->params.mode == MGSL_MODE_ASYNC) { in tx_start()
3296 if (!info->tx_active) { in tx_start()
3297 info->tx_active = true; in tx_start()
3301 info->tx_active = true; in tx_start()
3303 mod_timer(&info->tx_timer, jiffies + in tx_start()
3308 if (!info->tx_enabled) in tx_start()
3309 info->tx_enabled = true; in tx_start()
3316 __FILE__, __LINE__, info->device_name); in tx_stop()
3318 del_timer(&info->tx_timer); in tx_stop()
3320 info->tx_enabled = false; in tx_stop()
3321 info->tx_active = false; in tx_stop()
3342 * 03 output, 1=AUTO CTS control enabled in reset_device()
3354 * 03 AUTO CTS output 1=enabled in reset_device()
3369 * 01..00 IC[1..0] Interrupt Config, 01=push-pull output, active low in reset_device()
3389 * 05 FCTS Flow Control on CTS in async_mode()
3399 if (info->params.loopback) in async_mode()
3403 if (!(info->serial_signals & SerialSignal_RTS)) in async_mode()
3422 * 04 ODS Output Driver Select, 1=TxD is push-pull output in async_mode()
3464 mgslpc_set_rate(info, CHA, info->params.data_rate * 16); in async_mode()
3477 if (info->params.data_bits != 8) in async_mode()
3479 if (info->params.stop_bits != 1) in async_mode()
3481 if (info->params.parity != ASYNC_PARITY_NONE) in async_mode()
3484 if (info->params.parity == ASYNC_PARITY_ODD) in async_mode()
3522 if (info->params.flags & HDLC_FLAG_AUTO_DCD) in async_mode()
3525 if (info->params.flags & HDLC_FLAG_AUTO_CTS) in async_mode()
3531 if (info->params.flags & HDLC_FLAG_AUTO_CTS) { in async_mode()
3533 /* PVR[3] 1=AUTO CTS active */ in async_mode()
3550 if (info->idle_mode == HDLC_TXIDLE_FLAGS) in tx_set_idle()
3563 info->serial_signals &= SerialSignal_RTS | SerialSignal_DTR; in get_signals()
3566 info->serial_signals |= SerialSignal_DCD; in get_signals()
3568 info->serial_signals |= SerialSignal_CTS; in get_signals()
3572 info->serial_signals |= SerialSignal_RI; in get_signals()
3574 info->serial_signals |= SerialSignal_DSR; in get_signals()
3585 if (info->params.mode == MGSL_MODE_ASYNC) { in set_signals()
3586 if (info->serial_signals & SerialSignal_RTS) in set_signals()
3591 if (info->serial_signals & SerialSignal_RTS) in set_signals()
3598 if (info->serial_signals & SerialSignal_DTR) in set_signals()
3609 info->rx_put = 0; in rx_reset_buffers()
3610 info->rx_get = 0; in rx_reset_buffers()
3611 info->rx_frame_count = 0; in rx_reset_buffers()
3612 for (i=0 ; i < info->rx_buf_count ; i++) { in rx_reset_buffers()
3613 buf = (RXBUF*)(info->rx_buf + (i * info->rx_buf_size)); in rx_reset_buffers()
3614 buf->status = buf->count = 0; in rx_reset_buffers()
3631 if (info->rx_frame_count == 0) in rx_get_frame()
3634 buf = (RXBUF*)(info->rx_buf + (info->rx_get * info->rx_buf_size)); in rx_get_frame()
3636 status = buf->status; in rx_get_frame()
3645 info->icount.rxabort++; in rx_get_frame()
3647 info->icount.rxover++; in rx_get_frame()
3649 info->icount.rxcrc++; in rx_get_frame()
3650 if (info->params.crc_type & HDLC_CRC_RETURN_EX) in rx_get_frame()
3656 info->netdev->stats.rx_errors++; in rx_get_frame()
3657 info->netdev->stats.rx_frame_errors++; in rx_get_frame()
3664 framesize = buf->count; in rx_get_frame()
3668 __FILE__, __LINE__, info->device_name, status, framesize); in rx_get_frame()
3671 trace_block(info, buf->data, framesize, 0); in rx_get_frame()
3674 if ((info->params.crc_type & HDLC_CRC_RETURN_EX && in rx_get_frame()
3675 framesize+1 > info->max_frame_size) || in rx_get_frame()
3676 framesize > info->max_frame_size) in rx_get_frame()
3677 info->icount.rxlong++; in rx_get_frame()
3680 info->icount.rxok++; in rx_get_frame()
3682 if (info->params.crc_type & HDLC_CRC_RETURN_EX) { in rx_get_frame()
3683 *(buf->data + framesize) = status & BIT5 ? RX_OK:RX_CRC_ERROR; in rx_get_frame()
3688 if (info->netcount) in rx_get_frame()
3689 hdlcdev_rx(info, buf->data, framesize); in rx_get_frame()
3692 ldisc_receive_buf(tty, buf->data, info->flag_buf, framesize); in rx_get_frame()
3696 spin_lock_irqsave(&info->lock, flags); in rx_get_frame()
3697 buf->status = buf->count = 0; in rx_get_frame()
3698 info->rx_frame_count--; in rx_get_frame()
3699 info->rx_get++; in rx_get_frame()
3700 if (info->rx_get >= info->rx_buf_count) in rx_get_frame()
3701 info->rx_get = 0; in rx_get_frame()
3702 spin_unlock_irqrestore(&info->lock, flags); in rx_get_frame()
3716 spin_lock_irqsave(&info->lock, flags); in register_test()
3729 spin_unlock_irqrestore(&info->lock, flags); in register_test()
3738 spin_lock_irqsave(&info->lock, flags); in irq_test()
3741 info->testing_irq = true; in irq_test()
3744 info->irq_occurred = false; in irq_test()
3752 spin_unlock_irqrestore(&info->lock, flags); in irq_test()
3755 while(end_time-- && !info->irq_occurred) { in irq_test()
3759 info->testing_irq = false; in irq_test()
3761 spin_lock_irqsave(&info->lock, flags); in irq_test()
3763 spin_unlock_irqrestore(&info->lock, flags); in irq_test()
3765 return info->irq_occurred; in irq_test()
3771 info->init_error = DiagStatus_AddressFailure; in adapter_test()
3773 __FILE__, __LINE__, info->device_name, (unsigned short)(info->io_base)); in adapter_test()
3774 return -ENODEV; in adapter_test()
3778 info->init_error = DiagStatus_IrqFailure; in adapter_test()
3780 __FILE__, __LINE__, info->device_name, (unsigned short)(info->irq_level)); in adapter_test()
3781 return -ENODEV; in adapter_test()
3786 __FILE__, __LINE__, info->device_name); in adapter_test()
3795 printk("%s tx data:\n", info->device_name); in trace_block()
3797 printk("%s rx data:\n", info->device_name); in trace_block()
3818 count -= linecount; in trace_block()
3832 __FILE__, __LINE__, info->device_name); in tx_timeout()
3833 if (info->tx_active && in tx_timeout()
3834 info->params.mode == MGSL_MODE_HDLC) { in tx_timeout()
3835 info->icount.txtimeout++; in tx_timeout()
3837 spin_lock_irqsave(&info->lock, flags); in tx_timeout()
3838 info->tx_active = false; in tx_timeout()
3839 info->tx_count = info->tx_put = info->tx_get = 0; in tx_timeout()
3841 spin_unlock_irqrestore(&info->lock, flags); in tx_timeout()
3844 if (info->netcount) in tx_timeout()
3849 struct tty_struct *tty = tty_port_tty_get(&info->port); in tx_timeout()
3876 if (info->port.count) in hdlcdev_attach()
3877 return -EBUSY; in hdlcdev_attach()
3886 default: return -EINVAL; in hdlcdev_attach()
3894 default: return -EINVAL; in hdlcdev_attach()
3897 info->params.encoding = new_encoding; in hdlcdev_attach()
3898 info->params.crc_type = new_crctype; in hdlcdev_attach()
3901 if (info->netcount) { in hdlcdev_attach()
3902 tty = tty_port_tty_get(&info->port); in hdlcdev_attach()
3923 printk(KERN_INFO "%s:hdlc_xmit(%s)\n", __FILE__, dev->name); in hdlcdev_xmit()
3929 skb_copy_from_linear_data(skb, info->tx_buf, skb->len); in hdlcdev_xmit()
3930 info->tx_get = 0; in hdlcdev_xmit()
3931 info->tx_put = info->tx_count = skb->len; in hdlcdev_xmit()
3934 dev->stats.tx_packets++; in hdlcdev_xmit()
3935 dev->stats.tx_bytes += skb->len; in hdlcdev_xmit()
3944 spin_lock_irqsave(&info->lock, flags); in hdlcdev_xmit()
3945 if (!info->tx_active) { in hdlcdev_xmit()
3946 struct tty_struct *tty = tty_port_tty_get(&info->port); in hdlcdev_xmit()
3950 spin_unlock_irqrestore(&info->lock, flags); in hdlcdev_xmit()
3971 printk("%s:hdlcdev_open(%s)\n", __FILE__, dev->name); in hdlcdev_open()
3979 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_open()
3980 if (info->port.count != 0 || info->netcount != 0) { in hdlcdev_open()
3981 printk(KERN_WARNING "%s: hdlc_open returning busy\n", dev->name); in hdlcdev_open()
3982 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
3983 return -EBUSY; in hdlcdev_open()
3985 info->netcount=1; in hdlcdev_open()
3986 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
3988 tty = tty_port_tty_get(&info->port); in hdlcdev_open()
3993 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_open()
3994 info->netcount=0; in hdlcdev_open()
3995 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
3999 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in hdlcdev_open()
4008 spin_lock_irqsave(&info->lock, flags); in hdlcdev_open()
4010 spin_unlock_irqrestore(&info->lock, flags); in hdlcdev_open()
4011 if (info->serial_signals & SerialSignal_DCD) in hdlcdev_open()
4029 struct tty_struct *tty = tty_port_tty_get(&info->port); in hdlcdev_close()
4033 printk("%s:hdlcdev_close(%s)\n", __FILE__, dev->name); in hdlcdev_close()
4042 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_close()
4043 info->netcount=0; in hdlcdev_close()
4044 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_close()
4061 sync_serial_settings __user *line = ifs->ifs_ifsu.sync; in hdlcdev_wan_ioctl()
4066 printk("%s:hdlcdev_ioctl(%s)\n", __FILE__, dev->name); in hdlcdev_wan_ioctl()
4069 if (info->port.count) in hdlcdev_wan_ioctl()
4070 return -EBUSY; in hdlcdev_wan_ioctl()
4074 switch (ifs->type) { in hdlcdev_wan_ioctl()
4077 ifs->type = IF_IFACE_SYNC_SERIAL; in hdlcdev_wan_ioctl()
4078 if (ifs->size < size) { in hdlcdev_wan_ioctl()
4079 ifs->size = size; /* data size wanted */ in hdlcdev_wan_ioctl()
4080 return -ENOBUFS; in hdlcdev_wan_ioctl()
4083 flags = info->params.flags & (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL | in hdlcdev_wan_ioctl()
4096 new_line.clock_rate = info->params.clock_speed; in hdlcdev_wan_ioctl()
4097 new_line.loopback = info->params.loopback ? 1:0; in hdlcdev_wan_ioctl()
4100 return -EFAULT; in hdlcdev_wan_ioctl()
4106 return -EPERM; in hdlcdev_wan_ioctl()
4108 return -EFAULT; in hdlcdev_wan_ioctl()
4116 case CLOCK_DEFAULT: flags = info->params.flags & in hdlcdev_wan_ioctl()
4121 default: return -EINVAL; in hdlcdev_wan_ioctl()
4125 return -EINVAL; in hdlcdev_wan_ioctl()
4127 info->params.flags &= ~(HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL | in hdlcdev_wan_ioctl()
4131 info->params.flags |= flags; in hdlcdev_wan_ioctl()
4133 info->params.loopback = new_line.loopback; in hdlcdev_wan_ioctl()
4136 info->params.clock_speed = new_line.clock_rate; in hdlcdev_wan_ioctl()
4138 info->params.clock_speed = 0; in hdlcdev_wan_ioctl()
4141 if (info->netcount) { in hdlcdev_wan_ioctl()
4142 struct tty_struct *tty = tty_port_tty_get(&info->port); in hdlcdev_wan_ioctl()
4163 printk("hdlcdev_tx_timeout(%s)\n", dev->name); in hdlcdev_tx_timeout()
4165 dev->stats.tx_errors++; in hdlcdev_tx_timeout()
4166 dev->stats.tx_aborted_errors++; in hdlcdev_tx_timeout()
4168 spin_lock_irqsave(&info->lock, flags); in hdlcdev_tx_timeout()
4170 spin_unlock_irqrestore(&info->lock, flags); in hdlcdev_tx_timeout()
4183 if (netif_queue_stopped(info->netdev)) in hdlcdev_tx_done()
4184 netif_wake_queue(info->netdev); in hdlcdev_tx_done()
4198 struct net_device *dev = info->netdev; in hdlcdev_rx()
4201 printk("hdlcdev_rx(%s)\n", dev->name); in hdlcdev_rx()
4204 printk(KERN_NOTICE "%s: can't alloc skb, dropping packet\n", dev->name); in hdlcdev_rx()
4205 dev->stats.rx_dropped++; in hdlcdev_rx()
4211 skb->protocol = hdlc_type_trans(skb, dev); in hdlcdev_rx()
4213 dev->stats.rx_packets++; in hdlcdev_rx()
4214 dev->stats.rx_bytes += size; in hdlcdev_rx()
4246 return -ENOMEM; in hdlcdev_init()
4250 dev->base_addr = info->io_base; in hdlcdev_init()
4251 dev->irq = info->irq_level; in hdlcdev_init()
4254 dev->netdev_ops = &hdlcdev_ops; in hdlcdev_init()
4255 dev->watchdog_timeo = 10 * HZ; in hdlcdev_init()
4256 dev->tx_queue_len = 50; in hdlcdev_init()
4260 hdlc->attach = hdlcdev_attach; in hdlcdev_init()
4261 hdlc->xmit = hdlcdev_xmit; in hdlcdev_init()
4271 info->netdev = dev; in hdlcdev_init()
4283 unregister_hdlc_device(info->netdev); in hdlcdev_exit()
4284 free_netdev(info->netdev); in hdlcdev_exit()
4285 info->netdev = NULL; in hdlcdev_exit()