diff options
Diffstat (limited to 'drivers')
-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 08f574333a57..426bfdd7f3e0 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c | |||
@@ -846,37 +846,53 @@ static int isicom_carrier_raised(struct tty_port *port) | |||
846 | return (ip->status & ISI_DCD)?1 : 0; | 846 | return (ip->status & ISI_DCD)?1 : 0; |
847 | } | 847 | } |
848 | 848 | ||
849 | static int isicom_open(struct tty_struct *tty, struct file *filp) | 849 | static struct tty_port *isicom_find_port(struct tty_struct *tty) |
850 | { | 850 | { |
851 | struct isi_port *port; | 851 | struct isi_port *port; |
852 | struct isi_board *card; | 852 | struct isi_board *card; |
853 | unsigned int board; | 853 | unsigned int board; |
854 | int error, line; | 854 | int line = tty->index; |
855 | 855 | ||
856 | line = tty->index; | ||
857 | if (line < 0 || line > PORT_COUNT-1) | 856 | if (line < 0 || line > PORT_COUNT-1) |
858 | return -ENODEV; | 857 | return NULL; |
859 | board = BOARD(line); | 858 | board = BOARD(line); |
860 | card = &isi_card[board]; | 859 | card = &isi_card[board]; |
861 | 860 | ||
862 | if (!(card->status & FIRMWARE_LOADED)) | 861 | if (!(card->status & FIRMWARE_LOADED)) |
863 | return -ENODEV; | 862 | return NULL; |
864 | 863 | ||
865 | /* open on a port greater than the port count for the card !!! */ | 864 | /* open on a port greater than the port count for the card !!! */ |
866 | if (line > ((board * 16) + card->port_count - 1)) | 865 | if (line > ((board * 16) + card->port_count - 1)) |
867 | return -ENODEV; | 866 | return NULL; |
868 | 867 | ||
869 | port = &isi_ports[line]; | 868 | port = &isi_ports[line]; |
870 | if (isicom_paranoia_check(port, tty->name, "isicom_open")) | 869 | if (isicom_paranoia_check(port, tty->name, "isicom_open")) |
871 | return -ENODEV; | 870 | return NULL; |
871 | |||
872 | return &port->port; | ||
873 | } | ||
874 | |||
875 | static int isicom_open(struct tty_struct *tty, struct file *filp) | ||
876 | { | ||
877 | struct isi_port *port; | ||
878 | struct isi_board *card; | ||
879 | struct tty_port *tport; | ||
880 | int error = 0; | ||
872 | 881 | ||
882 | tport = isicom_find_port(tty); | ||
883 | if (tport == NULL) | ||
884 | return -ENODEV; | ||
885 | port = container_of(tport, struct isi_port, port); | ||
886 | card = &isi_card[BOARD(tty->index)]; | ||
873 | isicom_setup_board(card); | 887 | isicom_setup_board(card); |
874 | 888 | ||
875 | /* FIXME: locking on port.count etc */ | 889 | /* FIXME: locking on port.count etc */ |
876 | port->port.count++; | 890 | port->port.count++; |
877 | tty->driver_data = port; | 891 | tty->driver_data = port; |
878 | tty_port_tty_set(&port->port, tty); | 892 | tty_port_tty_set(&port->port, tty); |
879 | error = isicom_setup_port(tty); | 893 | /* FIXME: Locking on Initialized flag */ |
894 | if (!test_bit(ASYNCB_INITIALIZED, &tport->flags)) | ||
895 | error = isicom_setup_port(tty); | ||
880 | if (error == 0) | 896 | if (error == 0) |
881 | error = tty_port_block_til_ready(&port->port, tty, filp); | 897 | error = tty_port_block_til_ready(&port->port, tty, filp); |
882 | return error; | 898 | return error; |