diff -Naur linux-2.4.22-pre6/drivers/scsi/aha152x.c linux-2.4.22-bpd/drivers/scsi/aha152x.c --- linux-2.4.22-pre6/drivers/scsi/aha152x.c 2003-06-13 08:51:36.000000000 -0600 +++ linux-2.4.22-bpd/drivers/scsi/aha152x.c 2003-07-15 16:05:09.000000000 -0600 @@ -1930,12 +1930,30 @@ static void intr(int irqno, void *dev_id, struct pt_regs *regs) { struct Scsi_Host *shpnt = lookup_irq(irqno); + unsigned char rev, dmacntrl0; if (!shpnt) { printk(KERN_ERR "aha152x: catched interrupt %d for unknown controller.\n", irqno); return; } + /* + * Read a couple of registers that are known to not be all 1's. If + * we read all 1's (-1), that means that either: + * a. The host adapter chip has gone bad, and we cannot control it, + * OR + * b. The host adapter is a PCMCIA card that has been ejected + * In either case, we cannot do anything with the host adapter at + * this point in time. So just ignore the interrupt and return. + * In the latter case, the interrupt might actually be meant for + * someone else sharing this IRQ, and that driver will handle it + */ + rev = GETPORT(REV); + dmacntrl0 = GETPORT(DMACNTRL0); + if ((rev == 0xFF) && (dmacntrl0 == 0xFF)) { + return; + } + /* no more interrupts from the controller, while we're busy. INTEN is restored by the BH handler */ CLRBITS(DMACNTRL0, INTEN); diff -Naur linux-2.4.22-pre6/drivers/scsi/pcmcia/aha152x_stub.c linux-2.4.22-bpd/drivers/scsi/pcmcia/aha152x_stub.c --- linux-2.4.22-pre6/drivers/scsi/pcmcia/aha152x_stub.c 2001-12-21 10:41:55.000000000 -0700 +++ linux-2.4.22-bpd/drivers/scsi/pcmcia/aha152x_stub.c 2003-07-17 14:03:03.000000000 -0600 @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -139,8 +138,6 @@ if (!info) return NULL; memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; - link->release.function = &aha152x_release_cs; - link->release.data = (u_long)link; link->io.NumPorts1 = 0x20; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -193,7 +190,6 @@ if (*linkp == NULL) return; - del_timer(&link->release); if (link->state & DEV_CONFIG) { aha152x_release_cs((u_long)link); if (link->state & DEV_STALE_CONFIG) { @@ -383,7 +379,7 @@ case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) - mod_timer(&link->release, jiffies + HZ/20); + aha152x_release_cs((u_long)link); break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; diff -Naur linux-2.4.22-pre6/drivers/scsi/pcmcia/fdomain_stub.c linux-2.4.22-bpd/drivers/scsi/pcmcia/fdomain_stub.c --- linux-2.4.22-pre6/drivers/scsi/pcmcia/fdomain_stub.c 2001-12-21 10:41:55.000000000 -0700 +++ linux-2.4.22-bpd/drivers/scsi/pcmcia/fdomain_stub.c 2003-07-17 14:04:36.000000000 -0600 @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -125,8 +124,6 @@ if (!info) return NULL; memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; - link->release.function = &fdomain_release; - link->release.data = (u_long)link; link->io.NumPorts1 = 0x10; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -179,7 +176,6 @@ if (*linkp == NULL) return; - del_timer(&link->release); if (link->state & DEV_CONFIG) { fdomain_release((u_long)link); if (link->state & DEV_STALE_CONFIG) { @@ -350,7 +346,7 @@ case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) - mod_timer(&link->release, jiffies + HZ/20); + fdomain_release((u_long)link); break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; diff -Naur linux-2.4.22-pre6/drivers/scsi/pcmcia/nsp_cs.c linux-2.4.22-bpd/drivers/scsi/pcmcia/nsp_cs.c --- linux-2.4.22-pre6/drivers/scsi/pcmcia/nsp_cs.c 2003-06-13 08:51:36.000000000 -0600 +++ linux-2.4.22-bpd/drivers/scsi/pcmcia/nsp_cs.c 2003-07-17 14:07:43.000000000 -0600 @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -1341,10 +1340,6 @@ link = &info->link; link->priv = info; - /* Initialize the dev_link_t structure */ - link->release.function = &nsp_cs_release; - link->release.data = (u_long)link; - /* The io structure describes IO port mapping */ link->io.NumPorts1 = 0x10; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -1415,7 +1410,6 @@ return; } - del_timer(&link->release); if (link->state & DEV_CONFIG) { nsp_cs_release((u_long)link); if (link->state & DEV_STALE_CONFIG) { @@ -1660,7 +1654,7 @@ link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { ((scsi_info_t *)link->priv)->stop = 1; - mod_timer(&link->release, jiffies + HZ/20); + nsp_cs_release((u_long)link); } break; diff -Naur linux-2.4.22-pre6/drivers/scsi/pcmcia/qlogic_stub.c linux-2.4.22-bpd/drivers/scsi/pcmcia/qlogic_stub.c --- linux-2.4.22-pre6/drivers/scsi/pcmcia/qlogic_stub.c 2001-12-21 10:41:55.000000000 -0700 +++ linux-2.4.22-bpd/drivers/scsi/pcmcia/qlogic_stub.c 2003-07-17 14:05:36.000000000 -0600 @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -132,8 +131,6 @@ if (!info) return NULL; memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; - link->release.function = &qlogic_release; - link->release.data = (u_long)link; link->io.NumPorts1 = 16; link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; @@ -186,7 +183,6 @@ if (*linkp == NULL) return; - del_timer(&link->release); if (link->state & DEV_CONFIG) { qlogic_release((u_long)link); if (link->state & DEV_STALE_CONFIG) { @@ -371,7 +367,7 @@ case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) - mod_timer(&link->release, jiffies + HZ/20); + qlogic_release((u_long)link); break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;