net: ethernet: Convert phydev advertize and supported from u32 to link mode
There are a few MAC/PHYs combinations which now support > 1Gbps. These may need to make use of link modes with bits > 31. Thus their supported PHY features or advertised features cannot be implemented using the current bitmap in a u32. Convert to using a linkmode bitmap, which can support all the currently devices link modes, and is future proof as more modes are added. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Этот коммит содержится в:

коммит произвёл
David S. Miller

родитель
899a3cbbf7
Коммит
3c1bcc8614
@@ -2248,6 +2248,7 @@ static void b44_adjust_link(struct net_device *dev)
|
||||
|
||||
static int b44_register_phy_one(struct b44 *bp)
|
||||
{
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
|
||||
struct mii_bus *mii_bus;
|
||||
struct ssb_device *sdev = bp->sdev;
|
||||
struct phy_device *phydev;
|
||||
@@ -2303,11 +2304,12 @@ static int b44_register_phy_one(struct b44 *bp)
|
||||
}
|
||||
|
||||
/* mask with MAC supported features */
|
||||
phydev->supported &= (SUPPORTED_100baseT_Half |
|
||||
SUPPORTED_100baseT_Full |
|
||||
SUPPORTED_Autoneg |
|
||||
SUPPORTED_MII);
|
||||
phydev->advertising = phydev->supported;
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, mask);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, mask);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, mask);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_MII_BIT, mask);
|
||||
linkmode_and(phydev->supported, phydev->supported, mask);
|
||||
linkmode_copy(phydev->advertising, phydev->supported);
|
||||
|
||||
bp->old_link = 0;
|
||||
bp->phy_addr = phydev->mdio.addr;
|
||||
|
@@ -226,7 +226,8 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)
|
||||
* capabilities, use that knowledge to also configure the
|
||||
* Reverse MII interface correctly.
|
||||
*/
|
||||
if (dev->phydev->supported & PHY_1000BT_FEATURES)
|
||||
if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
|
||||
dev->phydev->supported))
|
||||
port_ctrl = PORT_MODE_EXT_RVMII_50;
|
||||
else
|
||||
port_ctrl = PORT_MODE_EXT_RVMII_25;
|
||||
@@ -317,7 +318,7 @@ int bcmgenet_mii_probe(struct net_device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
phydev->advertising = phydev->supported;
|
||||
linkmode_copy(phydev->advertising, phydev->supported);
|
||||
|
||||
/* The internal PHY has its link interrupts routed to the
|
||||
* Ethernet MAC ISRs. On GENETv5 there is a hardware issue
|
||||
|
@@ -2157,7 +2157,8 @@ static void tg3_phy_start(struct tg3 *tp)
|
||||
phydev->speed = tp->link_config.speed;
|
||||
phydev->duplex = tp->link_config.duplex;
|
||||
phydev->autoneg = tp->link_config.autoneg;
|
||||
phydev->advertising = tp->link_config.advertising;
|
||||
ethtool_convert_legacy_u32_to_link_mode(
|
||||
phydev->advertising, tp->link_config.advertising);
|
||||
}
|
||||
|
||||
phy_start(phydev);
|
||||
@@ -4057,8 +4058,9 @@ static int tg3_power_down_prepare(struct tg3 *tp)
|
||||
do_low_power = false;
|
||||
if ((tp->phy_flags & TG3_PHYFLG_IS_CONNECTED) &&
|
||||
!(tp->phy_flags & TG3_PHYFLG_IS_LOW_POWER)) {
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising) = { 0, };
|
||||
struct phy_device *phydev;
|
||||
u32 phyid, advertising;
|
||||
u32 phyid;
|
||||
|
||||
phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
|
||||
|
||||
@@ -4067,25 +4069,33 @@ static int tg3_power_down_prepare(struct tg3 *tp)
|
||||
tp->link_config.speed = phydev->speed;
|
||||
tp->link_config.duplex = phydev->duplex;
|
||||
tp->link_config.autoneg = phydev->autoneg;
|
||||
tp->link_config.advertising = phydev->advertising;
|
||||
ethtool_convert_link_mode_to_legacy_u32(
|
||||
&tp->link_config.advertising,
|
||||
phydev->advertising);
|
||||
|
||||
advertising = ADVERTISED_TP |
|
||||
ADVERTISED_Pause |
|
||||
ADVERTISED_Autoneg |
|
||||
ADVERTISED_10baseT_Half;
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, advertising);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
|
||||
advertising);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
|
||||
advertising);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
|
||||
advertising);
|
||||
|
||||
if (tg3_flag(tp, ENABLE_ASF) || device_should_wake) {
|
||||
if (tg3_flag(tp, WOL_SPEED_100MB))
|
||||
advertising |=
|
||||
ADVERTISED_100baseT_Half |
|
||||
ADVERTISED_100baseT_Full |
|
||||
ADVERTISED_10baseT_Full;
|
||||
else
|
||||
advertising |= ADVERTISED_10baseT_Full;
|
||||
if (tg3_flag(tp, WOL_SPEED_100MB)) {
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
|
||||
advertising);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
|
||||
advertising);
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
|
||||
advertising);
|
||||
} else {
|
||||
linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
|
||||
advertising);
|
||||
}
|
||||
}
|
||||
|
||||
phydev->advertising = advertising;
|
||||
|
||||
linkmode_copy(phydev->advertising, advertising);
|
||||
phy_start_aneg(phydev);
|
||||
|
||||
phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask;
|
||||
|
Ссылка в новой задаче
Block a user