aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/igbvf
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2009-12-12 01:58:14 -0500
committerDavid S. Miller <davem@davemloft.net>2009-12-12 01:58:14 -0500
commit7227909340477c1e5225bb2df76cdcc95b5e1da1 (patch)
tree694e3ecd90b3bf9de6324a581ba4115d701095ee /drivers/net/igbvf
parentfef45f4ce221fc110f70716a00f40be697c5b254 (diff)
igbvf: avoid reset storms due to mailbox issues
From: Alexander Duyck <alexander.h.duyck@intel.com> This change makes it so that reset/interrupt storms can be avoided when there are mailbox issues. The new behavior is to only allow the device to trigger mailbox related resets only once every 10 seconds. 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/igbvf')
-rw-r--r--drivers/net/igbvf/igbvf.h1
-rw-r--r--drivers/net/igbvf/netdev.c8
2 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/igbvf/igbvf.h b/drivers/net/igbvf/igbvf.h
index 3d1ee7a8478e..a1774b29d222 100644
--- a/drivers/net/igbvf/igbvf.h
+++ b/drivers/net/igbvf/igbvf.h
@@ -276,6 +276,7 @@ struct igbvf_adapter {
276 unsigned long led_status; 276 unsigned long led_status;
277 277
278 unsigned int flags; 278 unsigned int flags;
279 unsigned long last_reset;
279}; 280};
280 281
281struct igbvf_info { 282struct igbvf_info {
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c
index a127620dc653..e9dd95f136aa 100644
--- a/drivers/net/igbvf/netdev.c
+++ b/drivers/net/igbvf/netdev.c
@@ -1469,6 +1469,8 @@ static void igbvf_reset(struct igbvf_adapter *adapter)
1469 memcpy(netdev->perm_addr, adapter->hw.mac.addr, 1469 memcpy(netdev->perm_addr, adapter->hw.mac.addr,
1470 netdev->addr_len); 1470 netdev->addr_len);
1471 } 1471 }
1472
1473 adapter->last_reset = jiffies;
1472} 1474}
1473 1475
1474int igbvf_up(struct igbvf_adapter *adapter) 1476int igbvf_up(struct igbvf_adapter *adapter)
@@ -1812,11 +1814,15 @@ static bool igbvf_has_link(struct igbvf_adapter *adapter)
1812 s32 ret_val = E1000_SUCCESS; 1814 s32 ret_val = E1000_SUCCESS;
1813 bool link_active; 1815 bool link_active;
1814 1816
1817 /* If interface is down, stay link down */
1818 if (test_bit(__IGBVF_DOWN, &adapter->state))
1819 return false;
1820
1815 ret_val = hw->mac.ops.check_for_link(hw); 1821 ret_val = hw->mac.ops.check_for_link(hw);
1816 link_active = !hw->mac.get_link_status; 1822 link_active = !hw->mac.get_link_status;
1817 1823
1818 /* if check for link returns error we will need to reset */ 1824 /* if check for link returns error we will need to reset */
1819 if (ret_val) 1825 if (ret_val && time_after(jiffies, adapter->last_reset + (10 * HZ)))
1820 schedule_work(&adapter->reset_task); 1826 schedule_work(&adapter->reset_task);
1821 1827
1822 return link_active; 1828 return link_active;