net: hns3: fix incorrect handling of sctp6 rss tuple
authorJian Shen <shenjian15@huawei.com>
Tue, 5 Jan 2021 03:37:28 +0000 (11:37 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Jan 2021 00:46:41 +0000 (16:46 -0800)
For DEVICE_VERSION_V2, the hardware only supports src-ip,
dst-ip and verification-tag for rss tuple set of sctp6
packet. For DEVICE_VERSION_V3, the hardware supports
src-port and dst-port as well.

Currently, when user queries the sctp6 rss tuples info,
some unsupported information will be showed on V2. So add
a check for hardware version when initializing and queries
sctp6 rss tuple to fix this issue.

Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support")
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h

index 135bd0a..c242883 100644 (file)
@@ -4538,8 +4538,8 @@ static int hclge_set_rss_tuple(struct hnae3_handle *handle,
                req->ipv4_sctp_en = tuple_sets;
                break;
        case SCTP_V6_FLOW:
-               if ((nfc->data & RXH_L4_B_0_1) ||
-                   (nfc->data & RXH_L4_B_2_3))
+               if (hdev->ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2 &&
+                   (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)))
                        return -EINVAL;
 
                req->ipv6_sctp_en = tuple_sets;
@@ -4731,6 +4731,8 @@ static void hclge_rss_init_cfg(struct hclge_dev *hdev)
                vport[i].rss_tuple_sets.ipv6_udp_en =
                        HCLGE_RSS_INPUT_TUPLE_OTHER;
                vport[i].rss_tuple_sets.ipv6_sctp_en =
+                       hdev->ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2 ?
+                       HCLGE_RSS_INPUT_TUPLE_SCTP_NO_PORT :
                        HCLGE_RSS_INPUT_TUPLE_SCTP;
                vport[i].rss_tuple_sets.ipv6_fragment_en =
                        HCLGE_RSS_INPUT_TUPLE_OTHER;
index 50a294d..ca46bc9 100644 (file)
 #define HCLGE_D_IP_BIT                 BIT(2)
 #define HCLGE_S_IP_BIT                 BIT(3)
 #define HCLGE_V_TAG_BIT                        BIT(4)
+#define HCLGE_RSS_INPUT_TUPLE_SCTP_NO_PORT     \
+               (HCLGE_D_IP_BIT | HCLGE_S_IP_BIT | HCLGE_V_TAG_BIT)
 
 #define HCLGE_RSS_TC_SIZE_0            1
 #define HCLGE_RSS_TC_SIZE_1            2
index 145757c..674b3a2 100644 (file)
@@ -917,8 +917,8 @@ static int hclgevf_set_rss_tuple(struct hnae3_handle *handle,
                req->ipv4_sctp_en = tuple_sets;
                break;
        case SCTP_V6_FLOW:
-               if ((nfc->data & RXH_L4_B_0_1) ||
-                   (nfc->data & RXH_L4_B_2_3))
+               if (hdev->ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2 &&
+                   (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)))
                        return -EINVAL;
 
                req->ipv6_sctp_en = tuple_sets;
@@ -2502,7 +2502,10 @@ static void hclgevf_rss_init_cfg(struct hclgevf_dev *hdev)
                tuple_sets->ipv4_fragment_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
                tuple_sets->ipv6_tcp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
                tuple_sets->ipv6_udp_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
-               tuple_sets->ipv6_sctp_en = HCLGEVF_RSS_INPUT_TUPLE_SCTP;
+               tuple_sets->ipv6_sctp_en =
+                       hdev->ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2 ?
+                                       HCLGEVF_RSS_INPUT_TUPLE_SCTP_NO_PORT :
+                                       HCLGEVF_RSS_INPUT_TUPLE_SCTP;
                tuple_sets->ipv6_fragment_en = HCLGEVF_RSS_INPUT_TUPLE_OTHER;
        }
 
index 1b183bc..f6d817a 100644 (file)
 #define HCLGEVF_D_IP_BIT               BIT(2)
 #define HCLGEVF_S_IP_BIT               BIT(3)
 #define HCLGEVF_V_TAG_BIT              BIT(4)
+#define HCLGEVF_RSS_INPUT_TUPLE_SCTP_NO_PORT   \
+       (HCLGEVF_D_IP_BIT | HCLGEVF_S_IP_BIT | HCLGEVF_V_TAG_BIT)
 
 #define HCLGEVF_STATS_TIMER_INTERVAL   36U