On Tue, May 28, 2019 at 01:17:10PM +0000, Rasmus Villemoes wrote: > Currently, the upper half of a 4-byte STATS_TYPE_PORT statistic ends > up in bits 47:32 of the return value, instead of bits 31:16 as they > should. > > Signed-off-by: Rasmus Villemoes <rasmus.villem...@prevas.dk>
Hi Rasmus Please include a Fixes tag, to indicate where the problem was introduced. In this case, i think it was: Fixes: 6e46e2d821bb ("net: dsa: mv88e6xxx: Fix u64 statistics") And set the Subject to [PATCH net] to indicate this should be applied to the net tree. > --- > I also noticed that it's a bit inconsistent that we return U64_MAX if > there's a read error in STATS_TYPE_PORT, while > mv88e6xxx_g1_stats_read() returns 0 in case of a read error. In > practice, register reads probably never fail so it doesn't matter. > > drivers/net/dsa/mv88e6xxx/chip.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/dsa/mv88e6xxx/chip.c > b/drivers/net/dsa/mv88e6xxx/chip.c > index 370434bdbdab..317553d2cb21 100644 > --- a/drivers/net/dsa/mv88e6xxx/chip.c > +++ b/drivers/net/dsa/mv88e6xxx/chip.c > @@ -785,7 +785,7 @@ static uint64_t _mv88e6xxx_get_ethtool_stat(struct > mv88e6xxx_chip *chip, > err = mv88e6xxx_port_read(chip, port, s->reg + 1, ®); > if (err) > return U64_MAX; > - high = reg; > + low |= ((u32)reg) << 16; > } > break; > case STATS_TYPE_BANK1: What i don't like about this is how the function finishes: } value = (((u64)high) << 32) | low; return value; } A better fix might be - break + value = (((u64)high) << 16 | low; + return value; Andrew