phy-link-topology.rst 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. .. SPDX-License-Identifier: GPL-2.0
  2. .. _phy_link_topology:
  3. =================
  4. PHY link topology
  5. =================
  6. Overview
  7. ========
  8. The PHY link topology representation in the networking stack aims at representing
  9. the hardware layout for any given Ethernet link.
  10. An Ethernet interface from userspace's point of view is nothing but a
  11. :c:type:`struct net_device <net_device>`, which exposes configuration options
  12. through the legacy ioctls and the ethtool netlink commands. The base assumption
  13. when designing these configuration APIs were that the link looks something like ::
  14. +-----------------------+ +----------+ +--------------+
  15. | Ethernet Controller / | | Ethernet | | Connector / |
  16. | MAC | ------ | PHY | ---- | Port | ---... to LP
  17. +-----------------------+ +----------+ +--------------+
  18. struct net_device struct phy_device
  19. Commands that needs to configure the PHY will go through the net_device.phydev
  20. field to reach the PHY and perform the relevant configuration.
  21. This assumption falls apart in more complex topologies that can arise when,
  22. for example, using SFP transceivers (although that's not the only specific case).
  23. Here, we have 2 basic scenarios. Either the MAC is able to output a serialized
  24. interface, that can directly be fed to an SFP cage, such as SGMII, 1000BaseX,
  25. 10GBaseR, etc.
  26. The link topology then looks like this (when an SFP module is inserted) ::
  27. +-----+ SGMII +------------+
  28. | MAC | ------- | SFP Module |
  29. +-----+ +------------+
  30. Knowing that some modules embed a PHY, the actual link is more like ::
  31. +-----+ SGMII +--------------+
  32. | MAC | -------- | PHY (on SFP) |
  33. +-----+ +--------------+
  34. In this case, the SFP PHY is handled by phylib, and registered by phylink through
  35. its SFP upstream ops.
  36. Now some Ethernet controllers aren't able to output a serialized interface, so
  37. we can't directly connect them to an SFP cage. However, some PHYs can be used
  38. as media-converters, to translate the non-serialized MAC MII interface to a
  39. serialized MII interface fed to the SFP ::
  40. +-----+ RGMII +-----------------------+ SGMII +--------------+
  41. | MAC | ------- | PHY (media converter) | ------- | PHY (on SFP) |
  42. +-----+ +-----------------------+ +--------------+
  43. This is where the model of having a single net_device.phydev pointer shows its
  44. limitations, as we now have 2 PHYs on the link.
  45. The phy_link topology framework aims at providing a way to keep track of every
  46. PHY on the link, for use by both kernel drivers and subsystems, but also to
  47. report the topology to userspace, allowing to target individual PHYs in configuration
  48. commands.
  49. API
  50. ===
  51. The :c:type:`struct phy_link_topology <phy_link_topology>` is a per-netdevice
  52. resource, that gets initialized at netdevice creation. Once it's initialized,
  53. it is then possible to register PHYs to the topology through :
  54. :c:func:`phy_link_topo_add_phy`
  55. Besides registering the PHY to the topology, this call will also assign a unique
  56. index to the PHY, which can then be reported to userspace to refer to this PHY
  57. (akin to the ifindex). This index is a u32, ranging from 1 to U32_MAX. The value
  58. 0 is reserved to indicate the PHY doesn't belong to any topology yet.
  59. The PHY can then be removed from the topology through
  60. :c:func:`phy_link_topo_del_phy`
  61. These function are already hooked into the phylib subsystem, so all PHYs that
  62. are linked to a net_device through :c:func:`phy_attach_direct` will automatically
  63. join the netdev's topology.
  64. PHYs that are on a SFP module will also be automatically registered IF the SFP
  65. upstream is phylink (so, no media-converter).
  66. PHY drivers that can be used as SFP upstream need to call :c:func:`phy_sfp_attach_phy`
  67. and :c:func:`phy_sfp_detach_phy`, which can be used as a
  68. .attach_phy / .detach_phy implementation for the
  69. :c:type:`struct sfp_upstream_ops <sfp_upstream_ops>`.
  70. UAPI
  71. ====
  72. There exist a set of netlink commands to query the link topology from userspace,
  73. see ``Documentation/networking/ethtool-netlink.rst``.
  74. The whole point of having a topology representation is to assign the phyindex
  75. field in :c:type:`struct phy_device <phy_device>`. This index is reported to
  76. userspace using the ``ETHTOOL_MSG_PHY_GET`` ethtnl command. Performing a DUMP operation
  77. will result in all PHYs from all net_device being listed. The DUMP command
  78. accepts either a ``ETHTOOL_A_HEADER_DEV_INDEX`` or ``ETHTOOL_A_HEADER_DEV_NAME``
  79. to be passed in the request to filter the DUMP to a single net_device.
  80. The retrieved index can then be passed as a request parameter using the
  81. ``ETHTOOL_A_HEADER_PHY_INDEX`` field in the following ethnl commands :
  82. * ``ETHTOOL_MSG_STRSET_GET`` to get the stats string set from a given PHY
  83. * ``ETHTOOL_MSG_CABLE_TEST_ACT`` and ``ETHTOOL_MSG_CABLE_TEST_ACT``, to perform
  84. cable testing on a given PHY on the link (most likely the outermost PHY)
  85. * ``ETHTOOL_MSG_PSE_SET`` and ``ETHTOOL_MSG_PSE_GET`` for PHY-controlled PoE and PSE settings
  86. * ``ETHTOOL_MSG_PLCA_GET_CFG``, ``ETHTOOL_MSG_PLCA_SET_CFG`` and ``ETHTOOL_MSG_PLCA_GET_STATUS``
  87. to set the PLCA (Physical Layer Collision Avoidance) parameters
  88. Note that the PHY index can be passed to other requests, which will silently
  89. ignore it if present and irrelevant.