Commit 0ae940c7 authored by David S. Miller's avatar David S. Miller

Merge branch 'mv88e6xxx-fix-wait'

Andrew Lunn says:

====================
Fix mv88e6xxx wait function

The mv88e6xxx wait function can be upset of the system has nots of
other things to do and a sleep takes a lot longer than expected. Fix
this be using a fixed number of iterations, rather than a fixed
walkclock time.

Witht that change made, it is possible to consoliate another
wait function.

A wait actually timing out should not happen and when it does, it
means something serious is wrong. Make sure an error is logged,
since not all callers will log an error.
====================
Reviewed-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 7a7e780c 30853553
...@@ -309,9 +309,9 @@ static int mv88e6xxx_serdes_write(struct mv88e6xxx_chip *chip, int reg, u16 val) ...@@ -309,9 +309,9 @@ static int mv88e6xxx_serdes_write(struct mv88e6xxx_chip *chip, int reg, u16 val)
static int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg, static int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg,
u16 mask) u16 mask)
{ {
unsigned long timeout = jiffies + HZ / 10; int i;
while (time_before(jiffies, timeout)) { for (i = 0; i < 16; i++) {
u16 val; u16 val;
int err; int err;
...@@ -325,6 +325,7 @@ static int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg, ...@@ -325,6 +325,7 @@ static int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg,
usleep_range(1000, 2000); usleep_range(1000, 2000);
} }
dev_err(chip->dev, "Timeout while waiting for switch\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -333,21 +334,13 @@ static int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg, ...@@ -333,21 +334,13 @@ static int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg,
u16 update) u16 update)
{ {
u16 val; u16 val;
int i, err; int err;
/* Wait until the previous operation is completed */ /* Wait until the previous operation is completed */
for (i = 0; i < 16; ++i) { err = mv88e6xxx_wait(chip, addr, reg, BIT(15));
err = mv88e6xxx_read(chip, addr, reg, &val);
if (err) if (err)
return err; return err;
if (!(val & BIT(15)))
break;
}
if (i == 16)
return -ETIMEDOUT;
/* Set the Update bit to trigger a write operation */ /* Set the Update bit to trigger a write operation */
val = BIT(15) | update; val = BIT(15) | update;
...@@ -375,7 +368,7 @@ static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr, ...@@ -375,7 +368,7 @@ static int _mv88e6xxx_reg_write(struct mv88e6xxx_chip *chip, int addr,
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip) static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
{ {
int ret; int ret;
unsigned long timeout; int i;
ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL); ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
if (ret < 0) if (ret < 0)
...@@ -386,8 +379,7 @@ static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip) ...@@ -386,8 +379,7 @@ static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
if (ret) if (ret)
return ret; return ret;
timeout = jiffies + 1 * HZ; for (i = 0; i < 16; i++) {
while (time_before(jiffies, timeout)) {
ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS); ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -403,8 +395,7 @@ static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip) ...@@ -403,8 +395,7 @@ static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip) static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
{ {
int ret, err; int ret, err, i;
unsigned long timeout;
ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL); ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_CONTROL);
if (ret < 0) if (ret < 0)
...@@ -415,8 +406,7 @@ static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip) ...@@ -415,8 +406,7 @@ static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
if (err) if (err)
return err; return err;
timeout = jiffies + 1 * HZ; for (i = 0; i < 16; i++) {
while (time_before(jiffies, timeout)) {
ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS); ret = _mv88e6xxx_reg_read(chip, REG_GLOBAL, GLOBAL_STATUS);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment