diff options
author | Emilio López <emilio@elopez.com.ar> | 2013-07-22 21:09:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-24 20:04:20 -0400 |
commit | 2bf420a7686e0fdd2fbf16d75e729b306744db0d (patch) | |
tree | ae5422373f8ff4d856742c260f6baa533eb7b7dc | |
parent | 905a6f96a1b18e490a75f810d733ced93c39b0e5 (diff) |
net: sun4i: fix timeout check
The current timeout check is comparing two constant values, so it won't
ever detect a timeout. This patch reworks the affected code a bit so it
has a chance at detecting timeouts correctly.
Signed-off-by: Emilio López <emilio@elopez.com.ar>
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/phy/mdio-sun4i.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/net/phy/mdio-sun4i.c b/drivers/net/phy/mdio-sun4i.c index 61d3f4ebf52e..7f25e49ae37f 100644 --- a/drivers/net/phy/mdio-sun4i.c +++ b/drivers/net/phy/mdio-sun4i.c | |||
@@ -40,7 +40,7 @@ struct sun4i_mdio_data { | |||
40 | static int sun4i_mdio_read(struct mii_bus *bus, int mii_id, int regnum) | 40 | static int sun4i_mdio_read(struct mii_bus *bus, int mii_id, int regnum) |
41 | { | 41 | { |
42 | struct sun4i_mdio_data *data = bus->priv; | 42 | struct sun4i_mdio_data *data = bus->priv; |
43 | unsigned long start_jiffies; | 43 | unsigned long timeout_jiffies; |
44 | int value; | 44 | int value; |
45 | 45 | ||
46 | /* issue the phy address and reg */ | 46 | /* issue the phy address and reg */ |
@@ -49,10 +49,9 @@ static int sun4i_mdio_read(struct mii_bus *bus, int mii_id, int regnum) | |||
49 | writel(0x1, data->membase + EMAC_MAC_MCMD_REG); | 49 | writel(0x1, data->membase + EMAC_MAC_MCMD_REG); |
50 | 50 | ||
51 | /* Wait read complete */ | 51 | /* Wait read complete */ |
52 | start_jiffies = jiffies; | 52 | timeout_jiffies = jiffies + MDIO_TIMEOUT; |
53 | while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { | 53 | while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { |
54 | if (time_after(start_jiffies, | 54 | if (time_is_before_jiffies(timeout_jiffies)) |
55 | start_jiffies + MDIO_TIMEOUT)) | ||
56 | return -ETIMEDOUT; | 55 | return -ETIMEDOUT; |
57 | msleep(1); | 56 | msleep(1); |
58 | } | 57 | } |
@@ -69,7 +68,7 @@ static int sun4i_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | |||
69 | u16 value) | 68 | u16 value) |
70 | { | 69 | { |
71 | struct sun4i_mdio_data *data = bus->priv; | 70 | struct sun4i_mdio_data *data = bus->priv; |
72 | unsigned long start_jiffies; | 71 | unsigned long timeout_jiffies; |
73 | 72 | ||
74 | /* issue the phy address and reg */ | 73 | /* issue the phy address and reg */ |
75 | writel((mii_id << 8) | regnum, data->membase + EMAC_MAC_MADR_REG); | 74 | writel((mii_id << 8) | regnum, data->membase + EMAC_MAC_MADR_REG); |
@@ -77,10 +76,9 @@ static int sun4i_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | |||
77 | writel(0x1, data->membase + EMAC_MAC_MCMD_REG); | 76 | writel(0x1, data->membase + EMAC_MAC_MCMD_REG); |
78 | 77 | ||
79 | /* Wait read complete */ | 78 | /* Wait read complete */ |
80 | start_jiffies = jiffies; | 79 | timeout_jiffies = jiffies + MDIO_TIMEOUT; |
81 | while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { | 80 | while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { |
82 | if (time_after(start_jiffies, | 81 | if (time_is_before_jiffies(timeout_jiffies)) |
83 | start_jiffies + MDIO_TIMEOUT)) | ||
84 | return -ETIMEDOUT; | 82 | return -ETIMEDOUT; |
85 | msleep(1); | 83 | msleep(1); |
86 | } | 84 | } |