Skip to content

Commit fea23fb

Browse files
Russell Kingdavem330
authored andcommitted
net: phy: convert read-modify-write to phy_modify()
Convert read-modify-write sequences in at803x, Marvell and core phylib to use phy_modify() to ensure safety. Signed-off-by: Russell King <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 2b74e5b commit fea23fb

File tree

3 files changed

+46
-112
lines changed

3 files changed

+46
-112
lines changed

drivers/net/phy/at803x.c

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -215,34 +215,22 @@ static int at803x_suspend(struct phy_device *phydev)
215215
int value;
216216
int wol_enabled;
217217

218-
mutex_lock(&phydev->lock);
219-
220218
value = phy_read(phydev, AT803X_INTR_ENABLE);
221219
wol_enabled = value & AT803X_INTR_ENABLE_WOL;
222220

223-
value = phy_read(phydev, MII_BMCR);
224-
225221
if (wol_enabled)
226-
value |= BMCR_ISOLATE;
222+
value = BMCR_ISOLATE;
227223
else
228-
value |= BMCR_PDOWN;
224+
value = BMCR_PDOWN;
229225

230-
phy_write(phydev, MII_BMCR, value);
231-
232-
mutex_unlock(&phydev->lock);
226+
phy_modify(phydev, MII_BMCR, 0, value);
233227

234228
return 0;
235229
}
236230

237231
static int at803x_resume(struct phy_device *phydev)
238232
{
239-
int value;
240-
241-
value = phy_read(phydev, MII_BMCR);
242-
value &= ~(BMCR_PDOWN | BMCR_ISOLATE);
243-
phy_write(phydev, MII_BMCR, value);
244-
245-
return 0;
233+
return phy_modify(phydev, MII_BMCR, ~(BMCR_PDOWN | BMCR_ISOLATE), 0);
246234
}
247235

248236
static int at803x_probe(struct phy_device *phydev)

drivers/net/phy/marvell.c

Lines changed: 33 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ static int m88e1121_config_aneg(struct phy_device *phydev)
471471

472472
if (phy_interface_is_rgmii(phydev)) {
473473
err = m88e1121_config_aneg_rgmii_delays(phydev);
474-
if (err)
474+
if (err < 0)
475475
return err;
476476
}
477477

@@ -664,19 +664,14 @@ static int m88e1116r_config_init(struct phy_device *phydev)
664664

665665
static int m88e3016_config_init(struct phy_device *phydev)
666666
{
667-
int reg;
667+
int ret;
668668

669669
/* Enable Scrambler and Auto-Crossover */
670-
reg = phy_read(phydev, MII_88E3016_PHY_SPEC_CTRL);
671-
if (reg < 0)
672-
return reg;
673-
674-
reg &= ~MII_88E3016_DISABLE_SCRAMBLER;
675-
reg |= MII_88E3016_AUTO_MDIX_CROSSOVER;
676-
677-
reg = phy_write(phydev, MII_88E3016_PHY_SPEC_CTRL, reg);
678-
if (reg < 0)
679-
return reg;
670+
ret = phy_modify(phydev, MII_88E3016_PHY_SPEC_CTRL,
671+
~MII_88E3016_DISABLE_SCRAMBLER,
672+
MII_88E3016_AUTO_MDIX_CROSSOVER);
673+
if (ret < 0)
674+
return ret;
680675

681676
return marvell_config_init(phydev);
682677
}
@@ -685,42 +680,34 @@ static int m88e1111_config_init_hwcfg_mode(struct phy_device *phydev,
685680
u16 mode,
686681
int fibre_copper_auto)
687682
{
688-
int temp;
689-
690-
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
691-
if (temp < 0)
692-
return temp;
693-
694-
temp &= ~(MII_M1111_HWCFG_MODE_MASK |
695-
MII_M1111_HWCFG_FIBER_COPPER_AUTO |
696-
MII_M1111_HWCFG_FIBER_COPPER_RES);
697-
temp |= mode;
698-
699683
if (fibre_copper_auto)
700-
temp |= MII_M1111_HWCFG_FIBER_COPPER_AUTO;
684+
mode |= MII_M1111_HWCFG_FIBER_COPPER_AUTO;
701685

702-
return phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
686+
return phy_modify(phydev, MII_M1111_PHY_EXT_SR,
687+
(u16)~(MII_M1111_HWCFG_MODE_MASK |
688+
MII_M1111_HWCFG_FIBER_COPPER_AUTO |
689+
MII_M1111_HWCFG_FIBER_COPPER_RES),
690+
mode);
703691
}
704692

705693
static int m88e1111_config_init_rgmii_delays(struct phy_device *phydev)
706694
{
707-
int temp;
708-
709-
temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
710-
if (temp < 0)
711-
return temp;
695+
int delay;
712696

713697
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
714-
temp |= (MII_M1111_RGMII_RX_DELAY | MII_M1111_RGMII_TX_DELAY);
698+
delay = MII_M1111_RGMII_RX_DELAY | MII_M1111_RGMII_TX_DELAY;
715699
} else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) {
716-
temp &= ~MII_M1111_RGMII_TX_DELAY;
717-
temp |= MII_M1111_RGMII_RX_DELAY;
700+
delay = MII_M1111_RGMII_RX_DELAY;
718701
} else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
719-
temp &= ~MII_M1111_RGMII_RX_DELAY;
720-
temp |= MII_M1111_RGMII_TX_DELAY;
702+
delay = MII_M1111_RGMII_TX_DELAY;
703+
} else {
704+
delay = 0;
721705
}
722706

723-
return phy_write(phydev, MII_M1111_PHY_EXT_CR, temp);
707+
return phy_modify(phydev, MII_M1111_PHY_EXT_CR,
708+
(u16)~(MII_M1111_RGMII_RX_DELAY |
709+
MII_M1111_RGMII_TX_DELAY),
710+
delay);
724711
}
725712

726713
static int m88e1111_config_init_rgmii(struct phy_device *phydev)
@@ -766,7 +753,7 @@ static int m88e1111_config_init_rtbi(struct phy_device *phydev)
766753
int err;
767754

768755
err = m88e1111_config_init_rgmii_delays(phydev);
769-
if (err)
756+
if (err < 0)
770757
return err;
771758

772759
err = m88e1111_config_init_hwcfg_mode(
@@ -793,7 +780,7 @@ static int m88e1111_config_init(struct phy_device *phydev)
793780

794781
if (phy_interface_is_rgmii(phydev)) {
795782
err = m88e1111_config_init_rgmii(phydev);
796-
if (err)
783+
if (err < 0)
797784
return err;
798785
}
799786

@@ -834,7 +821,6 @@ static int m88e1121_config_init(struct phy_device *phydev)
834821
static int m88e1510_config_init(struct phy_device *phydev)
835822
{
836823
int err;
837-
int temp;
838824

839825
/* SGMII-to-Copper mode initialization */
840826
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
@@ -846,16 +832,15 @@ static int m88e1510_config_init(struct phy_device *phydev)
846832
return err;
847833

848834
/* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */
849-
temp = phy_read(phydev, MII_88E1510_GEN_CTRL_REG_1);
850-
temp &= ~MII_88E1510_GEN_CTRL_REG_1_MODE_MASK;
851-
temp |= MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII;
852-
err = phy_write(phydev, MII_88E1510_GEN_CTRL_REG_1, temp);
835+
err = phy_modify(phydev, MII_88E1510_GEN_CTRL_REG_1,
836+
~MII_88E1510_GEN_CTRL_REG_1_MODE_MASK,
837+
MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII);
853838
if (err < 0)
854839
return err;
855840

856841
/* PHY reset is necessary after changing MODE[2:0] */
857-
temp |= MII_88E1510_GEN_CTRL_REG_1_RESET;
858-
err = phy_write(phydev, MII_88E1510_GEN_CTRL_REG_1, temp);
842+
err = phy_modify(phydev, MII_88E1510_GEN_CTRL_REG_1, 0,
843+
MII_88E1510_GEN_CTRL_REG_1_RESET);
859844
if (err < 0)
860845
return err;
861846

@@ -961,7 +946,6 @@ static int m88e1149_config_init(struct phy_device *phydev)
961946

962947
static int m88e1145_config_init_rgmii(struct phy_device *phydev)
963948
{
964-
int temp;
965949
int err;
966950

967951
err = m88e1111_config_init_rgmii_delays(phydev);
@@ -973,15 +957,9 @@ static int m88e1145_config_init_rgmii(struct phy_device *phydev)
973957
if (err < 0)
974958
return err;
975959

976-
temp = phy_read(phydev, 0x1e);
977-
if (temp < 0)
978-
return temp;
979-
980-
temp &= 0xf03f;
981-
temp |= 2 << 9; /* 36 ohm */
982-
temp |= 2 << 6; /* 39 ohm */
983-
984-
err = phy_write(phydev, 0x1e, temp);
960+
err = phy_modify(phydev, 0x1e, 0xf03f,
961+
2 << 9 | /* 36 ohm */
962+
2 << 6); /* 39 ohm */
985963
if (err < 0)
986964
return err;
987965

drivers/net/phy/phy_device.c

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,9 +1368,8 @@ static int genphy_config_eee_advert(struct phy_device *phydev)
13681368
*/
13691369
int genphy_setup_forced(struct phy_device *phydev)
13701370
{
1371-
int ctl = phy_read(phydev, MII_BMCR);
1371+
u16 ctl = 0;
13721372

1373-
ctl &= BMCR_LOOPBACK | BMCR_ISOLATE | BMCR_PDOWN;
13741373
phydev->pause = 0;
13751374
phydev->asym_pause = 0;
13761375

@@ -1382,7 +1381,8 @@ int genphy_setup_forced(struct phy_device *phydev)
13821381
if (DUPLEX_FULL == phydev->duplex)
13831382
ctl |= BMCR_FULLDPLX;
13841383

1385-
return phy_write(phydev, MII_BMCR, ctl);
1384+
return phy_modify(phydev, MII_BMCR,
1385+
BMCR_LOOPBACK | BMCR_ISOLATE | BMCR_PDOWN, ctl);
13861386
}
13871387
EXPORT_SYMBOL(genphy_setup_forced);
13881388

@@ -1392,17 +1392,9 @@ EXPORT_SYMBOL(genphy_setup_forced);
13921392
*/
13931393
int genphy_restart_aneg(struct phy_device *phydev)
13941394
{
1395-
int ctl = phy_read(phydev, MII_BMCR);
1396-
1397-
if (ctl < 0)
1398-
return ctl;
1399-
1400-
ctl |= BMCR_ANENABLE | BMCR_ANRESTART;
1401-
14021395
/* Don't isolate the PHY if we're negotiating */
1403-
ctl &= ~BMCR_ISOLATE;
1404-
1405-
return phy_write(phydev, MII_BMCR, ctl);
1396+
return phy_modify(phydev, MII_BMCR, ~BMCR_ISOLATE,
1397+
BMCR_ANENABLE | BMCR_ANRESTART);
14061398
}
14071399
EXPORT_SYMBOL(genphy_restart_aneg);
14081400

@@ -1668,44 +1660,20 @@ EXPORT_SYMBOL(genphy_config_init);
16681660

16691661
int genphy_suspend(struct phy_device *phydev)
16701662
{
1671-
int value;
1672-
1673-
mutex_lock(&phydev->lock);
1674-
1675-
value = phy_read(phydev, MII_BMCR);
1676-
phy_write(phydev, MII_BMCR, value | BMCR_PDOWN);
1677-
1678-
mutex_unlock(&phydev->lock);
1679-
1680-
return 0;
1663+
return phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN);
16811664
}
16821665
EXPORT_SYMBOL(genphy_suspend);
16831666

16841667
int genphy_resume(struct phy_device *phydev)
16851668
{
1686-
int value;
1687-
1688-
value = phy_read(phydev, MII_BMCR);
1689-
phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN);
1690-
1691-
return 0;
1669+
return phy_modify(phydev, MII_BMCR, ~BMCR_PDOWN, 0);
16921670
}
16931671
EXPORT_SYMBOL(genphy_resume);
16941672

16951673
int genphy_loopback(struct phy_device *phydev, bool enable)
16961674
{
1697-
int value;
1698-
1699-
value = phy_read(phydev, MII_BMCR);
1700-
if (value < 0)
1701-
return value;
1702-
1703-
if (enable)
1704-
value |= BMCR_LOOPBACK;
1705-
else
1706-
value &= ~BMCR_LOOPBACK;
1707-
1708-
return phy_write(phydev, MII_BMCR, value);
1675+
return phy_modify(phydev, MII_BMCR, ~BMCR_LOOPBACK,
1676+
enable ? BMCR_LOOPBACK : 0);
17091677
}
17101678
EXPORT_SYMBOL(genphy_loopback);
17111679

0 commit comments

Comments
 (0)