aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorLeigh Brown <leigh@solinno.co.uk>2013-10-29 05:33:32 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-29 18:53:36 -0400
commit839f46bb4cf73d20d76195d4f2de34801180ae7c (patch)
tree96a9dc3d8c0a24a6097cb934e7f1a6594e961f8a /drivers/net
parentb70cd1c1a95ab2a50ffc5e1070c9e90931b92261 (diff)
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: Leigh Brown <leigh@solinno.co.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/marvell/mvmdio.c34
1 files changed, 13 insertions, 21 deletions
diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c
index 971a4c1bbbaa..e3898b3c91ad 100644
--- a/drivers/net/ethernet/marvell/mvmdio.c
+++ b/drivers/net/ethernet/marvell/mvmdio.c
@@ -110,43 +110,35 @@ static int orion_mdio_read(struct mii_bus *bus, int mii_id,
110 int regnum) 110 int regnum)
111{ 111{
112 struct orion_mdio_dev *dev = bus->priv; 112 struct orion_mdio_dev *dev = bus->priv;
113 int count;
114 u32 val; 113 u32 val;
115 int ret; 114 int ret;
116 115
117 mutex_lock(&dev->lock); 116 mutex_lock(&dev->lock);
118 117
119 ret = orion_mdio_wait_ready(bus); 118 ret = orion_mdio_wait_ready(bus);
120 if (ret < 0) { 119 if (ret < 0)
121 mutex_unlock(&dev->lock); 120 goto out;
122 return ret;
123 }
124 121
125 writel(((mii_id << MVMDIO_SMI_PHY_ADDR_SHIFT) | 122 writel(((mii_id << MVMDIO_SMI_PHY_ADDR_SHIFT) |
126 (regnum << MVMDIO_SMI_PHY_REG_SHIFT) | 123 (regnum << MVMDIO_SMI_PHY_REG_SHIFT) |
127 MVMDIO_SMI_READ_OPERATION), 124 MVMDIO_SMI_READ_OPERATION),
128 dev->regs); 125 dev->regs);
129 126
130 /* Wait for the value to become available */ 127 ret = orion_mdio_wait_ready(bus);
131 count = 0; 128 if (ret < 0)
132 while (1) { 129 goto out;
133 val = readl(dev->regs);
134 if (val & MVMDIO_SMI_READ_VALID)
135 break;
136
137 if (count > 100) {
138 dev_err(bus->parent, "Timeout when reading PHY\n");
139 mutex_unlock(&dev->lock);
140 return -ETIMEDOUT;
141 }
142 130
143 udelay(10); 131 val = readl(dev->regs);
144 count++; 132 if (!(val & MVMDIO_SMI_READ_VALID)) {
133 dev_err(bus->parent, "SMI bus read not valid\n");
134 ret = -ENODEV;
135 goto out;
145 } 136 }
146 137
138 ret = val & 0xFFFF;
139out:
147 mutex_unlock(&dev->lock); 140 mutex_unlock(&dev->lock);
148 141 return ret;
149 return val & 0xFFFF;
150} 142}
151 143
152static int orion_mdio_write(struct mii_bus *bus, int mii_id, 144static int orion_mdio_write(struct mii_bus *bus, int mii_id,