summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorIoana Radulescu <ruxandra.radulescu@freescale.com>2013-08-23 09:01:27 (GMT)
committerRivera Jose-B46482 <German.Rivera@freescale.com>2013-09-10 23:13:44 (GMT)
commitf44a73568f3fb888753002dc7e3daedd74fd7033 (patch)
tree8f5f382073a72d74a8ea4107b80d376b2d8537b5 /drivers/net/ethernet
parent8d148633d8dccd7b5730e15f66d928c4dc1eafd5 (diff)
downloadlinux-fsl-qoriq-f44a73568f3fb888753002dc7e3daedd74fd7033.tar.xz
dpaa_eth: Fix draining of buffer pools
When draining buffers in batches of eight, we must take into account the fact that BMan will return an error code if there are less than eight buffers left in the pool; when this happens, drain the remaining buffers one by one. And since we're at buffer pool cleanup, make sure allocated bpools get freed in case of errors inside the probe function. Signed-off-by: Ioana Radulescu <ruxandra.radulescu@freescale.com> Change-Id: Id0ae7ed369ded0fff7359ae20b6bf5df64e77fa1 Reviewed-on: http://git.am.freescale.net:8181/4442 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Bucur Madalin-Cristian-B32716 <madalin.bucur@freescale.com> Reviewed-by: Sovaiala Cristian-Constantin-B39531 <Cristian.Sovaiala@freescale.com> Reviewed-by: Rivera Jose-B46482 <German.Rivera@freescale.com>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c
index f0e7b15..2fd3af7 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c
@@ -559,13 +559,25 @@ _dpa_bp_free(struct dpa_bp *dpa_bp)
return;
if (bp->kernel_pool) {
- int num;
+ int ret, num = 8;
do {
struct bm_buffer bmb[8];
int i;
- num = bman_acquire(bp->pool, bmb, 8, 0);
+ ret = bman_acquire(bp->pool, bmb, num, 0);
+ if (ret < 0) {
+ if (num == 8) {
+ /* We have less than 8 buffers left;
+ * drain them one by one
+ */
+ num = 1;
+ continue;
+ } else {
+ /* Pool is fully drained */
+ break;
+ }
+ }
for (i = 0; i < num; i++) {
dma_addr_t addr = bm_buf_addr(&bmb[i]);
@@ -575,7 +587,7 @@ _dpa_bp_free(struct dpa_bp *dpa_bp)
_dpa_bp_free_buf(phys_to_virt(addr));
}
- } while (num == 8);
+ } while (ret > 0);
}
dpa_bp_array[bp->bpid] = 0;
@@ -4270,6 +4282,7 @@ tx_fq_probe_failed:
rx_fq_probe_failed:
alloc_failed:
mac_probe_failed:
+ devm_kfree(dev, dpa_bp);
bp_probe_failed:
dev_set_drvdata(dev, NULL);
if (net_dev)
@@ -4310,6 +4323,7 @@ static int __cold dpa_remove(struct platform_device *of_dev)
free_percpu(priv->percpu_priv);
dpa_bp_free(priv, priv->dpa_bp);
+ devm_kfree(dev, priv->dpa_bp);
#ifdef CONFIG_FSL_DPAA_ETH_DEBUGFS
/* remove debugfs entry for this net_device */