Skip to content

Commit 7240529

Browse files
Rob Millerkuba-moo
authored andcommitted
bnxt_en: Add Virtual Admin Link State Support for VFs
The firmware can now cache the virtual link admin state (auto/on/off) of all VFs and as such, the PF driver no longer has to intercept the VF driver's port_phy_qcfg() call and then provide the link admin state. If the FW does not have this capability, fall back to the existing interception method. The initial default link admin state (auto) is also set initially when the VFs are created. Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com> Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Mohammad Shuab Siddique <mohammad-shuab.siddique@broadcom.com> Signed-off-by: Rob Miller <rmiller@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Link: https://patch.msgid.link/20251126215648.1885936-7-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 30f253f commit 7240529

3 files changed

Lines changed: 57 additions & 5 deletions

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5695,6 +5695,10 @@ int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp, unsigned long *bmap, int bmap_size,
56955695
u16 cmd = bnxt_vf_req_snif[i];
56965696
unsigned int bit, idx;
56975697

5698+
if ((bp->fw_cap & BNXT_FW_CAP_LINK_ADMIN) &&
5699+
cmd == HWRM_PORT_PHY_QCFG)
5700+
continue;
5701+
56985702
idx = cmd / 32;
56995703
bit = cmd % 32;
57005704
data[idx] |= 1 << bit;
@@ -9665,6 +9669,8 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
96659669
bp->flags |= BNXT_FLAG_ROCEV1_CAP;
96669670
if (flags & FUNC_QCAPS_RESP_FLAGS_ROCE_V2_SUPPORTED)
96679671
bp->flags |= BNXT_FLAG_ROCEV2_CAP;
9672+
if (flags & FUNC_QCAPS_RESP_FLAGS_LINK_ADMIN_STATUS_SUPPORTED)
9673+
bp->fw_cap |= BNXT_FW_CAP_LINK_ADMIN;
96689674
if (flags & FUNC_QCAPS_RESP_FLAGS_PCIE_STATS_SUPPORTED)
96699675
bp->fw_cap |= BNXT_FW_CAP_PCIE_STATS_SUPPORTED;
96709676
if (flags & FUNC_QCAPS_RESP_FLAGS_HOT_RESET_CAPABLE)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2484,6 +2484,7 @@ struct bnxt {
24842484
#define BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED BIT_ULL(6)
24852485
#define BNXT_FW_CAP_KONG_MB_CHNL BIT_ULL(7)
24862486
#define BNXT_FW_CAP_ROCE_VF_DYN_ALLOC_SUPPORT BIT_ULL(8)
2487+
#define BNXT_FW_CAP_LINK_ADMIN BIT_ULL(9)
24872488
#define BNXT_FW_CAP_OVS_64BIT_HANDLE BIT_ULL(10)
24882489
#define BNXT_FW_CAP_TRUSTED_VF BIT_ULL(11)
24892490
#define BNXT_FW_CAP_ERROR_RECOVERY BIT_ULL(13)

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

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,38 @@ int bnxt_set_vf_bw(struct net_device *dev, int vf_id, int min_tx_rate,
332332
return rc;
333333
}
334334

335+
static int bnxt_set_vf_link_admin_state(struct bnxt *bp, int vf_id)
336+
{
337+
struct hwrm_func_cfg_input *req;
338+
struct bnxt_vf_info *vf;
339+
int rc;
340+
341+
if (!(bp->fw_cap & BNXT_FW_CAP_LINK_ADMIN))
342+
return 0;
343+
344+
vf = &bp->pf.vf[vf_id];
345+
346+
rc = bnxt_hwrm_func_cfg_short_req_init(bp, &req);
347+
if (rc)
348+
return rc;
349+
350+
req->fid = cpu_to_le16(vf->fw_fid);
351+
switch (vf->flags & (BNXT_VF_LINK_FORCED | BNXT_VF_LINK_UP)) {
352+
case BNXT_VF_LINK_FORCED:
353+
req->options =
354+
FUNC_CFG_REQ_OPTIONS_LINK_ADMIN_STATE_FORCED_DOWN;
355+
break;
356+
case (BNXT_VF_LINK_FORCED | BNXT_VF_LINK_UP):
357+
req->options = FUNC_CFG_REQ_OPTIONS_LINK_ADMIN_STATE_FORCED_UP;
358+
break;
359+
default:
360+
req->options = FUNC_CFG_REQ_OPTIONS_LINK_ADMIN_STATE_AUTO;
361+
break;
362+
}
363+
req->enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_ADMIN_LINK_STATE);
364+
return hwrm_req_send(bp, req);
365+
}
366+
335367
int bnxt_set_vf_link_state(struct net_device *dev, int vf_id, int link)
336368
{
337369
struct bnxt *bp = netdev_priv(dev);
@@ -357,10 +389,11 @@ int bnxt_set_vf_link_state(struct net_device *dev, int vf_id, int link)
357389
break;
358390
default:
359391
netdev_err(bp->dev, "Invalid link option\n");
360-
rc = -EINVAL;
361-
break;
392+
return -EINVAL;
362393
}
363-
if (vf->flags & (BNXT_VF_LINK_UP | BNXT_VF_LINK_FORCED))
394+
if (bp->fw_cap & BNXT_FW_CAP_LINK_ADMIN)
395+
rc = bnxt_set_vf_link_admin_state(bp, vf_id);
396+
else if (vf->flags & (BNXT_VF_LINK_UP | BNXT_VF_LINK_FORCED))
364397
rc = bnxt_hwrm_fwd_async_event_cmpl(bp, vf,
365398
ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE);
366399
return rc;
@@ -666,15 +699,21 @@ static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs, bool reset)
666699

667700
hwrm_req_hold(bp, req);
668701
for (i = 0; i < num_vfs; i++) {
702+
struct bnxt_vf_info *vf = &pf->vf[i];
703+
704+
vf->fw_fid = pf->first_vf_id + i;
705+
rc = bnxt_set_vf_link_admin_state(bp, i);
706+
if (rc)
707+
break;
708+
669709
if (reset)
670710
__bnxt_set_vf_params(bp, i);
671711

672-
req->vf_id = cpu_to_le16(pf->first_vf_id + i);
712+
req->vf_id = cpu_to_le16(vf->fw_fid);
673713
rc = hwrm_req_send(bp, req);
674714
if (rc)
675715
break;
676716
pf->active_vfs = i + 1;
677-
pf->vf[i].fw_fid = pf->first_vf_id + i;
678717
}
679718

680719
if (pf->active_vfs) {
@@ -741,6 +780,12 @@ static int bnxt_hwrm_func_cfg(struct bnxt *bp, int num_vfs)
741780
FUNC_CFG_REQ_ENABLES_NUM_VNICS |
742781
FUNC_CFG_REQ_ENABLES_NUM_HW_RING_GRPS);
743782

783+
if (bp->fw_cap & BNXT_FW_CAP_LINK_ADMIN) {
784+
req->options = FUNC_CFG_REQ_OPTIONS_LINK_ADMIN_STATE_AUTO;
785+
req->enables |=
786+
cpu_to_le32(FUNC_CFG_REQ_ENABLES_ADMIN_LINK_STATE);
787+
}
788+
744789
mtu = bp->dev->mtu + VLAN_ETH_HLEN;
745790
req->mru = cpu_to_le16(mtu);
746791
req->admin_mtu = cpu_to_le16(mtu);

0 commit comments

Comments
 (0)