12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- From 471c40bde606ec0b1ce8c616f7998739c7a783a6 Mon Sep 17 00:00:00 2001
- From: Ivan Bornyakov <[email protected]>
- Date: Fri, 10 Feb 2023 18:46:27 +0300
- Subject: [PATCH 10/21] net: phylink: support validated pause and autoneg in
- fixed-link
- In fixed-link setup phylink_parse_fixedlink() unconditionally sets
- Pause, Asym_Pause and Autoneg bits to "supported" bitmap, while MAC may
- not support these.
- This leads to ethtool reporting:
- > Supported pause frame use: Symmetric Receive-only
- > Supports auto-negotiation: Yes
- regardless of what is actually supported.
- Instead of unconditionally set Pause, Asym_Pause and Autoneg it is
- sensible to set them according to validated "supported" bitmap, i.e. the
- result of phylink_validate().
- Signed-off-by: Ivan Bornyakov <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- drivers/net/phy/phylink.c | 17 ++++++++++++++---
- 1 file changed, 14 insertions(+), 3 deletions(-)
- --- a/drivers/net/phy/phylink.c
- +++ b/drivers/net/phy/phylink.c
- @@ -709,6 +709,7 @@ static int phylink_parse_fixedlink(struc
- struct fwnode_handle *fwnode)
- {
- struct fwnode_handle *fixed_node;
- + bool pause, asym_pause, autoneg;
- const struct phy_setting *s;
- struct gpio_desc *desc;
- u32 speed;
- @@ -781,13 +782,23 @@ static int phylink_parse_fixedlink(struc
- linkmode_copy(pl->link_config.advertising, pl->supported);
- phylink_validate(pl, pl->supported, &pl->link_config);
-
- + pause = phylink_test(pl->supported, Pause);
- + asym_pause = phylink_test(pl->supported, Asym_Pause);
- + autoneg = phylink_test(pl->supported, Autoneg);
- s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex,
- pl->supported, true);
- linkmode_zero(pl->supported);
- phylink_set(pl->supported, MII);
- - phylink_set(pl->supported, Pause);
- - phylink_set(pl->supported, Asym_Pause);
- - phylink_set(pl->supported, Autoneg);
- +
- + if (pause)
- + phylink_set(pl->supported, Pause);
- +
- + if (asym_pause)
- + phylink_set(pl->supported, Asym_Pause);
- +
- + if (autoneg)
- + phylink_set(pl->supported, Autoneg);
- +
- if (s) {
- __set_bit(s->bit, pl->supported);
- __set_bit(s->bit, pl->link_config.lp_advertising);
|