Skip to content

Commit 3efc93c

Browse files
viviendavem330
authored andcommitted
net: dsa: mv88e6060: fix switch MAC address
The 88E6060 Ethernet switch always transmits the multicast bit of the switch MAC address as a zero. It re-uses the corresponding bit 8 of the register "Switch MAC Address Register Bytes 0 & 1" for "DiffAddr". If the "DiffAddr" bit is 0, then all ports transmit the same source address. If it is set to 1, then bit 2:0 are used for the port number. The mv88e6060 driver is currently wrongly shifting the MAC address byte 0 by 9. To fix this, shift it by 8 as usual and clear its bit 0. Signed-off-by: Vivien Didelot <[email protected]> Reviewed-by: Woojung Huh <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5903f59 commit 3efc93c

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

drivers/net/dsa/mv88e6060.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,14 @@ static int mv88e6060_setup(struct dsa_switch *ds)
214214

215215
static int mv88e6060_set_addr(struct dsa_switch *ds, u8 *addr)
216216
{
217-
/* Use the same MAC Address as FD Pause frames for all ports */
218-
REG_WRITE(REG_GLOBAL, GLOBAL_MAC_01, (addr[0] << 9) | addr[1]);
217+
u16 val = addr[0] << 8 | addr[1];
218+
219+
/* The multicast bit is always transmitted as a zero, so the switch uses
220+
* bit 8 for "DiffAddr", where 0 means all ports transmit the same SA.
221+
*/
222+
val &= 0xfeff;
223+
224+
REG_WRITE(REG_GLOBAL, GLOBAL_MAC_01, val);
219225
REG_WRITE(REG_GLOBAL, GLOBAL_MAC_23, (addr[2] << 8) | addr[3]);
220226
REG_WRITE(REG_GLOBAL, GLOBAL_MAC_45, (addr[4] << 8) | addr[5]);
221227

0 commit comments

Comments
 (0)