Skip to content
  • Timur Tabi's avatar
    net: phy: phy drivers should not set SUPPORTED_[Asym_]Pause · 529ed127
    Timur Tabi authored
    Instead of having individual PHY drivers set the SUPPORTED_Pause and
    SUPPORTED_Asym_Pause flags, phylib itself should set those flags,
    unless there is a hardware erratum or other special case.  During
    autonegotiation, the PHYs will determine whether to enable pause
    frame support.
    
    Pause frames are a feature that is supported by the MAC.  It is the MAC
    that generates the frames and that processes them.  The PHY can only be
    configured to allow them to pass through.
    
    This commit also effectively reverts the recently applied c7a61319
    
    
    ("net: phy: dp83848: Support ethernet pause frames").
    
    So the new process is:
    
    1) Unless the PHY driver overrides it, phylib sets the SUPPORTED_Pause
    and SUPPORTED_AsymPause bits in phydev->supported.  This indicates that
    the PHY supports pause frames.
    
    2) The MAC driver checks phydev->supported before it calls phy_start().
    If (SUPPORTED_Pause | SUPPORTED_AsymPause) is set, then the MAC driver
    sets those bits in phydev->advertising, if it wants to enable pause
    frame support.
    
    3) When the link state changes, the MAC driver checks phydev->pause and
    phydev->asym_pause,  If the bits are set, then it enables the corresponding
    features in the MAC.  The algorithm is:
    
    	if (phydev->pause)
    		The MAC should be programmed to receive and honor
                    pause frames it receives, i.e. enable receive flow control.
    
    	if (phydev->pause != phydev->asym_pause)
    		The MAC should be programmed to transmit pause
    		frames when needed, i.e. enable transmit flow control.
    
    Signed-off-by: default avatarTimur Tabi <timur@codeaurora.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    529ed127