Commit 615b32af authored by Jesse Brandeburg's avatar Jesse Brandeburg Committed by Jeff Kirsher

e1000e: check down flag in tasks

This change is part of a fix to avoid any tasks running while the driver is
exiting and deinitializing resources.
Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: default avatarJeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 6d90e8f4
...@@ -937,6 +937,9 @@ static void e1000_print_hw_hang(struct work_struct *work) ...@@ -937,6 +937,9 @@ static void e1000_print_hw_hang(struct work_struct *work)
u16 phy_status, phy_1000t_status, phy_ext_status; u16 phy_status, phy_1000t_status, phy_ext_status;
u16 pci_status; u16 pci_status;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1e_rphy(hw, PHY_STATUS, &phy_status); e1e_rphy(hw, PHY_STATUS, &phy_status);
e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status); e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status); e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
...@@ -1506,6 +1509,9 @@ static void e1000e_downshift_workaround(struct work_struct *work) ...@@ -1506,6 +1509,9 @@ static void e1000e_downshift_workaround(struct work_struct *work)
struct e1000_adapter *adapter = container_of(work, struct e1000_adapter *adapter = container_of(work,
struct e1000_adapter, downshift_task); struct e1000_adapter, downshift_task);
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1000e_gig_downshift_workaround_ich8lan(&adapter->hw); e1000e_gig_downshift_workaround_ich8lan(&adapter->hw);
} }
...@@ -3765,6 +3771,10 @@ static void e1000e_update_phy_task(struct work_struct *work) ...@@ -3765,6 +3771,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
{ {
struct e1000_adapter *adapter = container_of(work, struct e1000_adapter *adapter = container_of(work,
struct e1000_adapter, update_phy_task); struct e1000_adapter, update_phy_task);
if (test_bit(__E1000_DOWN, &adapter->state))
return;
e1000_get_phy_info(&adapter->hw); e1000_get_phy_info(&adapter->hw);
} }
...@@ -3775,6 +3785,10 @@ static void e1000e_update_phy_task(struct work_struct *work) ...@@ -3775,6 +3785,10 @@ static void e1000e_update_phy_task(struct work_struct *work)
static void e1000_update_phy_info(unsigned long data) static void e1000_update_phy_info(unsigned long data)
{ {
struct e1000_adapter *adapter = (struct e1000_adapter *) data; struct e1000_adapter *adapter = (struct e1000_adapter *) data;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
schedule_work(&adapter->update_phy_task); schedule_work(&adapter->update_phy_task);
} }
...@@ -4149,6 +4163,9 @@ static void e1000_watchdog_task(struct work_struct *work) ...@@ -4149,6 +4163,9 @@ static void e1000_watchdog_task(struct work_struct *work)
u32 link, tctl; u32 link, tctl;
int tx_pending = 0; int tx_pending = 0;
if (test_bit(__E1000_DOWN, &adapter->state))
return;
link = e1000e_has_link(adapter); link = e1000e_has_link(adapter);
if ((netif_carrier_ok(netdev)) && link) { if ((netif_carrier_ok(netdev)) && link) {
/* Cancel scheduled suspend requests. */ /* Cancel scheduled suspend requests. */
...@@ -4887,6 +4904,10 @@ static void e1000_reset_task(struct work_struct *work) ...@@ -4887,6 +4904,10 @@ static void e1000_reset_task(struct work_struct *work)
struct e1000_adapter *adapter; struct e1000_adapter *adapter;
adapter = container_of(work, struct e1000_adapter, reset_task); adapter = container_of(work, struct e1000_adapter, reset_task);
/* don't run the task if already down */
if (test_bit(__E1000_DOWN, &adapter->state))
return;
if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) && if (!((adapter->flags & FLAG_RX_NEEDS_RESTART) &&
(adapter->flags & FLAG_RX_RESTART_NOW))) { (adapter->flags & FLAG_RX_RESTART_NOW))) {
e1000e_dump(adapter); e1000e_dump(adapter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment