From: Bjorn Helgaas I don't have this hardware, so this has been compiled but not tested. Add pci_enable_device()/pci_disable_device In the past, drivers often worked without this, but it is now required in order to route PCI interrupts correctly. In addition, this driver incorrectly used the IRQ value from PCI config space rather than the one in the struct pci_dev. Signed-off-by: Bjorn Helgaas Signed-off-by: Andrew Morton --- 25-akpm/drivers/char/ip2/ip2types.h | 3 +++ 25-akpm/drivers/char/ip2main.c | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff -puN drivers/char/ip2/ip2types.h~ip2mainc-add-missing-pci_enable_device drivers/char/ip2/ip2types.h --- 25/drivers/char/ip2/ip2types.h~ip2mainc-add-missing-pci_enable_device 2004-08-05 10:13:15.378540104 -0700 +++ 25-akpm/drivers/char/ip2/ip2types.h 2004-08-05 10:13:15.391538128 -0700 @@ -49,6 +49,9 @@ typedef struct short irq[IP2_MAX_BOARDS]; unsigned short addr[IP2_MAX_BOARDS]; int type[IP2_MAX_BOARDS]; +#ifdef CONFIG_PCI + struct pci_dev *pci_dev[IP2_MAX_BOARDS]; +#endif } ip2config_t; #endif diff -puN drivers/char/ip2main.c~ip2mainc-add-missing-pci_enable_device drivers/char/ip2main.c --- 25/drivers/char/ip2main.c~ip2mainc-add-missing-pci_enable_device 2004-08-05 10:13:15.380539800 -0700 +++ 25-akpm/drivers/char/ip2main.c 2004-08-05 10:13:15.385539040 -0700 @@ -440,6 +440,12 @@ cleanup_module(void) // free memory for (i = 0; i < IP2_MAX_BOARDS; i++) { void *pB; +#ifdef CONFIG_PCI + if (ip2config.type[i] == PCI && ip2config.pci_dev[i]) { + pci_disable_device(ip2config.pci_dev[i]); + ip2config.pci_dev[i] = NULL; + } +#endif if ((pB = i2BoardPtrTable[i]) != 0 ) { kfree ( pB ); i2BoardPtrTable[i] = NULL; @@ -594,9 +600,14 @@ ip2_loadmain(int *iop, int *irqp, unsign PCI_DEVICE_ID_COMPUTONE_IP2EX, pci_dev_i); if (pci_dev_i != NULL) { unsigned int addr; - unsigned char pci_irq; + if (pci_enable_device(pci_dev_i)) { + printk( KERN_ERR "IP2: can't enable PCI device at %s\n", + pci_name(pci_dev_i)); + break; + } ip2config.type[i] = PCI; + ip2config.pci_dev[i] = pci_dev_i; status = pci_read_config_dword(pci_dev_i, PCI_BASE_ADDRESS_1, &addr); if ( addr & 1 ) { @@ -604,8 +615,6 @@ ip2_loadmain(int *iop, int *irqp, unsign } else { printk( KERN_ERR "IP2: PCI I/O address error\n"); } - status = - pci_read_config_byte(pci_dev_i, PCI_INTERRUPT_LINE, &pci_irq); // If the PCI BIOS assigned it, lets try and use it. If we // can't acquire it or it screws up, deal with it then. @@ -614,7 +623,7 @@ ip2_loadmain(int *iop, int *irqp, unsign // printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); // pci_irq = 0; // } - ip2config.irq[i] = pci_irq; + ip2config.irq[i] = pci_dev_i->irq; } else { // ann error ip2config.addr[i] = 0; if (status == PCIBIOS_DEVICE_NOT_FOUND) { _