|
@@ -3478,9 +3478,17 @@ static irqreturn_t e1000_intr(int irq, void *data)
|
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
u32 icr = er32(ICR);
|
|
|
|
|
|
- if (unlikely((!icr) || test_bit(__E1000_DOWN, &adapter->flags)))
|
|
|
+ if (unlikely((!icr)))
|
|
|
return IRQ_NONE; /* Not our interrupt */
|
|
|
|
|
|
+ /*
|
|
|
+ * we might have caused the interrupt, but the above
|
|
|
+ * read cleared it, and just in case the driver is
|
|
|
+ * down there is nothing to do so return handled
|
|
|
+ */
|
|
|
+ if (unlikely(test_bit(__E1000_DOWN, &adapter->flags)))
|
|
|
+ return IRQ_HANDLED;
|
|
|
+
|
|
|
if (unlikely(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC))) {
|
|
|
hw->get_link_status = 1;
|
|
|
/* guard against interrupt when we're going down */
|