From kaneshige.kenji@jp.fujitsu.com Wed Jan 25 17:08:13 2006 Message-ID: <43D82075.4030401@jp.fujitsu.com> Date: Thu, 26 Jan 2006 10:05:57 +0900 From: Kenji Kaneshige To: Greg KH Cc: Kenji Kaneshige Subject: [PATCH 11/11] shpchp - Fix incorrect return value of interrupt handler 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/ # 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 Signed-off-by: Greg Kroah-Hartman --- drivers/pci/hotplug/shpchp_hpc.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) --- gregkh-2.6.orig/drivers/pci/hotplug/shpchp_hpc.c +++ gregkh-2.6/drivers/pci/hotplug/shpchp_hpc.c @@ -1109,14 +1109,8 @@ static irqreturn_t shpc_isr(int IRQ, voi 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, voi 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);