• Russell King's avatar
    net: phy: improve phylib correctness for non-autoneg settings · d0613037
    Russell King authored
    phylib has some undesirable behaviour when forcing a link mode through
    ethtool.  phylib uses this code:
    
    	idx = phy_find_valid(phy_find_setting(phydev->speed, phydev->duplex),
    			features);
    
    to find an index in the settings table.  phy_find_setting() starts at
    index 0, and scans upwards looking for an exact speed and duplex match.
    When it doesn't find it, it returns MAX_NUM_SETTINGS - 1, which is
    10baseT-Half duplex.
    
    phy_find_valid() then scans from the point (and effectively only checks
    one entry) before bailing out, returning MAX_NUM_SETTINGS - 1.
    
    phy_sanitize_settings() then sets ->speed to SPEED_10 and ->duplex to
    DUPLEX_HALF whether or not 10baseT-Half is supported or not.  This goes
    against all the comments against these functions, and 10baseT-Half may
    not even be supported by the hardware.
    
    Rework these functions, introducing a new method of scanning the table.
    There are two modes of lookup that phylib wants: exact, and inexact.
    
    - in exact mode, we return either an exact match or failure
    - in inexact mode, we return an exact match if it exists, a match at
      the highest speed that is not greater than the requested speed
      (ignoring duplex), or failing that, the lowest supported speed, or
      failure.
    
    The biggest difference is that we always check whether the entry is
    supported before further consideration, so all unsupported entries are
    not considered as candidates.
    
    This results in arguably saner behaviour, better matches the comments,
    and is probably what users would expect.
    
    This becomes important as ethernet speeds increase, PHYs exist which do
    not support the 10Mbit speeds, and half-duplex is likely to become
    obsolete - it's already not even an option on 10Gbit and faster links.
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    d0613037
phy.c 35.1 KB