net: ethernet: Use phy_set_max_speed() to limit advertised speed

Many Ethernet MAC drivers want to limit the PHY to only advertise a
maximum speed of 100Mbs or 1Gbps. Rather than using a mask, make use
of the helper function phy_set_max_speed().

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:
Andrew Lunn
2018-09-12 01:53:11 +02:00
committed by David S. Miller
parent 15d8daf7bc
commit 58056c1e1b
28 changed files with 45 additions and 108 deletions

View File

@@ -377,9 +377,7 @@ static int ax_mii_probe(struct net_device *dev)
return ret; return ret;
} }
/* mask with MAC supported features */ phy_set_max_speed(phy_dev, SPEED_100);
phy_dev->supported &= PHY_BASIC_FEATURES;
phy_dev->advertising = phy_dev->supported;
netdev_info(dev, "PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n", netdev_info(dev, "PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
phy_dev->drv->name, phydev_name(phy_dev), phy_dev->irq); phy_dev->drv->name, phydev_name(phy_dev), phy_dev->irq);

View File

@@ -1279,9 +1279,9 @@ static int greth_mdio_probe(struct net_device *dev)
} }
if (greth->gbit_mac) if (greth->gbit_mac)
phy->supported &= PHY_GBIT_FEATURES; phy_set_max_speed(phy, SPEED_1000);
else else
phy->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phy, SPEED_100);
phy->advertising = phy->supported; phy->advertising = phy->supported;

View File

@@ -3258,19 +3258,11 @@ static int et131x_mii_probe(struct net_device *netdev)
return PTR_ERR(phydev); return PTR_ERR(phydev);
} }
phydev->supported &= (SUPPORTED_10baseT_Half | phy_set_max_speed(phydev, SPEED_100);
SUPPORTED_10baseT_Full |
SUPPORTED_100baseT_Half |
SUPPORTED_100baseT_Full |
SUPPORTED_Autoneg |
SUPPORTED_MII |
SUPPORTED_TP);
if (adapter->pdev->device != ET131X_PCI_DEVICE_ID_FAST) if (adapter->pdev->device != ET131X_PCI_DEVICE_ID_FAST)
phydev->supported |= SUPPORTED_1000baseT_Half | phy_set_max_speed(phydev, SPEED_1000);
SUPPORTED_1000baseT_Full;
phydev->advertising = phydev->supported;
phydev->autoneg = AUTONEG_ENABLE; phydev->autoneg = AUTONEG_ENABLE;
phy_attached_info(phydev); phy_attached_info(phydev);

View File

@@ -172,8 +172,7 @@ static int emac_mdio_probe(struct net_device *dev)
} }
/* mask with MAC supported features */ /* mask with MAC supported features */
phydev->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phydev, SPEED_100);
phydev->advertising = phydev->supported;
db->link = 0; db->link = 0;
db->speed = 0; db->speed = 0;

View File

@@ -835,13 +835,10 @@ static int init_phy(struct net_device *dev)
} }
/* Stop Advertising 1000BASE Capability if interface is not GMII /* Stop Advertising 1000BASE Capability if interface is not GMII
* Note: Checkpatch throws CHECKs for the camel case defines below,
* it's ok to ignore.
*/ */
if ((priv->phy_iface == PHY_INTERFACE_MODE_MII) || if ((priv->phy_iface == PHY_INTERFACE_MODE_MII) ||
(priv->phy_iface == PHY_INTERFACE_MODE_RMII)) (priv->phy_iface == PHY_INTERFACE_MODE_RMII))
phydev->advertising &= ~(SUPPORTED_1000baseT_Half | phy_set_max_speed(phydev, SPEED_100);
SUPPORTED_1000baseT_Full);
/* Broken HW is sometimes missing the pull-up resistor on the /* Broken HW is sometimes missing the pull-up resistor on the
* MDIO line, which results in reads to non-existent devices returning * MDIO line, which results in reads to non-existent devices returning

View File

@@ -564,17 +564,7 @@ static int au1000_mii_probe(struct net_device *dev)
return PTR_ERR(phydev); return PTR_ERR(phydev);
} }
/* mask with MAC supported features */ phy_set_max_speed(phydev, SPEED_100);
phydev->supported &= (SUPPORTED_10baseT_Half
| SUPPORTED_10baseT_Full
| SUPPORTED_100baseT_Half
| SUPPORTED_100baseT_Full
| SUPPORTED_Autoneg
/* | SUPPORTED_Pause | SUPPORTED_Asym_Pause */
| SUPPORTED_MII
| SUPPORTED_TP);
phydev->advertising = phydev->supported;
aup->old_link = 0; aup->old_link = 0;
aup->old_speed = 0; aup->old_speed = 0;

View File

@@ -890,14 +890,8 @@ static int bcm_enet_open(struct net_device *dev)
} }
/* mask with MAC supported features */ /* mask with MAC supported features */
phydev->supported &= (SUPPORTED_10baseT_Half | phydev->supported |= SUPPORTED_Pause;
SUPPORTED_10baseT_Full | phy_set_max_speed(phydev, SPEED_100);
SUPPORTED_100baseT_Half |
SUPPORTED_100baseT_Full |
SUPPORTED_Autoneg |
SUPPORTED_Pause |
SUPPORTED_MII);
phydev->advertising = phydev->supported;
if (priv->pause_auto && priv->pause_rx && priv->pause_tx) if (priv->pause_auto && priv->pause_rx && priv->pause_tx)
phydev->advertising |= SUPPORTED_Pause; phydev->advertising |= SUPPORTED_Pause;

View File

@@ -214,7 +214,7 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
case PHY_INTERFACE_MODE_MII: case PHY_INTERFACE_MODE_MII:
phy_name = "external MII"; phy_name = "external MII";
phydev->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phydev, SPEED_100);
bcmgenet_sys_writel(priv, bcmgenet_sys_writel(priv,
PORT_MODE_EXT_EPHY, SYS_PORT_CTRL); PORT_MODE_EXT_EPHY, SYS_PORT_CTRL);
break; break;

View File

@@ -2357,15 +2357,8 @@ static int sbmac_mii_probe(struct net_device *dev)
} }
/* Remove any features not supported by the controller */ /* Remove any features not supported by the controller */
phy_dev->supported &= SUPPORTED_10baseT_Half | phy_set_max_speed(phy_dev, SPEED_1000);
SUPPORTED_10baseT_Full | phy_dev->supported |= SUPPORTED_Pause |
SUPPORTED_100baseT_Half |
SUPPORTED_100baseT_Full |
SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full |
SUPPORTED_Autoneg |
SUPPORTED_MII |
SUPPORTED_Pause |
SUPPORTED_Asym_Pause; SUPPORTED_Asym_Pause;
phy_attached_info(phy_dev); phy_attached_info(phy_dev);

View File

@@ -2122,15 +2122,15 @@ static int tg3_phy_init(struct tg3 *tp)
case PHY_INTERFACE_MODE_GMII: case PHY_INTERFACE_MODE_GMII:
case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII:
if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) { if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
phydev->supported &= (PHY_GBIT_FEATURES | phy_set_max_speed(phydev, SPEED_1000);
SUPPORTED_Pause | phydev->supported &= (SUPPORTED_Pause |
SUPPORTED_Asym_Pause); SUPPORTED_Asym_Pause);
break; break;
} }
/* fallthru */ /* fallthru */
case PHY_INTERFACE_MODE_MII: case PHY_INTERFACE_MODE_MII:
phydev->supported &= (PHY_BASIC_FEATURES | phy_set_max_speed(phydev, SPEED_100);
SUPPORTED_Pause | phydev->supported &= (SUPPORTED_Pause |
SUPPORTED_Asym_Pause); SUPPORTED_Asym_Pause);
break; break;
default: default:

View File

@@ -544,9 +544,9 @@ static int macb_mii_probe(struct net_device *dev)
/* mask with MAC supported features */ /* mask with MAC supported features */
if (macb_is_gem(bp) && bp->caps & MACB_CAPS_GIGABIT_MODE_AVAILABLE) if (macb_is_gem(bp) && bp->caps & MACB_CAPS_GIGABIT_MODE_AVAILABLE)
phydev->supported &= PHY_GBIT_FEATURES; phy_set_max_speed(phydev, SPEED_1000);
else else
phydev->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phydev, SPEED_100);
if (bp->caps & MACB_CAPS_NO_GIGABIT_HALF) if (bp->caps & MACB_CAPS_NO_GIGABIT_HALF)
phydev->supported &= ~SUPPORTED_1000baseT_Half; phydev->supported &= ~SUPPORTED_1000baseT_Half;

View File

@@ -372,7 +372,7 @@ static int gmac_setup_phy(struct net_device *netdev)
return -ENODEV; return -ENODEV;
netdev->phydev = phy; netdev->phydev = phy;
phy->supported &= PHY_GBIT_FEATURES; phy_set_max_speed(phy, SPEED_1000);
phy->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause; phy->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause;
phy->advertising = phy->supported; phy->advertising = phy->supported;

View File

@@ -284,9 +284,9 @@ static int dnet_mii_probe(struct net_device *dev)
/* mask with MAC supported features */ /* mask with MAC supported features */
if (bp->capabilities & DNET_HAS_GIGABIT) if (bp->capabilities & DNET_HAS_GIGABIT)
phydev->supported &= PHY_GBIT_FEATURES; phy_set_max_speed(phydev, SPEED_1000);
else else
phydev->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phydev, SPEED_100);
phydev->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause; phydev->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause;

View File

@@ -721,10 +721,7 @@ static int ethoc_mdio_probe(struct net_device *dev)
return err; return err;
} }
phy->advertising &= ~(ADVERTISED_1000baseT_Full | phy_set_max_speed(phy, SPEED_100);
ADVERTISED_1000baseT_Half);
phy->supported &= ~(SUPPORTED_1000baseT_Full |
SUPPORTED_1000baseT_Half);
return 0; return 0;
} }

View File

@@ -1946,14 +1946,14 @@ static int fec_enet_mii_probe(struct net_device *ndev)
/* mask with MAC supported features */ /* mask with MAC supported features */
if (fep->quirks & FEC_QUIRK_HAS_GBIT) { if (fep->quirks & FEC_QUIRK_HAS_GBIT) {
phy_dev->supported &= PHY_GBIT_FEATURES; phy_set_max_speed(phy_dev, 1000);
phy_dev->supported &= ~SUPPORTED_1000baseT_Half; phy_dev->supported &= ~SUPPORTED_1000baseT_Half;
#if !defined(CONFIG_M5272) #if !defined(CONFIG_M5272)
phy_dev->supported |= SUPPORTED_Pause; phy_dev->supported |= SUPPORTED_Pause;
#endif #endif
} }
else else
phy_dev->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phy_dev, 100);
phy_dev->advertising = phy_dev->supported; phy_dev->advertising = phy_dev->supported;

View File

@@ -1742,12 +1742,7 @@ static int init_phy(struct net_device *dev)
if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII) if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII)
uec_configure_serdes(dev); uec_configure_serdes(dev);
phydev->supported &= (SUPPORTED_MII | phy_set_max_speed(phydev, SPEED_100);
SUPPORTED_Autoneg |
ADVERTISED_10baseT_Half |
ADVERTISED_10baseT_Full |
ADVERTISED_100baseT_Half |
ADVERTISED_100baseT_Full);
if (priv->max_speed == SPEED_1000) if (priv->max_speed == SPEED_1000)
phydev->supported |= ADVERTISED_1000baseT_Full; phydev->supported |= ADVERTISED_1000baseT_Full;

View File

@@ -364,15 +364,8 @@ ltq_etop_mdio_probe(struct net_device *dev)
return PTR_ERR(phydev); return PTR_ERR(phydev);
} }
phydev->supported &= (SUPPORTED_10baseT_Half phy_set_max_speed(phydev, SPEED_100);
| SUPPORTED_10baseT_Full
| SUPPORTED_100baseT_Half
| SUPPORTED_100baseT_Full
| SUPPORTED_Autoneg
| SUPPORTED_MII
| SUPPORTED_TP);
phydev->advertising = phydev->supported;
phy_attached_info(phydev); phy_attached_info(phydev);
return 0; return 0;

View File

@@ -359,8 +359,8 @@ static int mtk_phy_connect(struct net_device *dev)
dev->phydev->supported |= dev->phydev->supported |=
SUPPORTED_Pause | SUPPORTED_Asym_Pause; SUPPORTED_Pause | SUPPORTED_Asym_Pause;
dev->phydev->supported &= PHY_GBIT_FEATURES | SUPPORTED_Pause | phy_set_max_speed(dev->phydev, SPEED_1000);
SUPPORTED_Asym_Pause; dev->phydev->supported &= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
dev->phydev->advertising = dev->phydev->supported | dev->phydev->advertising = dev->phydev->supported |
ADVERTISED_Autoneg; ADVERTISED_Autoneg;
phy_start_aneg(dev->phydev); phy_start_aneg(dev->phydev);

View File

@@ -797,8 +797,7 @@ static int lpc_mii_probe(struct net_device *ndev)
return PTR_ERR(phydev); return PTR_ERR(phydev);
} }
/* mask with MAC supported features */ phy_set_max_speed(phydev, SPEED_100);
phydev->supported &= PHY_BASIC_FEATURES;
phydev->advertising = phydev->supported; phydev->advertising = phydev->supported;

View File

@@ -1024,16 +1024,8 @@ static int r6040_mii_probe(struct net_device *dev)
return PTR_ERR(phydev); return PTR_ERR(phydev);
} }
/* mask with MAC supported features */ phy_set_max_speed(phydev, SPEED_100);
phydev->supported &= (SUPPORTED_10baseT_Half
| SUPPORTED_10baseT_Full
| SUPPORTED_100baseT_Half
| SUPPORTED_100baseT_Full
| SUPPORTED_Autoneg
| SUPPORTED_MII
| SUPPORTED_TP);
phydev->advertising = phydev->supported;
lp->old_link = 0; lp->old_link = 0;
lp->old_duplex = -1; lp->old_duplex = -1;

View File

@@ -298,8 +298,8 @@ static int sxgbe_init_phy(struct net_device *ndev)
/* Stop Advertising 1000BASE Capability if interface is not GMII */ /* Stop Advertising 1000BASE Capability if interface is not GMII */
if ((phy_iface == PHY_INTERFACE_MODE_MII) || if ((phy_iface == PHY_INTERFACE_MODE_MII) ||
(phy_iface == PHY_INTERFACE_MODE_RMII)) (phy_iface == PHY_INTERFACE_MODE_RMII))
phydev->advertising &= ~(SUPPORTED_1000baseT_Half | phy_set_max_speed(phydev, SPEED_1000);
SUPPORTED_1000baseT_Full);
if (phydev->phy_id == 0) { if (phydev->phy_id == 0) {
phy_disconnect(phydev); phy_disconnect(phydev);
return -ENODEV; return -ENODEV;

View File

@@ -1048,9 +1048,10 @@ static int smsc911x_mii_probe(struct net_device *dev)
phy_attached_info(phydev); phy_attached_info(phydev);
phy_set_max_speed(phydev, SPEED_100);
/* mask with MAC supported features */ /* mask with MAC supported features */
phydev->supported &= (PHY_BASIC_FEATURES | SUPPORTED_Pause | phydev->supported &= (SUPPORTED_Pause | SUPPORTED_Asym_Pause);
SUPPORTED_Asym_Pause);
phydev->advertising = phydev->supported; phydev->advertising = phydev->supported;
pdata->last_duplex = -1; pdata->last_duplex = -1;

View File

@@ -1135,9 +1135,10 @@ static int smsc9420_mii_probe(struct net_device *dev)
return PTR_ERR(phydev); return PTR_ERR(phydev);
} }
phy_set_max_speed(phydev, SPEED_100);
/* mask with MAC supported features */ /* mask with MAC supported features */
phydev->supported &= (PHY_BASIC_FEATURES | SUPPORTED_Pause | phydev->supported &= (SUPPORTED_Pause | SUPPORTED_Asym_Pause);
SUPPORTED_Asym_Pause);
phydev->advertising = phydev->supported; phydev->advertising = phydev->supported;
phy_attached_info(phydev); phy_attached_info(phydev);

View File

@@ -1223,10 +1223,8 @@ static int ave_init(struct net_device *ndev)
phy_ethtool_get_wol(phydev, &wol); phy_ethtool_get_wol(phydev, &wol);
device_set_wakeup_capable(&ndev->dev, !!wol.supported); device_set_wakeup_capable(&ndev->dev, !!wol.supported);
if (!phy_interface_is_rgmii(phydev)) { if (!phy_interface_is_rgmii(phydev))
phydev->supported &= ~PHY_GBIT_FEATURES; phy_set_max_speed(phydev, SPEED_100);
phydev->supported |= PHY_BASIC_FEATURES;
}
phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
phy_attached_info(phydev); phy_attached_info(phydev);

View File

@@ -987,8 +987,7 @@ static int stmmac_init_phy(struct net_device *dev)
if ((interface == PHY_INTERFACE_MODE_MII) || if ((interface == PHY_INTERFACE_MODE_MII) ||
(interface == PHY_INTERFACE_MODE_RMII) || (interface == PHY_INTERFACE_MODE_RMII) ||
(max_speed < 1000 && max_speed > 0)) (max_speed < 1000 && max_speed > 0))
phydev->advertising &= ~(SUPPORTED_1000baseT_Half | phy_set_max_speed(phydev, SPEED_100);
SUPPORTED_1000baseT_Full);
/* /*
* Half-duplex mode not supported with multiqueue * Half-duplex mode not supported with multiqueue

View File

@@ -628,7 +628,7 @@ static int tc_mii_probe(struct net_device *dev)
phy_attached_info(phydev); phy_attached_info(phydev);
/* mask with MAC supported features */ /* mask with MAC supported features */
phydev->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phydev, SPEED_100);
dropmask = 0; dropmask = 0;
if (options.speed == 10) if (options.speed == 10)
dropmask |= SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full; dropmask |= SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full;

View File

@@ -941,8 +941,7 @@ static int xemaclite_open(struct net_device *dev)
} }
/* EmacLite doesn't support giga-bit speeds */ /* EmacLite doesn't support giga-bit speeds */
lp->phy_dev->supported &= (PHY_BASIC_FEATURES); phy_set_max_speed(lp->phy_dev, SPEED_100);
lp->phy_dev->advertising = lp->phy_dev->supported;
/* Don't advertise 1000BASE-T Full/Half duplex speeds */ /* Don't advertise 1000BASE-T Full/Half duplex speeds */
phy_write(lp->phy_dev, MII_CTRL1000, 0); phy_write(lp->phy_dev, MII_CTRL1000, 0);

View File

@@ -112,7 +112,7 @@ static void phy_init(struct mtk_eth *eth, struct mtk_mac *mac,
phy->autoneg = AUTONEG_ENABLE; phy->autoneg = AUTONEG_ENABLE;
phy->speed = 0; phy->speed = 0;
phy->duplex = 0; phy->duplex = 0;
phy->supported &= PHY_BASIC_FEATURES; phy_set_max_speed(phy, SPEED_100);
phy->advertising = phy->supported | ADVERTISED_Autoneg; phy->advertising = phy->supported | ADVERTISED_Autoneg;
phy_start_aneg(phy); phy_start_aneg(phy);