Skip to content

Commit

Permalink
net: dsa: lan9303: add VLAN IDs to master device
Browse files Browse the repository at this point in the history
commit 430065e upstream.

If the master device does VLAN filtering, the IDs used by the switch
must be added for any frames to be received.  Do this in the
port_enable() function, and remove them in port_disable().

Fixes: a129259 ("net: dsa: add new DSA switch driver for the SMSC-LAN9303")
Signed-off-by: Mans Rullgard <mans@mansr.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Link: https://lore.kernel.org/r/20220216204818.28746-1-mans@mansr.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
mansr authored and gregkh committed Feb 23, 2022
1 parent a960e6d commit d8a5a3d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
1 change: 1 addition & 0 deletions drivers/net/dsa/Kconfig
Expand Up @@ -82,6 +82,7 @@ config NET_DSA_REALTEK_SMI

config NET_DSA_SMSC_LAN9303
tristate
depends on VLAN_8021Q || VLAN_8021Q=n
select NET_DSA_TAG_LAN9303
select REGMAP
help
Expand Down
11 changes: 9 additions & 2 deletions drivers/net/dsa/lan9303-core.c
Expand Up @@ -10,6 +10,7 @@
#include <linux/mii.h>
#include <linux/phy.h>
#include <linux/if_bridge.h>
#include <linux/if_vlan.h>
#include <linux/etherdevice.h>

#include "lan9303.h"
Expand Down Expand Up @@ -1083,21 +1084,27 @@ static void lan9303_adjust_link(struct dsa_switch *ds, int port,
static int lan9303_port_enable(struct dsa_switch *ds, int port,
struct phy_device *phy)
{
struct dsa_port *dp = dsa_to_port(ds, port);
struct lan9303 *chip = ds->priv;

if (!dsa_is_user_port(ds, port))
if (!dsa_port_is_user(dp))
return 0;

vlan_vid_add(dp->cpu_dp->master, htons(ETH_P_8021Q), port);

return lan9303_enable_processing_port(chip, port);
}

static void lan9303_port_disable(struct dsa_switch *ds, int port)
{
struct dsa_port *dp = dsa_to_port(ds, port);
struct lan9303 *chip = ds->priv;

if (!dsa_is_user_port(ds, port))
if (!dsa_port_is_user(dp))
return;

vlan_vid_del(dp->cpu_dp->master, htons(ETH_P_8021Q), port);

lan9303_disable_processing_port(chip, port);
lan9303_phy_write(ds, chip->phy_addr_base + port, MII_BMCR, BMCR_PDOWN);
}
Expand Down

0 comments on commit d8a5a3d

Please sign in to comment.