€• ]Œ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Œ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 ”…””}”(hhø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 Khhø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”…””}”(hhø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”…””}”hj1sbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1j/hŸ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.”…””}”(hj?hž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).”…””}”(hjMhž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.”…””}”(hj[hž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)”…””}”(hjihžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K#hh×hžhubj0)”}”(hŒ\+-----+ SGMII +------------+ | MAC | ------- | SFP Module | +-----+ +------------+”h]”hŒ\+-----+ SGMII +------------+ | MAC | ------- | SFP Module | +-----+ +------------+”…””}”hjwsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1j/hŸ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žhubj0)”}”(hŒe+-----+ SGMII +--------------+ | MAC | -------- | PHY (on SFP) | +-----+ +--------------+”h]”hŒe+-----+ SGMII +--------------+ | MAC | -------- | PHY (on SFP) | +-----+ +--------------+”…””}”hj“sbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1j/hŸ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žhubj0)”}”(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²uh1j/hŸ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”…””}”(hjòhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhjïhž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)”}”(hj h]”hŒstruct phy_link_topology”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”(jjŒc-type”eh"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j#Œ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 KFhjïhžhubhé)”}”(hŒ:c:func:`phy_link_topo_add_phy`”h]”h)”}”(hj3h]”j)”}”(hj3h]”hŒphy_link_topo_add_phy()”…””}”(hj8hžhhŸNh Nubah}”(h]”h ]”(jjŒc-func”eh"]”h$]”h&]”uh1jhj5ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j#Œphy_link_topo_add_phy”uh1hhŸh³h KJhj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KJhjïhž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.”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KLhjïhžhubhé)”}”(hŒ5The PHY can then be removed from the topology through”h]”hŒ5The PHY can then be removed from the topology through”…””}”(hjghžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KQhjïhžhubhé)”}”(hŒ:c:func:`phy_link_topo_del_phy`”h]”h)”}”(hjwh]”j)”}”(hjwh]”hŒphy_link_topo_del_phy()”…””}”(hj|hžhhŸNh Nubah}”(h]”h ]”(jjŒc-func”eh"]”h$]”h&]”uh1jhjyubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j#Œphy_link_topo_del_phy”uh1hhŸh³h KShjuubah}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KShjïhž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 ”…””}”(hjhžhhŸNh Nubh)”}”(hŒ:c:func:`phy_attach_direct`”h]”j)”}”(hj§h]”hŒphy_attach_direct()”…””}”(hj©hžhhŸNh Nubah}”(h]”h ]”(jjŒc-func”eh"]”h$]”h&]”uh1jhj¥ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j#Œphy_attach_direct”uh1hhŸh³h KUhjubhŒ1 will automatically join the netdev’s topology.”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h KUhjïhž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 KYhjïhž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 ]”(jjŒc-func”eh"]”h$]”h&]”uh1jhjäubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j#Œ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)”}”(hj h]”hŒphy_sfp_detach_phy()”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”(jjŒc-func”eh"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰j#Œ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”…””}”(hj.hžhhŸNh Nubah}”(h]”h ]”(jjŒc-type”eh"]”h$]”h&]”uh1jhj*ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j#Œsfp_upstream_ops”uh1hhŸh³h K\hjÜubhŒ.”…””}”(hjÜhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h K\hjïhžhubeh}”(h]”Œapi”ah ]”h"]”Œapi”ah$]”h&]”uh1hÂhhÄhžhhŸh³h KDubhÃ)”}”(hhh]”(hÈ)”}”(hŒUAPI”h]”hŒUAPI”…””}”(hj^hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÇhj[hž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 ”…””}”(hjlhžhhŸNh Nubj)”}”(hŒ0``Documentation/networking/ethtool-netlink.rst``”h]”hŒ,Documentation/networking/ethtool-netlink.rst”…””}”(hjthžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjlubhŒ.”…””}”(hjlhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Kdhj[hž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 ]”(jjŒc-type”eh"]”h$]”h&]”uh1jhj”ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”jŒreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j#Œ 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 Kghj[hž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 ”…””}”(hjóhžhhŸNh Nubj)”}”(hŒ``ETHTOOL_A_HEADER_PHY_INDEX``”h]”hŒETHTOOL_A_HEADER_PHY_INDEX”…””}”(hjûhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjóubhŒ( field in the following ethnl commands :”…””}”(hjóhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Knhj[hž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é)”}”(hjh]”(j)”}”(hŒ``ETHTOOL_MSG_STRSET_GET``”h]”hŒETHTOOL_MSG_STRSET_GET”…””}”(hj!hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ- to get the stats string set from a given PHY”…””}”(hjhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Kqhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhž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”…””}”(hjGhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjCubhŒ and ”…””}”(hjChžhhŸNh Nubj)”}”(hŒ``ETHTOOL_MSG_CABLE_TEST_ACT``”h]”hŒETHTOOL_MSG_CABLE_TEST_ACT”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjCubhŒU, to perform cable testing on a given PHY on the link (most likely the outermost PHY)”…””}”(hjChžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Krhj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhžhhŸh³h Nubj)”}”(hŒ[``ETHTOOL_MSG_PSE_SET`` and ``ETHTOOL_MSG_PSE_GET`` for PHY-controlled PoE and PSE settings”h]”hé)”}”(hjyh]”(j)”}”(hŒ``ETHTOOL_MSG_PSE_SET``”h]”hŒETHTOOL_MSG_PSE_SET”…””}”(hj~hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{ubhŒ and ”…””}”(hj{hžhhŸNh Nubj)”}”(hŒ``ETHTOOL_MSG_PSE_GET``”h]”hŒETHTOOL_MSG_PSE_GET”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{ubhŒ( for PHY-controlled PoE and PSE settings”…””}”(hj{hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hèhŸh³h Kthjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhž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&]”uh1jhjhžhhŸh³h Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1jhŸh³h Kqhj[hž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 Kxhj[hž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”}”jh¶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”jFŒ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”}”(jhÁjjjìjéjXjUjjuŒ nametypes”}”(jˆj‰jì‰jX‰j‰uh}”(hÁhÄjhÄjéh×jUjïjj[uŒ 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”“”}”jTKs…”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.