lkml.org 
[lkml]   [2020]   [Jun]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.6 10/17] net: dsa: felix: send VLANs on CPU port as egress-tagged
    Date
    From: Vladimir Oltean <vladimir.oltean@nxp.com>

    [ Upstream commit 183be6f967fe37c3154bfac39e913c3bafe89d1b ]

    As explained in other commits before (b9cd75e66895 and 87b0f983f66f),
    ocelot switches have a single egress-untagged VLAN per port, and the
    driver would deny adding a second one while an egress-untagged VLAN
    already exists.

    But on the CPU port (where the VLAN configuration is implicit, because
    there is no net device for the bridge to control), the DSA core attempts
    to add a VLAN using the same flags as were used for the front-panel
    port. This would make adding any untagged VLAN fail due to the CPU port
    rejecting the configuration:

    bridge vlan add dev swp0 vid 100 pvid untagged
    [ 1865.854253] mscc_felix 0000:00:00.5: Port already has a native VLAN: 1
    [ 1865.860824] mscc_felix 0000:00:00.5: Failed to add VLAN 100 to port 5: -16

    (note that port 5 is the CPU port and not the front-panel swp0).

    So this hardware will send all VLANs as tagged towards the CPU.

    Fixes: 56051948773e ("net: dsa: ocelot: add driver for Felix switch family")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/dsa/ocelot/felix.c | 8 ++++++--
    1 file changed, 6 insertions(+), 2 deletions(-)

    diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c
    index b74580e87be8..5d9db8d042c1 100644
    --- a/drivers/net/dsa/ocelot/felix.c
    +++ b/drivers/net/dsa/ocelot/felix.c
    @@ -100,13 +100,17 @@ static void felix_vlan_add(struct dsa_switch *ds, int port,
    const struct switchdev_obj_port_vlan *vlan)
    {
    struct ocelot *ocelot = ds->priv;
    + u16 flags = vlan->flags;
    u16 vid;
    int err;

    + if (dsa_is_cpu_port(ds, port))
    + flags &= ~BRIDGE_VLAN_INFO_UNTAGGED;
    +
    for (vid = vlan->vid_begin; vid <= vlan->vid_end; vid++) {
    err = ocelot_vlan_add(ocelot, port, vid,
    - vlan->flags & BRIDGE_VLAN_INFO_PVID,
    - vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED);
    + flags & BRIDGE_VLAN_INFO_PVID,
    + flags & BRIDGE_VLAN_INFO_UNTAGGED);
    if (err) {
    dev_err(ds->dev, "Failed to add VLAN %d to port %d: %d\n",
    vid, port, err);
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-05 14:25    [W:6.439 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site