[Intel-wired-lan] [tnguy-net-queue:200GbE] BUILD SUCCESS 02d9009f4e8c27dcf10c3e39bc0666436686a219
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue.git 200GbE branch HEAD: 02d9009f4e8c27dcf10c3e39bc0666436686a219 selftests: net: add more missing kernel config elapsed time: 2241m configs tested: 262 configs skipped: 3 The following configs have been built successfully. More configs may be tested in the coming days. tested configs: alpha allnoconfig gcc alphaallyesconfig gcc alpha defconfig gcc arc allmodconfig gcc arc allnoconfig gcc arc allyesconfig gcc arc axs103_smp_defconfig gcc arc defconfig gcc arc haps_hs_defconfig gcc arc randconfig-001-20240209 gcc arc randconfig-001-20240210 gcc arc randconfig-002-20240209 gcc arc randconfig-002-20240210 gcc arcvdk_hs38_smp_defconfig gcc arm allmodconfig gcc arm allnoconfig clang arm allyesconfig gcc arm defconfig clang armdove_defconfig gcc arm jornada720_defconfig clang arm lpc32xx_defconfig clang armmvebu_v5_defconfig gcc arm mxs_defconfig clang arm omap2plus_defconfig gcc arm randconfig-001-20240210 gcc arm randconfig-002-20240209 gcc arm randconfig-002-20240210 gcc arm randconfig-003-20240209 gcc arm randconfig-003-20240210 gcc arm randconfig-004-20240209 gcc arm randconfig-004-20240210 gcc armshmobile_defconfig gcc arm socfpga_defconfig gcc arm spear13xx_defconfig gcc arm stm32_defconfig gcc arm versatile_defconfig gcc armvexpress_defconfig gcc arm64alldefconfig gcc arm64allmodconfig clang arm64 allnoconfig gcc arm64 defconfig gcc arm64 randconfig-001-20240210 clang arm64 randconfig-002-20240210 gcc arm64 randconfig-003-20240210 gcc arm64 randconfig-004-20240210 gcc csky allmodconfig gcc csky allnoconfig gcc csky allyesconfig gcc cskydefconfig gcc csky randconfig-001-20240209 gcc csky randconfig-001-20240210 gcc csky randconfig-002-20240209 gcc csky randconfig-002-20240210 gcc hexagon allmodconfig clang hexagon allnoconfig clang hexagon allyesconfig clang hexagon defconfig clang hexagon randconfig-001-20240210 clang hexagon randconfig-002-20240210 clang i386 allmodconfig gcc i386 allnoconfig gcc i386 allyesconfig gcc i386 buildonly-randconfig-001-20240210 clang i386 buildonly-randconfig-002-20240210 gcc i386 buildonly-randconfig-003-20240209 gcc i386 buildonly-randconfig-003-20240210 clang i386 buildonly-randconfig-004-20240210 clang i386 buildonly-randconfig-005-20240210 clang i386 buildonly-randconfig-006-20240209 gcc i386 buildonly-randconfig-006-20240210 clang i386defconfig clang i386 randconfig-001-20240210 gcc i386 randconfig-002-20240209 gcc i386 randconfig-002-20240210 gcc i386 randconfig-003-20240210 clang i386 randconfig-004-20240210 clang i386 randconfig-005-20240210 gcc i386 randconfig-006-20240209 gcc i386 randconfig-006-20240210 gcc i386 randconfig-011-20240209 gcc i386 randconfig-011-20240210 clang i386 randconfig-012-20240209 gcc i386 randconfig-012-20240210 clang i386 randconfig-013-20240210 clang i386 randconfig-014-20240209 gcc i386
[Intel-wired-lan] [tnguy-net-queue:dev-queue] BUILD SUCCESS b1011aaeb1aacceb4a4f998ef5bc23358971cff6
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue.git dev-queue branch HEAD: b1011aaeb1aacceb4a4f998ef5bc23358971cff6 idpf: disable local BH when scheduling napi for marker packets elapsed time: 1449m configs tested: 179 configs skipped: 3 The following configs have been built successfully. More configs may be tested in the coming days. tested configs: alpha allnoconfig gcc alphaallyesconfig gcc alpha defconfig gcc arc allmodconfig gcc arc allnoconfig gcc arc allyesconfig gcc arc axs103_smp_defconfig gcc arc defconfig gcc arc randconfig-001-20240210 gcc arc randconfig-002-20240210 gcc arm allmodconfig gcc arm allnoconfig clang arm allyesconfig gcc arm defconfig clang armdove_defconfig gcc arm lpc18xx_defconfig clang arm randconfig-001-20240210 gcc arm randconfig-002-20240210 gcc arm randconfig-003-20240210 gcc arm randconfig-004-20240210 gcc arm socfpga_defconfig gcc arm64allmodconfig clang arm64 allnoconfig gcc arm64 defconfig gcc arm64 randconfig-001-20240210 clang arm64 randconfig-002-20240210 gcc arm64 randconfig-003-20240210 gcc arm64 randconfig-004-20240210 gcc csky allmodconfig gcc csky allnoconfig gcc csky allyesconfig gcc cskydefconfig gcc csky randconfig-001-20240210 gcc csky randconfig-002-20240210 gcc hexagon allmodconfig clang hexagon allnoconfig clang hexagon allyesconfig clang hexagon defconfig clang hexagon randconfig-001-20240210 clang hexagon randconfig-002-20240210 clang i386 allmodconfig gcc i386 allnoconfig gcc i386 allyesconfig gcc i386 buildonly-randconfig-001-20240210 clang i386 buildonly-randconfig-002-20240210 gcc i386 buildonly-randconfig-003-20240210 clang i386 buildonly-randconfig-004-20240210 clang i386 buildonly-randconfig-005-20240210 clang i386 buildonly-randconfig-006-20240210 clang i386defconfig clang i386 randconfig-001-20240210 gcc i386 randconfig-002-20240210 gcc i386 randconfig-003-20240210 clang i386 randconfig-004-20240210 clang i386 randconfig-005-20240210 gcc i386 randconfig-006-20240210 gcc i386 randconfig-011-20240210 clang i386 randconfig-012-20240210 clang i386 randconfig-013-20240210 clang i386 randconfig-014-20240210 gcc i386 randconfig-015-20240210 gcc i386 randconfig-016-20240210 gcc loongarchallmodconfig gcc loongarch allnoconfig gcc loongarch defconfig gcc loongarch randconfig-001-20240210 gcc loongarch randconfig-002-20240210 gcc m68k allmodconfig gcc m68k allnoconfig gcc m68k allyesconfig gcc m68kdefconfig gcc m68k hp300_defconfig gcc m68k m5275evb_defconfig gcc microblaze allmodconfig gcc microblazeallnoconfig gcc microblaze allyesconfig gcc microblaze defconfig gcc mips allnoconfig gcc mips allyesconfig gcc mips loongson2k_defconfig gcc nios2allmodconfig gcc nios2 allnoconfig gcc nios2allyesconfig gcc nios2 defconfig gcc nios2 randconfig-001-20240210 gcc nios2
[Intel-wired-lan] [tnguy-next-queue:dev-queue] BUILD SUCCESS 7c9b8de2aec60f9217e04a6b13f325b81aec00bd
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue.git dev-queue branch HEAD: 7c9b8de2aec60f9217e04a6b13f325b81aec00bd ice: Add switch recipe reusing feature elapsed time: 1442m configs tested: 178 configs skipped: 3 The following configs have been built successfully. More configs may be tested in the coming days. tested configs: alpha allnoconfig gcc alphaallyesconfig gcc alpha defconfig gcc arc allmodconfig gcc arc allnoconfig gcc arc allyesconfig gcc arc defconfig gcc arc randconfig-001-20240210 gcc arc randconfig-002-20240210 gcc arcvdk_hs38_smp_defconfig gcc arm allmodconfig gcc arm allnoconfig clang arm allyesconfig gcc arm defconfig clang arm jornada720_defconfig clang arm lpc32xx_defconfig clang arm mxs_defconfig clang arm randconfig-001-20240210 gcc arm randconfig-002-20240210 gcc arm randconfig-003-20240210 gcc arm randconfig-004-20240210 gcc armshmobile_defconfig gcc arm stm32_defconfig gcc arm64alldefconfig gcc arm64allmodconfig clang arm64 allnoconfig gcc arm64 defconfig gcc arm64 randconfig-001-20240210 clang arm64 randconfig-002-20240210 gcc arm64 randconfig-003-20240210 gcc arm64 randconfig-004-20240210 gcc csky allmodconfig gcc csky allnoconfig gcc csky allyesconfig gcc cskydefconfig gcc csky randconfig-001-20240210 gcc csky randconfig-002-20240210 gcc hexagon allmodconfig clang hexagon allnoconfig clang hexagon allyesconfig clang hexagon defconfig clang hexagon randconfig-001-20240210 clang hexagon randconfig-002-20240210 clang i386 allmodconfig gcc i386 allnoconfig gcc i386 allyesconfig gcc i386 buildonly-randconfig-001-20240210 clang i386 buildonly-randconfig-002-20240210 gcc i386 buildonly-randconfig-003-20240210 clang i386 buildonly-randconfig-004-20240210 clang i386 buildonly-randconfig-005-20240210 clang i386 buildonly-randconfig-006-20240210 clang i386defconfig clang i386 randconfig-001-20240210 gcc i386 randconfig-002-20240210 gcc i386 randconfig-003-20240210 clang i386 randconfig-004-20240210 clang i386 randconfig-005-20240210 gcc i386 randconfig-006-20240210 gcc i386 randconfig-011-20240210 clang i386 randconfig-012-20240210 clang i386 randconfig-013-20240210 clang i386 randconfig-014-20240210 gcc i386 randconfig-015-20240210 gcc i386 randconfig-016-20240210 gcc loongarchallmodconfig gcc loongarch allnoconfig gcc loongarch defconfig gcc loongarch randconfig-001-20240210 gcc loongarch randconfig-002-20240210 gcc m68k allmodconfig gcc m68k allnoconfig gcc m68k allyesconfig gcc m68kdefconfig gcc m68k hp300_defconfig gcc m68km5307c3_defconfig gcc microblaze allmodconfig gcc microblazeallnoconfig gcc microblaze allyesconfig gcc microblaze defconfig gcc mips allnoconfig gcc mips allyesconfig gcc mips xway_defconfig clang nios2allmodconfig gcc nios2 allnoconfig gcc nios2
[Intel-wired-lan] [PATCH iwl-next v1 0/2] net: intel: cleanup power ops
Do a quick refactor of igb to clean up some unnecessary declarations, noticed while doing the real work of 2/2. Follow that with a change of all the Intel drivers to use the current power management declaration APIs, to avoid complication and maintenance issues with CONFIG_PM=. This is as per [1] Mostly compile-tested only. ice driver is skipped in this series because the driver was fixed as part of a bug fix to make it use the new APIs, and will be arriving via -net tree. [1] https://lore.kernel.org/netdev/20211207002102.26414-1-p...@crapouillou.net/ Jesse Brandeburg (2): igb: simplify pci ops declaration net: intel: implement modern PM ops declarations drivers/net/ethernet/intel/e100.c | 8 +-- drivers/net/ethernet/intel/e1000/e1000_main.c | 14 ++--- drivers/net/ethernet/intel/e1000e/netdev.c| 22 +++ drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 10 ++-- drivers/net/ethernet/intel/i40e/i40e_main.c | 10 ++-- drivers/net/ethernet/intel/iavf/iavf_main.c | 8 +-- drivers/net/ethernet/intel/igb/igb_main.c | 59 --- drivers/net/ethernet/intel/igbvf/netdev.c | 6 +- drivers/net/ethernet/intel/igc/igc_main.c | 24 +++- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 8 +-- .../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 8 +-- 11 files changed, 74 insertions(+), 103 deletions(-) base-commit: b63cc73341e076961d564a74cc3d29b2fd444079 -- 2.39.3
[Intel-wired-lan] [PATCH iwl-next v1 1/2] igb: simplify pci ops declaration
The igb driver was pre-declaring tons of functions just so that it could have an early declaration of the pci_driver struct. Delete a bunch of the declarations and move the struct to the bottom of the file, after all the functions are declared. Reviewed-by: Alan Brady Signed-off-by: Jesse Brandeburg --- e1p v2: add back mistakenly deleted pm ops struct. --- drivers/net/ethernet/intel/igb/igb_main.c | 51 ++- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 4df8d4153aa5..fdca4901defa 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -106,8 +106,6 @@ static int igb_setup_all_rx_resources(struct igb_adapter *); static void igb_free_all_tx_resources(struct igb_adapter *); static void igb_free_all_rx_resources(struct igb_adapter *); static void igb_setup_mrqc(struct igb_adapter *); -static int igb_probe(struct pci_dev *, const struct pci_device_id *); -static void igb_remove(struct pci_dev *pdev); static void igb_init_queue_configuration(struct igb_adapter *adapter); static int igb_sw_init(struct igb_adapter *); int igb_open(struct net_device *); @@ -178,20 +176,6 @@ static int igb_vf_configure(struct igb_adapter *adapter, int vf); static int igb_disable_sriov(struct pci_dev *dev, bool reinit); #endif -static int igb_suspend(struct device *); -static int igb_resume(struct device *); -static int igb_runtime_suspend(struct device *dev); -static int igb_runtime_resume(struct device *dev); -static int igb_runtime_idle(struct device *dev); -#ifdef CONFIG_PM -static const struct dev_pm_ops igb_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(igb_suspend, igb_resume) - SET_RUNTIME_PM_OPS(igb_runtime_suspend, igb_runtime_resume, - igb_runtime_idle) -}; -#endif -static void igb_shutdown(struct pci_dev *); -static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs); #ifdef CONFIG_IGB_DCA static int igb_notify_dca(struct notifier_block *, unsigned long, void *); static struct notifier_block dca_notifier = { @@ -219,19 +203,6 @@ static const struct pci_error_handlers igb_err_handler = { static void igb_init_dmac(struct igb_adapter *adapter, u32 pba); -static struct pci_driver igb_driver = { - .name = igb_driver_name, - .id_table = igb_pci_tbl, - .probe= igb_probe, - .remove = igb_remove, -#ifdef CONFIG_PM - .driver.pm = &igb_pm_ops, -#endif - .shutdown = igb_shutdown, - .sriov_configure = igb_pci_sriov_configure, - .err_handler = &igb_err_handler -}; - MODULE_AUTHOR("Intel Corporation, "); MODULE_DESCRIPTION("Intel(R) Gigabit Ethernet Network Driver"); MODULE_LICENSE("GPL v2"); @@ -647,6 +618,8 @@ struct net_device *igb_get_hw_dev(struct e1000_hw *hw) return adapter->netdev; } +static struct pci_driver igb_driver; + /** * igb_init_module - Driver Registration Routine * @@ -10169,4 +10142,24 @@ static void igb_nfc_filter_restore(struct igb_adapter *adapter) spin_unlock(&adapter->nfc_lock); } + +#ifdef CONFIG_PM +static const struct dev_pm_ops igb_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(igb_suspend, igb_resume) + SET_RUNTIME_PM_OPS(igb_runtime_suspend, igb_runtime_resume, + igb_runtime_idle) +}; +#endif + +static struct pci_driver igb_driver = { + .name = igb_driver_name, + .id_table = igb_pci_tbl, + .probe= igb_probe, + .remove = igb_remove, + .driver.pm = &igb_pm_ops, + .shutdown = igb_shutdown, + .sriov_configure = igb_pci_sriov_configure, + .err_handler = &igb_err_handler +}; + /* igb_main.c */ -- 2.39.3
[Intel-wired-lan] [PATCH iwl-next v1 2/2] net: intel: implement modern PM ops declarations
Switch the Intel networking drivers to use the new power management ops declaration formats and macros, which allows us to drop __maybe_unused, as well as a bunch of ifdef checking CONFIG_PM. This is safe to do because the compiler drops the unused functions, verified by checking for any of the power management function symbols being present in System.map for a build without CONFIG_PM. If a driver has runtime PM, define the ops with pm_ptr(), and if the driver has Simple PM, use pm_sleep_ptr(), as well as the new versions of the macros for declaring the members of the pm_ops structs. Checked with network-enabled allnoconfig, allyesconfig, allmodconfig on x64_64. Reviewed-by: Alan Brady Signed-off-by: Jesse Brandeburg --- e1p-v2: dropped errant idpf change, updated after v2 1/2 updates to move the declation down for igb_pm_ops. --- drivers/net/ethernet/intel/e100.c | 8 +++ drivers/net/ethernet/intel/e1000/e1000_main.c | 14 +-- drivers/net/ethernet/intel/e1000e/netdev.c| 22 +++-- drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 10 drivers/net/ethernet/intel/i40e/i40e_main.c | 10 drivers/net/ethernet/intel/iavf/iavf_main.c | 8 +++ drivers/net/ethernet/intel/igb/igb_main.c | 24 --- drivers/net/ethernet/intel/igbvf/netdev.c | 6 ++--- drivers/net/ethernet/intel/igc/igc_main.c | 24 +++ drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 8 +++ .../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 8 +++ 11 files changed, 60 insertions(+), 82 deletions(-) diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c index 01f0f12035ca..5a9e8cf4b2ee 100644 --- a/drivers/net/ethernet/intel/e100.c +++ b/drivers/net/ethernet/intel/e100.c @@ -3037,7 +3037,7 @@ static int __e100_power_off(struct pci_dev *pdev, bool wake) return 0; } -static int __maybe_unused e100_suspend(struct device *dev_d) +static int e100_suspend(struct device *dev_d) { bool wake; @@ -3046,7 +3046,7 @@ static int __maybe_unused e100_suspend(struct device *dev_d) return 0; } -static int __maybe_unused e100_resume(struct device *dev_d) +static int e100_resume(struct device *dev_d) { struct net_device *netdev = dev_get_drvdata(dev_d); struct nic *nic = netdev_priv(netdev); @@ -3163,7 +3163,7 @@ static const struct pci_error_handlers e100_err_handler = { .resume = e100_io_resume, }; -static SIMPLE_DEV_PM_OPS(e100_pm_ops, e100_suspend, e100_resume); +static DEFINE_SIMPLE_DEV_PM_OPS(e100_pm_ops, e100_suspend, e100_resume); static struct pci_driver e100_driver = { .name = DRV_NAME, @@ -3172,7 +3172,7 @@ static struct pci_driver e100_driver = { .remove = e100_remove, /* Power Management hooks */ - .driver.pm =&e100_pm_ops, + .driver.pm =pm_sleep_ptr(&e100_pm_ops), .shutdown = e100_shutdown, .err_handler = &e100_err_handler, diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 1d1e93686af2..5b43f9b194fc 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -149,8 +149,8 @@ static int e1000_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid); static void e1000_restore_vlan(struct e1000_adapter *adapter); -static int __maybe_unused e1000_suspend(struct device *dev); -static int __maybe_unused e1000_resume(struct device *dev); +static int e1000_suspend(struct device *dev); +static int e1000_resume(struct device *dev); static void e1000_shutdown(struct pci_dev *pdev); #ifdef CONFIG_NET_POLL_CONTROLLER @@ -175,16 +175,14 @@ static const struct pci_error_handlers e1000_err_handler = { .resume = e1000_io_resume, }; -static SIMPLE_DEV_PM_OPS(e1000_pm_ops, e1000_suspend, e1000_resume); +static DEFINE_SIMPLE_DEV_PM_OPS(e1000_pm_ops, e1000_suspend, e1000_resume); static struct pci_driver e1000_driver = { .name = e1000_driver_name, .id_table = e1000_pci_tbl, .probe= e1000_probe, .remove = e1000_remove, - .driver = { - .pm = &e1000_pm_ops, - }, + .driver.pm = pm_sleep_ptr(&e1000_pm_ops), .shutdown = e1000_shutdown, .err_handler = &e1000_err_handler }; @@ -5135,7 +5133,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) return 0; } -static int __maybe_unused e1000_suspend(struct device *dev) +static int e1000_suspend(struct device *dev) { int retval; struct pci_dev *pdev = to_pci_dev(dev); @@ -5147,7 +5145,7 @@ static int __maybe_unused e1000_suspend(struct device *dev) return retval; } -static int __maybe_unused e1000_resume(struct device *dev) +static int e1000_resume(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev
[Intel-wired-lan] [PATCH iwl-next v1 1/1] igc: Refactor runtime power management flow
Following the corresponding discussion [1] and [2] refactor the 'igc_open' method and avoid taking the rtnl_lock() during the 'igc_resume' method. The rtnl_lock is held by the upper layer and could lead to the deadlock during resuming from a runtime power management flow. Notify the stack of the actual queue counts 'netif_set_real_num_*_queues' outside the '_igc_open' wrapper. This notification doesn't have to be called on each resume. Test: 1. Disconnect the ethernet cable 2. Enable the runtime power management via file system: echo auto > /sys/devices/pci\.../power/control 3. Check the device state (lspci -s -vvv | grep -i Status) Link: https://lore.kernel.org/netdev/20231206113934.8d7819857574.I2deb5804 ef1739a2af307283d320ef7d82456494@changeid/#r [1] Link: https://lore.kernel.org/netdev/20211125074949.5f897431@kicinski-fedo ra-pc1c0hjn.dhcp.thefacebook.com/t/ [2] Signed-off-by: Sasha Neftin --- drivers/net/ethernet/intel/igc/igc_main.c | 32 +++ 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index ba8d3fe186ae..7bd69a4d1ef0 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5943,15 +5943,6 @@ static int __igc_open(struct net_device *netdev, bool resuming) if (err) goto err_req_irq; - /* Notify the stack of the actual queue counts. */ - err = netif_set_real_num_tx_queues(netdev, adapter->num_tx_queues); - if (err) - goto err_set_queues; - - err = netif_set_real_num_rx_queues(netdev, adapter->num_rx_queues); - if (err) - goto err_set_queues; - clear_bit(__IGC_DOWN, &adapter->state); for (i = 0; i < adapter->num_q_vectors; i++) @@ -5972,8 +5963,6 @@ static int __igc_open(struct net_device *netdev, bool resuming) return IGC_SUCCESS; -err_set_queues: - igc_free_irq(adapter); err_req_irq: igc_release_hw_control(adapter); igc_power_down_phy_copper_base(&adapter->hw); @@ -5990,6 +5979,17 @@ static int __igc_open(struct net_device *netdev, bool resuming) int igc_open(struct net_device *netdev) { + struct igc_adapter *adapter = netdev_priv(netdev); + int err; + + /* Notify the stack of the actual queue counts. */ + err = netif_set_real_num_queues(netdev, adapter->num_tx_queues, + adapter->num_rx_queues); + if (err) { + netdev_err(netdev, "error setting real queue count\n"); + return err; + } + return __igc_open(netdev, false); } @@ -7191,13 +7191,11 @@ static int __maybe_unused igc_resume(struct device *dev) wr32(IGC_WUS, ~0); - rtnl_lock(); - if (!err && netif_running(netdev)) + if (netif_running(netdev)) { err = __igc_open(netdev, true); - - if (!err) - netif_device_attach(netdev); - rtnl_unlock(); + if (!err) + netif_device_attach(netdev); + } return err; } -- 2.34.1