Skip to content

Commit 780baad

Browse files
Vasundhara Volamdavem330
authored andcommitted
bnxt_en: Reserve 1 stat_ctx for RDMA driver.
bnxt_en requires same number of stat_ctxs as CP rings but RDMA requires only 1 stat_ctx. Also add a new parameter resv_stat_ctxs to better keep track of stat_ctxs reserved including resources used by RDMA. Add a stat_ctxs parameter to all the relevant resource reservation functions so we can reserve the correct number of stat_ctxs. Prior to this patch, we were not reserving the extra stat_ctx for RDMA and RDMA would not work on the new 57500 chips. Signed-off-by: Vasundhara Volam <[email protected]> Signed-off-by: Michael Chan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent f4e8961 commit 780baad

File tree

2 files changed

+52
-28
lines changed

2 files changed

+52
-28
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5161,7 +5161,6 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
51615161
hw_resc->resv_vnics = le16_to_cpu(resp->alloc_vnics);
51625162
cp = le16_to_cpu(resp->alloc_cmpl_rings);
51635163
stats = le16_to_cpu(resp->alloc_stat_ctx);
5164-
cp = min_t(u16, cp, stats);
51655164
hw_resc->resv_irqs = cp;
51665165
if (bp->flags & BNXT_FLAG_CHIP_P5) {
51675166
int rx = hw_resc->resv_rx_rings;
@@ -5180,6 +5179,7 @@ static int bnxt_hwrm_get_rings(struct bnxt *bp)
51805179
hw_resc->resv_hw_ring_grps = rx;
51815180
}
51825181
hw_resc->resv_cp_rings = cp;
5182+
hw_resc->resv_stat_ctxs = stats;
51835183
}
51845184
mutex_unlock(&bp->hwrm_cmd_lock);
51855185
return 0;
@@ -5209,7 +5209,7 @@ static bool bnxt_rfs_supported(struct bnxt *bp);
52095209
static void
52105210
__bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, struct hwrm_func_cfg_input *req,
52115211
int tx_rings, int rx_rings, int ring_grps,
5212-
int cp_rings, int vnics)
5212+
int cp_rings, int stats, int vnics)
52135213
{
52145214
u32 enables = 0;
52155215

@@ -5251,7 +5251,7 @@ __bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, struct hwrm_func_cfg_input *req,
52515251
req->num_rsscos_ctxs =
52525252
cpu_to_le16(ring_grps + 1);
52535253
}
5254-
req->num_stat_ctxs = req->num_cmpl_rings;
5254+
req->num_stat_ctxs = cpu_to_le16(stats);
52555255
req->num_vnics = cpu_to_le16(vnics);
52565256
}
52575257
req->enables = cpu_to_le32(enables);
@@ -5261,7 +5261,7 @@ static void
52615261
__bnxt_hwrm_reserve_vf_rings(struct bnxt *bp,
52625262
struct hwrm_func_vf_cfg_input *req, int tx_rings,
52635263
int rx_rings, int ring_grps, int cp_rings,
5264-
int vnics)
5264+
int stats, int vnics)
52655265
{
52665266
u32 enables = 0;
52675267

@@ -5294,21 +5294,21 @@ __bnxt_hwrm_reserve_vf_rings(struct bnxt *bp,
52945294
req->num_hw_ring_grps = cpu_to_le16(ring_grps);
52955295
req->num_rsscos_ctxs = cpu_to_le16(BNXT_VF_MAX_RSS_CTX);
52965296
}
5297-
req->num_stat_ctxs = req->num_cmpl_rings;
5297+
req->num_stat_ctxs = cpu_to_le16(stats);
52985298
req->num_vnics = cpu_to_le16(vnics);
52995299

53005300
req->enables = cpu_to_le32(enables);
53015301
}
53025302

53035303
static int
53045304
bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5305-
int ring_grps, int cp_rings, int vnics)
5305+
int ring_grps, int cp_rings, int stats, int vnics)
53065306
{
53075307
struct hwrm_func_cfg_input req = {0};
53085308
int rc;
53095309

53105310
__bnxt_hwrm_reserve_pf_rings(bp, &req, tx_rings, rx_rings, ring_grps,
5311-
cp_rings, vnics);
5311+
cp_rings, stats, vnics);
53125312
if (!req.enables)
53135313
return 0;
53145314

@@ -5325,7 +5325,7 @@ bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
53255325

53265326
static int
53275327
bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5328-
int ring_grps, int cp_rings, int vnics)
5328+
int ring_grps, int cp_rings, int stats, int vnics)
53295329
{
53305330
struct hwrm_func_vf_cfg_input req = {0};
53315331
int rc;
@@ -5336,7 +5336,7 @@ bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
53365336
}
53375337

53385338
__bnxt_hwrm_reserve_vf_rings(bp, &req, tx_rings, rx_rings, ring_grps,
5339-
cp_rings, vnics);
5339+
cp_rings, stats, vnics);
53405340
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
53415341
if (rc)
53425342
return -ENOMEM;
@@ -5346,12 +5346,14 @@ bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
53465346
}
53475347

53485348
static int bnxt_hwrm_reserve_rings(struct bnxt *bp, int tx, int rx, int grp,
5349-
int cp, int vnic)
5349+
int cp, int stat, int vnic)
53505350
{
53515351
if (BNXT_PF(bp))
5352-
return bnxt_hwrm_reserve_pf_rings(bp, tx, rx, grp, cp, vnic);
5352+
return bnxt_hwrm_reserve_pf_rings(bp, tx, rx, grp, cp, stat,
5353+
vnic);
53535354
else
5354-
return bnxt_hwrm_reserve_vf_rings(bp, tx, rx, grp, cp, vnic);
5355+
return bnxt_hwrm_reserve_vf_rings(bp, tx, rx, grp, cp, stat,
5356+
vnic);
53555357
}
53565358

53575359
static int bnxt_nq_rings_in_use(struct bnxt *bp)
@@ -5380,12 +5382,17 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp)
53805382
return cp;
53815383
}
53825384

5385+
static int bnxt_get_func_stat_ctxs(struct bnxt *bp)
5386+
{
5387+
return bp->cp_nr_rings + bnxt_get_ulp_stat_ctxs(bp);
5388+
}
5389+
53835390
static bool bnxt_need_reserve_rings(struct bnxt *bp)
53845391
{
53855392
struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
53865393
int cp = bnxt_cp_rings_in_use(bp);
53875394
int nq = bnxt_nq_rings_in_use(bp);
5388-
int rx = bp->rx_nr_rings;
5395+
int rx = bp->rx_nr_rings, stat;
53895396
int vnic = 1, grp = rx;
53905397

53915398
if (bp->hwrm_spec_code < 0x10601)
@@ -5398,9 +5405,11 @@ static bool bnxt_need_reserve_rings(struct bnxt *bp)
53985405
vnic = rx + 1;
53995406
if (bp->flags & BNXT_FLAG_AGG_RINGS)
54005407
rx <<= 1;
5408+
stat = bnxt_get_func_stat_ctxs(bp);
54015409
if (BNXT_NEW_RM(bp) &&
54025410
(hw_resc->resv_rx_rings != rx || hw_resc->resv_cp_rings != cp ||
54035411
hw_resc->resv_irqs < nq || hw_resc->resv_vnics != vnic ||
5412+
hw_resc->resv_stat_ctxs != stat ||
54045413
(hw_resc->resv_hw_ring_grps != grp &&
54055414
!(bp->flags & BNXT_FLAG_CHIP_P5))))
54065415
return true;
@@ -5414,8 +5423,8 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
54145423
int tx = bp->tx_nr_rings;
54155424
int rx = bp->rx_nr_rings;
54165425
int grp, rx_rings, rc;
5426+
int vnic = 1, stat;
54175427
bool sh = false;
5418-
int vnic = 1;
54195428

54205429
if (!bnxt_need_reserve_rings(bp))
54215430
return 0;
@@ -5427,8 +5436,9 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
54275436
if (bp->flags & BNXT_FLAG_AGG_RINGS)
54285437
rx <<= 1;
54295438
grp = bp->rx_nr_rings;
5439+
stat = bnxt_get_func_stat_ctxs(bp);
54305440

5431-
rc = bnxt_hwrm_reserve_rings(bp, tx, rx, grp, cp, vnic);
5441+
rc = bnxt_hwrm_reserve_rings(bp, tx, rx, grp, cp, stat, vnic);
54325442
if (rc)
54335443
return rc;
54345444

@@ -5438,6 +5448,7 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
54385448
cp = hw_resc->resv_irqs;
54395449
grp = hw_resc->resv_hw_ring_grps;
54405450
vnic = hw_resc->resv_vnics;
5451+
stat = hw_resc->resv_stat_ctxs;
54415452
}
54425453

54435454
rx_rings = rx;
@@ -5456,6 +5467,10 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
54565467
}
54575468
}
54585469
rx_rings = min_t(int, rx_rings, grp);
5470+
cp = min_t(int, cp, bp->cp_nr_rings);
5471+
if (stat > bnxt_get_ulp_stat_ctxs(bp))
5472+
stat -= bnxt_get_ulp_stat_ctxs(bp);
5473+
cp = min_t(int, cp, stat);
54595474
rc = bnxt_trim_rings(bp, &rx_rings, &tx, cp, sh);
54605475
if (bp->flags & BNXT_FLAG_AGG_RINGS)
54615476
rx = rx_rings << 1;
@@ -5464,14 +5479,15 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
54645479
bp->rx_nr_rings = rx_rings;
54655480
bp->cp_nr_rings = cp;
54665481

5467-
if (!tx || !rx || !cp || !grp || !vnic)
5482+
if (!tx || !rx || !cp || !grp || !vnic || !stat)
54685483
return -ENOMEM;
54695484

54705485
return rc;
54715486
}
54725487

54735488
static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5474-
int ring_grps, int cp_rings, int vnics)
5489+
int ring_grps, int cp_rings, int stats,
5490+
int vnics)
54755491
{
54765492
struct hwrm_func_vf_cfg_input req = {0};
54775493
u32 flags;
@@ -5481,7 +5497,7 @@ static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
54815497
return 0;
54825498

54835499
__bnxt_hwrm_reserve_vf_rings(bp, &req, tx_rings, rx_rings, ring_grps,
5484-
cp_rings, vnics);
5500+
cp_rings, stats, vnics);
54855501
flags = FUNC_VF_CFG_REQ_FLAGS_TX_ASSETS_TEST |
54865502
FUNC_VF_CFG_REQ_FLAGS_RX_ASSETS_TEST |
54875503
FUNC_VF_CFG_REQ_FLAGS_CMPL_ASSETS_TEST |
@@ -5499,14 +5515,15 @@ static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
54995515
}
55005516

55015517
static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5502-
int ring_grps, int cp_rings, int vnics)
5518+
int ring_grps, int cp_rings, int stats,
5519+
int vnics)
55035520
{
55045521
struct hwrm_func_cfg_input req = {0};
55055522
u32 flags;
55065523
int rc;
55075524

55085525
__bnxt_hwrm_reserve_pf_rings(bp, &req, tx_rings, rx_rings, ring_grps,
5509-
cp_rings, vnics);
5526+
cp_rings, stats, vnics);
55105527
flags = FUNC_CFG_REQ_FLAGS_TX_ASSETS_TEST;
55115528
if (BNXT_NEW_RM(bp)) {
55125529
flags |= FUNC_CFG_REQ_FLAGS_RX_ASSETS_TEST |
@@ -5527,17 +5544,19 @@ static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
55275544
}
55285545

55295546
static int bnxt_hwrm_check_rings(struct bnxt *bp, int tx_rings, int rx_rings,
5530-
int ring_grps, int cp_rings, int vnics)
5547+
int ring_grps, int cp_rings, int stats,
5548+
int vnics)
55315549
{
55325550
if (bp->hwrm_spec_code < 0x10801)
55335551
return 0;
55345552

55355553
if (BNXT_PF(bp))
55365554
return bnxt_hwrm_check_pf_rings(bp, tx_rings, rx_rings,
5537-
ring_grps, cp_rings, vnics);
5555+
ring_grps, cp_rings, stats,
5556+
vnics);
55385557

55395558
return bnxt_hwrm_check_vf_rings(bp, tx_rings, rx_rings, ring_grps,
5540-
cp_rings, vnics);
5559+
cp_rings, stats, vnics);
55415560
}
55425561

55435562
static void bnxt_hwrm_coal_params_qcaps(struct bnxt *bp)
@@ -7839,6 +7858,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
78397858

78407859
rc = bnxt_hwrm_func_resc_qcaps(bp, true);
78417860
hw_resc->resv_cp_rings = 0;
7861+
hw_resc->resv_stat_ctxs = 0;
78427862
hw_resc->resv_irqs = 0;
78437863
hw_resc->resv_tx_rings = 0;
78447864
hw_resc->resv_rx_rings = 0;
@@ -8644,12 +8664,12 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
86448664
if (vnics == bp->hw_resc.resv_vnics)
86458665
return true;
86468666

8647-
bnxt_hwrm_reserve_rings(bp, 0, 0, 0, 0, vnics);
8667+
bnxt_hwrm_reserve_rings(bp, 0, 0, 0, 0, 0, vnics);
86488668
if (vnics <= bp->hw_resc.resv_vnics)
86498669
return true;
86508670

86518671
netdev_warn(bp->dev, "Unable to reserve resources to support NTUPLE filters.\n");
8652-
bnxt_hwrm_reserve_rings(bp, 0, 0, 0, 0, 1);
8672+
bnxt_hwrm_reserve_rings(bp, 0, 0, 0, 0, 0, 1);
86538673
return false;
86548674
#else
86558675
return false;
@@ -9060,7 +9080,7 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
90609080
int tx_xdp)
90619081
{
90629082
int max_rx, max_tx, tx_sets = 1;
9063-
int tx_rings_needed;
9083+
int tx_rings_needed, stats;
90649084
int rx_rings = rx;
90659085
int cp, vnics, rc;
90669086

@@ -9085,10 +9105,13 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
90859105
if (bp->flags & BNXT_FLAG_AGG_RINGS)
90869106
rx_rings <<= 1;
90879107
cp = sh ? max_t(int, tx_rings_needed, rx) : tx_rings_needed + rx;
9088-
if (BNXT_NEW_RM(bp))
9108+
stats = cp;
9109+
if (BNXT_NEW_RM(bp)) {
90899110
cp += bnxt_get_ulp_msix_num(bp);
9111+
stats += bnxt_get_ulp_stat_ctxs(bp);
9112+
}
90909113
return bnxt_hwrm_check_rings(bp, tx_rings_needed, rx_rings, rx, cp,
9091-
vnics);
9114+
stats, vnics);
90929115
}
90939116

90949117
static void bnxt_unmap_bars(struct bnxt *bp, struct pci_dev *pdev)

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,7 @@ struct bnxt_hw_resc {
927927
u16 resv_vnics;
928928
u16 min_stat_ctxs;
929929
u16 max_stat_ctxs;
930+
u16 resv_stat_ctxs;
930931
u16 max_nqs;
931932
u16 max_irqs;
932933
u16 resv_irqs;

0 commit comments

Comments
 (0)