netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down
@ 2024-07-04  5:40 Oleksij Rempel
  2024-07-04 14:01 ` Andrew Lunn
  2024-07-06  1:00 ` Jakub Kicinski
  0 siblings, 2 replies; 5+ messages in thread
From: Oleksij Rempel @ 2024-07-04  5:40 UTC (permalink / raw)
  To: Michal Kubecek, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Jiri Pirko, Vladimir Oltean, Andrew Lunn,
	Arun Ramadoss, Woojung.Huh
  Cc: Oleksij Rempel, kernel, netdev, UNGLinuxDriver, linux-kernel

Do not attach SQI value if link is down. "SQI values are only valid if link-up
condition is present" per OpenAlliance specification of 100Base-T1
Interoperability Test suite [1]. The same rule would apply for other link
types.

[1] https://opensig.org/automotive-ethernet-specifications/#

Fixes: 8066021915924 ("ethtool: provide UAPI for PHY Signal Quality Index (SQI)")
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
---
 net/ethtool/linkstate.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/net/ethtool/linkstate.c b/net/ethtool/linkstate.c
index b2de2108b356a..370ae628b13a4 100644
--- a/net/ethtool/linkstate.c
+++ b/net/ethtool/linkstate.c
@@ -37,6 +37,8 @@ static int linkstate_get_sqi(struct net_device *dev)
 	mutex_lock(&phydev->lock);
 	if (!phydev->drv || !phydev->drv->get_sqi)
 		ret = -EOPNOTSUPP;
+	else if (!phydev->link)
+		ret = -ENETDOWN;
 	else
 		ret = phydev->drv->get_sqi(phydev);
 	mutex_unlock(&phydev->lock);
@@ -55,6 +57,8 @@ static int linkstate_get_sqi_max(struct net_device *dev)
 	mutex_lock(&phydev->lock);
 	if (!phydev->drv || !phydev->drv->get_sqi_max)
 		ret = -EOPNOTSUPP;
+	else if (!phydev->link)
+		ret = -ENETDOWN;
 	else
 		ret = phydev->drv->get_sqi_max(phydev);
 	mutex_unlock(&phydev->lock);
@@ -93,12 +97,12 @@ static int linkstate_prepare_data(const struct ethnl_req_info *req_base,
 	data->link = __ethtool_get_link(dev);
 
 	ret = linkstate_get_sqi(dev);
-	if (ret < 0 && ret != -EOPNOTSUPP)
+	if (ret < 0 && ret != -EOPNOTSUPP && ret != -ENETDOWN)
 		goto out;
 	data->sqi = ret;
 
 	ret = linkstate_get_sqi_max(dev);
-	if (ret < 0 && ret != -EOPNOTSUPP)
+	if (ret < 0 && ret != -EOPNOTSUPP && ret != -ENETDOWN)
 		goto out;
 	data->sqi_max = ret;
 
@@ -136,10 +140,10 @@ static int linkstate_reply_size(const struct ethnl_req_info *req_base,
 	len = nla_total_size(sizeof(u8)) /* LINKSTATE_LINK */
 		+ 0;
 
-	if (data->sqi != -EOPNOTSUPP)
+	if (data->sqi != -EOPNOTSUPP && data->sqi != -ENETDOWN)
 		len += nla_total_size(sizeof(u32));
 
-	if (data->sqi_max != -EOPNOTSUPP)
+	if (data->sqi_max != -EOPNOTSUPP && data->sqi_max != -ENETDOWN)
 		len += nla_total_size(sizeof(u32));
 
 	if (data->link_ext_state_provided)
@@ -164,11 +168,11 @@ static int linkstate_fill_reply(struct sk_buff *skb,
 	    nla_put_u8(skb, ETHTOOL_A_LINKSTATE_LINK, !!data->link))
 		return -EMSGSIZE;
 
-	if (data->sqi != -EOPNOTSUPP &&
+	if (data->sqi != -EOPNOTSUPP && data->sqi != -ENETDOWN &&
 	    nla_put_u32(skb, ETHTOOL_A_LINKSTATE_SQI, data->sqi))
 		return -EMSGSIZE;
 
-	if (data->sqi_max != -EOPNOTSUPP &&
+	if (data->sqi_max != -EOPNOTSUPP && data->sqi_max != -ENETDOWN &&
 	    nla_put_u32(skb, ETHTOOL_A_LINKSTATE_SQI_MAX, data->sqi_max))
 		return -EMSGSIZE;
 
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down
  2024-07-04  5:40 [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down Oleksij Rempel
@ 2024-07-04 14:01 ` Andrew Lunn
  2024-07-05  7:05   ` Oleksij Rempel
  2024-07-06  1:00 ` Jakub Kicinski
  1 sibling, 1 reply; 5+ messages in thread
From: Andrew Lunn @ 2024-07-04 14:01 UTC (permalink / raw)
  To: Oleksij Rempel
  Cc: Michal Kubecek, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Jiri Pirko, Vladimir Oltean, Arun Ramadoss,
	Woojung.Huh, kernel, netdev, UNGLinuxDriver, linux-kernel

On Thu, Jul 04, 2024 at 07:40:07AM +0200, Oleksij Rempel wrote:
> Do not attach SQI value if link is down. "SQI values are only valid if link-up
> condition is present" per OpenAlliance specification of 100Base-T1
> Interoperability Test suite [1]. The same rule would apply for other link
> types.
> 
> [1] https://opensig.org/automotive-ethernet-specifications/#
> 
> Fixes: 8066021915924 ("ethtool: provide UAPI for PHY Signal Quality Index (SQI)")
> Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
> ---
>  net/ethtool/linkstate.c | 16 ++++++++++------
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/net/ethtool/linkstate.c b/net/ethtool/linkstate.c
> index b2de2108b356a..370ae628b13a4 100644
> --- a/net/ethtool/linkstate.c
> +++ b/net/ethtool/linkstate.c
> @@ -37,6 +37,8 @@ static int linkstate_get_sqi(struct net_device *dev)
>  	mutex_lock(&phydev->lock);
>  	if (!phydev->drv || !phydev->drv->get_sqi)
>  		ret = -EOPNOTSUPP;
> +	else if (!phydev->link)
> +		ret = -ENETDOWN;
>  	else
>  		ret = phydev->drv->get_sqi(phydev);
>  	mutex_unlock(&phydev->lock);
> @@ -55,6 +57,8 @@ static int linkstate_get_sqi_max(struct net_device *dev)
>  	mutex_lock(&phydev->lock);
>  	if (!phydev->drv || !phydev->drv->get_sqi_max)
>  		ret = -EOPNOTSUPP;
> +	else if (!phydev->link)
> +		ret = -ENETDOWN;
>  	else
>  		ret = phydev->drv->get_sqi_max(phydev);
>  	mutex_unlock(&phydev->lock);

I guess this part is optional. I think i've always seen hard coded
values. But this is O.K.

> @@ -93,12 +97,12 @@ static int linkstate_prepare_data(const struct ethnl_req_info *req_base,
>  	data->link = __ethtool_get_link(dev);
>  
>  	ret = linkstate_get_sqi(dev);
> -	if (ret < 0 && ret != -EOPNOTSUPP)
> +	if (ret < 0 && ret != -EOPNOTSUPP && ret != -ENETDOWN)
>  		goto out;
>  	data->sqi = ret;

So data->sqi becomes -ENETDOWN 


> -	if (data->sqi != -EOPNOTSUPP &&
> +	if (data->sqi != -EOPNOTSUPP && data->sqi != -ENETDOWN &&
>  	    nla_put_u32(skb, ETHTOOL_A_LINKSTATE_SQI, data->sqi))
>  		return -EMSGSIZE;

Thinking about the old code, if the driver returned something other
than -EOPNOTSUPP, it looks like the error code would make it to user
space. Is ethtool/iproute2 setup to correctly handle this? If it is,
maybe pass the -ENETDOWN to user space?

	Andrew

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down
  2024-07-04 14:01 ` Andrew Lunn
@ 2024-07-05  7:05   ` Oleksij Rempel
  2024-07-08 13:29     ` Andrew Lunn
  0 siblings, 1 reply; 5+ messages in thread
From: Oleksij Rempel @ 2024-07-05  7:05 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Michal Kubecek, Woojung.Huh, Arun Ramadoss, Jiri Pirko,
	Vladimir Oltean, linux-kernel, UNGLinuxDriver, Eric Dumazet,
	kernel, netdev, Jakub Kicinski, Paolo Abeni, David S. Miller

On Thu, Jul 04, 2024 at 04:01:31PM +0200, Andrew Lunn wrote:
...
> >  	ret = linkstate_get_sqi(dev);
> > -	if (ret < 0 && ret != -EOPNOTSUPP)
> > +	if (ret < 0 && ret != -EOPNOTSUPP && ret != -ENETDOWN)
> >  		goto out;
> >  	data->sqi = ret;
> 
> So data->sqi becomes -ENETDOWN 
> 
> 
> > -	if (data->sqi != -EOPNOTSUPP &&
> > +	if (data->sqi != -EOPNOTSUPP && data->sqi != -ENETDOWN &&
> >  	    nla_put_u32(skb, ETHTOOL_A_LINKSTATE_SQI, data->sqi))
> >  		return -EMSGSIZE;
> 
> Thinking about the old code, if the driver returned something other
> than -EOPNOTSUPP, it looks like the error code would make it to user
> space. Is ethtool/iproute2 setup to correctly handle this? If it is,
> maybe pass the -ENETDOWN to user space?

In current state with ethtool v6.5 i'll get following results.
If no -ENETDOWN is returned:
Settings for spe4:
        Supported ports: [ TP ]
        Supported link modes:   100baseT1/Full
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  100baseT1/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 100Mb/s
        Duplex: Full
        Auto-negotiation: off
        master-slave cfg: forced slave
        master-slave status: unknown
        Port: Twisted Pair
        PHYAD: 6
        Transceiver: external
        MDI-X: Unknown
        Supports Wake-on: d
        Wake-on: d
        Link detected: no

If -ENETDOWN is returned:
Settings for spe4:
        Supported ports: [ TP ]
        Supported link modes:   100baseT1/Fulli
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  100baseT1/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 100Mb/s
        Duplex: Full
        Auto-negotiation: off
        master-slave cfg: forced slave
        master-slave status: unknown
        Port: Twisted Pair
        PHYAD: 6
        Transceiver: external
        MDI-X: Unknown
        Supports Wake-on: d
        Wake-on: d
netlink error: Network is down

Instead of "Link detected: no", we will get netlink error.

Regards,
Oleksij
-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down
  2024-07-04  5:40 [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down Oleksij Rempel
  2024-07-04 14:01 ` Andrew Lunn
@ 2024-07-06  1:00 ` Jakub Kicinski
  1 sibling, 0 replies; 5+ messages in thread
From: Jakub Kicinski @ 2024-07-06  1:00 UTC (permalink / raw)
  To: Oleksij Rempel
  Cc: Michal Kubecek, David S. Miller, Eric Dumazet, Paolo Abeni,
	Jiri Pirko, Vladimir Oltean, Andrew Lunn, Arun Ramadoss,
	Woojung.Huh, kernel, netdev, UNGLinuxDriver, linux-kernel

On Thu,  4 Jul 2024 07:40:07 +0200 Oleksij Rempel wrote:
>  	if (!phydev->drv || !phydev->drv->get_sqi)
>  		ret = -EOPNOTSUPP;
> +	else if (!phydev->link)
> +		ret = -ENETDOWN;

Can we stick to EOPNOTSUPP for the link down case as well?
We're consuming the error, the exact value doesn't matter.
Or let's add a helper which checks the int sqi in all it's
incarnations for validity:

static bool linkstate_sqi_no_data(int sqi)
{
	return sqi == -EOPNOTSUPP || sqi == -ENETDOWN;
}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down
  2024-07-05  7:05   ` Oleksij Rempel
@ 2024-07-08 13:29     ` Andrew Lunn
  0 siblings, 0 replies; 5+ messages in thread
From: Andrew Lunn @ 2024-07-08 13:29 UTC (permalink / raw)
  To: Oleksij Rempel
  Cc: Michal Kubecek, Woojung.Huh, Arun Ramadoss, Jiri Pirko,
	Vladimir Oltean, linux-kernel, UNGLinuxDriver, Eric Dumazet,
	kernel, netdev, Jakub Kicinski, Paolo Abeni, David S. Miller

> If -ENETDOWN is returned:
> Settings for spe4:
>         Supported ports: [ TP ]
>         Supported link modes:   100baseT1/Fulli
>         Supported pause frame use: No
>         Supports auto-negotiation: No
>         Supported FEC modes: Not reported
>         Advertised link modes:  100baseT1/Full
>         Advertised pause frame use: No
>         Advertised auto-negotiation: No
>         Advertised FEC modes: Not reported
>         Speed: 100Mb/s
>         Duplex: Full
>         Auto-negotiation: off
>         master-slave cfg: forced slave
>         master-slave status: unknown
>         Port: Twisted Pair
>         PHYAD: 6
>         Transceiver: external
>         MDI-X: Unknown
>         Supports Wake-on: d
>         Wake-on: d
> netlink error: Network is down
> 
> Instead of "Link detected: no", we will get netlink error.

Thanks. This is not great. There was a slim chance it looked at each
individual return value, and would of put "SQI: Network is down", but
it does not. So not including the value does seem the best.

	Andrew

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-07-08 13:29 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-04  5:40 [PATCH net v1 1/1] ethtool: netlink: do not return SQI value if link is down Oleksij Rempel
2024-07-04 14:01 ` Andrew Lunn
2024-07-05  7:05   ` Oleksij Rempel
2024-07-08 13:29     ` Andrew Lunn
2024-07-06  1:00 ` Jakub Kicinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).