Skip to content

Commit

Permalink
[PATCH] shpchp - Fix incorrect return value of interrupt handler
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kenji Kaneshige authored and Greg Kroah-Hartman committed Mar 23, 2006
1 parent bbe779d commit e4e7304
Showing 1 changed file with 3 additions and 8 deletions.
11 changes: 3 additions & 8 deletions drivers/pci/hotplug/shpchp_hpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit e4e7304

Please sign in to comment.