bugfix for hns3 PMD
cover bugfix for hns3 PMD
This patch set contains six bugfixes for hns3 PMD.
Huisong Li (6):
net/hns3: fix check of Rx/Tx queue numbers net/hns3: fix requested FC mode roolback net/hns3: remove meaningless packet buffer rollback net/hns3: fix DCB configuration
net/hns3: fix DCB cannot be reconfigured net/hns3: fix link speed when VF device is down
drivers/net/hns3/hns3_dcb.c | 85 +++++++++++++++++++++++---------------- drivers/net/hns3/hns3_dcb.h | 2 +- drivers/net/hns3/hns3_ethdev.c | 84 ++++++++++++++------------------------ drivers/net/hns3/hns3_ethdev_vf.c | 20 +++------ 4 files changed, 88 insertions(+), 103 deletions(-)
Signature · 1 line
2.7.4
PATCH 1/6 net/hns3: fix check of Rx/Tx queue numbers
From: Huisong Li <[email protected]>
The Rx/Tx queue numbers should be greater than TC number, this patch adds this check for PF before updating the mapping between TC and queue.
--- drivers/net/hns3/hns3_dcb.c | 12 ++++++++++++ drivers/net/hns3/hns3_ethdev_vf.c | 12 ------------ 2 files changed, 12 insertions(+), 12 deletions(-)
drivers/net/hns3/hns3_dcb.c +12 -0
@@ -727,6 +727,18 @@ hns3_queue_to_tc_mapping(struct hns3_hw *hw, uint16_t nb_rx_q, uint16_t nb_tx_q) {int ret; +if (nb_rx_q < hw->num_tc) { +hns3_err (hw,"number of Rx queues(%u) is less than number of TC(%u)." , + nb_rx_q, hw->num_tc); +return -EINVAL ; + } + +if (nb_tx_q < hw->num_tc) { +hns3_err (hw,"number of Tx queues(%u) is less than number of TC(%u)." , + nb_tx_q, hw->num_tc); +return -EINVAL ; + } + ret =hns3_set_rss_size (hw, nb_rx_q);if (ret)return ret;
drivers/net/hns3/hns3_ethdev_vf.c +0 -12
@@ -1498,18 +1498,6 @@ hns3vf_set_tc_queue_mapping(struct hns3_adapter *hns, uint16_t nb_rx_q, {struct hns3_hw *hw = &hns->hw; -if (nb_rx_q < hw->num_tc) { -hns3_err (hw,"number of Rx queues(%u) is less than tcs(%u)." , - nb_rx_q, hw->num_tc); -return -EINVAL ; - } - -if (nb_tx_q < hw->num_tc) { -hns3_err (hw,"number of Tx queues(%u) is less than tcs(%u)." , - nb_tx_q, hw->num_tc); -return -EINVAL ; - } -return hns3_queue_to_tc_mapping (hw, nb_rx_q, nb_tx_q); }
Signature · 1 line
2.7.4
PATCH 2/6 net/hns3: fix requested FC mode roolback
In reply to Min Hu (Connor)From: Huisong Li <[email protected]>
Currently, the "requested_fc_mode" lacks rollback when enabling link FC or PFC fails. For example, it encounters a reset. This may result in incorrect FC mode after a reset.
--- drivers/net/hns3/hns3_dcb.c | 30 ++++++++++++++++++++++++++++++ drivers/net/hns3/hns3_ethdev.c | 28 ---------------------------- 2 files changed, 30 insertions(+), 28 deletions(-)
drivers/net/hns3/hns3_dcb.c +30 -0
@@ -1760,6 +1760,30 @@ hns3_dcb_cfg_update(struct hns3_adapter *hns)return ret; } +static void +hns3_get_fc_mode (struct hns3_hw *hw,enum rte_eth_fc_mode mode) +{ +switch (mode) { +case RTE_FC_NONE : + hw->requested_fc_mode =HNS3_FC_NONE ; +break ; +case RTE_FC_RX_PAUSE : + hw->requested_fc_mode =HNS3_FC_RX_PAUSE ; +break ; +case RTE_FC_TX_PAUSE : + hw->requested_fc_mode =HNS3_FC_TX_PAUSE ; +break ; +case RTE_FC_FULL : + hw->requested_fc_mode =HNS3_FC_FULL ; +break ; +default : + hw->requested_fc_mode =HNS3_FC_NONE ; +hns3_warn (hw,"fc_mode(%u) exceeds member scope and is " +"configured to RTE_FC_NONE" , mode); +break ; + } +} +/* * hns3_dcb_pfc_enable - Enable priority flow control * @dev: pointer to ethernet device
@@ -1772,6 +1796,7 @@ hns3_dcb_pfc_enable(struct rte_eth_dev *dev, struct rte_eth_pfc_conf *pfc_conf)struct hns3_hw *hw =HNS3_DEV_PRIVATE_TO_HW (dev->data->dev_private);struct hns3_pf *pf =HNS3_DEV_PRIVATE_TO_PF (dev->data->dev_private);enum hns3_fc_status fc_status = hw->current_fc_status; +enum hns3_fc_mode old_fc_mode = hw->requested_fc_mode;uint8_t hw_pfc_map = hw->dcb_info.hw_pfc_map;uint8_t pfc_en = hw->dcb_info.pfc_en;uint8_t priority = pfc_conf->priority;
@@ -1779,6 +1804,7 @@ hns3_dcb_pfc_enable(struct rte_eth_dev *dev, struct rte_eth_pfc_conf *pfc_conf)int ret, status; pf->pause_time = pfc_conf->fc.pause_time; +hns3_get_fc_mode (hw, pfc_conf->fc.mode); hw->current_fc_status =HNS3_FC_STATUS_PFC ; hw->dcb_info.pfc_en |=BIT (priority); hw->dcb_info.hw_pfc_map =
@@ -1800,6 +1826,7 @@ hns3_dcb_pfc_enable(struct rte_eth_dev *dev, struct rte_eth_pfc_conf *pfc_conf)return 0 ; pfc_setup_fail: + hw->requested_fc_mode = old_fc_mode; hw->current_fc_status = fc_status; pf->pause_time = pause_time; hw->dcb_info.pfc_en = pfc_en;
@@ -1822,11 +1849,13 @@ hns3_fc_enable(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) {struct hns3_hw *hw =HNS3_DEV_PRIVATE_TO_HW (dev->data->dev_private);struct hns3_pf *pf =HNS3_DEV_PRIVATE_TO_PF (dev->data->dev_private); +enum hns3_fc_mode old_fc_mode = hw->requested_fc_mode;enum hns3_fc_status fc_status = hw->current_fc_status;uint16_t pause_time = pf->pause_time;int ret; pf->pause_time = fc_conf->pause_time; +hns3_get_fc_mode (hw, fc_conf->mode);/* * In fact, current_fc_status is HNS3_FC_STATUS_NONE when mode
@@ -1846,6 +1875,7 @@ hns3_fc_enable(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)return 0 ; setup_fc_fail: + hw->requested_fc_mode = old_fc_mode; hw->current_fc_status = fc_status; pf->pause_time = pause_time;
drivers/net/hns3/hns3_ethdev.c +0 -28
@@ -6059,30 +6059,6 @@ hns3_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)return 0 ; } -static void -hns3_get_fc_mode (struct hns3_hw *hw,enum rte_eth_fc_mode mode) -{ -switch (mode) { -case RTE_FC_NONE : - hw->requested_fc_mode =HNS3_FC_NONE ; -break ; -case RTE_FC_RX_PAUSE : - hw->requested_fc_mode =HNS3_FC_RX_PAUSE ; -break ; -case RTE_FC_TX_PAUSE : - hw->requested_fc_mode =HNS3_FC_TX_PAUSE ; -break ; -case RTE_FC_FULL : - hw->requested_fc_mode =HNS3_FC_FULL ; -break ; -default : - hw->requested_fc_mode =HNS3_FC_NONE ; -hns3_warn (hw,"fc_mode(%u) exceeds member scope and is " -"configured to RTE_FC_NONE" , mode); -break ; - } -} -static int hns3_check_fc_autoneg_valid (struct hns3_hw *hw,uint8_t autoneg) {
@@ -6156,8 +6132,6 @@ hns3_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)return -EOPNOTSUPP ; } -hns3_get_fc_mode (hw, fc_conf->mode); -rte_spinlock_lock (&hw->lock); ret =hns3_fc_enable (dev, fc_conf);rte_spinlock_unlock (&hw->lock);
@@ -6204,8 +6178,6 @@ hns3_priority_flow_ctrl_set(struct rte_eth_dev *dev,return -EOPNOTSUPP ; } -hns3_get_fc_mode (hw, pfc_conf->fc.mode); -rte_spinlock_lock (&hw->lock); ret =hns3_dcb_pfc_enable (dev, pfc_conf);rte_spinlock_unlock (&hw->lock);
Signature · 1 line
2.7.4
PATCH 3/6 net/hns3: remove meaningless packet buffer rollback
In reply to Min Hu (Connor)From: Huisong Li <[email protected]>
Packet buffer allocation and hardware pause configuration fail normally when a reset occurs. If the execution fails, rollback of the packet buffer still fails. So this rollback is meaningless.
--- drivers/net/hns3/hns3_dcb.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
drivers/net/hns3/hns3_dcb.c +5 -9
@@ -1543,7 +1543,7 @@ hns3_dcb_hw_configure(struct hns3_adapter *hns)enum hns3_fc_status fc_status = hw->current_fc_status;enum hns3_fc_mode requested_fc_mode = hw->requested_fc_mode;uint8_t hw_pfc_map = hw->dcb_info.hw_pfc_map; -int ret, status; +int ret;if (pf->tx_sch_mode !=HNS3_FLAG_TC_BASE_SCH_MODE && pf->tx_sch_mode !=HNS3_FLAG_VNET_BASE_SCH_MODE )
@@ -1568,7 +1568,7 @@ hns3_dcb_hw_configure(struct hns3_adapter *hns) ret =hns3_buffer_alloc (hw);if (ret) -return ret; + goto buffer_alloc_fail; hw->current_fc_status =HNS3_FC_STATUS_PFC ; hw->requested_fc_mode =HNS3_FC_FULL ;
@@ -1594,10 +1594,9 @@ hns3_dcb_hw_configure(struct hns3_adapter *hns) pfc_setup_fail: hw->requested_fc_mode = requested_fc_mode; hw->current_fc_status = fc_status; + +buffer_alloc_fail: hw->dcb_info.hw_pfc_map = hw_pfc_map; - status =hns3_buffer_alloc (hw); -if (status) -hns3_err (hw,"recover packet buffer fail! status = %d" , status);return ret; }
@@ -1801,7 +1800,7 @@ hns3_dcb_pfc_enable(struct rte_eth_dev *dev, struct rte_eth_pfc_conf *pfc_conf)uint8_t pfc_en = hw->dcb_info.pfc_en;uint8_t priority = pfc_conf->priority;uint16_t pause_time = pf->pause_time; -int ret, status; +int ret; pf->pause_time = pfc_conf->fc.pause_time;hns3_get_fc_mode (hw, pfc_conf->fc.mode);
@@ -1831,9 +1830,6 @@ hns3_dcb_pfc_enable(struct rte_eth_dev *dev, struct rte_eth_pfc_conf *pfc_conf) pf->pause_time = pause_time; hw->dcb_info.pfc_en = pfc_en; hw->dcb_info.hw_pfc_map = hw_pfc_map; - status =hns3_buffer_alloc (hw); -if (status) -hns3_err (hw,"recover packet buffer fail: %d" , status);return ret; }
Signature · 1 line
2.7.4
PATCH 4/6 net/hns3: fix DCB configuration
In reply to Min Hu (Connor)From: Huisong Li <[email protected]>
Currently, the DCB configuration takes effect in the dev_start stage, and the mapping between TCs and queues are also updated in this stage. However, the DCB configuration is delivered in the dev_configure stage. If the configuration fails, it should be intercepted in this stage. If the configuration succeeds, the user should be able to obtain the corresponding updated information, such as the mapping between TCs and queues. So this patch moves DCB configuration to dev_configure.
--- drivers/net/hns3/hns3_dcb.c | 35 +++++--------------------- drivers/net/hns3/hns3_dcb.h | 2 +- drivers/net/hns3/hns3_ethdev.c | 56 +++++++++++++++++++++++------------------- 3 files changed, 38 insertions(+), 55 deletions(-)
drivers/net/hns3/hns3_dcb.c +6 -29
@@ -1615,8 +1615,7 @@ hns3_dcb_configure(struct hns3_adapter *hns)int ret;hns3_dcb_cfg_validate (hns, &num_tc, &map_changed); -if (map_changed || -__atomic_load_n (&hw->reset.resetting, __ATOMIC_RELAXED)) { +if (map_changed) { ret =hns3_dcb_info_update (hns, num_tc);if (ret) {hns3_err (hw,"dcb info update failed: %d" , ret);
@@ -1712,14 +1711,18 @@ hns3_dcb_init(struct hns3_hw *hw)return 0 ; } -static int +int hns3_update_queue_map_configure (struct hns3_adapter *hns) {struct hns3_hw *hw = &hns->hw; +enum rte_eth_rx_mq_mode mq_mode = hw->data->dev_conf.rxmode.mq_mode;uint16_t nb_rx_q = hw->data->nb_rx_queues;uint16_t nb_tx_q = hw->data->nb_tx_queues;int ret; +if ((uint32_t )mq_mode Ð_MQ_RX_DCB_FLAG ) +return 0 ; + ret =hns3_dcb_update_tc_queue_mapping (hw, nb_rx_q, nb_tx_q);if (ret) { hns3_err(hw, "failed to update tc queue mapping, ret = %d.",
@@ -1733,32 +1736,6 @@ hns3_update_queue_map_configure(struct hns3_adapter *hns)return ret; } -int -hns3_dcb_cfg_update (struct hns3_adapter *hns) -{ -struct hns3_hw *hw = &hns->hw; -enum rte_eth_rx_mq_mode mq_mode = hw->data->dev_conf.rxmode.mq_mode; -int ret; - -if ((uint32_t )mq_mode Ð_MQ_RX_DCB_FLAG ) { - ret =hns3_dcb_configure (hns); -if (ret) -hns3_err (hw,"Failed to config dcb: %d" , ret); - }else { -/* -* Update queue map without PFC configuration, -* due to queues reconfigured by user. -*/ - ret =hns3_update_queue_map_configure (hns); -if (ret) -hns3_err (hw, -"Failed to update queue mapping configure: %d" , - ret); - } - -return ret; -} -static void hns3_get_fc_mode (struct hns3_hw *hw,enum rte_eth_fc_mode mode) {
drivers/net/hns3/hns3_dcb.h +1 -1
@@ -207,7 +207,7 @@ int hns3_dcb_pfc_enable(struct rte_eth_dev *dev,int hns3_queue_to_tc_mapping (struct hns3_hw *hw,uint16_t nb_rx_q,uint16_t nb_tx_q); -int hns3_dcb_cfg_update (struct hns3_adapter *hns); +int hns3_update_queue_map_configure (struct hns3_adapter *hns);int hns3_port_shaper_update (struct hns3_hw *hw,uint32_t speed);int hns3_pg_shaper_rate_cfg (struct hns3_hw *hw,uint8_t pg_id,uint32_t rate);int hns3_pri_shaper_rate_cfg (struct hns3_hw *hw,uint8_t tc_no,uint32_t rate);
drivers/net/hns3/hns3_ethdev.c +31 -25
82 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH 5/6 net/hns3: fix DCB cannot be reconfigured
In reply to Min Hu (Connor)From: Huisong Li <[email protected]>
Whether the enable bit of the pfc ("pfc_en") is changed is one of the conditions for reconfiguring the DCB. Currently, pfc_en is not rolled back when DCB configuration fails. This patch fixes it.
--- drivers/net/hns3/hns3_dcb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/hns3/hns3_dcb.c +2 -0
@@ -1543,6 +1543,7 @@ hns3_dcb_hw_configure(struct hns3_adapter *hns)enum hns3_fc_status fc_status = hw->current_fc_status;enum hns3_fc_mode requested_fc_mode = hw->requested_fc_mode;uint8_t hw_pfc_map = hw->dcb_info.hw_pfc_map; +uint8_t pfc_en = hw->dcb_info.pfc_en;int ret; if (pf->tx_sch_mode != HNS3_FLAG_TC_BASE_SCH_MODE &&
@@ -1596,6 +1597,7 @@ hns3_dcb_hw_configure(struct hns3_adapter *hns) hw->current_fc_status = fc_status; buffer_alloc_fail: + hw->dcb_info.pfc_en = pfc_en; hw->dcb_info.hw_pfc_map = hw_pfc_map;return ret;
Signature · 1 line
2.7.4
PATCH 6/6 net/hns3: fix link speed when VF device is down
In reply to Min Hu (Connor)From: Huisong Li <[email protected]>
When the port is link down state, it is meaningless to display the port link speed. It should be an undefined state.
--- drivers/net/hns3/hns3_ethdev_vf.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/hns3/hns3_ethdev_vf.c +5 -3
@@ -2205,16 +2205,18 @@ hns3vf_dev_link_update(struct rte_eth_dev *eth_dev,case ETH_SPEED_NUM_50G :case ETH_SPEED_NUM_100G :case ETH_SPEED_NUM_200G : - new_link.link_speed = mac->link_speed; +if (mac->link_status) + new_link.link_speed = mac->link_speed;break ;default :if (mac->link_status) new_link.link_speed =ETH_SPEED_NUM_UNKNOWN ; -else - new_link.link_speed =ETH_SPEED_NUM_NONE ;break ; } +if (!mac->link_status) + new_link.link_speed =ETH_SPEED_NUM_NONE ; + new_link.link_duplex = mac->link_duplex; new_link.link_status = mac->link_status ?ETH_LINK_UP :ETH_LINK_DOWN ; new_link.link_autoneg =
Signature · 1 line
2.7.4
Quoted 10 lines · Min Hu (Connor)
This patch set contains six bugfixes for hns3 PMD.
Huisong Li (6):
net/hns3: fix check of Rx/Tx queue numbers net/hns3: fix requested FC mode roolback net/hns3: remove meaningless packet buffer rollback net/hns3: fix DCB configuration
net/hns3: fix DCB cannot be reconfigured net/hns3: fix link speed when VF device is down
Series applied to dpdk-next-net/main, thanks.