diff options
author | Sathya Perla <sathya.perla@emulex.com> | 2012-02-23 13:50:13 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-02-24 01:50:16 -0500 |
commit | 191eb7563164529bc7d6a693742fe5bed33cf004 (patch) | |
tree | b2e92485011ae234117547796b18046ae454fe89 /drivers/net | |
parent | 8abe6fb51ebd1d16c93d4435a808e056113f3510 (diff) |
be2net: cancel be_worker during EEH recovery
EEH recovery involves ring cleanup and re-creation. The worker
thread must not run during EEH cleanup/resume.
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 13 |
2 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 86f51dea0c39..4b1994dcf3c7 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -304,6 +304,7 @@ struct be_vf_cfg { | |||
304 | }; | 304 | }; |
305 | 305 | ||
306 | #define BE_FLAGS_LINK_STATUS_INIT 1 | 306 | #define BE_FLAGS_LINK_STATUS_INIT 1 |
307 | #define BE_FLAGS_WORKER_SCHEDULED (1 << 3) | ||
307 | 308 | ||
308 | struct be_adapter { | 309 | struct be_adapter { |
309 | struct pci_dev *pdev; | 310 | struct pci_dev *pdev; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 28f2b254d227..68408d5bb0d7 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2447,6 +2447,11 @@ static void be_vf_clear(struct be_adapter *adapter) | |||
2447 | 2447 | ||
2448 | static int be_clear(struct be_adapter *adapter) | 2448 | static int be_clear(struct be_adapter *adapter) |
2449 | { | 2449 | { |
2450 | if (adapter->flags & BE_FLAGS_WORKER_SCHEDULED) { | ||
2451 | cancel_delayed_work_sync(&adapter->work); | ||
2452 | adapter->flags &= ~BE_FLAGS_WORKER_SCHEDULED; | ||
2453 | } | ||
2454 | |||
2450 | if (sriov_enabled(adapter)) | 2455 | if (sriov_enabled(adapter)) |
2451 | be_vf_clear(adapter); | 2456 | be_vf_clear(adapter); |
2452 | 2457 | ||
@@ -2648,6 +2653,9 @@ static int be_setup(struct be_adapter *adapter) | |||
2648 | goto err; | 2653 | goto err; |
2649 | } | 2654 | } |
2650 | 2655 | ||
2656 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); | ||
2657 | adapter->flags |= BE_FLAGS_WORKER_SCHEDULED; | ||
2658 | |||
2651 | return 0; | 2659 | return 0; |
2652 | err: | 2660 | err: |
2653 | be_clear(adapter); | 2661 | be_clear(adapter); |
@@ -3208,8 +3216,6 @@ static void __devexit be_remove(struct pci_dev *pdev) | |||
3208 | if (!adapter) | 3216 | if (!adapter) |
3209 | return; | 3217 | return; |
3210 | 3218 | ||
3211 | cancel_delayed_work_sync(&adapter->work); | ||
3212 | |||
3213 | unregister_netdev(adapter->netdev); | 3219 | unregister_netdev(adapter->netdev); |
3214 | 3220 | ||
3215 | be_clear(adapter); | 3221 | be_clear(adapter); |
@@ -3533,7 +3539,6 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
3533 | dev_info(&pdev->dev, "%s: %s port %d\n", netdev->name, nic_name(pdev), | 3539 | dev_info(&pdev->dev, "%s: %s port %d\n", netdev->name, nic_name(pdev), |
3534 | adapter->port_num); | 3540 | adapter->port_num); |
3535 | 3541 | ||
3536 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); | ||
3537 | return 0; | 3542 | return 0; |
3538 | 3543 | ||
3539 | unsetup: | 3544 | unsetup: |
@@ -3563,7 +3568,6 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state) | |||
3563 | struct be_adapter *adapter = pci_get_drvdata(pdev); | 3568 | struct be_adapter *adapter = pci_get_drvdata(pdev); |
3564 | struct net_device *netdev = adapter->netdev; | 3569 | struct net_device *netdev = adapter->netdev; |
3565 | 3570 | ||
3566 | cancel_delayed_work_sync(&adapter->work); | ||
3567 | if (adapter->wol) | 3571 | if (adapter->wol) |
3568 | be_setup_wol(adapter, true); | 3572 | be_setup_wol(adapter, true); |
3569 | 3573 | ||
@@ -3612,7 +3616,6 @@ static int be_resume(struct pci_dev *pdev) | |||
3612 | if (adapter->wol) | 3616 | if (adapter->wol) |
3613 | be_setup_wol(adapter, false); | 3617 | be_setup_wol(adapter, false); |
3614 | 3618 | ||
3615 | schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); | ||
3616 | return 0; | 3619 | return 0; |
3617 | } | 3620 | } |
3618 | 3621 | ||