• Vladimir Oltean's avatar
    net: mscc: ocelot: make struct ocelot_stat_layout array indexable · 91904600
    Vladimir Oltean authored
    The ocelot counters are 32-bit and require periodic reading, every 2
    seconds, by ocelot_port_update_stats(), so that wraparounds are
    detected.
    
    Currently, the counters reported by ocelot_get_stats64() come from the
    32-bit hardware counters directly, rather than from the 64-bit
    accumulated ocelot->stats, and this is a problem for their integrity.
    
    The strategy is to make ocelot_get_stats64() able to cherry-pick
    individual stats from ocelot->stats the way in which it currently reads
    them out from SYS_COUNT_* registers. But currently it can't, because
    ocelot->stats is an opaque u64 array that's used only to feed data into
    ethtool -S.
    
    To solve that problem, we need to make ocelot->stats indexable, and
    associate each element with an element of struct ocelot_stat_layout used
    by ethtool -S.
    
    This makes ocelot_stat_layout a fat (and possibly sparse) array, so we
    need to change the way in which we access it. We no longer need
    OCELOT_STAT_END as a sentinel, because we know the array's size
    (OCELOT_NUM_STATS). We just need to skip the array elements that were
    left unpopulated for the switch revision (ocelot, felix, seville).
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    91904600
ocelot.c 92.1 KB