public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function
@ 2026-02-03  1:34 Ethan Nelson-Moore
  2026-02-03  8:25 ` Andy Shevchenko
  2026-02-04  3:50 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 6+ messages in thread
From: Ethan Nelson-Moore @ 2026-02-03  1:34 UTC (permalink / raw)
  To: linux-usb, netdev
  Cc: Ethan Nelson-Moore, Vadim Fedorenko, Andrew Lunn, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Peter Korsgaard, Steve Glendinning, Oliver Neukum,
	Greg Kroah-Hartman, Oleksij Rempel, Max Schulze,
	Krzysztof Hałasa, Andy Shevchenko

Many USB network drivers use identical code to pass ioctl
requests on to the MII layer. Reduce code duplication by
refactoring this code into a helper function.

Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev> (v1)
Reviewed-by: Andrew Lunn <andrew@lunn.ch> (v3)
Signed-off-by: Ethan Nelson-Moore <enelsonmoore@gmail.com>
---
Changes in v4:
Rebase on latest net-next again
Changes in v3:
Rebase on latest net-next
Add changelog
Add received Reviewed-by tag
Changes in v2 (not numbered):
Resent with maintainer CCs

 drivers/net/usb/asix_devices.c | 11 ++---------
 drivers/net/usb/ax88179_178a.c |  8 +-------
 drivers/net/usb/dm9601.c       |  9 +--------
 drivers/net/usb/mcs7830.c      |  8 +-------
 drivers/net/usb/smsc75xx.c     |  4 +---
 drivers/net/usb/sr9800.c       |  9 +--------
 drivers/net/usb/usbnet.c       |  8 ++++++++
 include/linux/usb/usbnet.h     |  1 +
 8 files changed, 16 insertions(+), 42 deletions(-)

diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
index d8744291d843..7eb6e86adb16 100644
--- a/drivers/net/usb/asix_devices.c
+++ b/drivers/net/usb/asix_devices.c
@@ -97,13 +97,6 @@ static u32 asix_get_phyid(struct usbnet *dev)
 	return phy_id;
 }
 
-static int asix_ioctl (struct net_device *net, struct ifreq *rq, int cmd)
-{
-	struct usbnet *dev = netdev_priv(net);
-
-	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
-}
-
 /* We need to override some ethtool_ops so we require our
    own structure so we don't interfere with other usbnet
    devices that may be connected at the same time. */
@@ -190,7 +183,7 @@ static const struct net_device_ops ax88172_netdev_ops = {
 	.ndo_get_stats64	= dev_get_tstats64,
 	.ndo_set_mac_address 	= eth_mac_addr,
 	.ndo_validate_addr	= eth_validate_addr,
-	.ndo_eth_ioctl		= asix_ioctl,
+	.ndo_eth_ioctl		= usbnet_mii_ioctl,
 	.ndo_set_rx_mode	= ax88172_set_multicast,
 };
 
@@ -1269,7 +1262,7 @@ static const struct net_device_ops ax88178_netdev_ops = {
 	.ndo_set_mac_address 	= asix_set_mac_address,
 	.ndo_validate_addr	= eth_validate_addr,
 	.ndo_set_rx_mode	= asix_set_multicast,
-	.ndo_eth_ioctl		= asix_ioctl,
+	.ndo_eth_ioctl		= usbnet_mii_ioctl,
 	.ndo_change_mtu 	= ax88178_change_mtu,
 };
 
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index b034ef8a73ea..0e9ae89b840e 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -847,12 +847,6 @@ static int ax88179_set_eee(struct net_device *net, struct ethtool_keee *edata)
 	return ret;
 }
 
-static int ax88179_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
-{
-	struct usbnet *dev = netdev_priv(net);
-	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
-}
-
 static const struct ethtool_ops ax88179_ethtool_ops = {
 	.get_link		= ethtool_op_get_link,
 	.get_msglevel		= usbnet_get_msglevel,
@@ -998,7 +992,7 @@ static const struct net_device_ops ax88179_netdev_ops = {
 	.ndo_change_mtu		= ax88179_change_mtu,
 	.ndo_set_mac_address	= ax88179_set_mac_addr,
 	.ndo_validate_addr	= eth_validate_addr,
-	.ndo_eth_ioctl		= ax88179_ioctl,
+	.ndo_eth_ioctl		= usbnet_mii_ioctl,
 	.ndo_set_rx_mode	= ax88179_set_multicast,
 	.ndo_set_features	= ax88179_set_features,
 };
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
index 9e5649cefcbc..c8e0f8868210 100644
--- a/drivers/net/usb/dm9601.c
+++ b/drivers/net/usb/dm9601.c
@@ -259,13 +259,6 @@ static void dm9601_mdio_write(struct net_device *netdev, int phy_id, int loc,
 	dm_write_shared_word(dev, 1, loc, res);
 }
 
-static int dm9601_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
-{
-	struct usbnet *dev = netdev_priv(net);
-
-	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
-}
-
 static const struct ethtool_ops dm9601_ethtool_ops = {
 	.get_drvinfo	= usbnet_get_drvinfo,
 	.get_link	= usbnet_get_link,
@@ -337,7 +330,7 @@ static const struct net_device_ops dm9601_netdev_ops = {
 	.ndo_change_mtu		= usbnet_change_mtu,
 	.ndo_get_stats64	= dev_get_tstats64,
 	.ndo_validate_addr	= eth_validate_addr,
-	.ndo_eth_ioctl		= dm9601_ioctl,
+	.ndo_eth_ioctl		= usbnet_mii_ioctl,
 	.ndo_set_rx_mode	= dm9601_set_multicast,
 	.ndo_set_mac_address	= dm9601_set_mac_address,
 };
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c
index 3a551ad363d0..d6698f30218d 100644
--- a/drivers/net/usb/mcs7830.c
+++ b/drivers/net/usb/mcs7830.c
@@ -325,12 +325,6 @@ static void mcs7830_mdio_write(struct net_device *netdev, int phy_id,
 	mcs7830_write_phy(dev, location, val);
 }
 
-static int mcs7830_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
-{
-	struct usbnet *dev = netdev_priv(net);
-	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
-}
-
 static inline struct mcs7830_data *mcs7830_get_data(struct usbnet *dev)
 {
 	return (struct mcs7830_data *)&dev->data;
@@ -468,7 +462,7 @@ static const struct net_device_ops mcs7830_netdev_ops = {
 	.ndo_change_mtu		= usbnet_change_mtu,
 	.ndo_get_stats64	= dev_get_tstats64,
 	.ndo_validate_addr	= eth_validate_addr,
-	.ndo_eth_ioctl		= mcs7830_ioctl,
+	.ndo_eth_ioctl		= usbnet_mii_ioctl,
 	.ndo_set_rx_mode	= mcs7830_set_multicast,
 	.ndo_set_mac_address	= mcs7830_set_mac_address,
 };
diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
index fbc9d796f605..1a61a8bcf5d3 100644
--- a/drivers/net/usb/smsc75xx.c
+++ b/drivers/net/usb/smsc75xx.c
@@ -743,12 +743,10 @@ static const struct ethtool_ops smsc75xx_ethtool_ops = {
 
 static int smsc75xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
 {
-	struct usbnet *dev = netdev_priv(netdev);
-
 	if (!netif_running(netdev))
 		return -EINVAL;
 
-	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
+	return usbnet_mii_ioctl(netdev, rq, cmd);
 }
 
 static void smsc75xx_init_mac_address(struct usbnet *dev)
diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c
index e3f6233e5866..6fd33a5b2279 100644
--- a/drivers/net/usb/sr9800.c
+++ b/drivers/net/usb/sr9800.c
@@ -469,13 +469,6 @@ static int sr_get_eeprom(struct net_device *net,
 	return 0;
 }
 
-static int sr_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
-{
-	struct usbnet *dev = netdev_priv(net);
-
-	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
-}
-
 static int sr_set_mac_address(struct net_device *net, void *p)
 {
 	struct usbnet *dev = netdev_priv(net);
@@ -668,7 +661,7 @@ static const struct net_device_ops sr9800_netdev_ops = {
 	.ndo_get_stats64	= dev_get_tstats64,
 	.ndo_set_mac_address	= sr_set_mac_address,
 	.ndo_validate_addr	= eth_validate_addr,
-	.ndo_eth_ioctl		= sr_ioctl,
+	.ndo_eth_ioctl		= usbnet_mii_ioctl,
 	.ndo_set_rx_mode        = sr_set_multicast,
 };
 
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 9280ef544bbb..41b95b04143d 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1085,6 +1085,14 @@ int usbnet_nway_reset(struct net_device *net)
 }
 EXPORT_SYMBOL_GPL(usbnet_nway_reset);
 
+int usbnet_mii_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
+{
+	struct usbnet *dev = netdev_priv(net);
+
+	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
+}
+EXPORT_SYMBOL_GPL(usbnet_mii_ioctl);
+
 void usbnet_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)
 {
 	struct usbnet *dev = netdev_priv(net);
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index 2945923a8a95..b0e84896e6ac 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -290,6 +290,7 @@ extern u32 usbnet_get_msglevel(struct net_device *);
 extern void usbnet_set_msglevel(struct net_device *, u32);
 extern void usbnet_set_rx_mode(struct net_device *net);
 extern void usbnet_get_drvinfo(struct net_device *, struct ethtool_drvinfo *);
+extern int usbnet_mii_ioctl(struct net_device *net, struct ifreq *rq, int cmd);
 extern int usbnet_nway_reset(struct net_device *net);
 
 extern int usbnet_manage_power(struct usbnet *, int);
-- 
2.43.0


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

* Re: [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function
  2026-02-03  1:34 [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function Ethan Nelson-Moore
@ 2026-02-03  8:25 ` Andy Shevchenko
  2026-02-03  8:49   ` Ethan Nelson-Moore
  2026-02-04  3:50 ` patchwork-bot+netdevbpf
  1 sibling, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2026-02-03  8:25 UTC (permalink / raw)
  To: Ethan Nelson-Moore
  Cc: linux-usb, netdev, Vadim Fedorenko, Andrew Lunn, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Peter Korsgaard, Steve Glendinning, Oliver Neukum,
	Greg Kroah-Hartman, Oleksij Rempel, Max Schulze,
	Krzysztof Hałasa

On Mon, Feb 02, 2026 at 05:34:55PM -0800, Ethan Nelson-Moore wrote:
> Many USB network drivers use identical code to pass ioctl
> requests on to the MII layer. Reduce code duplication by
> refactoring this code into a helper function.

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

...

>  extern void usbnet_set_msglevel(struct net_device *, u32);
>  extern void usbnet_set_rx_mode(struct net_device *net);
>  extern void usbnet_get_drvinfo(struct net_device *, struct ethtool_drvinfo *);
> +extern int usbnet_mii_ioctl(struct net_device *net, struct ifreq *rq, int cmd);

Do we still need to populate 'extern'? Can we get rid of this redundancy?

>  extern int usbnet_nway_reset(struct net_device *net);

>  extern int usbnet_manage_power(struct usbnet *, int);

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function
  2026-02-03  8:25 ` Andy Shevchenko
@ 2026-02-03  8:49   ` Ethan Nelson-Moore
  2026-02-03  9:49     ` Andy Shevchenko
  0 siblings, 1 reply; 6+ messages in thread
From: Ethan Nelson-Moore @ 2026-02-03  8:49 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: linux-usb, netdev, Vadim Fedorenko, Andrew Lunn, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Peter Korsgaard, Steve Glendinning, Oliver Neukum,
	Greg Kroah-Hartman, Oleksij Rempel, Max Schulze,
	Krzysztof Hałasa

Hi, Andy,

On Tue, Feb 3, 2026 at 12:25 AM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> > +extern int usbnet_mii_ioctl(struct net_device *net, struct ifreq *rq, int cmd);
>
> Do we still need to populate 'extern'? Can we get rid of this redundancy?
In my opinion, while you're right that it isn't necessary because all
functions (unlike variables) are implied to be extern, the use of
extern to indicate functions that are exported/intended to be part of
the API is a good idea.

Ethan

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

* Re: [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function
  2026-02-03  8:49   ` Ethan Nelson-Moore
@ 2026-02-03  9:49     ` Andy Shevchenko
  2026-02-04  3:48       ` Ethan Nelson-Moore
  0 siblings, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2026-02-03  9:49 UTC (permalink / raw)
  To: Ethan Nelson-Moore
  Cc: linux-usb, netdev, Vadim Fedorenko, Andrew Lunn, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Peter Korsgaard, Steve Glendinning, Oliver Neukum,
	Greg Kroah-Hartman, Oleksij Rempel, Max Schulze,
	Krzysztof Hałasa

On Tue, Feb 03, 2026 at 12:49:57AM -0800, Ethan Nelson-Moore wrote:
> On Tue, Feb 3, 2026 at 12:25 AM Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> > > +extern int usbnet_mii_ioctl(struct net_device *net, struct ifreq *rq, int cmd);
> >
> > Do we still need to populate 'extern'? Can we get rid of this redundancy?
> In my opinion, while you're right that it isn't necessary because all
> functions (unlike variables) are implied to be extern, the use of
> extern to indicate functions that are exported/intended to be part of
> the API is a good idea.

I'm not sure. This makes it harder to read for no benefit. All non-static
functions are part of the API.

-- 
With Best Regards,
Andy Shevchenko



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

* Re: [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function
  2026-02-03  9:49     ` Andy Shevchenko
@ 2026-02-04  3:48       ` Ethan Nelson-Moore
  0 siblings, 0 replies; 6+ messages in thread
From: Ethan Nelson-Moore @ 2026-02-04  3:48 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: linux-usb, netdev, Vadim Fedorenko, Andrew Lunn, Andrew Lunn,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Peter Korsgaard, Steve Glendinning, Oliver Neukum,
	Greg Kroah-Hartman, Oleksij Rempel, Max Schulze,
	Krzysztof Hałasa

On Tue, Feb 3, 2026 at 1:49 AM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> I'm not sure. This makes it harder to read for no benefit. All non-static
> functions are part of the API.
While I can't fault your reasoning, respectfully, I think that
removing "extern" would just be pointless code churn.

Ethan

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

* Re: [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function
  2026-02-03  1:34 [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function Ethan Nelson-Moore
  2026-02-03  8:25 ` Andy Shevchenko
@ 2026-02-04  3:50 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-02-04  3:50 UTC (permalink / raw)
  To: Ethan Nelson-Moore
  Cc: linux-usb, netdev, vadim.fedorenko, andrew, andrew+netdev, davem,
	edumazet, kuba, pabeni, peter, steve.glendinning, oneukum, gregkh,
	o.rempel, max.schulze, khalasa, andriy.shevchenko

Hello:

This patch was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Mon,  2 Feb 2026 17:34:55 -0800 you wrote:
> Many USB network drivers use identical code to pass ioctl
> requests on to the MII layer. Reduce code duplication by
> refactoring this code into a helper function.
> 
> Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev> (v1)
> Reviewed-by: Andrew Lunn <andrew@lunn.ch> (v3)
> Signed-off-by: Ethan Nelson-Moore <enelsonmoore@gmail.com>
> 
> [...]

Here is the summary with links:
  - [net-next,v4] net: usb: introduce usbnet_mii_ioctl helper function
    https://git.kernel.org/netdev/net-next/c/61e94cbdf822

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

end of thread, other threads:[~2026-02-04  3:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-03  1:34 [PATCH net-next v4] net: usb: introduce usbnet_mii_ioctl helper function Ethan Nelson-Moore
2026-02-03  8:25 ` Andy Shevchenko
2026-02-03  8:49   ` Ethan Nelson-Moore
2026-02-03  9:49     ` Andy Shevchenko
2026-02-04  3:48       ` Ethan Nelson-Moore
2026-02-04  3:50 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox