Commit e1f6198e authored by Ganesh Goudar's avatar Ganesh Goudar Committed by David S. Miller

cxgb4: avoid stall while shutting down the adapter

do not wait for completion while deleting the filters
when the adapter is shutting down because we may not get
the response as interrupts will be disabled.
Signed-off-by: default avatarGanesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 51957bc5
...@@ -549,6 +549,7 @@ enum { /* adapter flags */ ...@@ -549,6 +549,7 @@ enum { /* adapter flags */
MASTER_PF = (1 << 7), MASTER_PF = (1 << 7),
FW_OFLD_CONN = (1 << 9), FW_OFLD_CONN = (1 << 9),
ROOT_NO_RELAXED_ORDERING = (1 << 10), ROOT_NO_RELAXED_ORDERING = (1 << 10),
SHUTTING_DOWN = (1 << 11),
}; };
enum { enum {
......
...@@ -191,7 +191,8 @@ static int del_filter_wr(struct adapter *adapter, int fidx) ...@@ -191,7 +191,8 @@ static int del_filter_wr(struct adapter *adapter, int fidx)
return -ENOMEM; return -ENOMEM;
fwr = __skb_put(skb, len); fwr = __skb_put(skb, len);
t4_mk_filtdelwr(f->tid, fwr, adapter->sge.fw_evtq.abs_id); t4_mk_filtdelwr(f->tid, fwr, (adapter->flags & SHUTTING_DOWN) ? -1
: adapter->sge.fw_evtq.abs_id);
/* Mark the filter as "pending" and ship off the Filter Work Request. /* Mark the filter as "pending" and ship off the Filter Work Request.
* When we get the Work Request Reply we'll clear the pending status. * When we get the Work Request Reply we'll clear the pending status.
...@@ -636,6 +637,10 @@ int cxgb4_del_filter(struct net_device *dev, int filter_id) ...@@ -636,6 +637,10 @@ int cxgb4_del_filter(struct net_device *dev, int filter_id)
struct filter_ctx ctx; struct filter_ctx ctx;
int ret; int ret;
/* If we are shutting down the adapter do not wait for completion */
if (netdev2adap(dev)->flags & SHUTTING_DOWN)
return __cxgb4_del_filter(dev, filter_id, NULL);
init_completion(&ctx.completion); init_completion(&ctx.completion);
ret = __cxgb4_del_filter(dev, filter_id, &ctx); ret = __cxgb4_del_filter(dev, filter_id, &ctx);
......
...@@ -5254,6 +5254,8 @@ static void remove_one(struct pci_dev *pdev) ...@@ -5254,6 +5254,8 @@ static void remove_one(struct pci_dev *pdev)
return; return;
} }
adapter->flags |= SHUTTING_DOWN;
if (adapter->pf == 4) { if (adapter->pf == 4) {
int i; int i;
...@@ -5339,6 +5341,8 @@ static void shutdown_one(struct pci_dev *pdev) ...@@ -5339,6 +5341,8 @@ static void shutdown_one(struct pci_dev *pdev)
return; return;
} }
adapter->flags |= SHUTTING_DOWN;
if (adapter->pf == 4) { if (adapter->pf == 4) {
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment