]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
phy: qcom-sgmii-eth: use PHY interface mode for SerDes settings
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 3 Mar 2026 15:53:50 +0000 (15:53 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 6 Mar 2026 02:43:06 +0000 (18:43 -0800)
As established in the previous commit, using SPEED_1000 and SPEED_2500
does not make sense for a SerDes due to the PCS encoding that is used
over the SerDes link, which inflates the data rate at the SerDes. Thus,
the use of these constants in a SerDes driver is incorrect.

Since qcom-sgmii-eth no longer implements phy_set_speed(), but instead
uses the PHY interface mode passed via the .set_mode() method, convert
the driver to use the PHY interface mode internally to decide whether
to configure the SerDes for 1.25Gbps or 3.125Gbps mode.

Tested-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com>
Acked-by: Vinod Koul <vkoul@kernel.org>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1vxS4E-0000000BQXg-46dJ@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/phy/qualcomm/phy-qcom-sgmii-eth.c

index dcfdb7d0e8eaaec27a79f46d6b9901217ac6a1b7..58ff156012065c8a7d443c788f608b8599a8efda 100644 (file)
@@ -29,7 +29,7 @@
 struct qcom_dwmac_sgmii_phy_data {
        struct regmap *regmap;
        struct clk *refclk;
-       int speed;
+       phy_interface_t interface;
 };
 
 static void qcom_dwmac_sgmii_phy_init_1g(struct regmap *regmap)
@@ -223,15 +223,18 @@ static int qcom_dwmac_sgmii_phy_calibrate(struct phy *phy)
        struct qcom_dwmac_sgmii_phy_data *data = phy_get_drvdata(phy);
        struct device *dev = phy->dev.parent;
 
-       switch (data->speed) {
-       case SPEED_10:
-       case SPEED_100:
-       case SPEED_1000:
+       switch (data->interface) {
+       case PHY_INTERFACE_MODE_SGMII:
+       case PHY_INTERFACE_MODE_1000BASEX:
+               /* 1.25Gbps mode */
                qcom_dwmac_sgmii_phy_init_1g(data->regmap);
                break;
-       case SPEED_2500:
+       case PHY_INTERFACE_MODE_2500BASEX:
+               /* 3.125Gbps mode */
                qcom_dwmac_sgmii_phy_init_2p5g(data->regmap);
                break;
+       default:
+               return -EINVAL;
        }
 
        if (qcom_dwmac_sgmii_phy_poll_status(data->regmap,
@@ -287,17 +290,15 @@ static int qcom_dwmac_sgmii_phy_power_off(struct phy *phy)
        return 0;
 }
 
-static int qcom_dwmac_sgmii_phy_speed(enum phy_mode mode, int submode)
+static int qcom_dwmac_sgmii_phy_interface(enum phy_mode mode, int submode)
 {
        if (mode != PHY_MODE_ETHERNET)
                return -EINVAL;
 
        if (submode == PHY_INTERFACE_MODE_SGMII ||
-           submode == PHY_INTERFACE_MODE_1000BASEX)
-               return SPEED_1000;
-
-       if (submode == PHY_INTERFACE_MODE_2500BASEX)
-               return SPEED_2500;
+           submode == PHY_INTERFACE_MODE_1000BASEX ||
+           submode == PHY_INTERFACE_MODE_2500BASEX)
+               return submode;
 
        return -EINVAL;
 }
@@ -306,14 +307,14 @@ static int qcom_dwmac_sgmii_phy_set_mode(struct phy *phy, enum phy_mode mode,
                                         int submode)
 {
        struct qcom_dwmac_sgmii_phy_data *data = phy_get_drvdata(phy);
-       int speed;
+       int interface;
 
-       speed = qcom_dwmac_sgmii_phy_speed(mode, submode);
-       if (speed < 0)
-               return speed;
+       interface = qcom_dwmac_sgmii_phy_interface(mode, submode);
+       if (interface < 0)
+               return interface;
 
-       if (speed != data->speed)
-               data->speed = speed;
+       if (interface != data->interface)
+               data->interface = interface;
 
        return qcom_dwmac_sgmii_phy_calibrate(phy);
 }
@@ -322,7 +323,7 @@ static int qcom_dwmac_sgmii_phy_validate(struct phy *phy, enum phy_mode mode,
                                         int submode,
                                         union phy_configure_opts *opts)
 {
-       int ret = qcom_dwmac_sgmii_phy_speed(mode, submode);
+       int ret = qcom_dwmac_sgmii_phy_interface(mode, submode);
 
        return ret < 0 ? ret : 0;
 }
@@ -356,7 +357,7 @@ static int qcom_dwmac_sgmii_phy_probe(struct platform_device *pdev)
        if (!data)
                return -ENOMEM;
 
-       data->speed = SPEED_10;
+       data->interface = PHY_INTERFACE_MODE_SGMII;
 
        base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(base))