diff options
Diffstat (limited to 'drivers/net/igb/igb_main.c')
-rw-r--r-- | drivers/net/igb/igb_main.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 8c27e0a23dff..c05ca3461f60 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -689,7 +689,7 @@ static void igb_irq_enable(struct igb_adapter *adapter) | |||
689 | wr32(E1000_EIAC, adapter->eims_enable_mask); | 689 | wr32(E1000_EIAC, adapter->eims_enable_mask); |
690 | wr32(E1000_EIAM, adapter->eims_enable_mask); | 690 | wr32(E1000_EIAM, adapter->eims_enable_mask); |
691 | wr32(E1000_EIMS, adapter->eims_enable_mask); | 691 | wr32(E1000_EIMS, adapter->eims_enable_mask); |
692 | wr32(E1000_IMS, E1000_IMS_LSC); | 692 | wr32(E1000_IMS, E1000_IMS_LSC | E1000_IMS_DOUTSYNC); |
693 | } else { | 693 | } else { |
694 | wr32(E1000_IMS, IMS_ENABLE_MASK); | 694 | wr32(E1000_IMS, IMS_ENABLE_MASK); |
695 | wr32(E1000_IAM, IMS_ENABLE_MASK); | 695 | wr32(E1000_IAM, IMS_ENABLE_MASK); |
@@ -3287,6 +3287,11 @@ static irqreturn_t igb_msix_other(int irq, void *data) | |||
3287 | u32 icr = rd32(E1000_ICR); | 3287 | u32 icr = rd32(E1000_ICR); |
3288 | 3288 | ||
3289 | /* reading ICR causes bit 31 of EICR to be cleared */ | 3289 | /* reading ICR causes bit 31 of EICR to be cleared */ |
3290 | |||
3291 | if(icr & E1000_ICR_DOUTSYNC) { | ||
3292 | /* HW is reporting DMA is out of sync */ | ||
3293 | adapter->stats.doosync++; | ||
3294 | } | ||
3290 | if (!(icr & E1000_ICR_LSC)) | 3295 | if (!(icr & E1000_ICR_LSC)) |
3291 | goto no_link_interrupt; | 3296 | goto no_link_interrupt; |
3292 | hw->mac.get_link_status = 1; | 3297 | hw->mac.get_link_status = 1; |
@@ -3295,7 +3300,7 @@ static irqreturn_t igb_msix_other(int irq, void *data) | |||
3295 | mod_timer(&adapter->watchdog_timer, jiffies + 1); | 3300 | mod_timer(&adapter->watchdog_timer, jiffies + 1); |
3296 | 3301 | ||
3297 | no_link_interrupt: | 3302 | no_link_interrupt: |
3298 | wr32(E1000_IMS, E1000_IMS_LSC); | 3303 | wr32(E1000_IMS, E1000_IMS_LSC | E1000_IMS_DOUTSYNC); |
3299 | wr32(E1000_EIMS, adapter->eims_other); | 3304 | wr32(E1000_EIMS, adapter->eims_other); |
3300 | 3305 | ||
3301 | return IRQ_HANDLED; | 3306 | return IRQ_HANDLED; |
@@ -3499,6 +3504,11 @@ static irqreturn_t igb_intr_msi(int irq, void *data) | |||
3499 | 3504 | ||
3500 | igb_write_itr(adapter->rx_ring); | 3505 | igb_write_itr(adapter->rx_ring); |
3501 | 3506 | ||
3507 | if(icr & E1000_ICR_DOUTSYNC) { | ||
3508 | /* HW is reporting DMA is out of sync */ | ||
3509 | adapter->stats.doosync++; | ||
3510 | } | ||
3511 | |||
3502 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { | 3512 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { |
3503 | hw->mac.get_link_status = 1; | 3513 | hw->mac.get_link_status = 1; |
3504 | if (!test_bit(__IGB_DOWN, &adapter->state)) | 3514 | if (!test_bit(__IGB_DOWN, &adapter->state)) |
@@ -3534,6 +3544,11 @@ static irqreturn_t igb_intr(int irq, void *data) | |||
3534 | if (!(icr & E1000_ICR_INT_ASSERTED)) | 3544 | if (!(icr & E1000_ICR_INT_ASSERTED)) |
3535 | return IRQ_NONE; | 3545 | return IRQ_NONE; |
3536 | 3546 | ||
3547 | if(icr & E1000_ICR_DOUTSYNC) { | ||
3548 | /* HW is reporting DMA is out of sync */ | ||
3549 | adapter->stats.doosync++; | ||
3550 | } | ||
3551 | |||
3537 | eicr = rd32(E1000_EICR); | 3552 | eicr = rd32(E1000_EICR); |
3538 | 3553 | ||
3539 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { | 3554 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { |