• Russell King's avatar
    net: dsa: fix mv88e6xxx switches · db0e51af
    Russell King authored
    Since commit 76e398a6 ("net: dsa: use switchdev obj for VLAN add/del
    ops"), the Marvell 88E6xxx switch has been unable to pass traffic
    between ports - any received traffic is discarded by the switch.
    Taking a port out of bridge mode and configuring a vlan on it also the
    port to start passing traffic.
    
    With the debugfs files re-instated to allow debug of this issue by
    comparing the register settings between the working and non-working
    case, the reason becomes clear:
    
         GLOBAL GLOBAL2 SERDES   0    1    2    3    4    5    6
    - 7:  1111    707f    2001     2    2    2    2    2    0    2
    + 7:  1111    707f    2001     1    1    1    1    1    0    1
    
    Register 7 for the ports is the default vlan tag register, and in the
    non-working setup, it has been set to 2, despite vlan 2 not being
    configured.  This causes the switch to drop all packets coming in to
    these ports.  The working setup has the default vlan tag register set
    to 1, which is the default vlan when none is configured.
    
    Inspection of the code reveals why.  The code prior to this commit
    was:
    
    -		for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
    ...
    -			if (!err && vlan->flags & BRIDGE_VLAN_INFO_PVID)
    -				err = ds->drv->port_pvid_set(ds, p->port, vid);
    
    but the new code is:
    
    +	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
    ...
    +	}
    ...
    +	if (pvid)
    +		err = _mv88e6xxx_port_pvid_set(ds, port, vid);
    
    This causes the new code to always set the default vlan to one higher
    than the old code.
    
    Fix this.
    
    Fixes: 76e398a6 ("net: dsa: use switchdev obj for VLAN add/del ops")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    db0e51af
mv88e6xxx.c 64.4 KB