]> git.itanic.dy.fi Git - linux-stable/commitdiff
Revert "Introduce PHY listing and link_topology tracking"
authorJakub Kicinski <kuba@kernel.org>
Fri, 5 Jan 2024 00:04:35 +0000 (16:04 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 5 Jan 2024 00:05:47 +0000 (16:05 -0800)
This reverts commit 32bb4515e34469975abc936deb0a116c4a445817.
This reverts commit d078d480639a4f3b5fc2d56247afa38e0956483a.
This reverts commit fcc4b105caa4b844bf043375bf799c20a9c99db1.
This reverts commit 345237dbc1bdbb274c9fb9ec38976261ff4a40b8.
This reverts commit 7db69ec9cfb8b4ab50420262631fb2d1908b25bf.
This reverts commit 95132a018f00f5dad38bdcfd4180d1af955d46f6.
This reverts commit 63d5eaf35ac36cad00cfb3809d794ef0078c822b.
This reverts commit c29451aefcb42359905d18678de38e52eccb3bb5.
This reverts commit 2ab0edb505faa9ac90dee1732571390f074e8113.
This reverts commit dedd702a35793ab462fce4c737eeba0badf9718e.
This reverts commit 034fcc210349b873ece7356905be5c6ca11eef2a.
This reverts commit 9c5625f559ad6fe9f6f733c11475bf470e637d34.
This reverts commit 02018c544ef113e980a2349eba89003d6f399d22.

Looks like we need more time for reviews, and incremental
changes will be hard to make sense of. So revert.

Link: https://lore.kernel.org/all/ZZP6FV5sXEf+xd58@shell.armlinux.org.uk/
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
30 files changed:
Documentation/netlink/specs/ethtool.yaml
Documentation/networking/ethtool-netlink.rst
Documentation/networking/index.rst
Documentation/networking/phy-link-topology.rst [deleted file]
MAINTAINERS
drivers/net/phy/Makefile
drivers/net/phy/at803x.c
drivers/net/phy/marvell-88x2222.c
drivers/net/phy/marvell.c
drivers/net/phy/marvell10g.c
drivers/net/phy/phy_device.c
drivers/net/phy/phy_link_topology.c [deleted file]
drivers/net/phy/phylink.c
drivers/net/phy/sfp-bus.c
include/linux/netdevice.h
include/linux/phy.h
include/linux/phy_link_topology.h [deleted file]
include/linux/phy_link_topology_core.h [deleted file]
include/linux/sfp.h
include/uapi/linux/ethtool.h
include/uapi/linux/ethtool_netlink.h
net/core/dev.c
net/ethtool/Makefile
net/ethtool/cabletest.c
net/ethtool/netlink.c
net/ethtool/netlink.h
net/ethtool/phy.c [deleted file]
net/ethtool/plca.c
net/ethtool/pse-pd.c
net/ethtool/strset.c

index 7f6fb1f61dd4522f7c0feb5330584e18d8e3a667..197208f419dce6df3cf6b4038c7eaf82a3f0d8ef 100644 (file)
@@ -16,11 +16,6 @@ definitions:
     name: stringset
     type: enum
     entries: []
-  -
-    name: phy-upstream-type
-    enum-name:
-    type: enum
-    entries: [ mac, phy ]
 
 attribute-sets:
   -
@@ -35,9 +30,6 @@ attribute-sets:
       -
         name: flags
         type: u32
-      -
-        name: phy-index
-        type: u32
 
   -
     name: bitset-bit
@@ -950,45 +942,6 @@ attribute-sets:
       -
         name: burst-tmr
         type: u32
-  -
-    name: phy-upstream
-    attributes:
-      -
-        name: index
-        type: u32
-      -
-        name: sfp-name
-        type: string
-  -
-    name: phy
-    attributes:
-      -
-        name: header
-        type: nest
-        nested-attributes: header
-      -
-        name: index
-        type: u32
-      -
-        name: drvname
-        type: string
-      -
-        name: name
-        type: string
-      -
-        name: upstream-type
-        type: u8
-        enum: phy-upstream-type
-      -
-        name: upstream
-        type: nest
-        nested-attributes: phy-upstream
-      -
-        name: downstream-sfp-name
-        type: string
-      -
-        name: id
-        type: u32
 
 operations:
   enum-model: directional
@@ -1740,24 +1693,3 @@ operations:
       name: mm-ntf
       doc: Notification for change in MAC Merge configuration.
       notify: mm-get
-    -
-      name: phy-get
-      doc: Get PHY devices attached to an interface
-
-      attribute-set: phy
-
-      do: &phy-get-op
-        request:
-          attributes:
-            - header
-        reply:
-          attributes:
-            - header
-            - index
-            - drvname
-            - name
-            - upstream-type
-            - upstream
-            - downstream-sfp-name
-            - id
-      dump: *phy-get-op
index 97ff787a7dd85d4e12b30749f1402504e54460b0..d583d9abf2f80698a7f4ca3ef47ce676e71767e1 100644 (file)
@@ -57,7 +57,6 @@ Structure of this header is
   ``ETHTOOL_A_HEADER_DEV_INDEX``  u32     device ifindex
   ``ETHTOOL_A_HEADER_DEV_NAME``   string  device name
   ``ETHTOOL_A_HEADER_FLAGS``      u32     flags common for all requests
-  ``ETHTOOL_A_HEADER_PHY_INDEX``  u32     phy device index
   ==============================  ======  =============================
 
 ``ETHTOOL_A_HEADER_DEV_INDEX`` and ``ETHTOOL_A_HEADER_DEV_NAME`` identify the
@@ -82,12 +81,6 @@ the behaviour is backward compatible, i.e. requests from old clients not aware
 of the flag should be interpreted the way the client expects. A client must
 not set flags it does not understand.
 
-``ETHTOOL_A_HEADER_PHY_INDEX`` identify the ethernet PHY the message relates to.
-As there are numerous commands that are related to PHY configuration, and because
-we can have more than one PHY on the link, the PHY index can be passed in the
-request for the commands that needs it. It is however not mandatory, and if it
-is not passed for commands that target a PHY, the net_device.phydev pointer
-is used, as a fallback that keeps the legacy behaviour.
 
 Bit sets
 ========
@@ -2011,49 +2004,6 @@ The attributes are propagated to the driver through the following structure:
 .. kernel-doc:: include/linux/ethtool.h
     :identifiers: ethtool_mm_cfg
 
-PHY_GET
-=======
-
-Retrieve information about a given Ethernet PHY sitting on the link. As there
-can be more than one PHY, the DUMP operation can be used to list the PHYs
-present on a given interface, by passing an interface index or name in
-the dump request
-
-Request contents:
-
-  ====================================  ======  ==========================
-  ``ETHTOOL_A_PHY_HEADER``              nested  request header
-  ====================================  ======  ==========================
-
-Kernel response contents:
-
-  ===================================== ======  ==========================
-  ``ETHTOOL_A_PHY_HEADER``              nested  request header
-  ``ETHTOOL_A_PHY_INDEX``               u32     the phy's unique index, that can
-                                                be used for phy-specific requests
-  ``ETHTOOL_A_PHY_DRVNAME``             string  the phy driver name
-  ``ETHTOOL_A_PHY_NAME``                string  the phy device name
-  ``ETHTOOL_A_PHY_UPSTREAM_TYPE``       u32     the type of device this phy is
-                                                connected to
-  ``ETHTOOL_A_PHY_UPSTREAM_PHY``        nested  if the phy is connected to another
-                                                phy, this nest contains info on
-                                                that connection
-  ``ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME`` string  if the phy controls an sfp bus,
-                                                the name of the sfp bus
-  ``ETHTOOL_A_PHY_ID``                  u32     the phy id if the phy is C22
-  ===================================== ======  ==========================
-
-When ``ETHTOOL_A_PHY_UPSTREAM_TYPE`` is PHY_UPSTREAM_PHY, the PHY's parent is
-another PHY. Information on the parent PHY will be set in the
-``ETHTOOL_A_PHY_UPSTREAM_PHY`` nest, which has the following structure :
-
-  =================================== ======  ==========================
-  ``ETHTOOL_A_PHY_UPSTREAM_INDEX``    u32     the PHY index of the upstream PHY
-  ``ETHTOOL_A_PHY_UPSTREAM_SFP_NAME`` string  if this PHY is connected to it's
-                                                parent PHY through an SFP bus, the
-                                                name of this sfp bus
-  =================================== ======  ==========================
-
 Request translation
 ===================
 
@@ -2160,5 +2110,4 @@ are netlink only.
   n/a                                 ``ETHTOOL_MSG_PLCA_GET_STATUS``
   n/a                                 ``ETHTOOL_MSG_MM_GET``
   n/a                                 ``ETHTOOL_MSG_MM_SET``
-  n/a                                 ``ETHTOOL_MSG_PHY_GET``
   =================================== =====================================
index a2c45a75a4a6155415887bf21661f33b0ee3a4af..69f3d6dcd9fd814ff8181e839cdaa24c596ed34e 100644 (file)
@@ -88,7 +88,6 @@ Contents:
    operstates
    packet_mmap
    phonet
-   phy-link-topology
    pktgen
    plip
    ppp_generic
diff --git a/Documentation/networking/phy-link-topology.rst b/Documentation/networking/phy-link-topology.rst
deleted file mode 100644 (file)
index 1fd8e90..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-.. SPDX-License-Identifier: GPL-2.0
-
-=================
-PHY link topology
-=================
-
-Overview
-========
-
-The PHY link topology representation in the networking stack aims at representing
-the hardware layout for any given Ethernet link.
-
-An Ethernet Interface from userspace's point of view is nothing but a
-:c:type:`struct net_device <net_device>`, which exposes configuration options
-through the legacy ioctls and the ethool netlink commands. The base assumption
-when designing these configuration channels were that the link looked
-something like this ::
-
-  +-----------------------+        +----------+      +--------------+
-  | Ethernet Controller / |        | Ethernet |      | Connector /  |
-  |       MAC             | ------ |   PHY    | ---- |    Port      | ---... to LP
-  +-----------------------+        +----------+      +--------------+
-  struct net_device               struct phy_device
-
-Commands that needs to configure the PHY will go through the net_device.phydev
-field to reach the PHY and perform the relevant configuration.
-
-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).
-
-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.
-
-The link topology then looks like this (when an SFP module is inserted) ::
-
-  +-----+  SGMII  +------------+
-  | MAC | ------- | SFP Module |
-  +-----+         +------------+
-
-Knowing that some modules embed a PHY, the actual link is more like ::
-
-  +-----+  SGMII   +--------------+
-  | MAC | -------- | PHY (on SFP) |
-  +-----+          +--------------+
-
-In this case, the SFP PHY is handled by phylib, and registered by phylink through
-its SFP upstream ops.
-
-Now 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 ::
-
-  +-----+  RGMII  +-----------------------+  SGMII  +--------------+
-  | MAC | ------- | PHY (media converter) | ------- | PHY (on SFP) |
-  +-----+         +-----------------------+         +--------------+
-
-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.
-
-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.
-
-API
-===
-
-The :c:type:`struct phy_link_topology <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 :
-
-:c:func:`phy_link_topo_add_phy`
-
-Besides 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.
-
-The PHY can then be removed from the topology through
-
-:c:func:`phy_link_topo_del_phy`
-
-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.
-
-PHYs that are on a SFP module will also be automatically registered IF the SFP
-upstream is phylink (so, no media-converter).
-
-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 <sfp_upstream_ops>`.
-
-UAPI
-====
-
-There exist a set of netlink commands to query the link topology from userspace,
-see ``Documentation/networking/ethtool-netlink.rst``.
-
-The whole point of having a topology representation is to assign the phyindex
-field in :c:type:`struct phy_device <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.
-
-The retrieved index can then be passed as a request parameter using the
-``ETHTOOL_A_HEADER_PHY_INDEX`` field in the following ethnl commands :
-
-* ``ETHTOOL_MSG_STRSET_GET`` to get the stats string set from a given PHY
-* ``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)
-* ``ETHTOOL_MSG_PSE_SET`` and ``ETHTOOL_MSG_PSE_GET`` for PHY-controlled PoE and PSE settings
-* ``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
-
-Note that the PHY index can be passed to other requests, which will silently
-ignore it if present and irrelevant.
index 79ac49b113dc89efa3683039b9c72376dbfc1188..2b916990d7f02a732658ed25726b497fb30d9607 100644 (file)
@@ -7871,8 +7871,6 @@ F:        include/linux/mii.h
 F:     include/linux/of_net.h
 F:     include/linux/phy.h
 F:     include/linux/phy_fixed.h
-F:     include/linux/phy_link_topology.h
-F:     include/linux/phy_link_topology_core.h
 F:     include/linux/phylib_stubs.h
 F:     include/linux/platform_data/mdio-bcm-unimac.h
 F:     include/linux/platform_data/mdio-gpio.h
index f218954fd7a8c7728ee73b2eeeaee10de1d3588e..6097afd4439229020a6c1af9d98630e356e33ad9 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for Linux PHY drivers
 
 libphy-y                       := phy.o phy-c45.o phy-core.o phy_device.o \
-                                  linkmode.o phy_link_topology.o
+                                  linkmode.o
 mdio-bus-y                     += mdio_bus.o mdio_device.o
 
 ifdef CONFIG_MDIO_DEVICE
index aaf6c654aaede6fb6bcd045e5bee0cd4ae3e3a04..19cfbf36fe80445cb59f2cc1f9421211e32217c9 100644 (file)
@@ -1452,8 +1452,6 @@ static const struct sfp_upstream_ops at8031_sfp_ops = {
        .attach = phy_sfp_attach,
        .detach = phy_sfp_detach,
        .module_insert = at8031_sfp_insert,
-       .connect_phy = phy_sfp_connect_phy,
-       .disconnect_phy = phy_sfp_disconnect_phy,
 };
 
 static int at8031_parse_dt(struct phy_device *phydev)
index 3f77bbc7e04f1a84e82e5073d35976472351f1a1..e3aa30dad2e63843dfa17e67103e4bf8dc2bb6cf 100644 (file)
@@ -555,8 +555,6 @@ static const struct sfp_upstream_ops sfp_phy_ops = {
        .link_down = mv2222_sfp_link_down,
        .attach = phy_sfp_attach,
        .detach = phy_sfp_detach,
-       .connect_phy = phy_sfp_connect_phy,
-       .disconnect_phy = phy_sfp_disconnect_phy,
 };
 
 static int mv2222_probe(struct phy_device *phydev)
index 674e29bce2ccb89ed1ae3e7c9b17bd48ca8fe188..eba652a4c1d8873ed758f267e20ea34a0880552c 100644 (file)
@@ -3254,8 +3254,6 @@ static const struct sfp_upstream_ops m88e1510_sfp_ops = {
        .module_remove = m88e1510_sfp_remove,
        .attach = phy_sfp_attach,
        .detach = phy_sfp_detach,
-       .connect_phy = phy_sfp_connect_phy,
-       .disconnect_phy = phy_sfp_disconnect_phy,
 };
 
 static int m88e1510_probe(struct phy_device *phydev)
index 6642eb642d4bdd3880ddd7fdbc3471bc2c78e5ea..ad43e280930c35eaef7454813143c1a2eb8a0fae 100644 (file)
@@ -503,8 +503,6 @@ static int mv3310_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
 static const struct sfp_upstream_ops mv3310_sfp_ops = {
        .attach = phy_sfp_attach,
        .detach = phy_sfp_detach,
-       .connect_phy = phy_sfp_connect_phy,
-       .disconnect_phy = phy_sfp_disconnect_phy,
        .module_insert = mv3310_sfp_insert,
 };
 
index 1e595762afea28e37fcc31b89726b5fbdb838a86..3611ea64875effbcc76d83def3d798fc9f59c130 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/phy.h>
 #include <linux/phylib_stubs.h>
 #include <linux/phy_led_triggers.h>
-#include <linux/phy_link_topology.h>
 #include <linux/pse-pd/pse.h>
 #include <linux/property.h>
 #include <linux/rtnetlink.h>
@@ -266,14 +265,6 @@ static void phy_mdio_device_remove(struct mdio_device *mdiodev)
 
 static struct phy_driver genphy_driver;
 
-static struct phy_link_topology *phy_get_link_topology(struct phy_device *phydev)
-{
-       if (phydev->attached_dev)
-               return &phydev->attached_dev->link_topo;
-
-       return NULL;
-}
-
 static LIST_HEAD(phy_fixup_list);
 static DEFINE_MUTEX(phy_fixup_lock);
 
@@ -1363,46 +1354,6 @@ phy_standalone_show(struct device *dev, struct device_attribute *attr,
 }
 static DEVICE_ATTR_RO(phy_standalone);
 
-/**
- * phy_sfp_connect_phy - Connect the SFP module's PHY to the upstream PHY
- * @upstream: pointer to the upstream phy device
- * @phy: pointer to the SFP module's phy device
- *
- * This helper allows keeping track of PHY devices on the link. It adds the
- * SFP module's phy to the phy namespace of the upstream phy
- */
-int phy_sfp_connect_phy(void *upstream, struct phy_device *phy)
-{
-       struct phy_device *phydev = upstream;
-       struct phy_link_topology *topo = phy_get_link_topology(phydev);
-
-       if (topo)
-               return phy_link_topo_add_phy(topo, phy, PHY_UPSTREAM_PHY, phydev);
-
-       return 0;
-}
-EXPORT_SYMBOL(phy_sfp_connect_phy);
-
-/**
- * phy_sfp_disconnect_phy - Disconnect the SFP module's PHY from the upstream PHY
- * @upstream: pointer to the upstream phy device
- * @phy: pointer to the SFP module's phy device
- *
- * This helper allows keeping track of PHY devices on the link. It removes the
- * SFP module's phy to the phy namespace of the upstream phy. As the module phy
- * will be destroyed, re-inserting the same module will add a new phy with a
- * new index.
- */
-void phy_sfp_disconnect_phy(void *upstream, struct phy_device *phy)
-{
-       struct phy_device *phydev = upstream;
-       struct phy_link_topology *topo = phy_get_link_topology(phydev);
-
-       if (topo)
-               phy_link_topo_del_phy(topo, phy);
-}
-EXPORT_SYMBOL(phy_sfp_disconnect_phy);
-
 /**
  * phy_sfp_attach - attach the SFP bus to the PHY upstream network device
  * @upstream: pointer to the phy device
@@ -1540,11 +1491,6 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
 
                if (phydev->sfp_bus_attached)
                        dev->sfp_bus = phydev->sfp_bus;
-
-               err = phy_link_topo_add_phy(&dev->link_topo, phydev,
-                                           PHY_UPSTREAM_MAC, dev);
-               if (err)
-                       goto error;
        }
 
        /* Some Ethernet drivers try to connect to a PHY device before
@@ -1874,7 +1820,6 @@ void phy_detach(struct phy_device *phydev)
        if (dev) {
                phydev->attached_dev->phydev = NULL;
                phydev->attached_dev = NULL;
-               phy_link_topo_del_phy(&dev->link_topo, phydev);
        }
        phydev->phylink = NULL;
 
diff --git a/drivers/net/phy/phy_link_topology.c b/drivers/net/phy/phy_link_topology.c
deleted file mode 100644 (file)
index 34e7e08..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Infrastructure to handle all PHY devices connected to a given netdev,
- * either directly or indirectly attached.
- *
- * Copyright (c) 2023 Maxime Chevallier<maxime.chevallier@bootlin.com>
- */
-
-#include <linux/phy_link_topology.h>
-#include <linux/netdevice.h>
-#include <linux/phy.h>
-#include <linux/rtnetlink.h>
-#include <linux/xarray.h>
-
-int phy_link_topo_add_phy(struct phy_link_topology *topo,
-                         struct phy_device *phy,
-                         enum phy_upstream upt, void *upstream)
-{
-       struct phy_device_node *pdn;
-       int ret;
-
-       pdn = kzalloc(sizeof(*pdn), GFP_KERNEL);
-       if (!pdn)
-               return -ENOMEM;
-
-       pdn->phy = phy;
-       switch (upt) {
-       case PHY_UPSTREAM_MAC:
-               pdn->upstream.netdev = (struct net_device *)upstream;
-               if (phy_on_sfp(phy))
-                       pdn->parent_sfp_bus = pdn->upstream.netdev->sfp_bus;
-               break;
-       case PHY_UPSTREAM_PHY:
-               pdn->upstream.phydev = (struct phy_device *)upstream;
-               if (phy_on_sfp(phy))
-                       pdn->parent_sfp_bus = pdn->upstream.phydev->sfp_bus;
-               break;
-       default:
-               ret = -EINVAL;
-               goto err;
-       }
-       pdn->upstream_type = upt;
-
-       ret = xa_alloc_cyclic(&topo->phys, &phy->phyindex, pdn, xa_limit_32b,
-                             &topo->next_phy_index, GFP_KERNEL);
-       if (ret)
-               goto err;
-
-       return 0;
-
-err:
-       kfree(pdn);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(phy_link_topo_add_phy);
-
-void phy_link_topo_del_phy(struct phy_link_topology *topo,
-                          struct phy_device *phy)
-{
-       struct phy_device_node *pdn = xa_erase(&topo->phys, phy->phyindex);
-
-       phy->phyindex = 0;
-
-       kfree(pdn);
-}
-EXPORT_SYMBOL_GPL(phy_link_topo_del_phy);
index a816391add1200da59fc3510056605527bc4806f..ed0b4ccaa6a66aa19f9a46dabfbe96a83f2cf20d 100644 (file)
@@ -3385,8 +3385,7 @@ static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
        return ret;
 }
 
-static void phylink_sfp_disconnect_phy(void *upstream,
-                                      struct phy_device *phydev)
+static void phylink_sfp_disconnect_phy(void *upstream)
 {
        phylink_disconnect_phy(upstream);
 }
index fb1c102714b5b3c907febc2b0c38221ad51e7fd5..6fa679b36290ed528d942b8f3450217ec4a0b1bf 100644 (file)
@@ -486,7 +486,7 @@ static void sfp_unregister_bus(struct sfp_bus *bus)
                        bus->socket_ops->stop(bus->sfp);
                bus->socket_ops->detach(bus->sfp);
                if (bus->phydev && ops && ops->disconnect_phy)
-                       ops->disconnect_phy(bus->upstream, bus->phydev);
+                       ops->disconnect_phy(bus->upstream);
        }
        bus->registered = false;
 }
@@ -742,7 +742,7 @@ void sfp_remove_phy(struct sfp_bus *bus)
        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 
        if (ops && ops->disconnect_phy)
-               ops->disconnect_phy(bus->upstream, bus->phydev);
+               ops->disconnect_phy(bus->upstream);
        bus->phydev = NULL;
 }
 EXPORT_SYMBOL_GPL(sfp_remove_phy);
@@ -859,14 +859,3 @@ void sfp_unregister_socket(struct sfp_bus *bus)
        sfp_bus_put(bus);
 }
 EXPORT_SYMBOL_GPL(sfp_unregister_socket);
-
-const char *sfp_get_name(struct sfp_bus *bus)
-{
-       ASSERT_RTNL();
-
-       if (bus->sfp_dev)
-               return dev_name(bus->sfp_dev);
-
-       return NULL;
-}
-EXPORT_SYMBOL_GPL(sfp_get_name);
index e265aa1f21699ad567fe3af8e748be51cb7be7d6..118c40258d07b787adf518e576e75545e4bae846 100644 (file)
@@ -40,6 +40,7 @@
 #include <net/dcbnl.h>
 #endif
 #include <net/netprio_cgroup.h>
+
 #include <linux/netdev_features.h>
 #include <linux/neighbour.h>
 #include <uapi/linux/netdevice.h>
@@ -51,7 +52,6 @@
 #include <net/net_trackers.h>
 #include <net/net_debug.h>
 #include <net/dropreason-core.h>
-#include <linux/phy_link_topology_core.h>
 
 struct netpoll_info;
 struct device;
@@ -2047,7 +2047,6 @@ enum netdev_stat_type {
  *     @fcoe_ddp_xid:  Max exchange id for FCoE LRO by ddp
  *
  *     @priomap:       XXX: need comments on this one
- *     @link_topo:     Physical link topology tracking attached PHYs
  *     @phydev:        Physical device may attach itself
  *                     for hardware timestamping
  *     @sfp_bus:       attached &struct sfp_bus structure.
@@ -2442,7 +2441,6 @@ struct net_device {
 #if IS_ENABLED(CONFIG_CGROUP_NET_PRIO)
        struct netprio_map __rcu *priomap;
 #endif
-       struct phy_link_topology        link_topo;
        struct phy_device       *phydev;
        struct sfp_bus          *sfp_bus;
        struct lock_class_key   *qdisc_tx_busylock;
index 6cb9d843aee93279e9196f981555f6b7c2a8a979..e9e85d347587208e8206e33fb2ea17cfa061126d 100644 (file)
@@ -544,9 +544,6 @@ struct macsec_ops;
  * @drv: Pointer to the driver for this PHY instance
  * @devlink: Create a link between phy dev and mac dev, if the external phy
  *           used by current mac interface is managed by another mac interface.
- * @phyindex: Unique id across the phy's parent tree of phys to address the PHY
- *           from userspace, similar to ifindex. A zero index means the PHY
- *           wasn't assigned an id yet.
  * @phy_id: UID for this device found during discovery
  * @c45_ids: 802.3-c45 Device Identifiers if is_c45.
  * @is_c45:  Set to true if this PHY uses clause 45 addressing.
@@ -646,7 +643,6 @@ struct phy_device {
 
        struct device_link *devlink;
 
-       u32 phyindex;
        u32 phy_id;
 
        struct phy_c45_device_ids c45_ids;
@@ -1726,8 +1722,6 @@ int phy_suspend(struct phy_device *phydev);
 int phy_resume(struct phy_device *phydev);
 int __phy_resume(struct phy_device *phydev);
 int phy_loopback(struct phy_device *phydev, bool enable);
-int phy_sfp_connect_phy(void *upstream, struct phy_device *phy);
-void phy_sfp_disconnect_phy(void *upstream, struct phy_device *phy);
 void phy_sfp_attach(void *upstream, struct sfp_bus *bus);
 void phy_sfp_detach(void *upstream, struct sfp_bus *bus);
 int phy_sfp_probe(struct phy_device *phydev,
diff --git a/include/linux/phy_link_topology.h b/include/linux/phy_link_topology.h
deleted file mode 100644 (file)
index 9190226..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * PHY device list allow maintaining a list of PHY devices that are
- * part of a netdevice's link topology. PHYs can for example be chained,
- * as is the case when using a PHY that exposes an SFP module, on which an
- * SFP transceiver that embeds a PHY is connected.
- *
- * This list can then be used by userspace to leverage individual PHY
- * capabilities.
- */
-#ifndef __PHY_LINK_TOPOLOGY_H
-#define __PHY_LINK_TOPOLOGY_H
-
-#include <linux/ethtool.h>
-#include <linux/phy_link_topology_core.h>
-
-struct xarray;
-struct phy_device;
-struct net_device;
-struct sfp_bus;
-
-struct phy_device_node {
-       enum phy_upstream upstream_type;
-
-       union {
-               struct net_device       *netdev;
-               struct phy_device       *phydev;
-       } upstream;
-
-       struct sfp_bus *parent_sfp_bus;
-
-       struct phy_device *phy;
-};
-
-static inline struct phy_device *
-phy_link_topo_get_phy(struct phy_link_topology *topo, u32 phyindex)
-{
-       struct phy_device_node *pdn = xa_load(&topo->phys, phyindex);
-
-       if (pdn)
-               return pdn->phy;
-
-       return NULL;
-}
-
-#if IS_ENABLED(CONFIG_PHYLIB)
-int phy_link_topo_add_phy(struct phy_link_topology *topo,
-                         struct phy_device *phy,
-                         enum phy_upstream upt, void *upstream);
-
-void phy_link_topo_del_phy(struct phy_link_topology *lt, struct phy_device *phy);
-
-#else
-static inline int phy_link_topo_add_phy(struct phy_link_topology *topo,
-                                       struct phy_device *phy,
-                                       enum phy_upstream upt, void *upstream)
-{
-       return 0;
-}
-
-static inline void phy_link_topo_del_phy(struct phy_link_topology *topo,
-                                        struct phy_device *phy)
-{
-}
-#endif
-
-#endif /* __PHY_LINK_TOPOLOGY_H */
diff --git a/include/linux/phy_link_topology_core.h b/include/linux/phy_link_topology_core.h
deleted file mode 100644 (file)
index 78c75f9..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __PHY_LINK_TOPOLOGY_CORE_H
-#define __PHY_LINK_TOPOLOGY_CORE_H
-
-struct xarray;
-
-struct phy_link_topology {
-       struct xarray phys;
-
-       u32 next_phy_index;
-};
-
-static inline void phy_link_topo_init(struct phy_link_topology *topo)
-{
-       xa_init_flags(&topo->phys, XA_FLAGS_ALLOC1);
-       topo->next_phy_index = 1;
-}
-
-#endif /* __PHY_LINK_TOPOLOGY_CORE_H */
index 55c0ab17c9e2e5d190f10ddcbfeb9993a098999c..9346cd44814d6aa0b69968baad4a261dfc6adbf9 100644 (file)
@@ -544,7 +544,7 @@ struct sfp_upstream_ops {
        void (*link_down)(void *priv);
        void (*link_up)(void *priv);
        int (*connect_phy)(void *priv, struct phy_device *);
-       void (*disconnect_phy)(void *priv, struct phy_device *);
+       void (*disconnect_phy)(void *priv);
 };
 
 #if IS_ENABLED(CONFIG_SFP)
@@ -570,7 +570,6 @@ struct sfp_bus *sfp_bus_find_fwnode(const struct fwnode_handle *fwnode);
 int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
                         const struct sfp_upstream_ops *ops);
 void sfp_bus_del_upstream(struct sfp_bus *bus);
-const char *sfp_get_name(struct sfp_bus *bus);
 #else
 static inline int sfp_parse_port(struct sfp_bus *bus,
                                 const struct sfp_eeprom_id *id,
@@ -649,11 +648,6 @@ static inline int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
 static inline void sfp_bus_del_upstream(struct sfp_bus *bus)
 {
 }
-
-static inline const char *sfp_get_name(struct sfp_bus *bus)
-{
-       return NULL;
-}
 #endif
 
 #endif
index 01ba529dbb6db22bb700682f81e2b3ab751ac347..06ef6b78b7de7cc04e9a353887cae981843a739a 100644 (file)
@@ -2220,20 +2220,4 @@ struct ethtool_link_settings {
         * __u32 map_lp_advertising[link_mode_masks_nwords];
         */
 };
-
-/**
- * enum phy_upstream - Represents the upstream component a given PHY device
- * is connected to, as in what is on the other end of the MII bus. Most PHYs
- * will be attached to an Ethernet MAC controller, but in some cases, there's
- * an intermediate PHY used as a media-converter, which will driver another
- * MII interface as its output.
- * @PHY_UPSTREAM_MAC: Upstream component is a MAC (a switch port,
- *                   or ethernet controller)
- * @PHY_UPSTREAM_PHY: Upstream component is a PHY (likely a media converter)
- */
-enum phy_upstream {
-       PHY_UPSTREAM_MAC,
-       PHY_UPSTREAM_PHY,
-};
-
 #endif /* _UAPI_LINUX_ETHTOOL_H */
index 00cd7ad1670938a4d8f4857291be74206123f419..3f89074aa06c6284632517c647d343782cf9dabb 100644 (file)
@@ -57,7 +57,6 @@ enum {
        ETHTOOL_MSG_PLCA_GET_STATUS,
        ETHTOOL_MSG_MM_GET,
        ETHTOOL_MSG_MM_SET,
-       ETHTOOL_MSG_PHY_GET,
 
        /* add new constants above here */
        __ETHTOOL_MSG_USER_CNT,
@@ -110,8 +109,6 @@ enum {
        ETHTOOL_MSG_PLCA_NTF,
        ETHTOOL_MSG_MM_GET_REPLY,
        ETHTOOL_MSG_MM_NTF,
-       ETHTOOL_MSG_PHY_GET_REPLY,
-       ETHTOOL_MSG_PHY_NTF,
 
        /* add new constants above here */
        __ETHTOOL_MSG_KERNEL_CNT,
@@ -136,7 +133,6 @@ enum {
        ETHTOOL_A_HEADER_DEV_INDEX,             /* u32 */
        ETHTOOL_A_HEADER_DEV_NAME,              /* string */
        ETHTOOL_A_HEADER_FLAGS,                 /* u32 - ETHTOOL_FLAG_* */
-       ETHTOOL_A_HEADER_PHY_INDEX,             /* u32 */
 
        /* add new constants above here */
        __ETHTOOL_A_HEADER_CNT,
@@ -980,32 +976,6 @@ enum {
        ETHTOOL_A_MM_MAX = (__ETHTOOL_A_MM_CNT - 1)
 };
 
-enum {
-       ETHTOOL_A_PHY_UPSTREAM_UNSPEC,
-       ETHTOOL_A_PHY_UPSTREAM_INDEX,                   /* u32 */
-       ETHTOOL_A_PHY_UPSTREAM_SFP_NAME,                /* string */
-
-       /* add new constants above here */
-       __ETHTOOL_A_PHY_UPSTREAM_CNT,
-       ETHTOOL_A_PHY_UPSTREAM_MAX = (__ETHTOOL_A_PHY_UPSTREAM_CNT - 1)
-};
-
-enum {
-       ETHTOOL_A_PHY_UNSPEC,
-       ETHTOOL_A_PHY_HEADER,                   /* nest - _A_HEADER_* */
-       ETHTOOL_A_PHY_INDEX,                    /* u32 */
-       ETHTOOL_A_PHY_DRVNAME,                  /* string */
-       ETHTOOL_A_PHY_NAME,                     /* string */
-       ETHTOOL_A_PHY_UPSTREAM_TYPE,            /* u8 */
-       ETHTOOL_A_PHY_UPSTREAM,                 /* nest - _A_PHY_UPSTREAM_* */
-       ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME,      /* string */
-       ETHTOOL_A_PHY_ID,                       /* u32 */
-
-       /* add new constants above here */
-       __ETHTOOL_A_PHY_CNT,
-       ETHTOOL_A_PHY_MAX = (__ETHTOOL_A_PHY_CNT - 1)
-};
-
 /* generic netlink info */
 #define ETHTOOL_GENL_NAME "ethtool"
 #define ETHTOOL_GENL_VERSION 1
index bc4ac49d4643a557d034ec7cad7194e152a4b9c5..f01a9b858347b41e88c25632d5d9524cbabba9a1 100644 (file)
 #include <linux/prandom.h>
 #include <linux/once_lite.h>
 #include <net/netdev_rx_queue.h>
-#include <linux/phy_link_topology_core.h>
 
 #include "dev.h"
 #include "net-sysfs.h"
@@ -10876,8 +10875,6 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
 #ifdef CONFIG_NET_SCHED
        hash_init(dev->qdisc_hash);
 #endif
-       phy_link_topo_init(&dev->link_topo);
-
        dev->priv_flags = IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM;
        setup(dev);
 
index 0ccd0e9afd3f79cfba5bd48f932694a32af6af7d..504f954a1b2842a63a2baca0dd22c0b785f4351b 100644 (file)
@@ -8,4 +8,4 @@ ethtool_nl-y    := netlink.o bitset.o strset.o linkinfo.o linkmodes.o rss.o \
                   linkstate.o debug.o wol.o features.o privflags.o rings.o \
                   channels.o coalesce.o pause.o eee.o tsinfo.o cabletest.o \
                   tunnels.o fec.o eeprom.o stats.o phc_vclocks.o mm.o \
-                  module.o pse-pd.o plca.o mm.o phy.o
+                  module.o pse-pd.o plca.o mm.o
index 6b00d0800f2382f8fc8986ec86f44520a701d8f0..06a151165c31ce59928d4a4769b5fce2749c53c7 100644 (file)
@@ -69,7 +69,7 @@ int ethnl_act_cable_test(struct sk_buff *skb, struct genl_info *info)
                return ret;
 
        dev = req_info.dev;
-       if (!req_info.phydev) {
+       if (!dev->phydev) {
                ret = -EOPNOTSUPP;
                goto out_dev_put;
        }
@@ -85,12 +85,12 @@ int ethnl_act_cable_test(struct sk_buff *skb, struct genl_info *info)
        if (ret < 0)
                goto out_rtnl;
 
-       ret = ops->start_cable_test(req_info.phydev, info->extack);
+       ret = ops->start_cable_test(dev->phydev, info->extack);
 
        ethnl_ops_complete(dev);
 
        if (!ret)
-               ethnl_cable_test_started(req_info.phydev,
+               ethnl_cable_test_started(dev->phydev,
                                         ETHTOOL_MSG_CABLE_TEST_NTF);
 
 out_rtnl:
@@ -321,7 +321,7 @@ int ethnl_act_cable_test_tdr(struct sk_buff *skb, struct genl_info *info)
                return ret;
 
        dev = req_info.dev;
-       if (!req_info.phydev) {
+       if (!dev->phydev) {
                ret = -EOPNOTSUPP;
                goto out_dev_put;
        }
@@ -342,12 +342,12 @@ int ethnl_act_cable_test_tdr(struct sk_buff *skb, struct genl_info *info)
        if (ret < 0)
                goto out_rtnl;
 
-       ret = ops->start_cable_test_tdr(req_info.phydev, info->extack, &cfg);
+       ret = ops->start_cable_test_tdr(dev->phydev, info->extack, &cfg);
 
        ethnl_ops_complete(dev);
 
        if (!ret)
-               ethnl_cable_test_started(req_info.phydev,
+               ethnl_cable_test_started(dev->phydev,
                                         ETHTOOL_MSG_CABLE_TEST_TDR_NTF);
 
 out_rtnl:
index 92b0dd8ca04667f5559f24fb9bad8881fd49921d..fe3553f60bf39e64602d932505a0851e692348a0 100644 (file)
@@ -4,7 +4,6 @@
 #include <linux/ethtool_netlink.h>
 #include <linux/pm_runtime.h>
 #include "netlink.h"
-#include <linux/phy_link_topology.h>
 
 static struct genl_family ethtool_genl_family;
 
@@ -21,7 +20,6 @@ const struct nla_policy ethnl_header_policy[] = {
                                            .len = ALTIFNAMSIZ - 1 },
        [ETHTOOL_A_HEADER_FLAGS]        = NLA_POLICY_MASK(NLA_U32,
                                                          ETHTOOL_FLAGS_BASIC),
-       [ETHTOOL_A_HEADER_PHY_INDEX]            = NLA_POLICY_MIN(NLA_U32, 1),
 };
 
 const struct nla_policy ethnl_header_policy_stats[] = {
@@ -30,7 +28,6 @@ const struct nla_policy ethnl_header_policy_stats[] = {
                                            .len = ALTIFNAMSIZ - 1 },
        [ETHTOOL_A_HEADER_FLAGS]        = NLA_POLICY_MASK(NLA_U32,
                                                          ETHTOOL_FLAGS_STATS),
-       [ETHTOOL_A_HEADER_PHY_INDEX]            = NLA_POLICY_MIN(NLA_U32, 1),
 };
 
 int ethnl_ops_begin(struct net_device *dev)
@@ -94,7 +91,6 @@ int ethnl_parse_header_dev_get(struct ethnl_req_info *req_info,
 {
        struct nlattr *tb[ARRAY_SIZE(ethnl_header_policy)];
        const struct nlattr *devname_attr;
-       struct phy_device *phydev = NULL;
        struct net_device *dev = NULL;
        u32 flags = 0;
        int ret;
@@ -149,26 +145,6 @@ int ethnl_parse_header_dev_get(struct ethnl_req_info *req_info,
                return -EINVAL;
        }
 
-       if (dev) {
-               if (tb[ETHTOOL_A_HEADER_PHY_INDEX]) {
-                       u32 phy_index = nla_get_u32(tb[ETHTOOL_A_HEADER_PHY_INDEX]);
-
-                       phydev = phy_link_topo_get_phy(&dev->link_topo,
-                                                      phy_index);
-                       if (!phydev) {
-                               NL_SET_ERR_MSG_ATTR(extack, header,
-                                                   "no phy matches phy index");
-                               return -EINVAL;
-                       }
-               } else {
-                       /* If we need a PHY but no phy index is specified, fallback
-                        * to dev->phydev
-                        */
-                       phydev = dev->phydev;
-               }
-       }
-
-       req_info->phydev = phydev;
        req_info->dev = dev;
        req_info->flags = flags;
        return 0;
@@ -1153,15 +1129,6 @@ static const struct genl_ops ethtool_genl_ops[] = {
                .policy = ethnl_mm_set_policy,
                .maxattr = ARRAY_SIZE(ethnl_mm_set_policy) - 1,
        },
-       {
-               .cmd    = ETHTOOL_MSG_PHY_GET,
-               .doit   = ethnl_phy_doit,
-               .start  = ethnl_phy_start,
-               .dumpit = ethnl_phy_dumpit,
-               .done   = ethnl_phy_done,
-               .policy = ethnl_phy_get_policy,
-               .maxattr = ARRAY_SIZE(ethnl_phy_get_policy) - 1,
-       },
 };
 
 static const struct genl_multicast_group ethtool_nl_mcgrps[] = {
index 5e6a43e35a094d2862dd22163444251b41d9bf00..9a333a8d04c1f0d83c14e8983e4ca01578cb26f7 100644 (file)
@@ -250,7 +250,6 @@ static inline unsigned int ethnl_reply_header_size(void)
  * @dev:   network device the request is for (may be null)
  * @dev_tracker: refcount tracker for @dev reference
  * @flags: request flags common for all request types
- * @phydev: phy_device connected to @dev this request is for (may be null)
  *
  * This is a common base for request specific structures holding data from
  * parsed userspace request. These always embed struct ethnl_req_info at
@@ -260,7 +259,6 @@ struct ethnl_req_info {
        struct net_device       *dev;
        netdevice_tracker       dev_tracker;
        u32                     flags;
-       struct phy_device       *phydev;
 };
 
 static inline void ethnl_parse_header_dev_put(struct ethnl_req_info *req_info)
@@ -397,10 +395,9 @@ extern const struct ethnl_request_ops ethnl_rss_request_ops;
 extern const struct ethnl_request_ops ethnl_plca_cfg_request_ops;
 extern const struct ethnl_request_ops ethnl_plca_status_request_ops;
 extern const struct ethnl_request_ops ethnl_mm_request_ops;
-extern const struct ethnl_request_ops ethnl_phy_request_ops;
 
-extern const struct nla_policy ethnl_header_policy[ETHTOOL_A_HEADER_PHY_INDEX + 1];
-extern const struct nla_policy ethnl_header_policy_stats[ETHTOOL_A_HEADER_PHY_INDEX + 1];
+extern const struct nla_policy ethnl_header_policy[ETHTOOL_A_HEADER_FLAGS + 1];
+extern const struct nla_policy ethnl_header_policy_stats[ETHTOOL_A_HEADER_FLAGS + 1];
 extern const struct nla_policy ethnl_strset_get_policy[ETHTOOL_A_STRSET_COUNTS_ONLY + 1];
 extern const struct nla_policy ethnl_linkinfo_get_policy[ETHTOOL_A_LINKINFO_HEADER + 1];
 extern const struct nla_policy ethnl_linkinfo_set_policy[ETHTOOL_A_LINKINFO_TP_MDIX_CTRL + 1];
@@ -444,7 +441,6 @@ extern const struct nla_policy ethnl_plca_set_cfg_policy[ETHTOOL_A_PLCA_MAX + 1]
 extern const struct nla_policy ethnl_plca_get_status_policy[ETHTOOL_A_PLCA_HEADER + 1];
 extern const struct nla_policy ethnl_mm_get_policy[ETHTOOL_A_MM_HEADER + 1];
 extern const struct nla_policy ethnl_mm_set_policy[ETHTOOL_A_MM_MAX + 1];
-extern const struct nla_policy ethnl_phy_get_policy[ETHTOOL_A_PHY_HEADER + 1];
 
 int ethnl_set_features(struct sk_buff *skb, struct genl_info *info);
 int ethnl_act_cable_test(struct sk_buff *skb, struct genl_info *info);
@@ -452,10 +448,6 @@ int ethnl_act_cable_test_tdr(struct sk_buff *skb, struct genl_info *info);
 int ethnl_tunnel_info_doit(struct sk_buff *skb, struct genl_info *info);
 int ethnl_tunnel_info_start(struct netlink_callback *cb);
 int ethnl_tunnel_info_dumpit(struct sk_buff *skb, struct netlink_callback *cb);
-int ethnl_phy_start(struct netlink_callback *cb);
-int ethnl_phy_doit(struct sk_buff *skb, struct genl_info *info);
-int ethnl_phy_dumpit(struct sk_buff *skb, struct netlink_callback *cb);
-int ethnl_phy_done(struct netlink_callback *cb);
 
 extern const char stats_std_names[__ETHTOOL_STATS_CNT][ETH_GSTRING_LEN];
 extern const char stats_eth_phy_names[__ETHTOOL_A_STATS_ETH_PHY_CNT][ETH_GSTRING_LEN];
diff --git a/net/ethtool/phy.c b/net/ethtool/phy.c
deleted file mode 100644 (file)
index 5add284..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright 2023 Bootlin
- *
- */
-#include "common.h"
-#include "netlink.h"
-
-#include <linux/phy.h>
-#include <linux/phy_link_topology.h>
-#include <linux/sfp.h>
-
-struct phy_req_info {
-       struct ethnl_req_info           base;
-       struct phy_device_node          pdn;
-};
-
-#define PHY_REQINFO(__req_base) \
-       container_of(__req_base, struct phy_req_info, base)
-
-const struct nla_policy ethnl_phy_get_policy[ETHTOOL_A_PHY_HEADER + 1] = {
-       [ETHTOOL_A_PHY_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy),
-};
-
-/* Caller holds rtnl */
-static ssize_t
-ethnl_phy_reply_size(const struct ethnl_req_info *req_base,
-                    struct netlink_ext_ack *extack)
-{
-       struct phy_link_topology *topo;
-       struct phy_device_node *pdn;
-       struct phy_device *phydev;
-       unsigned long index;
-       size_t size;
-
-       ASSERT_RTNL();
-
-       topo = &req_base->dev->link_topo;
-
-       size = nla_total_size(0);
-
-       xa_for_each(&topo->phys, index, pdn) {
-               phydev = pdn->phy;
-
-               /* ETHTOOL_A_PHY_INDEX */
-               size += nla_total_size(sizeof(u32));
-
-               /* ETHTOOL_A_DRVNAME */
-               size += nla_total_size(strlen(phydev->drv->name) + 1);
-
-               /* ETHTOOL_A_NAME */
-               size += nla_total_size(strlen(dev_name(&phydev->mdio.dev)) + 1);
-
-               /* ETHTOOL_A_PHY_UPSTREAM_TYPE */
-               size += nla_total_size(sizeof(u8));
-
-               /* ETHTOOL_A_PHY_ID */
-               size += nla_total_size(sizeof(u32));
-
-               if (phy_on_sfp(phydev)) {
-                       const char *upstream_sfp_name = sfp_get_name(pdn->parent_sfp_bus);
-
-                       /* ETHTOOL_A_PHY_UPSTREAM_SFP_NAME */
-                       if (upstream_sfp_name)
-                               size += nla_total_size(strlen(upstream_sfp_name) + 1);
-
-                       /* ETHTOOL_A_PHY_UPSTREAM_INDEX */
-                       size += nla_total_size(sizeof(u32));
-               }
-
-               /* ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME */
-               if (phydev->sfp_bus) {
-                       const char *sfp_name = sfp_get_name(phydev->sfp_bus);
-
-                       if (sfp_name)
-                               size += nla_total_size(strlen(sfp_name) + 1);
-               }
-       }
-
-       return size;
-}
-
-static int
-ethnl_phy_fill_reply(const struct ethnl_req_info *req_base, struct sk_buff *skb)
-{
-       struct phy_req_info *req_info = PHY_REQINFO(req_base);
-       struct phy_device_node *pdn = &req_info->pdn;
-       struct phy_device *phydev = pdn->phy;
-       enum phy_upstream ptype;
-       struct nlattr *nest;
-
-       ptype = pdn->upstream_type;
-
-       if (nla_put_u32(skb, ETHTOOL_A_PHY_INDEX, phydev->phyindex) ||
-           nla_put_string(skb, ETHTOOL_A_PHY_DRVNAME, phydev->drv->name) ||
-           nla_put_string(skb, ETHTOOL_A_PHY_NAME, dev_name(&phydev->mdio.dev)) ||
-           nla_put_u8(skb, ETHTOOL_A_PHY_UPSTREAM_TYPE, ptype) ||
-           nla_put_u32(skb, ETHTOOL_A_PHY_ID, phydev->phy_id))
-               return -EMSGSIZE;
-
-       if (ptype == PHY_UPSTREAM_PHY) {
-               struct phy_device *upstream = pdn->upstream.phydev;
-               const char *sfp_upstream_name;
-
-               nest = nla_nest_start(skb, ETHTOOL_A_PHY_UPSTREAM);
-               if (!nest)
-                       return -EMSGSIZE;
-
-               /* Parent index */
-               if (nla_put_u32(skb, ETHTOOL_A_PHY_UPSTREAM_INDEX, upstream->phyindex))
-                       return -EMSGSIZE;
-
-               if (pdn->parent_sfp_bus) {
-                       sfp_upstream_name = sfp_get_name(pdn->parent_sfp_bus);
-                       if (sfp_upstream_name && nla_put_string(skb,
-                                                               ETHTOOL_A_PHY_UPSTREAM_SFP_NAME,
-                                                               sfp_upstream_name))
-                               return -EMSGSIZE;
-               }
-
-               nla_nest_end(skb, nest);
-       }
-
-       if (phydev->sfp_bus) {
-               const char *sfp_name = sfp_get_name(phydev->sfp_bus);
-
-               if (sfp_name &&
-                   nla_put_string(skb, ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME,
-                                  sfp_name))
-                       return -EMSGSIZE;
-       }
-
-       return 0;
-}
-
-static int ethnl_phy_parse_request(struct ethnl_req_info *req_base,
-                                  struct nlattr **tb)
-{
-       struct phy_link_topology *topo = &req_base->dev->link_topo;
-       struct phy_req_info *req_info = PHY_REQINFO(req_base);
-       struct phy_device_node *pdn;
-
-       if (!req_base->phydev)
-               return 0;
-
-       pdn = xa_load(&topo->phys, req_base->phydev->phyindex);
-       memcpy(&req_info->pdn, pdn, sizeof(*pdn));
-
-       return 0;
-}
-
-int ethnl_phy_doit(struct sk_buff *skb, struct genl_info *info)
-{
-       struct phy_req_info req_info = {};
-       struct nlattr **tb = info->attrs;
-       struct sk_buff *rskb;
-       void *reply_payload;
-       int reply_len;
-       int ret;
-
-       ret = ethnl_parse_header_dev_get(&req_info.base,
-                                        tb[ETHTOOL_A_PHY_HEADER],
-                                        genl_info_net(info), info->extack,
-                                        true);
-       if (ret < 0)
-               return ret;
-
-       rtnl_lock();
-
-       ret = ethnl_phy_parse_request(&req_info.base, tb);
-       if (ret < 0)
-               goto err_unlock_rtnl;
-
-       /* No PHY, return early */
-       if (!req_info.pdn.phy)
-               goto err_unlock_rtnl;
-
-       ret = ethnl_phy_reply_size(&req_info.base, info->extack);
-       if (ret < 0)
-               goto err_unlock_rtnl;
-       reply_len = ret + ethnl_reply_header_size();
-
-       rskb = ethnl_reply_init(reply_len, req_info.base.dev,
-                               ETHTOOL_MSG_PHY_GET_REPLY,
-                               ETHTOOL_A_PHY_HEADER,
-                               info, &reply_payload);
-       if (!rskb) {
-               ret = -ENOMEM;
-               goto err_unlock_rtnl;
-       }
-
-       ret = ethnl_phy_fill_reply(&req_info.base, rskb);
-       if (ret)
-               goto err_free_msg;
-
-       rtnl_unlock();
-       ethnl_parse_header_dev_put(&req_info.base);
-       genlmsg_end(rskb, reply_payload);
-
-       return genlmsg_reply(rskb, info);
-
-err_free_msg:
-       nlmsg_free(rskb);
-err_unlock_rtnl:
-       rtnl_unlock();
-       ethnl_parse_header_dev_put(&req_info.base);
-       return ret;
-}
-
-struct ethnl_phy_dump_ctx {
-       struct phy_req_info     *phy_req_info;
-};
-
-int ethnl_phy_start(struct netlink_callback *cb)
-{
-       const struct genl_dumpit_info *info = genl_dumpit_info(cb);
-       struct ethnl_phy_dump_ctx *ctx = (void *)cb->ctx;
-       struct nlattr **tb = info->info.attrs;
-       int ret;
-
-       BUILD_BUG_ON(sizeof(*ctx) > sizeof(cb->ctx));
-
-       ctx->phy_req_info = kzalloc(sizeof(*ctx->phy_req_info), GFP_KERNEL);
-       if (!ctx->phy_req_info)
-               return -ENOMEM;
-
-       ret = ethnl_parse_header_dev_get(&ctx->phy_req_info->base,
-                                        tb[ETHTOOL_A_PHY_HEADER],
-                                        sock_net(cb->skb->sk), cb->extack,
-                                        false);
-       return ret;
-}
-
-int ethnl_phy_done(struct netlink_callback *cb)
-{
-       struct ethnl_phy_dump_ctx *ctx = (void *)cb->ctx;
-
-       kfree(ctx->phy_req_info);
-
-       return 0;
-}
-
-static int ethnl_phy_dump_one_dev(struct sk_buff *skb, struct net_device *dev,
-                                 struct netlink_callback *cb)
-{
-       struct ethnl_phy_dump_ctx *ctx = (void *)cb->ctx;
-       struct phy_req_info *pri = ctx->phy_req_info;
-       struct phy_device_node *pdn;
-       unsigned long index = 1;
-       int ret = 0;
-       void *ehdr;
-
-       pri->base.dev = dev;
-
-       xa_for_each(&dev->link_topo.phys, index, pdn) {
-               ehdr = ethnl_dump_put(skb, cb,
-                                     ETHTOOL_MSG_PHY_GET_REPLY);
-               if (!ehdr) {
-                       ret = -EMSGSIZE;
-                       break;
-               }
-
-               ret = ethnl_fill_reply_header(skb, dev,
-                                             ETHTOOL_A_PHY_HEADER);
-               if (ret < 0) {
-                       genlmsg_cancel(skb, ehdr);
-                       break;
-               }
-
-               memcpy(&pri->pdn, pdn, sizeof(*pdn));
-               ret = ethnl_phy_fill_reply(&pri->base, skb);
-
-               genlmsg_end(skb, ehdr);
-       }
-
-       return ret;
-}
-
-int ethnl_phy_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
-{
-       struct ethnl_phy_dump_ctx *ctx = (void *)cb->ctx;
-       struct net *net = sock_net(skb->sk);
-       unsigned long ifindex = 1;
-       struct net_device *dev;
-       int ret = 0;
-
-       rtnl_lock();
-
-       if (ctx->phy_req_info->base.dev) {
-               ret = ethnl_phy_dump_one_dev(skb, ctx->phy_req_info->base.dev, cb);
-               ethnl_parse_header_dev_put(&ctx->phy_req_info->base);
-               ctx->phy_req_info->base.dev = NULL;
-       } else {
-               for_each_netdev_dump(net, dev, ifindex) {
-                       ret = ethnl_phy_dump_one_dev(skb, dev, cb);
-                       if (ret)
-                               break;
-               }
-       }
-       rtnl_unlock();
-
-       if (ret == -EMSGSIZE && skb->len)
-               return skb->len;
-       return ret;
-}
-
index 2b3e419f4dc25c2171f05f8a716bf6cda8aea293..b1e2e3b5027fc7b9a26c9bbdf61006b771b457a3 100644 (file)
@@ -61,7 +61,7 @@ static int plca_get_cfg_prepare_data(const struct ethnl_req_info *req_base,
        int ret;
 
        // check that the PHY device is available and connected
-       if (!req_base->phydev) {
+       if (!dev->phydev) {
                ret = -EOPNOTSUPP;
                goto out;
        }
@@ -80,7 +80,7 @@ static int plca_get_cfg_prepare_data(const struct ethnl_req_info *req_base,
        memset(&data->plca_cfg, 0xff,
               sizeof_field(struct plca_reply_data, plca_cfg));
 
-       ret = ops->get_plca_cfg(req_base->phydev, &data->plca_cfg);
+       ret = ops->get_plca_cfg(dev->phydev, &data->plca_cfg);
        ethnl_ops_complete(dev);
 
 out:
@@ -141,6 +141,7 @@ const struct nla_policy ethnl_plca_set_cfg_policy[] = {
 static int
 ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info)
 {
+       struct net_device *dev = req_info->dev;
        const struct ethtool_phy_ops *ops;
        struct nlattr **tb = info->attrs;
        struct phy_plca_cfg plca_cfg;
@@ -148,7 +149,7 @@ ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info)
        int ret;
 
        // check that the PHY device is available and connected
-       if (!req_info->phydev)
+       if (!dev->phydev)
                return -EOPNOTSUPP;
 
        ops = ethtool_phy_ops;
@@ -167,7 +168,7 @@ ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info)
        if (!mod)
                return 0;
 
-       ret = ops->set_plca_cfg(req_info->phydev, &plca_cfg, info->extack);
+       ret = ops->set_plca_cfg(dev->phydev, &plca_cfg, info->extack);
        return ret < 0 ? ret : 1;
 }
 
@@ -203,7 +204,7 @@ static int plca_get_status_prepare_data(const struct ethnl_req_info *req_base,
        int ret;
 
        // check that the PHY device is available and connected
-       if (!req_base->phydev) {
+       if (!dev->phydev) {
                ret = -EOPNOTSUPP;
                goto out;
        }
@@ -222,7 +223,7 @@ static int plca_get_status_prepare_data(const struct ethnl_req_info *req_base,
        memset(&data->plca_st, 0xff,
               sizeof_field(struct plca_reply_data, plca_st));
 
-       ret = ops->get_plca_status(req_base->phydev, &data->plca_st);
+       ret = ops->get_plca_status(dev->phydev, &data->plca_st);
        ethnl_ops_complete(dev);
 out:
        return ret;
index 4a1c8d37bd3d14666aaca758d0baf51150922e49..cc478af77111f064ad307dcdc4c8bbc218243f61 100644 (file)
@@ -31,10 +31,12 @@ const struct nla_policy ethnl_pse_get_policy[ETHTOOL_A_PSE_HEADER + 1] = {
        [ETHTOOL_A_PSE_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy),
 };
 
-static int pse_get_pse_attributes(struct phy_device *phydev,
+static int pse_get_pse_attributes(struct net_device *dev,
                                  struct netlink_ext_ack *extack,
                                  struct pse_reply_data *data)
 {
+       struct phy_device *phydev = dev->phydev;
+
        if (!phydev) {
                NL_SET_ERR_MSG(extack, "No PHY is attached");
                return -EOPNOTSUPP;
@@ -62,7 +64,7 @@ static int pse_prepare_data(const struct ethnl_req_info *req_base,
        if (ret < 0)
                return ret;
 
-       ret = pse_get_pse_attributes(req_base->phydev, info->extack, data);
+       ret = pse_get_pse_attributes(dev, info->extack, data);
 
        ethnl_ops_complete(dev);
 
@@ -122,6 +124,7 @@ ethnl_set_pse_validate(struct ethnl_req_info *req_info, struct genl_info *info)
 static int
 ethnl_set_pse(struct ethnl_req_info *req_info, struct genl_info *info)
 {
+       struct net_device *dev = req_info->dev;
        struct pse_control_config config = {};
        struct nlattr **tb = info->attrs;
        struct phy_device *phydev;
@@ -129,7 +132,7 @@ ethnl_set_pse(struct ethnl_req_info *req_info, struct genl_info *info)
        /* this values are already validated by the ethnl_pse_set_policy */
        config.admin_cotrol = nla_get_u32(tb[ETHTOOL_A_PODL_PSE_ADMIN_CONTROL]);
 
-       phydev = req_info->phydev;
+       phydev = dev->phydev;
        if (!phydev) {
                NL_SET_ERR_MSG(info->extack, "No PHY is attached");
                return -EOPNOTSUPP;
index 70c00631c51f9ee5e14f80dc91c1191cf1b1061b..c678b484a07954891568fe2e2f38fe9ae7834590 100644 (file)
@@ -233,18 +233,17 @@ static void strset_cleanup_data(struct ethnl_reply_data *reply_base)
 }
 
 static int strset_prepare_set(struct strset_info *info, struct net_device *dev,
-                             struct phy_device *phydev, unsigned int id,
-                             bool counts_only)
+                             unsigned int id, bool counts_only)
 {
        const struct ethtool_phy_ops *phy_ops = ethtool_phy_ops;
        const struct ethtool_ops *ops = dev->ethtool_ops;
        void *strings;
        int count, ret;
 
-       if (id == ETH_SS_PHY_STATS && phydev &&
+       if (id == ETH_SS_PHY_STATS && dev->phydev &&
            !ops->get_ethtool_phy_stats && phy_ops &&
            phy_ops->get_sset_count)
-               ret = phy_ops->get_sset_count(phydev);
+               ret = phy_ops->get_sset_count(dev->phydev);
        else if (ops->get_sset_count && ops->get_strings)
                ret = ops->get_sset_count(dev, id);
        else
@@ -259,10 +258,10 @@ static int strset_prepare_set(struct strset_info *info, struct net_device *dev,
                strings = kcalloc(count, ETH_GSTRING_LEN, GFP_KERNEL);
                if (!strings)
                        return -ENOMEM;
-               if (id == ETH_SS_PHY_STATS && phydev &&
+               if (id == ETH_SS_PHY_STATS && dev->phydev &&
                    !ops->get_ethtool_phy_stats && phy_ops &&
                    phy_ops->get_strings)
-                       phy_ops->get_strings(phydev, strings);
+                       phy_ops->get_strings(dev->phydev, strings);
                else
                        ops->get_strings(dev, id, strings);
                info->strings = strings;
@@ -306,8 +305,8 @@ static int strset_prepare_data(const struct ethnl_req_info *req_base,
                    !data->sets[i].per_dev)
                        continue;
 
-               ret = strset_prepare_set(&data->sets[i], dev, req_base->phydev,
-                                        i, req_info->counts_only);
+               ret = strset_prepare_set(&data->sets[i], dev, i,
+                                        req_info->counts_only);
                if (ret < 0)
                        goto err_ops;
        }