Loading drivers/char/isicom.c +21 −67 Original line number Diff line number Diff line Loading @@ -804,24 +804,21 @@ static inline void isicom_setup_board(struct isi_board *bp) bp->status |= BOARD_ACTIVE; for (channel = 0; channel < bp->port_count; channel++, port++) drop_dtr_rts(port); bp->count++; spin_unlock_irqrestore(&bp->card_lock, flags); } static int isicom_setup_port(struct tty_struct *tty) static int isicom_activate(struct tty_port *tport, struct tty_struct *tty) { struct isi_port *port = tty->driver_data; struct isi_port *port = container_of(tport, struct isi_port, port); struct isi_board *card = port->card; unsigned long flags; if (port->port.flags & ASYNC_INITIALIZED) return 0; if (tty_port_alloc_xmit_buf(&port->port) < 0) if (tty_port_alloc_xmit_buf(tport) < 0) return -ENOMEM; spin_lock_irqsave(&card->card_lock, flags); clear_bit(TTY_IO_ERROR, &tty->flags); if (port->port.count == 1) card->count++; isicom_setup_board(card); port->xmit_cnt = port->xmit_head = port->xmit_tail = 0; Loading @@ -832,9 +829,7 @@ static int isicom_setup_port(struct tty_struct *tty) outw(((ISICOM_KILLTX | ISICOM_KILLRX) << 8) | 0x06, card->base); InterruptTheCard(card->base); } isicom_config_port(tty); port->port.flags |= ASYNC_INITIALIZED; spin_unlock_irqrestore(&card->card_lock, flags); return 0; Loading Loading @@ -877,25 +872,14 @@ static int isicom_open(struct tty_struct *tty, struct file *filp) struct isi_port *port; struct isi_board *card; struct tty_port *tport; int error = 0; tport = isicom_find_port(tty); if (tport == NULL) return -ENODEV; port = container_of(tport, struct isi_port, port); card = &isi_card[BOARD(tty->index)]; isicom_setup_board(card); /* FIXME: locking on port.count etc */ port->port.count++; tty->driver_data = port; tty_port_tty_set(&port->port, tty); /* FIXME: Locking on Initialized flag */ if (!test_bit(ASYNCB_INITIALIZED, &tport->flags)) error = isicom_setup_port(tty); if (error == 0) error = tty_port_block_til_ready(&port->port, tty, filp); return error; return tty_port_open(tport, tty, filp); } /* close et all */ Loading @@ -914,40 +898,21 @@ static void isicom_shutdown_port(struct isi_port *port) tty = tty_port_tty_get(&port->port); if (!(port->port.flags & ASYNC_INITIALIZED)) { tty_kref_put(tty); return; } tty_port_free_xmit_buf(&port->port); port->port.flags &= ~ASYNC_INITIALIZED; /* 3rd October 2000 : Vinayak P Risbud */ tty_port_tty_set(&port->port, NULL); /*Fix done by Anil .S on 30-04-2001 remote login through isi port has dtr toggle problem due to which the carrier drops before the password prompt appears on the remote end. Now we drop the dtr only if the HUPCL(Hangup on close) flag is set for the tty*/ if (C_HUPCL(tty)) /* drop dtr on this port */ drop_dtr(port); /* any other port uninits */ if (tty) set_bit(TTY_IO_ERROR, &tty->flags); if (--card->count < 0) { pr_dbg("isicom_shutdown_port: bad board(0x%lx) count %d.\n", card->base, card->count); card->count = 0; } /* last port was closed, shutdown that boad too */ if (C_HUPCL(tty)) { if (!card->count) isicom_shutdown_board(card); /* last port was closed, shutdown that board too */ if (tty && C_HUPCL(tty)) { /* FIXME: this logic is bogus - it's the old logic that was bogus before but it still wants fixing */ if (!card->count) { if (card->status & BOARD_ACTIVE) card->status &= ~BOARD_ACTIVE; } } tty_kref_put(tty); } Loading @@ -968,7 +933,7 @@ static void isicom_flush_buffer(struct tty_struct *tty) tty_wakeup(tty); } static void isicom_close_port(struct tty_port *port) static void isicom_shutdown(struct tty_port *port) { struct isi_port *ip = container_of(port, struct isi_port, port); struct isi_board *card = ip->card; Loading @@ -977,10 +942,8 @@ static void isicom_close_port(struct tty_port *port) /* 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) { card->port_status &= ~(1 << ip->channel); outw(card->port_status, card->base + 0x02); } isicom_shutdown_port(ip); spin_unlock_irqrestore(&card->card_lock, flags); } Loading @@ -991,12 +954,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) struct tty_port *port = &ip->port; if (isicom_paranoia_check(ip, tty->name, "isicom_close")) return; if (tty_port_close_start(port, tty, filp) == 0) return; isicom_close_port(port); isicom_flush_buffer(tty); tty_port_close_end(port, tty); tty_port_close(port, tty, filp); } /* write et all */ Loading Loading @@ -1326,15 +1284,9 @@ static void isicom_start(struct tty_struct *tty) static void isicom_hangup(struct tty_struct *tty) { struct isi_port *port = tty->driver_data; unsigned long flags; if (isicom_paranoia_check(port, tty->name, "isicom_hangup")) return; spin_lock_irqsave(&port->card->card_lock, flags); isicom_shutdown_port(port); spin_unlock_irqrestore(&port->card->card_lock, flags); tty_port_hangup(&port->port); } Loading Loading @@ -1367,6 +1319,8 @@ static const struct tty_operations isicom_ops = { static const struct tty_port_operations isicom_port_ops = { .carrier_raised = isicom_carrier_raised, .dtr_rts = isicom_dtr_rts, .activate = isicom_activate, .shutdown = isicom_shutdown, }; static int __devinit reset_card(struct pci_dev *pdev, Loading Loading
drivers/char/isicom.c +21 −67 Original line number Diff line number Diff line Loading @@ -804,24 +804,21 @@ static inline void isicom_setup_board(struct isi_board *bp) bp->status |= BOARD_ACTIVE; for (channel = 0; channel < bp->port_count; channel++, port++) drop_dtr_rts(port); bp->count++; spin_unlock_irqrestore(&bp->card_lock, flags); } static int isicom_setup_port(struct tty_struct *tty) static int isicom_activate(struct tty_port *tport, struct tty_struct *tty) { struct isi_port *port = tty->driver_data; struct isi_port *port = container_of(tport, struct isi_port, port); struct isi_board *card = port->card; unsigned long flags; if (port->port.flags & ASYNC_INITIALIZED) return 0; if (tty_port_alloc_xmit_buf(&port->port) < 0) if (tty_port_alloc_xmit_buf(tport) < 0) return -ENOMEM; spin_lock_irqsave(&card->card_lock, flags); clear_bit(TTY_IO_ERROR, &tty->flags); if (port->port.count == 1) card->count++; isicom_setup_board(card); port->xmit_cnt = port->xmit_head = port->xmit_tail = 0; Loading @@ -832,9 +829,7 @@ static int isicom_setup_port(struct tty_struct *tty) outw(((ISICOM_KILLTX | ISICOM_KILLRX) << 8) | 0x06, card->base); InterruptTheCard(card->base); } isicom_config_port(tty); port->port.flags |= ASYNC_INITIALIZED; spin_unlock_irqrestore(&card->card_lock, flags); return 0; Loading Loading @@ -877,25 +872,14 @@ static int isicom_open(struct tty_struct *tty, struct file *filp) struct isi_port *port; struct isi_board *card; struct tty_port *tport; int error = 0; tport = isicom_find_port(tty); if (tport == NULL) return -ENODEV; port = container_of(tport, struct isi_port, port); card = &isi_card[BOARD(tty->index)]; isicom_setup_board(card); /* FIXME: locking on port.count etc */ port->port.count++; tty->driver_data = port; tty_port_tty_set(&port->port, tty); /* FIXME: Locking on Initialized flag */ if (!test_bit(ASYNCB_INITIALIZED, &tport->flags)) error = isicom_setup_port(tty); if (error == 0) error = tty_port_block_til_ready(&port->port, tty, filp); return error; return tty_port_open(tport, tty, filp); } /* close et all */ Loading @@ -914,40 +898,21 @@ static void isicom_shutdown_port(struct isi_port *port) tty = tty_port_tty_get(&port->port); if (!(port->port.flags & ASYNC_INITIALIZED)) { tty_kref_put(tty); return; } tty_port_free_xmit_buf(&port->port); port->port.flags &= ~ASYNC_INITIALIZED; /* 3rd October 2000 : Vinayak P Risbud */ tty_port_tty_set(&port->port, NULL); /*Fix done by Anil .S on 30-04-2001 remote login through isi port has dtr toggle problem due to which the carrier drops before the password prompt appears on the remote end. Now we drop the dtr only if the HUPCL(Hangup on close) flag is set for the tty*/ if (C_HUPCL(tty)) /* drop dtr on this port */ drop_dtr(port); /* any other port uninits */ if (tty) set_bit(TTY_IO_ERROR, &tty->flags); if (--card->count < 0) { pr_dbg("isicom_shutdown_port: bad board(0x%lx) count %d.\n", card->base, card->count); card->count = 0; } /* last port was closed, shutdown that boad too */ if (C_HUPCL(tty)) { if (!card->count) isicom_shutdown_board(card); /* last port was closed, shutdown that board too */ if (tty && C_HUPCL(tty)) { /* FIXME: this logic is bogus - it's the old logic that was bogus before but it still wants fixing */ if (!card->count) { if (card->status & BOARD_ACTIVE) card->status &= ~BOARD_ACTIVE; } } tty_kref_put(tty); } Loading @@ -968,7 +933,7 @@ static void isicom_flush_buffer(struct tty_struct *tty) tty_wakeup(tty); } static void isicom_close_port(struct tty_port *port) static void isicom_shutdown(struct tty_port *port) { struct isi_port *ip = container_of(port, struct isi_port, port); struct isi_board *card = ip->card; Loading @@ -977,10 +942,8 @@ static void isicom_close_port(struct tty_port *port) /* 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) { card->port_status &= ~(1 << ip->channel); outw(card->port_status, card->base + 0x02); } isicom_shutdown_port(ip); spin_unlock_irqrestore(&card->card_lock, flags); } Loading @@ -991,12 +954,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp) struct tty_port *port = &ip->port; if (isicom_paranoia_check(ip, tty->name, "isicom_close")) return; if (tty_port_close_start(port, tty, filp) == 0) return; isicom_close_port(port); isicom_flush_buffer(tty); tty_port_close_end(port, tty); tty_port_close(port, tty, filp); } /* write et all */ Loading Loading @@ -1326,15 +1284,9 @@ static void isicom_start(struct tty_struct *tty) static void isicom_hangup(struct tty_struct *tty) { struct isi_port *port = tty->driver_data; unsigned long flags; if (isicom_paranoia_check(port, tty->name, "isicom_hangup")) return; spin_lock_irqsave(&port->card->card_lock, flags); isicom_shutdown_port(port); spin_unlock_irqrestore(&port->card->card_lock, flags); tty_port_hangup(&port->port); } Loading Loading @@ -1367,6 +1319,8 @@ static const struct tty_operations isicom_ops = { static const struct tty_port_operations isicom_port_ops = { .carrier_raised = isicom_carrier_raised, .dtr_rts = isicom_dtr_rts, .activate = isicom_activate, .shutdown = isicom_shutdown, }; static int __devinit reset_card(struct pci_dev *pdev, Loading