Re: [Intel-wired-lan] [PATCH] igc: fix netdev not re-attached after resume if interface is down
"Loktionov, Aleksandr" <[email protected]> Thu, 23 Jul 2026 09:18:50 +0000
| Newsgroups | org.osuosl.intel-wired-lan,org.kernel.vger.netdev,org.kernel.vger.stable |
|---|---|
| Message-ID | <IA3PR11MB8986D164F76EFE059EF2EA23E5C02@IA3PR11MB8986.namprd11.prod.outlook.com> |
> -----Original Message----- > From: Intel-wired-lan <[email protected]> On Behalf > Of Philipp David via Intel-wired-lan > Sent: Friday, July 17, 2026 11:22 AM > To: [email protected]; [email protected] > Cc: Nguyen, Anthony L <[email protected]>; Kitszel, > Przemyslaw <[email protected]>; Andrew Lunn > <[email protected]>; David S . Miller <[email protected]>; Eric > Dumazet <[email protected]>; Jakub Kicinski <[email protected]>; Paolo > Abeni <[email protected]>; Philipp David <[email protected]>; > [email protected] > Subject: [Intel-wired-lan] [PATCH] igc: fix netdev not re-attached > after resume if interface is down > > __igc_resume() calls netif_device_attach() only inside the > netif_running() branch, so an interface that was down during suspend > is never re-attached on resume. It then stays in the not-present state > that __igc_shutdown() set via netif_device_detach(): ethtool reports > ENODEV and every attempt to bring the interface up fails the > netif_device_present() check in __dev_open() with -ENODEV, silently, > since __igc_resume() returns 0. Only reloading the driver recovers the > device. > > This is easy to hit in practice because NetworkManager brings managed > interfaces down before sleep unless Wake-on-LAN is configured, making > the adapter unusable after every suspend/resume cycle with WoL > disabled. > > Re-attach the netdev on every successful resume, as igb and e1000e do. > > Fixes: 6f31d6b643a3 ("igc: Refactor runtime power management flow") > Cc: [email protected] > Signed-off-by: Philipp David <[email protected]> > --- > drivers/net/ethernet/intel/igc/igc_main.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/intel/igc/igc_main.c > b/drivers/net/ethernet/intel/igc/igc_main.c > index 2c9e2dfd8499..e777c2df0b73 100644 > --- a/drivers/net/ethernet/intel/igc/igc_main.c > +++ b/drivers/net/ethernet/intel/igc/igc_main.c > @@ -7586,11 +7586,13 @@ static int __igc_resume(struct device *dev, > bool rpm) > err = __igc_open(netdev, true); > if (!rpm) > rtnl_unlock(); > - if (!err) > - netif_device_attach(netdev); > + if (err) > + return err; > } > > - return err; > + netif_device_attach(netdev); > + > + return 0; > } > > static int igc_resume(struct device *dev) > -- > 2.54.0 Reviewed-by: Aleksandr Loktionov <[email protected]>