igb: add support for device reset interrupt
authorAlexander Duyck <alexander.h.duyck@intel.com>
Thu, 7 Jan 2010 17:41:00 +0000 (17:41 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Jan 2010 09:02:19 +0000 (01:02 -0800)
This patch adds support for the global device reset interrupt.  Without
this change the drivers will report tx hangs on all ports when a global
device reset occurs.

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>
drivers/net/igb/igb_main.c

index 484fbc8..e959b88 100644 (file)
@@ -4110,6 +4110,9 @@ static irqreturn_t igb_msix_other(int irq, void *data)
        u32 icr = rd32(E1000_ICR);
        /* reading ICR causes bit 31 of EICR to be cleared */
 
+       if (icr & E1000_ICR_DRSTA)
+               schedule_work(&adapter->reset_task);
+
        if (icr & E1000_ICR_DOUTSYNC) {
                /* HW is reporting DMA is out of sync */
                adapter->stats.doosync++;
@@ -4733,6 +4736,9 @@ static irqreturn_t igb_intr_msi(int irq, void *data)
 
        igb_write_itr(q_vector);
 
+       if (icr & E1000_ICR_DRSTA)
+               schedule_work(&adapter->reset_task);
+
        if (icr & E1000_ICR_DOUTSYNC) {
                /* HW is reporting DMA is out of sync */
                adapter->stats.doosync++;
@@ -4772,6 +4778,9 @@ static irqreturn_t igb_intr(int irq, void *data)
        if (!(icr & E1000_ICR_INT_ASSERTED))
                return IRQ_NONE;
 
+       if (icr & E1000_ICR_DRSTA)
+               schedule_work(&adapter->reset_task);
+
        if (icr & E1000_ICR_DOUTSYNC) {
                /* HW is reporting DMA is out of sync */
                adapter->stats.doosync++;