• Serge Semin's avatar
    net: stmmac: Fix IP-cores specific MAC capabilities · 9cb54af2
    Serge Semin authored
    Here is the list of the MAC capabilities specific to the particular DW MAC
    IP-cores currently supported by the driver:
    
    DW MAC100: MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
    	   MAC_10 | MAC_100
    
    DW GMAC:  MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
              MAC_10 | MAC_100 | MAC_1000
    
    Allwinner sun8i MAC: MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
                         MAC_10 | MAC_100 | MAC_1000
    
    DW QoS Eth: MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
                MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD
    if there is more than 1 active Tx/Rx queues:
    	   MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
               MAC_10FD | MAC_100FD | MAC_1000FD | MAC_2500FD
    
    DW XGMAC: MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
              MAC_1000FD | MAC_2500FD | MAC_5000FD | MAC_10000FD
    
    DW XLGMAC: MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
              MAC_1000FD | MAC_2500FD | MAC_5000FD | MAC_10000FD |
              MAC_25000FD | MAC_40000FD | MAC_50000FD | MAC_100000FD
    
    As you can see there are only two common capabilities:
    MAC_ASYM_PAUSE | MAC_SYM_PAUSE.
    Meanwhile what is currently implemented defines 10/100/1000 link speeds
    for all IP-cores, which is definitely incorrect for DW MAC100, DW XGMAC
    and DW XLGMAC devices.
    
    Seeing the flow-control is implemented as a callback for each MAC IP-core
    (see dwmac100_flow_ctrl(), dwmac1000_flow_ctrl(), sun8i_dwmac_flow_ctrl(),
    etc) and since the MAC-specific setup() method is supposed to be called
    for each available DW MAC-based device, the capabilities initialization
    can be freely moved to these setup() functions, thus correctly setting up
    the MAC-capabilities for each IP-core (including the Allwinner Sun8i). A
    new stmmac_link::caps field was specifically introduced for that so to
    have all link-specific info preserved in a single structure.
    
    Note the suggested change fixes three earlier commits at a time. The
    commit 5b0d7d7d ("net: stmmac: Add the missing speeds that XGMAC
    supports") permitted the 10-100 link speeds and 1G half-duplex mode for DW
    XGMAC IP-core even though it doesn't support them. The commit df7699c7
    ("net: stmmac: Do not cut down 1G modes") incorrectly added the MAC1000
    capability to the DW MAC100 IP-core. Similarly to the DW XGMAC the commit
    8a880936 ("net: stmmac: Add XLGMII support") incorrectly permitted the
    10-100 link speeds and 1G half-duplex mode for DW XLGMAC IP-core.
    
    Fixes: 5b0d7d7d ("net: stmmac: Add the missing speeds that XGMAC supports")
    Fixes: df7699c7 ("net: stmmac: Do not cut down 1G modes")
    Fixes: 8a880936 ("net: stmmac: Add XLGMII support")
    Suggested-by: default avatarRussell King (Oracle) <linux@armlinux.org.uk>
    Signed-off-by: default avatarSerge Semin <fancer.lancer@gmail.com>
    Reviewed-by: default avatarRomain Gantois <romain.gantois@bootlin.com>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    9cb54af2
stmmac_main.c 221 KB