| From b895e1a06489b8dd8f2742024ceb36589fbd1b12 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 22 Jul 2021 15:15:51 +0300 |
| Subject: dpaa2-switch: seed the buffer pool after allocating the swp |
| |
| From: Ioana Ciornei <ioana.ciornei@nxp.com> |
| |
| [ Upstream commit 7aaa0f311e2df2704fa8ddb8ed681a3b5841d0bf ] |
| |
| Any interraction with the buffer pool (seeding a buffer, acquire one) is |
| made through a software portal (SWP, a DPIO object). |
| There are circumstances where the dpaa2-switch driver probes on a DPSW |
| before any DPIO devices have been probed. In this case, seeding of the |
| buffer pool will lead to a panic since no SWPs are initialized. |
| |
| To fix this, seed the buffer pool after making sure that the software |
| portals have been probed and are ready to be used. |
| |
| Fixes: 0b1b71370458 ("staging: dpaa2-switch: handle Rx path on control interface") |
| Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../net/ethernet/freescale/dpaa2/dpaa2-switch.c | 16 ++++++++-------- |
| 1 file changed, 8 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c |
| index 05de37c3b64c..87321b7239cf 100644 |
| --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c |
| +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c |
| @@ -2770,32 +2770,32 @@ static int dpaa2_switch_ctrl_if_setup(struct ethsw_core *ethsw) |
| if (err) |
| return err; |
| |
| - err = dpaa2_switch_seed_bp(ethsw); |
| - if (err) |
| - goto err_free_dpbp; |
| - |
| err = dpaa2_switch_alloc_rings(ethsw); |
| if (err) |
| - goto err_drain_dpbp; |
| + goto err_free_dpbp; |
| |
| err = dpaa2_switch_setup_dpio(ethsw); |
| if (err) |
| goto err_destroy_rings; |
| |
| + err = dpaa2_switch_seed_bp(ethsw); |
| + if (err) |
| + goto err_deregister_dpio; |
| + |
| err = dpsw_ctrl_if_enable(ethsw->mc_io, 0, ethsw->dpsw_handle); |
| if (err) { |
| dev_err(ethsw->dev, "dpsw_ctrl_if_enable err %d\n", err); |
| - goto err_deregister_dpio; |
| + goto err_drain_dpbp; |
| } |
| |
| return 0; |
| |
| +err_drain_dpbp: |
| + dpaa2_switch_drain_bp(ethsw); |
| err_deregister_dpio: |
| dpaa2_switch_free_dpio(ethsw); |
| err_destroy_rings: |
| dpaa2_switch_destroy_rings(ethsw); |
| -err_drain_dpbp: |
| - dpaa2_switch_drain_bp(ethsw); |
| err_free_dpbp: |
| dpaa2_switch_free_dpbp(ethsw); |
| |
| -- |
| 2.30.2 |
| |