modify rss related issues in testing process.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c     |  1 +<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 66 +++++++++++++++++++-----------<br /> drivers/net/zxdh/zxdh_ethdev_ops.h |  4 +-<br /> drivers/net/zxdh/zxdh_msg.c        | 12 +++---<br /> drivers/net/zxdh/zxdh_tables.c     |  8 ++--<br /> 5 files changed, 54 insertions(+), 37 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 9512aff99c..a245ab24ce 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -66,6 +66,7 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev,<br />     dev_info->rx_offload_capa |=  RTE_ETH_RX_OFFLOAD_TCP_LRO;<br />     dev_info->rx_offload_capa |=  RTE_ETH_RX_OFFLOAD_RSS_HASH;<br />  <br />+    dev_info->hash_key_size = ZXDH_RSS_HASH_KEY_LEN;<br />     dev_info->reta_size = RTE_ETH_RSS_RETA_SIZE_256;<br />     dev_info->flow_type_rss_offloads = ZXDH_RSS_HF;<br />  <br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index c16271aeaf..86517d571a 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -289,7 +289,7 @@ zxdh_link_info_get(struct rte_eth_dev *dev, struct rte_eth_link *link)<br />         zxdh_pci_read_dev_config(hw, offsetof(struct zxdh_net_config, status),<br />                     &status, sizeof(status));<br />  <br />-    link->link_status = status;<br />+    link->link_status = status & hw->admin_status;<br />  <br />     if (status == RTE_ETH_LINK_DOWN) {<br />         link->link_speed = RTE_ETH_SPEED_NUM_UNKNOWN;<br />@@ -1207,7 +1207,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 />@@ -1245,7 +1245,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 />@@ -1267,6 +1267,9 @@ zxdh_rss_hash_update(struct rte_eth_dev *dev,<br />                 return -EINVAL;<br />             }<br />         }<br />+        hw->rss_enable = !!rss_conf->rss_hf;<br />+        if (rss_conf->rss_hf == 0)<br />+            return 0;<br />         if (hw->is_pf) {<br />             ret = zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />             port_attr.rss_hash_factor = hw_hf_new;<br />@@ -1294,15 +1297,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 />@@ -1310,27 +1314,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 />@@ -1389,7 +1406,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_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />index 6015b3de59..762562fbef 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@ -12,8 +12,7 @@<br /> #include "zxdh_ethdev.h" <br />  <br /> #define ZXDH_ETH_RSS_L2  RTE_ETH_RSS_L2_PAYLOAD<br />-#define ZXDH_ETH_RSS_IP \<br />-            (RTE_ETH_RSS_IPV4 | \<br />+#define ZXDH_ETH_RSS_IP (RTE_ETH_RSS_IPV4 | \<br />              RTE_ETH_RSS_FRAG_IPV4 | \<br />              RTE_ETH_RSS_IPV6 | \<br />              RTE_ETH_RSS_FRAG_IPV6)<br />@@ -25,6 +24,7 @@<br /> #define ZXDH_HF_F3_ETH        ZXDH_ETH_RSS_IP<br /> #define ZXDH_HF_MAC_VLAN_ETH  ZXDH_ETH_RSS_L2<br /> #define ZXDH_RSS_HF  ((ZXDH_HF_MAC_VLAN_ETH | ZXDH_HF_F3_ETH | ZXDH_HF_F5_ETH))<br />+#define ZXDH_RSS_HASH_KEY_LEN  40U<br />  <br /> #define ZXDH_ETHER_MIN_MTU      68<br />  <br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index be4f115380..68f2bab0c1 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -1270,7 +1270,6 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />     port_attr.pf_vfid = pf_hw->vfid;<br />     port_attr.hash_search_index = pf_hw->hash_search_index;<br />     port_attr.port_base_qid = vf_init_msg->base_qid;<br />-    uint16_t vfid = zxdh_vport_to_vfid(port);<br />  <br />     ret = zxdh_set_port_attr(pf_hw, vport, &port_attr);<br />     if (ret) {<br />@@ -1714,12 +1713,14 @@ 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 />     return ret;<br /> }<br />  <br />@@ -2160,7 +2161,6 @@ static int<br /> zxdh_vf_vlan_tpid_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />         void *res_info, uint16_t *res_len)<br /> {<br />-    union zxdh_virport_num port = {.vport = vport};<br />     struct zxdh_vlan_tpid *vlan_tpid = (struct zxdh_vlan_tpid *)cfg_data;<br />     struct zxdh_port_vlan_table port_vlan_table = {0};<br />     int ret = 0;<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 57a291e92a..e11b4bf92c 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -620,7 +620,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br />  <br />     ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />@@ -637,20 +637,20 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br />  <br />     ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />     ret = zxdh_get_port_attr(hw, vport, &port_attr);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />     port_attr.promisc_enable = enable;<br />     ret = zxdh_set_port_attr(hw, vport, &port_attr);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />--  <br />2.27.0<br />