aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHariprasad Shenai <hariprasad@chelsio.com>2014-08-04 07:31:30 -0400
committerDavid S. Miller <davem@davemloft.net>2014-08-04 15:51:28 -0400
commit5fa766946ba3ef88374445ec014f0e72481fd63a (patch)
tree7eebee180c38ad36e0fedfe79635f36770513555
parent4b7a9168e1f795368458cc4ca92224c4481bedf8 (diff)
cxgb4: only free allocated fls
Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4.h1
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/sge.c35
2 files changed, 22 insertions, 14 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index 46156210df34..c9b922cc3e67 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -866,6 +866,7 @@ void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat);
866void *t4_alloc_mem(size_t size); 866void *t4_alloc_mem(size_t size);
867 867
868void t4_free_sge_resources(struct adapter *adap); 868void t4_free_sge_resources(struct adapter *adap);
869void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q);
869irq_handler_t t4_intr_handler(struct adapter *adap); 870irq_handler_t t4_intr_handler(struct adapter *adap);
870netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev); 871netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev);
871int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, 872int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
index 8bae1aa744a7..b0bba32d69d5 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
@@ -2480,6 +2480,22 @@ static void free_rspq_fl(struct adapter *adap, struct sge_rspq *rq,
2480} 2480}
2481 2481
2482/** 2482/**
2483 * t4_free_ofld_rxqs - free a block of consecutive Rx queues
2484 * @adap: the adapter
2485 * @n: number of queues
2486 * @q: pointer to first queue
2487 *
2488 * Release the resources of a consecutive block of offload Rx queues.
2489 */
2490void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q)
2491{
2492 for ( ; n; n--, q++)
2493 if (q->rspq.desc)
2494 free_rspq_fl(adap, &q->rspq,
2495 q->fl.size ? &q->fl : NULL);
2496}
2497
2498/**
2483 * t4_free_sge_resources - free SGE resources 2499 * t4_free_sge_resources - free SGE resources
2484 * @adap: the adapter 2500 * @adap: the adapter
2485 * 2501 *
@@ -2490,12 +2506,12 @@ void t4_free_sge_resources(struct adapter *adap)
2490 int i; 2506 int i;
2491 struct sge_eth_rxq *eq = adap->sge.ethrxq; 2507 struct sge_eth_rxq *eq = adap->sge.ethrxq;
2492 struct sge_eth_txq *etq = adap->sge.ethtxq; 2508 struct sge_eth_txq *etq = adap->sge.ethtxq;
2493 struct sge_ofld_rxq *oq = adap->sge.ofldrxq;
2494 2509
2495 /* clean up Ethernet Tx/Rx queues */ 2510 /* clean up Ethernet Tx/Rx queues */
2496 for (i = 0; i < adap->sge.ethqsets; i++, eq++, etq++) { 2511 for (i = 0; i < adap->sge.ethqsets; i++, eq++, etq++) {
2497 if (eq->rspq.desc) 2512 if (eq->rspq.desc)
2498 free_rspq_fl(adap, &eq->rspq, &eq->fl); 2513 free_rspq_fl(adap, &eq->rspq,
2514 eq->fl.size ? &eq->fl : NULL);
2499 if (etq->q.desc) { 2515 if (etq->q.desc) {
2500 t4_eth_eq_free(adap, adap->fn, adap->fn, 0, 2516 t4_eth_eq_free(adap, adap->fn, adap->fn, 0,
2501 etq->q.cntxt_id); 2517 etq->q.cntxt_id);
@@ -2506,18 +2522,9 @@ void t4_free_sge_resources(struct adapter *adap)
2506 } 2522 }
2507 2523
2508 /* clean up RDMA and iSCSI Rx queues */ 2524 /* clean up RDMA and iSCSI Rx queues */
2509 for (i = 0; i < adap->sge.ofldqsets; i++, oq++) { 2525 t4_free_ofld_rxqs(adap, adap->sge.ofldqsets, adap->sge.ofldrxq);
2510 if (oq->rspq.desc) 2526 t4_free_ofld_rxqs(adap, adap->sge.rdmaqs, adap->sge.rdmarxq);
2511 free_rspq_fl(adap, &oq->rspq, &oq->fl); 2527 t4_free_ofld_rxqs(adap, adap->sge.rdmaciqs, adap->sge.rdmaciq);
2512 }
2513 for (i = 0, oq = adap->sge.rdmarxq; i < adap->sge.rdmaqs; i++, oq++) {
2514 if (oq->rspq.desc)
2515 free_rspq_fl(adap, &oq->rspq, &oq->fl);
2516 }
2517 for (i = 0, oq = adap->sge.rdmaciq; i < adap->sge.rdmaciqs; i++, oq++) {
2518 if (oq->rspq.desc)
2519 free_rspq_fl(adap, &oq->rspq, &oq->fl);
2520 }
2521 2528
2522 /* clean up offload Tx queues */ 2529 /* clean up offload Tx queues */
2523 for (i = 0; i < ARRAY_SIZE(adap->sge.ofldtxq); i++) { 2530 for (i = 0; i < ARRAY_SIZE(adap->sge.ofldtxq); i++) {