mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
net: ethernet: Add helper to determine if pause configuration is supported
Rather than have MAC drivers open code the test, add a helper in phylib. This will help when we change the type of phydev->supported. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0c122405d4
commit
22b7d29926
6 changed files with 26 additions and 12 deletions
|
@ -312,9 +312,7 @@ static int xgene_set_pauseparam(struct net_device *ndev,
|
||||||
if (!phydev)
|
if (!phydev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!(phydev->supported & SUPPORTED_Pause) ||
|
if (!phy_validate_pause(phydev, pp))
|
||||||
(!(phydev->supported & SUPPORTED_Asym_Pause) &&
|
|
||||||
pp->rx_pause != pp->tx_pause))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
pdata->pause_autoneg = pp->autoneg;
|
pdata->pause_autoneg = pp->autoneg;
|
||||||
|
|
|
@ -12496,9 +12496,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
||||||
|
|
||||||
phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
|
phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
|
||||||
|
|
||||||
if (!(phydev->supported & SUPPORTED_Pause) ||
|
if (!phy_validate_pause(phydev, epause))
|
||||||
(!(phydev->supported & SUPPORTED_Asym_Pause) &&
|
|
||||||
(epause->rx_pause != epause->tx_pause)))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
tp->link_config.flowctrl = 0;
|
tp->link_config.flowctrl = 0;
|
||||||
|
|
|
@ -194,9 +194,7 @@ static int dpaa_set_pauseparam(struct net_device *net_dev,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(phydev->supported & SUPPORTED_Pause) ||
|
if (!phy_validate_pause(phydev, epause))
|
||||||
(!(phydev->supported & SUPPORTED_Asym_Pause) &&
|
|
||||||
(epause->rx_pause != epause->tx_pause)))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* The MAC should know how to handle PAUSE frame autonegotiation before
|
/* The MAC should know how to handle PAUSE frame autonegotiation before
|
||||||
|
|
|
@ -507,9 +507,7 @@ static int gfar_spauseparam(struct net_device *dev,
|
||||||
if (!phydev)
|
if (!phydev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!(phydev->supported & SUPPORTED_Pause) ||
|
if (!phy_validate_pause(phydev, epause))
|
||||||
(!(phydev->supported & SUPPORTED_Asym_Pause) &&
|
|
||||||
(epause->rx_pause != epause->tx_pause)))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
priv->rx_pause_en = priv->tx_pause_en = 0;
|
priv->rx_pause_en = priv->tx_pause_en = 0;
|
||||||
|
|
|
@ -1863,6 +1863,26 @@ void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(phy_set_asym_pause);
|
EXPORT_SYMBOL(phy_set_asym_pause);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* phy_validate_pause - Test if the PHY/MAC support the pause configuration
|
||||||
|
* @phydev: phy_device struct
|
||||||
|
* @pp: requested pause configuration
|
||||||
|
*
|
||||||
|
* Description: Test if the PHY/MAC combination supports the Pause
|
||||||
|
* configuration the user is requesting. Returns True if it is
|
||||||
|
* supported, false otherwise.
|
||||||
|
*/
|
||||||
|
bool phy_validate_pause(struct phy_device *phydev,
|
||||||
|
struct ethtool_pauseparam *pp)
|
||||||
|
{
|
||||||
|
if (!(phydev->supported & SUPPORTED_Pause) ||
|
||||||
|
(!(phydev->supported & SUPPORTED_Asym_Pause) &&
|
||||||
|
pp->rx_pause != pp->tx_pause))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(phy_validate_pause);
|
||||||
|
|
||||||
static void of_set_phy_supported(struct phy_device *phydev)
|
static void of_set_phy_supported(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
struct device_node *node = phydev->mdio.dev.of_node;
|
struct device_node *node = phydev->mdio.dev.of_node;
|
||||||
|
|
|
@ -1055,6 +1055,8 @@ void phy_support_asym_pause(struct phy_device *phydev);
|
||||||
void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx,
|
void phy_set_sym_pause(struct phy_device *phydev, bool rx, bool tx,
|
||||||
bool autoneg);
|
bool autoneg);
|
||||||
void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx);
|
void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx);
|
||||||
|
bool phy_validate_pause(struct phy_device *phydev,
|
||||||
|
struct ethtool_pauseparam *pp);
|
||||||
|
|
||||||
int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
|
int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
|
||||||
int (*run)(struct phy_device *));
|
int (*run)(struct phy_device *));
|
||||||
|
|
Loading…
Reference in a new issue