]> err.no Git - linux-2.6/commitdiff
[PATCH] shpchp - Fix incorrect return value of interrupt handler
authorKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Thu, 26 Jan 2006 01:05:57 +0000 (10:05 +0900)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 23 Mar 2006 22:35:12 +0000 (14:35 -0800)
Current SHPCHP driver has a bug in its interrupt handler which cause
"IRQ #: nobody cared" oops. This problem can be reproduced easily by
the following operation.

    # cd /sys/bus/pci/slots/<slot#>
    # while true; do echo 1 > attention ; done &

The reason is that when command complete interrupt is raised, current
SHPCHP driver's interrupt handler returns IRQ_NONE regardless of if
the interrupt is handled or not.

This patch fixes this issue.

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/pci/hotplug/shpchp_hpc.c

index 1a6b5448f81dab313ea36bf3f88ad059cdffaad0..943ed2b4dabed9fe9cef1ea5a8f99a52d06c4746 100644 (file)
@@ -1109,14 +1109,8 @@ static irqreturn_t shpc_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                wake_up_interruptible(&ctrl->queue);
        }
 
-       if ((intr_loc = (intr_loc >> 1)) == 0) {
-               /* Unmask Global Interrupt Mask */
-               temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE);
-               temp_dword &= 0xfffffffe;
-               writel(temp_dword, php_ctlr->creg + SERR_INTR_ENABLE);
-
-               return IRQ_NONE;
-       }
+       if ((intr_loc = (intr_loc >> 1)) == 0)
+               goto out;
 
        for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) { 
        /* To find out which slot has interrupt pending */
@@ -1146,6 +1140,7 @@ static irqreturn_t shpc_isr(int IRQ, void *dev_id, struct pt_regs *regs)
                        dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2); 
                }
        }
+ out:
        if (!shpchp_poll_mode) {
                /* Unmask Global Interrupt Mask */
                temp_dword = readl(php_ctlr->creg + SERR_INTR_ENABLE);