Commit dcd769e6 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Linus Torvalds

[PATCH] ip2main.c: add missing pci_enable_device()

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: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent fac6ab89
...@@ -49,6 +49,9 @@ typedef struct ...@@ -49,6 +49,9 @@ typedef struct
short irq[IP2_MAX_BOARDS]; short irq[IP2_MAX_BOARDS];
unsigned short addr[IP2_MAX_BOARDS]; unsigned short addr[IP2_MAX_BOARDS];
int type[IP2_MAX_BOARDS]; int type[IP2_MAX_BOARDS];
#ifdef CONFIG_PCI
struct pci_dev *pci_dev[IP2_MAX_BOARDS];
#endif
} ip2config_t; } ip2config_t;
#endif #endif
...@@ -440,6 +440,12 @@ cleanup_module(void) ...@@ -440,6 +440,12 @@ cleanup_module(void)
// free memory // free memory
for (i = 0; i < IP2_MAX_BOARDS; i++) { for (i = 0; i < IP2_MAX_BOARDS; i++) {
void *pB; 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 ) { if ((pB = i2BoardPtrTable[i]) != 0 ) {
kfree ( pB ); kfree ( pB );
i2BoardPtrTable[i] = NULL; i2BoardPtrTable[i] = NULL;
...@@ -594,9 +600,14 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) ...@@ -594,9 +600,14 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
PCI_DEVICE_ID_COMPUTONE_IP2EX, pci_dev_i); PCI_DEVICE_ID_COMPUTONE_IP2EX, pci_dev_i);
if (pci_dev_i != NULL) { if (pci_dev_i != NULL) {
unsigned int addr; 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.type[i] = PCI;
ip2config.pci_dev[i] = pci_dev_i;
status = status =
pci_read_config_dword(pci_dev_i, PCI_BASE_ADDRESS_1, &addr); pci_read_config_dword(pci_dev_i, PCI_BASE_ADDRESS_1, &addr);
if ( addr & 1 ) { if ( addr & 1 ) {
...@@ -604,8 +615,6 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) ...@@ -604,8 +615,6 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
} else { } else {
printk( KERN_ERR "IP2: PCI I/O address error\n"); 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 // 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. // can't acquire it or it screws up, deal with it then.
...@@ -614,7 +623,7 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) ...@@ -614,7 +623,7 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
// printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); // printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq);
// pci_irq = 0; // pci_irq = 0;
// } // }
ip2config.irq[i] = pci_irq; ip2config.irq[i] = pci_dev_i->irq;
} else { // ann error } else { // ann error
ip2config.addr[i] = 0; ip2config.addr[i] = 0;
if (status == PCIBIOS_DEVICE_NOT_FOUND) { if (status == PCIBIOS_DEVICE_NOT_FOUND) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment