forked from mirrors/linux
		
	net: ethtool: pse-pd: Target the command to the requested PHY
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> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									02180fb525
								
							
						
					
					
						commit
						31748765be
					
				
					 1 changed files with 19 additions and 12 deletions
				
			
		| 
						 | 
					@ -28,17 +28,15 @@ struct pse_reply_data {
 | 
				
			||||||
/* PSE_GET */
 | 
					/* PSE_GET */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct nla_policy ethnl_pse_get_policy[ETHTOOL_A_PSE_HEADER + 1] = {
 | 
					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 netlink_ext_ack *extack,
 | 
				
			||||||
				  struct pse_reply_data *data)
 | 
									  struct pse_reply_data *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct phy_device *phydev = dev->phydev;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!phydev) {
 | 
						if (!phydev) {
 | 
				
			||||||
		NL_SET_ERR_MSG(extack, "No PHY is attached");
 | 
							NL_SET_ERR_MSG(extack, "No PHY found");
 | 
				
			||||||
		return -EOPNOTSUPP;
 | 
							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 pse_reply_data *data = PSE_REPDATA(reply_base);
 | 
				
			||||||
	struct net_device *dev = reply_base->dev;
 | 
						struct net_device *dev = reply_base->dev;
 | 
				
			||||||
 | 
						struct nlattr **tb = info->attrs;
 | 
				
			||||||
 | 
						struct phy_device *phydev;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = ethnl_ops_begin(dev);
 | 
						ret = ethnl_ops_begin(dev);
 | 
				
			||||||
	if (ret < 0)
 | 
						if (ret < 0)
 | 
				
			||||||
		return ret;
 | 
							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);
 | 
						ethnl_ops_complete(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,7 +211,7 @@ static void pse_cleanup_data(struct ethnl_reply_data *reply_base)
 | 
				
			||||||
/* PSE_SET */
 | 
					/* PSE_SET */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct nla_policy ethnl_pse_set_policy[ETHTOOL_A_PSE_MAX + 1] = {
 | 
					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] =
 | 
						[ETHTOOL_A_PODL_PSE_ADMIN_CONTROL] =
 | 
				
			||||||
		NLA_POLICY_RANGE(NLA_U32, ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED,
 | 
							NLA_POLICY_RANGE(NLA_U32, ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED,
 | 
				
			||||||
				 ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED),
 | 
									 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
 | 
					static int
 | 
				
			||||||
ethnl_set_pse_validate(struct ethnl_req_info *req_info, struct genl_info *info)
 | 
					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 nlattr **tb = info->attrs;
 | 
				
			||||||
	struct phy_device *phydev;
 | 
						struct phy_device *phydev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	phydev = dev->phydev;
 | 
						phydev = ethnl_req_get_phydev(req_info, tb[ETHTOOL_A_PSE_HEADER],
 | 
				
			||||||
	if (!phydev) {
 | 
									      info->extack);
 | 
				
			||||||
 | 
						if (IS_ERR_OR_NULL(phydev)) {
 | 
				
			||||||
		NL_SET_ERR_MSG(info->extack, "No PHY is attached");
 | 
							NL_SET_ERR_MSG(info->extack, "No PHY is attached");
 | 
				
			||||||
		return -EOPNOTSUPP;
 | 
							return -EOPNOTSUPP;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -255,12 +260,14 @@ ethnl_set_pse_validate(struct ethnl_req_info *req_info, struct genl_info *info)
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
ethnl_set_pse(struct ethnl_req_info *req_info, struct genl_info *info)
 | 
					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 nlattr **tb = info->attrs;
 | 
				
			||||||
	struct phy_device *phydev;
 | 
						struct phy_device *phydev;
 | 
				
			||||||
	int ret = 0;
 | 
						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]) {
 | 
						if (tb[ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT]) {
 | 
				
			||||||
		unsigned int pw_limit;
 | 
							unsigned int pw_limit;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue