Skip to content

Commit

Permalink
net: mvmdio: orion_mdio_ready: remove manual poll
Browse files Browse the repository at this point in the history
Replace manual poll of MVMDIO_SMI_READ_VALID with a call to
orion_mdio_wait_ready.  This ensures a consistent timeout,
eliminates a busy loop, and allows for use of interrupts on
systems that support them.

Signed-off-by: Leigh Brown <leigh@solinno.co.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Leigh Brown authored and David S. Miller committed Oct 29, 2013
1 parent b70cd1c commit 839f46b
Showing 1 changed file with 13 additions and 21 deletions.
34 changes: 13 additions & 21 deletions drivers/net/ethernet/marvell/mvmdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,43 +110,35 @@ static int orion_mdio_read(struct mii_bus *bus, int mii_id,
int regnum)
{
struct orion_mdio_dev *dev = bus->priv;
int count;
u32 val;
int ret;

mutex_lock(&dev->lock);

ret = orion_mdio_wait_ready(bus);
if (ret < 0) {
mutex_unlock(&dev->lock);
return ret;
}
if (ret < 0)
goto out;

writel(((mii_id << MVMDIO_SMI_PHY_ADDR_SHIFT) |
(regnum << MVMDIO_SMI_PHY_REG_SHIFT) |
MVMDIO_SMI_READ_OPERATION),
dev->regs);

/* Wait for the value to become available */
count = 0;
while (1) {
val = readl(dev->regs);
if (val & MVMDIO_SMI_READ_VALID)
break;

if (count > 100) {
dev_err(bus->parent, "Timeout when reading PHY\n");
mutex_unlock(&dev->lock);
return -ETIMEDOUT;
}
ret = orion_mdio_wait_ready(bus);
if (ret < 0)
goto out;

udelay(10);
count++;
val = readl(dev->regs);
if (!(val & MVMDIO_SMI_READ_VALID)) {
dev_err(bus->parent, "SMI bus read not valid\n");
ret = -ENODEV;
goto out;
}

ret = val & 0xFFFF;
out:
mutex_unlock(&dev->lock);

return val & 0xFFFF;
return ret;
}

static int orion_mdio_write(struct mii_bus *bus, int mii_id,
Expand Down

0 comments on commit 839f46b

Please sign in to comment.