Message ID | 20220512023937.276004-2-acelan.kao@canonical.com |
---|---|
State | New |
Headers | show |
Series | e1000e report hardware changed | expand |
On 12.05.22 04:39, AceLan Kao wrote: > From: Sasha Neftin <sasha.neftin@intel.com> > > BugLink: https://bugs.launchpad.net/bugs/1973104 > > On corporate (CSME) ADL systems, the Ethernet Controller may stop working > ("HW unit hang") after exiting from the s0ix state. The reason is that > CSME misses the message sent by the host. Enabling the dynamic GPT clock > solves this problem. This clock is cleared upon HW initialization. > > Fixes: 3e55d231716e ("e1000e: Add handshake with the CSME to support S0ix") > Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=214821 > Reviewed-by: Dima Ruinskiy <dima.ruinskiy@intel.com> > Signed-off-by: Sasha Neftin <sasha.neftin@intel.com> > (cherry picked from commit https://patchwork.ozlabs.org/project/intel-wired-lan/patch/20220508070905.1878172-1-sasha.neftin@intel.com/) > Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com> > --- It has been a long time since this was submitted and still there is no change with this subject on linux-next. There are 2 follow-ups to the support of S0ix upstream (and also in jammy) 1866aa0d0d64 e1000e: Fix possible HW unit hang after an s0ix exit cad014b7b5a6 e1000e: Handshake with CSME starts from ADL platforms If jammy still needs some fix, then it should be worked to land upstream. -Stefan > drivers/net/ethernet/intel/e1000e/netdev.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c > index 4dfa0ef592cf..642f86a1c7c8 100644 > --- a/drivers/net/ethernet/intel/e1000e/netdev.c > +++ b/drivers/net/ethernet/intel/e1000e/netdev.c > @@ -6492,6 +6492,10 @@ static void e1000e_s0ix_exit_flow(struct e1000_adapter *adapter) > > if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID && > hw->mac.type >= e1000_pch_adp) { > + /* Keep the GPT clock enabled for CSME */ > + mac_data = er32(FEXTNVM); > + mac_data |= BIT(3); > + ew32(FEXTNVM, mac_data); > /* Request ME unconfigure the device from S0ix */ > mac_data = er32(H2ME); > mac_data &= ~E1000_H2ME_START_DPG;
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 4dfa0ef592cf..642f86a1c7c8 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -6492,6 +6492,10 @@ static void e1000e_s0ix_exit_flow(struct e1000_adapter *adapter) if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID && hw->mac.type >= e1000_pch_adp) { + /* Keep the GPT clock enabled for CSME */ + mac_data = er32(FEXTNVM); + mac_data |= BIT(3); + ew32(FEXTNVM, mac_data); /* Request ME unconfigure the device from S0ix */ mac_data = er32(H2ME); mac_data &= ~E1000_H2ME_START_DPG;