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

Reply via email to