€•ð]Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ0/translations/zh_CN/networking/phy-link-topology”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/zh_TW/networking/phy-link-topology”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/it_IT/networking/phy-link-topology”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/ja_JP/networking/phy-link-topology”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/ko_KR/networking/phy-link-topology”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/pt_BR/networking/phy-link-topology”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/sp_SP/networking/phy-link-topology”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒJ/var/lib/git/docbuild/linux/Documentation/networking/phy-link-topology.rst”h´KubhŒtarget”“”)”}”(hŒ.. _phy_link_topology:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œphy-link-topology”uh1hÈh´Khhh²hh³hÇubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒPHY link topology”h]”hŒPHY link topology”…””}”(hhÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhhØh²hh³hÇh´Kubh×)”}”(hhh]”(hÜ)”}”(hŒOverview”h]”hŒOverview”…””}”(hhîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhhëh²hh³hÇh´K ubhŒ paragraph”“”)”}”(hŒ‚The PHY link topology representation in the networking stack aims at representing the hardware layout for any given Ethernet link.”h]”hŒ‚The PHY link topology representation in the networking stack aims at representing the hardware layout for any given Ethernet link.”…””}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K hhëh²hubhý)”}”(hX6An Ethernet interface from userspace's point of view is nothing but a :c:type:`struct net_device `, which exposes configuration options through the legacy ioctls and the ethtool netlink commands. The base assumption when designing these configuration APIs were that the link looks something like ::”h]”(hŒHAn Ethernet interface from userspace’s point of view is nothing but a ”…””}”(hj h²hh³Nh´Nubh)”}”(hŒ(:c:type:`struct net_device `”h]”hŒliteral”“”)”}”(hjh]”hŒstruct net_device”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œc”Œc-type”eh"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œnetworking/phy-link-topology”Œ refdomain”j%Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰Œ reftarget”Œ net_device”uh1hh³hÇh´Khj ubhŒÅ, which exposes configuration options through the legacy ioctls and the ethtool netlink commands. The base assumption when designing these configuration APIs were that the link looks something like”…””}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khhëh²hubhŒ literal_block”“”)”}”(hXN+-----------------------+ +----------+ +--------------+ | Ethernet Controller / | | Ethernet | | Connector / | | MAC | ------ | PHY | ---- | Port | ---... to LP +-----------------------+ +----------+ +--------------+ struct net_device struct phy_device”h]”hXN+-----------------------+ +----------+ +--------------+ | Ethernet Controller / | | Ethernet | | Connector / | | MAC | ------ | PHY | ---- | Port | ---... to LP +-----------------------+ +----------+ +--------------+ struct net_device struct phy_device”…””}”hjEsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jCh³hÇh´Khhëh²hubhý)”}”(hŒCommands that needs to configure the PHY will go through the net_device.phydev field to reach the PHY and perform the relevant configuration.”h]”hŒCommands that needs to configure the PHY will go through the net_device.phydev field to reach the PHY and perform the relevant configuration.”…””}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khhëh²hubhý)”}”(hŒThis assumption falls apart in more complex topologies that can arise when, for example, using SFP transceivers (although that's not the only specific case).”h]”hŒŸThis assumption falls apart in more complex topologies that can arise when, for example, using SFP transceivers (although that’s not the only specific case).”…””}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khhëh²hubhý)”}”(hŒ«Here, we have 2 basic scenarios. Either the MAC is able to output a serialized interface, that can directly be fed to an SFP cage, such as SGMII, 1000BaseX, 10GBaseR, etc.”h]”hŒ«Here, we have 2 basic scenarios. Either the MAC is able to output a serialized interface, that can directly be fed to an SFP cage, such as SGMII, 1000BaseX, 10GBaseR, etc.”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Khhëh²hubhý)”}”(hŒJThe link topology then looks like this (when an SFP module is inserted) ::”h]”hŒGThe link topology then looks like this (when an SFP module is inserted)”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K#hhëh²hubjD)”}”(hŒ\+-----+ SGMII +------------+ | MAC | ------- | SFP Module | +-----+ +------------+”h]”hŒ\+-----+ SGMII +------------+ | MAC | ------- | SFP Module | +-----+ +------------+”…””}”hj‹sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jCh³hÇh´K%hhëh²hubhý)”}”(hŒFKnowing that some modules embed a PHY, the actual link is more like ::”h]”hŒCKnowing that some modules embed a PHY, the actual link is more like”…””}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K)hhëh²hubjD)”}”(hŒe+-----+ SGMII +--------------+ | MAC | -------- | PHY (on SFP) | +-----+ +--------------+”h]”hŒe+-----+ SGMII +--------------+ | MAC | -------- | PHY (on SFP) | +-----+ +--------------+”…””}”hj§sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jCh³hÇh´K+hhëh²hubhý)”}”(hŒgIn this case, the SFP PHY is handled by phylib, and registered by phylink through its SFP upstream ops.”h]”hŒgIn this case, the SFP PHY is handled by phylib, and registered by phylink through its SFP upstream ops.”…””}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K/hhëh²hubhý)”}”(hXNow some Ethernet controllers aren't able to output a serialized interface, so we can't directly connect them to an SFP cage. However, some PHYs can be used as media-converters, to translate the non-serialized MAC MII interface to a serialized MII interface fed to the SFP ::”h]”hXNow some Ethernet controllers aren’t able to output a serialized interface, so we can’t directly connect them to an SFP cage. However, some PHYs can be used as media-converters, to translate the non-serialized MAC MII interface to a serialized MII interface fed to the SFP”…””}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K2hhëh²hubjD)”}”(hŒÈ+-----+ RGMII +-----------------------+ SGMII +--------------+ | MAC | ------- | PHY (media converter) | ------- | PHY (on SFP) | +-----+ +-----------------------+ +--------------+”h]”hŒÈ+-----+ RGMII +-----------------------+ SGMII +--------------+ | MAC | ------- | PHY (media converter) | ------- | PHY (on SFP) | +-----+ +-----------------------+ +--------------+”…””}”hjÑsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jCh³hÇh´K7hhëh²hubhý)”}”(hŒ~This is where the model of having a single net_device.phydev pointer shows its limitations, as we now have 2 PHYs on the link.”h]”hŒ~This is where the model of having a single net_device.phydev pointer shows its limitations, as we now have 2 PHYs on the link.”…””}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K;hhëh²hubhý)”}”(hŒúThe phy_link topology framework aims at providing a way to keep track of every PHY on the link, for use by both kernel drivers and subsystems, but also to report the topology to userspace, allowing to target individual PHYs in configuration commands.”h]”hŒúThe phy_link topology framework aims at providing a way to keep track of every PHY on the link, for use by both kernel drivers and subsystems, but also to report the topology to userspace, allowing to target individual PHYs in configuration commands.”…””}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K>hhëh²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÖhhØh²hh³hÇh´K ubh×)”}”(hhh]”(hÜ)”}”(hŒAPI”h]”hŒAPI”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´KDubhý)”}”(hŒÚThe :c:type:`struct phy_link_topology ` is a per-netdevice resource, that gets initialized at netdevice creation. Once it's initialized, it is then possible to register PHYs to the topology through :”h]”(hŒThe ”…””}”(hjh²hh³Nh´Nubh)”}”(hŒ6:c:type:`struct phy_link_topology `”h]”j)”}”(hjh]”hŒstruct phy_link_topology”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-type”eh"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j7Œphy_link_topology”uh1hh³hÇh´KFhjubhŒ¢ is a per-netdevice resource, that gets initialized at netdevice creation. Once it’s initialized, it is then possible to register PHYs to the topology through :”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KFhjh²hubhý)”}”(hŒ:c:func:`phy_link_topo_add_phy`”h]”h)”}”(hjGh]”j)”}”(hjGh]”hŒphy_link_topo_add_phy()”…””}”(hjLh²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-func”eh"]”h$]”h&]”uh1jhjIubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j7Œphy_link_topo_add_phy”uh1hh³hÇh´KJhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KJhjh²hubhý)”}”(hX6Besides registering the PHY to the topology, this call will also assign a unique index to the PHY, which can then be reported to userspace to refer to this PHY (akin to the ifindex). This index is a u32, ranging from 1 to U32_MAX. The value 0 is reserved to indicate the PHY doesn't belong to any topology yet.”h]”hX8Besides registering the PHY to the topology, this call will also assign a unique index to the PHY, which can then be reported to userspace to refer to this PHY (akin to the ifindex). This index is a u32, ranging from 1 to U32_MAX. The value 0 is reserved to indicate the PHY doesn’t belong to any topology yet.”…””}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KLhjh²hubhý)”}”(hŒ5The PHY can then be removed from the topology through”h]”hŒ5The PHY can then be removed from the topology through”…””}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KQhjh²hubhý)”}”(hŒ:c:func:`phy_link_topo_del_phy`”h]”h)”}”(hj‹h]”j)”}”(hj‹h]”hŒphy_link_topo_del_phy()”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-func”eh"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j7Œphy_link_topo_del_phy”uh1hh³hÇh´KShj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KShjh²hubhý)”}”(hŒ»These function are already hooked into the phylib subsystem, so all PHYs that are linked to a net_device through :c:func:`phy_attach_direct` will automatically join the netdev's topology.”h]”(hŒqThese function are already hooked into the phylib subsystem, so all PHYs that are linked to a net_device through ”…””}”(hj±h²hh³Nh´Nubh)”}”(hŒ:c:func:`phy_attach_direct`”h]”j)”}”(hj»h]”hŒphy_attach_direct()”…””}”(hj½h²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-func”eh"]”h$]”h&]”uh1jhj¹ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j7Œphy_attach_direct”uh1hh³hÇh´KUhj±ubhŒ1 will automatically join the netdev’s topology.”…””}”(hj±h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KUhjh²hubhý)”}”(hŒ|PHYs that are on a SFP module will also be automatically registered IF the SFP upstream is phylink (so, no media-converter).”h]”hŒ|PHYs that are on a SFP module will also be automatically registered IF the SFP upstream is phylink (so, no media-converter).”…””}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KYhjh²hubhý)”}”(hŒöPHY drivers that can be used as SFP upstream need to call :c:func:`phy_sfp_attach_phy` and :c:func:`phy_sfp_detach_phy`, which can be used as a .attach_phy / .detach_phy implementation for the :c:type:`struct sfp_upstream_ops `.”h]”(hŒ:PHY drivers that can be used as SFP upstream need to call ”…””}”(hjðh²hh³Nh´Nubh)”}”(hŒ:c:func:`phy_sfp_attach_phy`”h]”j)”}”(hjúh]”hŒphy_sfp_attach_phy()”…””}”(hjüh²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-func”eh"]”h$]”h&]”uh1jhjøubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j7Œphy_sfp_attach_phy”uh1hh³hÇh´K\hjðubhŒ and ”…””}”(hjðh²hh³Nh´Nubh)”}”(hŒ:c:func:`phy_sfp_detach_phy`”h]”j)”}”(hjh]”hŒphy_sfp_detach_phy()”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-func”eh"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j7Œphy_sfp_detach_phy”uh1hh³hÇh´K\hjðubhŒJ, which can be used as a .attach_phy / .detach_phy implementation for the ”…””}”(hjðh²hh³Nh´Nubh)”}”(hŒ4:c:type:`struct sfp_upstream_ops `”h]”j)”}”(hj@h]”hŒstruct sfp_upstream_ops”…””}”(hjBh²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-type”eh"]”h$]”h&]”uh1jhj>ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j7Œsfp_upstream_ops”uh1hh³hÇh´K\hjðubhŒ.”…””}”(hjðh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´K\hjh²hubeh}”(h]”Œapi”ah ]”h"]”Œapi”ah$]”h&]”uh1hÖhhØh²hh³hÇh´KDubh×)”}”(hhh]”(hÜ)”}”(hŒUAPI”h]”hŒUAPI”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjoh²hh³hÇh´Kbubhý)”}”(hŒ†There exist a set of netlink commands to query the link topology from userspace, see ``Documentation/networking/ethtool-netlink.rst``.”h]”(hŒUThere exist a set of netlink commands to query the link topology from userspace, see ”…””}”(hj€h²hh³Nh´Nubj)”}”(hŒ0``Documentation/networking/ethtool-netlink.rst``”h]”hŒ,Documentation/networking/ethtool-netlink.rst”…””}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj€ubhŒ.”…””}”(hj€h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kdhjoh²hubhý)”}”(hXÕThe whole point of having a topology representation is to assign the phyindex field in :c:type:`struct phy_device `. This index is reported to userspace using the ``ETHTOOL_MSG_PHY_GET`` ethtnl command. Performing a DUMP operation will result in all PHYs from all net_device being listed. The DUMP command accepts either a ``ETHTOOL_A_HEADER_DEV_INDEX`` or ``ETHTOOL_A_HEADER_DEV_NAME`` to be passed in the request to filter the DUMP to a single net_device.”h]”(hŒWThe whole point of having a topology representation is to assign the phyindex field in ”…””}”(hj h²hh³Nh´Nubh)”}”(hŒ(:c:type:`struct phy_device `”h]”j)”}”(hjªh]”hŒstruct phy_device”…””}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”(j$j%Œc-type”eh"]”h$]”h&]”uh1jhj¨ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j1Œ refdomain”j%Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j7Œ phy_device”uh1hh³hÇh´Kghj ubhŒ0. This index is reported to userspace using the ”…””}”(hj h²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_MSG_PHY_GET``”h]”hŒETHTOOL_MSG_PHY_GET”…””}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ‰ ethtnl command. Performing a DUMP operation will result in all PHYs from all net_device being listed. The DUMP command accepts either a ”…””}”(hj h²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_A_HEADER_DEV_INDEX``”h]”hŒETHTOOL_A_HEADER_DEV_INDEX”…””}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ or ”…””}”(hj h²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_A_HEADER_DEV_NAME``”h]”hŒETHTOOL_A_HEADER_DEV_NAME”…””}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒG to be passed in the request to filter the DUMP to a single net_device.”…””}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kghjoh²hubhý)”}”(hŒŽThe retrieved index can then be passed as a request parameter using the ``ETHTOOL_A_HEADER_PHY_INDEX`` field in the following ethnl commands :”h]”(hŒHThe retrieved index can then be passed as a request parameter using the ”…””}”(hjh²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_A_HEADER_PHY_INDEX``”h]”hŒETHTOOL_A_HEADER_PHY_INDEX”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ( field in the following ethnl commands :”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Knhjoh²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒG``ETHTOOL_MSG_STRSET_GET`` to get the stats string set from a given PHY”h]”hý)”}”(hj0h]”(j)”}”(hŒ``ETHTOOL_MSG_STRSET_GET``”h]”hŒETHTOOL_MSG_STRSET_GET”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj2ubhŒ- to get the stats string set from a given PHY”…””}”(hj2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kqhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj)h²hh³hÇh´Nubj-)”}”(hŒ–``ETHTOOL_MSG_CABLE_TEST_ACT`` and ``ETHTOOL_MSG_CABLE_TEST_ACT``, to perform cable testing on a given PHY on the link (most likely the outermost PHY)”h]”hý)”}”(hŒ–``ETHTOOL_MSG_CABLE_TEST_ACT`` and ``ETHTOOL_MSG_CABLE_TEST_ACT``, to perform cable testing on a given PHY on the link (most likely the outermost PHY)”h]”(j)”}”(hŒ``ETHTOOL_MSG_CABLE_TEST_ACT``”h]”hŒETHTOOL_MSG_CABLE_TEST_ACT”…””}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjWubhŒ and ”…””}”(hjWh²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_MSG_CABLE_TEST_ACT``”h]”hŒETHTOOL_MSG_CABLE_TEST_ACT”…””}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjWubhŒU, to perform cable testing on a given PHY on the link (most likely the outermost PHY)”…””}”(hjWh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KrhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj)h²hh³hÇh´Nubj-)”}”(hŒ[``ETHTOOL_MSG_PSE_SET`` and ``ETHTOOL_MSG_PSE_GET`` for PHY-controlled PoE and PSE settings”h]”hý)”}”(hjh]”(j)”}”(hŒ``ETHTOOL_MSG_PSE_SET``”h]”hŒETHTOOL_MSG_PSE_SET”…””}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ and ”…””}”(hjh²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_MSG_PSE_GET``”h]”hŒETHTOOL_MSG_PSE_GET”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ( for PHY-controlled PoE and PSE settings”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kthj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj)h²hh³hÇh´Nubj-)”}”(hŒŸ``ETHTOOL_MSG_PLCA_GET_CFG``, ``ETHTOOL_MSG_PLCA_SET_CFG`` and ``ETHTOOL_MSG_PLCA_GET_STATUS`` to set the PLCA (Physical Layer Collision Avoidance) parameters ”h]”hý)”}”(hŒž``ETHTOOL_MSG_PLCA_GET_CFG``, ``ETHTOOL_MSG_PLCA_SET_CFG`` and ``ETHTOOL_MSG_PLCA_GET_STATUS`` to set the PLCA (Physical Layer Collision Avoidance) parameters”h]”(j)”}”(hŒ``ETHTOOL_MSG_PLCA_GET_CFG``”h]”hŒETHTOOL_MSG_PLCA_GET_CFG”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÆubhŒ, ”…””}”(hjÆh²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_MSG_PLCA_SET_CFG``”h]”hŒETHTOOL_MSG_PLCA_SET_CFG”…””}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÆubhŒ and ”…””}”(hjÆh²hh³Nh´Nubj)”}”(hŒ``ETHTOOL_MSG_PLCA_GET_STATUS``”h]”hŒETHTOOL_MSG_PLCA_GET_STATUS”…””}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÆubhŒ@ to set the PLCA (Physical Layer Collision Avoidance) parameters”…””}”(hjÆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´KuhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj)h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1j'h³hÇh´Kqhjoh²hubhý)”}”(hŒqNote that the PHY index can be passed to other requests, which will silently ignore it if present and irrelevant.”h]”hŒqNote that the PHY index can be passed to other requests, which will silently ignore it if present and irrelevant.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hüh³hÇh´Kxhjoh²hubeh}”(h]”Œuapi”ah ]”h"]”Œuapi”ah$]”h&]”uh1hÖhhØh²hh³hÇh´Kbubeh}”(h]”(hÕŒid1”eh ]”h"]”(Œphy link topology”Œphy_link_topology”eh$]”h&]”uh1hÖhhh²hh³hÇh´KŒexpect_referenced_by_name”}”j0hÊsŒexpect_referenced_by_id”}”hÕhÊsubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÛNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jZŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”hÕ]”hÊasŒnameids”}”(j0hÕj/j,jjýjljij'j$uŒ nametypes”}”(j0ˆj/‰j‰jl‰j'‰uh}”(hÕhØj,hØjýhëjijj$jouŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jhKs…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)”}”(hhh]”hý)”}”(hhh]”hŒ7Hyperlink target "phy-link-topology" is not referenced.”…””}”hjÄsbah}”(h]”h ]”h"]”h$]”h&]”uh1hühjÁubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÇŒline”Kuh1j¿ubaŒ transformer”NŒ include_log”]”Œ decoration”Nh²hub.