From: Maxime Chevallier <maxime.chevallier@bootlin.com>
To: davem@davemloft.net
Cc: "Maxime Chevallier" <maxime.chevallier@bootlin.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
thomas.petazzoni@bootlin.com, "Andrew Lunn" <andrew@lunn.ch>,
"Jakub Kicinski" <kuba@kernel.org>,
"Eric Dumazet" <edumazet@google.com>,
"Paolo Abeni" <pabeni@redhat.com>,
"Russell King" <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org,
"Christophe Leroy" <christophe.leroy@csgroup.eu>,
"Herve Codina" <herve.codina@bootlin.com>,
"Florian Fainelli" <f.fainelli@gmail.com>,
"Heiner Kallweit" <hkallweit1@gmail.com>,
"Vladimir Oltean" <vladimir.oltean@nxp.com>,
"Marek Behún" <kabel@kernel.org>,
"Köry Maincent" <kory.maincent@bootlin.com>,
"Oleksij Rempel" <o.rempel@pengutronix.de>
Subject: [PATCH net-next 5/7] net: phy: introduce ethtool_phy_ops to get and set phy configuration
Date: Wed, 11 Sep 2024 23:27:09 +0200 [thread overview]
Message-ID: <20240911212713.2178943-6-maxime.chevallier@bootlin.com> (raw)
In-Reply-To: <20240911212713.2178943-1-maxime.chevallier@bootlin.com>
Expose phy-specific configuration hooks to get and set the state of an
ethernet PHY's internal configuration.
So far, these parameters include the loopback state of the PHY
(host-side loopback) and the isolation state of the PHY.
The .get_config() ethtool_phy_ops gets these status information from the
phy_device's internal flags, while the .set_config() operation allows
changing these configuration parameters.
Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
---
drivers/net/phy/phy.c | 59 ++++++++++++++++++++++++++++++++++++
drivers/net/phy/phy_device.c | 2 ++
include/linux/ethtool.h | 8 +++++
include/linux/phy.h | 21 +++++++++++++
4 files changed, 90 insertions(+)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 4f3e742907cb..0cdb0fc30727 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -1811,3 +1811,62 @@ int phy_ethtool_nway_reset(struct net_device *ndev)
return ret;
}
EXPORT_SYMBOL(phy_ethtool_nway_reset);
+
+/**
+ * phy_get_config - Get PHY configuration parameters
+ * @phydev: the PHY device to act upon
+ * @phy_cfg: The configuration to apply
+ */
+
+int phy_get_config(struct phy_device *phydev,
+ struct phy_device_config *phy_cfg)
+{
+ mutex_lock(&phydev->lock);
+ phy_cfg->isolate = phydev->isolated;
+ phy_cfg->loopback = phydev->loopback_enabled;
+ mutex_unlock(&phydev->lock);
+
+ return 0;
+}
+
+/**
+ * phy_set_config - Set PHY configuration parameters
+ * @phydev: the PHY device to act upon
+ * @phy_cfg: the configuration to apply
+ * @extack: a netlink extack for useful error reporting
+ */
+
+int phy_set_config(struct phy_device *phydev,
+ const struct phy_device_config *phy_cfg,
+ struct netlink_ext_ack *extack)
+{
+ bool loopback_change, isolate_change;
+ int ret;
+
+ /* As the phydev's loopback and isolation state are protected by the
+ * phy lock, check first if we'll need to perform the action,
+ * then do them as a second step.
+ */
+ mutex_lock(&phydev->lock);
+ isolate_change = (phy_cfg->isolate != phydev->isolated);
+ loopback_change = (phy_cfg->loopback != phydev->loopback_enabled);
+ mutex_unlock(&phydev->lock);
+
+ if (isolate_change) {
+ ret = phy_isolate(phydev, phy_cfg->isolate);
+ if (ret) {
+ NL_SET_ERR_MSG(extack, "Error while configuring PHY isolation");
+ return ret;
+ }
+ }
+
+ if (loopback_change) {
+ ret = phy_loopback(phydev, phy_cfg->loopback);
+ if (ret) {
+ NL_SET_ERR_MSG(extack, "Error while configuring PHY loopback");
+ return ret;
+ }
+ }
+
+ return 0;
+}
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 2a3db1043626..0714a2b83d18 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -3845,6 +3845,8 @@ static const struct ethtool_phy_ops phy_ethtool_phy_ops = {
.get_plca_status = phy_ethtool_get_plca_status,
.start_cable_test = phy_start_cable_test,
.start_cable_test_tdr = phy_start_cable_test_tdr,
+ .get_config = phy_get_config,
+ .set_config = phy_set_config,
};
static const struct phylib_stubs __phylib_stubs = {
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 12f6dc567598..480ee99a69a5 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -1140,6 +1140,7 @@ struct phy_device;
struct phy_tdr_config;
struct phy_plca_cfg;
struct phy_plca_status;
+struct phy_device_config;
/**
* struct ethtool_phy_ops - Optional PHY device options
@@ -1151,6 +1152,8 @@ struct phy_plca_status;
* @get_plca_status: Get PLCA configuration.
* @start_cable_test: Start a cable test
* @start_cable_test_tdr: Start a Time Domain Reflectometry cable test
+ * @get_config: Retrieve phy device configuration parameters
+ * @set_config: Set phy device configuration parameters
*
* All operations are optional (i.e. the function pointer may be set to %NULL)
* and callers must take this into account. Callers must hold the RTNL lock.
@@ -1172,6 +1175,11 @@ struct ethtool_phy_ops {
int (*start_cable_test_tdr)(struct phy_device *phydev,
struct netlink_ext_ack *extack,
const struct phy_tdr_config *config);
+ int (*get_config)(struct phy_device *phydev,
+ struct phy_device_config *phy_cfg);
+ int (*set_config)(struct phy_device *phydev,
+ const struct phy_device_config *phy_cfg,
+ struct netlink_ext_ack *extack);
};
/**
diff --git a/include/linux/phy.h b/include/linux/phy.h
index f0a8a5459fbe..ee0364d2afc3 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -887,6 +887,22 @@ enum phy_led_modes {
__PHY_LED_MODES_NUM,
};
+/**
+ * struct phy_device_config - General PHY device configuration parameters for
+ * status reporting and bulk configuration
+ *
+ * A structure containing generic PHY device information, allowing to expose
+ * internal status to userspace, and perform PHY configuration in a controlled
+ * manner.
+ *
+ * @isolate: The MII-side isolation status of the PHY
+ * @loopback: The loopback state of the PHY
+ */
+struct phy_device_config {
+ bool isolate;
+ bool loopback;
+};
+
/**
* struct phy_led: An LED driven by the PHY
*
@@ -2067,6 +2083,11 @@ int phy_ethtool_set_plca_cfg(struct phy_device *phydev,
struct netlink_ext_ack *extack);
int phy_ethtool_get_plca_status(struct phy_device *phydev,
struct phy_plca_status *plca_st);
+int phy_get_config(struct phy_device *phydev,
+ struct phy_device_config *phy_cfg);
+int phy_set_config(struct phy_device *phydev,
+ const struct phy_device_config *phy_cfg,
+ struct netlink_ext_ack *extack);
int __phy_hwtstamp_get(struct phy_device *phydev,
struct kernel_hwtstamp_config *config);
--
2.46.0
next prev parent reply other threads:[~2024-09-11 21:27 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-11 21:27 [PATCH net-next 0/7] Allow controlling PHY loopback and isolate modes Maxime Chevallier
2024-09-11 21:27 ` [PATCH net-next 1/7] net: phy: allow isolating PHY devices Maxime Chevallier
2024-09-12 18:30 ` Florian Fainelli
2024-09-13 7:43 ` Maxime Chevallier
2024-09-11 21:27 ` [PATCH net-next 2/7] net: phy: Allow flagging PHY devices that can't isolate their MII Maxime Chevallier
2024-09-11 21:27 ` [PATCH net-next 3/7] net: phy: lxt: Mark LXT973 PHYs as having a broken isolate mode Maxime Chevallier
2024-09-12 12:24 ` Simon Horman
2024-09-12 12:56 ` Maxime Chevallier
2024-09-13 5:29 ` kernel test robot
2024-09-11 21:27 ` [PATCH net-next 4/7] net: phy: marvell10g: 88x3310 and 88x3340 don't support " Maxime Chevallier
2024-09-11 21:27 ` Maxime Chevallier [this message]
2024-09-12 4:46 ` [PATCH net-next 5/7] net: phy: introduce ethtool_phy_ops to get and set phy configuration Oleksij Rempel
2024-09-12 8:17 ` Maxime Chevallier
2024-09-11 21:27 ` [PATCH net-next 6/7] net: ethtool: phy: allow reporting and setting the phy isolate status Maxime Chevallier
2024-09-11 21:27 ` [PATCH net-next 7/7] netlink: specs: introduce phy-set command along with configurable attributes Maxime Chevallier
2024-09-12 8:15 ` [PATCH net-next 0/7] Allow controlling PHY loopback and isolate modes Maxime Chevallier
2024-09-12 18:21 ` Andrew Lunn
2024-09-12 18:26 ` Florian Fainelli
2024-09-13 7:34 ` Maxime Chevallier
2024-09-13 13:40 ` Andrew Lunn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240911212713.2178943-6-maxime.chevallier@bootlin.com \
--to=maxime.chevallier@bootlin.com \
--cc=andrew@lunn.ch \
--cc=christophe.leroy@csgroup.eu \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=herve.codina@bootlin.com \
--cc=hkallweit1@gmail.com \
--cc=kabel@kernel.org \
--cc=kory.maincent@bootlin.com \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=o.rempel@pengutronix.de \
--cc=pabeni@redhat.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.oltean@nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®