96 lines
3.4 KiB
Diff
96 lines
3.4 KiB
Diff
From 6b47ae6a2b6de16ce9d89f30012767f24b22f203 Mon Sep 17 00:00:00 2001
|
|
From: Hao Lan <lanhao@huawei.com>
|
|
Date: Thu, 25 May 2023 00:22:46 +0800
|
|
Subject: [PATCH 237/283] net: hns3: fix the imp capability bit cannot exceed
|
|
32 bits issue
|
|
|
|
driver inclusion
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN49
|
|
CVE: NA
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Current only the first 32 bits of the capability flag bit are considered.
|
|
When the matching capability flag bit is greater than 31 bits,
|
|
it will get an error bit.This patch use bitmap to solve this issue.
|
|
It can handle each capability bit whitout bit width limit.
|
|
|
|
Fixes: da77aef9cc58 ("net: hns3: create common cmdq resource allocate/free/query APIs")
|
|
Signed-off-by: Hao Lan <lanhao@huawei.com>
|
|
(cherry picked from commit 702c687cf9c1a8da10769f2dd4adb4b97e7b868b)
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
---
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 3 ++-
|
|
.../hns3/hns3_common/hclge_comm_cmd.c | 21 ++++++++++++++++---
|
|
2 files changed, 20 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index ec9aa9233506..36a7285f68cf 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -30,6 +30,7 @@
|
|
#include <linux/pci.h>
|
|
#include <linux/pkt_sched.h>
|
|
#include <linux/types.h>
|
|
+#include <linux/bitmap.h>
|
|
#include <net/pkt_cls.h>
|
|
|
|
#define HNAE3_MOD_VERSION "24.3.1"
|
|
@@ -428,7 +429,7 @@ struct hnae3_ae_dev {
|
|
#ifndef __GENKSYMS__
|
|
struct hnae3_dev_specs dev_specs;
|
|
u32 dev_version;
|
|
- unsigned long caps[BITS_TO_LONGS(HNAE3_DEV_CAPS_MAX_NUM)];
|
|
+ DECLARE_BITMAP(caps, HNAE3_DEV_CAPS_MAX_NUM);
|
|
#endif
|
|
void *priv;
|
|
};
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
index c4d647519977..a3ed8e531b25 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
@@ -173,6 +173,20 @@ static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = {
|
|
{HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B},
|
|
};
|
|
|
|
+static void
|
|
+hclge_comm_capability_to_bitmap(unsigned long *bitmap, __le32 *caps)
|
|
+{
|
|
+ const unsigned int words = HCLGE_COMM_QUERY_CAP_LENGTH;
|
|
+ u32 val[HCLGE_COMM_QUERY_CAP_LENGTH];
|
|
+ unsigned int i;
|
|
+
|
|
+ for (i = 0; i < words; i++)
|
|
+ val[i] = __le32_to_cpu(caps[i]);
|
|
+
|
|
+ bitmap_from_arr32(bitmap, val,
|
|
+ HCLGE_COMM_QUERY_CAP_LENGTH * BITS_PER_TYPE(u32));
|
|
+}
|
|
+
|
|
static void
|
|
hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf,
|
|
struct hclge_comm_query_version_cmd *cmd)
|
|
@@ -181,11 +195,12 @@ hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf,
|
|
is_pf ? hclge_pf_cmd_caps : hclge_vf_cmd_caps;
|
|
u32 size = is_pf ? ARRAY_SIZE(hclge_pf_cmd_caps) :
|
|
ARRAY_SIZE(hclge_vf_cmd_caps);
|
|
- u32 caps, i;
|
|
+ DECLARE_BITMAP(caps, HCLGE_COMM_QUERY_CAP_LENGTH * BITS_PER_TYPE(u32));
|
|
+ u32 i;
|
|
|
|
- caps = __le32_to_cpu(cmd->caps[0]);
|
|
+ hclge_comm_capability_to_bitmap(caps, cmd->caps);
|
|
for (i = 0; i < size; i++)
|
|
- if (hnae3_get_bit(caps, caps_map[i].imp_bit))
|
|
+ if (test_bit(caps_map[i].imp_bit, caps))
|
|
set_bit(caps_map[i].local_bit, ae_dev->caps);
|
|
}
|
|
|
|
--
|
|
2.34.1
|
|
|