mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 11:03:07 -04:00
net: dsa: mt7530: check CORE_PLL_GROUP4 access in mt7531_setup()
mt7531_setup() reads CORE_PLL_GROUP4 through the MT7531 indirect c45 PHY access, modifies it and writes it back to enable the PHY core PLL, but checks neither the read nor the write. Now that the indirect access functions propagate command-write failures, a failed read returns a negative errno that would be bit-modified and written back into the PLL register, and a failed write-back would go unnoticed. Check both and bail out. The adjacent EEE advertisement writes push a constant value and cannot corrupt state, so they are left as is. Signed-off-by: Daniel Golle <daniel@makrotopia.org> Link: https://patch.msgid.link/a7dfe3b66ea6ac1ae7915034de0527060e6ddcd4.1785811140.git.daniel@makrotopia.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
1c95dcb7e9
commit
1ae63b018d
@@ -2781,14 +2781,20 @@ mt7531_setup(struct dsa_switch *ds)
|
||||
* phy_[read,write]_mmd_indirect is called, we provide our own
|
||||
* mt7531_ind_mmd_phy_[read,write] to complete this function.
|
||||
*/
|
||||
val = mt7531_ind_c45_phy_read(priv,
|
||||
ret = mt7531_ind_c45_phy_read(priv,
|
||||
MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr),
|
||||
MDIO_MMD_VEND2, CORE_PLL_GROUP4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
val = ret;
|
||||
val |= MT7531_RG_SYSPLL_DMY2 | MT7531_PHY_PLL_BYPASS_MODE;
|
||||
val &= ~MT7531_PHY_PLL_OFF;
|
||||
mt7531_ind_c45_phy_write(priv,
|
||||
MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr),
|
||||
MDIO_MMD_VEND2, CORE_PLL_GROUP4, val);
|
||||
ret = mt7531_ind_c45_phy_write(priv,
|
||||
MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr),
|
||||
MDIO_MMD_VEND2, CORE_PLL_GROUP4, val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Disable EEE advertisement on the switch PHYs. */
|
||||
for (i = MT753X_CTRL_PHY_ADDR(priv->mdiodev->addr);
|
||||
|
||||
Reference in New Issue
Block a user