From: "Min Hu (Connor)" <humin29@huawei.com>
To: <dev@dpdk.org>
Cc: <ferruh.yigit@intel.com>
Subject: [dpdk-dev] [PATCH 2/6] net/hns3: fix requested FC mode roolback
Date: Sat, 15 May 2021 08:52:34 +0800 [thread overview]
Message-ID: <1621039958-34847-3-git-send-email-humin29@huawei.com> (raw)
In-Reply-To: <1621039958-34847-1-git-send-email-humin29@huawei.com>
From: Huisong Li <lihuisong@huawei.com>
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.
Fixes: d4fdb71a0e7b ("net/hns3: fix flow control mode")
Fixes: 62e3ccc2b94c ("net/hns3: support flow control")
Cc: stable@dpdk.org
Signed-off-by: Huisong Li <lihuisong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
---
drivers/net/hns3/hns3_dcb.c | 30 ++++++++++++++++++++++++++++++
drivers/net/hns3/hns3_ethdev.c | 28 ----------------------------
2 files changed, 30 insertions(+), 28 deletions(-)
diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c
index ab307f1..bea4115 100644
--- a/drivers/net/hns3/hns3_dcb.c
+++ b/drivers/net/hns3/hns3_dcb.c
@@ -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;
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 0589e3f..f49f220 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -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);
--
2.7.4
next prev parent reply other threads:[~2021-05-15 0:53 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-15 0:52 [dpdk-dev] [PATCH 0/6] bugfix for hns3 PMD Min Hu (Connor)
2021-05-15 0:52 ` [dpdk-dev] [PATCH 1/6] net/hns3: fix check of Rx/Tx queue numbers Min Hu (Connor)
2021-05-15 0:52 ` Min Hu (Connor) [this message]
2021-05-15 0:52 ` [dpdk-dev] [PATCH 3/6] net/hns3: remove meaningless packet buffer rollback Min Hu (Connor)
2021-05-15 0:52 ` [dpdk-dev] [PATCH 4/6] net/hns3: fix DCB configuration Min Hu (Connor)
2021-05-15 0:52 ` [dpdk-dev] [PATCH 5/6] net/hns3: fix DCB cannot be reconfigured Min Hu (Connor)
2021-05-15 0:52 ` [dpdk-dev] [PATCH 6/6] net/hns3: fix link speed when VF device is down Min Hu (Connor)
2021-05-18 10:41 ` [dpdk-dev] [PATCH 0/6] bugfix for hns3 PMD Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1621039958-34847-3-git-send-email-humin29@huawei.com \
--to=humin29@huawei.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.