]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: stmmac: qcom-ethqos: convert to use phy_set_mode_ext()
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 3 Mar 2026 15:53:40 +0000 (15:53 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 6 Mar 2026 02:43:06 +0000 (18:43 -0800)
qcom-sgmii-eth now accepts the phy_set_mode*() calls to configure the
SerDes, taking a PHY interface mode rather than a speed. This allows
the elimination of the interface mode to speed conversion in
ethqos_mac_finish_serdes().

Tested-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com>
Link: https://patch.msgid.link/E1vxS44-0000000BQXU-38lG@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c

index 57cbe800f6521ce5ed7a3947842af0fe715e81c2..8913f6f02b9e8da3cb6c627eac533dee90466a6e 100644 (file)
@@ -105,7 +105,7 @@ struct qcom_ethqos {
 
        struct clk *link_clk;
        struct phy *serdes_phy;
-       int serdes_speed;
+       phy_interface_t serdes_mode;
        phy_interface_t phy_mode;
 
        const struct ethqos_emac_por *rgmii_por;
@@ -653,7 +653,8 @@ static int qcom_ethqos_serdes_powerup(struct net_device *ndev, void *priv)
                return ret;
        }
 
-       ret = phy_set_speed(ethqos->serdes_phy, ethqos->serdes_speed);
+       ret = phy_set_mode_ext(ethqos->serdes_phy, PHY_MODE_ETHERNET,
+                              ethqos->serdes_mode);
        if (ret) {
                phy_power_off(ethqos->serdes_phy);
                phy_exit(ethqos->serdes_phy);
@@ -675,20 +676,16 @@ static int ethqos_mac_finish_serdes(struct net_device *ndev, void *priv,
                                    phy_interface_t interface)
 {
        struct qcom_ethqos *ethqos = priv;
-       int speed, ret = 0;
+       int ret = 0;
 
        qcom_ethqos_set_sgmii_loopback(ethqos, false);
 
-       speed = SPEED_UNKNOWN;
-       if (interface == PHY_INTERFACE_MODE_SGMII)
-               speed = SPEED_1000;
-       else if (interface == PHY_INTERFACE_MODE_2500BASEX)
-               speed = SPEED_2500;
-
-       if (speed != SPEED_UNKNOWN && speed != ethqos->serdes_speed) {
-               ret = phy_set_speed(ethqos->serdes_phy, speed);
+       if (interface == PHY_INTERFACE_MODE_SGMII ||
+           interface == PHY_INTERFACE_MODE_2500BASEX) {
+               ret = phy_set_mode_ext(ethqos->serdes_phy, PHY_MODE_ETHERNET,
+                                      interface);
                if (ret == 0)
-                       ethqos->serdes_speed = speed;
+                       ethqos->serdes_mode = interface;
        }
 
        return ret;
@@ -819,7 +816,6 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
                return dev_err_probe(dev, PTR_ERR(ethqos->serdes_phy),
                                     "Failed to get serdes phy\n");
 
-       ethqos->serdes_speed = SPEED_1000;
        ethqos_set_clk_tx_rate(ethqos, NULL, plat_dat->phy_interface,
                               SPEED_1000);
 
@@ -843,6 +839,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
                plat_dat->host_dma_width = data->dma_addr_width;
 
        if (ethqos->serdes_phy) {
+               ethqos->serdes_mode = PHY_INTERFACE_MODE_SGMII;
                plat_dat->serdes_powerup = qcom_ethqos_serdes_powerup;
                plat_dat->serdes_powerdown  = qcom_ethqos_serdes_powerdown;
        }