Loading drivers/char/isicom.c +79 −102 Original line number Diff line number Diff line Loading @@ -198,17 +198,12 @@ struct isi_board { struct isi_port { unsigned short magic; unsigned int flags; int count; int blocked_open; struct tty_port port; int close_delay; u16 channel; u16 status; u16 closing_wait; struct isi_board *card; struct tty_struct *tty; wait_queue_head_t close_wait; wait_queue_head_t open_wait; unsigned char *xmit_buf; int xmit_head; int xmit_tail; Loading Loading @@ -430,11 +425,11 @@ static void isicom_tx(unsigned long _data) for (; count > 0; count--, port++) { /* port not active or tx disabled to force flow control */ if (!(port->flags & ASYNC_INITIALIZED) || if (!(port->port.flags & ASYNC_INITIALIZED) || !(port->status & ISI_TXOK)) continue; tty = port->tty; tty = port->port.tty; if (tty == NULL) continue; Loading @@ -458,7 +453,7 @@ static void isicom_tx(unsigned long _data) if (residue == YES) { residue = NO; if (cnt > 0) { wrd |= (port->xmit_buf[port->xmit_tail] wrd |= (port->port.xmit_buf[port->xmit_tail] << 8); port->xmit_tail = (port->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); Loading @@ -474,14 +469,14 @@ static void isicom_tx(unsigned long _data) if (cnt <= 0) break; word_count = cnt >> 1; outsw(base, port->xmit_buf+port->xmit_tail, word_count); outsw(base, port->port.xmit_buf+port->xmit_tail, word_count); port->xmit_tail = (port->xmit_tail + (word_count << 1)) & (SERIAL_XMIT_SIZE - 1); txcount -= (word_count << 1); port->xmit_cnt -= (word_count << 1); if (cnt & 0x0001) { residue = YES; wrd = port->xmit_buf[port->xmit_tail]; wrd = port->port.xmit_buf[port->xmit_tail]; port->xmit_tail = (port->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); port->xmit_cnt--; Loading Loading @@ -548,13 +543,13 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } port = card->ports + channel; if (!(port->flags & ASYNC_INITIALIZED)) { if (!(port->port.flags & ASYNC_INITIALIZED)) { outw(0x0000, base+0x04); /* enable interrupts */ spin_unlock(&card->card_lock); return IRQ_HANDLED; } tty = port->tty; tty = port->port.tty; if (tty == NULL) { word_count = byte_count >> 1; while (byte_count > 1) { Loading @@ -572,7 +567,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) header = inw(base); switch (header & 0xff) { case 0: /* Change in EIA signals */ if (port->flags & ASYNC_CHECK_CD) { if (port->port.flags & ASYNC_CHECK_CD) { if (port->status & ISI_DCD) { if (!(header & ISI_DCD)) { /* Carrier has been lost */ Loading @@ -585,7 +580,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) /* Carrier has been detected */ pr_dbg("interrupt: DCD->high.\n"); port->status |= ISI_DCD; wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->port.open_wait); } } else { if (header & ISI_DCD) Loading @@ -594,17 +589,17 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) port->status &= ~ISI_DCD; } if (port->flags & ASYNC_CTS_FLOW) { if (port->tty->hw_stopped) { if (port->port.flags & ASYNC_CTS_FLOW) { if (port->port.tty->hw_stopped) { if (header & ISI_CTS) { port->tty->hw_stopped = 0; port->port.tty->hw_stopped = 0; /* start tx ing */ port->status |= (ISI_TXOK | ISI_CTS); tty_wakeup(tty); } } else if (!(header & ISI_CTS)) { port->tty->hw_stopped = 1; port->port.tty->hw_stopped = 1; /* stop tx ing */ port->status &= ~(ISI_TXOK | ISI_CTS); } Loading @@ -629,7 +624,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) case 1: /* Received Break !!! */ tty_insert_flip_char(tty, 0, TTY_BREAK); if (port->flags & ASYNC_SAK) if (port->port.flags & ASYNC_SAK) do_SAK(tty); tty_flip_buffer_push(tty); break; Loading Loading @@ -681,7 +676,7 @@ static void isicom_config_port(struct isi_port *port) shift_count = card->shift_count; unsigned char flow_ctrl; tty = port->tty; tty = port->port.tty; if (tty == NULL) return; Loading @@ -697,7 +692,7 @@ static void isicom_config_port(struct isi_port *port) /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */ if (baud < 1 || baud > 4) port->tty->termios->c_cflag &= ~CBAUDEX; port->port.tty->termios->c_cflag &= ~CBAUDEX; else baud += 15; } Loading @@ -708,13 +703,13 @@ static void isicom_config_port(struct isi_port *port) * the 'setserial' utility. */ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) baud++; /* 57.6 Kbps */ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) baud += 2; /* 115 Kbps */ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) baud += 3; /* 230 kbps*/ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) baud += 4; /* 460 kbps*/ } if (linuxb_to_isib[baud] == -1) { Loading Loading @@ -754,15 +749,15 @@ static void isicom_config_port(struct isi_port *port) InterruptTheCard(base); } if (C_CLOCAL(tty)) port->flags &= ~ASYNC_CHECK_CD; port->port.flags &= ~ASYNC_CHECK_CD; else port->flags |= ASYNC_CHECK_CD; port->port.flags |= ASYNC_CHECK_CD; /* flow control settings ...*/ flow_ctrl = 0; port->flags &= ~ASYNC_CTS_FLOW; port->port.flags &= ~ASYNC_CTS_FLOW; if (C_CRTSCTS(tty)) { port->flags |= ASYNC_CTS_FLOW; port->port.flags |= ASYNC_CTS_FLOW; flow_ctrl |= ISICOM_CTSRTS; } if (I_IXON(tty)) Loading Loading @@ -809,23 +804,15 @@ static int isicom_setup_port(struct isi_port *port) struct isi_board *card = port->card; unsigned long flags; if (port->flags & ASYNC_INITIALIZED) if (port->port.flags & ASYNC_INITIALIZED) return 0; if (!port->xmit_buf) { /* Relies on BKL */ unsigned long page = get_zeroed_page(GFP_KERNEL); if (page == 0) if (tty_port_alloc_xmit_buf(&port->port) < 0) return -ENOMEM; if (port->xmit_buf) free_page(page); else port->xmit_buf = (unsigned char *) page; } spin_lock_irqsave(&card->card_lock, flags); if (port->tty) clear_bit(TTY_IO_ERROR, &port->tty->flags); if (port->count == 1) if (port->port.tty) clear_bit(TTY_IO_ERROR, &port->port.tty->flags); if (port->port.count == 1) card->count++; port->xmit_cnt = port->xmit_head = port->xmit_tail = 0; Loading @@ -839,7 +826,7 @@ static int isicom_setup_port(struct isi_port *port) } isicom_config_port(port); port->flags |= ASYNC_INITIALIZED; port->port.flags |= ASYNC_INITIALIZED; spin_unlock_irqrestore(&card->card_lock, flags); return 0; Loading @@ -855,10 +842,10 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, /* block if port is in the process of being closed */ if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) { if (tty_hung_up_p(filp) || port->port.flags & ASYNC_CLOSING) { pr_dbg("block_til_ready: close in progress.\n"); interruptible_sleep_on(&port->close_wait); if (port->flags & ASYNC_HUP_NOTIFY) interruptible_sleep_on(&port->port.close_wait); if (port->port.flags & ASYNC_HUP_NOTIFY) return -EAGAIN; else return -ERESTARTSYS; Loading @@ -869,7 +856,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, if ((filp->f_flags & O_NONBLOCK) || (tty->flags & (1 << TTY_IO_ERROR))) { pr_dbg("block_til_ready: non-block mode.\n"); port->flags |= ASYNC_NORMAL_ACTIVE; port->port.flags |= ASYNC_NORMAL_ACTIVE; return 0; } Loading @@ -879,26 +866,26 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, /* block waiting for DCD to be asserted, and while callout dev is busy */ retval = 0; add_wait_queue(&port->open_wait, &wait); add_wait_queue(&port->port.open_wait, &wait); spin_lock_irqsave(&card->card_lock, flags); if (!tty_hung_up_p(filp)) port->count--; port->blocked_open++; port->port.count--; port->port.blocked_open++; spin_unlock_irqrestore(&card->card_lock, flags); while (1) { raise_dtr_rts(port); set_current_state(TASK_INTERRUPTIBLE); if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) { if (port->flags & ASYNC_HUP_NOTIFY) if (tty_hung_up_p(filp) || !(port->port.flags & ASYNC_INITIALIZED)) { if (port->port.flags & ASYNC_HUP_NOTIFY) retval = -EAGAIN; else retval = -ERESTARTSYS; break; } if (!(port->flags & ASYNC_CLOSING) && if (!(port->port.flags & ASYNC_CLOSING) && (do_clocal || (port->status & ISI_DCD))) { break; } Loading @@ -909,15 +896,15 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, schedule(); } set_current_state(TASK_RUNNING); remove_wait_queue(&port->open_wait, &wait); remove_wait_queue(&port->port.open_wait, &wait); spin_lock_irqsave(&card->card_lock, flags); if (!tty_hung_up_p(filp)) port->count++; port->blocked_open--; port->port.count++; port->port.blocked_open--; spin_unlock_irqrestore(&card->card_lock, flags); if (retval) return retval; port->flags |= ASYNC_NORMAL_ACTIVE; port->port.flags |= ASYNC_NORMAL_ACTIVE; return 0; } Loading Loading @@ -947,9 +934,9 @@ static int isicom_open(struct tty_struct *tty, struct file *filp) isicom_setup_board(card); port->count++; port->port.count++; tty->driver_data = port; port->tty = tty; port->port.tty = tty; error = isicom_setup_port(port); if (error == 0) error = block_til_ready(tty, filp, port); Loading @@ -970,18 +957,15 @@ static void isicom_shutdown_port(struct isi_port *port) struct isi_board *card = port->card; struct tty_struct *tty; tty = port->tty; tty = port->port.tty; if (!(port->flags & ASYNC_INITIALIZED)) if (!(port->port.flags & ASYNC_INITIALIZED)) return; if (port->xmit_buf) { free_page((unsigned long) port->xmit_buf); port->xmit_buf = NULL; } port->flags &= ~ASYNC_INITIALIZED; tty_port_free_xmit_buf(&port->port); port->port.flags &= ~ASYNC_INITIALIZED; /* 3rd October 2000 : Vinayak P Risbud */ port->tty = NULL; port->port.tty = NULL; /*Fix done by Anil .S on 30-04-2001 remote login through isi port has dtr toggle problem Loading Loading @@ -1046,24 +1030,24 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) return; } if (tty->count == 1 && port->count != 1) { if (tty->count == 1 && port->port.count != 1) { printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port " "count tty->count = 1 port count = %d.\n", card->base, port->count); port->count = 1; card->base, port->port.count); port->port.count = 1; } if (--port->count < 0) { if (--port->port.count < 0) { printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port " "count for channel%d = %d", card->base, port->channel, port->count); port->count = 0; port->port.count); port->port.count = 0; } if (port->count) { if (port->port.count) { spin_unlock_irqrestore(&card->card_lock, flags); return; } port->flags |= ASYNC_CLOSING; port->port.flags |= ASYNC_CLOSING; tty->closing = 1; spin_unlock_irqrestore(&card->card_lock, flags); Loading @@ -1072,7 +1056,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) /* indicate to the card that no more data can be received on this port */ spin_lock_irqsave(&card->card_lock, flags); if (port->flags & ASYNC_INITIALIZED) { if (port->port.flags & ASYNC_INITIALIZED) { card->port_status &= ~(1 << port->channel); outw(card->port_status, card->base + 0x02); } Loading @@ -1085,7 +1069,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) spin_lock_irqsave(&card->card_lock, flags); tty->closing = 0; if (port->blocked_open) { if (port->port.blocked_open) { spin_unlock_irqrestore(&card->card_lock, flags); if (port->close_delay) { pr_dbg("scheduling until time out.\n"); Loading @@ -1093,10 +1077,10 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) jiffies_to_msecs(port->close_delay)); } spin_lock_irqsave(&card->card_lock, flags); wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->port.open_wait); } port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING); wake_up_interruptible(&port->close_wait); port->port.flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING); wake_up_interruptible(&port->port.close_wait); spin_unlock_irqrestore(&card->card_lock, flags); } Loading @@ -1112,9 +1096,6 @@ static int isicom_write(struct tty_struct *tty, const unsigned char *buf, if (isicom_paranoia_check(port, tty->name, "isicom_write")) return 0; if (!port->xmit_buf) return 0; spin_lock_irqsave(&card->card_lock, flags); while (1) { Loading @@ -1123,7 +1104,7 @@ static int isicom_write(struct tty_struct *tty, const unsigned char *buf, if (cnt <= 0) break; memcpy(port->xmit_buf + port->xmit_head, buf, cnt); memcpy(port->port.xmit_buf + port->xmit_head, buf, cnt); port->xmit_head = (port->xmit_head + cnt) & (SERIAL_XMIT_SIZE - 1); port->xmit_cnt += cnt; Loading @@ -1147,16 +1128,13 @@ static int isicom_put_char(struct tty_struct *tty, unsigned char ch) if (isicom_paranoia_check(port, tty->name, "isicom_put_char")) return 0; if (!port->xmit_buf) return 0; spin_lock_irqsave(&card->card_lock, flags); if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) { spin_unlock_irqrestore(&card->card_lock, flags); return 0; } port->xmit_buf[port->xmit_head++] = ch; port->port.xmit_buf[port->xmit_head++] = ch; port->xmit_head &= (SERIAL_XMIT_SIZE - 1); port->xmit_cnt++; spin_unlock_irqrestore(&card->card_lock, flags); Loading @@ -1172,7 +1150,7 @@ static void isicom_flush_chars(struct tty_struct *tty) return; if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || !port->xmit_buf) !port->port.xmit_buf) return; /* this tells the transmitter to consider this port for Loading Loading @@ -1274,23 +1252,23 @@ static int isicom_set_serial_info(struct isi_port *port, lock_kernel(); reconfig_port = ((port->flags & ASYNC_SPD_MASK) != reconfig_port = ((port->port.flags & ASYNC_SPD_MASK) != (newinfo.flags & ASYNC_SPD_MASK)); if (!capable(CAP_SYS_ADMIN)) { if ((newinfo.close_delay != port->close_delay) || (newinfo.closing_wait != port->closing_wait) || ((newinfo.flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) { (port->port.flags & ~ASYNC_USR_MASK))) { unlock_kernel(); return -EPERM; } port->flags = ((port->flags & ~ASYNC_USR_MASK) | port->port.flags = ((port->port.flags & ~ASYNC_USR_MASK) | (newinfo.flags & ASYNC_USR_MASK)); } else { port->close_delay = newinfo.close_delay; port->closing_wait = newinfo.closing_wait; port->flags = ((port->flags & ~ASYNC_FLAGS) | port->port.flags = ((port->port.flags & ~ASYNC_FLAGS) | (newinfo.flags & ASYNC_FLAGS)); } if (reconfig_port) { Loading @@ -1314,7 +1292,7 @@ static int isicom_get_serial_info(struct isi_port *port, out_info.line = port - isi_ports; out_info.port = port->card->base; out_info.irq = port->card->irq; out_info.flags = port->flags; out_info.flags = port->port.flags; /* out_info.baud_base = ? */ out_info.close_delay = port->close_delay; out_info.closing_wait = port->closing_wait; Loading Loading @@ -1454,10 +1432,10 @@ static void isicom_hangup(struct tty_struct *tty) isicom_shutdown_port(port); spin_unlock_irqrestore(&port->card->card_lock, flags); port->count = 0; port->flags &= ~ASYNC_NORMAL_ACTIVE; port->tty = NULL; wake_up_interruptible(&port->open_wait); port->port.count = 0; port->port.flags &= ~ASYNC_NORMAL_ACTIVE; port->port.tty = NULL; wake_up_interruptible(&port->port.open_wait); } Loading Loading @@ -1832,8 +1810,7 @@ static int __init isicom_init(void) port->close_delay = 50 * HZ/100; port->closing_wait = 3000 * HZ/100; port->status = 0; init_waitqueue_head(&port->open_wait); init_waitqueue_head(&port->close_wait); tty_port_init(&port->port); /* . . . */ } isi_card[idx].base = 0; Loading Loading
drivers/char/isicom.c +79 −102 Original line number Diff line number Diff line Loading @@ -198,17 +198,12 @@ struct isi_board { struct isi_port { unsigned short magic; unsigned int flags; int count; int blocked_open; struct tty_port port; int close_delay; u16 channel; u16 status; u16 closing_wait; struct isi_board *card; struct tty_struct *tty; wait_queue_head_t close_wait; wait_queue_head_t open_wait; unsigned char *xmit_buf; int xmit_head; int xmit_tail; Loading Loading @@ -430,11 +425,11 @@ static void isicom_tx(unsigned long _data) for (; count > 0; count--, port++) { /* port not active or tx disabled to force flow control */ if (!(port->flags & ASYNC_INITIALIZED) || if (!(port->port.flags & ASYNC_INITIALIZED) || !(port->status & ISI_TXOK)) continue; tty = port->tty; tty = port->port.tty; if (tty == NULL) continue; Loading @@ -458,7 +453,7 @@ static void isicom_tx(unsigned long _data) if (residue == YES) { residue = NO; if (cnt > 0) { wrd |= (port->xmit_buf[port->xmit_tail] wrd |= (port->port.xmit_buf[port->xmit_tail] << 8); port->xmit_tail = (port->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); Loading @@ -474,14 +469,14 @@ static void isicom_tx(unsigned long _data) if (cnt <= 0) break; word_count = cnt >> 1; outsw(base, port->xmit_buf+port->xmit_tail, word_count); outsw(base, port->port.xmit_buf+port->xmit_tail, word_count); port->xmit_tail = (port->xmit_tail + (word_count << 1)) & (SERIAL_XMIT_SIZE - 1); txcount -= (word_count << 1); port->xmit_cnt -= (word_count << 1); if (cnt & 0x0001) { residue = YES; wrd = port->xmit_buf[port->xmit_tail]; wrd = port->port.xmit_buf[port->xmit_tail]; port->xmit_tail = (port->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); port->xmit_cnt--; Loading Loading @@ -548,13 +543,13 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } port = card->ports + channel; if (!(port->flags & ASYNC_INITIALIZED)) { if (!(port->port.flags & ASYNC_INITIALIZED)) { outw(0x0000, base+0x04); /* enable interrupts */ spin_unlock(&card->card_lock); return IRQ_HANDLED; } tty = port->tty; tty = port->port.tty; if (tty == NULL) { word_count = byte_count >> 1; while (byte_count > 1) { Loading @@ -572,7 +567,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) header = inw(base); switch (header & 0xff) { case 0: /* Change in EIA signals */ if (port->flags & ASYNC_CHECK_CD) { if (port->port.flags & ASYNC_CHECK_CD) { if (port->status & ISI_DCD) { if (!(header & ISI_DCD)) { /* Carrier has been lost */ Loading @@ -585,7 +580,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) /* Carrier has been detected */ pr_dbg("interrupt: DCD->high.\n"); port->status |= ISI_DCD; wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->port.open_wait); } } else { if (header & ISI_DCD) Loading @@ -594,17 +589,17 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) port->status &= ~ISI_DCD; } if (port->flags & ASYNC_CTS_FLOW) { if (port->tty->hw_stopped) { if (port->port.flags & ASYNC_CTS_FLOW) { if (port->port.tty->hw_stopped) { if (header & ISI_CTS) { port->tty->hw_stopped = 0; port->port.tty->hw_stopped = 0; /* start tx ing */ port->status |= (ISI_TXOK | ISI_CTS); tty_wakeup(tty); } } else if (!(header & ISI_CTS)) { port->tty->hw_stopped = 1; port->port.tty->hw_stopped = 1; /* stop tx ing */ port->status &= ~(ISI_TXOK | ISI_CTS); } Loading @@ -629,7 +624,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id) case 1: /* Received Break !!! */ tty_insert_flip_char(tty, 0, TTY_BREAK); if (port->flags & ASYNC_SAK) if (port->port.flags & ASYNC_SAK) do_SAK(tty); tty_flip_buffer_push(tty); break; Loading Loading @@ -681,7 +676,7 @@ static void isicom_config_port(struct isi_port *port) shift_count = card->shift_count; unsigned char flow_ctrl; tty = port->tty; tty = port->port.tty; if (tty == NULL) return; Loading @@ -697,7 +692,7 @@ static void isicom_config_port(struct isi_port *port) /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */ if (baud < 1 || baud > 4) port->tty->termios->c_cflag &= ~CBAUDEX; port->port.tty->termios->c_cflag &= ~CBAUDEX; else baud += 15; } Loading @@ -708,13 +703,13 @@ static void isicom_config_port(struct isi_port *port) * the 'setserial' utility. */ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) baud++; /* 57.6 Kbps */ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) baud += 2; /* 115 Kbps */ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) baud += 3; /* 230 kbps*/ if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) baud += 4; /* 460 kbps*/ } if (linuxb_to_isib[baud] == -1) { Loading Loading @@ -754,15 +749,15 @@ static void isicom_config_port(struct isi_port *port) InterruptTheCard(base); } if (C_CLOCAL(tty)) port->flags &= ~ASYNC_CHECK_CD; port->port.flags &= ~ASYNC_CHECK_CD; else port->flags |= ASYNC_CHECK_CD; port->port.flags |= ASYNC_CHECK_CD; /* flow control settings ...*/ flow_ctrl = 0; port->flags &= ~ASYNC_CTS_FLOW; port->port.flags &= ~ASYNC_CTS_FLOW; if (C_CRTSCTS(tty)) { port->flags |= ASYNC_CTS_FLOW; port->port.flags |= ASYNC_CTS_FLOW; flow_ctrl |= ISICOM_CTSRTS; } if (I_IXON(tty)) Loading Loading @@ -809,23 +804,15 @@ static int isicom_setup_port(struct isi_port *port) struct isi_board *card = port->card; unsigned long flags; if (port->flags & ASYNC_INITIALIZED) if (port->port.flags & ASYNC_INITIALIZED) return 0; if (!port->xmit_buf) { /* Relies on BKL */ unsigned long page = get_zeroed_page(GFP_KERNEL); if (page == 0) if (tty_port_alloc_xmit_buf(&port->port) < 0) return -ENOMEM; if (port->xmit_buf) free_page(page); else port->xmit_buf = (unsigned char *) page; } spin_lock_irqsave(&card->card_lock, flags); if (port->tty) clear_bit(TTY_IO_ERROR, &port->tty->flags); if (port->count == 1) if (port->port.tty) clear_bit(TTY_IO_ERROR, &port->port.tty->flags); if (port->port.count == 1) card->count++; port->xmit_cnt = port->xmit_head = port->xmit_tail = 0; Loading @@ -839,7 +826,7 @@ static int isicom_setup_port(struct isi_port *port) } isicom_config_port(port); port->flags |= ASYNC_INITIALIZED; port->port.flags |= ASYNC_INITIALIZED; spin_unlock_irqrestore(&card->card_lock, flags); return 0; Loading @@ -855,10 +842,10 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, /* block if port is in the process of being closed */ if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) { if (tty_hung_up_p(filp) || port->port.flags & ASYNC_CLOSING) { pr_dbg("block_til_ready: close in progress.\n"); interruptible_sleep_on(&port->close_wait); if (port->flags & ASYNC_HUP_NOTIFY) interruptible_sleep_on(&port->port.close_wait); if (port->port.flags & ASYNC_HUP_NOTIFY) return -EAGAIN; else return -ERESTARTSYS; Loading @@ -869,7 +856,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, if ((filp->f_flags & O_NONBLOCK) || (tty->flags & (1 << TTY_IO_ERROR))) { pr_dbg("block_til_ready: non-block mode.\n"); port->flags |= ASYNC_NORMAL_ACTIVE; port->port.flags |= ASYNC_NORMAL_ACTIVE; return 0; } Loading @@ -879,26 +866,26 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, /* block waiting for DCD to be asserted, and while callout dev is busy */ retval = 0; add_wait_queue(&port->open_wait, &wait); add_wait_queue(&port->port.open_wait, &wait); spin_lock_irqsave(&card->card_lock, flags); if (!tty_hung_up_p(filp)) port->count--; port->blocked_open++; port->port.count--; port->port.blocked_open++; spin_unlock_irqrestore(&card->card_lock, flags); while (1) { raise_dtr_rts(port); set_current_state(TASK_INTERRUPTIBLE); if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) { if (port->flags & ASYNC_HUP_NOTIFY) if (tty_hung_up_p(filp) || !(port->port.flags & ASYNC_INITIALIZED)) { if (port->port.flags & ASYNC_HUP_NOTIFY) retval = -EAGAIN; else retval = -ERESTARTSYS; break; } if (!(port->flags & ASYNC_CLOSING) && if (!(port->port.flags & ASYNC_CLOSING) && (do_clocal || (port->status & ISI_DCD))) { break; } Loading @@ -909,15 +896,15 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, schedule(); } set_current_state(TASK_RUNNING); remove_wait_queue(&port->open_wait, &wait); remove_wait_queue(&port->port.open_wait, &wait); spin_lock_irqsave(&card->card_lock, flags); if (!tty_hung_up_p(filp)) port->count++; port->blocked_open--; port->port.count++; port->port.blocked_open--; spin_unlock_irqrestore(&card->card_lock, flags); if (retval) return retval; port->flags |= ASYNC_NORMAL_ACTIVE; port->port.flags |= ASYNC_NORMAL_ACTIVE; return 0; } Loading Loading @@ -947,9 +934,9 @@ static int isicom_open(struct tty_struct *tty, struct file *filp) isicom_setup_board(card); port->count++; port->port.count++; tty->driver_data = port; port->tty = tty; port->port.tty = tty; error = isicom_setup_port(port); if (error == 0) error = block_til_ready(tty, filp, port); Loading @@ -970,18 +957,15 @@ static void isicom_shutdown_port(struct isi_port *port) struct isi_board *card = port->card; struct tty_struct *tty; tty = port->tty; tty = port->port.tty; if (!(port->flags & ASYNC_INITIALIZED)) if (!(port->port.flags & ASYNC_INITIALIZED)) return; if (port->xmit_buf) { free_page((unsigned long) port->xmit_buf); port->xmit_buf = NULL; } port->flags &= ~ASYNC_INITIALIZED; tty_port_free_xmit_buf(&port->port); port->port.flags &= ~ASYNC_INITIALIZED; /* 3rd October 2000 : Vinayak P Risbud */ port->tty = NULL; port->port.tty = NULL; /*Fix done by Anil .S on 30-04-2001 remote login through isi port has dtr toggle problem Loading Loading @@ -1046,24 +1030,24 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) return; } if (tty->count == 1 && port->count != 1) { if (tty->count == 1 && port->port.count != 1) { printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port " "count tty->count = 1 port count = %d.\n", card->base, port->count); port->count = 1; card->base, port->port.count); port->port.count = 1; } if (--port->count < 0) { if (--port->port.count < 0) { printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port " "count for channel%d = %d", card->base, port->channel, port->count); port->count = 0; port->port.count); port->port.count = 0; } if (port->count) { if (port->port.count) { spin_unlock_irqrestore(&card->card_lock, flags); return; } port->flags |= ASYNC_CLOSING; port->port.flags |= ASYNC_CLOSING; tty->closing = 1; spin_unlock_irqrestore(&card->card_lock, flags); Loading @@ -1072,7 +1056,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) /* indicate to the card that no more data can be received on this port */ spin_lock_irqsave(&card->card_lock, flags); if (port->flags & ASYNC_INITIALIZED) { if (port->port.flags & ASYNC_INITIALIZED) { card->port_status &= ~(1 << port->channel); outw(card->port_status, card->base + 0x02); } Loading @@ -1085,7 +1069,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) spin_lock_irqsave(&card->card_lock, flags); tty->closing = 0; if (port->blocked_open) { if (port->port.blocked_open) { spin_unlock_irqrestore(&card->card_lock, flags); if (port->close_delay) { pr_dbg("scheduling until time out.\n"); Loading @@ -1093,10 +1077,10 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) jiffies_to_msecs(port->close_delay)); } spin_lock_irqsave(&card->card_lock, flags); wake_up_interruptible(&port->open_wait); wake_up_interruptible(&port->port.open_wait); } port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING); wake_up_interruptible(&port->close_wait); port->port.flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING); wake_up_interruptible(&port->port.close_wait); spin_unlock_irqrestore(&card->card_lock, flags); } Loading @@ -1112,9 +1096,6 @@ static int isicom_write(struct tty_struct *tty, const unsigned char *buf, if (isicom_paranoia_check(port, tty->name, "isicom_write")) return 0; if (!port->xmit_buf) return 0; spin_lock_irqsave(&card->card_lock, flags); while (1) { Loading @@ -1123,7 +1104,7 @@ static int isicom_write(struct tty_struct *tty, const unsigned char *buf, if (cnt <= 0) break; memcpy(port->xmit_buf + port->xmit_head, buf, cnt); memcpy(port->port.xmit_buf + port->xmit_head, buf, cnt); port->xmit_head = (port->xmit_head + cnt) & (SERIAL_XMIT_SIZE - 1); port->xmit_cnt += cnt; Loading @@ -1147,16 +1128,13 @@ static int isicom_put_char(struct tty_struct *tty, unsigned char ch) if (isicom_paranoia_check(port, tty->name, "isicom_put_char")) return 0; if (!port->xmit_buf) return 0; spin_lock_irqsave(&card->card_lock, flags); if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) { spin_unlock_irqrestore(&card->card_lock, flags); return 0; } port->xmit_buf[port->xmit_head++] = ch; port->port.xmit_buf[port->xmit_head++] = ch; port->xmit_head &= (SERIAL_XMIT_SIZE - 1); port->xmit_cnt++; spin_unlock_irqrestore(&card->card_lock, flags); Loading @@ -1172,7 +1150,7 @@ static void isicom_flush_chars(struct tty_struct *tty) return; if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || !port->xmit_buf) !port->port.xmit_buf) return; /* this tells the transmitter to consider this port for Loading Loading @@ -1274,23 +1252,23 @@ static int isicom_set_serial_info(struct isi_port *port, lock_kernel(); reconfig_port = ((port->flags & ASYNC_SPD_MASK) != reconfig_port = ((port->port.flags & ASYNC_SPD_MASK) != (newinfo.flags & ASYNC_SPD_MASK)); if (!capable(CAP_SYS_ADMIN)) { if ((newinfo.close_delay != port->close_delay) || (newinfo.closing_wait != port->closing_wait) || ((newinfo.flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) { (port->port.flags & ~ASYNC_USR_MASK))) { unlock_kernel(); return -EPERM; } port->flags = ((port->flags & ~ASYNC_USR_MASK) | port->port.flags = ((port->port.flags & ~ASYNC_USR_MASK) | (newinfo.flags & ASYNC_USR_MASK)); } else { port->close_delay = newinfo.close_delay; port->closing_wait = newinfo.closing_wait; port->flags = ((port->flags & ~ASYNC_FLAGS) | port->port.flags = ((port->port.flags & ~ASYNC_FLAGS) | (newinfo.flags & ASYNC_FLAGS)); } if (reconfig_port) { Loading @@ -1314,7 +1292,7 @@ static int isicom_get_serial_info(struct isi_port *port, out_info.line = port - isi_ports; out_info.port = port->card->base; out_info.irq = port->card->irq; out_info.flags = port->flags; out_info.flags = port->port.flags; /* out_info.baud_base = ? */ out_info.close_delay = port->close_delay; out_info.closing_wait = port->closing_wait; Loading Loading @@ -1454,10 +1432,10 @@ static void isicom_hangup(struct tty_struct *tty) isicom_shutdown_port(port); spin_unlock_irqrestore(&port->card->card_lock, flags); port->count = 0; port->flags &= ~ASYNC_NORMAL_ACTIVE; port->tty = NULL; wake_up_interruptible(&port->open_wait); port->port.count = 0; port->port.flags &= ~ASYNC_NORMAL_ACTIVE; port->port.tty = NULL; wake_up_interruptible(&port->port.open_wait); } Loading Loading @@ -1832,8 +1810,7 @@ static int __init isicom_init(void) port->close_delay = 50 * HZ/100; port->closing_wait = 3000 * HZ/100; port->status = 0; init_waitqueue_head(&port->open_wait); init_waitqueue_head(&port->close_wait); tty_port_init(&port->port); /* . . . */ } isi_card[idx].base = 0; Loading