• Russell King's avatar
    net: dsa: actually force the speed on the CPU port · 53adc9e8
    Russell King authored
    Commit 54d792f2 ("net: dsa: Centralise global and port setup
    code into mv88e6xxx.") merged in the 4.2 merge window broke the link
    speed forcing for the CPU port of Marvell DSA switches.  The original
    code was:
    
            /* MAC Forcing register: don't force link, speed, duplex
             * or flow control state to any particular values on physical
             * ports, but force the CPU port and all DSA ports to 1000 Mb/s
             * full duplex.
             */
            if (dsa_is_cpu_port(ds, p) || ds->dsa_port_mask & (1 << p))
                    REG_WRITE(addr, 0x01, 0x003e);
            else
                    REG_WRITE(addr, 0x01, 0x0003);
    
    but the new code does a read-modify-write:
    
                    reg = _mv88e6xxx_reg_read(ds, REG_PORT(port), PORT_PCS_CTRL);
                    if (dsa_is_cpu_port(ds, port) ||
                        ds->dsa_port_mask & (1 << port)) {
                            reg |= PORT_PCS_CTRL_FORCE_LINK |
                                    PORT_PCS_CTRL_LINK_UP |
                                    PORT_PCS_CTRL_DUPLEX_FULL |
                                    PORT_PCS_CTRL_FORCE_DUPLEX;
                            if (mv88e6xxx_6065_family(ds))
                                    reg |= PORT_PCS_CTRL_100;
                            else
                                    reg |= PORT_PCS_CTRL_1000;
    
    The link speed in the PCS control register is a two bit field.  Forcing
    the link speed in this way doesn't ensure that the bit field is set to
    the correct value - on the hardware I have here, the speed bitfield
    remains set to 0x03, resulting in the speed not being forced to gigabit.
    
    We must clear both bits before forcing the link speed.
    
    Fixes: 54d792f2 ("net: dsa: Centralise global and port setup code into mv88e6xxx.")
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    Acked-by: default avatarAndrew Lunn <andrew@lunn.ch>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    53adc9e8
mv88e6xxx.c 69.5 KB