]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
eth: bnxt: support RSS on IPv6 Flow Label
authorJakub Kicinski <kuba@kernel.org>
Mon, 11 Aug 2025 23:42:11 +0000 (16:42 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 14 Aug 2025 09:40:21 +0000 (11:40 +0200)
It appears that the bnxt FW API has the relevant bit for Flow Label
hashing. Plumb in the support. Obey the capability bit.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250811234212.580748-4-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 5578ddcb465d9edc3d02376a08c4cb4c09221d66..ab74c71c4557f319a643c022c0e726759cb9b1e1 100644 (file)
@@ -6957,6 +6957,8 @@ static int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)
                        bp->rss_cap |= BNXT_RSS_CAP_ESP_V4_RSS_CAP;
                if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_ESP_SPI_IPV6_CAP)
                        bp->rss_cap |= BNXT_RSS_CAP_ESP_V6_RSS_CAP;
+               if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPV6_FLOW_LABEL_CAP)
+                       bp->rss_cap |= BNXT_RSS_CAP_IPV6_FLOW_LABEL_RSS_CAP;
                if (flags & VNIC_QCAPS_RESP_FLAGS_RE_FLUSH_CAP)
                        bp->fw_cap |= BNXT_FW_CAP_VNIC_RE_FLUSH;
        }
index fda0d3cc6227c050a75b53864feeb70b51916819..40ae34923511a73fe84c2a0ef9e69330e128b431 100644 (file)
@@ -2407,6 +2407,7 @@ struct bnxt {
 #define BNXT_RSS_CAP_ESP_V4_RSS_CAP            BIT(6)
 #define BNXT_RSS_CAP_ESP_V6_RSS_CAP            BIT(7)
 #define BNXT_RSS_CAP_MULTI_RSS_CTX             BIT(8)
+#define BNXT_RSS_CAP_IPV6_FLOW_LABEL_RSS_CAP   BIT(9)
 
        u8                      rss_hash_key[HW_HASH_KEY_SIZE];
        u8                      rss_hash_key_valid:1;
index 1b37612b1c01f62a5c3a9a0d0d2419b4996a0e5c..68a4ee9f69b1a46f136f343574f0585538a677ea 100644 (file)
@@ -1584,6 +1584,8 @@ static u64 get_ethtool_ipv6_rss(struct bnxt *bp)
 {
        if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6)
                return RXH_IP_SRC | RXH_IP_DST;
+       if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6_FLOW_LABEL)
+               return RXH_IP_SRC | RXH_IP_DST | RXH_IP6_FL;
        return 0;
 }
 
@@ -1662,13 +1664,18 @@ static int bnxt_set_rxfh_fields(struct net_device *dev,
 
        if (cmd->data == RXH_4TUPLE)
                tuple = 4;
-       else if (cmd->data == RXH_2TUPLE)
+       else if (cmd->data == RXH_2TUPLE ||
+                cmd->data == (RXH_2TUPLE | RXH_IP6_FL))
                tuple = 2;
        else if (!cmd->data)
                tuple = 0;
        else
                return -EINVAL;
 
+       if (cmd->data & RXH_IP6_FL &&
+           !(bp->rss_cap & BNXT_RSS_CAP_IPV6_FLOW_LABEL_RSS_CAP))
+               return -EINVAL;
+
        if (cmd->flow_type == TCP_V4_FLOW) {
                rss_hash_cfg &= ~VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4;
                if (tuple == 4)
@@ -1732,10 +1739,15 @@ static int bnxt_set_rxfh_fields(struct net_device *dev,
        case AH_V6_FLOW:
        case ESP_V6_FLOW:
        case IPV6_FLOW:
-               if (tuple == 2)
+               rss_hash_cfg &= ~(VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6 |
+                                 VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6_FLOW_LABEL);
+               if (!tuple)
+                       break;
+               if (cmd->data & RXH_IP6_FL)
+                       rss_hash_cfg |=
+                               VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6_FLOW_LABEL;
+               else if (tuple == 2)
                        rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6;
-               else if (!tuple)
-                       rss_hash_cfg &= ~VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6;
                break;
        }