提交 7642cc28 编写于 作者: R Russell King (Oracle) 提交者: David S. Miller

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: NRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 9256db4e
...@@ -1603,19 +1603,29 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, ...@@ -1603,19 +1603,29 @@ static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,
linkmode_copy(supported, phy->supported); linkmode_copy(supported, phy->supported);
linkmode_copy(config.advertising, phy->advertising); linkmode_copy(config.advertising, phy->advertising);
/* Clause 45 PHYs switch their Serdes lane between several different /* Check whether we would use rate matching for the proposed interface
* modes, normally 10GBASE-R, SGMII. Some use 2500BASE-X for 2.5G * mode.
* speeds. We really need to know which interface modes the PHY and
* MAC supports to properly work out which linkmodes can be supported.
*/ */
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_RXAUI &&
interface != PHY_INTERFACE_MODE_XAUI && interface != PHY_INTERFACE_MODE_XAUI &&
interface != PHY_INTERFACE_MODE_USXGMII) interface != PHY_INTERFACE_MODE_USXGMII)
config.interface = PHY_INTERFACE_MODE_NA; config.interface = PHY_INTERFACE_MODE_NA;
else else
config.interface = interface; config.interface = interface;
config.rate_matching = phy_get_rate_matching(phy, config.interface);
ret = phylink_validate(pl, supported, &config); ret = phylink_validate(pl, supported, &config);
if (ret) { if (ret) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册