optimize rss hash config/update,reta update/get. Signed-off-by: Junlong Wang --- 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