]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Jun 2024 08:35:36 +0000 (10:35 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Jun 2024 08:35:36 +0000 (10:35 +0200)
added patches:
e1000e-move-force-smbus-near-the-end-of-enable_ulp-function.patch

queue-6.6/e1000e-move-force-smbus-near-the-end-of-enable_ulp-function.patch [new file with mode: 0644]
queue-6.6/series

diff --git a/queue-6.6/e1000e-move-force-smbus-near-the-end-of-enable_ulp-function.patch b/queue-6.6/e1000e-move-force-smbus-near-the-end-of-enable_ulp-function.patch
new file mode 100644 (file)
index 0000000..b58ce1b
--- /dev/null
@@ -0,0 +1,120 @@
+From bfd546a552e140b0a4c8a21527c39d6d21addb28 Mon Sep 17 00:00:00 2001
+From: Hui Wang <hui.wang@canonical.com>
+Date: Tue, 28 May 2024 15:06:04 -0700
+Subject: e1000e: move force SMBUS near the end of enable_ulp function
+
+From: Hui Wang <hui.wang@canonical.com>
+
+commit bfd546a552e140b0a4c8a21527c39d6d21addb28 upstream.
+
+The commit 861e8086029e ("e1000e: move force SMBUS from enable ulp
+function to avoid PHY loss issue") introduces a regression on
+PCH_MTP_I219_LM18 (PCIID: 0x8086550A). Without the referred commit, the
+ethernet works well after suspend and resume, but after applying the
+commit, the ethernet couldn't work anymore after the resume and the
+dmesg shows that the NIC link changes to 10Mbps (1000Mbps originally):
+
+    [   43.305084] e1000e 0000:00:1f.6 enp0s31f6: NIC Link is Up 10 Mbps Full Duplex, Flow Control: Rx/Tx
+
+Without the commit, the force SMBUS code will not be executed if
+"return 0" or "goto out" is executed in the enable_ulp(), and in my
+case, the "goto out" is executed since FWSM_FW_VALID is set. But after
+applying the commit, the force SMBUS code will be ran unconditionally.
+
+Here move the force SMBUS code back to enable_ulp() and put it
+immediately ahead of hw->phy.ops.release(hw), this could allow the
+longest settling time as possible for interface in this function and
+doesn't change the original code logic.
+
+The issue was found on a Lenovo laptop with the ethernet hw as below:
+00:1f.6 Ethernet controller [0200]: Intel Corporation Device [8086:550a]
+(rev 20).
+
+And this patch is verified (cable plug and unplug, system suspend
+and resume) on Lenovo laptops with ethernet hw: [8086:550a],
+[8086:550b], [8086:15bb], [8086:15be], [8086:1a1f], [8086:1a1c] and
+[8086:0dc7].
+
+Fixes: 861e8086029e ("e1000e: move force SMBUS from enable ulp function to avoid PHY loss issue")
+Signed-off-by: Hui Wang <hui.wang@canonical.com>
+Acked-by: Vitaly Lifshits <vitaly.lifshits@intel.com>
+Tested-by: Naama Meir <naamax.meir@linux.intel.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Tested-by: Zhang Rui <rui.zhang@intel.com>
+Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
+Link: https://lore.kernel.org/r/20240528-net-2024-05-28-intel-net-fixes-v1-1-dc8593d2bbc6@intel.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Cc: Ismael Luceno <ismael@iodev.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/intel/e1000e/ich8lan.c |   22 ++++++++++++++++++++++
+ drivers/net/ethernet/intel/e1000e/netdev.c  |   18 ------------------
+ 2 files changed, 22 insertions(+), 18 deletions(-)
+
+--- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
++++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
+@@ -1225,6 +1225,28 @@ s32 e1000_enable_ulp_lpt_lp(struct e1000
+       }
+ release:
++      /* Switching PHY interface always returns MDI error
++       * so disable retry mechanism to avoid wasting time
++       */
++      e1000e_disable_phy_retry(hw);
++
++      /* Force SMBus mode in PHY */
++      ret_val = e1000_read_phy_reg_hv_locked(hw, CV_SMB_CTRL, &phy_reg);
++      if (ret_val) {
++              e1000e_enable_phy_retry(hw);
++              hw->phy.ops.release(hw);
++              goto out;
++      }
++      phy_reg |= CV_SMB_CTRL_FORCE_SMBUS;
++      e1000_write_phy_reg_hv_locked(hw, CV_SMB_CTRL, phy_reg);
++
++      e1000e_enable_phy_retry(hw);
++
++      /* Force SMBus mode in MAC */
++      mac_reg = er32(CTRL_EXT);
++      mac_reg |= E1000_CTRL_EXT_FORCE_SMBUS;
++      ew32(CTRL_EXT, mac_reg);
++
+       hw->phy.ops.release(hw);
+ out:
+       if (ret_val)
+--- a/drivers/net/ethernet/intel/e1000e/netdev.c
++++ b/drivers/net/ethernet/intel/e1000e/netdev.c
+@@ -6623,7 +6623,6 @@ static int __e1000_shutdown(struct pci_d
+       struct e1000_hw *hw = &adapter->hw;
+       u32 ctrl, ctrl_ext, rctl, status, wufc;
+       int retval = 0;
+-      u16 smb_ctrl;
+       /* Runtime suspend should only enable wakeup for link changes */
+       if (runtime)
+@@ -6697,23 +6696,6 @@ static int __e1000_shutdown(struct pci_d
+                       if (retval)
+                               return retval;
+               }
+-
+-              /* Force SMBUS to allow WOL */
+-              /* Switching PHY interface always returns MDI error
+-               * so disable retry mechanism to avoid wasting time
+-               */
+-              e1000e_disable_phy_retry(hw);
+-
+-              e1e_rphy(hw, CV_SMB_CTRL, &smb_ctrl);
+-              smb_ctrl |= CV_SMB_CTRL_FORCE_SMBUS;
+-              e1e_wphy(hw, CV_SMB_CTRL, smb_ctrl);
+-
+-              e1000e_enable_phy_retry(hw);
+-
+-              /* Force SMBus mode in MAC */
+-              ctrl_ext = er32(CTRL_EXT);
+-              ctrl_ext |= E1000_CTRL_EXT_FORCE_SMBUS;
+-              ew32(CTRL_EXT, ctrl_ext);
+       }
+       /* Ensure that the appropriate bits are set in LPI_CTRL
index 48bb09cd6e949e585758a48381db04c2d39864b2..1df82a242acd053048d858f2f0387f536f778ed4 100644 (file)
@@ -101,3 +101,4 @@ kdb-fix-console-handling-when-editing-and-tab-completing-commands.patch
 kdb-merge-identical-case-statements-in-kdb_read.patch
 kdb-use-format-specifiers-rather-than-memset-for-padding-in-kdb_read.patch
 net-fix-__dst_negative_advice-race.patch
+e1000e-move-force-smbus-near-the-end-of-enable_ulp-function.patch