Commit 3b8b11f9 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller

net: phy: improve link partner capability detection

genphy_read_status() so far checks phydev->supported, not the actual
PHY capabilities. This can make a difference if the supported speeds
have been limited by of_set_phy_supported() or phy_set_max_speed().

It seems that this issue only affects the link partner advertisements
as displayed by ethtool. Also this patch wouldn't apply to older
kernels because linkmode bitmaps have been introduced recently.
Therefore net-next.
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8bb309e6
...@@ -1756,10 +1756,7 @@ int genphy_read_status(struct phy_device *phydev) ...@@ -1756,10 +1756,7 @@ int genphy_read_status(struct phy_device *phydev)
linkmode_zero(phydev->lp_advertising); linkmode_zero(phydev->lp_advertising);
if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, if (phydev->is_gigabit_capable) {
phydev->supported) ||
linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
phydev->supported)) {
lpagb = phy_read(phydev, MII_STAT1000); lpagb = phy_read(phydev, MII_STAT1000);
if (lpagb < 0) if (lpagb < 0)
return lpagb; return lpagb;
...@@ -2154,6 +2151,13 @@ static int phy_probe(struct device *dev) ...@@ -2154,6 +2151,13 @@ static int phy_probe(struct device *dev)
if (err) if (err)
goto out; goto out;
if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
phydev->supported))
phydev->is_gigabit_capable = 1;
if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
phydev->supported))
phydev->is_gigabit_capable = 1;
of_set_phy_supported(phydev); of_set_phy_supported(phydev);
linkmode_copy(phydev->advertising, phydev->supported); linkmode_copy(phydev->advertising, phydev->supported);
......
...@@ -345,6 +345,7 @@ struct phy_c45_device_ids { ...@@ -345,6 +345,7 @@ struct phy_c45_device_ids {
* is_c45: Set to true if this phy uses clause 45 addressing. * is_c45: Set to true if this phy uses clause 45 addressing.
* is_internal: Set to true if this phy is internal to a MAC. * is_internal: Set to true if this phy is internal to a MAC.
* is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc. * is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc.
* is_gigabit_capable: Set to true if PHY supports 1000Mbps
* has_fixups: Set to true if this phy has fixups/quirks. * has_fixups: Set to true if this phy has fixups/quirks.
* suspended: Set to true if this phy has been suspended successfully. * suspended: Set to true if this phy has been suspended successfully.
* sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal. * sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal.
...@@ -382,6 +383,7 @@ struct phy_device { ...@@ -382,6 +383,7 @@ struct phy_device {
unsigned is_c45:1; unsigned is_c45:1;
unsigned is_internal:1; unsigned is_internal:1;
unsigned is_pseudo_fixed_link:1; unsigned is_pseudo_fixed_link:1;
unsigned is_gigabit_capable:1;
unsigned has_fixups:1; unsigned has_fixups:1;
unsigned suspended:1; unsigned suspended:1;
unsigned sysfs_links:1; unsigned sysfs_links:1;
......
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