To check the theory from comment #13, I built kernel from mainline at tag v5.6-rc5. Out of the box, it behaves the same way as all recent kernels: suspend works only the first time. I could not revert commit f15bb6d (there were later changes), instead I commented out the calls to e1000e_s0ix_entry_flow() and e1000e_s0ix_exit_flow()
To check the theory from comment #13, I built kernel from mainline at tag v5.6-rc5. Out of the box, it behaves the same way as all recent kernels: suspend works only the first time. I could not revert commit f15bb6d (there were later changes), instead I commented out the calls to e1000e_ s0ix_entry_ flow() and e1000e_ s0ix_exit_ flow()
diff --git a/drivers/ net/ethernet/ intel/e1000e/ netdev. c b/drivers/ net/ethernet/ intel/e1000e/ netdev. c .53f8ed97d282 100644 net/ethernet/ intel/e1000e/ netdev. c net/ethernet/ intel/e1000e/ netdev. c pm_suspend( struct device *dev) pm_thaw( dev);
index db4ea58bac82.
--- a/drivers/
+++ b/drivers/
@@ -6860,8 +6860,8 @@ static int e1000e_
e1000e_
/* Introduce S0ix implementation */ s0ix_entry_ flow(adapter) ; s0ix_entry_ flow(adapter) ;*/
- if (hw->mac.type >= e1000_pch_cnp)
- e1000e_
+ /*if (hw->mac.type >= e1000_pch_cnp)
+ e1000e_
return rc; pm_resume( struct device *dev)
}
@@ -6875,8 +6875,8 @@ static int e1000e_
int rc;
/* Introduce S0ix implementation */ s0ix_exit_ flow(adapter) ; s0ix_exit_ flow(adapter) ;*/
- if (hw->mac.type >= e1000_pch_cnp)
- e1000e_
+ /* if (hw->mac.type >= e1000_pch_cnp)
+ e1000e_
rc = __e1000_ resume( pdev);
if (rc)
And voila, suspend works normally every time now!
Apparently S0ix implementation is indeed the culprit.