bnxt_en: Refactor RSS capability fields
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Fri, 1 Dec 2023 22:39:15 +0000 (14:39 -0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 4 Dec 2023 23:12:47 +0000 (15:12 -0800)
Add a new rss_cap field in the per device struct bnxt and move all
the RSS capability fields there.  It will be easier to add new RSS
capabilities for the new P7 chips.

Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20231201223924.26955-7-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index d4da55e01b2cce996eaa632b0ffb02b83fd72192..b38c17a27903d0695e22f7f48843f8ea895f454b 100644 (file)
@@ -4268,7 +4268,7 @@ static int bnxt_alloc_vnic_attributes(struct bnxt *bp)
                        goto out;
                }
 vnic_skip_grps:
-               if ((bp->flags & BNXT_FLAG_NEW_RSS_CAP) &&
+               if ((bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP) &&
                    !(vnic->flags & BNXT_VNIC_RSS_FLAG))
                        continue;
 
@@ -5765,7 +5765,8 @@ static int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)
        int rc;
 
        bp->hw_ring_stats_size = sizeof(struct ctx_hw_stats);
-       bp->flags &= ~(BNXT_FLAG_NEW_RSS_CAP | BNXT_FLAG_ROCE_MIRROR_CAP);
+       bp->flags &= ~BNXT_FLAG_ROCE_MIRROR_CAP;
+       bp->rss_cap &= ~BNXT_RSS_CAP_NEW_RSS_CAP;
        if (bp->hwrm_spec_code < 0x10600)
                return 0;
 
@@ -5780,7 +5781,7 @@ static int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)
 
                if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS) &&
                    (flags & VNIC_QCAPS_RESP_FLAGS_RSS_DFLT_CR_CAP))
-                       bp->flags |= BNXT_FLAG_NEW_RSS_CAP;
+                       bp->rss_cap |= BNXT_RSS_CAP_NEW_RSS_CAP;
                if (flags &
                    VNIC_QCAPS_RESP_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_CAP)
                        bp->flags |= BNXT_FLAG_ROCE_MIRROR_CAP;
@@ -5793,7 +5794,7 @@ static int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)
                     !(bp->fw_cap & BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED)))
                        bp->fw_cap |= BNXT_FW_CAP_VLAN_RX_STRIP;
                if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_HASH_TYPE_DELTA_CAP)
-                       bp->fw_cap |= BNXT_FW_CAP_RSS_HASH_TYPE_DELTA;
+                       bp->rss_cap |= BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA;
                bp->max_tpa_v2 = le16_to_cpu(resp->max_aggs_supported);
                if (bp->max_tpa_v2) {
                        if (BNXT_CHIP_P5(bp))
@@ -6456,7 +6457,7 @@ __bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings,
                        req->num_cmpl_rings = cpu_to_le16(cp_rings);
                        req->num_hw_ring_grps = cpu_to_le16(ring_grps);
                        req->num_rsscos_ctxs = cpu_to_le16(1);
-                       if (!(bp->flags & BNXT_FLAG_NEW_RSS_CAP) &&
+                       if (!(bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP) &&
                            bnxt_rfs_supported(bp))
                                req->num_rsscos_ctxs =
                                        cpu_to_le16(ring_grps + 1);
@@ -9133,7 +9134,7 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
 
                vnic = &bp->vnic_info[vnic_id];
                vnic->flags |= BNXT_VNIC_RFS_FLAG;
-               if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
+               if (bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP)
                        vnic->flags |= BNXT_VNIC_RFS_NEW_RSS_FLAG;
                rc = bnxt_hwrm_vnic_alloc(bp, vnic_id, ring_id, 1);
                if (rc) {
@@ -9227,7 +9228,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
        rc = bnxt_setup_vnic(bp, 0);
        if (rc)
                goto err_out;
-       if (bp->fw_cap & BNXT_FW_CAP_RSS_HASH_TYPE_DELTA)
+       if (bp->rss_cap & BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA)
                bnxt_hwrm_update_rss_hash_cfg(bp);
 
        if (bp->flags & BNXT_FLAG_RFS) {
@@ -11555,7 +11556,7 @@ static bool bnxt_rfs_supported(struct bnxt *bp)
                return false;
        if (BNXT_PF(bp) && !BNXT_CHIP_TYPE_NITRO_A0(bp))
                return true;
-       if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
+       if (bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP)
                return true;
        return false;
 }
@@ -11576,7 +11577,7 @@ static bool bnxt_rfs_capable(struct bnxt *bp)
        max_rss_ctxs = bnxt_get_max_func_rss_ctxs(bp);
 
        /* RSS contexts not a limiting factor */
-       if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
+       if (bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP)
                max_rss_ctxs = max_vnics;
        if (vnics > max_vnics || vnics > max_rss_ctxs) {
                if (bp->rx_nr_rings > 1)
@@ -12697,15 +12698,15 @@ static int bnxt_fw_init_one_p2(struct bnxt *bp)
 
 static void bnxt_set_dflt_rss_hash_type(struct bnxt *bp)
 {
-       bp->flags &= ~BNXT_FLAG_UDP_RSS_CAP;
+       bp->rss_cap &= ~BNXT_RSS_CAP_UDP_RSS_CAP;
        bp->rss_hash_cfg = VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4 |
                           VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4 |
                           VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6 |
                           VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6;
-       if (bp->fw_cap & BNXT_FW_CAP_RSS_HASH_TYPE_DELTA)
+       if (bp->rss_cap & BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA)
                bp->rss_hash_delta = bp->rss_hash_cfg;
        if (BNXT_CHIP_P4_PLUS(bp) && bp->hwrm_spec_code >= 0x10501) {
-               bp->flags |= BNXT_FLAG_UDP_RSS_CAP;
+               bp->rss_cap |= BNXT_RSS_CAP_UDP_RSS_CAP;
                bp->rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4 |
                                    VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
        }
index 79b4deb45cfb66a53d98e1c06673734acad7ee78..d10811f4073b056f1ec2a008a81e006145faf3bc 100644 (file)
@@ -1900,8 +1900,6 @@ struct bnxt {
        #define BNXT_FLAG_RFS           0x100
        #define BNXT_FLAG_SHARED_RINGS  0x200
        #define BNXT_FLAG_PORT_STATS    0x400
-       #define BNXT_FLAG_UDP_RSS_CAP   0x800
-       #define BNXT_FLAG_NEW_RSS_CAP   0x2000
        #define BNXT_FLAG_WOL_CAP       0x4000
        #define BNXT_FLAG_ROCEV1_CAP    0x8000
        #define BNXT_FLAG_ROCEV2_CAP    0x10000
@@ -2021,6 +2019,10 @@ struct bnxt {
        u16                     rss_indir_tbl_entries;
        u32                     rss_hash_cfg;
        u32                     rss_hash_delta;
+       u32                     rss_cap;
+#define BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA       BIT(0)
+#define BNXT_RSS_CAP_UDP_RSS_CAP               BIT(1)
+#define BNXT_RSS_CAP_NEW_RSS_CAP               BIT(2)
 
        u16                     max_mtu;
        u8                      max_tc;
@@ -2086,7 +2088,6 @@ struct bnxt {
        #define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2     BIT_ULL(16)
        #define BNXT_FW_CAP_PCIE_STATS_SUPPORTED        BIT_ULL(17)
        #define BNXT_FW_CAP_EXT_STATS_SUPPORTED         BIT_ULL(18)
-       #define BNXT_FW_CAP_RSS_HASH_TYPE_DELTA         BIT_ULL(19)
        #define BNXT_FW_CAP_ERR_RECOVER_RELOAD          BIT_ULL(20)
        #define BNXT_FW_CAP_HOT_RESET                   BIT_ULL(21)
        #define BNXT_FW_CAP_PTP_RTC                     BIT_ULL(22)
index 99c8b15bdfbe8bb72dd4d0f7d325c3138752fc88..14cb0512ee9363bd2996fdc100973eba9e61df59 100644 (file)
@@ -1203,7 +1203,7 @@ static int bnxt_srxfh(struct bnxt *bp, struct ethtool_rxnfc *cmd)
                if (tuple == 4)
                        rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4;
        } else if (cmd->flow_type == UDP_V4_FLOW) {
-               if (tuple == 4 && !(bp->flags & BNXT_FLAG_UDP_RSS_CAP))
+               if (tuple == 4 && !(bp->rss_cap & BNXT_RSS_CAP_UDP_RSS_CAP))
                        return -EINVAL;
                rss_hash_cfg &= ~VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4;
                if (tuple == 4)
@@ -1213,7 +1213,7 @@ static int bnxt_srxfh(struct bnxt *bp, struct ethtool_rxnfc *cmd)
                if (tuple == 4)
                        rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6;
        } else if (cmd->flow_type == UDP_V6_FLOW) {
-               if (tuple == 4 && !(bp->flags & BNXT_FLAG_UDP_RSS_CAP))
+               if (tuple == 4 && !(bp->rss_cap & BNXT_RSS_CAP_UDP_RSS_CAP))
                        return -EINVAL;
                rss_hash_cfg &= ~VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
                if (tuple == 4)
@@ -1253,7 +1253,7 @@ static int bnxt_srxfh(struct bnxt *bp, struct ethtool_rxnfc *cmd)
        if (bp->rss_hash_cfg == rss_hash_cfg)
                return 0;
 
-       if (bp->fw_cap & BNXT_FW_CAP_RSS_HASH_TYPE_DELTA)
+       if (bp->rss_cap & BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA)
                bp->rss_hash_delta = bp->rss_hash_cfg ^ rss_hash_cfg;
        bp->rss_hash_cfg = rss_hash_cfg;
        if (netif_running(bp->dev)) {