]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bnxt_en: Enhance stats context reservation logic
authorSaravanan Vajravel <saravanan.vajravel@broadcom.com>
Fri, 22 Aug 2025 04:07:52 +0000 (09:37 +0530)
committerLeon Romanovsky <leon@kernel.org>
Thu, 11 Sep 2025 06:17:54 +0000 (02:17 -0400)
When the firmware advertises that the device is capable of supporting
port mirroring on RoCE device, reserve one additional stat_ctx.
To support port mirroring feature, RDMA driver allocates one stat_ctx
for exclusive use in RawEth QP.

Signed-off-by: Saravanan Vajravel <saravanan.vajravel@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Kashyap Desai <kashyap.desai@broadcom.com>
Reviewed-by: Selvin Xavier <selvin.xavier@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Link: https://patch.msgid.link/20250822040801.776196-2-kalesh-anakkur.purayil@broadcom.com
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Acked-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c

index 5578ddcb465d9edc3d02376a08c4cb4c09221d66..751840fff0dcd9a199d33160008db5c3f94a127e 100644 (file)
@@ -9601,10 +9601,10 @@ no_ptp:
 
 static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
 {
+       u32 flags, flags_ext, flags_ext2, flags_ext3;
+       struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
        struct hwrm_func_qcaps_output *resp;
        struct hwrm_func_qcaps_input *req;
-       struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
-       u32 flags, flags_ext, flags_ext2;
        int rc;
 
        rc = hwrm_req_init(bp, req, HWRM_FUNC_QCAPS);
@@ -9671,6 +9671,10 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
            (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_ROCE_VF_RESOURCE_MGMT_SUPPORTED))
                bp->fw_cap |= BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED;
 
+       flags_ext3 = le32_to_cpu(resp->flags_ext3);
+       if (flags_ext3 & FUNC_QCAPS_RESP_FLAGS_EXT3_MIRROR_ON_ROCE_SUPPORTED)
+               bp->fw_cap |= BNXT_FW_CAP_MIRROR_ON_ROCE;
+
        bp->tx_push_thresh = 0;
        if ((flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED) &&
            BNXT_FW_MAJ(bp) > 217)
index fda0d3cc6227c050a75b53864feeb70b51916819..fa2b39b55e68914ea8ac9cbb3a36c561bc5c0d5e 100644 (file)
@@ -2507,6 +2507,7 @@ struct bnxt {
        #define BNXT_FW_CAP_VNIC_RE_FLUSH               BIT_ULL(40)
        #define BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS      BIT_ULL(41)
        #define BNXT_FW_CAP_NPAR_1_2                    BIT_ULL(42)
+       #define BNXT_FW_CAP_MIRROR_ON_ROCE              BIT_ULL(43)
 
        u32                     fw_dbg_cap;
 
@@ -2528,6 +2529,8 @@ struct bnxt {
        ((bp)->fw_cap & BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED)
 #define BNXT_SW_RES_LMT(bp)            \
        ((bp)->fw_cap & BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS)
+#define BNXT_MIRROR_ON_ROCE_CAP(bp)    \
+       ((bp)->fw_cap & BNXT_FW_CAP_MIRROR_ON_ROCE)
 
        u32                     hwrm_spec_code;
        u16                     hwrm_cmd_seq;
index 61cf201bb0dca1987689129fa8165b2031e2dbf6..f8c2c72b382d8aa425cb85ffb9066fc80646590a 100644 (file)
@@ -100,6 +100,12 @@ void bnxt_set_dflt_ulp_stat_ctxs(struct bnxt *bp)
                if (BNXT_PF(bp) && !bp->pf.port_id &&
                    bp->port_count > 1)
                        bp->edev->ulp_num_ctxs++;
+
+               /* Reserve one additional stat_ctx when the device is capable
+                * of supporting port mirroring on RDMA device.
+                */
+               if (BNXT_MIRROR_ON_ROCE_CAP(bp))
+                       bp->edev->ulp_num_ctxs++;
        }
 }