modify rss related issues in testing process.<br /> <br />Fixes: 01acc23bab13 ("net/zxdh: optimize RSS operations")<br />Cc: stable@dpdk.org<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.h     |  1 +<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 64 +++++++++++++++++++-----------<br /> drivers/net/zxdh/zxdh_msg.c        | 11 +++--<br /> 3 files changed, 48 insertions(+), 28 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h<br />index 169af209a2..1013446876 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev.h<br />@@ -54,6 +54,7 @@<br /> #define ZXDH_SLOT_MAX             256<br /> #define ZXDH_MAX_VF               256<br /> #define ZXDH_HASHIDX_MAX          6<br />+#define ZXDH_RSS_HASH_KEY_LEN     40U<br />  <br /> union zxdh_virport_num {<br />     uint16_t vport;<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 93b7045565..d0b0c17279 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -1170,7 +1170,7 @@ zxdh_rss_hf_to_hw(uint64_t hf)<br /> }<br />  <br /> static uint64_t<br />-zxdh_rss_hf_to_eth(uint32_t hw_hf)<br />+zxdh_rss_hf_to_eth(uint64_t hw_hf)<br /> {<br />     uint64_t hf = 0;<br />  <br />@@ -1208,7 +1208,7 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev,<br />     hw_hf_new = zxdh_rss_hf_to_hw(rss_conf->rss_hf);<br />     hw_hf_old = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf);<br />  <br />-    if ((hw_hf_new != hw_hf_old || !!rss_conf->rss_hf))<br />+    if (hw_hf_new != hw_hf_old || hw->rss_enable != !!rss_conf->rss_hf)<br />         need_update_hf = 1;<br />  <br />     if (need_update_hf) {<br />@@ -1231,6 +1231,9 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev,<br />             }<br />         }<br />         if (hw->is_pf) {<br />+            hw->rss_enable = !!rss_conf->rss_hf;<br />+            if (rss_conf->rss_hf == 0)<br />+                return 0;<br />             ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />             port_attr.rss_hash_factor = hw_hf_new;<br />             ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />@@ -1257,15 +1260,16 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev,<br /> int<br /> zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_conf)<br /> {<br />-    struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private;<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />     struct rte_eth_rss_conf *old_rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf;<br />     struct zxdh_msg_info msg = {0};<br />     uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />     void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />     void *rss_hf_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, rss_hf_msg);<br />     struct zxdh_port_attr_table port_attr = {0};<br />-    uint32_t rss_hf;<br />-    uint32_t hw_hf;<br />+    uint64_t rss_hf = 0;<br />+    uint64_t hw_hf = 0;<br />+    uint8_t need_update_hf = 0;<br />     int ret;<br />  <br />     if (rss_conf == NULL) {<br />@@ -1273,27 +1277,40 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_con<br />         return -ENOMEM;<br />     }<br />  <br />-    hw_hf = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf);<br />-    rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf);<br />+    if (hw->rss_enable == 0) {<br />+        rss_conf->rss_hf = 0;<br />+        return 0;<br />+    }<br />  <br />-    zxdh_msg_head_build(hw, ZXDH_RSS_HF_GET, &msg);<br />-    if (hw->is_pf) {<br />-        ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />-        if (ret) {<br />-            PMD_DRV_LOG(ERR, "rss hash factor set failed");<br />-            return -EINVAL;<br />-        }<br />-        ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, port_attr.rss_hash_factor);<br />-    } else {<br />-        ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info),<br />-                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />-        if (ret) {<br />-            PMD_DRV_LOG(ERR, "rss hash factor set failed");<br />-            return -EINVAL;<br />+    if (old_rss_conf->rss_hf == 0)<br />+        need_update_hf = 1;<br />+<br />+    if (!need_update_hf) {<br />+        hw_hf = zxdh_rss_hf_to_hw(old_rss_conf->rss_hf);<br />+        rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf);<br />+    }<br />+<br />+    if (need_update_hf) {<br />+        zxdh_msg_head_build(hw, ZXDH_RSS_HF_GET, &msg);<br />+        if (hw->is_pf) {<br />+            ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />+            if (ret) {<br />+                PMD_DRV_LOG(ERR, "rss hash factor set failed");<br />+                return -EINVAL;<br />+            }<br />+            ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, port_attr.rss_hash_factor);<br />+        } else {<br />+            ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info),<br />+                    zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />+            if (ret) {<br />+                PMD_DRV_LOG(ERR, "rss hash factor set failed");<br />+                return -EINVAL;<br />+            }<br />         }<br />+        rss_hf = ZXDH_GET(rss_hf, rss_hf_msg_addr, rss_hf);<br />+        rss_conf->rss_hf = zxdh_rss_hf_to_eth(rss_hf);<br />+        old_rss_conf->rss_hf = zxdh_rss_hf_to_eth(hw_hf);<br />     }<br />-    rss_hf = ZXDH_GET(rss_hf, rss_hf_msg_addr, rss_hf);<br />-    rss_conf->rss_hf = zxdh_rss_hf_to_eth(rss_hf);<br />  <br />     return 0;<br /> }<br />@@ -1352,7 +1369,6 @@ zxdh_rss_configure(struct rte_eth_dev *dev)<br />  <br />     if (curr_rss_enable && hw->rss_init == 0) {<br />         /* config hash factor */<br />-        dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf = ZXDH_HF_F5_ETH;<br />         hw_hf = zxdh_rss_hf_to_hw(dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf);<br />         memset(&msg, 0, sizeof(msg));<br />         if (hw->is_pf) {<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index e607ea1dab..2a3d358a20 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -1713,12 +1713,15 @@ zxdh_vf_rss_table_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_u<br />     if (ret)<br />         sprintf(str, "set rss reta tbl failed, code:%d", ret);<br />  <br />-    *res_len = strlen(str) + sizeof(uint8_t);<br />-    if (ret == 0)<br />+    if (ret == 0) {<br />+        *res_len = ZXDH_ST_SZ_BYTES(rss_reta) + sizeof(uint8_t);<br />         ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />-    else<br />+    } else {<br />+        *res_len = strlen(str) + sizeof(uint8_t);<br />         ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />-    memcpy(reply_data_addr, str, strlen(str) + 1);<br />+        memcpy(reply_data_addr, str, strlen(str) + 1);<br />+    }<br />+<br />     return ret;<br /> }<br />  <br />--  <br />2.27.0<br />