mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 18:03:10 -04:00
net: dsa: mt7530: error out on failed PHY_IAC command writes
MT7531_PHY_ACS_ST is only ever set by the command write that precedes each poll in the MT7531 indirect PHY access functions, and that write's return value is discarded. A failed write leaves ACS_ST at 0 from the previous access, so the poll succeeds on its first iteration and the functions return stale IAC contents as if they were fresh PHY data. Check the writes and bail out before polling. Signed-off-by: Daniel Golle <daniel@makrotopia.org> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://patch.msgid.link/c34602e63a20ebbfb97babd145c82832d7a0b523.1785811140.git.daniel@makrotopia.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
573d6e3afe
commit
1c95dcb7e9
@@ -565,7 +565,9 @@ mt7531_ind_c45_phy_read(struct mt7530_priv *priv, int port, int devad,
|
||||
|
||||
reg = MT7531_MDIO_CL45_ADDR | MT7531_MDIO_PHY_ADDR(port) |
|
||||
MT7531_MDIO_DEV_ADDR(devad) | regnum;
|
||||
mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
ret = mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
|
||||
!(val & MT7531_PHY_ACS_ST), 20, 100000);
|
||||
@@ -576,7 +578,9 @@ mt7531_ind_c45_phy_read(struct mt7530_priv *priv, int port, int devad,
|
||||
|
||||
reg = MT7531_MDIO_CL45_READ | MT7531_MDIO_PHY_ADDR(port) |
|
||||
MT7531_MDIO_DEV_ADDR(devad);
|
||||
mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
ret = mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
|
||||
!(val & MT7531_PHY_ACS_ST), 20, 100000);
|
||||
@@ -610,7 +614,9 @@ mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad,
|
||||
|
||||
reg = MT7531_MDIO_CL45_ADDR | MT7531_MDIO_PHY_ADDR(port) |
|
||||
MT7531_MDIO_DEV_ADDR(devad) | regnum;
|
||||
mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
ret = mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
|
||||
!(val & MT7531_PHY_ACS_ST), 20, 100000);
|
||||
@@ -621,7 +627,9 @@ mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad,
|
||||
|
||||
reg = MT7531_MDIO_CL45_WRITE | MT7531_MDIO_PHY_ADDR(port) |
|
||||
MT7531_MDIO_DEV_ADDR(devad) | data;
|
||||
mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
ret = mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
|
||||
!(val & MT7531_PHY_ACS_ST), 20, 100000);
|
||||
@@ -654,7 +662,9 @@ mt7531_ind_c22_phy_read(struct mt7530_priv *priv, int port, int regnum)
|
||||
val = MT7531_MDIO_CL22_READ | MT7531_MDIO_PHY_ADDR(port) |
|
||||
MT7531_MDIO_REG_ADDR(regnum);
|
||||
|
||||
mt7530_mii_write(priv, MT7531_PHY_IAC, val | MT7531_PHY_ACS_ST);
|
||||
ret = mt7530_mii_write(priv, MT7531_PHY_IAC, val | MT7531_PHY_ACS_ST);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, val,
|
||||
!(val & MT7531_PHY_ACS_ST), 20, 100000);
|
||||
@@ -689,7 +699,9 @@ mt7531_ind_c22_phy_write(struct mt7530_priv *priv, int port, int regnum,
|
||||
reg = MT7531_MDIO_CL22_WRITE | MT7531_MDIO_PHY_ADDR(port) |
|
||||
MT7531_MDIO_REG_ADDR(regnum) | data;
|
||||
|
||||
mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
ret = mt7530_mii_write(priv, MT7531_PHY_IAC, reg | MT7531_PHY_ACS_ST);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = regmap_read_poll_timeout(priv->regmap, MT7531_PHY_IAC, reg,
|
||||
!(reg & MT7531_PHY_ACS_ST), 20, 100000);
|
||||
|
||||
Reference in New Issue
Block a user