Commit 22b7d299 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller

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: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0c122405
...@@ -312,9 +312,7 @@ static int xgene_set_pauseparam(struct net_device *ndev, ...@@ -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 ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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); ...@@ -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 *));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment