IB/ipath: Better handling of unexpected GPIO interrupts

The General Purpose I/O pins can be configured to cause interrupts. At
the end of the interrupt code dealing with all known causes, a message
is output if any bits remain un-handled. Since this is a "can't happen"
scenario, it should only be triggered by bugs elsewhere. It is harmless,
and potentially beneficial, to limit the damage by masking any such
unexpected interrupts.

This patch adds disabling of interrupts from any pins that should
not have been allowed to interrupt, in addition to emitting a message.

Signed-off-by: Michael Albaugh <Michael.Albaugh@Qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
Michael Albaugh 2007-10-03 10:47:38 -07:00 committed by Roland Dreier
parent 192594d523
commit 6a733cdc71
1 changed files with 6 additions and 4 deletions

View File

@ -1124,10 +1124,8 @@ irqreturn_t ipath_intr(int irq, void *data)
/* /*
* Some unexpected bits remain. If they could have * Some unexpected bits remain. If they could have
* caused the interrupt, complain and clear. * caused the interrupt, complain and clear.
* MEA: this is almost certainly non-ideal. * To avoid repetition of this condition, also clear
* we should look into auto-disable of unexpected * the mask. It is almost certainly due to error.
* GPIO interrupts, possibly on a "three strikes"
* basis.
*/ */
const u32 mask = (u32) dd->ipath_gpio_mask; const u32 mask = (u32) dd->ipath_gpio_mask;
@ -1135,6 +1133,10 @@ irqreturn_t ipath_intr(int irq, void *data)
ipath_dbg("Unexpected GPIO IRQ bits %x\n", ipath_dbg("Unexpected GPIO IRQ bits %x\n",
gpiostatus & mask); gpiostatus & mask);
to_clear |= (gpiostatus & mask); to_clear |= (gpiostatus & mask);
dd->ipath_gpio_mask &= ~(gpiostatus & mask);
ipath_write_kreg(dd,
dd->ipath_kregs->kr_gpio_mask,
dd->ipath_gpio_mask);
} }
} }
if (to_clear) { if (to_clear) {