|
@@ -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,
|