• Arınç ÜNAL's avatar
    net: dsa: mt7530: disable EEE abilities on failure on MT7531 and MT7988 · 385c22ee
    Arınç ÜNAL authored
    The MT7531_FORCE_EEE1G and MT7531_FORCE_EEE100 bits let the
    PMCR_FORCE_EEE1G and PMCR_FORCE_EEE100 bits determine the 1G/100 EEE
    abilities of the MAC. If MT7531_FORCE_EEE1G and MT7531_FORCE_EEE100 are
    unset, the abilities are left to be determined by PHY auto polling.
    
    The commit 40b5d2f1 ("net: dsa: mt7530: Add support for EEE features")
    made it so that the PMCR_FORCE_EEE1G and PMCR_FORCE_EEE100 bits are set on
    mt753x_phylink_mac_link_up(). But it did not set the MT7531_FORCE_EEE1G and
    MT7531_FORCE_EEE100 bits. Because of this, the EEE abilities will be
    determined by PHY auto polling, regardless of the result of phy_init_eee().
    
    Define these bits and add them to the MT7531_FORCE_MODE mask which is set
    in mt7531_setup_common(). With this, there won't be any EEE abilities set
    when phy_init_eee() returns a negative value.
    
    Thanks to Russell for explaining when phy_init_eee() could return a
    negative value below.
    
    Looking at phy_init_eee(), it could return a negative value when:
    
    1. phydev->drv is NULL
    2. if genphy_c45_eee_is_active() returns negative
    3. if genphy_c45_eee_is_active() returns zero, it returns -EPROTONOSUPPORT
    4. if phy_set_bits_mmd() fails (e.g. communication error with the PHY)
    
    If we then look at genphy_c45_eee_is_active(), then:
    
    genphy_c45_read_eee_adv() and genphy_c45_read_eee_lpa() propagate their
    non-zero return values, otherwise this function returns zero or positive
    integer.
    
    If we then look at genphy_c45_read_eee_adv(), then a failure of
    phy_read_mmd() would cause a negative value to be returned.
    
    Looking at genphy_c45_read_eee_lpa(), the same is true.
    
    So, it can be summarised as:
    
    - phydev->drv is NULL
    - there is a communication error accessing the PHY
    - EEE is not active
    
    otherwise, it returns zero on success.
    
    If one wishes to determine whether an error occurred vs EEE not being
    supported through negotiation for the negotiated speed, if it returns
    -EPROTONOSUPPORT in the latter case. Other error codes mean either the
    driver has been unloaded or communication error.
    
    In conclusion, determining the EEE abilities by PHY auto polling shouldn't
    result in having any EEE abilities enabled, when one of the last two
    situations in the summary happens. And it seems that if phydev->drv is
    NULL, there would be bigger problems with the device than a broken link. So
    this is not a bugfix.
    Signed-off-by: default avatarArınç ÜNAL <arinc.unal@arinc9.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    385c22ee
mt7530.h 25.4 KB