From: Sachin Holla When RoCE is enabled, the bng_re driver allocates its own TX/CQ rings for the MPC control channel out of the same per-function FW ring pool. Enhanced bnge_reserve_rings() to account for this extra ring count to avoid pool overflow while allocating netdev rings. Signed-off-by: Sachin Holla Signed-off-by: Siva Reddy Kallam Reviewed-by: Vikas Gupta Reviewed-by: Dharmender Garg --- .../net/ethernet/broadcom/bnge/bnge_resc.c | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c index 4711dd4945ff..9dfb22b7c7c7 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c @@ -110,9 +110,24 @@ static u16 bnge_nqs_demand(struct bnge_dev *bd) return bd->nq_nr_rings + bnge_aux_get_msix(bd); } +static u16 bnge_tx_rings_demand(struct bnge_dev *bd) +{ + u16 tx_rings = bd->tx_nr_rings; + + if (bnge_is_roce_en(bd)) + tx_rings += 1; /* For MPC TX ring */ + + return tx_rings; +} + static u16 bnge_cprs_demand(struct bnge_dev *bd) { - return bd->tx_nr_rings + bd->rx_nr_rings; + u16 cprs = bd->tx_nr_rings + bd->rx_nr_rings; + + if (bnge_is_roce_en(bd)) + cprs += 1; /* For MPC CQ ring */ + + return cprs; } static u16 bnge_get_avail_msix(struct bnge_dev *bd, int num) @@ -250,7 +265,7 @@ static bool bnge_need_reserve_rings(struct bnge_dev *bd) u16 nqs = bnge_nqs_demand(bd); u16 vnic; - if (hw_resc->resv_tx_rings != bd->tx_nr_rings) + if (hw_resc->resv_tx_rings != bnge_tx_rings_demand(bd)) return true; vnic = bnge_get_total_vnics(bd, rx); @@ -275,6 +290,7 @@ int bnge_reserve_rings(struct bnge_dev *bd) u16 nq = bd->nq_nr_rings; u16 aux_msix = 0; bool sh = false; + u16 tx_demand; u16 tx_cp; int rc; @@ -293,11 +309,12 @@ int bnge_reserve_rings(struct bnge_dev *bd) hwr.nq = bnge_nqs_demand(bd); } - hwr.tx = bd->tx_nr_rings; + tx_demand = bnge_tx_rings_demand(bd); + hwr.tx = tx_demand; hwr.rx = bd->rx_nr_rings; if (bd->flags & BNGE_EN_SHARED_CHNL) sh = true; - hwr.cmpl = hwr.rx + hwr.tx; + hwr.cmpl = bnge_cprs_demand(bd); hwr.vnic = bnge_get_total_vnics(bd, hwr.rx); @@ -327,6 +344,13 @@ int bnge_reserve_rings(struct bnge_dev *bd) if (hwr.stat > bnge_aux_get_stat_ctxs(bd)) hwr.stat -= bnge_aux_get_stat_ctxs(bd); hwr.nq = min_t(u16, hwr.nq, hwr.stat); + /* Drop MPC TX ring from L2 TX ring count; it is owned by RoCE driver */ + if (bnge_is_roce_en(bd)) { + if (hwr.tx >= tx_demand) + hwr.tx -= 1; + else + return -ENOMEM; + } /* Adjust the rings */ rc = bnge_adjust_rings(bd, &rx_rings, &hwr.tx, hwr.nq, sh); -- 2.43.5