mbox series

[PATCHv2,0/3] usbnet: speed reporting for devices without MDIO

Message ID 20210121125731.19425-1-oneukum@suse.com
Headers show
Series usbnet: speed reporting for devices without MDIO | expand

Message

Oliver Neukum Jan. 21, 2021, 12:57 p.m. UTC
This series introduces support for USB network devices that report
speed as a part of their protocol, not emulating an MII to be accessed
over MDIO.

v2: adjusted to recent changes

Comments

Andrew Lunn Jan. 22, 2021, 1:29 a.m. UTC | #1
On Thu, Jan 21, 2021 at 01:57:28PM +0100, Oliver Neukum wrote:
> This series introduces support for USB network devices that report
> speed as a part of their protocol, not emulating an MII to be accessed
> over MDIO.
> 
> v2: adjusted to recent changes

Hi Oliver

Please give more details what actually changed.  Does this mean you
just rebased it on net-next? Or have you made real changes?

The discussion with v1 suggested that this framework should also be
used by anything which gets notified in CDC style. So i was expecting
to see cdc_ether.c also use this.

	    Andrew
Grant Grundler Jan. 22, 2021, 1:35 a.m. UTC | #2
On Thu, Jan 21, 2021 at 12:57 PM Oliver Neukum <oneukum@suse.com> wrote:
>

> The old method for reporting network speed upwards

> assumed that a device uses MDIO and uses the generic phy

> functions based on that.

> Add a a primitive internal version not making the assumption

> reporting back directly what the status operations record.


Excellent!  I wasted a bunch of time looking at emulating the MDIO
interface and decided that was too hacky.  I didn't realize it could
be so easy to fork off a different method to collect the most recently
reported speed. Thank you!

> v2: adjusted to recent changes

>

> Signed-off-by: Oliver Neukum <oneukum@suse.com>

> Tested-by: Roland Dreier <roland@kernel.org>

> ---

>  drivers/net/usb/usbnet.c   | 23 +++++++++++++++++++++++

>  include/linux/usb/usbnet.h |  4 ++++

>  2 files changed, 27 insertions(+)

>

> diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c

> index e2ca88259b05..6f8fcc276ca7 100644

> --- a/drivers/net/usb/usbnet.c

> +++ b/drivers/net/usb/usbnet.c

> @@ -961,6 +961,27 @@ int usbnet_get_link_ksettings_mdio(struct net_device *net,

>  }

>  EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings_mdio);

>

> +int usbnet_get_link_ksettings_internal(struct net_device *net,

> +                                       struct ethtool_link_ksettings *cmd)

> +{

> +       struct usbnet *dev = netdev_priv(net);

> +

> +       /* the assumption that speed is equal on tx and rx

> +        * is deeply engrained into the networking layer.

> +        * For wireless stuff it is not true.

> +        * We assume that rxspeed matters more.

> +        */

> +       if (dev->rxspeed != SPEED_UNKNOWN)

> +               cmd->base.speed = dev->rxspeed / 1000000;

> +       else if (dev->txspeed != SPEED_UNKNOWN)

> +               cmd->base.speed = dev->txspeed / 1000000;

> +       else

> +               cmd->base.speed = SPEED_UNKNOWN;

> +

> +       return 0;

> +}

> +EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings_internal);

> +

>  int usbnet_set_link_ksettings_mdio(struct net_device *net,

>                               const struct ethtool_link_ksettings *cmd)

>  {

> @@ -1664,6 +1685,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)

>         dev->intf = udev;

>         dev->driver_info = info;

>         dev->driver_name = name;

> +       dev->rxspeed = SPEED_UNKNOWN; /* unknown or handled by MII */

> +       dev->txspeed = SPEED_UNKNOWN;


Nit: Use of SPEED_UNKNOWN here can be confusing since the units for
rxspeed/txspeed are bps, not Mbps (AFAICT SPEED_XXX are Mbps numbers).
In other words, this is the only usbnet location that could use
SPEED_xxx define and other developers might not realize that.
Personally, I'd rather set the fields to zero here.

>

>         net->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);

>         if (!net->tstats)

> diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h

> index fd65b7a5ee15..a91c6defb104 100644

> --- a/include/linux/usb/usbnet.h

> +++ b/include/linux/usb/usbnet.h

> @@ -53,6 +53,8 @@ struct usbnet {

>         u32                     hard_mtu;       /* count any extra framing */

>         size_t                  rx_urb_size;    /* size for rx urbs */

>         struct mii_if_info      mii;

> +       long                    rxspeed;        /* if MII is not used */

> +       long                    txspeed;        /* if MII is not used */


Do you want to note the units used (bps) in the trailing comment?

The numbers for cdc_ncm and cdc_ether will be "bits per second" due to
how older modems could report "odd" (from an ethernet point of view)
speeds.

Also, the changes I just submitted (and kuba@kernel.org accepted)
named these "rx_speed" (with underscore). I don't care which it is but
just wanted to warn about and apologize for the conflict.

cheers,
grant

>         /* various kinds of pending driver work */

>         struct sk_buff_head     rxq;

> @@ -269,6 +271,8 @@ extern void usbnet_purge_paused_rxq(struct usbnet *);

>

>  extern int usbnet_get_link_ksettings_mdio(struct net_device *net,

>                                      struct ethtool_link_ksettings *cmd);

> +extern int usbnet_get_link_ksettings_internal(struct net_device *net,

> +                                       struct ethtool_link_ksettings *cmd);

>  extern int usbnet_set_link_ksettings_mdio(struct net_device *net,

>                                      const struct ethtool_link_ksettings *cmd);

>  extern u32 usbnet_get_link(struct net_device *net);

> --

> 2.26.2

>
Grant Grundler Jan. 22, 2021, 2:10 a.m. UTC | #3
On Fri, Jan 22, 2021 at 1:29 AM Andrew Lunn <andrew@lunn.ch> wrote:
>
> On Thu, Jan 21, 2021 at 01:57:28PM +0100, Oliver Neukum wrote:
> > This series introduces support for USB network devices that report
> > speed as a part of their protocol, not emulating an MII to be accessed
> > over MDIO.
> >
> > v2: adjusted to recent changes
>
> Hi Oliver
>
> Please give more details what actually changed.  Does this mean you
> just rebased it on net-next? Or have you made real changes?

My apologies to Oliver - the changes he's referring to are the ones I submitted:
   https://www.spinics.net/lists/netdev/msg715248.html

which is related to this series:
   https://www.spinics.net/lists/netdev/msg714493.html

I wasn't aware of and didn't look for the series Oliver had previously
posted. *sigh*  I have been talking to Realtek about getting the issue
of RTL8156 spewing notifications every 32ms fixed (thinking a FW
change could fix it) for nearly three months.  It is unfortunate
timing that Roland Dreier decided to do something about it in December
- which I didn't expect to happen given this problem was reported
nearly two years ago.

> The discussion with v1 suggested that this framework should also be
> used by anything which gets notified in CDC style. So i was expecting
> to see cdc_ether.c also use this.

Agreed. That's a two lines change to cdc_ether.c. I can submit this if
Oliver doesn't want to spin the series.

I've reviewed all three patches and besides one nit (which could be
ignored or fixed later), I'm offering my
   Reviewed-by: Grant Grundler <grundler@chromium.org>

in the off chance that helps get this accepted into net-next (and/or
5.11 RC release).

cheers,
grant

>
>             Andrew
Grant Grundler Jan. 22, 2021, 2:56 a.m. UTC | #4
On Thu, Jan 21, 2021 at 12:57 PM Oliver Neukum <oneukum@suse.com> wrote:
>

> The old method for reporting network speed upwards

> assumed that a device uses MDIO and uses the generic phy

> functions based on that.

> Add a a primitive internal version not making the assumption

> reporting back directly what the status operations record.

>

> v2: adjusted to recent changes

>

> Signed-off-by: Oliver Neukum <oneukum@suse.com>

> Tested-by: Roland Dreier <roland@kernel.org>

> ---

>  drivers/net/usb/usbnet.c   | 23 +++++++++++++++++++++++

>  include/linux/usb/usbnet.h |  4 ++++

>  2 files changed, 27 insertions(+)

>

> diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c

> index e2ca88259b05..6f8fcc276ca7 100644

> --- a/drivers/net/usb/usbnet.c

> +++ b/drivers/net/usb/usbnet.c

> @@ -961,6 +961,27 @@ int usbnet_get_link_ksettings_mdio(struct net_device *net,

>  }

>  EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings_mdio);

>

> +int usbnet_get_link_ksettings_internal(struct net_device *net,

> +                                       struct ethtool_link_ksettings *cmd)

> +{

> +       struct usbnet *dev = netdev_priv(net);

> +

> +       /* the assumption that speed is equal on tx and rx

> +        * is deeply engrained into the networking layer.


Another nit: s/engrained/ingrained

Also, the word "symmetric" is more commonly used to describe when RX
speed == TX speed (vs "equal").

cheers,
grant

> +        * For wireless stuff it is not true.

> +        * We assume that rxspeed matters more.

> +        */

> +       if (dev->rxspeed != SPEED_UNKNOWN)

> +               cmd->base.speed = dev->rxspeed / 1000000;

> +       else if (dev->txspeed != SPEED_UNKNOWN)

> +               cmd->base.speed = dev->txspeed / 1000000;

> +       else

> +               cmd->base.speed = SPEED_UNKNOWN;

> +

> +       return 0;

> +}

> +EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings_internal);

> +

>  int usbnet_set_link_ksettings_mdio(struct net_device *net,

>                               const struct ethtool_link_ksettings *cmd)

>  {

> @@ -1664,6 +1685,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)

>         dev->intf = udev;

>         dev->driver_info = info;

>         dev->driver_name = name;

> +       dev->rxspeed = SPEED_UNKNOWN; /* unknown or handled by MII */

> +       dev->txspeed = SPEED_UNKNOWN;

>

>         net->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);

>         if (!net->tstats)

> diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h

> index fd65b7a5ee15..a91c6defb104 100644

> --- a/include/linux/usb/usbnet.h

> +++ b/include/linux/usb/usbnet.h

> @@ -53,6 +53,8 @@ struct usbnet {

>         u32                     hard_mtu;       /* count any extra framing */

>         size_t                  rx_urb_size;    /* size for rx urbs */

>         struct mii_if_info      mii;

> +       long                    rxspeed;        /* if MII is not used */

> +       long                    txspeed;        /* if MII is not used */

>

>         /* various kinds of pending driver work */

>         struct sk_buff_head     rxq;

> @@ -269,6 +271,8 @@ extern void usbnet_purge_paused_rxq(struct usbnet *);

>

>  extern int usbnet_get_link_ksettings_mdio(struct net_device *net,

>                                      struct ethtool_link_ksettings *cmd);

> +extern int usbnet_get_link_ksettings_internal(struct net_device *net,

> +                                       struct ethtool_link_ksettings *cmd);

>  extern int usbnet_set_link_ksettings_mdio(struct net_device *net,

>                                      const struct ethtool_link_ksettings *cmd);

>  extern u32 usbnet_get_link(struct net_device *net);

> --

> 2.26.2

>
Grant Grundler Feb. 9, 2021, 11:47 p.m. UTC | #5
Oliver,
it's been a few weeks, do you have time to post an updated patchset or
is there someone else you would trust to help land this series?

cheers,
grant

On Fri, Jan 22, 2021 at 2:10 AM Grant Grundler <grundler@chromium.org> wrote:
>

> On Fri, Jan 22, 2021 at 1:29 AM Andrew Lunn <andrew@lunn.ch> wrote:

> >

> > On Thu, Jan 21, 2021 at 01:57:28PM +0100, Oliver Neukum wrote:

> > > This series introduces support for USB network devices that report

> > > speed as a part of their protocol, not emulating an MII to be accessed

> > > over MDIO.

> > >

> > > v2: adjusted to recent changes

> >

> > Hi Oliver

> >

> > Please give more details what actually changed.  Does this mean you

> > just rebased it on net-next? Or have you made real changes?

>

> My apologies to Oliver - the changes he's referring to are the ones I submitted:

>    https://www.spinics.net/lists/netdev/msg715248.html

>

> which is related to this series:

>    https://www.spinics.net/lists/netdev/msg714493.html

>

> I wasn't aware of and didn't look for the series Oliver had previously

> posted. *sigh*  I have been talking to Realtek about getting the issue

> of RTL8156 spewing notifications every 32ms fixed (thinking a FW

> change could fix it) for nearly three months.  It is unfortunate

> timing that Roland Dreier decided to do something about it in December

> - which I didn't expect to happen given this problem was reported

> nearly two years ago.

>

> > The discussion with v1 suggested that this framework should also be

> > used by anything which gets notified in CDC style. So i was expecting

> > to see cdc_ether.c also use this.

>

> Agreed. That's a two lines change to cdc_ether.c. I can submit this if

> Oliver doesn't want to spin the series.

>

> I've reviewed all three patches and besides one nit (which could be

> ignored or fixed later), I'm offering my

>    Reviewed-by: Grant Grundler <grundler@chromium.org>

>

> in the off chance that helps get this accepted into net-next (and/or

> 5.11 RC release).

>

> cheers,

> grant

>

> >

> >             Andrew