From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 65F25428E9 for ; Sat, 8 Apr 2023 04:29:26 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DDCE542D0D; Sat, 8 Apr 2023 04:29:25 +0200 (CEST) Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by mails.dpdk.org (Postfix) with ESMTP id E2C8440EE4; Sat, 8 Apr 2023 04:29:22 +0200 (CEST) Received: from kwepemi500017.china.huawei.com (unknown [172.30.72.55]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4PtfJ96hMvzKxMm; Sat, 8 Apr 2023 10:26:49 +0800 (CST) Received: from localhost.localdomain (10.28.79.22) by kwepemi500017.china.huawei.com (7.221.188.110) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Sat, 8 Apr 2023 10:29:20 +0800 From: Dongdong Liu To: , , , CC: , , , Yisen Zhuang , Chengwen Feng , "Wei Hu (Xavier)" , "Min Hu (Connor)" , Chengchang Tang Subject: [PATCH 2/7] net/hns3: fix fec mode check error Date: Sat, 8 Apr 2023 10:27:34 +0800 Message-ID: <20230408022740.14522-3-liudongdong3@huawei.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20230408022740.14522-1-liudongdong3@huawei.com> References: <20230408022740.14522-1-liudongdong3@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.28.79.22] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemi500017.china.huawei.com (7.221.188.110) X-CFilter-Loop: Reflected X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org From: Jie Hai 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 Signed-off-by: Dongdong Liu --- 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 fbf2e5aa6c..9968518b2d 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -6166,52 +6166,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.22.0