• Oleksij Rempel's avatar
    net: dsa: microchip: implement multi-bridge support · b3612ccd
    Oleksij Rempel authored
    Current driver version is able to handle only one bridge at time.
    Configuring two bridges on two different ports would end up shorting this
    bridges by HW. To reproduce it:
    
    	ip l a name br0 type bridge
    	ip l a name br1 type bridge
    	ip l s dev br0 up
    	ip l s dev br1 up
    	ip l s lan1 master br0
    	ip l s dev lan1 up
    	ip l s lan2 master br1
    	ip l s dev lan2 up
    
    	Ping on lan1 and get response on lan2, which should not happen.
    
    This happened, because current driver version is storing one global "Port VLAN
    Membership" and applying it to all ports which are members of any
    bridge.
    To solve this issue, we need to handle each port separately.
    
    This patch is dropping the global port member storage and calculating
    membership dynamically depending on STP state and bridge participation.
    
    Note: STP support was broken before this patch and should be fixed
    separately.
    
    Fixes: c2e86691 ("net: dsa: microchip: break KSZ9477 DSA driver into two files")
    Signed-off-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
    Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
    Link: https://lore.kernel.org/r/20211126123926.2981028-1-o.rempel@pengutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    b3612ccd
ksz_common.c 11 KB