Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 839f46bb authored by Leigh Brown's avatar Leigh Brown Committed by David S. Miller
Browse files

net: mvmdio: orion_mdio_ready: remove manual poll



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: default avatarLeigh Brown <leigh@solinno.co.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b70cd1c1
Loading
Loading
Loading
Loading
+13 −21
Original line number Diff line number Diff line
@@ -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,