aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/igb/igb_main.c
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2009-02-06 18:19:08 -0500
committerDavid S. Miller <davem@davemloft.net>2009-02-07 05:43:08 -0500
commitdda0e0834c839c0e4b1717cbe9c22c35ca935809 (patch)
tree55be9a788e8b9815fe4fb40871cda0883c596431 /drivers/net/igb/igb_main.c
parent2753f4cebf034a53f87b24679f394854275dcacb (diff)
igb: add counter for dma out of sync errors
Add a counter for dma out of sync errors reported via interrupt. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/igb/igb_main.c')
-rw-r--r--drivers/net/igb/igb_main.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 8c27e0a23df..c05ca3461f6 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
3297no_link_interrupt: 3302no_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)) {