Thread (44 messages) 44 messages, 8 authors, 2024-08-27

Re: [PATCH net-next v17 10/14] net: ethtool: pse-pd: Target the command to the requested PHY

From: Christophe Leroy <hidden>
Date: 2024-08-14 14:31:54
Also in: lkml, netdev


Le 09/07/2024 à 08:30, Maxime Chevallier a écrit :
PSE and PD configuration is a PHY-specific command. Instead of targeting
the command towards dev->phydev, use the request to pick the targeted
PHY device.

As we don't get the PHY directly from the netdev's attached phydev, also
adjust the error messages.

Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Reviewed-by: Christophe Leroy <redacted>
Tested-by: Christophe Leroy <redacted>
quoted hunk ↗ jump to hunk
---
  net/ethtool/pse-pd.c | 31 +++++++++++++++++++------------
  1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/net/ethtool/pse-pd.c b/net/ethtool/pse-pd.c
index ba46c9c8b12d..0f37ff5de7f0 100644
--- a/net/ethtool/pse-pd.c
+++ b/net/ethtool/pse-pd.c
@@ -28,17 +28,15 @@ struct pse_reply_data {
  /* PSE_GET */
  
  const struct nla_policy ethnl_pse_get_policy[ETHTOOL_A_PSE_HEADER + 1] = {
-	[ETHTOOL_A_PSE_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy),
+	[ETHTOOL_A_PSE_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy_phy),
  };
  
-static int pse_get_pse_attributes(struct net_device *dev,
+static int pse_get_pse_attributes(struct phy_device *phydev,
  				  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");
+		NL_SET_ERR_MSG(extack, "No PHY found");
  		return -EOPNOTSUPP;
  	}
  
@@ -58,13 +56,20 @@ static int pse_prepare_data(const struct ethnl_req_info *req_base,
  {
  	struct pse_reply_data *data = PSE_REPDATA(reply_base);
  	struct net_device *dev = reply_base->dev;
+	struct nlattr **tb = info->attrs;
+	struct phy_device *phydev;
  	int ret;
  
  	ret = ethnl_ops_begin(dev);
  	if (ret < 0)
  		return ret;
  
-	ret = pse_get_pse_attributes(dev, info->extack, data);
+	phydev = ethnl_req_get_phydev(req_base, tb[ETHTOOL_A_PSE_HEADER],
+				      info->extack);
+	if (IS_ERR(phydev))
+		return -ENODEV;
+
+	ret = pse_get_pse_attributes(phydev, info->extack, data);
  
  	ethnl_ops_complete(dev);
  
@@ -206,7 +211,7 @@ static void pse_cleanup_data(struct ethnl_reply_data *reply_base)
  /* PSE_SET */
  
  const struct nla_policy ethnl_pse_set_policy[ETHTOOL_A_PSE_MAX + 1] = {
-	[ETHTOOL_A_PSE_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy),
+	[ETHTOOL_A_PSE_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy_phy),
  	[ETHTOOL_A_PODL_PSE_ADMIN_CONTROL] =
  		NLA_POLICY_RANGE(NLA_U32, ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED,
  				 ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED),
@@ -219,12 +224,12 @@ const struct nla_policy ethnl_pse_set_policy[ETHTOOL_A_PSE_MAX + 1] = {
  static int
  ethnl_set_pse_validate(struct ethnl_req_info *req_info, struct genl_info *info)
  {
-	struct net_device *dev = req_info->dev;
  	struct nlattr **tb = info->attrs;
  	struct phy_device *phydev;
  
-	phydev = dev->phydev;
-	if (!phydev) {
+	phydev = ethnl_req_get_phydev(req_info, tb[ETHTOOL_A_PSE_HEADER],
+				      info->extack);
+	if (IS_ERR_OR_NULL(phydev)) {
  		NL_SET_ERR_MSG(info->extack, "No PHY is attached");
  		return -EOPNOTSUPP;
  	}
@@ -255,12 +260,14 @@ 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 nlattr **tb = info->attrs;
  	struct phy_device *phydev;
  	int ret = 0;
  
-	phydev = dev->phydev;
+	phydev = ethnl_req_get_phydev(req_info, tb[ETHTOOL_A_PSE_HEADER],
+				      info->extack);
+	if (IS_ERR_OR_NULL(phydev))
+		return -ENODEV;
  
  	if (tb[ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT]) {
  		unsigned int pw_limit;
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help