optimize rss hash config/update,reta update/get.

Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn>
---
 drivers/net/zxdh/zxdh_ethdev_ops.c |   1 -
 drivers/net/zxdh/zxdh_msg.c        | 129 +++++++++++++++++++++++++++++
 2 files changed, 129 insertions(+), 1 deletion(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c
index fdae0a4ef6..14d45f37b5 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -1144,7 +1144,6 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_con
         }
         reply_msg.reply_body.rss_hf.rss_hf = port_attr.rss_hash_factor;
     } else {
-        zxdh_msg_head_build(hw, ZXDH_RSS_HF_SET, &msg);
         ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info),
                 &reply_msg, sizeof(struct zxdh_msg_reply_info));
         if (ret) {
diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c
index dbe0a823bc..9908c4912e 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -1524,6 +1524,130 @@ zxdh_vf_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
     return ret;
 }
 
+static int
+zxdh_vf_rss_hf_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_unused,
+            struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_hf";
+    struct zxdh_port_attr_table vport_att = {0};
+    int ret = 0;
+
+    ret = zxdh_get_port_attr(hw, vport, &vport_att);
+    if (ret) {
+        sprintf(str, "get rss hash factor failed, ret:%d\n", ret);
+        PMD_DRV_LOG(ERR, "get rss hash factor failed.");
+        goto proc_end;
+    }
+
+    reply->rss_hf.rss_hf = vport_att.rss_hash_factor;
+
+proc_end:
+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+    rte_memcpy(&reply->reply_data, str, strlen(str) + 1);
+    return ret;
+}
+
+static int
+zxdh_vf_rss_hf_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
+            struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_hf";
+    struct zxdh_rss_hf *rss_hf = cfg_data;
+    struct zxdh_port_attr_table vport_att = {0};
+    int ret = 0;
+
+    ret = zxdh_get_port_attr(hw, vport, &vport_att);
+    if (ret) {
+        sprintf(str, "set rss hash factor (set vport tbl failed, hf is %d). ret:%d\n",
+                rss_hf->rss_hf, ret);
+        PMD_DRV_LOG(ERR, "rss enable set failed");
+        goto proc_end;
+    }
+
+    vport_att.rss_hash_factor = rss_hf->rss_hf;
+    ret = zxdh_set_port_attr(hw, vport, &vport_att);
+    if (ret) {
+        sprintf(str, "set rss hash factor (set vport tbl failed, hf is %d). ret:%d\n",
+                rss_hf->rss_hf, ret);
+        PMD_DRV_LOG(ERR, "rss enable set failed");
+    }
+
+proc_end:
+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+    rte_memcpy(&reply->reply_data, str, strlen(str) + 1);
+    return ret;
+}
+
+static int
+zxdh_vf_rss_enable(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
+            struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_enable";
+    struct zxdh_rss_enable *rss_enable = cfg_data;
+    struct zxdh_port_attr_table vport_att = {0};
+    int ret = 0;
+
+    ret = zxdh_get_port_attr(hw, vport, &vport_att);
+    if (ret) {
+        sprintf(str, "set rss enable (get vport tbl failed, rss_enable is %d). ret:%d\n",
+                rss_enable->enable, ret);
+        PMD_DRV_LOG(ERR, "rss enable set failed");
+        goto proc_end;
+    }
+
+    vport_att.rss_enable = rss_enable->enable;
+    ret = zxdh_set_port_attr(hw, vport, &vport_att);
+    if (ret) {
+        sprintf(str, "set rss enable (set vport tbl failed, rss_enable is %d). ret:%d\n",
+                rss_enable->enable, ret);
+        PMD_DRV_LOG(ERR, "rss enable set failed");
+    }
+
+proc_end:
+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+    rte_memcpy(&reply->reply_data, str, strlen(str) + 1);
+    return ret;
+}
+
+static int
+zxdh_vf_rss_table_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,
+        struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_table";
+    struct zxdh_rss_reta *rss_reta = cfg_data;
+    int32_t ret = 0;
+
+    ret = zxdh_rss_table_set(hw, vport, rss_reta);
+    if (ret)
+        sprintf(str, "set rss reta tbl failed, code:%d", ret);
+
+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+    rte_memcpy(&reply->reply_data, str, strlen(str) + 1);
+    return ret;
+}
+
+static int
+zxdh_vf_rss_table_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_unused,
+        struct zxdh_msg_reply_body *reply, uint16_t *res_len)
+{
+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_table";
+    struct zxdh_rss_reta *rss_reta = &reply->rss_reta;
+    int ret = 0;
+
+    ret = zxdh_rss_table_get(hw, vport, rss_reta);
+    if (ret)
+        sprintf(str, "set rss reta tbl failed, code:%d", ret);
+
+    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);
+    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;
+    rte_memcpy(&reply->reply_data, str, strlen(str) + 1);
+    return ret;
+}
+
 zxdh_msg_process_callback zxdh_proc_cb[] = {
     [ZXDH_NULL] = NULL,
     [ZXDH_VF_PORT_INIT] = zxdh_vf_port_init,
@@ -1533,6 +1657,11 @@ zxdh_msg_process_callback zxdh_proc_cb[] = {
     [ZXDH_VLAN_FILTER_SET] = zxdh_vf_set_vlan_filter,
     [ZXDH_VLAN_FILTER_ADD] = zxdh_vf_vlan_filter_table_add,
     [ZXDH_VLAN_FILTER_DEL] = zxdh_vf_vlan_filter_table_del,
+    [ZXDH_RSS_ENABLE] = zxdh_vf_rss_enable,
+    [ZXDH_RSS_RETA_GET] = zxdh_vf_rss_table_get,
+    [ZXDH_RSS_RETA_SET] = zxdh_vf_rss_table_set,
+    [ZXDH_RSS_HF_SET] = zxdh_vf_rss_hf_set,
+    [ZXDH_RSS_HF_GET] = zxdh_vf_rss_hf_get,
     [ZXDH_VLAN_OFFLOAD] = zxdh_vf_set_vlan_offload,
 };
 
-- 
2.27.0