]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: dsa: mt7530: error out on failed reads in MT7531 PHY polling
authorDaniel Golle <daniel@makrotopia.org>
Tue, 28 Jul 2026 04:52:29 +0000 (05:52 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 30 Jul 2026 00:30:14 +0000 (17:30 -0700)
The MT7531 indirect PHY access functions poll MT7531_PHY_IAC through
a helper which returns 0 when the underlying read fails, so a failed
bus transaction clears MT7531_PHY_ACS_ST and the access carries on,
returning garbage PHY register data to phylib.

Poll using regmap_read_poll_timeout(), which stops on read errors and
propagates them. These functions hold the MDIO bus lock across the
whole sequence, so the unlocked regmap accesses remain correct. Remove
the now-unused _mt7530_unlocked_read().

Fixes: c288575f7810 ("net: dsa: mt7530: Add the support of MT7531 switch")
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/79e85d68d210cc37342978171aa6432aa2954333.1785213071.git.daniel@makrotopia.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/mt7530.c

index 292cde961f1afcabb98da2b23da5c0f354dc807d..aa33d94e11b5f9b1cd3e419c63df5617ce83e7cc 100644 (file)
@@ -191,12 +191,6 @@ mt7530_write(struct mt7530_priv *priv, u32 reg, u32 val)
        mt7530_mutex_unlock(priv);
 }
 
-static u32
-_mt7530_unlocked_read(struct mt7530_dummy_poll *p)
-{
-       return mt7530_mii_read(p->priv, p->reg);
-}
-
 static u32
 _mt7530_read(struct mt7530_dummy_poll *p)
 {
@@ -553,16 +547,13 @@ static int
 mt7531_ind_c45_phy_read(struct mt7530_priv *priv, int port, int devad,
                        int regnum)
 {
-       struct mt7530_dummy_poll p;
        u32 reg, val;
        int ret;
 
-       INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
-
        mt7530_mutex_lock(priv);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -572,8 +563,8 @@ mt7531_ind_c45_phy_read(struct mt7530_priv *priv, int port, int devad,
              MT7531_MDIO_DEV_ADDR(devad) | regnum;
        mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -583,8 +574,8 @@ mt7531_ind_c45_phy_read(struct mt7530_priv *priv, int port, int devad,
              MT7531_MDIO_DEV_ADDR(devad);
        mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -601,16 +592,13 @@ static int
 mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad,
                         int regnum, u16 data)
 {
-       struct mt7530_dummy_poll p;
        u32 val, reg;
        int ret;
 
-       INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
-
        mt7530_mutex_lock(priv);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -620,8 +608,8 @@ mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad,
              MT7531_MDIO_DEV_ADDR(devad) | regnum;
        mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -631,8 +619,8 @@ mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad,
              MT7531_MDIO_DEV_ADDR(devad) | data;
        mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -647,16 +635,13 @@ out:
 static int
 mt7531_ind_c22_phy_read(struct mt7530_priv *priv, int port, int regnum)
 {
-       struct mt7530_dummy_poll p;
        int ret;
        u32 val;
 
-       INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
-
        mt7530_mutex_lock(priv);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -667,8 +652,8 @@ mt7531_ind_c22_phy_read(struct mt7530_priv *priv, int port, int regnum)
 
        mt7530_mii_write(priv, MT7531_PHY_IAC, val | MT7531_PHY_ACS_ST);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, val,
-                                !(val & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
+                                      !(val & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -685,16 +670,13 @@ static int
 mt7531_ind_c22_phy_write(struct mt7530_priv *priv, int port, int regnum,
                         u16 data)
 {
-       struct mt7530_dummy_poll p;
        int ret;
        u32 reg;
 
-       INIT_MT7530_DUMMY_POLL(&p, priv, MT7531_PHY_IAC);
-
        mt7530_mutex_lock(priv);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
-                                !(reg & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, reg,
+                                      !(reg & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;
@@ -705,8 +687,8 @@ mt7531_ind_c22_phy_write(struct mt7530_priv *priv, int port, int regnum,
 
        mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
 
-       ret = readx_poll_timeout(_mt7530_unlocked_read, &p, reg,
-                                !(reg & MT7531_PHY_ACS_ST), 20, 100000);
+       ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, reg,
+                                      !(reg & MT7531_PHY_ACS_ST), 20, 100000);
        if (ret < 0) {
                dev_err(priv->dev, "poll timeout\n");
                goto out;