• Vladimir Oltean's avatar
    phy: lynx-28g: serialize concurrent phy_set_mode_ext() calls to shared registers · 139ad114
    Vladimir Oltean authored
    The protocol converter configuration registers PCC8, PCCC, PCCD
    (implemented by the driver), as well as others, control protocol
    converters from multiple lanes (each represented as a different
    struct phy). So, if there are simultaneous calls to phy_set_mode_ext()
    to lanes sharing the same PCC register (either for the "old" or for the
    "new" protocol), corruption of the values programmed to hardware is
    possible, because lynx_28g_rmw() has no locking.
    
    Add a spinlock in the struct lynx_28g_priv shared by all lanes, and take
    the global spinlock from the phy_ops :: set_mode() implementation. There
    are no other callers which modify PCC registers.
    
    Fixes: 8f73b37c ("phy: add support for the Layerscape SerDes 28G")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    139ad114
phy-fsl-lynx-28g.c 18 KB