• Hans J. Schultz's avatar
    net: dsa: mv88e6xxx: read FID when handling ATU violations · 4bf24ad0
    Hans J. Schultz authored
    When an ATU violation occurs, the switch uses the ATU FID register to
    report the FID of the MAC address that incurred the violation. It would
    be good for the driver to know the FID value for purposes such as
    logging and CPU-based authentication.
    
    Up until now, the driver has been calling the mv88e6xxx_g1_atu_op()
    function to read ATU violations, but that doesn't do exactly what we
    want, namely it calls mv88e6xxx_g1_atu_fid_write() with FID 0.
    (side note, the documentation for the ATU Get/Clear Violation command
    says that writes to the ATU FID register have no effect before the
    operation starts, it's only that we disregard the value that this
    register provides once the operation completes)
    
    So mv88e6xxx_g1_atu_fid_write() is not what we want, but rather
    mv88e6xxx_g1_atu_fid_read(). However, the latter doesn't exist, we need
    to write it.
    
    The remainder of mv88e6xxx_g1_atu_op() except for
    mv88e6xxx_g1_atu_fid_write() is still needed, namely to send a
    GET_CLR_VIOLATION command to the ATU. In principle we could have still
    kept calling mv88e6xxx_g1_atu_op(), but the MDIO writes to the ATU FID
    register are pointless, but in the interest of doing less CPU work per
    interrupt, write a new function called mv88e6xxx_g1_read_atu_violation()
    and call it.
    
    The FID will be the port default FID as set by mv88e6xxx_port_set_fid()
    if the VID from the packet cannot be found in the VTU. Otherwise it is
    the FID derived from the VTU entry associated with that VID.
    Signed-off-by: default avatarHans J. Schultz <netdev@kapio-technology.com>
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    4bf24ad0
global1_atu.c 11.1 KB