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