Commit 430065e2 authored by Mans Rullgard's avatar Mans Rullgard Committed by Jakub Kicinski

net: dsa: lan9303: add VLAN IDs to master device

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: a1292595 ("net: dsa: add new DSA switch driver for the SMSC-LAN9303")
Signed-off-by: default avatarMans Rullgard <mans@mansr.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Reviewed-by: default avatarVladimir Oltean <olteanv@gmail.com>
Link: https://lore.kernel.org/r/20220216204818.28746-1-mans@mansr.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 017b355b
...@@ -82,6 +82,7 @@ config NET_DSA_REALTEK_SMI ...@@ -82,6 +82,7 @@ config NET_DSA_REALTEK_SMI
config NET_DSA_SMSC_LAN9303 config NET_DSA_SMSC_LAN9303
tristate tristate
depends on VLAN_8021Q || VLAN_8021Q=n
select NET_DSA_TAG_LAN9303 select NET_DSA_TAG_LAN9303
select REGMAP select REGMAP
help help
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/if_bridge.h> #include <linux/if_bridge.h>
#include <linux/if_vlan.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include "lan9303.h" #include "lan9303.h"
...@@ -1083,21 +1084,27 @@ static void lan9303_adjust_link(struct dsa_switch *ds, int port, ...@@ -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, static int lan9303_port_enable(struct dsa_switch *ds, int port,
struct phy_device *phy) struct phy_device *phy)
{ {
struct dsa_port *dp = dsa_to_port(ds, port);
struct lan9303 *chip = ds->priv; struct lan9303 *chip = ds->priv;
if (!dsa_is_user_port(ds, port)) if (!dsa_port_is_user(dp))
return 0; return 0;
vlan_vid_add(dp->cpu_dp->master, htons(ETH_P_8021Q), port);
return lan9303_enable_processing_port(chip, port); return lan9303_enable_processing_port(chip, port);
} }
static void lan9303_port_disable(struct dsa_switch *ds, int 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; struct lan9303 *chip = ds->priv;
if (!dsa_is_user_port(ds, port)) if (!dsa_port_is_user(dp))
return; return;
vlan_vid_del(dp->cpu_dp->master, htons(ETH_P_8021Q), port);
lan9303_disable_processing_port(chip, port); lan9303_disable_processing_port(chip, port);
lan9303_phy_write(ds, chip->phy_addr_base + port, MII_BMCR, BMCR_PDOWN); lan9303_phy_write(ds, chip->phy_addr_base + port, MII_BMCR, BMCR_PDOWN);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment