From ab76162f3dd29b38201f86b6ab0cecd4f4e1bbd5 Mon Sep 17 00:00:00 2001 From: weiwei Date: Wed, 25 Jun 2025 15:32:41 +0800 Subject: [PATCH] fix following bugs - use dev_addr_set to set MAC address when kernel >= 5.17.0 - cache temp/voltage data of optical modules, because read too frequently may cause failure Signed-off-by: weiwei --- drivers/net/ethernet/3snic/sssnic/Kconfig | 2 -- .../sssnic/include/kernel/sss_linux_kernel.h | 3 +++ .../sssnic/nic/include/sss_nic_dev_define.h | 4 ++++ .../ethernet/3snic/sssnic/nic/sss_nic_mag_cfg.c | 16 ++++++++++++++++ .../net/ethernet/3snic/sssnic/nic/sss_nic_main.c | 11 +++++++++-- .../3snic/sssnic/nic/sss_nic_netdev_ops.c | 4 ++++ 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/3snic/sssnic/Kconfig b/drivers/net/ethernet/3snic/sssnic/Kconfig index 8f3227e03b8c..4ceedfff3c6b 100644 --- a/drivers/net/ethernet/3snic/sssnic/Kconfig +++ b/drivers/net/ethernet/3snic/sssnic/Kconfig @@ -7,8 +7,6 @@ config SSSNIC tristate "3SNIC Ethernet Controller SSSNIC Support" depends on PCI depends on ARM64 || X86_64 - depends on VLAN_8021Q || VLAN_8021Q_MODULE - depends on PCI_ATS select SSSNIC_HW default m help diff --git a/drivers/net/ethernet/3snic/sssnic/include/kernel/sss_linux_kernel.h b/drivers/net/ethernet/3snic/sssnic/include/kernel/sss_linux_kernel.h index c08828192892..73b7c3bf4ab4 100644 --- a/drivers/net/ethernet/3snic/sssnic/include/kernel/sss_linux_kernel.h +++ b/drivers/net/ethernet/3snic/sssnic/include/kernel/sss_linux_kernel.h @@ -320,6 +320,9 @@ static inline void _kc_do_gettimeofday(struct timeval *tv) #define HAS_PCIE_ERR_RPT_FUNC #endif /* >= 5.15.0 */ +#if (KERNEL_VERSION(5, 17, 0) <= LINUX_VERSION_CODE) +#define HAS_DEV_ADDR_SET_FUNC +#endif /* >= 5.17.0 */ #if (KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE) #define HAS_SET_DMA_MASK_FUNC diff --git a/drivers/net/ethernet/3snic/sssnic/nic/include/sss_nic_dev_define.h b/drivers/net/ethernet/3snic/sssnic/nic/include/sss_nic_dev_define.h index adf6b92b9616..73d2080ead21 100644 --- a/drivers/net/ethernet/3snic/sssnic/nic/include/sss_nic_dev_define.h +++ b/drivers/net/ethernet/3snic/sssnic/nic/include/sss_nic_dev_define.h @@ -179,6 +179,10 @@ struct sss_nic_dev { struct sss_nic_service_cap nic_svc_cap; + // 读取sfp eeprom间隔太短,温度/电压会异常,因此缓存该数值,间隔1s内读取会使用缓存的值 + struct mutex sfp_mutex; + unsigned long last_jitters; + u8 last_resp[SSSNIC_STD_SFP_INFO_MAX_SIZE]; }; #define SSSNIC_TEST_NIC_DEV_FLAG(nic_dev, flag) \ diff --git a/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_mag_cfg.c b/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_mag_cfg.c index c11ec5a24515..8a6768f129b0 100644 --- a/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_mag_cfg.c +++ b/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_mag_cfg.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -542,12 +543,27 @@ int sss_nic_get_sfp_eeprom(struct sss_nic_dev *nic_dev, u8 *data, u32 len) if (sss_nic_if_sfp_absent(nic_dev)) return -ENXIO; + mutex_lock(&nic_dev->sfp_mutex); + if (jiffies_to_msecs(jiffies - nic_dev->last_jitters) < 1000) { + memcpy(data, nic_dev->last_resp, sizeof(nic_dev->last_resp)); + mutex_unlock(&nic_dev->sfp_mutex); + nic_info(nic_dev->dev_hdl, "use cached sfp eeprom"); + return 0; + } + mutex_unlock(&nic_dev->sfp_mutex); + ret = sss_nic_get_sfp_info(nic_dev, &xsfp_info); if (ret != 0) return ret; memcpy(data, xsfp_info.sfp_info, len); + mutex_lock(&nic_dev->sfp_mutex); + memcpy(nic_dev->last_resp, xsfp_info.sfp_info, sizeof(nic_dev->last_resp)); + nic_dev->last_jitters = jiffies; + mutex_unlock(&nic_dev->sfp_mutex); + nic_info(nic_dev->dev_hdl, "update sfp eeprom"); + return 0; } diff --git a/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_main.c b/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_main.c index bd83585e2cb5..8c648338d1e8 100644 --- a/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_main.c +++ b/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_main.c @@ -420,13 +420,19 @@ static int sss_nic_init_mac_addr(struct sss_nic_dev *nic_dev) { int ret; struct net_device *netdev = nic_dev->netdev; + unsigned char addr[MAX_ADDR_LEN]; - ret = sss_nic_get_default_mac(nic_dev, (u8 *)(netdev->dev_addr)); + memset(addr, 0, sizeof(addr)); + ret = sss_nic_get_default_mac(nic_dev, addr); if (ret != 0) { nic_err(nic_dev->dev_hdl, "Fail to get MAC address\n"); return ret; } - +#ifdef HAS_DEV_ADDR_SET_FUNC + dev_addr_set(netdev, addr); +#else + ether_addr_copy((u8*)(netdev->dev_addr), addr); +#endif if (!is_valid_ether_addr(netdev->dev_addr)) { nic_info(nic_dev->dev_hdl, "Invalid default mac address %pM\n", netdev->dev_addr); @@ -606,6 +612,7 @@ static int sss_nic_dev_params_init(struct net_device *netdev, SET_NETDEV_DEV(netdev, &pdev->dev); mutex_init(&nic_dev->qp_mutex); + mutex_init(&nic_dev->sfp_mutex); sema_init(&nic_dev->port_sem, 1); nic_dev->vlan_bitmap = kzalloc(SSSNIC_VLAN_BITMAP_SIZE(nic_dev), GFP_KERNEL); diff --git a/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_netdev_ops.c b/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_netdev_ops.c index 9d684f03b079..ccdd92e41220 100644 --- a/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_netdev_ops.c +++ b/drivers/net/ethernet/3snic/sssnic/nic/sss_nic_netdev_ops.c @@ -286,7 +286,11 @@ static int sss_nic_ndo_set_mac_address(struct net_device *netdev, void *mac_addr if (ret) return ret; +#ifdef HAS_DEV_ADDR_SET_FUNC + dev_addr_set(netdev, set_addr->sa_data); +#else ether_addr_copy((u8*)(netdev->dev_addr), set_addr->sa_data); +#endif nicif_info(nic_dev, drv, netdev, "Success to set new mac addr: %pM\n", set_addr->sa_data); -- Gitee