Message ID | 20240709063039.2909536-11-maxime.chevallier@bootlin.com (mailing list archive) |
---|---|
State | Deferred |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Introduce PHY listing and link_topology tracking | expand |
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 <christophe.leroy@csgroup.eu> Tested-by: Christophe Leroy <christophe.leroy@csgroup.eu> > --- > 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;
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;
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> --- net/ethtool/pse-pd.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-)