| From foo@baz Sun Jan 10 11:18:59 AM CET 2021 |
| From: Mario Limonciello <mario.limonciello@dell.com> |
| Date: Mon, 14 Dec 2020 13:29:33 -0600 |
| Subject: e1000e: bump up timeout to wait when ME un-configures ULP mode |
| |
| From: Mario Limonciello <mario.limonciello@dell.com> |
| |
| [ Upstream commit 3cf31b1a9effd859bb3d6ff9f8b5b0d5e6cac952 ] |
| |
| Per guidance from Intel ethernet architecture team, it may take |
| up to 1 second for unconfiguring ULP mode. |
| |
| However in practice this seems to be taking up to 2 seconds on |
| some Lenovo machines. Detect scenarios that take more than 1 second |
| but less than 2.5 seconds and emit a warning on resume for those |
| scenarios. |
| |
| Suggested-by: Aaron Ma <aaron.ma@canonical.com> |
| Suggested-by: Sasha Netfin <sasha.neftin@intel.com> |
| Suggested-by: Hans de Goede <hdegoede@redhat.com> |
| CC: Mark Pearson <markpearson@lenovo.com> |
| Fixes: f15bb6dde738cc8fa0 ("e1000e: Add support for S0ix") |
| BugLink: https://bugs.launchpad.net/bugs/1865570 |
| Link: https://patchwork.ozlabs.org/project/intel-wired-lan/patch/20200323191639.48826-1-aaron.ma@canonical.com/ |
| Link: https://lkml.org/lkml/2020/12/13/15 |
| Link: https://lkml.org/lkml/2020/12/14/708 |
| Signed-off-by: Mario Limonciello <mario.limonciello@dell.com> |
| Reviewed-by: Hans de Goede <hdegoede@redhat.com> |
| Tested-by: Yijun Shen <Yijun.shen@dell.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/intel/e1000e/ich8lan.c | 17 ++++++++++++++--- |
| 1 file changed, 14 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c |
| +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c |
| @@ -1240,6 +1240,9 @@ static s32 e1000_disable_ulp_lpt_lp(stru |
| return 0; |
| |
| if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID) { |
| + struct e1000_adapter *adapter = hw->adapter; |
| + bool firmware_bug = false; |
| + |
| if (force) { |
| /* Request ME un-configure ULP mode in the PHY */ |
| mac_reg = er32(H2ME); |
| @@ -1248,16 +1251,24 @@ static s32 e1000_disable_ulp_lpt_lp(stru |
| ew32(H2ME, mac_reg); |
| } |
| |
| - /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */ |
| + /* Poll up to 2.5 seconds for ME to clear ULP_CFG_DONE. |
| + * If this takes more than 1 second, show a warning indicating a |
| + * firmware bug |
| + */ |
| while (er32(FWSM) & E1000_FWSM_ULP_CFG_DONE) { |
| - if (i++ == 30) { |
| + if (i++ == 250) { |
| ret_val = -E1000_ERR_PHY; |
| goto out; |
| } |
| + if (i > 100 && !firmware_bug) |
| + firmware_bug = true; |
| |
| usleep_range(10000, 11000); |
| } |
| - e_dbg("ULP_CONFIG_DONE cleared after %dmsec\n", i * 10); |
| + if (firmware_bug) |
| + e_warn("ULP_CONFIG_DONE took %dmsec. This is a firmware bug\n", i * 10); |
| + else |
| + e_dbg("ULP_CONFIG_DONE cleared after %dmsec\n", i * 10); |
| |
| if (force) { |
| mac_reg = er32(H2ME); |