Skip to content

Commit 4488f6b

Browse files
Divya-Kopperadavem330
authored andcommitted
net: phy: micrel: Fix concurrent register access
Make Extended page register accessing atomic, to overcome unexpected output from register reads/writes. Fixes: 7c2dcfa ("net: phy: micrel: Add support for LAN8804 PHY") Signed-off-by: Divya Koppera<[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 6af3b42 commit 4488f6b

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

drivers/net/phy/micrel.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,30 +1596,32 @@ static int lanphy_read_page_reg(struct phy_device *phydev, int page, u32 addr)
15961596
{
15971597
u32 data;
15981598

1599-
phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
1600-
phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
1601-
phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
1602-
(page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC));
1603-
data = phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA);
1599+
phy_lock_mdio_bus(phydev);
1600+
__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
1601+
__phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
1602+
__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
1603+
(page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC));
1604+
data = __phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA);
1605+
phy_unlock_mdio_bus(phydev);
16041606

16051607
return data;
16061608
}
16071609

16081610
static int lanphy_write_page_reg(struct phy_device *phydev, int page, u16 addr,
16091611
u16 val)
16101612
{
1611-
phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
1612-
phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
1613-
phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
1614-
(page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC));
1613+
phy_lock_mdio_bus(phydev);
1614+
__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page);
1615+
__phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr);
1616+
__phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL,
1617+
page | LAN_EXT_PAGE_ACCESS_CTRL_EP_FUNC);
16151618

1616-
val = phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val);
1617-
if (val) {
1619+
val = __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val);
1620+
if (val != 0)
16181621
phydev_err(phydev, "Error: phy_write has returned error %d\n",
16191622
val);
1620-
return val;
1621-
}
1622-
return 0;
1623+
phy_unlock_mdio_bus(phydev);
1624+
return val;
16231625
}
16241626

16251627
static int lan8814_config_init(struct phy_device *phydev)

0 commit comments

Comments
 (0)