• Heiner Kallweit's avatar
    net: dsa: mv88e6xxx: prevent interrupt storm caused by mv88e6390x_port_set_cmode · 4d8f5df0
    Heiner Kallweit authored
    [ Upstream commit ed8fe202 ]
    
    When debugging another issue I faced an interrupt storm in this
    driver (88E6390, port 9 in SGMII mode), consisting of alternating
    link-up / link-down interrupts. Analysis showed that the driver
    wanted to set a cmode that was set already. But so far
    mv88e6390x_port_set_cmode() doesn't check this and powers down
    SERDES, what causes the link to break, and eventually results in
    the described interrupt storm.
    
    Fix this by checking whether the cmode actually changes. We want
    that the very first call to mv88e6390x_port_set_cmode() always
    configures the registers, therefore initialize port.cmode with
    a value that is different from any supported cmode value.
    We have to take care that we only init the ports cmode once
    chip->info->num_ports is set.
    
    v2:
    - add small helper and init the number of actual ports only
    
    Fixes: 364e9d77 ("net: dsa: mv88e6xxx: Power on/off SERDES on cmode change")
    Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4d8f5df0
port.c 25.6 KB