On 29.04.2019 23:52, Andrew Lunn wrote: >> @@ -2078,6 +2089,11 @@ EXPORT_SYMBOL(phy_set_sym_pause); >> void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx) >> { >> __ETHTOOL_DECLARE_LINK_MODE_MASK(oldadv); >> + bool asym_pause_supported; >> + >> + asym_pause_supported = >> + linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, >> + phydev->supported); >> >> linkmode_copy(oldadv, phydev->advertising); >> >> @@ -2086,14 +2102,14 @@ void phy_set_asym_pause(struct phy_device *phydev, >> bool rx, bool tx) >> linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, >> phydev->advertising); >> >> - if (rx) { >> + if (rx && asym_pause_supported) { >> linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, >> phydev->advertising); >> linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, >> phydev->advertising); >> } >> >> - if (tx) >> + if (tx && asym_pause_supported) >> linkmode_change_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, >> phydev->advertising); > > Hi Heiner > Hi Andrew,
> If the PHY only supports Pause, not Asym Pause, i wounder if we should > fall back to Pause here? > I wasn't sure about whether a silent fallback is the expected behavior. Also open is whether we can rely on a set_pause callback having called phy_validate_pause() before. Another option could be to change the return type to int and return an error like -EOPNOTSUPP if the requested mode isn't supported. > Andrew > Heiner