mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
net: phylink: fix PHY validation with rate adaption
Tim Harvey reports that link modes which he does not expect to be supported are being advertised, and this is because of the workaround we have for PHYs that switch interface modes. Fix this up by checking whether rate matching will be used for the requested interface mode, and if rate matching will be used, perform validation only with the requested interface mode, rather than invoking this workaround. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9256db4e45
commit
7642cc28fd
@ -1603,19 +1603,29 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,
|
||||
linkmode_copy(supported, phy->supported);
|
||||
linkmode_copy(config.advertising, phy->advertising);
|
||||
|
||||
/* Clause 45 PHYs switch their Serdes lane between several different
|
||||
* modes, normally 10GBASE-R, SGMII. Some use 2500BASE-X for 2.5G
|
||||
* speeds. We really need to know which interface modes the PHY and
|
||||
* MAC supports to properly work out which linkmodes can be supported.
|
||||
/* Check whether we would use rate matching for the proposed interface
|
||||
* mode.
|
||||
*/
|
||||
if (phy->is_c45 &&
|
||||
config.rate_matching = phy_get_rate_matching(phy, interface);
|
||||
|
||||
/* Clause 45 PHYs may switch their Serdes lane between, e.g. 10GBASE-R,
|
||||
* 5GBASE-R, 2500BASE-X and SGMII if they are not using rate matching.
|
||||
* For some interface modes (e.g. RXAUI, XAUI and USXGMII) switching
|
||||
* their Serdes is either unnecessary or not reasonable.
|
||||
*
|
||||
* For these which switch interface modes, we really need to know which
|
||||
* interface modes the PHY supports to properly work out which ethtool
|
||||
* linkmodes can be supported. For now, as a work-around, we validate
|
||||
* against all interface modes, which may lead to more ethtool link
|
||||
* modes being advertised than are actually supported.
|
||||
*/
|
||||
if (phy->is_c45 && config.rate_matching == RATE_MATCH_NONE &&
|
||||
interface != PHY_INTERFACE_MODE_RXAUI &&
|
||||
interface != PHY_INTERFACE_MODE_XAUI &&
|
||||
interface != PHY_INTERFACE_MODE_USXGMII)
|
||||
config.interface = PHY_INTERFACE_MODE_NA;
|
||||
else
|
||||
config.interface = interface;
|
||||
config.rate_matching = phy_get_rate_matching(phy, config.interface);
|
||||
|
||||
ret = phylink_validate(pl, supported, &config);
|
||||
if (ret) {
|
||||
|
Loading…
Reference in New Issue
Block a user