diff --git a/drivers/net/ethernet/3snic/sssnic/Kconfig b/drivers/net/ethernet/3snic/sssnic/Kconfig index 8f3227e03b8c20e41c52376853bf0a97fe48701a..4ceedfff3c6b2251b18106e5acce271b32fedab7 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 c08828192892c929c1091b0a354e8d599b0325e2..73b7c3bf4ab40f4c656256325a15edffa0d4f964 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 adf6b92b96168858f795ba1d99c353fb94c2095e..73d2080ead21c3b0c1348076247e98400693a7c9 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 c11ec5a24515ba5a9e581087ebff72b53f979881..8a6768f129b0a7fa766bd668c689652e8c8e2c65 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 bd83585e2cb5b02f6acd8df9f0c5327e48713241..8c648338d1e84f10c2eedc257640a630167ca76f 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 9d684f03b079d16b361fd0ea958298310f0bd887..ccdd92e41220eafd7fe7a3d2210bdd6d5c771df1 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);