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;
 
 197         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 aquire 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 aquire 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(void *data)
 
 535         struct isi_port *port = (struct isi_port *) data;
 
 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, struct pt_regs *regs)
 
 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);
 
 565         if (card->isa == NO) {
 
 567                  * disable any interrupts from the PCI card and lower the
 
 570                 outw(0x8000, base+0x04);
 
 571                 ClearInterrupt(base);
 
 574         inw(base);              /* get the dummy word out */
 
 576         channel = (header & 0x7800) >> card->shift_count;
 
 577         byte_count = header & 0xff;
 
 579         if (channel + 1 > card->port_count) {
 
 580                 printk(KERN_WARNING "ISICOM: isicom_interrupt(0x%lx): "
 
 581                         "%d(channel) > port_count.\n", base, channel+1);
 
 583                         ClearInterrupt(base);
 
 585                         outw(0x0000, base+0x04); /* enable interrupts */
 
 586                 spin_unlock(&card->card_lock);
 
 589         port = card->ports + channel;
 
 590         if (!(port->flags & ASYNC_INITIALIZED)) {
 
 592                         ClearInterrupt(base);
 
 594                         outw(0x0000, base+0x04); /* enable interrupts */
 
 600                 word_count = byte_count >> 1;
 
 601                 while(byte_count > 1) {
 
 605                 if (byte_count & 0x01)
 
 607                 if (card->isa == YES)
 
 608                         ClearInterrupt(base);
 
 610                         outw(0x0000, base+0x04); /* enable interrupts */
 
 611                 spin_unlock(&card->card_lock);
 
 615         if (header & 0x8000) {          /* Status Packet */
 
 617                 switch(header & 0xff) {
 
 618                 case 0: /* Change in EIA signals */
 
 619                         if (port->flags & ASYNC_CHECK_CD) {
 
 620                                 if (port->status & ISI_DCD) {
 
 621                                         if (!(header & ISI_DCD)) {
 
 622                                         /* Carrier has been lost  */
 
 623                                                 pr_dbg("interrupt: DCD->low.\n"
 
 625                                                 port->status &= ~ISI_DCD;
 
 626                                                 schedule_work(&port->hangup_tq);
 
 628                                 } else if (header & ISI_DCD) {
 
 629                                 /* Carrier has been detected */
 
 630                                         pr_dbg("interrupt: DCD->high.\n");
 
 631                                         port->status |= ISI_DCD;
 
 632                                         wake_up_interruptible(&port->open_wait);
 
 635                                 if (header & ISI_DCD)
 
 636                                         port->status |= ISI_DCD;
 
 638                                         port->status &= ~ISI_DCD;
 
 641                         if (port->flags & ASYNC_CTS_FLOW) {
 
 642                                 if (port->tty->hw_stopped) {
 
 643                                         if (header & ISI_CTS) {
 
 644                                                 port->tty->hw_stopped = 0;
 
 646                                                 port->status |= (ISI_TXOK
 
 648                                                 schedule_work(&port->bh_tqueue);
 
 650                                 } else if (!(header & ISI_CTS)) {
 
 651                                         port->tty->hw_stopped = 1;
 
 653                                         port->status &= ~(ISI_TXOK | ISI_CTS);
 
 656                                 if (header & ISI_CTS)
 
 657                                         port->status |= ISI_CTS;
 
 659                                         port->status &= ~ISI_CTS;
 
 662                         if (header & ISI_DSR)
 
 663                                 port->status |= ISI_DSR;
 
 665                                 port->status &= ~ISI_DSR;
 
 668                                 port->status |= ISI_RI;
 
 670                                 port->status &= ~ISI_RI;
 
 674                 case 1: /* Received Break !!! */
 
 675                         tty_insert_flip_char(tty, 0, TTY_BREAK);
 
 676                         if (port->flags & ASYNC_SAK)
 
 678                         tty_flip_buffer_push(tty);
 
 681                 case 2: /* Statistics            */
 
 682                         pr_dbg("isicom_interrupt: stats!!!.\n");
 
 686                         pr_dbg("Intr: Unknown code in status packet.\n");
 
 689         } else {                                /* Data   Packet */
 
 691                 count = tty_prepare_flip_string(tty, &rp, byte_count & ~1);
 
 692                 pr_dbg("Intr: Can rx %d of %d bytes.\n", count, byte_count);
 
 693                 word_count = count >> 1;
 
 694                 insw(base, rp, word_count);
 
 695                 byte_count -= (word_count << 1);
 
 696                 if (count & 0x0001) {
 
 697                         tty_insert_flip_char(tty,  inw(base) & 0xff,
 
 701                 if (byte_count > 0) {
 
 702                         pr_dbg("Intr(0x%lx:%d): Flip buffer overflow! dropping "
 
 703                                 "bytes...\n", base, channel + 1);
 
 704                         while(byte_count > 0) { /* drain out unread xtra data */
 
 709                 tty_flip_buffer_push(tty);
 
 711         if (card->isa == YES)
 
 712                 ClearInterrupt(base);
 
 714                 outw(0x0000, base+0x04); /* enable interrupts */
 
 719 static void isicom_config_port(struct isi_port *port)
 
 721         struct isi_board *card = port->card;
 
 722         struct tty_struct *tty;
 
 724         unsigned long base = card->base;
 
 725         u16 channel_setup, channel = port->channel,
 
 726                 shift_count = card->shift_count;
 
 727         unsigned char flow_ctrl;
 
 729         if (!(tty = port->tty) || !tty->termios)
 
 732         if (baud & CBAUDEX) {
 
 735                 /*  if CBAUDEX bit is on and the baud is set to either 50 or 75
 
 736                  *  then the card is programmed for 57.6Kbps or 115Kbps
 
 740                 if (baud < 1 || baud > 2)
 
 741                         port->tty->termios->c_cflag &= ~CBAUDEX;
 
 747                 /*  the ASYNC_SPD_HI and ASYNC_SPD_VHI options are set
 
 748                  *  by the set_serial_info ioctl ... this is done by
 
 749                  *  the 'setserial' utility.
 
 752                 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
 
 753                         baud++; /*  57.6 Kbps */
 
 754                 if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
 
 755                         baud +=2; /*  115  Kbps */
 
 757         if (linuxb_to_isib[baud] == -1) {
 
 765         if (lock_card(card)) {
 
 766                 outw(0x8000 | (channel << shift_count) |0x03, base);
 
 767                 outw(linuxb_to_isib[baud] << 8 | 0x03, base);
 
 769                 switch(C_CSIZE(tty)) {
 
 771                         channel_setup |= ISICOM_CS5;
 
 774                         channel_setup |= ISICOM_CS6;
 
 777                         channel_setup |= ISICOM_CS7;
 
 780                         channel_setup |= ISICOM_CS8;
 
 785                         channel_setup |= ISICOM_2SB;
 
 787                         channel_setup |= ISICOM_EVPAR;
 
 789                                 channel_setup |= ISICOM_ODPAR;
 
 791                 outw(channel_setup, base);
 
 792                 InterruptTheCard(base);
 
 796                 port->flags &= ~ASYNC_CHECK_CD;
 
 798                 port->flags |= ASYNC_CHECK_CD;
 
 800         /* flow control settings ...*/
 
 802         port->flags &= ~ASYNC_CTS_FLOW;
 
 803         if (C_CRTSCTS(tty)) {
 
 804                 port->flags |= ASYNC_CTS_FLOW;
 
 805                 flow_ctrl |= ISICOM_CTSRTS;
 
 808                 flow_ctrl |= ISICOM_RESPOND_XONXOFF;
 
 810                 flow_ctrl |= ISICOM_INITIATE_XONXOFF;
 
 812         if (lock_card(card)) {
 
 813                 outw(0x8000 | (channel << shift_count) |0x04, base);
 
 814                 outw(flow_ctrl << 8 | 0x05, base);
 
 815                 outw((STOP_CHAR(tty)) << 8 | (START_CHAR(tty)), base);
 
 816                 InterruptTheCard(base);
 
 820         /*      rx enabled -> enable port for rx on the card    */
 
 822                 card->port_status |= (1 << channel);
 
 823                 outw(card->port_status, base + 0x02);
 
 829 static inline void isicom_setup_board(struct isi_board *bp)
 
 832         struct isi_port *port;
 
 835         spin_lock_irqsave(&bp->card_lock, flags);
 
 836         if (bp->status & BOARD_ACTIVE) {
 
 837                 spin_unlock_irqrestore(&bp->card_lock, flags);
 
 841         bp->status |= BOARD_ACTIVE;
 
 842         spin_unlock_irqrestore(&bp->card_lock, flags);
 
 843         for (channel = 0; channel < bp->port_count; channel++, port++)
 
 848 static int isicom_setup_port(struct isi_port *port)
 
 850         struct isi_board *card = port->card;
 
 853         if (port->flags & ASYNC_INITIALIZED) {
 
 856         if (!port->xmit_buf) {
 
 859                 if (!(page = get_zeroed_page(GFP_KERNEL)))
 
 862                 if (port->xmit_buf) {
 
 866                 port->xmit_buf = (unsigned char *) page;
 
 869         spin_lock_irqsave(&card->card_lock, flags);
 
 871                 clear_bit(TTY_IO_ERROR, &port->tty->flags);
 
 872         if (port->count == 1)
 
 875         port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
 
 877         /*      discard any residual data       */
 
 878         kill_queue(port, ISICOM_KILLTX | ISICOM_KILLRX);
 
 880         isicom_config_port(port);
 
 881         port->flags |= ASYNC_INITIALIZED;
 
 882         spin_unlock_irqrestore(&card->card_lock, flags);
 
 887 static int block_til_ready(struct tty_struct *tty, struct file *filp,
 
 888         struct isi_port *port)
 
 890         struct isi_board *card = port->card;
 
 891         int do_clocal = 0, retval;
 
 893         DECLARE_WAITQUEUE(wait, current);
 
 895         /* block if port is in the process of being closed */
 
 897         if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
 
 898                 pr_dbg("block_til_ready: close in progress.\n");
 
 899                 interruptible_sleep_on(&port->close_wait);
 
 900                 if (port->flags & ASYNC_HUP_NOTIFY)
 
 906         /* if non-blocking mode is set ... */
 
 908         if ((filp->f_flags & O_NONBLOCK) ||
 
 909                         (tty->flags & (1 << TTY_IO_ERROR))) {
 
 910                 pr_dbg("block_til_ready: non-block mode.\n");
 
 911                 port->flags |= ASYNC_NORMAL_ACTIVE;
 
 918         /* block waiting for DCD to be asserted, and while
 
 919                                                 callout dev is busy */
 
 921         add_wait_queue(&port->open_wait, &wait);
 
 923         spin_lock_irqsave(&card->card_lock, flags);
 
 924         if (!tty_hung_up_p(filp))
 
 926         port->blocked_open++;
 
 927         spin_unlock_irqrestore(&card->card_lock, flags);
 
 932                 set_current_state(TASK_INTERRUPTIBLE);
 
 933                 if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) {
 
 934                         if (port->flags & ASYNC_HUP_NOTIFY)
 
 937                                 retval = -ERESTARTSYS;
 
 940                 if (!(port->flags & ASYNC_CLOSING) &&
 
 941                                 (do_clocal || (port->status & ISI_DCD))) {
 
 944                 if (signal_pending(current)) {
 
 945                         retval = -ERESTARTSYS;
 
 950         set_current_state(TASK_RUNNING);
 
 951         remove_wait_queue(&port->open_wait, &wait);
 
 952         spin_lock_irqsave(&card->card_lock, flags);
 
 953         if (!tty_hung_up_p(filp))
 
 955         port->blocked_open--;
 
 956         spin_unlock_irqrestore(&card->card_lock, flags);
 
 959         port->flags |= ASYNC_NORMAL_ACTIVE;
 
 963 static int isicom_open(struct tty_struct *tty, struct file *filp)
 
 965         struct isi_port *port;
 
 966         struct isi_board *card;
 
 967         unsigned int line, board;
 
 971         if (line < 0 || line > PORT_COUNT-1)
 
 974         card = &isi_card[board];
 
 976         if (!(card->status & FIRMWARE_LOADED))
 
 979         /*  open on a port greater than the port count for the card !!! */
 
 980         if (line > ((board * 16) + card->port_count - 1))
 
 983         port = &isi_ports[line];
 
 984         if (isicom_paranoia_check(port, tty->name, "isicom_open"))
 
 987         isicom_setup_board(card);
 
 990         tty->driver_data = port;
 
 992         if ((error = isicom_setup_port(port))!=0)
 
 994         if ((error = block_til_ready(tty, filp, port))!=0)
 
1002 static inline void isicom_shutdown_board(struct isi_board *bp)
 
1004         unsigned long flags;
 
1006         spin_lock_irqsave(&bp->card_lock, flags);
 
1007         if (bp->status & BOARD_ACTIVE) {
 
1008                 bp->status &= ~BOARD_ACTIVE;
 
1010         spin_unlock_irqrestore(&bp->card_lock, flags);
 
1013 static void isicom_shutdown_port(struct isi_port *port)
 
1015         struct isi_board *card = port->card;
 
1016         struct tty_struct *tty;
 
1017         unsigned long flags;
 
1021         spin_lock_irqsave(&card->card_lock, flags);
 
1022         if (!(port->flags & ASYNC_INITIALIZED)) {
 
1023                 spin_unlock_irqrestore(&card->card_lock, flags);
 
1026         if (port->xmit_buf) {
 
1027                 free_page((unsigned long) port->xmit_buf);
 
1028                 port->xmit_buf = NULL;
 
1030         port->flags &= ~ASYNC_INITIALIZED;
 
1031         /* 3rd October 2000 : Vinayak P Risbud */
 
1033         spin_unlock_irqrestore(&card->card_lock, flags);
 
1035         /*Fix done by Anil .S on 30-04-2001
 
1036         remote login through isi port has dtr toggle problem
 
1037         due to which the carrier drops before the password prompt
 
1038         appears on the remote end. Now we drop the dtr only if the
 
1039         HUPCL(Hangup on close) flag is set for the tty*/
 
1042                 /* drop dtr on this port */
 
1045         /* any other port uninits  */
 
1047                 set_bit(TTY_IO_ERROR, &tty->flags);
 
1049         if (--card->count < 0) {
 
1050                 pr_dbg("isicom_shutdown_port: bad board(0x%lx) count %d.\n",
 
1051                         card->base, card->count);
 
1055         /* last port was closed, shutdown that boad too */
 
1058                         isicom_shutdown_board(card);
 
1062 static void isicom_close(struct tty_struct *tty, struct file *filp)
 
1064         struct isi_port *port = tty->driver_data;
 
1065         struct isi_board *card = port->card;
 
1066         unsigned long flags;
 
1070         if (isicom_paranoia_check(port, tty->name, "isicom_close"))
 
1073         pr_dbg("Close start!!!.\n");
 
1075         spin_lock_irqsave(&card->card_lock, flags);
 
1076         if (tty_hung_up_p(filp)) {
 
1077                 spin_unlock_irqrestore(&card->card_lock, flags);
 
1081         if (tty->count == 1 && port->count != 1) {
 
1082                 printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
 
1083                         "count tty->count = 1 port count = %d.\n",
 
1084                         card->base, port->count);
 
1087         if (--port->count < 0) {
 
1088                 printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
 
1089                         "count for channel%d = %d", card->base, port->channel,
 
1095                 spin_unlock_irqrestore(&card->card_lock, flags);
 
1098         port->flags |= ASYNC_CLOSING;
 
1100         spin_unlock_irqrestore(&card->card_lock, flags);
 
1102         if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
 
1103                 tty_wait_until_sent(tty, port->closing_wait);
 
1104         /* indicate to the card that no more data can be received
 
1106         spin_lock_irqsave(&card->card_lock, flags);
 
1107         if (port->flags & ASYNC_INITIALIZED) {
 
1108                 card->port_status &= ~(1 << port->channel);
 
1109                 outw(card->port_status, card->base + 0x02);
 
1111         isicom_shutdown_port(port);
 
1112         spin_unlock_irqrestore(&card->card_lock, flags);
 
1114         if (tty->driver->flush_buffer)
 
1115                 tty->driver->flush_buffer(tty);
 
1116         tty_ldisc_flush(tty);
 
1118         spin_lock_irqsave(&card->card_lock, flags);
 
1121         if (port->blocked_open) {
 
1122                 spin_unlock_irqrestore(&card->card_lock, flags);
 
1123                 if (port->close_delay) {
 
1124                         pr_dbg("scheduling until time out.\n");
 
1125                         msleep_interruptible(
 
1126                                 jiffies_to_msecs(port->close_delay));
 
1128                 spin_lock_irqsave(&card->card_lock, flags);
 
1129                 wake_up_interruptible(&port->open_wait);
 
1131         port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
 
1132         wake_up_interruptible(&port->close_wait);
 
1133         spin_unlock_irqrestore(&card->card_lock, flags);
 
1137 static int isicom_write(struct tty_struct *tty, const unsigned char *buf,
 
1140         struct isi_port *port = tty->driver_data;
 
1141         struct isi_board *card = port->card;
 
1142         unsigned long flags;
 
1145         if (isicom_paranoia_check(port, tty->name, "isicom_write"))
 
1148         if (!tty || !port->xmit_buf)
 
1151         spin_lock_irqsave(&card->card_lock, flags);
 
1154                 cnt = min_t(int, count, min(SERIAL_XMIT_SIZE - port->xmit_cnt
 
1155                                 - 1, SERIAL_XMIT_SIZE - port->xmit_head));
 
1159                 memcpy(port->xmit_buf + port->xmit_head, buf, cnt);
 
1160                 port->xmit_head = (port->xmit_head + cnt) & (SERIAL_XMIT_SIZE
 
1162                 port->xmit_cnt += cnt;
 
1167         if (port->xmit_cnt && !tty->stopped && !tty->hw_stopped)
 
1168                 port->status |= ISI_TXOK;
 
1169         spin_unlock_irqrestore(&card->card_lock, flags);
 
1173 /* put_char et all */
 
1174 static void isicom_put_char(struct tty_struct *tty, unsigned char ch)
 
1176         struct isi_port *port = tty->driver_data;
 
1177         struct isi_board *card = port->card;
 
1178         unsigned long flags;
 
1180         if (isicom_paranoia_check(port, tty->name, "isicom_put_char"))
 
1183         if (!tty || !port->xmit_buf)
 
1186         spin_lock_irqsave(&card->card_lock, flags);
 
1187         if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
 
1188                 spin_unlock_irqrestore(&card->card_lock, flags);
 
1192         port->xmit_buf[port->xmit_head++] = ch;
 
1193         port->xmit_head &= (SERIAL_XMIT_SIZE - 1);
 
1195         spin_unlock_irqrestore(&card->card_lock, flags);
 
1198 /* flush_chars et all */
 
1199 static void isicom_flush_chars(struct tty_struct *tty)
 
1201         struct isi_port *port = tty->driver_data;
 
1203         if (isicom_paranoia_check(port, tty->name, "isicom_flush_chars"))
 
1206         if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
 
1210         /* this tells the transmitter to consider this port for
 
1211            data output to the card ... that's the best we can do. */
 
1212         port->status |= ISI_TXOK;
 
1215 /* write_room et all */
 
1216 static int isicom_write_room(struct tty_struct *tty)
 
1218         struct isi_port *port = tty->driver_data;
 
1221         if (isicom_paranoia_check(port, tty->name, "isicom_write_room"))
 
1224         free = SERIAL_XMIT_SIZE - port->xmit_cnt - 1;
 
1230 /* chars_in_buffer et all */
 
1231 static int isicom_chars_in_buffer(struct tty_struct *tty)
 
1233         struct isi_port *port = tty->driver_data;
 
1234         if (isicom_paranoia_check(port, tty->name, "isicom_chars_in_buffer"))
 
1236         return port->xmit_cnt;
 
1240 static inline void isicom_send_break(struct isi_port *port,
 
1241         unsigned long length)
 
1243         struct isi_board *card = port->card;
 
1244         unsigned long base = card->base;
 
1246         if (!lock_card(card))
 
1249         outw(0x8000 | ((port->channel) << (card->shift_count)) | 0x3, base);
 
1250         outw((length & 0xff) << 8 | 0x00, base);
 
1251         outw((length & 0xff00), base);
 
1252         InterruptTheCard(base);
 
1257 static int isicom_tiocmget(struct tty_struct *tty, struct file *file)
 
1259         struct isi_port *port = tty->driver_data;
 
1260         /* just send the port status */
 
1261         u16 status = port->status;
 
1263         if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
 
1266         return  ((status & ISI_RTS) ? TIOCM_RTS : 0) |
 
1267                 ((status & ISI_DTR) ? TIOCM_DTR : 0) |
 
1268                 ((status & ISI_DCD) ? TIOCM_CAR : 0) |
 
1269                 ((status & ISI_DSR) ? TIOCM_DSR : 0) |
 
1270                 ((status & ISI_CTS) ? TIOCM_CTS : 0) |
 
1271                 ((status & ISI_RI ) ? TIOCM_RI  : 0);
 
1274 static int isicom_tiocmset(struct tty_struct *tty, struct file *file,
 
1275         unsigned int set, unsigned int clear)
 
1277         struct isi_port *port = tty->driver_data;
 
1279         if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
 
1282         if (set & TIOCM_RTS)
 
1284         if (set & TIOCM_DTR)
 
1287         if (clear & TIOCM_RTS)
 
1289         if (clear & TIOCM_DTR)
 
1295 static int isicom_set_serial_info(struct isi_port *port,
 
1296         struct serial_struct __user *info)
 
1298         struct serial_struct newinfo;
 
1301         if (copy_from_user(&newinfo, info, sizeof(newinfo)))
 
1304         reconfig_port = ((port->flags & ASYNC_SPD_MASK) !=
 
1305                 (newinfo.flags & ASYNC_SPD_MASK));
 
1307         if (!capable(CAP_SYS_ADMIN)) {
 
1308                 if ((newinfo.close_delay != port->close_delay) ||
 
1309                                 (newinfo.closing_wait != port->closing_wait) ||
 
1310                                 ((newinfo.flags & ~ASYNC_USR_MASK) !=
 
1311                                 (port->flags & ~ASYNC_USR_MASK)))
 
1313                 port->flags = ((port->flags & ~ ASYNC_USR_MASK) |
 
1314                                 (newinfo.flags & ASYNC_USR_MASK));
 
1317                 port->close_delay = newinfo.close_delay;
 
1318                 port->closing_wait = newinfo.closing_wait;
 
1319                 port->flags = ((port->flags & ~ASYNC_FLAGS) |
 
1320                                 (newinfo.flags & ASYNC_FLAGS));
 
1322         if (reconfig_port) {
 
1323                 isicom_config_port(port);
 
1328 static int isicom_get_serial_info(struct isi_port *port,
 
1329         struct serial_struct __user *info)
 
1331         struct serial_struct out_info;
 
1333         memset(&out_info, 0, sizeof(out_info));
 
1334 /*      out_info.type = ? */
 
1335         out_info.line = port - isi_ports;
 
1336         out_info.port = port->card->base;
 
1337         out_info.irq = port->card->irq;
 
1338         out_info.flags = port->flags;
 
1339 /*      out_info.baud_base = ? */
 
1340         out_info.close_delay = port->close_delay;
 
1341         out_info.closing_wait = port->closing_wait;
 
1342         if (copy_to_user(info, &out_info, sizeof(out_info)))
 
1347 static int isicom_ioctl(struct tty_struct *tty, struct file *filp,
 
1348         unsigned int cmd, unsigned long arg)
 
1350         struct isi_port *port = tty->driver_data;
 
1351         void __user *argp = (void __user *)arg;
 
1354         if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
 
1359                 retval = tty_check_change(tty);
 
1362                 tty_wait_until_sent(tty, 0);
 
1364                         isicom_send_break(port, HZ/4);
 
1368                 retval = tty_check_change(tty);
 
1371                 tty_wait_until_sent(tty, 0);
 
1372                 isicom_send_break(port, arg ? arg * (HZ/10) : HZ/4);
 
1376                 return put_user(C_CLOCAL(tty) ? 1 : 0,
 
1377                                 (unsigned long __user *)argp);
 
1380                 if (get_user(arg, (unsigned long __user *) argp))
 
1382                 tty->termios->c_cflag =
 
1383                         ((tty->termios->c_cflag & ~CLOCAL) |
 
1384                         (arg ? CLOCAL : 0));
 
1388                 return isicom_get_serial_info(port, argp);
 
1391                 return isicom_set_serial_info(port, argp);
 
1394                 return -ENOIOCTLCMD;
 
1399 /* set_termios et all */
 
1400 static void isicom_set_termios(struct tty_struct *tty,
 
1401         struct termios *old_termios)
 
1403         struct isi_port *port = tty->driver_data;
 
1405         if (isicom_paranoia_check(port, tty->name, "isicom_set_termios"))
 
1408         if (tty->termios->c_cflag == old_termios->c_cflag &&
 
1409                         tty->termios->c_iflag == old_termios->c_iflag)
 
1412         isicom_config_port(port);
 
1414         if ((old_termios->c_cflag & CRTSCTS) &&
 
1415                         !(tty->termios->c_cflag & CRTSCTS)) {
 
1416                 tty->hw_stopped = 0;
 
1421 /* throttle et all */
 
1422 static void isicom_throttle(struct tty_struct *tty)
 
1424         struct isi_port *port = tty->driver_data;
 
1425         struct isi_board *card = port->card;
 
1427         if (isicom_paranoia_check(port, tty->name, "isicom_throttle"))
 
1430         /* tell the card that this port cannot handle any more data for now */
 
1431         card->port_status &= ~(1 << port->channel);
 
1432         outw(card->port_status, card->base + 0x02);
 
1435 /* unthrottle et all */
 
1436 static void isicom_unthrottle(struct tty_struct *tty)
 
1438         struct isi_port *port = tty->driver_data;
 
1439         struct isi_board *card = port->card;
 
1441         if (isicom_paranoia_check(port, tty->name, "isicom_unthrottle"))
 
1444         /* tell the card that this port is ready to accept more data */
 
1445         card->port_status |= (1 << port->channel);
 
1446         outw(card->port_status, card->base + 0x02);
 
1450 static void isicom_stop(struct tty_struct *tty)
 
1452         struct isi_port *port = tty->driver_data;
 
1454         if (isicom_paranoia_check(port, tty->name, "isicom_stop"))
 
1457         /* this tells the transmitter not to consider this port for
 
1458            data output to the card. */
 
1459         port->status &= ~ISI_TXOK;
 
1463 static void isicom_start(struct tty_struct *tty)
 
1465         struct isi_port *port = tty->driver_data;
 
1467         if (isicom_paranoia_check(port, tty->name, "isicom_start"))
 
1470         /* this tells the transmitter to consider this port for
 
1471            data output to the card. */
 
1472         port->status |= ISI_TXOK;
 
1476 static void do_isicom_hangup(void *data)
 
1478         struct isi_port *port = data;
 
1479         struct tty_struct *tty;
 
1486 static void isicom_hangup(struct tty_struct *tty)
 
1488         struct isi_port *port = tty->driver_data;
 
1490         if (isicom_paranoia_check(port, tty->name, "isicom_hangup"))
 
1493         isicom_shutdown_port(port);
 
1495         port->flags &= ~ASYNC_NORMAL_ACTIVE;
 
1497         wake_up_interruptible(&port->open_wait);
 
1500 /* flush_buffer et all */
 
1501 static void isicom_flush_buffer(struct tty_struct *tty)
 
1503         struct isi_port *port = tty->driver_data;
 
1504         struct isi_board *card = port->card;
 
1505         unsigned long flags;
 
1507         if (isicom_paranoia_check(port, tty->name, "isicom_flush_buffer"))
 
1510         spin_lock_irqsave(&card->card_lock, flags);
 
1511         port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
 
1512         spin_unlock_irqrestore(&card->card_lock, flags);
 
1514         wake_up_interruptible(&tty->write_wait);
 
1519  * Driver init and deinit functions
 
1522 static int __devinit isicom_register_ioregion(struct pci_dev *pdev,
 
1523         const unsigned int index)
 
1525         struct isi_board *board = pci_get_drvdata(pdev);
 
1530         if (!request_region(board->base, 16, ISICOM_NAME)) {
 
1531                 dev_dbg(&pdev->dev, "I/O Region 0x%lx-0x%lx is busy. Card%d "
 
1532                         "will be disabled.\n", board->base, board->base + 15,
 
1540 static void isicom_unregister_ioregion(struct pci_dev *pdev)
 
1542         struct isi_board *board = pci_get_drvdata(pdev);
 
1547         release_region(board->base, 16);
 
1548         dev_dbg(&pdev->dev, "I/O Region 0x%lx-0x%lx released.\n",
 
1549                 board->base, board->base + 15);
 
1553 static struct tty_operations isicom_ops = {
 
1554         .open                   = isicom_open,
 
1555         .close                  = isicom_close,
 
1556         .write                  = isicom_write,
 
1557         .put_char               = isicom_put_char,
 
1558         .flush_chars            = isicom_flush_chars,
 
1559         .write_room             = isicom_write_room,
 
1560         .chars_in_buffer        = isicom_chars_in_buffer,
 
1561         .ioctl                  = isicom_ioctl,
 
1562         .set_termios            = isicom_set_termios,
 
1563         .throttle               = isicom_throttle,
 
1564         .unthrottle             = isicom_unthrottle,
 
1565         .stop                   = isicom_stop,
 
1566         .start                  = isicom_start,
 
1567         .hangup                 = isicom_hangup,
 
1568         .flush_buffer           = isicom_flush_buffer,
 
1569         .tiocmget               = isicom_tiocmget,
 
1570         .tiocmset               = isicom_tiocmset,
 
1573 static int __devinit isicom_register_tty_driver(void)
 
1575         int error = -ENOMEM;
 
1577         /* tty driver structure initialization */
 
1578         isicom_normal = alloc_tty_driver(PORT_COUNT);
 
1582         isicom_normal->owner                    = THIS_MODULE;
 
1583         isicom_normal->name                     = "ttyM";
 
1584         isicom_normal->devfs_name               = "isicom/";
 
1585         isicom_normal->major                    = ISICOM_NMAJOR;
 
1586         isicom_normal->minor_start              = 0;
 
1587         isicom_normal->type                     = TTY_DRIVER_TYPE_SERIAL;
 
1588         isicom_normal->subtype                  = SERIAL_TYPE_NORMAL;
 
1589         isicom_normal->init_termios             = tty_std_termios;
 
1590         isicom_normal->init_termios.c_cflag     = B9600 | CS8 | CREAD | HUPCL |
 
1592         isicom_normal->flags                    = TTY_DRIVER_REAL_RAW;
 
1593         tty_set_operations(isicom_normal, &isicom_ops);
 
1595         if ((error = tty_register_driver(isicom_normal))) {
 
1596                 pr_dbg("Couldn't register the dialin driver, error=%d\n",
 
1598                 put_tty_driver(isicom_normal);
 
1604 static void isicom_unregister_tty_driver(void)
 
1608         if ((error = tty_unregister_driver(isicom_normal)))
 
1609                 pr_dbg("couldn't unregister normal driver, error=%d.\n", error);
 
1611         put_tty_driver(isicom_normal);
 
1614 static int __devinit isicom_register_isr(struct pci_dev *pdev,
 
1615         const unsigned int index)
 
1617         struct isi_board *board = pci_get_drvdata(pdev);
 
1618         unsigned long irqflags = SA_INTERRUPT;
 
1619         int retval = -EINVAL;
 
1624         if (board->isa == NO)
 
1625                 irqflags |= SA_SHIRQ;
 
1627         retval = request_irq(board->irq, isicom_interrupt, irqflags,
 
1628                 ISICOM_NAME, board);
 
1630                 dev_warn(&pdev->dev, "Could not install handler at Irq %d. "
 
1631                         "Card%d will be disabled.\n", board->irq, index + 1);
 
1638 static int __devinit reset_card(struct pci_dev *pdev,
 
1639         const unsigned int card, unsigned int *signature)
 
1641         struct isi_board *board = pci_get_drvdata(pdev);
 
1642         unsigned long base = board->base;
 
1643         unsigned int portcount = 0;
 
1646         dev_dbg(&pdev->dev, "ISILoad:Resetting Card%d at 0x%lx\n", card + 1,
 
1653         outw(0, base + 0x8); /* Reset */
 
1657         *signature = inw(base + 0x4) & 0xff;
 
1659         if (board->isa == YES) {
 
1660                 if (!(inw(base + 0xe) & 0x1) || (inw(base + 0x2))) {
 
1661                         dev_dbg(&pdev->dev, "base+0x2=0x%lx, base+0xe=0x%lx\n",
 
1662                                 inw(base + 0x2), inw(base + 0xe));
 
1663                         dev_err(&pdev->dev, "ISILoad:ISA Card%d reset failure "
 
1664                                 "(Possible bad I/O Port Address 0x%lx).\n",
 
1670                 portcount = inw(base + 0x2);
 
1671                 if (!(inw(base + 0xe) & 0x1) || ((portcount != 0) &&
 
1672                                 (portcount != 4) && (portcount != 8))) {
 
1673                         dev_dbg(&pdev->dev, "base+0x2=0x%lx, base+0xe=0x%lx\n",
 
1674                                 inw(base + 0x2), inw(base + 0xe));
 
1675                         dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure "
 
1676                                 "(Possible bad I/O Port Address 0x%lx).\n",
 
1683         switch (*signature) {
 
1687                 board->port_count = (board->isa == NO && portcount == 4) ? 4 :
 
1689                 board->shift_count = 12;
 
1692                 board->port_count = 16;
 
1693                 board->shift_count = 11;
 
1696                 dev_warn(&pdev->dev, "ISILoad:Card%d reset failure (Possible "
 
1697                         "bad I/O Port Address 0x%lx).\n", card + 1, base);
 
1698                 dev_dbg(&pdev->dev, "Sig=0x%lx\n", signature);
 
1701         dev_info(&pdev->dev, "-Done\n");
 
1707 static inline int WaitTillCardIsFree(u16 base)
 
1709         unsigned long count = 0;
 
1711         while (!(inw(base + 0xe) & 0x1) && count++ < 100)
 
1714         return !(inw(base + 0xe) & 0x1);
 
1717 static int __devinit load_firmware(struct pci_dev *pdev,
 
1718         const unsigned int index, const unsigned int signature)
 
1720         struct isi_board *board = pci_get_drvdata(pdev);
 
1721         const struct firmware *fw;
 
1722         unsigned long base = board->base;
 
1724         u16 word_count, status;
 
1735         switch (signature) {
 
1737                 name = "isi608.bin";
 
1740                 name = "isi608em.bin";
 
1743                 name = "isi616em.bin";
 
1746                 name = "isi4608.bin";
 
1749                 name = "isi4616.bin";
 
1752                 dev_err(&pdev->dev, "Unknown signature.\n");
 
1756         retval = request_firmware(&fw, name, &pdev->dev);
 
1760         for (frame = (struct stframe *)fw->data;
 
1761                         frame < (struct stframe *)(fw->data + fw->size);
 
1763                 if (WaitTillCardIsFree(base))
 
1766                 outw(0xf0, base);       /* start upload sequence */
 
1768                 outw(frame->addr, base); /* lsb of address */
 
1770                 word_count = frame->count / 2 + frame->count % 2;
 
1771                 outw(word_count, base);
 
1772                 InterruptTheCard(base);
 
1774                 udelay(100); /* 0x2f */
 
1776                 if (WaitTillCardIsFree(base))
 
1779                 if ((status = inw(base + 0x4)) != 0) {
 
1780                         dev_warn(&pdev->dev, "Card%d rejected load header:\n"
 
1781                                 "Address:0x%x\nCount:0x%x\nStatus:0x%x\n",
 
1782                                 index + 1, frame->addr, frame->count, status);
 
1785                 outsw(base, frame->data, word_count);
 
1787                 InterruptTheCard(base);
 
1789                 udelay(50); /* 0x0f */
 
1791                 if (WaitTillCardIsFree(base))
 
1794                 if ((status = inw(base + 0x4)) != 0) {
 
1795                         dev_err(&pdev->dev, "Card%d got out of sync.Card "
 
1796                                 "Status:0x%x\n", index + 1, status);
 
1803         if (WaitTillCardIsFree(base))
 
1810         InterruptTheCard(base);
 
1811         outw(0x0, base + 0x4); /* for ISI4608 cards */
 
1813 /* XXX: should we test it by reading it back and comparing with original like
 
1814  * in load firmware package? */
 
1815         for (frame = (struct stframe*)fw->data;
 
1816                         frame < (struct stframe*)(fw->data + fw->size);
 
1818                 if (WaitTillCardIsFree(base))
 
1821                 outw(0xf1, base); /* start download sequence */
 
1823                 outw(frame->addr, base); /* lsb of address */
 
1825                 word_count = (frame->count >> 1) + frame->count % 2;
 
1826                 outw(word_count + 1, base);
 
1827                 InterruptTheCard(base);
 
1829                 udelay(50); /* 0xf */
 
1831                 if (WaitTillCardIsFree(base))
 
1834                 if ((status = inw(base + 0x4)) != 0) {
 
1835                         dev_warn(&pdev->dev, "Card%d rejected verify header:\n"
 
1836                                 "Address:0x%x\nCount:0x%x\nStatus: 0x%x\n",
 
1837                                 index + 1, frame->addr, frame->count, status);
 
1841                 data = kmalloc(word_count * 2, GFP_KERNEL);
 
1843                 insw(base, data, word_count);
 
1844                 InterruptTheCard(base);
 
1846                 for (a = 0; a < frame->count; a++)
 
1847                         if (data[a] != frame->data[a]) {
 
1849                                 dev_err(&pdev->dev, "Card%d, firmware upload "
 
1850                                         "failed\n", index + 1);
 
1855                 udelay(50); /* 0xf */
 
1857                 if (WaitTillCardIsFree(base))
 
1860                 if ((status = inw(base + 0x4)) != 0) {
 
1861                         dev_err(&pdev->dev, "Card%d verify got out of sync. "
 
1862                                 "Card Status:0x%x\n", index + 1, status);
 
1867         board->status |= FIRMWARE_LOADED;
 
1871         release_firmware(fw);
 
1877  *      Insmod can set static symbols so keep these static
 
1883 static int __devinit isicom_probe(struct pci_dev *pdev,
 
1884         const struct pci_device_id *ent)
 
1886         unsigned int ioaddr, signature, index;
 
1887         int retval = -EPERM;
 
1889         struct isi_board *board = NULL;
 
1891         if (card >= BOARD_COUNT)
 
1894         ioaddr = pci_resource_start(pdev, 3);
 
1895         /* i.e at offset 0x1c in the PCI configuration register space. */
 
1897         dev_info(&pdev->dev, "ISI PCI Card(Device ID 0x%x)\n", ent->device);
 
1899         /* allot the first empty slot in the array */
 
1900         for (index = 0; index < BOARD_COUNT; index++)
 
1901                 if (isi_card[index].base == 0) {
 
1902                         board = &isi_card[index];
 
1906         board->base = ioaddr;
 
1907         board->irq = pciirq;
 
1911         pci_set_drvdata(pdev, board);
 
1913         retval = isicom_register_ioregion(pdev, index);
 
1917         retval = isicom_register_isr(pdev, index);
 
1921         retval = reset_card(pdev, index, &signature);
 
1925         retval = load_firmware(pdev, index, signature);
 
1932         free_irq(board->irq, board);
 
1934         isicom_unregister_ioregion(pdev);
 
1940 static void __devexit isicom_remove(struct pci_dev *pdev)
 
1942         struct isi_board *board = pci_get_drvdata(pdev);
 
1944         free_irq(board->irq, board);
 
1945         isicom_unregister_ioregion(pdev);
 
1948 static int __devinit isicom_setup(void)
 
1950         int retval, idx, channel;
 
1951         struct isi_port *port;
 
1954         memset(isi_ports, 0, sizeof(isi_ports));
 
1956         for(idx = 0; idx < BOARD_COUNT; idx++) {
 
1957                 port = &isi_ports[idx * 16];
 
1958                 isi_card[idx].ports = port;
 
1959                 spin_lock_init(&isi_card[idx].card_lock);
 
1960                 for (channel = 0; channel < 16; channel++, port++) {
 
1961                         port->magic = ISICOM_MAGIC;
 
1962                         port->card = &isi_card[idx];
 
1963                         port->channel = channel;
 
1964                         port->close_delay = 50 * HZ/100;
 
1965                         port->closing_wait = 3000 * HZ/100;
 
1966                         INIT_WORK(&port->hangup_tq, do_isicom_hangup, port);
 
1967                         INIT_WORK(&port->bh_tqueue, isicom_bottomhalf, port);
 
1969                         init_waitqueue_head(&port->open_wait);
 
1970                         init_waitqueue_head(&port->close_wait);
 
1973                 isi_card[idx].base = 0;
 
1974                 isi_card[idx].irq = 0;
 
1979                 if (irq[idx] == 2 || irq[idx] == 3 || irq[idx] == 4     ||
 
1980                                 irq[idx] == 5   || irq[idx] == 7        ||
 
1981                                 irq[idx] == 10  || irq[idx] == 11       ||
 
1982                                 irq[idx] == 12  || irq[idx] == 15) {
 
1983                         printk(KERN_ERR "ISICOM: ISA not supported yet.\n");
 
1987                         printk(KERN_ERR "ISICOM: Irq %d unsupported. "
 
1988                                 "Disabling Card%d...\n", irq[idx], idx + 1);
 
1991         retval = isicom_register_tty_driver();
 
1995         retval = pci_register_driver(&isicom_driver);
 
1997                 printk(KERN_ERR "ISICOM: Unable to register pci driver.\n");
 
2002         tx.expires = jiffies + 1;
 
2004         tx.function = isicom_tx;
 
2010         isicom_unregister_tty_driver();
 
2015 static void __exit isicom_exit(void)
 
2017         unsigned int index = 0;
 
2021         while (re_schedule != 2 && index++ < 100)
 
2024         pci_unregister_driver(&isicom_driver);
 
2025         isicom_unregister_tty_driver();
 
2028 module_init(isicom_setup);
 
2029 module_exit(isicom_exit);
 
2031 MODULE_AUTHOR("MultiTech");
 
2032 MODULE_DESCRIPTION("Driver for the ISI series of cards by MultiTech");
 
2033 MODULE_LICENSE("GPL");
 
2034 module_param_array(io, int, NULL, 0);
 
2035 MODULE_PARM_DESC(io, "I/O ports for the cards");
 
2036 module_param_array(irq, int, NULL, 0);
 
2037 MODULE_PARM_DESC(irq, "Interrupts for the cards");