diff options
author | Somnath Kotur <somnath.kotur@emulex.com> | 2013-05-01 23:36:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-02 16:43:27 -0400 |
commit | 04d3d6247fa39d4ee6488f1bd5314879ab9d5c9d (patch) | |
tree | b2a981719e0709a63df0e428598d7bba6b57d903 /drivers/net/ethernet/emulex | |
parent | 701962d0bbc74cfe60a93389a3394ee358362a71 (diff) |
be2net: avoid napi_disable() when it has not been enabled
When RQ creation fails in be_open(), driver jumps to be_close() where
napi_disable() is done without a prior napi_enable(); leading to a hang.
This change is needed as there is no way to see if napi is enable/disabled.
Signed-off-by: Kalesh AP <kalesh.purayil@emulex.com>
Signed-off-by: Somnath Kotur <somnath.kotur@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 | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 8 |
2 files changed, 7 insertions, 2 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 234ce6f07544..f544b297c9ab 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -327,6 +327,7 @@ enum vf_state { | |||
327 | 327 | ||
328 | #define BE_FLAGS_LINK_STATUS_INIT 1 | 328 | #define BE_FLAGS_LINK_STATUS_INIT 1 |
329 | #define BE_FLAGS_WORKER_SCHEDULED (1 << 3) | 329 | #define BE_FLAGS_WORKER_SCHEDULED (1 << 3) |
330 | #define BE_FLAGS_NAPI_ENABLED (1 << 9) | ||
330 | #define BE_UC_PMAC_COUNT 30 | 331 | #define BE_UC_PMAC_COUNT 30 |
331 | #define BE_VF_UC_PMAC_COUNT 2 | 332 | #define BE_VF_UC_PMAC_COUNT 2 |
332 | #define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11) | 333 | #define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11) |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 591a8675a13d..e6b5c4cd8c0c 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2548,8 +2548,11 @@ static int be_close(struct net_device *netdev) | |||
2548 | 2548 | ||
2549 | be_roce_dev_close(adapter); | 2549 | be_roce_dev_close(adapter); |
2550 | 2550 | ||
2551 | for_all_evt_queues(adapter, eqo, i) | 2551 | if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { |
2552 | napi_disable(&eqo->napi); | 2552 | for_all_evt_queues(adapter, eqo, i) |
2553 | napi_disable(&eqo->napi); | ||
2554 | adapter->flags &= ~BE_FLAGS_NAPI_ENABLED; | ||
2555 | } | ||
2553 | 2556 | ||
2554 | be_async_mcc_disable(adapter); | 2557 | be_async_mcc_disable(adapter); |
2555 | 2558 | ||
@@ -2657,6 +2660,7 @@ static int be_open(struct net_device *netdev) | |||
2657 | napi_enable(&eqo->napi); | 2660 | napi_enable(&eqo->napi); |
2658 | be_eq_notify(adapter, eqo->q.id, true, false, 0); | 2661 | be_eq_notify(adapter, eqo->q.id, true, false, 0); |
2659 | } | 2662 | } |
2663 | adapter->flags |= BE_FLAGS_NAPI_ENABLED; | ||
2660 | 2664 | ||
2661 | status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); | 2665 | status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); |
2662 | if (!status) | 2666 | if (!status) |