From 45e8c05b9a7de7c21fc0791d0e8e8f5e98dc96a4 Mon Sep 17 00:00:00 2001 From: Jie Wang Date: Tue, 13 Aug 2024 22:10:20 +0800 Subject: [PATCH 1/7] net: hns3: fix wrong use of semaphore up maillist inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IATAI1 CVE: NA Reference: https://patchwork.kernel.org/project/netdevbpf/patch/20240813141024.1707252-2-shaojijie@huawei.com/ ---------------------------------------------------------------------- Currently, if hns3 PF or VF FLR reset failed after five times retry, the reset done process will directly release the semaphore which has already released in hclge_reset_prepare_general. This will cause down operation fail. So this patch fixes it by adding reset state judgement. The up operation is only called after successful PF FLR reset. Fixes: 8627bdedc435 ("net: hns3: refactor the precedure of PF FLR") Fixes: f28368bb4542 ("net: hns3: refactor the procedure of VF FLR") Signed-off-by: Jie Wang Signed-off-by: Jijie Shao Signed-off-by: Paolo Abeni Signed-off-by: Hao Chen --- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 ++-- drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index e105ab8a0296..620399a6f63c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -12248,8 +12248,8 @@ static void hclge_reset_done(struct hnae3_ae_dev *ae_dev) dev_err(&hdev->pdev->dev, "fail to rebuild, ret=%d\n", ret); hdev->reset_type = HNAE3_NONE_RESET; - clear_bit(HCLGE_STATE_RST_HANDLING, &hdev->state); - up(&hdev->reset_sem); + if (test_and_clear_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) + up(&hdev->reset_sem); } static void hclge_clear_resetting_state(struct hclge_dev *hdev) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c index 3d851f6119fa..a43c4999145b 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c @@ -1841,8 +1841,8 @@ static void hclgevf_reset_done(struct hnae3_ae_dev *ae_dev) ret); hdev->reset_type = HNAE3_NONE_RESET; - clear_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state); - up(&hdev->reset_sem); + if (test_and_clear_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state)) + up(&hdev->reset_sem); } static u32 hclgevf_get_fw_version(struct hnae3_handle *handle) -- Gitee From 7690ff637839b9ecf2f9df31830d32d4894977d2 Mon Sep 17 00:00:00 2001 From: Peiyang Wang Date: Sat, 24 Aug 2024 16:25:52 +0800 Subject: [PATCH 2/7] net: hns3:support enable or disable pfc strom prevent driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IATAI1 ---------------------------------------------------------------------- this patch provides users with an interface to control whether to enable the pfc strom prevent. Fixes: 26f6cbad1a22 ("net: hns3: add supports pfc storm detection and suppression") Signed-off-by: Peiyang Wang Signed-off-by: Hao Chen --- drivers/net/ethernet/hisilicon/hns3/hnae3.h | 8 ++ .../net/ethernet/hisilicon/hns3/hns3_enet.c | 12 +++ .../ethernet/hisilicon/hns3/hns3_ethtool.c | 12 +++ .../hisilicon/hns3/hns3pf/hclge_cmd.h | 9 ++ .../hisilicon/hns3/hns3pf/hclge_ext.h | 9 -- .../hisilicon/hns3/hns3pf/hclge_main.c | 82 +++++++++++++++++++ .../hisilicon/hns3/hns3pf/hclge_main.h | 3 + 7 files changed, 126 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h index 18e42082ecc4..10d1e85f8439 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h @@ -607,6 +607,10 @@ struct hnae3_ae_dev { * Execute debugfs read command. * request_flush_qb_config * Request to update queue bonding configuration + * request_pfc_storm_config + * Request to update pfc storm configuration + * get_pfc_storm_config + * Get pfc storm config * query_fd_qb_state * Query whether hw queue bonding enabled * set_tx_hwts_info @@ -809,6 +813,9 @@ struct hnae3_ae_ops { int (*set_phy_link_ksettings)(struct hnae3_handle *handle, const struct ethtool_link_ksettings *cmd); void (*request_flush_qb_config)(struct hnae3_handle *handle); + void (*request_pfc_storm_config)(struct hnae3_handle *handle, + bool enable); + int (*get_pfc_storm_config)(struct hnae3_handle *handle, bool *enable); bool (*query_fd_qb_state)(struct hnae3_handle *handle); bool (*set_tx_hwts_info)(struct hnae3_handle *handle, struct sk_buff *skb); @@ -936,6 +943,7 @@ enum hnae3_pflag { HNAE3_PFLAG_LIMIT_PROMISC, HNAE3_PFLAG_FD_QB_ENABLE, HNAE3_PFLAG_ROH_ARP_PROXY_ENABLE, + HNAE3_PFLAG_PFC_STORM_PREVENT_ENABLE, HNAE3_PFLAG_MAX }; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index d031060a7e70..c41cc91d980b 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -5600,6 +5600,18 @@ static void hns3_state_init(struct hnae3_handle *handle) &handle->supported_pflags); set_bit(HNAE3_PFLAG_ROH_ARP_PROXY_ENABLE, &handle->priv_flags); } + + if (handle->ae_algo->ops->get_pfc_storm_config) { + bool enable = true; + int ret = handle->ae_algo->ops->get_pfc_storm_config(handle, + &enable); + + set_bit(HNAE3_PFLAG_PFC_STORM_PREVENT_ENABLE, + &handle->supported_pflags); + if (!ret && enable) + set_bit(HNAE3_PFLAG_PFC_STORM_PREVENT_ENABLE, + &handle->priv_flags); + } } static void hns3_state_uninit(struct hnae3_handle *handle) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c index f49bce6fc053..271b2c4435a7 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c @@ -499,10 +499,22 @@ static void hns3_update_roh_arp_proxy_enable(struct net_device *netdev, enable ? "enable" : "disable"); } +static void hns3_update_pfc_storm_prevent_enable(struct net_device *netdev, + bool enable) +{ + struct hnae3_handle *handle = hns3_get_handle(netdev); + + if (!handle->ae_algo->ops->request_pfc_storm_config) + return; + + handle->ae_algo->ops->request_pfc_storm_config(handle, enable); +} + static const struct hns3_pflag_desc hns3_priv_flags[HNAE3_PFLAG_MAX] = { { "limit_promisc", hns3_update_limit_promisc_mode }, { "qb_enable", hns3_update_fd_qb_state }, { "roh_arp_proxy_enable", hns3_update_roh_arp_proxy_enable }, + { "pfc_storm_prevent_enable", hns3_update_pfc_storm_prevent_enable }, }; static int hns3_get_sset_count(struct net_device *netdev, int stringset) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h index 21cfe5d44cd3..d2fb21fd2354 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h @@ -925,6 +925,15 @@ struct hclge_query_wol_supported_cmd { u8 rsv[20]; }; +struct hclge_pfc_storm_para_cmd { + __le32 dir; + __le32 enable; + __le32 period_ms; + __le32 times; + __le32 recovery_period_ms; + __le32 rsv; +}; + struct hclge_hw; int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num); #endif diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h index 5aca6b097e42..250eb0f06353 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h @@ -77,15 +77,6 @@ struct hclge_port_num_info_cmd { u8 rsv[20]; }; -struct hclge_pfc_storm_para_cmd { - __le32 dir; - __le32 enable; - __le32 period_ms; - __le32 times; - __le32 recovery_period_ms; - __le32 rsv; -}; - struct hclge_notify_pkt_param_cmd { __le32 cfg; __le32 ipg; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 620399a6f63c..356508847588 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -5498,6 +5498,86 @@ static void hclge_flush_qb_config(struct hnae3_handle *handle) set_bit(HCLGE_VPORT_STATE_QB_CHANGE, &vport->state); } +static int +hclge_get_pfc_storm_prevent(struct hclge_dev *hdev, int dir, bool *enable) +{ + struct hclge_pfc_storm_para_cmd *para_cmd; + struct hclge_desc desc; + int ret; + + hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_PAUSE_STORM_PARA, true); + para_cmd = (struct hclge_pfc_storm_para_cmd *)desc.data; + para_cmd->dir = cpu_to_le32(dir); + ret = hclge_cmd_send(&hdev->hw, &desc, 1); + if (ret) + return ret; + + *enable = !!le32_to_cpu(para_cmd->enable); + return 0; +} + +static int hclge_get_pfc_storm_config(struct hnae3_handle *handle, bool *enable) +{ + struct hclge_vport *vport = hclge_get_vport(handle); + struct hclge_dev *hdev = vport->back; + bool enable_tx, enable_rx; + int ret; + + ret = hclge_get_pfc_storm_prevent(hdev, HCLGE_DIR_TX, &enable_tx); + if (ret) { + dev_err(&hdev->pdev->dev, "failed to get tx pfc storm prevent, ret=%d\n", + ret); + return ret; + } + ret = hclge_get_pfc_storm_prevent(hdev, HCLGE_DIR_RX, &enable_rx); + if (ret) { + dev_err(&hdev->pdev->dev, "failed to get rx pfc storm prevent, ret=%d\n", + ret); + return ret; + } + + *enable = enable_tx || enable_rx; + return 0; +} + +static int +hclge_enable_pfc_storm_prevent(struct hclge_dev *hdev, int dir, bool enable) +{ + struct hclge_pfc_storm_para_cmd *para_cmd; + struct hclge_desc desc; + + hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_PAUSE_STORM_PARA, + false); + para_cmd = (struct hclge_pfc_storm_para_cmd *)desc.data; + para_cmd->dir = cpu_to_le32(dir); + para_cmd->enable = cpu_to_le32(enable); + + return hclge_cmd_send(&hdev->hw, &desc, 1); +} + +static void +hclge_request_pfc_storm_config(struct hnae3_handle *handle, bool enable) +{ + struct hclge_vport *vport = hclge_get_vport(handle); + struct hclge_dev *hdev = vport->back; + int ret; + + ret = hclge_enable_pfc_storm_prevent(hdev, HCLGE_DIR_TX, enable); + if (ret) { + dev_err(&hdev->pdev->dev, "failed to %s tx pfc storm prevent, ret=%d\n", + enable ? "enable" : "disable", ret); + return; + } + + ret = hclge_enable_pfc_storm_prevent(hdev, HCLGE_DIR_RX, enable); + if (ret) + dev_err(&hdev->pdev->dev, "failed to %s rx pfc storm prevent, ret=%d\n", + enable ? "enable" : "disable", ret); + else + dev_info(&hdev->pdev->dev, "pfc storm prevent %s\n", + enable ? "enabled" : "disabled"); +} + static void hclge_sync_fd_state(struct hclge_dev *hdev) { struct hclge_vport *vport = &hdev->vport[0]; @@ -13510,6 +13590,8 @@ struct hnae3_ae_ops hclge_ops = { .set_promisc_mode = hclge_set_promisc_mode, .request_update_promisc_mode = hclge_request_update_promisc_mode, .request_flush_qb_config = hclge_flush_qb_config, + .request_pfc_storm_config = hclge_request_pfc_storm_config, + .get_pfc_storm_config = hclge_get_pfc_storm_config, .query_fd_qb_state = hclge_query_fd_qb_state, .set_loopback = hclge_set_loopback, .start = hclge_ae_start, diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h index 969c469210ea..dcc928dedc8c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h @@ -347,6 +347,9 @@ enum hclge_link_fail_code { #define HCLGE_LINK_STATUS_DOWN 0 #define HCLGE_LINK_STATUS_UP 1 +#define HCLGE_DIR_RX 0 +#define HCLGE_DIR_TX 1 + #define HCLGE_PG_NUM 4 #define HCLGE_SCH_MODE_SP 0 #define HCLGE_SCH_MODE_DWRR 1 -- Gitee From 9ba55f4e8c401511a3e93561f87f93bfcb359486 Mon Sep 17 00:00:00 2001 From: Hao Lan Date: Tue, 27 Aug 2024 22:31:09 +0800 Subject: [PATCH 3/7] net: hns3: fixed hclge_fetch_pf_reg accesses bar space out of bounds issue driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IATAI1 ---------------------------------------------------------------------- The TQP BAR space is divided into two segments. TQPs 0-1023 and TQPs 1024-1279 are in different BAR space addresses. However, hclge_fetch_pf_reg does not distinguish the tqp space information when reading the tqp space information. When the number of TQPs is greater than 1024, access bar space overwriting occurs. The problem of different segments has been considered during the initialization of tqp.io_base. Therefore, tqp.io_base is directly used when the queue is read in hclge_fetch_pf_reg. The error message: Unable to handle kernel paging request at virtual address ffff800037200000 pc : hclge_fetch_pf_reg+0x138/0x250 [hclge] lr : hclge_get_regs+0x84/0x1d0 [hclge] Call trace: hclge_fetch_pf_reg+0x138/0x250 [hclge] hclge_get_regs+0x84/0x1d0 [hclge] hns3_get_regs+0x2c/0x50 [hns3] ethtool_get_regs+0xf4/0x270 dev_ethtool+0x674/0x8a0 dev_ioctl+0x270/0x36c sock_do_ioctl+0x110/0x2a0 sock_ioctl+0x2ac/0x530 __arm64_sys_ioctl+0xa8/0x100 invoke_syscall+0x4c/0x124 el0_svc_common.constprop.0+0x140/0x15c do_el0_svc+0x30/0xd0 el0_svc+0x1c/0x2c el0_sync_handler+0xb0/0xb4 el0_sync+0x168/0x180 Fixes: 30df0f98f189 ("net: hns3: move dump regs function to a separate file") Signed-off-by: Hao Lan Signed-off-by: Hao Chen --- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c | 9 +++++---- .../net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c index 43c1c18fa81f..8c057192aae6 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c @@ -510,9 +510,9 @@ static int hclge_get_dfx_reg(struct hclge_dev *hdev, void *data) static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data, struct hnae3_knic_private_info *kinfo) { -#define HCLGE_RING_REG_OFFSET 0x200 #define HCLGE_RING_INT_REG_OFFSET 0x4 + struct hnae3_queue *tqp; int i, j, reg_num; int data_num_sum; u32 *reg = data; @@ -533,10 +533,11 @@ static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data, reg_num = ARRAY_SIZE(ring_reg_addr_list); for (j = 0; j < kinfo->num_tqps; j++) { reg += hclge_reg_get_tlv(HCLGE_REG_TAG_RING, reg_num, reg); + tqp = kinfo->tqp[j]; for (i = 0; i < reg_num; i++) - *reg++ = hclge_read_dev(&hdev->hw, - ring_reg_addr_list[i] + - HCLGE_RING_REG_OFFSET * j); + *reg++ = readl_relaxed(tqp->io_base - + HCLGE_TQP_REG_OFFSET + + ring_reg_addr_list[i]); } data_num_sum += (reg_num + HCLGE_REG_TLV_SPACE) * kinfo->num_tqps; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c index 65b9dcd38137..6ecf936c79b2 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c @@ -123,10 +123,10 @@ int hclgevf_get_regs_len(struct hnae3_handle *handle) void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, void *data) { -#define HCLGEVF_RING_REG_OFFSET 0x200 #define HCLGEVF_RING_INT_REG_OFFSET 0x4 struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); + struct hnae3_queue *tqp; int i, j, reg_um; u32 *reg = data; @@ -147,10 +147,11 @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, reg_um = sizeof(ring_reg_addr_list) / sizeof(u32); for (j = 0; j < hdev->num_tqps; j++) { reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg); + tqp = &hdev->htqp[j].q; for (i = 0; i < reg_um; i++) - *reg++ = hclgevf_read_dev(&hdev->hw, - ring_reg_addr_list[i] + - HCLGEVF_RING_REG_OFFSET * j); + *reg++ = readl_relaxed(tqp->io_base - + HCLGEVF_TQP_REG_OFFSET + + ring_reg_addr_list[i]); } reg_um = sizeof(tqp_intr_reg_addr_list) / sizeof(u32); -- Gitee From bde0234d9496a99b8dff78e88d5feb077aefc47d Mon Sep 17 00:00:00 2001 From: Hao Lan Date: Thu, 29 Aug 2024 08:44:07 +0800 Subject: [PATCH 4/7] net: hns3: fix spelling mistake "reg_um" -> "reg_num" driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IATAI1 ---------------------------------------------------------------------- There are spelling mistakes in hclgevf_get_regs. Fix them. Fixes: 30df0f98f189 ("net: hns3: move dump regs function to a separate file") Signed-off-by: Hao Lan Signed-off-by: Hao Chen --- .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c index 6ecf936c79b2..637d83a400d3 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c @@ -127,37 +127,37 @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); struct hnae3_queue *tqp; - int i, j, reg_um; + int i, j, reg_num; u32 *reg = data; *version = hdev->fw_version; reg += hclgevf_reg_get_header(reg); /* fetching per-VF registers values from VF PCIe register space */ - reg_um = sizeof(cmdq_reg_addr_list) / sizeof(u32); - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg); - for (i = 0; i < reg_um; i++) + reg_num = sizeof(cmdq_reg_addr_list) / sizeof(u32); + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_num, reg); + for (i = 0; i < reg_num; i++) *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); - reg_um = sizeof(common_reg_addr_list) / sizeof(u32); - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg); - for (i = 0; i < reg_um; i++) + reg_num = sizeof(common_reg_addr_list) / sizeof(u32); + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_num, reg); + for (i = 0; i < reg_num; i++) *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]); - reg_um = sizeof(ring_reg_addr_list) / sizeof(u32); + reg_num = sizeof(ring_reg_addr_list) / sizeof(u32); for (j = 0; j < hdev->num_tqps; j++) { - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg); + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_num, reg); tqp = &hdev->htqp[j].q; - for (i = 0; i < reg_um; i++) + for (i = 0; i < reg_num; i++) *reg++ = readl_relaxed(tqp->io_base - HCLGEVF_TQP_REG_OFFSET + ring_reg_addr_list[i]); } - reg_um = sizeof(tqp_intr_reg_addr_list) / sizeof(u32); + reg_num = sizeof(tqp_intr_reg_addr_list) / sizeof(u32); for (j = 0; j < hdev->num_msi_used - 1; j++) { - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_um, reg); - for (i = 0; i < reg_um; i++) + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_num, reg); + for (i = 0; i < reg_num; i++) *reg++ = hclgevf_read_dev(&hdev->hw, tqp_intr_reg_addr_list[i] + HCLGEVF_RING_INT_REG_OFFSET * j); -- Gitee From b0b062c86700a4de605bbb099647c91f559d8cf1 Mon Sep 17 00:00:00 2001 From: Peiyang Wang Date: Thu, 1 Aug 2024 09:47:38 +0800 Subject: [PATCH 5/7] net: hns3: make sure ptp clock is unregister and freed if hclge_ptp_get_cycle returns an error driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IATAI1 ---------------------------------------------------------------------- During the initialization of ptp, hclge_ptp_get_cycle might return an error and returned directly without unregister clock and free it. To avoid that, call hclge_ptp_destroy_clock to unregist and free clock if hclge_ptp_get_cycle failed. Fixes: f61992ad87f2 ("net: hns3: change the method of obtaining default ptp cycle") Signed-off-by: Peiyang Wang Signed-off-by: Hao Chen --- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c index 0ddf102c76f7..e7a112ff1ad6 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c @@ -487,7 +487,7 @@ int hclge_ptp_init(struct hclge_dev *hdev) ret = hclge_ptp_get_cycle(hdev); if (ret) - return ret; + goto out; } ret = hclge_ptp_int_en(hdev, true); -- Gitee From e5f144ab10a74ce56142bb5c75160dbe2e8e4349 Mon Sep 17 00:00:00 2001 From: Yonglong Liu Date: Wed, 7 Aug 2024 14:39:36 +0800 Subject: [PATCH 6/7] net: hns3: fix snprintf() is printing too much problem driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IATAI1 ---------------------------------------------------------------------- smatch report a error: hisi_ptp_create_clock() error: snprintf() is printing too much 32 vs 16 The PTP_CLOCK_NAME_LEN is not define in some kernel version, and the old kernel is defined as 16, new kernel is defined as 32, so report this error. Use sizeof() to fix it. Fixes: c64545e1e5fa ("net: hns3: add support for Hisilicon ptp sync device") Signed-off-by: Yonglong Liu Signed-off-by: Hao Chen --- drivers/ptp/ptp_hisi.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/ptp/ptp_hisi.c b/drivers/ptp/ptp_hisi.c index 0eb1ebf44dc8..c53bcdd08747 100644 --- a/drivers/ptp/ptp_hisi.c +++ b/drivers/ptp/ptp_hisi.c @@ -15,10 +15,6 @@ #include #include -#ifndef PTP_CLOCK_NAME_LEN -#define PTP_CLOCK_NAME_LEN 32 -#endif - #define HISI_PTP_VERSION "22.10.2" #define HISI_PTP_NAME "hisi_ptp" @@ -588,7 +584,7 @@ static int hisi_ptp_create_clock(struct hisi_ptp_pdev *ptp) { dev_info(ptp->ptp_tx->dev, "register ptp clock\n"); - snprintf(ptp->info.name, PTP_CLOCK_NAME_LEN, "%s", HISI_PTP_NAME); + snprintf(ptp->info.name, sizeof(ptp->info.name), "%s", HISI_PTP_NAME); ptp->info.owner = THIS_MODULE; ptp->info.adjfine = hisi_ptp_adjfine; ptp->info.adjtime = hisi_ptp_adjtime; -- Gitee From bb472ba3516b2930fa328a0be5656f7eba37c725 Mon Sep 17 00:00:00 2001 From: Jian Shen Date: Tue, 4 Jun 2024 21:38:34 +0800 Subject: [PATCH 7/7] net: hns3: fix concurrent setting vlan filter issue driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IATAI1 ---------------------------------------------------------------------- The vport->req_vlan_fltr_en may be changed concurently by function hclge_sync_vlan_fltr_state() called in periodic work task and function hclge_enable_vport_vlan_filter() called by user configuration. It may cause the user configuration inoperative. Fixes it by protect the vport->req_vlan_fltr by vport_lock. Fixes: fb19a769c98c ("net: hns3: add support for VF modify VLAN filter state") Signed-off-by: Jian Shen Signed-off-by: Hao Chen --- .../hisilicon/hns3/hns3pf/hclge_main.c | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 356508847588..7460eabc28a2 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -10283,33 +10283,35 @@ static bool hclge_need_enable_vport_vlan_filter(struct hclge_vport *vport) return false; } -int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en) +static int __hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en) { - struct hclge_dev *hdev = vport->back; bool need_en; int ret; - mutex_lock(&hdev->vport_lock); - - vport->req_vlan_fltr_en = request_en; - need_en = hclge_need_enable_vport_vlan_filter(vport); - if (need_en == vport->cur_vlan_fltr_en) { - mutex_unlock(&hdev->vport_lock); + if (need_en == vport->cur_vlan_fltr_en) return 0; - } ret = hclge_set_vport_vlan_filter(vport, need_en); - if (ret) { - mutex_unlock(&hdev->vport_lock); + if (ret) return ret; - } vport->cur_vlan_fltr_en = need_en; + return 0; +} + +int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en) +{ + struct hclge_dev *hdev = vport->back; + int ret; + + mutex_lock(&hdev->vport_lock); + vport->req_vlan_fltr_en = request_en; + ret = __hclge_enable_vport_vlan_filter(vport, request_en); mutex_unlock(&hdev->vport_lock); - return 0; + return ret; } static int hclge_enable_vlan_filter(struct hnae3_handle *handle, bool enable) @@ -11331,16 +11333,19 @@ static void hclge_sync_vlan_fltr_state(struct hclge_dev *hdev) &vport->state)) continue; - ret = hclge_enable_vport_vlan_filter(vport, - vport->req_vlan_fltr_en); + mutex_lock(&hdev->vport_lock); + ret = __hclge_enable_vport_vlan_filter(vport, + vport->req_vlan_fltr_en); if (ret) { dev_err(&hdev->pdev->dev, "failed to sync vlan filter state for vport%u, ret = %d\n", vport->vport_id, ret); set_bit(HCLGE_VPORT_STATE_VLAN_FLTR_CHANGE, &vport->state); + mutex_unlock(&hdev->vport_lock); return; } + mutex_unlock(&hdev->vport_lock); } } -- Gitee