715-11-v6.4-net-phylink-support-validated-pause-and-autoneg-in-f.patch 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. From 471c40bde606ec0b1ce8c616f7998739c7a783a6 Mon Sep 17 00:00:00 2001
  2. From: Ivan Bornyakov <[email protected]>
  3. Date: Fri, 10 Feb 2023 18:46:27 +0300
  4. Subject: [PATCH 10/21] net: phylink: support validated pause and autoneg in
  5. fixed-link
  6. In fixed-link setup phylink_parse_fixedlink() unconditionally sets
  7. Pause, Asym_Pause and Autoneg bits to "supported" bitmap, while MAC may
  8. not support these.
  9. This leads to ethtool reporting:
  10. > Supported pause frame use: Symmetric Receive-only
  11. > Supports auto-negotiation: Yes
  12. regardless of what is actually supported.
  13. Instead of unconditionally set Pause, Asym_Pause and Autoneg it is
  14. sensible to set them according to validated "supported" bitmap, i.e. the
  15. result of phylink_validate().
  16. Signed-off-by: Ivan Bornyakov <[email protected]>
  17. Signed-off-by: David S. Miller <[email protected]>
  18. ---
  19. drivers/net/phy/phylink.c | 17 ++++++++++++++---
  20. 1 file changed, 14 insertions(+), 3 deletions(-)
  21. --- a/drivers/net/phy/phylink.c
  22. +++ b/drivers/net/phy/phylink.c
  23. @@ -709,6 +709,7 @@ static int phylink_parse_fixedlink(struc
  24. struct fwnode_handle *fwnode)
  25. {
  26. struct fwnode_handle *fixed_node;
  27. + bool pause, asym_pause, autoneg;
  28. const struct phy_setting *s;
  29. struct gpio_desc *desc;
  30. u32 speed;
  31. @@ -781,13 +782,23 @@ static int phylink_parse_fixedlink(struc
  32. linkmode_copy(pl->link_config.advertising, pl->supported);
  33. phylink_validate(pl, pl->supported, &pl->link_config);
  34. + pause = phylink_test(pl->supported, Pause);
  35. + asym_pause = phylink_test(pl->supported, Asym_Pause);
  36. + autoneg = phylink_test(pl->supported, Autoneg);
  37. s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex,
  38. pl->supported, true);
  39. linkmode_zero(pl->supported);
  40. phylink_set(pl->supported, MII);
  41. - phylink_set(pl->supported, Pause);
  42. - phylink_set(pl->supported, Asym_Pause);
  43. - phylink_set(pl->supported, Autoneg);
  44. +
  45. + if (pause)
  46. + phylink_set(pl->supported, Pause);
  47. +
  48. + if (asym_pause)
  49. + phylink_set(pl->supported, Asym_Pause);
  50. +
  51. + if (autoneg)
  52. + phylink_set(pl->supported, Autoneg);
  53. +
  54. if (s) {
  55. __set_bit(s->bit, pl->supported);
  56. __set_bit(s->bit, pl->link_config.lp_advertising);