diff options
author | Alan Cox <alan@linux.intel.com> | 2009-09-19 13:13:27 -0700 |
---|---|---|
committer | Live-CD User <linux@linux.site> | 2009-09-19 13:13:27 -0700 |
commit | 11d85d7b2ecc72fe752bba55389e7d11907528af (patch) | |
tree | 3986099d51e8c451122dddd336738761d256b427 /drivers/char | |
parent | a509a7e478e4766114d69f12d19d644ac63e9765 (diff) | |
download | op-kernel-dev-11d85d7b2ecc72fe752bba55389e7d11907528af.zip op-kernel-dev-11d85d7b2ecc72fe752bba55389e7d11907528af.tar.gz |
isicom: split the open method for the isicom device
Again moving towards being able to add a common open method
Signed-off-by: Alan Cox <alan@linux.intel.com>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/isicom.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c index 08f5743..426bfdd 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c @@ -846,37 +846,53 @@ static int isicom_carrier_raised(struct tty_port *port) return (ip->status & ISI_DCD)?1 : 0; } -static int isicom_open(struct tty_struct *tty, struct file *filp) +static struct tty_port *isicom_find_port(struct tty_struct *tty) { struct isi_port *port; struct isi_board *card; unsigned int board; - int error, line; + int line = tty->index; - line = tty->index; if (line < 0 || line > PORT_COUNT-1) - return -ENODEV; + return NULL; board = BOARD(line); card = &isi_card[board]; if (!(card->status & FIRMWARE_LOADED)) - return -ENODEV; + return NULL; /* open on a port greater than the port count for the card !!! */ if (line > ((board * 16) + card->port_count - 1)) - return -ENODEV; + return NULL; port = &isi_ports[line]; if (isicom_paranoia_check(port, tty->name, "isicom_open")) - return -ENODEV; + return NULL; + + return &port->port; +} + +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); - error = isicom_setup_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; |