2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU General Public License
4 * as published by the Free Software Foundation; either version
5 * 2 of the License, or (at your option) any later version.
7 * Original driver code supplied by Multi-Tech
10 * 1/9/98 alan@redhat.com Merge to 2.0.x kernel tree
11 * Obtain and use official major/minors
12 * Loader switched to a misc device
13 * (fixed range check bug as a side effect)
15 * 9/12/98 alan@redhat.com Rough port to 2.1.x
17 * 10/6/99 sameer Merged the ISA and PCI drivers to
18 * a new unified driver.
20 * 3/9/99 sameer Added support for ISI4616 cards.
22 * 16/9/99 sameer We do not force RTS low anymore.
23 * This is to prevent the firmware
24 * from getting confused.
26 * 26/10/99 sameer Cosmetic changes:The driver now
27 * dumps the Port Count information
28 * along with I/O address and IRQ.
30 * 13/12/99 sameer Fixed the problem with IRQ sharing.
32 * 10/5/00 sameer Fixed isicom_shutdown_board()
33 * to not lower DTR on all the ports
34 * when the last port on the card is
37 * 10/5/00 sameer Signal mask setup command added
38 * to isicom_setup_port and
39 * isicom_shutdown_port.
41 * 24/5/00 sameer The driver is now SMP aware.
44 * 27/11/00 Vinayak P Risbud Fixed the Driver Crash Problem
47 * 03/01/01 anil .s Added support for resetting the
48 * internal modems on ISI cards.
50 * 08/02/01 anil .s Upgraded the driver for kernel
53 * 11/04/01 Kevin Fixed firmware load problem with
56 * 30/04/01 anil .s Fixed the remote login through
57 * ISI port problem. Now the link
58 * does not go down before password
61 * 03/05/01 anil .s Fixed the problem with IRQ sharing
62 * among ISI-PCI cards.
64 * 03/05/01 anil .s Added support to display the version
65 * info during insmod as well as module
68 * 10/05/01 anil .s Done the modifications to the source
69 * file and Install script so that the
70 * same installation can be used for
71 * 2.2.x and 2.4.x kernel.
73 * 06/06/01 anil .s Now we drop both dtr and rts during
74 * shutdown_port as well as raise them
75 * during isicom_config_port.
77 * 09/06/01 acme@conectiva.com.br use capable, not suser, do
78 * restore_flags on failure in
79 * isicom_send_break, verify put_user
82 * 11/02/03 ranjeeth Added support for 230 Kbps and 460 Kbps
83 * Baud index extended to 21
85 * 20/03/03 ranjeeth Made to work for Linux Advanced server.
86 * Taken care of license warning.
88 * 10/12/03 Ravindra Made to work for Fedora Core 1 of
89 * Red Hat Distribution
91 * 06/01/05 Alan Cox Merged the ISI and base kernel strands
92 * into a single 2.6 driver
94 * ***********************************************************
96 * To use this driver you also need the support package. You
97 * can find this in RPM format on
98 * ftp://ftp.linux.org.uk/pub/linux/alan
100 * You can find the original tools for this direct from Multitech
101 * ftp://ftp.multitech.com/ISI-Cards/
103 * Having installed the cards the module options (/etc/modprobe.conf)
105 * options isicom io=card1,card2,card3,card4 irq=card1,card2,card3,card4
107 * Omit those entries for boards you don't have installed.
111 * 64-bit verification
114 #include <linux/module.h>
115 #include <linux/firmware.h>
116 #include <linux/kernel.h>
117 #include <linux/tty.h>
118 #include <linux/tty_flip.h>
119 #include <linux/termios.h>
120 #include <linux/fs.h>
121 #include <linux/sched.h>
122 #include <linux/serial.h>
123 #include <linux/mm.h>
124 #include <linux/interrupt.h>
125 #include <linux/timer.h>
126 #include <linux/delay.h>
127 #include <linux/ioport.h>
129 #include <asm/uaccess.h>
131 #include <asm/system.h>
133 #include <linux/pci.h>
135 #include <linux/isicom.h>
137 #define InterruptTheCard(base) outw(0, (base) + 0xc)
138 #define ClearInterrupt(base) inw((base) + 0x0a)
141 #define pr_dbg(str...) printk(KERN_DEBUG "ISICOM: " str)
142 #define isicom_paranoia_check(a, b, c) __isicom_paranoia_check((a), (b), (c))
144 #define pr_dbg(str...) do { } while (0)
145 #define isicom_paranoia_check(a, b, c) 0
148 static int isicom_probe(struct pci_dev *, const struct pci_device_id *);
149 static void __devexit isicom_remove(struct pci_dev *);
151 static struct pci_device_id isicom_pci_tbl[] = {
152 { PCI_DEVICE(VENDOR_ID, 0x2028) },
153 { PCI_DEVICE(VENDOR_ID, 0x2051) },
154 { PCI_DEVICE(VENDOR_ID, 0x2052) },
155 { PCI_DEVICE(VENDOR_ID, 0x2053) },
156 { PCI_DEVICE(VENDOR_ID, 0x2054) },
157 { PCI_DEVICE(VENDOR_ID, 0x2055) },
158 { PCI_DEVICE(VENDOR_ID, 0x2056) },
159 { PCI_DEVICE(VENDOR_ID, 0x2057) },
160 { PCI_DEVICE(VENDOR_ID, 0x2058) },
163 MODULE_DEVICE_TABLE(pci, isicom_pci_tbl);
165 static struct pci_driver isicom_driver = {
167 .id_table = isicom_pci_tbl,
168 .probe = isicom_probe,
169 .remove = __devexit_p(isicom_remove)
172 static int prev_card = 3; /* start servicing isi_card[0] */
173 static struct tty_driver *isicom_normal;
175 static struct timer_list tx;
176 static char re_schedule = 1;
178 static void isicom_tx(unsigned long _data);
179 static void isicom_start(struct tty_struct *tty);
181 /* baud index mappings from linux defns to isi */
183 static signed char linuxb_to_isib[] = {
184 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16, 17, 18, 19
190 unsigned char port_count;
191 unsigned short status;
192 unsigned short port_status; /* each bit for each port */
193 unsigned short shift_count;
194 struct isi_port * ports;
196 spinlock_t card_lock; /* Card wide lock 11/5/00 -sameer */
202 unsigned short magic;
210 struct isi_board * card;
211 struct tty_struct * tty;
212 wait_queue_head_t close_wait;
213 wait_queue_head_t open_wait;
214 struct work_struct hangup_tq;
215 struct work_struct bh_tqueue;
216 unsigned char * xmit_buf;
222 static struct isi_board isi_card[BOARD_COUNT];
223 static struct isi_port isi_ports[PORT_COUNT];
226 * Locking functions for card level locking. We need to own both
227 * the kernel lock for the card and have the card in a position that
231 static int lock_card(struct isi_board *card)
234 unsigned long base = card->base;
236 for (retries = 0; retries < 100; retries++) {
237 spin_lock_irqsave(&card->card_lock, card->flags);
238 if (inw(base + 0xe) & 0x1) {
241 spin_unlock_irqrestore(&card->card_lock, card->flags);
242 udelay(1000); /* 1ms */
245 printk(KERN_WARNING "ISICOM: Failed to lock Card (0x%lx)\n",
248 return 0; /* Failed to acquire the card! */
251 static int lock_card_at_interrupt(struct isi_board *card)
253 unsigned char retries;
254 unsigned long base = card->base;
256 for (retries = 0; retries < 200; retries++) {
257 spin_lock_irqsave(&card->card_lock, card->flags);
259 if (inw(base + 0xe) & 0x1)
262 spin_unlock_irqrestore(&card->card_lock, card->flags);
264 /* Failing in interrupt is an acceptable event */
265 return 0; /* Failed to acquire the card! */
268 static void unlock_card(struct isi_board *card)
270 spin_unlock_irqrestore(&card->card_lock, card->flags);
274 * ISI Card specific ops ...
277 static void raise_dtr(struct isi_port *port)
279 struct isi_board *card = port->card;
280 unsigned long base = card->base;
281 u16 channel = port->channel;
283 if (!lock_card(card))
286 outw(0x8000 | (channel << card->shift_count) | 0x02, base);
288 InterruptTheCard(base);
289 port->status |= ISI_DTR;
293 static inline void drop_dtr(struct isi_port *port)
295 struct isi_board *card = port->card;
296 unsigned long base = card->base;
297 u16 channel = port->channel;
299 if (!lock_card(card))
302 outw(0x8000 | (channel << card->shift_count) | 0x02, base);
304 InterruptTheCard(base);
305 port->status &= ~ISI_DTR;
309 static inline void raise_rts(struct isi_port *port)
311 struct isi_board *card = port->card;
312 unsigned long base = card->base;
313 u16 channel = port->channel;
315 if (!lock_card(card))
318 outw(0x8000 | (channel << card->shift_count) | 0x02, base);
320 InterruptTheCard(base);
321 port->status |= ISI_RTS;
324 static inline void drop_rts(struct isi_port *port)
326 struct isi_board *card = port->card;
327 unsigned long base = card->base;
328 u16 channel = port->channel;
330 if (!lock_card(card))
333 outw(0x8000 | (channel << card->shift_count) | 0x02, base);
335 InterruptTheCard(base);
336 port->status &= ~ISI_RTS;
340 static inline void raise_dtr_rts(struct isi_port *port)
342 struct isi_board *card = port->card;
343 unsigned long base = card->base;
344 u16 channel = port->channel;
346 if (!lock_card(card))
349 outw(0x8000 | (channel << card->shift_count) | 0x02, base);
351 InterruptTheCard(base);
352 port->status |= (ISI_DTR | ISI_RTS);
356 static void drop_dtr_rts(struct isi_port *port)
358 struct isi_board *card = port->card;
359 unsigned long base = card->base;
360 u16 channel = port->channel;
362 if (!lock_card(card))
365 outw(0x8000 | (channel << card->shift_count) | 0x02, base);
367 InterruptTheCard(base);
368 port->status &= ~(ISI_RTS | ISI_DTR);
372 static inline void kill_queue(struct isi_port *port, short queue)
374 struct isi_board *card = port->card;
375 unsigned long base = card->base;
376 u16 channel = port->channel;
378 if (!lock_card(card))
381 outw(0x8000 | (channel << card->shift_count) | 0x02, base);
382 outw((queue << 8) | 0x06, base);
383 InterruptTheCard(base);
388 * ISICOM Driver specific routines ...
392 static inline int __isicom_paranoia_check(struct isi_port const *port,
393 char *name, const char *routine)
396 printk(KERN_WARNING "ISICOM: Warning: bad isicom magic for "
397 "dev %s in %s.\n", name, routine);
400 if (port->magic != ISICOM_MAGIC) {
401 printk(KERN_WARNING "ISICOM: Warning: NULL isicom port for "
402 "dev %s in %s.\n", name, routine);
412 * We shovel data into the card buffers on a regular basis. The card
413 * will do the rest of the work for us.
416 static void isicom_tx(unsigned long _data)
418 short count = (BOARD_COUNT-1), card, base;
419 short txcount, wrd, residue, word_count, cnt;
420 struct isi_port *port;
421 struct tty_struct *tty;
423 /* find next active board */
424 card = (prev_card + 1) & 0x0003;
426 if (isi_card[card].status & BOARD_ACTIVE)
428 card = (card + 1) & 0x0003;
430 if (!(isi_card[card].status & BOARD_ACTIVE))
435 count = isi_card[card].port_count;
436 port = isi_card[card].ports;
437 base = isi_card[card].base;
438 for (;count > 0;count--, port++) {
439 if (!lock_card_at_interrupt(&isi_card[card]))
441 /* port not active or tx disabled to force flow control */
442 if (!(port->flags & ASYNC_INITIALIZED) ||
443 !(port->status & ISI_TXOK))
444 unlock_card(&isi_card[card]);
451 unlock_card(&isi_card[card]);
455 txcount = min_t(short, TX_SIZE, port->xmit_cnt);
456 if (txcount <= 0 || tty->stopped || tty->hw_stopped) {
457 unlock_card(&isi_card[card]);
460 if (!(inw(base + 0x02) & (1 << port->channel))) {
461 unlock_card(&isi_card[card]);
464 pr_dbg("txing %d bytes, port%d.\n", txcount,
466 outw((port->channel << isi_card[card].shift_count) | txcount,
471 cnt = min_t(int, txcount, (SERIAL_XMIT_SIZE
473 if (residue == YES) {
476 wrd |= (port->xmit_buf[port->xmit_tail]
478 port->xmit_tail = (port->xmit_tail + 1)
479 & (SERIAL_XMIT_SIZE - 1);
490 word_count = cnt >> 1;
491 outsw(base, port->xmit_buf+port->xmit_tail,word_count);
492 port->xmit_tail = (port->xmit_tail
493 + (word_count << 1)) & (SERIAL_XMIT_SIZE - 1);
494 txcount -= (word_count << 1);
495 port->xmit_cnt -= (word_count << 1);
498 wrd = port->xmit_buf[port->xmit_tail];
499 port->xmit_tail = (port->xmit_tail + 1)
500 & (SERIAL_XMIT_SIZE - 1);
506 InterruptTheCard(base);
507 if (port->xmit_cnt <= 0)
508 port->status &= ~ISI_TXOK;
509 if (port->xmit_cnt <= WAKEUP_CHARS)
510 schedule_work(&port->bh_tqueue);
511 unlock_card(&isi_card[card]);
514 /* schedule another tx for hopefully in about 10ms */
522 tx.expires = jiffies + HZ/100;
524 tx.function = isicom_tx;
530 /* Interrupt handlers */
533 static void isicom_bottomhalf(struct work_struct *work)
535 struct isi_port *port = container_of(work, struct isi_port, bh_tqueue);
536 struct tty_struct *tty = port->tty;
542 wake_up_interruptible(&tty->write_wait);
546 * Main interrupt handler routine
549 static irqreturn_t isicom_interrupt(int irq, void *dev_id)
551 struct isi_board *card = dev_id;
552 struct isi_port *port;
553 struct tty_struct *tty;
555 u16 header, word_count, count, channel;
559 if (!card || !(card->status & FIRMWARE_LOADED))
563 spin_lock(&card->card_lock);
566 * disable any interrupts from the PCI card and lower the
569 outw(0x8000, base+0x04);
570 ClearInterrupt(base);
572 inw(base); /* get the dummy word out */
574 channel = (header & 0x7800) >> card->shift_count;
575 byte_count = header & 0xff;
577 if (channel + 1 > card->port_count) {
578 printk(KERN_WARNING "ISICOM: isicom_interrupt(0x%lx): "
579 "%d(channel) > port_count.\n", base, channel+1);
580 outw(0x0000, base+0x04); /* enable interrupts */
581 spin_unlock(&card->card_lock);
584 port = card->ports + channel;
585 if (!(port->flags & ASYNC_INITIALIZED)) {
586 outw(0x0000, base+0x04); /* enable interrupts */
592 word_count = byte_count >> 1;
593 while(byte_count > 1) {
597 if (byte_count & 0x01)
599 outw(0x0000, base+0x04); /* enable interrupts */
600 spin_unlock(&card->card_lock);
604 if (header & 0x8000) { /* Status Packet */
606 switch(header & 0xff) {
607 case 0: /* Change in EIA signals */
608 if (port->flags & ASYNC_CHECK_CD) {
609 if (port->status & ISI_DCD) {
610 if (!(header & ISI_DCD)) {
611 /* Carrier has been lost */
612 pr_dbg("interrupt: DCD->low.\n"
614 port->status &= ~ISI_DCD;
615 schedule_work(&port->hangup_tq);
617 } else if (header & ISI_DCD) {
618 /* Carrier has been detected */
619 pr_dbg("interrupt: DCD->high.\n");
620 port->status |= ISI_DCD;
621 wake_up_interruptible(&port->open_wait);
624 if (header & ISI_DCD)
625 port->status |= ISI_DCD;
627 port->status &= ~ISI_DCD;
630 if (port->flags & ASYNC_CTS_FLOW) {
631 if (port->tty->hw_stopped) {
632 if (header & ISI_CTS) {
633 port->tty->hw_stopped = 0;
635 port->status |= (ISI_TXOK
637 schedule_work(&port->bh_tqueue);
639 } else if (!(header & ISI_CTS)) {
640 port->tty->hw_stopped = 1;
642 port->status &= ~(ISI_TXOK | ISI_CTS);
645 if (header & ISI_CTS)
646 port->status |= ISI_CTS;
648 port->status &= ~ISI_CTS;
651 if (header & ISI_DSR)
652 port->status |= ISI_DSR;
654 port->status &= ~ISI_DSR;
657 port->status |= ISI_RI;
659 port->status &= ~ISI_RI;
663 case 1: /* Received Break !!! */
664 tty_insert_flip_char(tty, 0, TTY_BREAK);
665 if (port->flags & ASYNC_SAK)
667 tty_flip_buffer_push(tty);
670 case 2: /* Statistics */
671 pr_dbg("isicom_interrupt: stats!!!.\n");
675 pr_dbg("Intr: Unknown code in status packet.\n");
678 } else { /* Data Packet */
680 count = tty_prepare_flip_string(tty, &rp, byte_count & ~1);
681 pr_dbg("Intr: Can rx %d of %d bytes.\n", count, byte_count);
682 word_count = count >> 1;
683 insw(base, rp, word_count);
684 byte_count -= (word_count << 1);
685 if (count & 0x0001) {
686 tty_insert_flip_char(tty, inw(base) & 0xff,
690 if (byte_count > 0) {
691 pr_dbg("Intr(0x%lx:%d): Flip buffer overflow! dropping "
692 "bytes...\n", base, channel + 1);
693 while(byte_count > 0) { /* drain out unread xtra data */
698 tty_flip_buffer_push(tty);
700 outw(0x0000, base+0x04); /* enable interrupts */
705 static void isicom_config_port(struct isi_port *port)
707 struct isi_board *card = port->card;
708 struct tty_struct *tty;
710 unsigned long base = card->base;
711 u16 channel_setup, channel = port->channel,
712 shift_count = card->shift_count;
713 unsigned char flow_ctrl;
715 if (!(tty = port->tty) || !tty->termios)
718 if (baud & CBAUDEX) {
721 /* if CBAUDEX bit is on and the baud is set to either 50 or 75
722 * then the card is programmed for 57.6Kbps or 115Kbps
726 if (baud < 1 || baud > 2)
727 port->tty->termios->c_cflag &= ~CBAUDEX;
733 /* the ASYNC_SPD_HI and ASYNC_SPD_VHI options are set
734 * by the set_serial_info ioctl ... this is done by
735 * the 'setserial' utility.
738 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
739 baud++; /* 57.6 Kbps */
740 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
741 baud +=2; /* 115 Kbps */
743 if (linuxb_to_isib[baud] == -1) {
751 if (lock_card(card)) {
752 outw(0x8000 | (channel << shift_count) |0x03, base);
753 outw(linuxb_to_isib[baud] << 8 | 0x03, base);
755 switch(C_CSIZE(tty)) {
757 channel_setup |= ISICOM_CS5;
760 channel_setup |= ISICOM_CS6;
763 channel_setup |= ISICOM_CS7;
766 channel_setup |= ISICOM_CS8;
771 channel_setup |= ISICOM_2SB;
773 channel_setup |= ISICOM_EVPAR;
775 channel_setup |= ISICOM_ODPAR;
777 outw(channel_setup, base);
778 InterruptTheCard(base);
782 port->flags &= ~ASYNC_CHECK_CD;
784 port->flags |= ASYNC_CHECK_CD;
786 /* flow control settings ...*/
788 port->flags &= ~ASYNC_CTS_FLOW;
789 if (C_CRTSCTS(tty)) {
790 port->flags |= ASYNC_CTS_FLOW;
791 flow_ctrl |= ISICOM_CTSRTS;
794 flow_ctrl |= ISICOM_RESPOND_XONXOFF;
796 flow_ctrl |= ISICOM_INITIATE_XONXOFF;
798 if (lock_card(card)) {
799 outw(0x8000 | (channel << shift_count) |0x04, base);
800 outw(flow_ctrl << 8 | 0x05, base);
801 outw((STOP_CHAR(tty)) << 8 | (START_CHAR(tty)), base);
802 InterruptTheCard(base);
806 /* rx enabled -> enable port for rx on the card */
808 card->port_status |= (1 << channel);
809 outw(card->port_status, base + 0x02);
815 static inline void isicom_setup_board(struct isi_board *bp)
818 struct isi_port *port;
821 spin_lock_irqsave(&bp->card_lock, flags);
822 if (bp->status & BOARD_ACTIVE) {
823 spin_unlock_irqrestore(&bp->card_lock, flags);
827 bp->status |= BOARD_ACTIVE;
828 spin_unlock_irqrestore(&bp->card_lock, flags);
829 for (channel = 0; channel < bp->port_count; channel++, port++)
834 static int isicom_setup_port(struct isi_port *port)
836 struct isi_board *card = port->card;
839 if (port->flags & ASYNC_INITIALIZED) {
842 if (!port->xmit_buf) {
845 if (!(page = get_zeroed_page(GFP_KERNEL)))
848 if (port->xmit_buf) {
852 port->xmit_buf = (unsigned char *) page;
855 spin_lock_irqsave(&card->card_lock, flags);
857 clear_bit(TTY_IO_ERROR, &port->tty->flags);
858 if (port->count == 1)
861 port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
863 /* discard any residual data */
864 kill_queue(port, ISICOM_KILLTX | ISICOM_KILLRX);
866 isicom_config_port(port);
867 port->flags |= ASYNC_INITIALIZED;
868 spin_unlock_irqrestore(&card->card_lock, flags);
873 static int block_til_ready(struct tty_struct *tty, struct file *filp,
874 struct isi_port *port)
876 struct isi_board *card = port->card;
877 int do_clocal = 0, retval;
879 DECLARE_WAITQUEUE(wait, current);
881 /* block if port is in the process of being closed */
883 if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
884 pr_dbg("block_til_ready: close in progress.\n");
885 interruptible_sleep_on(&port->close_wait);
886 if (port->flags & ASYNC_HUP_NOTIFY)
892 /* if non-blocking mode is set ... */
894 if ((filp->f_flags & O_NONBLOCK) ||
895 (tty->flags & (1 << TTY_IO_ERROR))) {
896 pr_dbg("block_til_ready: non-block mode.\n");
897 port->flags |= ASYNC_NORMAL_ACTIVE;
904 /* block waiting for DCD to be asserted, and while
905 callout dev is busy */
907 add_wait_queue(&port->open_wait, &wait);
909 spin_lock_irqsave(&card->card_lock, flags);
910 if (!tty_hung_up_p(filp))
912 port->blocked_open++;
913 spin_unlock_irqrestore(&card->card_lock, flags);
918 set_current_state(TASK_INTERRUPTIBLE);
919 if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) {
920 if (port->flags & ASYNC_HUP_NOTIFY)
923 retval = -ERESTARTSYS;
926 if (!(port->flags & ASYNC_CLOSING) &&
927 (do_clocal || (port->status & ISI_DCD))) {
930 if (signal_pending(current)) {
931 retval = -ERESTARTSYS;
936 set_current_state(TASK_RUNNING);
937 remove_wait_queue(&port->open_wait, &wait);
938 spin_lock_irqsave(&card->card_lock, flags);
939 if (!tty_hung_up_p(filp))
941 port->blocked_open--;
942 spin_unlock_irqrestore(&card->card_lock, flags);
945 port->flags |= ASYNC_NORMAL_ACTIVE;
949 static int isicom_open(struct tty_struct *tty, struct file *filp)
951 struct isi_port *port;
952 struct isi_board *card;
953 unsigned int line, board;
957 if (line < 0 || line > PORT_COUNT-1)
960 card = &isi_card[board];
962 if (!(card->status & FIRMWARE_LOADED))
965 /* open on a port greater than the port count for the card !!! */
966 if (line > ((board * 16) + card->port_count - 1))
969 port = &isi_ports[line];
970 if (isicom_paranoia_check(port, tty->name, "isicom_open"))
973 isicom_setup_board(card);
976 tty->driver_data = port;
978 if ((error = isicom_setup_port(port))!=0)
980 if ((error = block_til_ready(tty, filp, port))!=0)
988 static inline void isicom_shutdown_board(struct isi_board *bp)
992 spin_lock_irqsave(&bp->card_lock, flags);
993 if (bp->status & BOARD_ACTIVE) {
994 bp->status &= ~BOARD_ACTIVE;
996 spin_unlock_irqrestore(&bp->card_lock, flags);
999 static void isicom_shutdown_port(struct isi_port *port)
1001 struct isi_board *card = port->card;
1002 struct tty_struct *tty;
1003 unsigned long flags;
1007 spin_lock_irqsave(&card->card_lock, flags);
1008 if (!(port->flags & ASYNC_INITIALIZED)) {
1009 spin_unlock_irqrestore(&card->card_lock, flags);
1012 if (port->xmit_buf) {
1013 free_page((unsigned long) port->xmit_buf);
1014 port->xmit_buf = NULL;
1016 port->flags &= ~ASYNC_INITIALIZED;
1017 /* 3rd October 2000 : Vinayak P Risbud */
1019 spin_unlock_irqrestore(&card->card_lock, flags);
1021 /*Fix done by Anil .S on 30-04-2001
1022 remote login through isi port has dtr toggle problem
1023 due to which the carrier drops before the password prompt
1024 appears on the remote end. Now we drop the dtr only if the
1025 HUPCL(Hangup on close) flag is set for the tty*/
1028 /* drop dtr on this port */
1031 /* any other port uninits */
1033 set_bit(TTY_IO_ERROR, &tty->flags);
1035 if (--card->count < 0) {
1036 pr_dbg("isicom_shutdown_port: bad board(0x%lx) count %d.\n",
1037 card->base, card->count);
1041 /* last port was closed, shutdown that boad too */
1044 isicom_shutdown_board(card);
1048 static void isicom_close(struct tty_struct *tty, struct file *filp)
1050 struct isi_port *port = tty->driver_data;
1051 struct isi_board *card;
1052 unsigned long flags;
1057 if (isicom_paranoia_check(port, tty->name, "isicom_close"))
1060 pr_dbg("Close start!!!.\n");
1062 spin_lock_irqsave(&card->card_lock, flags);
1063 if (tty_hung_up_p(filp)) {
1064 spin_unlock_irqrestore(&card->card_lock, flags);
1068 if (tty->count == 1 && port->count != 1) {
1069 printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
1070 "count tty->count = 1 port count = %d.\n",
1071 card->base, port->count);
1074 if (--port->count < 0) {
1075 printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
1076 "count for channel%d = %d", card->base, port->channel,
1082 spin_unlock_irqrestore(&card->card_lock, flags);
1085 port->flags |= ASYNC_CLOSING;
1087 spin_unlock_irqrestore(&card->card_lock, flags);
1089 if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
1090 tty_wait_until_sent(tty, port->closing_wait);
1091 /* indicate to the card that no more data can be received
1093 spin_lock_irqsave(&card->card_lock, flags);
1094 if (port->flags & ASYNC_INITIALIZED) {
1095 card->port_status &= ~(1 << port->channel);
1096 outw(card->port_status, card->base + 0x02);
1098 isicom_shutdown_port(port);
1099 spin_unlock_irqrestore(&card->card_lock, flags);
1101 if (tty->driver->flush_buffer)
1102 tty->driver->flush_buffer(tty);
1103 tty_ldisc_flush(tty);
1105 spin_lock_irqsave(&card->card_lock, flags);
1108 if (port->blocked_open) {
1109 spin_unlock_irqrestore(&card->card_lock, flags);
1110 if (port->close_delay) {
1111 pr_dbg("scheduling until time out.\n");
1112 msleep_interruptible(
1113 jiffies_to_msecs(port->close_delay));
1115 spin_lock_irqsave(&card->card_lock, flags);
1116 wake_up_interruptible(&port->open_wait);
1118 port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
1119 wake_up_interruptible(&port->close_wait);
1120 spin_unlock_irqrestore(&card->card_lock, flags);
1124 static int isicom_write(struct tty_struct *tty, const unsigned char *buf,
1127 struct isi_port *port = tty->driver_data;
1128 struct isi_board *card = port->card;
1129 unsigned long flags;
1132 if (isicom_paranoia_check(port, tty->name, "isicom_write"))
1135 if (!port->xmit_buf)
1138 spin_lock_irqsave(&card->card_lock, flags);
1141 cnt = min_t(int, count, min(SERIAL_XMIT_SIZE - port->xmit_cnt
1142 - 1, SERIAL_XMIT_SIZE - port->xmit_head));
1146 memcpy(port->xmit_buf + port->xmit_head, buf, cnt);
1147 port->xmit_head = (port->xmit_head + cnt) & (SERIAL_XMIT_SIZE
1149 port->xmit_cnt += cnt;
1154 if (port->xmit_cnt && !tty->stopped && !tty->hw_stopped)
1155 port->status |= ISI_TXOK;
1156 spin_unlock_irqrestore(&card->card_lock, flags);
1160 /* put_char et all */
1161 static void isicom_put_char(struct tty_struct *tty, unsigned char ch)
1163 struct isi_port *port = tty->driver_data;
1164 struct isi_board *card = port->card;
1165 unsigned long flags;
1167 if (isicom_paranoia_check(port, tty->name, "isicom_put_char"))
1170 if (!port->xmit_buf)
1173 spin_lock_irqsave(&card->card_lock, flags);
1174 if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
1175 spin_unlock_irqrestore(&card->card_lock, flags);
1179 port->xmit_buf[port->xmit_head++] = ch;
1180 port->xmit_head &= (SERIAL_XMIT_SIZE - 1);
1182 spin_unlock_irqrestore(&card->card_lock, flags);
1185 /* flush_chars et all */
1186 static void isicom_flush_chars(struct tty_struct *tty)
1188 struct isi_port *port = tty->driver_data;
1190 if (isicom_paranoia_check(port, tty->name, "isicom_flush_chars"))
1193 if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
1197 /* this tells the transmitter to consider this port for
1198 data output to the card ... that's the best we can do. */
1199 port->status |= ISI_TXOK;
1202 /* write_room et all */
1203 static int isicom_write_room(struct tty_struct *tty)
1205 struct isi_port *port = tty->driver_data;
1208 if (isicom_paranoia_check(port, tty->name, "isicom_write_room"))
1211 free = SERIAL_XMIT_SIZE - port->xmit_cnt - 1;
1217 /* chars_in_buffer et all */
1218 static int isicom_chars_in_buffer(struct tty_struct *tty)
1220 struct isi_port *port = tty->driver_data;
1221 if (isicom_paranoia_check(port, tty->name, "isicom_chars_in_buffer"))
1223 return port->xmit_cnt;
1227 static inline void isicom_send_break(struct isi_port *port,
1228 unsigned long length)
1230 struct isi_board *card = port->card;
1231 unsigned long base = card->base;
1233 if (!lock_card(card))
1236 outw(0x8000 | ((port->channel) << (card->shift_count)) | 0x3, base);
1237 outw((length & 0xff) << 8 | 0x00, base);
1238 outw((length & 0xff00), base);
1239 InterruptTheCard(base);
1244 static int isicom_tiocmget(struct tty_struct *tty, struct file *file)
1246 struct isi_port *port = tty->driver_data;
1247 /* just send the port status */
1248 u16 status = port->status;
1250 if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
1253 return ((status & ISI_RTS) ? TIOCM_RTS : 0) |
1254 ((status & ISI_DTR) ? TIOCM_DTR : 0) |
1255 ((status & ISI_DCD) ? TIOCM_CAR : 0) |
1256 ((status & ISI_DSR) ? TIOCM_DSR : 0) |
1257 ((status & ISI_CTS) ? TIOCM_CTS : 0) |
1258 ((status & ISI_RI ) ? TIOCM_RI : 0);
1261 static int isicom_tiocmset(struct tty_struct *tty, struct file *file,
1262 unsigned int set, unsigned int clear)
1264 struct isi_port *port = tty->driver_data;
1266 if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
1269 if (set & TIOCM_RTS)
1271 if (set & TIOCM_DTR)
1274 if (clear & TIOCM_RTS)
1276 if (clear & TIOCM_DTR)
1282 static int isicom_set_serial_info(struct isi_port *port,
1283 struct serial_struct __user *info)
1285 struct serial_struct newinfo;
1288 if (copy_from_user(&newinfo, info, sizeof(newinfo)))
1291 reconfig_port = ((port->flags & ASYNC_SPD_MASK) !=
1292 (newinfo.flags & ASYNC_SPD_MASK));
1294 if (!capable(CAP_SYS_ADMIN)) {
1295 if ((newinfo.close_delay != port->close_delay) ||
1296 (newinfo.closing_wait != port->closing_wait) ||
1297 ((newinfo.flags & ~ASYNC_USR_MASK) !=
1298 (port->flags & ~ASYNC_USR_MASK)))
1300 port->flags = ((port->flags & ~ ASYNC_USR_MASK) |
1301 (newinfo.flags & ASYNC_USR_MASK));
1304 port->close_delay = newinfo.close_delay;
1305 port->closing_wait = newinfo.closing_wait;
1306 port->flags = ((port->flags & ~ASYNC_FLAGS) |
1307 (newinfo.flags & ASYNC_FLAGS));
1309 if (reconfig_port) {
1310 isicom_config_port(port);
1315 static int isicom_get_serial_info(struct isi_port *port,
1316 struct serial_struct __user *info)
1318 struct serial_struct out_info;
1320 memset(&out_info, 0, sizeof(out_info));
1321 /* out_info.type = ? */
1322 out_info.line = port - isi_ports;
1323 out_info.port = port->card->base;
1324 out_info.irq = port->card->irq;
1325 out_info.flags = port->flags;
1326 /* out_info.baud_base = ? */
1327 out_info.close_delay = port->close_delay;
1328 out_info.closing_wait = port->closing_wait;
1329 if (copy_to_user(info, &out_info, sizeof(out_info)))
1334 static int isicom_ioctl(struct tty_struct *tty, struct file *filp,
1335 unsigned int cmd, unsigned long arg)
1337 struct isi_port *port = tty->driver_data;
1338 void __user *argp = (void __user *)arg;
1341 if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
1346 retval = tty_check_change(tty);
1349 tty_wait_until_sent(tty, 0);
1351 isicom_send_break(port, HZ/4);
1355 retval = tty_check_change(tty);
1358 tty_wait_until_sent(tty, 0);
1359 isicom_send_break(port, arg ? arg * (HZ/10) : HZ/4);
1363 return put_user(C_CLOCAL(tty) ? 1 : 0,
1364 (unsigned long __user *)argp);
1367 if (get_user(arg, (unsigned long __user *) argp))
1369 tty->termios->c_cflag =
1370 ((tty->termios->c_cflag & ~CLOCAL) |
1371 (arg ? CLOCAL : 0));
1375 return isicom_get_serial_info(port, argp);
1378 return isicom_set_serial_info(port, argp);
1381 return -ENOIOCTLCMD;
1386 /* set_termios et all */
1387 static void isicom_set_termios(struct tty_struct *tty,
1388 struct ktermios *old_termios)
1390 struct isi_port *port = tty->driver_data;
1392 if (isicom_paranoia_check(port, tty->name, "isicom_set_termios"))
1395 if (tty->termios->c_cflag == old_termios->c_cflag &&
1396 tty->termios->c_iflag == old_termios->c_iflag)
1399 isicom_config_port(port);
1401 if ((old_termios->c_cflag & CRTSCTS) &&
1402 !(tty->termios->c_cflag & CRTSCTS)) {
1403 tty->hw_stopped = 0;
1408 /* throttle et all */
1409 static void isicom_throttle(struct tty_struct *tty)
1411 struct isi_port *port = tty->driver_data;
1412 struct isi_board *card = port->card;
1414 if (isicom_paranoia_check(port, tty->name, "isicom_throttle"))
1417 /* tell the card that this port cannot handle any more data for now */
1418 card->port_status &= ~(1 << port->channel);
1419 outw(card->port_status, card->base + 0x02);
1422 /* unthrottle et all */
1423 static void isicom_unthrottle(struct tty_struct *tty)
1425 struct isi_port *port = tty->driver_data;
1426 struct isi_board *card = port->card;
1428 if (isicom_paranoia_check(port, tty->name, "isicom_unthrottle"))
1431 /* tell the card that this port is ready to accept more data */
1432 card->port_status |= (1 << port->channel);
1433 outw(card->port_status, card->base + 0x02);
1437 static void isicom_stop(struct tty_struct *tty)
1439 struct isi_port *port = tty->driver_data;
1441 if (isicom_paranoia_check(port, tty->name, "isicom_stop"))
1444 /* this tells the transmitter not to consider this port for
1445 data output to the card. */
1446 port->status &= ~ISI_TXOK;
1450 static void isicom_start(struct tty_struct *tty)
1452 struct isi_port *port = tty->driver_data;
1454 if (isicom_paranoia_check(port, tty->name, "isicom_start"))
1457 /* this tells the transmitter to consider this port for
1458 data output to the card. */
1459 port->status |= ISI_TXOK;
1463 static void do_isicom_hangup(struct work_struct *work)
1465 struct isi_port *port = container_of(work, struct isi_port, hangup_tq);
1466 struct tty_struct *tty;
1473 static void isicom_hangup(struct tty_struct *tty)
1475 struct isi_port *port = tty->driver_data;
1477 if (isicom_paranoia_check(port, tty->name, "isicom_hangup"))
1480 isicom_shutdown_port(port);
1482 port->flags &= ~ASYNC_NORMAL_ACTIVE;
1484 wake_up_interruptible(&port->open_wait);
1487 /* flush_buffer et all */
1488 static void isicom_flush_buffer(struct tty_struct *tty)
1490 struct isi_port *port = tty->driver_data;
1491 struct isi_board *card = port->card;
1492 unsigned long flags;
1494 if (isicom_paranoia_check(port, tty->name, "isicom_flush_buffer"))
1497 spin_lock_irqsave(&card->card_lock, flags);
1498 port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
1499 spin_unlock_irqrestore(&card->card_lock, flags);
1501 wake_up_interruptible(&tty->write_wait);
1506 * Driver init and deinit functions
1509 static const struct tty_operations isicom_ops = {
1510 .open = isicom_open,
1511 .close = isicom_close,
1512 .write = isicom_write,
1513 .put_char = isicom_put_char,
1514 .flush_chars = isicom_flush_chars,
1515 .write_room = isicom_write_room,
1516 .chars_in_buffer = isicom_chars_in_buffer,
1517 .ioctl = isicom_ioctl,
1518 .set_termios = isicom_set_termios,
1519 .throttle = isicom_throttle,
1520 .unthrottle = isicom_unthrottle,
1521 .stop = isicom_stop,
1522 .start = isicom_start,
1523 .hangup = isicom_hangup,
1524 .flush_buffer = isicom_flush_buffer,
1525 .tiocmget = isicom_tiocmget,
1526 .tiocmset = isicom_tiocmset,
1529 static int __devinit reset_card(struct pci_dev *pdev,
1530 const unsigned int card, unsigned int *signature)
1532 struct isi_board *board = pci_get_drvdata(pdev);
1533 unsigned long base = board->base;
1534 unsigned int portcount = 0;
1537 dev_dbg(&pdev->dev, "ISILoad:Resetting Card%d at 0x%lx\n", card + 1,
1544 outw(0, base + 0x8); /* Reset */
1548 *signature = inw(base + 0x4) & 0xff;
1550 portcount = inw(base + 0x2);
1551 if (!(inw(base + 0xe) & 0x1) || ((portcount != 0) &&
1552 (portcount != 4) && (portcount != 8))) {
1553 dev_dbg(&pdev->dev, "base+0x2=0x%lx, base+0xe=0x%lx\n",
1554 inw(base + 0x2), inw(base + 0xe));
1555 dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure "
1556 "(Possible bad I/O Port Address 0x%lx).\n",
1562 switch (*signature) {
1566 board->port_count = (portcount == 4) ? 4 : 8;
1567 board->shift_count = 12;
1570 board->port_count = 16;
1571 board->shift_count = 11;
1574 dev_warn(&pdev->dev, "ISILoad:Card%d reset failure (Possible "
1575 "bad I/O Port Address 0x%lx).\n", card + 1, base);
1576 dev_dbg(&pdev->dev, "Sig=0x%lx\n", signature);
1579 dev_info(&pdev->dev, "-Done\n");
1585 static inline int WaitTillCardIsFree(u16 base)
1587 unsigned long count = 0;
1589 while (!(inw(base + 0xe) & 0x1) && count++ < 100)
1592 return !(inw(base + 0xe) & 0x1);
1595 static int __devinit load_firmware(struct pci_dev *pdev,
1596 const unsigned int index, const unsigned int signature)
1598 struct isi_board *board = pci_get_drvdata(pdev);
1599 const struct firmware *fw;
1600 unsigned long base = board->base;
1602 u16 word_count, status;
1613 switch (signature) {
1615 name = "isi608.bin";
1618 name = "isi608em.bin";
1621 name = "isi616em.bin";
1624 name = "isi4608.bin";
1627 name = "isi4616.bin";
1630 dev_err(&pdev->dev, "Unknown signature.\n");
1634 retval = request_firmware(&fw, name, &pdev->dev);
1640 for (frame = (struct stframe *)fw->data;
1641 frame < (struct stframe *)(fw->data + fw->size);
1642 frame = (struct stframe *)((u8 *)(frame + 1) +
1644 if (WaitTillCardIsFree(base))
1647 outw(0xf0, base); /* start upload sequence */
1649 outw(frame->addr, base); /* lsb of address */
1651 word_count = frame->count / 2 + frame->count % 2;
1652 outw(word_count, base);
1653 InterruptTheCard(base);
1655 udelay(100); /* 0x2f */
1657 if (WaitTillCardIsFree(base))
1660 if ((status = inw(base + 0x4)) != 0) {
1661 dev_warn(&pdev->dev, "Card%d rejected load header:\n"
1662 "Address:0x%x\nCount:0x%x\nStatus:0x%x\n",
1663 index + 1, frame->addr, frame->count, status);
1666 outsw(base, frame->data, word_count);
1668 InterruptTheCard(base);
1670 udelay(50); /* 0x0f */
1672 if (WaitTillCardIsFree(base))
1675 if ((status = inw(base + 0x4)) != 0) {
1676 dev_err(&pdev->dev, "Card%d got out of sync.Card "
1677 "Status:0x%x\n", index + 1, status);
1682 /* XXX: should we test it by reading it back and comparing with original like
1683 * in load firmware package? */
1684 for (frame = (struct stframe *)fw->data;
1685 frame < (struct stframe *)(fw->data + fw->size);
1686 frame = (struct stframe *)((u8 *)(frame + 1) +
1688 if (WaitTillCardIsFree(base))
1691 outw(0xf1, base); /* start download sequence */
1693 outw(frame->addr, base); /* lsb of address */
1695 word_count = (frame->count >> 1) + frame->count % 2;
1696 outw(word_count + 1, base);
1697 InterruptTheCard(base);
1699 udelay(50); /* 0xf */
1701 if (WaitTillCardIsFree(base))
1704 if ((status = inw(base + 0x4)) != 0) {
1705 dev_warn(&pdev->dev, "Card%d rejected verify header:\n"
1706 "Address:0x%x\nCount:0x%x\nStatus: 0x%x\n",
1707 index + 1, frame->addr, frame->count, status);
1711 data = kmalloc(word_count * 2, GFP_KERNEL);
1713 insw(base, data, word_count);
1714 InterruptTheCard(base);
1716 for (a = 0; a < frame->count; a++)
1717 if (data[a] != frame->data[a]) {
1719 dev_err(&pdev->dev, "Card%d, firmware upload "
1720 "failed\n", index + 1);
1725 udelay(50); /* 0xf */
1727 if (WaitTillCardIsFree(base))
1730 if ((status = inw(base + 0x4)) != 0) {
1731 dev_err(&pdev->dev, "Card%d verify got out of sync. "
1732 "Card Status:0x%x\n", index + 1, status);
1738 if (WaitTillCardIsFree(base))
1745 InterruptTheCard(base);
1746 outw(0x0, base + 0x4); /* for ISI4608 cards */
1748 board->status |= FIRMWARE_LOADED;
1752 release_firmware(fw);
1758 * Insmod can set static symbols so keep these static
1762 static int __devinit isicom_probe(struct pci_dev *pdev,
1763 const struct pci_device_id *ent)
1765 unsigned int ioaddr, signature, index;
1766 int retval = -EPERM;
1768 struct isi_board *board = NULL;
1770 if (card >= BOARD_COUNT)
1773 ioaddr = pci_resource_start(pdev, 3);
1774 /* i.e at offset 0x1c in the PCI configuration register space. */
1776 dev_info(&pdev->dev, "ISI PCI Card(Device ID 0x%x)\n", ent->device);
1778 /* allot the first empty slot in the array */
1779 for (index = 0; index < BOARD_COUNT; index++)
1780 if (isi_card[index].base == 0) {
1781 board = &isi_card[index];
1785 board->index = index;
1786 board->base = ioaddr;
1787 board->irq = pciirq;
1790 pci_set_drvdata(pdev, board);
1792 retval = pci_request_region(pdev, 3, ISICOM_NAME);
1794 dev_err(&pdev->dev, "I/O Region 0x%lx-0x%lx is busy. Card%d "
1795 "will be disabled.\n", board->base, board->base + 15,
1801 retval = request_irq(board->irq, isicom_interrupt,
1802 IRQF_SHARED | IRQF_DISABLED, ISICOM_NAME, board);
1804 dev_err(&pdev->dev, "Could not install handler at Irq %d. "
1805 "Card%d will be disabled.\n", board->irq, index + 1);
1809 retval = reset_card(pdev, index, &signature);
1813 retval = load_firmware(pdev, index, signature);
1817 for (index = 0; index < board->port_count; index++)
1818 tty_register_device(isicom_normal, board->index * 16 + index,
1824 free_irq(board->irq, board);
1826 pci_release_region(pdev, 3);
1832 static void __devexit isicom_remove(struct pci_dev *pdev)
1834 struct isi_board *board = pci_get_drvdata(pdev);
1837 for (i = 0; i < board->port_count; i++)
1838 tty_unregister_device(isicom_normal, board->index * 16 + i);
1840 free_irq(board->irq, board);
1841 pci_release_region(pdev, 3);
1844 static int __init isicom_init(void)
1846 int retval, idx, channel;
1847 struct isi_port *port;
1851 for(idx = 0; idx < BOARD_COUNT; idx++) {
1852 port = &isi_ports[idx * 16];
1853 isi_card[idx].ports = port;
1854 spin_lock_init(&isi_card[idx].card_lock);
1855 for (channel = 0; channel < 16; channel++, port++) {
1856 port->magic = ISICOM_MAGIC;
1857 port->card = &isi_card[idx];
1858 port->channel = channel;
1859 port->close_delay = 50 * HZ/100;
1860 port->closing_wait = 3000 * HZ/100;
1861 INIT_WORK(&port->hangup_tq, do_isicom_hangup);
1862 INIT_WORK(&port->bh_tqueue, isicom_bottomhalf);
1864 init_waitqueue_head(&port->open_wait);
1865 init_waitqueue_head(&port->close_wait);
1868 isi_card[idx].base = 0;
1869 isi_card[idx].irq = 0;
1872 /* tty driver structure initialization */
1873 isicom_normal = alloc_tty_driver(PORT_COUNT);
1874 if (!isicom_normal) {
1879 isicom_normal->owner = THIS_MODULE;
1880 isicom_normal->name = "ttyM";
1881 isicom_normal->major = ISICOM_NMAJOR;
1882 isicom_normal->minor_start = 0;
1883 isicom_normal->type = TTY_DRIVER_TYPE_SERIAL;
1884 isicom_normal->subtype = SERIAL_TYPE_NORMAL;
1885 isicom_normal->init_termios = tty_std_termios;
1886 isicom_normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
1888 isicom_normal->flags = TTY_DRIVER_REAL_RAW |
1889 TTY_DRIVER_DYNAMIC_DEV;
1890 tty_set_operations(isicom_normal, &isicom_ops);
1892 retval = tty_register_driver(isicom_normal);
1894 pr_dbg("Couldn't register the dialin driver\n");
1898 retval = pci_register_driver(&isicom_driver);
1900 printk(KERN_ERR "ISICOM: Unable to register pci driver.\n");
1905 tx.expires = jiffies + 1;
1907 tx.function = isicom_tx;
1913 tty_unregister_driver(isicom_normal);
1915 put_tty_driver(isicom_normal);
1920 static void __exit isicom_exit(void)
1922 unsigned int index = 0;
1926 while (re_schedule != 2 && index++ < 100)
1929 pci_unregister_driver(&isicom_driver);
1930 tty_unregister_driver(isicom_normal);
1931 put_tty_driver(isicom_normal);
1934 module_init(isicom_init);
1935 module_exit(isicom_exit);
1937 MODULE_AUTHOR("MultiTech");
1938 MODULE_DESCRIPTION("Driver for the ISI series of cards by MultiTech");
1939 MODULE_LICENSE("GPL");