summaryrefslogtreecommitdiff
path: root/drivers/hotplug
diff options
context:
space:
mode:
authorDan Zink <dan.zink@hp.com>2002-10-09 01:03:36 -0700
committerGreg Kroah-Hartman <greg@kroah.com>2002-10-09 01:03:36 -0700
commite87de9d36d96678c1a034e73e8aa333dbe923b5b (patch)
tree8df149cc94022895f54b08b07ca4d7a66ed5506f /drivers/hotplug
parentdd4f25fba6038bbea1687b7563d58eb7bb8d4d9d (diff)
[PATCH] Compaq PCI Hotplug bug fix
Found the bug. The following patch fixes the hot plug driver so that it has a fallback when there are no unused IRQs on a system. At some point intialization got re- ordered and this was broken. I found another bug that was preventing the existing scheme from working. It looks like the function "pcibios_set_irq_routing" is returning 1 for success, but the hot plug driver was interpreting it as failure.
Diffstat (limited to 'drivers/hotplug')
-rw-r--r--drivers/hotplug/cpqphp_core.c4
-rw-r--r--drivers/hotplug/cpqphp_pci.c4
2 files changed, 5 insertions, 3 deletions
diff --git a/drivers/hotplug/cpqphp_core.c b/drivers/hotplug/cpqphp_core.c
index 3cb48d075157..4976f1174aeb 100644
--- a/drivers/hotplug/cpqphp_core.c
+++ b/drivers/hotplug/cpqphp_core.c
@@ -1110,6 +1110,9 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
/*
* Get IO, memory, and IRQ resources for new devices
*/
+ // The next line is required for cpqhp_find_available_resources
+ ctrl->interrupt = pdev->irq;
+
rc = cpqhp_find_available_resources(ctrl, cpqhp_rom_start);
ctrl->add_support = !rc;
if (rc) {
@@ -1138,7 +1141,6 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
writel(0xFFFFFFFFL, ctrl->hpc_reg + INT_MASK);
/* set up the interrupt */
- ctrl->interrupt = pdev->irq;
dbg("HPC interrupt = %d \n", ctrl->interrupt);
if (request_irq(ctrl->interrupt,
(void (*)(int, void *, struct pt_regs *)) &cpqhp_ctrl_intr,
diff --git a/drivers/hotplug/cpqphp_pci.c b/drivers/hotplug/cpqphp_pci.c
index 22baa9198815..d0fee047e140 100644
--- a/drivers/hotplug/cpqphp_pci.c
+++ b/drivers/hotplug/cpqphp_pci.c
@@ -360,8 +360,8 @@ int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num)
__FUNCTION__, dev_num, bus_num, int_pin, irq_num);
rc = pcibios_set_irq_routing(&fakedev, int_pin - 0x0a, irq_num);
dbg("%s: rc %d\n", __FUNCTION__, rc);
- if (rc)
- return rc;
+ if (!rc)
+ return !rc;
// set the Edge Level Control Register (ELCR)
temp_word = inb(0x4d0);