Skip to content

Commit

Permalink
net: dsa: realtek: rtl8366rb: Serialize indirect PHY register access
Browse files Browse the repository at this point in the history
Lock the regmap during the whole PHY register access routines in
rtl8366rb.

Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk>
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
sipraga authored and intel-lab-lkp committed May 7, 2022
1 parent 4b97bac commit 5858edf
Showing 1 changed file with 22 additions and 11 deletions.
33 changes: 22 additions & 11 deletions drivers/net/dsa/realtek/rtl8366rb.c
Expand Up @@ -1653,28 +1653,34 @@ static int rtl8366rb_phy_read(struct realtek_priv *priv, int phy, int regnum)
if (phy > RTL8366RB_PHY_NO_MAX)
return -EINVAL;

ret = regmap_write(priv->map, RTL8366RB_PHY_ACCESS_CTRL_REG,
mutex_lock(&priv->map_lock);

ret = regmap_write(priv->map_nolock, RTL8366RB_PHY_ACCESS_CTRL_REG,
RTL8366RB_PHY_CTRL_READ);
if (ret)
return ret;
goto out;

reg = 0x8000 | (1 << (phy + RTL8366RB_PHY_NO_OFFSET)) | regnum;

ret = regmap_write(priv->map, reg, 0);
ret = regmap_write(priv->map_nolock, reg, 0);
if (ret) {
dev_err(priv->dev,
"failed to write PHY%d reg %04x @ %04x, ret %d\n",
phy, regnum, reg, ret);
return ret;
goto out;
}

ret = regmap_read(priv->map, RTL8366RB_PHY_ACCESS_DATA_REG, &val);
ret = regmap_read(priv->map_nolock, RTL8366RB_PHY_ACCESS_DATA_REG,
&val);
if (ret)
return ret;
goto out;

dev_dbg(priv->dev, "read PHY%d register 0x%04x @ %08x, val <- %04x\n",
phy, regnum, reg, val);

out:
mutex_unlock(&priv->map_lock);

return val;
}

Expand All @@ -1687,21 +1693,26 @@ static int rtl8366rb_phy_write(struct realtek_priv *priv, int phy, int regnum,
if (phy > RTL8366RB_PHY_NO_MAX)
return -EINVAL;

ret = regmap_write(priv->map, RTL8366RB_PHY_ACCESS_CTRL_REG,
mutex_lock(&priv->map_lock);

ret = regmap_write(priv->map_nolock, RTL8366RB_PHY_ACCESS_CTRL_REG,
RTL8366RB_PHY_CTRL_WRITE);
if (ret)
return ret;
goto out;

reg = 0x8000 | (1 << (phy + RTL8366RB_PHY_NO_OFFSET)) | regnum;

dev_dbg(priv->dev, "write PHY%d register 0x%04x @ %04x, val -> %04x\n",
phy, regnum, reg, val);

ret = regmap_write(priv->map, reg, val);
ret = regmap_write(priv->map_nolock, reg, val);
if (ret)
return ret;
goto out;

return 0;
out:
mutex_unlock(&priv->map_lock);

return ret;
}

static int rtl8366rb_dsa_phy_read(struct dsa_switch *ds, int phy, int regnum)
Expand Down

0 comments on commit 5858edf

Please sign in to comment.