diff options
Diffstat (limited to 'target/linux')
| -rw-r--r-- | target/linux/generic/files/drivers/net/phy/ar8216.c | 27 | 
1 files changed, 19 insertions, 8 deletions
| diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 12cba977e..fe329d8f1 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -77,14 +77,20 @@ static u32  ar8216_mii_read(struct ar8216_priv *priv, int reg)  {  	struct phy_device *phy = priv->phy; +	struct mii_bus *bus = phy->bus;  	u16 r1, r2, page;  	u16 lo, hi;  	split_addr((u32) reg, &r1, &r2, &page); -	mdiobus_write(phy->bus, 0x18, 0, page); + +	mutex_lock(&bus->mdio_lock); + +	bus->write(bus, 0x18, 0, page);  	msleep(1); /* wait for the page switch to propagate */ -	lo = mdiobus_read(phy->bus, 0x10 | r2, r1); -	hi = mdiobus_read(phy->bus, 0x10 | r2, r1 + 1); +	lo = bus->read(bus, 0x10 | r2, r1); +	hi = bus->read(bus, 0x10 | r2, r1 + 1); + +	mutex_unlock(&bus->mdio_lock);  	return (hi << 16) | lo;  } @@ -93,17 +99,22 @@ static void  ar8216_mii_write(struct ar8216_priv *priv, int reg, u32 val)  {  	struct phy_device *phy = priv->phy; +	struct mii_bus *bus = phy->bus;  	u16 r1, r2, r3;  	u16 lo, hi;  	split_addr((u32) reg, &r1, &r2, &r3); -	mdiobus_write(phy->bus, 0x18, 0, r3); -	msleep(1); /* wait for the page switch to propagate */ -  	lo = val & 0xffff;  	hi = (u16) (val >> 16); -	mdiobus_write(phy->bus, 0x10 | r2, r1 + 1, hi); -	mdiobus_write(phy->bus, 0x10 | r2, r1, lo); + +	mutex_lock(&bus->mdio_lock); + +	bus->write(bus, 0x18, 0, r3); +	msleep(1); /* wait for the page switch to propagate */ +	bus->write(bus, 0x10 | r2, r1 + 1, hi); +	bus->write(bus, 0x10 | r2, r1, lo); + +	mutex_unlock(&bus->mdio_lock);  }  static u32 | 
