diff options
author | Sathya Perla <sathya.perla@emulex.com> | 2015-02-23 04:20:11 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-02-23 15:08:31 -0500 |
commit | eb7dd46c634fa5b2f2039791bd2e79343318d6e5 (patch) | |
tree | 96ee933cfca57bbe14b554e86d79e8b8f0fd24ce /drivers/net/ethernet/emulex | |
parent | ca3de6b29d09585bdb7b5af2e12f815468120184 (diff) |
be2net: use a wrapper to schedule and cancel error detection task
Also rename func_recovery_work/task to err_detection_work/task as error
detection is the primary goal of this task while recovery is not guaranteed.
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: Kalesh AP <kalesh.purayil@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 45 |
2 files changed, 32 insertions, 16 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index ad33bf1f1df1..fac806a15a61 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -376,6 +376,7 @@ enum vf_state { | |||
376 | #define BE_FLAGS_VXLAN_OFFLOADS BIT(8) | 376 | #define BE_FLAGS_VXLAN_OFFLOADS BIT(8) |
377 | #define BE_FLAGS_SETUP_DONE BIT(9) | 377 | #define BE_FLAGS_SETUP_DONE BIT(9) |
378 | #define BE_FLAGS_EVT_INCOMPATIBLE_SFP BIT(10) | 378 | #define BE_FLAGS_EVT_INCOMPATIBLE_SFP BIT(10) |
379 | #define BE_FLAGS_ERR_DETECTION_SCHEDULED BIT(11) | ||
379 | 380 | ||
380 | #define BE_UC_PMAC_COUNT 30 | 381 | #define BE_UC_PMAC_COUNT 30 |
381 | #define BE_VF_UC_PMAC_COUNT 2 | 382 | #define BE_VF_UC_PMAC_COUNT 2 |
@@ -501,7 +502,7 @@ struct be_adapter { | |||
501 | struct delayed_work work; | 502 | struct delayed_work work; |
502 | u16 work_counter; | 503 | u16 work_counter; |
503 | 504 | ||
504 | struct delayed_work func_recovery_work; | 505 | struct delayed_work be_err_detection_work; |
505 | u32 flags; | 506 | u32 flags; |
506 | u32 cmd_privileges; | 507 | u32 cmd_privileges; |
507 | /* Ethtool knobs and info */ | 508 | /* Ethtool knobs and info */ |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index fda2e5dcd977..74ba99577bf8 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -3363,6 +3363,14 @@ static void be_cancel_worker(struct be_adapter *adapter) | |||
3363 | } | 3363 | } |
3364 | } | 3364 | } |
3365 | 3365 | ||
3366 | static void be_cancel_err_detection(struct be_adapter *adapter) | ||
3367 | { | ||
3368 | if (adapter->flags & BE_FLAGS_ERR_DETECTION_SCHEDULED) { | ||
3369 | cancel_delayed_work_sync(&adapter->be_err_detection_work); | ||
3370 | adapter->flags &= ~BE_FLAGS_ERR_DETECTION_SCHEDULED; | ||
3371 | } | ||
3372 | } | ||
3373 | |||
3366 | static void be_mac_clear(struct be_adapter *adapter) | 3374 | static void be_mac_clear(struct be_adapter *adapter) |
3367 | { | 3375 | { |
3368 | if (adapter->pmac_id) { | 3376 | if (adapter->pmac_id) { |
@@ -3847,6 +3855,13 @@ static void be_schedule_worker(struct be_adapter *adapter) | |||
3847 | adapter->flags |= BE_FLAGS_WORKER_SCHEDULED; | 3855 | adapter->flags |= BE_FLAGS_WORKER_SCHEDULED; |
3848 | } | 3856 | } |
3849 | 3857 | ||
3858 | static void be_schedule_err_detection(struct be_adapter *adapter) | ||
3859 | { | ||
3860 | schedule_delayed_work(&adapter->be_err_detection_work, | ||
3861 | msecs_to_jiffies(1000)); | ||
3862 | adapter->flags |= BE_FLAGS_ERR_DETECTION_SCHEDULED; | ||
3863 | } | ||
3864 | |||
3850 | static int be_setup_queues(struct be_adapter *adapter) | 3865 | static int be_setup_queues(struct be_adapter *adapter) |
3851 | { | 3866 | { |
3852 | struct net_device *netdev = adapter->netdev; | 3867 | struct net_device *netdev = adapter->netdev; |
@@ -4925,10 +4940,11 @@ err: | |||
4925 | return status; | 4940 | return status; |
4926 | } | 4941 | } |
4927 | 4942 | ||
4928 | static void be_func_recovery_task(struct work_struct *work) | 4943 | static void be_err_detection_task(struct work_struct *work) |
4929 | { | 4944 | { |
4930 | struct be_adapter *adapter = | 4945 | struct be_adapter *adapter = |
4931 | container_of(work, struct be_adapter, func_recovery_work.work); | 4946 | container_of(work, struct be_adapter, |
4947 | be_err_detection_work.work); | ||
4932 | int status = 0; | 4948 | int status = 0; |
4933 | 4949 | ||
4934 | be_detect_error(adapter); | 4950 | be_detect_error(adapter); |
@@ -4947,8 +4963,7 @@ static void be_func_recovery_task(struct work_struct *work) | |||
4947 | * no need to attempt further recovery. | 4963 | * no need to attempt further recovery. |
4948 | */ | 4964 | */ |
4949 | if (!status || status == -EAGAIN) | 4965 | if (!status || status == -EAGAIN) |
4950 | schedule_delayed_work(&adapter->func_recovery_work, | 4966 | be_schedule_err_detection(adapter); |
4951 | msecs_to_jiffies(1000)); | ||
4952 | } | 4967 | } |
4953 | 4968 | ||
4954 | static void be_log_sfp_info(struct be_adapter *adapter) | 4969 | static void be_log_sfp_info(struct be_adapter *adapter) |
@@ -5140,7 +5155,8 @@ static int be_drv_init(struct be_adapter *adapter) | |||
5140 | pci_save_state(adapter->pdev); | 5155 | pci_save_state(adapter->pdev); |
5141 | 5156 | ||
5142 | INIT_DELAYED_WORK(&adapter->work, be_worker); | 5157 | INIT_DELAYED_WORK(&adapter->work, be_worker); |
5143 | INIT_DELAYED_WORK(&adapter->func_recovery_work, be_func_recovery_task); | 5158 | INIT_DELAYED_WORK(&adapter->be_err_detection_work, |
5159 | be_err_detection_task); | ||
5144 | 5160 | ||
5145 | adapter->rx_fc = true; | 5161 | adapter->rx_fc = true; |
5146 | adapter->tx_fc = true; | 5162 | adapter->tx_fc = true; |
@@ -5169,7 +5185,7 @@ static void be_remove(struct pci_dev *pdev) | |||
5169 | be_roce_dev_remove(adapter); | 5185 | be_roce_dev_remove(adapter); |
5170 | be_intr_set(adapter, false); | 5186 | be_intr_set(adapter, false); |
5171 | 5187 | ||
5172 | cancel_delayed_work_sync(&adapter->func_recovery_work); | 5188 | be_cancel_err_detection(adapter); |
5173 | 5189 | ||
5174 | unregister_netdev(adapter->netdev); | 5190 | unregister_netdev(adapter->netdev); |
5175 | 5191 | ||
@@ -5345,8 +5361,7 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id) | |||
5345 | 5361 | ||
5346 | be_roce_dev_add(adapter); | 5362 | be_roce_dev_add(adapter); |
5347 | 5363 | ||
5348 | schedule_delayed_work(&adapter->func_recovery_work, | 5364 | be_schedule_err_detection(adapter); |
5349 | msecs_to_jiffies(1000)); | ||
5350 | 5365 | ||
5351 | dev_info(&pdev->dev, "%s: %s %s port %c\n", nic_name(pdev), | 5366 | dev_info(&pdev->dev, "%s: %s %s port %c\n", nic_name(pdev), |
5352 | func_name(adapter), mc_name(adapter), adapter->port_name); | 5367 | func_name(adapter), mc_name(adapter), adapter->port_name); |
@@ -5379,7 +5394,7 @@ static int be_suspend(struct pci_dev *pdev, pm_message_t state) | |||
5379 | be_setup_wol(adapter, true); | 5394 | be_setup_wol(adapter, true); |
5380 | 5395 | ||
5381 | be_intr_set(adapter, false); | 5396 | be_intr_set(adapter, false); |
5382 | cancel_delayed_work_sync(&adapter->func_recovery_work); | 5397 | be_cancel_err_detection(adapter); |
5383 | 5398 | ||
5384 | netif_device_detach(netdev); | 5399 | netif_device_detach(netdev); |
5385 | if (netif_running(netdev)) { | 5400 | if (netif_running(netdev)) { |
@@ -5421,10 +5436,10 @@ static int be_resume(struct pci_dev *pdev) | |||
5421 | rtnl_unlock(); | 5436 | rtnl_unlock(); |
5422 | } | 5437 | } |
5423 | 5438 | ||
5424 | schedule_delayed_work(&adapter->func_recovery_work, | ||
5425 | msecs_to_jiffies(1000)); | ||
5426 | netif_device_attach(netdev); | 5439 | netif_device_attach(netdev); |
5427 | 5440 | ||
5441 | be_schedule_err_detection(adapter); | ||
5442 | |||
5428 | if (adapter->wol_en) | 5443 | if (adapter->wol_en) |
5429 | be_setup_wol(adapter, false); | 5444 | be_setup_wol(adapter, false); |
5430 | 5445 | ||
@@ -5443,7 +5458,7 @@ static void be_shutdown(struct pci_dev *pdev) | |||
5443 | 5458 | ||
5444 | be_roce_dev_shutdown(adapter); | 5459 | be_roce_dev_shutdown(adapter); |
5445 | cancel_delayed_work_sync(&adapter->work); | 5460 | cancel_delayed_work_sync(&adapter->work); |
5446 | cancel_delayed_work_sync(&adapter->func_recovery_work); | 5461 | be_cancel_err_detection(adapter); |
5447 | 5462 | ||
5448 | netif_device_detach(adapter->netdev); | 5463 | netif_device_detach(adapter->netdev); |
5449 | 5464 | ||
@@ -5463,7 +5478,7 @@ static pci_ers_result_t be_eeh_err_detected(struct pci_dev *pdev, | |||
5463 | if (!adapter->eeh_error) { | 5478 | if (!adapter->eeh_error) { |
5464 | adapter->eeh_error = true; | 5479 | adapter->eeh_error = true; |
5465 | 5480 | ||
5466 | cancel_delayed_work_sync(&adapter->func_recovery_work); | 5481 | be_cancel_err_detection(adapter); |
5467 | 5482 | ||
5468 | rtnl_lock(); | 5483 | rtnl_lock(); |
5469 | netif_device_detach(netdev); | 5484 | netif_device_detach(netdev); |
@@ -5542,9 +5557,9 @@ static void be_eeh_resume(struct pci_dev *pdev) | |||
5542 | goto err; | 5557 | goto err; |
5543 | } | 5558 | } |
5544 | 5559 | ||
5545 | schedule_delayed_work(&adapter->func_recovery_work, | ||
5546 | msecs_to_jiffies(1000)); | ||
5547 | netif_device_attach(netdev); | 5560 | netif_device_attach(netdev); |
5561 | |||
5562 | be_schedule_err_detection(adapter); | ||
5548 | return; | 5563 | return; |
5549 | err: | 5564 | err: |
5550 | dev_err(&adapter->pdev->dev, "EEH resume failed\n"); | 5565 | dev_err(&adapter->pdev->dev, "EEH resume failed\n"); |