diff options
Diffstat (limited to 'net/dsa/mv88e6131.c')
| -rw-r--r-- | net/dsa/mv88e6131.c | 26 | 
1 files changed, 21 insertions, 5 deletions
diff --git a/net/dsa/mv88e6131.c b/net/dsa/mv88e6131.c index 3da418894ef..45f7411e90b 100644 --- a/net/dsa/mv88e6131.c +++ b/net/dsa/mv88e6131.c @@ -207,8 +207,15 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  	 * mode, but do not enable forwarding of unknown unicasts.  	 */  	val = 0x0433; -	if (p == dsa_upstream_port(ds)) +	if (p == dsa_upstream_port(ds)) {  		val |= 0x0104; +		/* +		 * On 6085, unknown multicast forward is controlled +		 * here rather than in Port Control 2 register. +		 */ +		if (ps->id == ID_6085) +			val |= 0x0008; +	}  	if (ds->dsa_port_mask & (1 << p))  		val |= 0x0100;  	REG_WRITE(addr, 0x04, val); @@ -251,10 +258,19 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p)  	 * If this is the upstream port for this switch, enable  	 * forwarding of unknown multicast addresses.  	 */ -	val = 0x0080 | dsa_upstream_port(ds); -	if (p == dsa_upstream_port(ds)) -		val |= 0x0040; -	REG_WRITE(addr, 0x08, val); +	if (ps->id == ID_6085) +		/* +		 * on 6085, bits 3:0 are reserved, bit 6 control ARP +		 * mirroring, and multicast forward is handled in +		 * Port Control register. +		 */ +		REG_WRITE(addr, 0x08, 0x0080); +	else { +		val = 0x0080 | dsa_upstream_port(ds); +		if (p == dsa_upstream_port(ds)) +			val |= 0x0040; +		REG_WRITE(addr, 0x08, val); +	}  	/*  	 * Rate Control: disable ingress rate limiting.  |