]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: lan743x: fix SGMII detection on PCI1xxxx B0+ during warm reset
authorThangaraj Samynathan <thangaraj.s@microchip.com>
Wed, 18 Mar 2026 06:32:28 +0000 (12:02 +0530)
committerJakub Kicinski <kuba@kernel.org>
Sat, 21 Mar 2026 01:50:23 +0000 (18:50 -0700)
A warm reset on boards using an EEPROM-only strap configuration (where
no MAC address is set in the image) can cause the driver to incorrectly
revert to RGMII mode. This occurs because the ENET_CONFIG_LOAD_STARTED
bit may not persist or behave as expected.

Update pci11x1x_strap_get_status() to use revision-specific validation:

- For PCI11x1x A0: Continue using the legacy check (config load started
  or reset protection) to validate the SGMII strap.
- For PCI11x1x B0 and later: Use the newly available
  STRAP_READ_USE_SGMII_EN_ bit in the upper strap register to validate
  the lower SGMII_EN bit.

This ensures the SGMII interface is correctly identified even after a
warm reboot.

Signed-off-by: Thangaraj Samynathan <thangaraj.s@microchip.com>
Link: https://patch.msgid.link/20260318063228.17110-1-thangaraj.s@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/microchip/lan743x_main.c
drivers/net/ethernet/microchip/lan743x_main.h

index a3845edf0e48fa725e59347f00295423696fdae6..ff48012c8046bc087bc46d5333094e9fbfa4c047 100644 (file)
 
 #define RFE_RD_FIFO_TH_3_DWORDS        0x3
 
+static bool pci11x1x_is_a0(struct lan743x_adapter *adapter)
+{
+       u32 dev_rev = adapter->csr.id_rev & ID_REV_CHIP_REV_MASK_;
+       return dev_rev == ID_REV_CHIP_REV_PCI11X1X_A0_;
+}
+
 static void pci11x1x_strap_get_status(struct lan743x_adapter *adapter)
 {
        u32 chip_rev;
@@ -47,10 +53,11 @@ static void pci11x1x_strap_get_status(struct lan743x_adapter *adapter)
        cfg_load = lan743x_csr_read(adapter, ETH_SYS_CONFIG_LOAD_STARTED_REG);
        lan743x_hs_syslock_release(adapter);
        hw_cfg = lan743x_csr_read(adapter, HW_CFG);
-
-       if (cfg_load & GEN_SYS_LOAD_STARTED_REG_ETH_ ||
-           hw_cfg & HW_CFG_RST_PROTECT_) {
-               strap = lan743x_csr_read(adapter, STRAP_READ);
+       strap = lan743x_csr_read(adapter, STRAP_READ);
+       if ((pci11x1x_is_a0(adapter) &&
+            (cfg_load & GEN_SYS_LOAD_STARTED_REG_ETH_ ||
+             hw_cfg & HW_CFG_RST_PROTECT_)) ||
+           (strap & STRAP_READ_USE_SGMII_EN_)) {
                if (strap & STRAP_READ_SGMII_EN_)
                        adapter->is_sgmii_en = true;
                else
index 02a28b7091630d21b78e1494254593253f63f057..160d94a7cee66a45affadcdf1d58a445e3baaea4 100644 (file)
@@ -27,6 +27,7 @@
 #define ID_REV_CHIP_REV_MASK_          (0x0000FFFF)
 #define ID_REV_CHIP_REV_A0_            (0x00000000)
 #define ID_REV_CHIP_REV_B0_            (0x00000010)
+#define ID_REV_CHIP_REV_PCI11X1X_A0_   (0x000000A0)
 #define ID_REV_CHIP_REV_PCI11X1X_B0_   (0x000000B0)
 
 #define FPGA_REV                       (0x04)