Hi Andrew, Andrew Lunn <and...@lunn.ch> writes:
> The mv88e6xxx driver times out operations on the switch based on > looping until an elapsed wall clock time is reached. However, if > usleep_range() sleeps much longer than expected, it could timeout with > an error without actually checking to see if the devices has completed > the operation. So replace the elapsed time with a fixed upper bound on > the number of loops. > > Testing on various switches has shown that switches takes either 0 or > 1 iteration, so a maximum of 16 iterations is a safe limit. > > Signed-off-by: Andrew Lunn <and...@lunn.ch> > --- > drivers/net/dsa/mv88e6xxx/chip.c | 15 ++++++--------- > 1 file changed, 6 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/dsa/mv88e6xxx/chip.c > b/drivers/net/dsa/mv88e6xxx/chip.c > index a230fcba5b64..ac8e9af4879f 100644 > --- a/drivers/net/dsa/mv88e6xxx/chip.c > +++ b/drivers/net/dsa/mv88e6xxx/chip.c > @@ -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, > u16 mask) > { > - unsigned long timeout = jiffies + HZ / 10; > + int i; > > - while (time_before(jiffies, timeout)) { > + for (i = 0; i < 16; i++) { > u16 val; > int err; > Since we remove the elapsed time here, can we use mv88e6xxx_wait in mv88e6xxx_update? It'd be good to have a consistent wait routine everywhere. Thanks, Vivien