mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
net: dsa: mt7530: error out on failed reads in MT7531 PHY polling
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: c288575f78 ("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>
This commit is contained in:
parent
ed9adac35b
commit
77a9ebe881
|
|
@ -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 @@ mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad,
|
|||
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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user