Commit 66fbb541 authored by Oliver Neukum's avatar Oliver Neukum Committed by John W. Linville

iwl4965: fix not correctly dealing with hotunplug

The interrupt handler returns IRQ_NONE if it detects that the device
is gone. That's incorrect because the device may have raised the interrupt.
Not acknowledging it may trigger the spurious interrupt detection and kill
drivers sharing the interrupt line.
Signed-off-by: default avatarOliver Neukum <oneukum@suse.de>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 755a957d
...@@ -5156,9 +5156,10 @@ static irqreturn_t iwl_isr(int irq, void *data) ...@@ -5156,9 +5156,10 @@ static irqreturn_t iwl_isr(int irq, void *data)
} }
if ((inta == 0xFFFFFFFF) || ((inta & 0xFFFFFFF0) == 0xa5a5a5a0)) { if ((inta == 0xFFFFFFFF) || ((inta & 0xFFFFFFF0) == 0xa5a5a5a0)) {
/* Hardware disappeared */ /* Hardware disappeared. It might have already raised
* an interrupt */
IWL_WARNING("HARDWARE GONE?? INTA == 0x%080x\n", inta); IWL_WARNING("HARDWARE GONE?? INTA == 0x%080x\n", inta);
goto none; goto unplugged;
} }
IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n",
...@@ -5166,8 +5167,9 @@ static irqreturn_t iwl_isr(int irq, void *data) ...@@ -5166,8 +5167,9 @@ static irqreturn_t iwl_isr(int irq, void *data)
/* iwl_irq_tasklet() will service interrupts and re-enable them */ /* iwl_irq_tasklet() will service interrupts and re-enable them */
tasklet_schedule(&priv->irq_tasklet); tasklet_schedule(&priv->irq_tasklet);
spin_unlock(&priv->lock);
unplugged:
spin_unlock(&priv->lock);
return IRQ_HANDLED; return IRQ_HANDLED;
none: none:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment