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: Jesse Brandeburg <jesse.brandeburg@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
6d90e8f456
commit
615b32af97
|
@ -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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue