diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c | 20 |
2 files changed, 20 insertions, 4 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c index 2981467..c1b400a 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c @@ -704,7 +704,7 @@ dpaa_eth_priv_probe(struct platform_device *_of_dev) net_dev = alloc_etherdev_mq(sizeof(*priv), DPAA_ETH_TX_QUEUES); if (!net_dev) { dev_err(dev, "alloc_etherdev_mq() failed\n"); - return -ENOMEM; + goto alloc_etherdev_mq_failed; } /* Do this here, so we can be verbose early */ @@ -862,6 +862,8 @@ mac_probe_failed: dev_set_drvdata(dev, NULL); if (net_dev) free_netdev(net_dev); +alloc_etherdev_mq_failed: + devm_kfree(dev, dpa_bp); return err; } diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c index 392ec1a..fc7433e 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c @@ -474,6 +474,8 @@ 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); + if (priv->buf_layout) devm_kfree(dev, priv->buf_layout); @@ -710,13 +712,25 @@ pdev_register_failed: void dpa_bp_drain(struct dpa_bp *bp) { - 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, 8, 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]); @@ -726,7 +740,7 @@ void dpa_bp_drain(struct dpa_bp *bp) bp->free_buf_cb(phys_to_virt(addr)); } - } while (num == 8); + } while (ret > 0); } static void __cold __attribute__((nonnull)) |