OSDN Git Service

net: hns3: Add new RSS hash algorithm support for PF
authorJian Shen <shenjian15@huawei.com>
Wed, 10 Oct 2018 19:05:34 +0000 (20:05 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Oct 2018 05:59:08 +0000 (22:59 -0700)
This patch adds ETH_RSS_HASH_XOR hash algorithm supports, which
is supported by hw revision 0x21.

Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index 7d79a07..cbf9a65 100644 (file)
@@ -678,12 +678,13 @@ static int hns3_set_rss(struct net_device *netdev, const u32 *indir,
        if (!h->ae_algo || !h->ae_algo->ops || !h->ae_algo->ops->set_rss)
                return -EOPNOTSUPP;
 
-       /* currently we only support Toeplitz hash */
-       if ((hfunc != ETH_RSS_HASH_NO_CHANGE) && (hfunc != ETH_RSS_HASH_TOP)) {
-               netdev_err(netdev,
-                          "hash func not supported (only Toeplitz hash)\n");
+       if ((h->pdev->revision == 0x20 &&
+            hfunc != ETH_RSS_HASH_TOP) || (hfunc != ETH_RSS_HASH_NO_CHANGE &&
+            hfunc != ETH_RSS_HASH_TOP && hfunc != ETH_RSS_HASH_XOR)) {
+               netdev_err(netdev, "hash func not supported\n");
                return -EOPNOTSUPP;
        }
+
        if (!indir) {
                netdev_err(netdev,
                           "set rss failed for indir is empty\n");
index ca1a936..0c5a053 100644 (file)
@@ -2806,8 +2806,19 @@ static int hclge_get_rss(struct hnae3_handle *handle, u32 *indir,
        int i;
 
        /* Get hash algorithm */
-       if (hfunc)
-               *hfunc = vport->rss_algo;
+       if (hfunc) {
+               switch (vport->rss_algo) {
+               case HCLGE_RSS_HASH_ALGO_TOEPLITZ:
+                       *hfunc = ETH_RSS_HASH_TOP;
+                       break;
+               case HCLGE_RSS_HASH_ALGO_SIMPLE:
+                       *hfunc = ETH_RSS_HASH_XOR;
+                       break;
+               default:
+                       *hfunc = ETH_RSS_HASH_UNKNOWN;
+                       break;
+               }
+       }
 
        /* Get the RSS Key required by the user */
        if (key)
@@ -2831,12 +2842,20 @@ static int hclge_set_rss(struct hnae3_handle *handle, const u32 *indir,
 
        /* Set the RSS Hash Key if specififed by the user */
        if (key) {
-
-               if (hfunc == ETH_RSS_HASH_TOP ||
-                   hfunc == ETH_RSS_HASH_NO_CHANGE)
+               switch (hfunc) {
+               case ETH_RSS_HASH_TOP:
                        hash_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
-               else
+                       break;
+               case ETH_RSS_HASH_XOR:
+                       hash_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
+                       break;
+               case ETH_RSS_HASH_NO_CHANGE:
+                       hash_algo = vport->rss_algo;
+                       break;
+               default:
                        return -EINVAL;
+               }
+
                ret = hclge_set_rss_algo_key(hdev, hash_algo, key);
                if (ret)
                        return ret;