Skip to content

Commit

Permalink
be2net: fix be_close() to ensure all events are ack'ed
Browse files Browse the repository at this point in the history
In be_close(), be_eq_clean() must be called after all RX/TX/MCC queues
have been cleaned to ensure that any events caused while cleaning up
completions are notified/acked. Not clearing all events can cause
upredictable behaviour when RX rings are re-created in the subsequent
be_open().

Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sathya Perla authored and David S. Miller committed Dec 19, 2012
1 parent c39ba1c commit a323d9b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 9 deletions.
5 changes: 5 additions & 0 deletions drivers/net/ethernet/emulex/benet/be_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,12 @@ void be_async_mcc_enable(struct be_adapter *adapter)

void be_async_mcc_disable(struct be_adapter *adapter)
{
spin_lock_bh(&adapter->mcc_cq_lock);

adapter->mcc_obj.rearm_cq = false;
be_cq_notify(adapter, adapter->mcc_obj.cq.id, false, 0);

spin_unlock_bh(&adapter->mcc_cq_lock);
}

int be_process_mcc(struct be_adapter *adapter)
Expand Down
21 changes: 12 additions & 9 deletions drivers/net/ethernet/emulex/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2398,13 +2398,22 @@ static int be_close(struct net_device *netdev)

be_roce_dev_close(adapter);

be_async_mcc_disable(adapter);

if (!lancer_chip(adapter))
be_intr_set(adapter, false);

for_all_evt_queues(adapter, eqo, i) {
for_all_evt_queues(adapter, eqo, i)
napi_disable(&eqo->napi);

be_async_mcc_disable(adapter);

/* Wait for all pending tx completions to arrive so that
* all tx skbs are freed.
*/
be_tx_compl_clean(adapter);

be_rx_qs_destroy(adapter);

for_all_evt_queues(adapter, eqo, i) {
if (msix_enabled(adapter))
synchronize_irq(be_msix_vec_get(adapter, eqo));
else
Expand All @@ -2414,12 +2423,6 @@ static int be_close(struct net_device *netdev)

be_irq_unregister(adapter);

/* Wait for all pending tx completions to arrive so that
* all tx skbs are freed.
*/
be_tx_compl_clean(adapter);

be_rx_qs_destroy(adapter);
return 0;
}

Expand Down

0 comments on commit a323d9b

Please sign in to comment.