1 Star 0 Fork 76

chenjiji09/dpdk

forked from src-openEuler/dpdk 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0294-net-hns3-fix-FEC-mode-check-error.patch 3.05 KB
一键复制 编辑 原始数据 按行查看 历史
From be516a78df6de13d6e87aaae19dad374819fca19 Mon Sep 17 00:00:00 2001
From: Jie Hai <haijie1@huawei.com>
Date: Sat, 8 Apr 2023 10:27:34 +0800
Subject: net/hns3: fix FEC mode check error
[ upstream commit 5aba4e41d02222c5cf414b48876cff829f0b6a6f ]
The function is_fec_mode_one_bit_set() is used to check whether
the binary of the mode from user only contains one '1'. But it
uses the bytes number this mode variable occupied to calculate
the count. So this patch uses __builtin_popcount() to replace it.
This patch also extracts the code for verifying mode parameter into
a function.
Fixes: 9bf2ea8dbc65 ("net/hns3: support FEC")
Cc: stable@dpdk.org
Signed-off-by: Jie Hai <haijie1@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
---
drivers/net/hns3/hns3_ethdev.c | 50 ++++++++++++++++------------------
1 file changed, 24 insertions(+), 26 deletions(-)
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 06d4752ab1..74e785c0cf 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -6139,52 +6139,50 @@ get_current_speed_fec_cap(struct hns3_hw *hw, struct rte_eth_fec_capa *fec_capa)
return cur_capa;
}
-static bool
-is_fec_mode_one_bit_set(uint32_t mode)
-{
- int cnt = 0;
- uint8_t i;
-
- for (i = 0; i < sizeof(mode); i++)
- if (mode >> i & 0x1)
- cnt++;
-
- return cnt == 1 ? true : false;
-}
-
static int
-hns3_fec_set(struct rte_eth_dev *dev, uint32_t mode)
+hns3_fec_mode_valid(struct rte_eth_dev *dev, uint32_t mode)
{
#define FEC_CAPA_NUM 2
struct hns3_adapter *hns = dev->data->dev_private;
struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns);
- struct hns3_pf *pf = &hns->pf;
struct rte_eth_fec_capa fec_capa[FEC_CAPA_NUM];
- uint32_t cur_capa;
uint32_t num = FEC_CAPA_NUM;
+ uint32_t cur_capa;
int ret;
- ret = hns3_fec_get_capability(dev, fec_capa, num);
- if (ret < 0)
- return ret;
-
- /* HNS3 PMD only support one bit set mode, e.g. 0x1, 0x4 */
- if (!is_fec_mode_one_bit_set(mode)) {
- hns3_err(hw, "FEC mode(0x%x) not supported in HNS3 PMD, "
- "FEC mode should be only one bit set", mode);
+ if (__builtin_popcount(mode) != 1) {
+ hns3_err(hw, "FEC mode(0x%x) should be only one bit set", mode);
return -EINVAL;
}
+ ret = hns3_fec_get_capability(dev, fec_capa, num);
+ if (ret < 0)
+ return ret;
/*
* Check whether the configured mode is within the FEC capability.
* If not, the configured mode will not be supported.
*/
cur_capa = get_current_speed_fec_cap(hw, fec_capa);
- if (!(cur_capa & mode)) {
- hns3_err(hw, "unsupported FEC mode = 0x%x", mode);
+ if ((cur_capa & mode) == 0) {
+ hns3_err(hw, "unsupported FEC mode(0x%x)", mode);
return -EINVAL;
}
+ return 0;
+}
+
+static int
+hns3_fec_set(struct rte_eth_dev *dev, uint32_t mode)
+{
+ struct hns3_adapter *hns = dev->data->dev_private;
+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns);
+ struct hns3_pf *pf = &hns->pf;
+ int ret;
+
+ ret = hns3_fec_mode_valid(dev, mode);
+ if (ret != 0)
+ return ret;
+
rte_spinlock_lock(&hw->lock);
ret = hns3_set_fec_hw(hw, mode);
if (ret) {
--
2.23.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/chenjiji09/dpdk.git
git@gitee.com:chenjiji09/dpdk.git
chenjiji09
dpdk
dpdk
master

搜索帮助