]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
kernel: rtl8261n: Add support for Serdes RX swap 20465/head
authorRichard Huynh <voxlympha@gmail.com>
Sun, 19 Oct 2025 10:52:59 +0000 (21:52 +1100)
committerChristian Marangi <ansuelsmth@gmail.com>
Wed, 29 Oct 2025 18:37:18 +0000 (19:37 +0100)
Datasheet claims this register bit is supposed to be set by default,
however it was found in practice to not be, and OEM drivers would set
this bit at the same time.

Signed-off-by: Richard Huynh <voxlympha@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/20465
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
target/linux/generic/files/drivers/net/phy/rtl8261n/rtk_phy.c
target/linux/generic/files/drivers/net/phy/rtl8261n/rtk_phylib.h

index faa057f0297751d6526301e8b5e2026b53846ee7..a1eb2c16149cd65b7bf2438a6931ca713c2ac8f6 100644 (file)
@@ -61,6 +61,7 @@ static int rtl826xb_probe(struct phy_device *phydev)
 
     priv->phytype = (phydev->drv->phy_id == REALTEK_PHY_ID_RTL8261N) ? (RTK_PHYLIB_RTL8261N) : (RTK_PHYLIB_RTL8264B);
     priv->isBasePort = (phydev->drv->phy_id == REALTEK_PHY_ID_RTL8261N) ? (1) : (((phydev->mdio.addr % 4) == 0) ? (1) : (0));
+    priv->pnswap_rx = device_property_read_bool(dev, "realtek,pnswap-rx");
     priv->pnswap_tx = device_property_read_bool(dev, "realtek,pnswap-tx");
     phydev->priv = priv;
 
@@ -125,6 +126,11 @@ static int rtkphy_config_init(struct phy_device *phydev)
             }
           #endif
 
+            if (priv->pnswap_rx)
+                phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
+                                 REALTEK_SERDES_GLOBAL_CFG,
+                                 REALTEK_HSI_INV);
+
             if (priv->pnswap_tx)
                 phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
                                  REALTEK_SERDES_GLOBAL_CFG,
index c94e9cb9661873fcadb476c85003f521c10c95a9..c1253b1ec9757bb52ed5c5d41af032bc14c85e84 100644 (file)
@@ -51,6 +51,7 @@ struct rtk_phy_priv {
     uint8 isBasePort;
     rt_phy_patch_db_t *patch;
 
+    bool pnswap_rx;
     bool pnswap_tx;
 };