]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: phy: micrel: lan8814: Enable in-band auto-negotiation
authorHoratiu Vultur <horatiu.vultur@microchip.com>
Fri, 14 Nov 2025 08:42:24 +0000 (09:42 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 18 Nov 2025 14:17:50 +0000 (15:17 +0100)
The lan8814 supports two interfaces towards the host (QSGMII and QUSGMII).
Currently the lan8814 disables the auto-negotiation towards the host
side. So, extend this to allow to configure to use in-band
auto-negotiation.
I have tested this only with the QSGMII interface.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20251114084224.3268928-1-horatiu.vultur@microchip.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/phy/micrel.c

index 57ea947369fedef8a06fe22b1c3c0367b6d41363..5d90ccc20df75c394ff0f850ee1b1dd67b356fc4 100644 (file)
@@ -2988,6 +2988,8 @@ static int ksz886x_cable_test_get_status(struct phy_device *phydev,
 #define LAN_EXT_PAGE_ACCESS_ADDRESS_DATA               0x17
 #define LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC               0x4000
 
+#define LAN8814_QSGMII_TX_CONFIG                       0x35
+#define LAN8814_QSGMII_TX_CONFIG_QSGMII                        BIT(3)
 #define LAN8814_QSGMII_SOFT_RESET                      0x43
 #define LAN8814_QSGMII_SOFT_RESET_BIT                  BIT(0)
 #define LAN8814_QSGMII_PCS1G_ANEG_CONFIG               0x13
@@ -4501,12 +4503,24 @@ static void lan8814_setup_led(struct phy_device *phydev, int val)
 static int lan8814_config_init(struct phy_device *phydev)
 {
        struct kszphy_priv *lan8814 = phydev->priv;
+       int ret;
 
-       /* Disable ANEG with QSGMII PCS Host side */
-       lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS,
-                              LAN8814_QSGMII_PCS1G_ANEG_CONFIG,
-                              LAN8814_QSGMII_PCS1G_ANEG_CONFIG_ANEG_ENA,
-                              0);
+       /* Based on the interface type select how the advertise ability is
+        * encoded, to set as SGMII or as USGMII.
+        */
+       if (phydev->interface == PHY_INTERFACE_MODE_QSGMII)
+               ret = lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
+                                            LAN8814_QSGMII_TX_CONFIG,
+                                            LAN8814_QSGMII_TX_CONFIG_QSGMII,
+                                            LAN8814_QSGMII_TX_CONFIG_QSGMII);
+       else
+               ret = lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS,
+                                            LAN8814_QSGMII_TX_CONFIG,
+                                            LAN8814_QSGMII_TX_CONFIG_QSGMII,
+                                            0);
+
+       if (ret < 0)
+               return ret;
 
        /* MDI-X setting for swap A,B transmit */
        lanphy_modify_page_reg(phydev, LAN8814_PAGE_PCS_DIGITAL, LAN8814_ALIGN_SWAP,
@@ -6640,6 +6654,8 @@ static struct phy_driver ksphy_driver[] = {
        .suspend        = genphy_suspend,
        .resume         = kszphy_resume,
        .config_intr    = lan8814_config_intr,
+       .inband_caps    = lan8842_inband_caps,
+       .config_inband  = lan8842_config_inband,
        .handle_interrupt = lan8814_handle_interrupt,
        .cable_test_start       = lan8814_cable_test_start,
        .cable_test_get_status  = ksz886x_cable_test_get_status,