diff options
Diffstat (limited to 'drivers/net/dsa/b53/b53_common.c')
| -rw-r--r-- | drivers/net/dsa/b53/b53_common.c | 40 | 
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c index 907af62846ba..526ba2ab66f1 100644 --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c @@ -342,6 +342,13 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)  	b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, &mgmt);  	mgmt |= B53_MII_DUMB_FWDG_EN;  	b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt); + +	/* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether +	 * frames should be flooded or not. +	 */ +	b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt); +	mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN; +	b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt);  }  static void b53_enable_vlan(struct b53_device *dev, bool enable, @@ -510,10 +517,15 @@ EXPORT_SYMBOL(b53_imp_vlan_setup);  int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)  {  	struct b53_device *dev = ds->priv; -	unsigned int cpu_port = ds->ports[port].cpu_dp->index; +	unsigned int cpu_port;  	int ret = 0;  	u16 pvlan; +	if (!dsa_is_user_port(ds, port)) +		return 0; + +	cpu_port = ds->ports[port].cpu_dp->index; +  	if (dev->ops->irq_enable)  		ret = dev->ops->irq_enable(dev, port);  	if (ret) @@ -1748,6 +1760,31 @@ void b53_br_fast_age(struct dsa_switch *ds, int port)  }  EXPORT_SYMBOL(b53_br_fast_age); +int b53_br_egress_floods(struct dsa_switch *ds, int port, +			 bool unicast, bool multicast) +{ +	struct b53_device *dev = ds->priv; +	u16 uc, mc; + +	b53_read16(dev, B53_CTRL_PAGE, B53_UC_FWD_EN, &uc); +	if (unicast) +		uc |= BIT(port); +	else +		uc &= ~BIT(port); +	b53_write16(dev, B53_CTRL_PAGE, B53_UC_FWD_EN, uc); + +	b53_read16(dev, B53_CTRL_PAGE, B53_MC_FWD_EN, &mc); +	if (multicast) +		mc |= BIT(port); +	else +		mc &= ~BIT(port); +	b53_write16(dev, B53_CTRL_PAGE, B53_MC_FWD_EN, mc); + +	return 0; + +} +EXPORT_SYMBOL(b53_br_egress_floods); +  static bool b53_possible_cpu_port(struct dsa_switch *ds, int port)  {  	/* Broadcom switches will accept enabling Broadcom tags on the @@ -1948,6 +1985,7 @@ static const struct dsa_switch_ops b53_switch_ops = {  	.port_bridge_leave	= b53_br_leave,  	.port_stp_state_set	= b53_br_set_stp_state,  	.port_fast_age		= b53_br_fast_age, +	.port_egress_floods	= b53_br_egress_floods,  	.port_vlan_filtering	= b53_vlan_filtering,  	.port_vlan_prepare	= b53_vlan_prepare,  	.port_vlan_add		= b53_vlan_add,  |