* [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet
@ 2026-07-09 12:01 Oliver Neukum
2026-07-09 12:01 ` [PATCHv2 net-next 2/7] net: usb: usbnet: add cdc_state to struct usbnet Oliver Neukum
` (6 more replies)
0 siblings, 7 replies; 16+ messages in thread
From: Oliver Neukum @ 2026-07-09 12:01 UTC (permalink / raw)
To: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
Cc: Oliver Neukum
This helper is used by multiple drivers using usbnet.
It is better to be provided by usbnet than one of them.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
v2:
- spelling issues
- issue with lost synchronization with SPLIT packets
drivers/net/usb/cdc_ether.c | 19 -------------------
drivers/net/usb/usbnet.c | 19 +++++++++++++++++++
2 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index b4df32e18461..e688fb99c61d 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -404,25 +404,6 @@ static int usbnet_cdc_zte_bind(struct usbnet *dev, struct usb_interface *intf)
return status;
}
-/* Make sure packets have correct destination MAC address
- *
- * A firmware bug observed on some devices (ZTE MF823/831/910) is that the
- * device sends packets with a static, bogus, random MAC address (event if
- * device MAC address has been updated). Always set MAC address to that of the
- * device.
- */
-int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
-{
- if (skb->len < ETH_HLEN || !(skb->data[0] & 0x02))
- return 1;
-
- skb_reset_mac_header(skb);
- ether_addr_copy(eth_hdr(skb)->h_dest, dev->net->dev_addr);
-
- return 1;
-}
-EXPORT_SYMBOL_GPL(usbnet_cdc_zte_rx_fixup);
-
/* Ensure correct link state
*
* Some devices (ZTE MF823/831/910) export two carrier on notifications when
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 21c55d70f27c..14e9f1b1e0a2 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -2350,6 +2350,25 @@ void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
}
}
EXPORT_SYMBOL_GPL(usbnet_cdc_status);
+
+/* Make sure packets have correct destination MAC address
+ *
+ * A firmware bug observed on some devices (ZTE MF823/831/910) is that the
+ * device sends packets with a static, bogus, random MAC address (event if
+ * device MAC address has been updated). Always set MAC address to that of the
+ * device.
+ */
+int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
+{
+ if (skb->len < ETH_HLEN || !(skb->data[0] & 0x02))
+ return 1;
+
+ skb_reset_mac_header(skb);
+ ether_addr_copy(eth_hdr(skb)->h_dest, dev->net->dev_addr);
+
+ return 1;
+}
+EXPORT_SYMBOL_GPL(usbnet_cdc_zte_rx_fixup);
/*-------------------------------------------------------------------------*/
static int __init usbnet_init(void)
--
2.54.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCHv2 net-next 2/7] net: usb: usbnet: add cdc_state to struct usbnet
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
@ 2026-07-09 12:01 ` Oliver Neukum
2026-07-09 13:49 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 3/7] net: usb: use cdc_state in " Oliver Neukum
` (5 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Oliver Neukum @ 2026-07-09 12:01 UTC (permalink / raw)
To: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
Cc: Oliver Neukum
This allows centralisation of code using cdc_state in usbnet, reducing
code duplication. No functional change intended.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
include/linux/usb/usbnet.h | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index bbf799ccf3b3..79f48eb388ee 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -16,6 +16,14 @@
#include <linux/usb.h>
#include <linux/spinlock.h>
+struct cdc_state {
+ struct usb_cdc_header_desc *header;
+ struct usb_cdc_union_desc *u;
+ struct usb_cdc_ether_desc *ether;
+ struct usb_interface *control;
+ struct usb_interface *data;
+};
+
/* interface from usbnet core to each USB networking link we handle */
struct usbnet {
/* housekeeping */
@@ -41,6 +49,7 @@ struct usbnet {
/* protocol/interface state */
struct net_device *net;
int msg_enable;
+ struct cdc_state cdc; /* too common to leave out*/
unsigned long data[5];
u32 xid;
u32 hard_mtu; /* count any extra framing */
@@ -211,13 +220,6 @@ extern int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
* (notably, using multiple interfaces according to the CDC
* union descriptor) get some helper code.
*/
-struct cdc_state {
- struct usb_cdc_header_desc *header;
- struct usb_cdc_union_desc *u;
- struct usb_cdc_ether_desc *ether;
- struct usb_interface *control;
- struct usb_interface *data;
-};
extern void usbnet_cdc_update_filter(struct usbnet *dev);
extern int usbnet_generic_cdc_bind(struct usbnet *, struct usb_interface *);
--
2.54.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCHv2 net-next 3/7] net: usb: use cdc_state in struct usbnet
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
2026-07-09 12:01 ` [PATCHv2 net-next 2/7] net: usb: usbnet: add cdc_state to struct usbnet Oliver Neukum
@ 2026-07-09 12:01 ` Oliver Neukum
2026-07-09 13:49 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 4/7] net: usb: int51x1: drop dependency on cdc_ether Oliver Neukum
` (4 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Oliver Neukum @ 2026-07-09 12:01 UTC (permalink / raw)
To: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
Cc: Oliver Neukum
Remove private copies as now a central state can be used.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
drivers/net/usb/cdc_ether.c | 9 +++------
drivers/net/usb/rndis_host.c | 6 +++---
2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index e688fb99c61d..76ad4ffa950a 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -85,7 +85,7 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
u8 *buf = intf->cur_altsetting->extra;
int len = intf->cur_altsetting->extralen;
struct usb_interface_descriptor *d;
- struct cdc_state *info = (void *) &dev->data;
+ struct cdc_state *info = &dev->cdc;
int status = -ENODEV;
int rndis;
bool android_rndis_quirk = false;
@@ -336,7 +336,7 @@ EXPORT_SYMBOL_GPL(usbnet_ether_cdc_bind);
void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
{
- struct cdc_state *info = (void *) &dev->data;
+ struct cdc_state *info = &dev->cdc;
struct usb_driver *driver = driver_of(intf);
/* combined interface - nothing to do */
@@ -374,10 +374,7 @@ EXPORT_SYMBOL_GPL(usbnet_cdc_unbind);
int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
{
int status;
- struct cdc_state *info = (void *) &dev->data;
-
- BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data)
- < sizeof(struct cdc_state)));
+ struct cdc_state *info = &dev->cdc;
status = usbnet_ether_cdc_bind(dev, intf);
if (status < 0)
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
index 5e39d05a2d7b..d539654687c3 100644
--- a/drivers/net/usb/rndis_host.c
+++ b/drivers/net/usb/rndis_host.c
@@ -57,7 +57,7 @@ EXPORT_SYMBOL_GPL(rndis_status);
static void rndis_msg_indicate(struct usbnet *dev, struct rndis_indicate *msg,
int buflen)
{
- struct cdc_state *info = (void *)&dev->data;
+ struct cdc_state *info = &dev->cdc;
struct device *udev = &info->control->dev;
if (dev->driver_info->indication) {
@@ -90,7 +90,7 @@ static void rndis_msg_indicate(struct usbnet *dev, struct rndis_indicate *msg,
*/
int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
{
- struct cdc_state *info = (void *) &dev->data;
+ struct cdc_state *info = &dev->cdc;
struct usb_cdc_notification notification;
int master_ifnum;
int retval;
@@ -290,7 +290,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
{
int retval;
struct net_device *net = dev->net;
- struct cdc_state *info = (void *) &dev->data;
+ struct cdc_state *info = &dev->cdc;
union {
void *buf;
struct rndis_msg_hdr *header;
--
2.54.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCHv2 net-next 4/7] net: usb: int51x1: drop dependency on cdc_ether
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
2026-07-09 12:01 ` [PATCHv2 net-next 2/7] net: usb: usbnet: add cdc_state to struct usbnet Oliver Neukum
2026-07-09 12:01 ` [PATCHv2 net-next 3/7] net: usb: use cdc_state in " Oliver Neukum
@ 2026-07-09 12:01 ` Oliver Neukum
2026-07-09 13:50 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 5/7] net: usb: move exported symbols from cdc_ether to usbnet Oliver Neukum
` (3 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Oliver Neukum @ 2026-07-09 12:01 UTC (permalink / raw)
To: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
Cc: Oliver Neukum
The driver depended on cdc_ether only for usbnet_cdc_update_filter().
This has been shifted to usbnet. Drop the dependency.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
v2:
- added as missed opportunity
drivers/net/usb/Kconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 52a5c0922c79..da0f6a138f4f 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -563,7 +563,6 @@ config USB_HSO
config USB_NET_INT51X1
tristate "Intellon PLC based usb adapter"
depends on USB_USBNET
- select USB_NET_CDCETHER
help
Choose this option if you're using a 14Mb USB-based PLC
(Powerline Communications) solution with an Intellon
--
2.54.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCHv2 net-next 5/7] net: usb: move exported symbols from cdc_ether to usbnet
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
` (2 preceding siblings ...)
2026-07-09 12:01 ` [PATCHv2 net-next 4/7] net: usb: int51x1: drop dependency on cdc_ether Oliver Neukum
@ 2026-07-09 12:01 ` Oliver Neukum
2026-07-09 13:51 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether Oliver Neukum
` (2 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Oliver Neukum @ 2026-07-09 12:01 UTC (permalink / raw)
To: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
Cc: Oliver Neukum
Move the rest of the symbols to usbnet, so that the cdc_ether
driver does not need to be loaded as a library.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
drivers/net/usb/cdc_ether.c | 372 ------------------------------------
drivers/net/usb/usbnet.c | 356 ++++++++++++++++++++++++++++++++++
include/linux/usb/usbnet.h | 17 ++
3 files changed, 373 insertions(+), 372 deletions(-)
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index 76ad4ffa950a..6bf6538f3468 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -19,378 +19,6 @@
#include <linux/usb/usbnet.h>
-#if IS_ENABLED(CONFIG_USB_NET_RNDIS_HOST)
-
-static int is_rndis(struct usb_interface_descriptor *desc)
-{
- return (desc->bInterfaceClass == USB_CLASS_COMM &&
- desc->bInterfaceSubClass == 2 &&
- desc->bInterfaceProtocol == 0xff);
-}
-
-static int is_activesync(struct usb_interface_descriptor *desc)
-{
- return (desc->bInterfaceClass == USB_CLASS_MISC &&
- desc->bInterfaceSubClass == 1 &&
- desc->bInterfaceProtocol == 1);
-}
-
-static int is_wireless_rndis(struct usb_interface_descriptor *desc)
-{
- return (desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER &&
- desc->bInterfaceSubClass == 1 &&
- desc->bInterfaceProtocol == 3);
-}
-
-static int is_novatel_rndis(struct usb_interface_descriptor *desc)
-{
- return (desc->bInterfaceClass == USB_CLASS_MISC &&
- desc->bInterfaceSubClass == 4 &&
- desc->bInterfaceProtocol == 1);
-}
-
-#else
-
-#define is_rndis(desc) 0
-#define is_activesync(desc) 0
-#define is_wireless_rndis(desc) 0
-#define is_novatel_rndis(desc) 0
-
-#endif
-
-static const u8 mbm_guid[16] = {
- 0xa3, 0x17, 0xa8, 0x8b, 0x04, 0x5e, 0x4f, 0x01,
- 0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a,
-};
-
-/* We need to override usbnet_*_link_ksettings in bind() */
-static const struct ethtool_ops cdc_ether_ethtool_ops = {
- .get_link = usbnet_get_link,
- .nway_reset = usbnet_nway_reset,
- .get_drvinfo = usbnet_get_drvinfo,
- .get_msglevel = usbnet_get_msglevel,
- .set_msglevel = usbnet_set_msglevel,
- .get_ts_info = ethtool_op_get_ts_info,
- .get_link_ksettings = usbnet_get_link_ksettings_internal,
- .set_link_ksettings = NULL,
-};
-
-/* probes control interface, claims data interface, collects the bulk
- * endpoints, activates data interface (if needed), maybe sets MTU.
- * all pure cdc, except for certain firmware workarounds, and knowing
- * that rndis uses one different rule.
- */
-int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
-{
- u8 *buf = intf->cur_altsetting->extra;
- int len = intf->cur_altsetting->extralen;
- struct usb_interface_descriptor *d;
- struct cdc_state *info = &dev->cdc;
- int status = -ENODEV;
- int rndis;
- bool android_rndis_quirk = false;
- struct usb_driver *driver = driver_of(intf);
- struct usb_cdc_parsed_header header;
-
- if (sizeof(dev->data) < sizeof(*info))
- return -EDOM;
-
- /* expect strict spec conformance for the descriptors, but
- * cope with firmware which stores them in the wrong place
- */
- if (len == 0 && dev->udev->actconfig->extralen) {
- /* Motorola SB4100 (and others: Brad Hards says it's
- * from a Broadcom design) put CDC descriptors here
- */
- buf = dev->udev->actconfig->extra;
- len = dev->udev->actconfig->extralen;
- dev_dbg(&intf->dev, "CDC descriptors on config\n");
- }
-
- /* Maybe CDC descriptors are after the endpoint? This bug has
- * been seen on some 2Wire Inc RNDIS-ish products.
- */
- if (len == 0) {
- struct usb_host_endpoint *hep;
-
- hep = intf->cur_altsetting->endpoint;
- if (hep) {
- buf = hep->extra;
- len = hep->extralen;
- }
- if (len)
- dev_dbg(&intf->dev,
- "CDC descriptors on endpoint\n");
- }
-
- /* this assumes that if there's a non-RNDIS vendor variant
- * of cdc-acm, it'll fail RNDIS requests cleanly.
- */
- rndis = (is_rndis(&intf->cur_altsetting->desc) ||
- is_activesync(&intf->cur_altsetting->desc) ||
- is_wireless_rndis(&intf->cur_altsetting->desc) ||
- is_novatel_rndis(&intf->cur_altsetting->desc));
-
- memset(info, 0, sizeof(*info));
- info->control = intf;
-
- cdc_parse_cdc_header(&header, intf, buf, len);
-
- info->u = header.usb_cdc_union_desc;
- info->header = header.usb_cdc_header_desc;
- info->ether = header.usb_cdc_ether_desc;
- if (!info->u) {
- if (rndis) {
- goto skip;
- } else {
- /* in that case a quirk is mandatory */
- dev_err(&dev->udev->dev, "No union descriptors\n");
- goto bad_desc;
- }
- }
- /* we need a master/control interface (what we're
- * probed with) and a slave/data interface; union
- * descriptors sort this all out.
- */
- info->control = usb_ifnum_to_if(dev->udev, info->u->bMasterInterface0);
- info->data = usb_ifnum_to_if(dev->udev, info->u->bSlaveInterface0);
- if (!info->control || !info->data) {
- dev_dbg(&intf->dev,
- "master #%u/%p slave #%u/%p\n",
- info->u->bMasterInterface0,
- info->control,
- info->u->bSlaveInterface0,
- info->data);
- /* fall back to hard-wiring for RNDIS */
- if (rndis) {
- android_rndis_quirk = true;
- goto skip;
- }
- dev_err(&intf->dev, "bad CDC descriptors\n");
- goto bad_desc;
- }
- if (info->control != intf) {
- /* Ambit USB Cable Modem (and maybe others)
- * interchanges master and slave interface.
- */
- if (info->data == intf) {
- info->data = info->control;
- info->control = intf;
- } else {
- dev_err(&intf->dev, "bogus CDC Union\n");
- goto bad_desc;
- }
- }
-
- /* some devices merge these - skip class check */
- if (info->control == info->data)
- goto skip;
-
- /* a data interface altsetting does the real i/o */
- d = &info->data->cur_altsetting->desc;
- if (d->bInterfaceClass != USB_CLASS_CDC_DATA) {
- dev_err(&intf->dev, "slave class %u\n", d->bInterfaceClass);
- goto bad_desc;
- }
-skip:
- /* Communication class functions with bmCapabilities are not
- * RNDIS. But some Wireless class RNDIS functions use
- * bmCapabilities for their own purpose. The failsafe is
- * therefore applied only to Communication class RNDIS
- * functions. The rndis test is redundant, but a cheap
- * optimization.
- */
- if (rndis && is_rndis(&intf->cur_altsetting->desc) &&
- header.usb_cdc_acm_descriptor &&
- header.usb_cdc_acm_descriptor->bmCapabilities) {
- dev_err(&intf->dev,
- "ACM capabilities %02x, not really RNDIS?\n",
- header.usb_cdc_acm_descriptor->bmCapabilities);
- goto bad_desc;
- }
-
- if (header.usb_cdc_ether_desc && info->ether->wMaxSegmentSize) {
- dev->hard_mtu = le16_to_cpu(info->ether->wMaxSegmentSize);
- /* because of Zaurus, we may be ignoring the host
- * side link address we were given.
- */
- }
-
- if (header.usb_cdc_mdlm_desc &&
- memcmp(header.usb_cdc_mdlm_desc->bGUID, mbm_guid, 16)) {
- dev_err(&intf->dev, "GUID doesn't match\n");
- goto bad_desc;
- }
-
- if (header.usb_cdc_mdlm_detail_desc &&
- header.usb_cdc_mdlm_detail_desc->bLength <
- (sizeof(struct usb_cdc_mdlm_detail_desc) + 1)) {
- dev_err(&intf->dev, "Descriptor too short\n");
- goto bad_desc;
- }
-
-
-
- /* Microsoft ActiveSync based and some regular RNDIS devices lack the
- * CDC descriptors, so we'll hard-wire the interfaces and not check
- * for descriptors.
- *
- * Some Android RNDIS devices have a CDC Union descriptor pointing
- * to non-existing interfaces. Ignore that and attempt the same
- * hard-wired 0 and 1 interfaces.
- */
- if (rndis && (!info->u || android_rndis_quirk)) {
- info->control = usb_ifnum_to_if(dev->udev, 0);
- info->data = usb_ifnum_to_if(dev->udev, 1);
- if (!info->control || !info->data || info->control != intf) {
- dev_err(&intf->dev,
- "rndis: master #0/%p slave #1/%p\n",
- info->control,
- info->data);
- goto bad_desc;
- }
-
- } else if (!info->header || (!rndis && !info->ether)) {
- dev_err(&intf->dev, "missing cdc %s%s%sdescriptor\n",
- info->header ? "" : "header ",
- info->u ? "" : "union ",
- info->ether ? "" : "ether ");
- goto bad_desc;
- }
-
- /* claim data interface and set it up ... with side effects.
- * network traffic can't flow until an altsetting is enabled.
- */
- if (info->data != info->control) {
- status = usb_driver_claim_interface(driver, info->data, dev);
- if (status < 0) {
- dev_err(&intf->dev, "Second interface unclaimable\n");
- goto bad_desc;
- }
- }
- status = usbnet_get_endpoints(dev, info->data);
- if (status < 0) {
- dev_dbg(&intf->dev, "Mandatory endpoints missing\n");
- goto bail_out_and_release;
- }
-
- /* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */
- if (info->data != info->control)
- dev->status = NULL;
- if (info->control->cur_altsetting->desc.bNumEndpoints == 1) {
- struct usb_endpoint_descriptor *desc;
-
- dev->status = &info->control->cur_altsetting->endpoint[0];
- desc = &dev->status->desc;
- if (!usb_endpoint_is_int_in(desc) ||
- (le16_to_cpu(desc->wMaxPacketSize)
- < sizeof(struct usb_cdc_notification)) ||
- !desc->bInterval) {
- dev_dbg(&intf->dev, "bad notification endpoint\n");
- dev->status = NULL;
- }
- }
- if (rndis && !dev->status) {
- dev_err(&intf->dev, "missing RNDIS status endpoint\n");
- status = -ENODEV;
- goto bail_out_and_release;
- }
-
- /* override ethtool_ops */
- dev->net->ethtool_ops = &cdc_ether_ethtool_ops;
-
- return 0;
-
-bail_out_and_release:
- usb_set_intfdata(info->data, NULL);
- if (info->data != info->control)
- usb_driver_release_interface(driver, info->data);
-bad_desc:
- return status;
-}
-EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind);
-
-
-/* like usbnet_generic_cdc_bind() but handles filter initialization
- * correctly
- */
-int usbnet_ether_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
-{
- int rv;
-
- rv = usbnet_generic_cdc_bind(dev, intf);
- if (rv < 0)
- goto bail_out;
-
- /* Some devices don't initialise properly. In particular
- * the packet filter is not reset. There are devices that
- * don't do reset all the way. So the packet filter should
- * be set to a sane initial value.
- */
- usbnet_cdc_update_filter(dev);
-
-bail_out:
- return rv;
-}
-EXPORT_SYMBOL_GPL(usbnet_ether_cdc_bind);
-
-void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
-{
- struct cdc_state *info = &dev->cdc;
- struct usb_driver *driver = driver_of(intf);
-
- /* combined interface - nothing to do */
- if (info->data == info->control)
- return;
-
- /* disconnect master --> disconnect slave */
- if (intf == info->control && info->data) {
- /* ensure immediate exit from usbnet_disconnect */
- usb_set_intfdata(info->data, NULL);
- usb_driver_release_interface(driver, info->data);
- info->data = NULL;
- }
-
- /* and vice versa (just in case) */
- else if (intf == info->data && info->control) {
- /* ensure immediate exit from usbnet_disconnect */
- usb_set_intfdata(info->control, NULL);
- usb_driver_release_interface(driver, info->control);
- info->control = NULL;
- }
-}
-EXPORT_SYMBOL_GPL(usbnet_cdc_unbind);
-
-/* Communications Device Class, Ethernet Control model
- *
- * Takes two interfaces. The DATA interface is inactive till an altsetting
- * is selected. Configuration data includes class descriptors. There's
- * an optional status endpoint on the control interface.
- *
- * This should interop with whatever the 2.4 "CDCEther.c" driver
- * (by Brad Hards) talked with, with more functionality.
- */
-
-int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
-{
- int status;
- struct cdc_state *info = &dev->cdc;
-
- status = usbnet_ether_cdc_bind(dev, intf);
- if (status < 0)
- return status;
-
- status = usbnet_get_ethernet_addr(dev, info->ether->iMACAddress);
- if (status < 0) {
- usb_set_intfdata(info->data, NULL);
- usb_driver_release_interface(driver_of(intf), info->data);
- return status;
- }
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(usbnet_cdc_bind);
-
static int usbnet_cdc_zte_bind(struct usbnet *dev, struct usb_interface *intf)
{
int status = usbnet_cdc_bind(dev, intf);
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 14e9f1b1e0a2..ce932c81382e 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -2369,6 +2369,362 @@ int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
return 1;
}
EXPORT_SYMBOL_GPL(usbnet_cdc_zte_rx_fixup);
+
+
+#if IS_ENABLED(CONFIG_USB_NET_RNDIS_HOST)
+
+static int is_rndis(struct usb_interface_descriptor *desc)
+{
+ return (desc->bInterfaceClass == USB_CLASS_COMM &&
+ desc->bInterfaceSubClass == 2 &&
+ desc->bInterfaceProtocol == 0xff);
+}
+
+static int is_activesync(struct usb_interface_descriptor *desc)
+{
+ return (desc->bInterfaceClass == USB_CLASS_MISC &&
+ desc->bInterfaceSubClass == 1 &&
+ desc->bInterfaceProtocol == 1);
+}
+
+static int is_wireless_rndis(struct usb_interface_descriptor *desc)
+{
+ return (desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER &&
+ desc->bInterfaceSubClass == 1 &&
+ desc->bInterfaceProtocol == 3);
+}
+
+static int is_novatel_rndis(struct usb_interface_descriptor *desc)
+{
+ return (desc->bInterfaceClass == USB_CLASS_MISC &&
+ desc->bInterfaceSubClass == 4 &&
+ desc->bInterfaceProtocol == 1);
+}
+
+#else
+
+#define is_rndis(desc) 0
+#define is_activesync(desc) 0
+#define is_wireless_rndis(desc) 0
+#define is_novatel_rndis(desc) 0
+
+#endif
+
+/* Communications Device Class, Ethernet Control model
+ *
+ * Takes two interfaces. The DATA interface is inactive till an altsetting
+ * is selected. Configuration data includes class descriptors. There's
+ * an optional status endpoint on the control interface.
+ *
+ * This should interop with whatever the 2.4 "CDCEther.c" driver
+ * (by Brad Hards) talked with, with more functionality.
+ */
+
+int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+ int status;
+ struct cdc_state *info = &dev->cdc;
+
+ status = usbnet_ether_cdc_bind(dev, intf);
+ if (status < 0)
+ return status;
+
+ status = usbnet_get_ethernet_addr(dev, info->ether->iMACAddress);
+ if (status < 0) {
+ usb_set_intfdata(info->data, NULL);
+ usb_driver_release_interface(driver_of(intf), info->data);
+ return status;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(usbnet_cdc_bind);
+
+/* probes control interface, claims data interface, collects the bulk
+ * endpoints, activates data interface (if needed), maybe sets MTU.
+ * all pure cdc, except for certain firmware workarounds, and knowing
+ * that rndis uses one different rule.
+ */
+int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+ u8 *buf = intf->cur_altsetting->extra;
+ int len = intf->cur_altsetting->extralen;
+ struct usb_interface_descriptor *d;
+ struct cdc_state *info = &dev->cdc;
+ int status = -ENODEV;
+ int rndis;
+ bool android_rndis_quirk = false;
+ struct usb_driver *driver = driver_of(intf);
+ struct usb_cdc_parsed_header header;
+
+ if (sizeof(dev->data) < sizeof(*info))
+ return -EDOM;
+
+ /* expect strict spec conformance for the descriptors, but
+ * cope with firmware which stores them in the wrong place
+ */
+ if (len == 0 && dev->udev->actconfig->extralen) {
+ /* Motorola SB4100 (and others: Brad Hards says it's
+ * from a Broadcom design) put CDC descriptors here
+ */
+ buf = dev->udev->actconfig->extra;
+ len = dev->udev->actconfig->extralen;
+ dev_dbg(&intf->dev, "CDC descriptors on config\n");
+ }
+
+ /* Maybe CDC descriptors are after the endpoint? This bug has
+ * been seen on some 2Wire Inc RNDIS-ish products.
+ */
+ if (len == 0) {
+ struct usb_host_endpoint *hep;
+
+ hep = intf->cur_altsetting->endpoint;
+ if (hep) {
+ buf = hep->extra;
+ len = hep->extralen;
+ }
+ if (len)
+ dev_dbg(&intf->dev,
+ "CDC descriptors on endpoint\n");
+ }
+
+ /* this assumes that if there's a non-RNDIS vendor variant
+ * of cdc-acm, it'll fail RNDIS requests cleanly.
+ */
+ rndis = (is_rndis(&intf->cur_altsetting->desc) ||
+ is_activesync(&intf->cur_altsetting->desc) ||
+ is_wireless_rndis(&intf->cur_altsetting->desc) ||
+ is_novatel_rndis(&intf->cur_altsetting->desc));
+
+ memset(info, 0, sizeof(*info));
+ info->control = intf;
+
+ cdc_parse_cdc_header(&header, intf, buf, len);
+
+ info->u = header.usb_cdc_union_desc;
+ info->header = header.usb_cdc_header_desc;
+ info->ether = header.usb_cdc_ether_desc;
+ if (!info->u) {
+ if (rndis) {
+ goto skip;
+ } else {
+ /* in that case a quirk is mandatory */
+ dev_err(&dev->udev->dev, "No union descriptors\n");
+ goto bad_desc;
+ }
+ }
+ /* we need a master/control interface (what we're
+ * probed with) and a slave/data interface; union
+ * descriptors sort this all out.
+ */
+ info->control = usb_ifnum_to_if(dev->udev, info->u->bMasterInterface0);
+ info->data = usb_ifnum_to_if(dev->udev, info->u->bSlaveInterface0);
+ if (!info->control || !info->data) {
+ dev_dbg(&intf->dev,
+ "master #%u/%p slave #%u/%p\n",
+ info->u->bMasterInterface0,
+ info->control,
+ info->u->bSlaveInterface0,
+ info->data);
+ /* fall back to hard-wiring for RNDIS */
+ if (rndis) {
+ android_rndis_quirk = true;
+ goto skip;
+ }
+ dev_err(&intf->dev, "bad CDC descriptors\n");
+ goto bad_desc;
+ }
+ if (info->control != intf) {
+ /* Ambit USB Cable Modem (and maybe others)
+ * interchanges master and slave interface.
+ */
+ if (info->data == intf) {
+ info->data = info->control;
+ info->control = intf;
+ } else {
+ dev_err(&intf->dev, "bogus CDC Union\n");
+ goto bad_desc;
+ }
+ }
+
+ /* some devices merge these - skip class check */
+ if (info->control == info->data)
+ goto skip;
+
+ /* a data interface altsetting does the real i/o */
+ d = &info->data->cur_altsetting->desc;
+ if (d->bInterfaceClass != USB_CLASS_CDC_DATA) {
+ dev_err(&intf->dev, "slave class %u\n", d->bInterfaceClass);
+ goto bad_desc;
+ }
+skip:
+ /* Communication class functions with bmCapabilities are not
+ * RNDIS. But some Wireless class RNDIS functions use
+ * bmCapabilities for their own purpose. The failsafe is
+ * therefore applied only to Communication class RNDIS
+ * functions. The rndis test is redundant, but a cheap
+ * optimization.
+ */
+ if (rndis && is_rndis(&intf->cur_altsetting->desc) &&
+ header.usb_cdc_acm_descriptor &&
+ header.usb_cdc_acm_descriptor->bmCapabilities) {
+ dev_err(&intf->dev,
+ "ACM capabilities %02x, not really RNDIS?\n",
+ header.usb_cdc_acm_descriptor->bmCapabilities);
+ goto bad_desc;
+ }
+
+ if (header.usb_cdc_ether_desc && info->ether->wMaxSegmentSize) {
+ dev->hard_mtu = le16_to_cpu(info->ether->wMaxSegmentSize);
+ /* because of Zaurus, we may be ignoring the host
+ * side link address we were given.
+ */
+ }
+
+ if (header.usb_cdc_mdlm_desc &&
+ memcmp(header.usb_cdc_mdlm_desc->bGUID, mbm_guid, 16)) {
+ dev_err(&intf->dev, "GUID doesn't match\n");
+ goto bad_desc;
+ }
+
+ if (header.usb_cdc_mdlm_detail_desc &&
+ header.usb_cdc_mdlm_detail_desc->bLength <
+ (sizeof(struct usb_cdc_mdlm_detail_desc) + 1)) {
+ dev_err(&intf->dev, "Descriptor too short\n");
+ goto bad_desc;
+ }
+
+
+
+ /* Microsoft ActiveSync based and some regular RNDIS devices lack the
+ * CDC descriptors, so we'll hard-wire the interfaces and not check
+ * for descriptors.
+ *
+ * Some Android RNDIS devices have a CDC Union descriptor pointing
+ * to non-existing interfaces. Ignore that and attempt the same
+ * hard-wired 0 and 1 interfaces.
+ */
+ if (rndis && (!info->u || android_rndis_quirk)) {
+ info->control = usb_ifnum_to_if(dev->udev, 0);
+ info->data = usb_ifnum_to_if(dev->udev, 1);
+ if (!info->control || !info->data || info->control != intf) {
+ dev_err(&intf->dev,
+ "rndis: master #0/%p slave #1/%p\n",
+ info->control,
+ info->data);
+ goto bad_desc;
+ }
+
+ } else if (!info->header || (!rndis && !info->ether)) {
+ dev_err(&intf->dev, "missing cdc %s%s%sdescriptor\n",
+ info->header ? "" : "header ",
+ info->u ? "" : "union ",
+ info->ether ? "" : "ether ");
+ goto bad_desc;
+ }
+
+ /* claim data interface and set it up ... with side effects.
+ * network traffic can't flow until an altsetting is enabled.
+ */
+ if (info->data != info->control) {
+ status = usb_driver_claim_interface(driver, info->data, dev);
+ if (status < 0) {
+ dev_err(&intf->dev, "Second interface unclaimable\n");
+ goto bad_desc;
+ }
+ }
+ status = usbnet_get_endpoints(dev, info->data);
+ if (status < 0) {
+ dev_dbg(&intf->dev, "Mandatory endpoints missing\n");
+ goto bail_out_and_release;
+ }
+
+ /* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */
+ if (info->data != info->control)
+ dev->status = NULL;
+ if (info->control->cur_altsetting->desc.bNumEndpoints == 1) {
+ struct usb_endpoint_descriptor *desc;
+
+ dev->status = &info->control->cur_altsetting->endpoint[0];
+ desc = &dev->status->desc;
+ if (!usb_endpoint_is_int_in(desc) ||
+ (le16_to_cpu(desc->wMaxPacketSize)
+ < sizeof(struct usb_cdc_notification)) ||
+ !desc->bInterval) {
+ dev_dbg(&intf->dev, "bad notification endpoint\n");
+ dev->status = NULL;
+ }
+ }
+ if (rndis && !dev->status) {
+ dev_err(&intf->dev, "missing RNDIS status endpoint\n");
+ status = -ENODEV;
+ goto bail_out_and_release;
+ }
+
+ /* override ethtool_ops */
+ dev->net->ethtool_ops = &cdc_ether_ethtool_ops;
+
+ return 0;
+
+bail_out_and_release:
+ usb_set_intfdata(info->data, NULL);
+ if (info->data != info->control)
+ usb_driver_release_interface(driver, info->data);
+bad_desc:
+ return status;
+}
+EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind);
+
+/* like usbnet_generic_cdc_bind() but handles filter initialization
+ * correctly
+ */
+int usbnet_ether_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+ int rv;
+
+ rv = usbnet_generic_cdc_bind(dev, intf);
+ if (rv < 0)
+ goto bail_out;
+
+ /* Some devices don't initialise properly. In particular
+ * the packet filter is not reset. There are devices that
+ * don't do reset all the way. So the packet filter should
+ * be set to a sane initial value.
+ */
+ usbnet_cdc_update_filter(dev);
+
+bail_out:
+ return rv;
+}
+EXPORT_SYMBOL_GPL(usbnet_ether_cdc_bind);
+
+void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
+{
+ struct cdc_state *info = &dev->cdc;
+ struct usb_driver *driver = driver_of(intf);
+
+ /* combined interface - nothing to do */
+ if (info->data == info->control)
+ return;
+
+ /* disconnect master --> disconnect slave */
+ if (intf == info->control && info->data) {
+ /* ensure immediate exit from usbnet_disconnect */
+ usb_set_intfdata(info->data, NULL);
+ usb_driver_release_interface(driver, info->data);
+ info->data = NULL;
+ }
+
+ /* and vice versa (just in case) */
+ else if (intf == info->data && info->control) {
+ /* ensure immediate exit from usbnet_disconnect */
+ usb_set_intfdata(info->control, NULL);
+ usb_driver_release_interface(driver, info->control);
+ info->control = NULL;
+ }
+}
+EXPORT_SYMBOL_GPL(usbnet_cdc_unbind);
+
/*-------------------------------------------------------------------------*/
static int __init usbnet_init(void)
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index 79f48eb388ee..b3a77078fb10 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -16,6 +16,11 @@
#include <linux/usb.h>
#include <linux/spinlock.h>
+static const u8 mbm_guid[16] = {
+ 0xa3, 0x17, 0xa8, 0x8b, 0x04, 0x5e, 0x4f, 0x01,
+ 0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a,
+};
+
struct cdc_state {
struct usb_cdc_header_desc *header;
struct usb_cdc_union_desc *u;
@@ -304,4 +309,16 @@ extern void usbnet_status_stop(struct usbnet *dev);
extern void usbnet_update_max_qlen(struct usbnet *dev);
+/* We need to override usbnet_*_link_ksettings in bind() */
+static const struct ethtool_ops cdc_ether_ethtool_ops = {
+ .get_link = usbnet_get_link,
+ .nway_reset = usbnet_nway_reset,
+ .get_drvinfo = usbnet_get_drvinfo,
+ .get_msglevel = usbnet_get_msglevel,
+ .set_msglevel = usbnet_set_msglevel,
+ .get_ts_info = ethtool_op_get_ts_info,
+ .get_link_ksettings = usbnet_get_link_ksettings_internal,
+ .set_link_ksettings = NULL,
+};
+
#endif /* __LINUX_USB_USBNET_H */
--
2.54.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
` (3 preceding siblings ...)
2026-07-09 12:01 ` [PATCHv2 net-next 5/7] net: usb: move exported symbols from cdc_ether to usbnet Oliver Neukum
@ 2026-07-09 12:01 ` Oliver Neukum
2026-07-09 13:52 ` Andrew Lunn
2026-07-09 18:08 ` Sergey Shtylyov
2026-07-09 12:01 ` [PATCHv2 net-next 7/7] net: usb: usbnet: remove outdated sanity check Oliver Neukum
2026-07-09 12:37 ` [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Manuel Ebner
6 siblings, 2 replies; 16+ messages in thread
From: Oliver Neukum @ 2026-07-09 12:01 UTC (permalink / raw)
To: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
Cc: Oliver Neukum
Now that the driver no longer exports symbols to act
as a library for other drivers other drivers don't
depend on it. Remove the dependencies.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
v2:
- added to allow removal of dependencies
drivers/net/usb/Kconfig | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index da0f6a138f4f..622ff080218e 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -258,7 +258,6 @@ config USB_NET_CDC_EEM
config USB_NET_CDC_NCM
tristate "CDC NCM support"
depends on USB_USBNET
- select USB_NET_CDCETHER
default y
help
This driver provides support for CDC NCM (Network Control Model
@@ -399,7 +398,6 @@ config USB_NET_MCS7830
config USB_NET_RNDIS_HOST
tristate "Host for RNDIS and ActiveSync devices"
depends on USB_USBNET
- select USB_NET_CDCETHER
help
This option enables hosting "Remote NDIS" USB networking links,
as encouraged by Microsoft (instead of CDC Ethernet!) for use in
@@ -494,7 +492,6 @@ config USB_KC2190
config USB_NET_ZAURUS
tristate "Sharp Zaurus (stock ROMs) and compatible"
depends on USB_USBNET
- select USB_NET_CDCETHER
select CRC32
default y
help
@@ -597,7 +594,7 @@ config USB_SIERRA_NET
config USB_VL600
tristate "LG VL600 modem dongle"
- depends on USB_NET_CDCETHER && TTY
+ depends on TTY
select USB_ACM
help
Select this if you want to use an LG Electronics 4G/LTE usb modem
@@ -634,7 +631,7 @@ config USB_NET_AQC111
config USB_RTL8153_ECM
tristate
- depends on USB_NET_CDCETHER && (USB_RTL8152 || USB_RTL8152=n)
+ depends on (USB_RTL8152 || USB_RTL8152=n)
default y
help
This option supports ECM mode for RTL8153 ethernet adapter, when
--
2.54.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCHv2 net-next 7/7] net: usb: usbnet: remove outdated sanity check
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
` (4 preceding siblings ...)
2026-07-09 12:01 ` [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether Oliver Neukum
@ 2026-07-09 12:01 ` Oliver Neukum
2026-07-09 13:56 ` Andrew Lunn
2026-07-09 12:37 ` [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Manuel Ebner
6 siblings, 1 reply; 16+ messages in thread
From: Oliver Neukum @ 2026-07-09 12:01 UTC (permalink / raw)
To: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
Cc: Oliver Neukum
The cdc state is now included as a proper member in the descriptor.
There is no point in checking whether it fits into the scratchpad
area. Just remove the check.
Signed-off-by: Oliver Neukum <oneukum@suse.com>
---
v2:
- added to address concern about maintainability
drivers/net/usb/usbnet.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index ce932c81382e..0347f6887222 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -2457,9 +2457,6 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
struct usb_driver *driver = driver_of(intf);
struct usb_cdc_parsed_header header;
- if (sizeof(dev->data) < sizeof(*info))
- return -EDOM;
-
/* expect strict spec conformance for the descriptors, but
* cope with firmware which stores them in the wrong place
*/
--
2.54.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
` (5 preceding siblings ...)
2026-07-09 12:01 ` [PATCHv2 net-next 7/7] net: usb: usbnet: remove outdated sanity check Oliver Neukum
@ 2026-07-09 12:37 ` Manuel Ebner
2026-07-09 13:55 ` Andrew Lunn
6 siblings, 1 reply; 16+ messages in thread
From: Manuel Ebner @ 2026-07-09 12:37 UTC (permalink / raw)
To: Oliver Neukum, andrew+netdev, davem, edumazet, kuba, pabeni,
netdev, linux-usb, linux-kernel
On Thu, 2026-07-09 at 14:01 +0200, Oliver Neukum wrote:
I guess a couple suggestions got lost, that's ok.
> This helper is used by multiple drivers using usbnet.
> It is better to be provided by usbnet than one of them.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
> ---
>
> v2:
> - spelling issues
> - issue with lost synchronization with SPLIT packets
>
> drivers/net/usb/cdc_ether.c | 19 -------------------
> drivers/net/usb/usbnet.c | 19 +++++++++++++++++++
> 2 files changed, 19 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
> index b4df32e18461..e688fb99c61d 100644
> --- a/drivers/net/usb/cdc_ether.c
> +++ b/drivers/net/usb/cdc_ether.c
> @@ -404,25 +404,6 @@ static int usbnet_cdc_zte_bind(struct usbnet *dev, struct
> usb_interface *intf)
> return status;
> }
>
> -/* Make sure packets have correct destination MAC address
Make sure packets have the correct destination MAC address
> - *
> - * A firmware bug observed on some devices (ZTE MF823/831/910) is that the
> - * device sends packets with a static, bogus, random MAC address (event if
(even if the device ...
> - * device MAC address has been updated). Always set MAC address to that of the
> - * device.
Always set the MAC address to the one of your device.
Thanks
Manuel
> [...]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 2/7] net: usb: usbnet: add cdc_state to struct usbnet
2026-07-09 12:01 ` [PATCHv2 net-next 2/7] net: usb: usbnet: add cdc_state to struct usbnet Oliver Neukum
@ 2026-07-09 13:49 ` Andrew Lunn
0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2026-07-09 13:49 UTC (permalink / raw)
To: Oliver Neukum
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
On Thu, Jul 09, 2026 at 02:01:11PM +0200, Oliver Neukum wrote:
> This allows centralisation of code using cdc_state in usbnet, reducing
> code duplication. No functional change intended.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 3/7] net: usb: use cdc_state in struct usbnet
2026-07-09 12:01 ` [PATCHv2 net-next 3/7] net: usb: use cdc_state in " Oliver Neukum
@ 2026-07-09 13:49 ` Andrew Lunn
0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2026-07-09 13:49 UTC (permalink / raw)
To: Oliver Neukum
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
On Thu, Jul 09, 2026 at 02:01:12PM +0200, Oliver Neukum wrote:
> Remove private copies as now a central state can be used.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 4/7] net: usb: int51x1: drop dependency on cdc_ether
2026-07-09 12:01 ` [PATCHv2 net-next 4/7] net: usb: int51x1: drop dependency on cdc_ether Oliver Neukum
@ 2026-07-09 13:50 ` Andrew Lunn
0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2026-07-09 13:50 UTC (permalink / raw)
To: Oliver Neukum
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
On Thu, Jul 09, 2026 at 02:01:13PM +0200, Oliver Neukum wrote:
> The driver depended on cdc_ether only for usbnet_cdc_update_filter().
> This has been shifted to usbnet. Drop the dependency.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 5/7] net: usb: move exported symbols from cdc_ether to usbnet
2026-07-09 12:01 ` [PATCHv2 net-next 5/7] net: usb: move exported symbols from cdc_ether to usbnet Oliver Neukum
@ 2026-07-09 13:51 ` Andrew Lunn
0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2026-07-09 13:51 UTC (permalink / raw)
To: Oliver Neukum
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
On Thu, Jul 09, 2026 at 02:01:14PM +0200, Oliver Neukum wrote:
> Move the rest of the symbols to usbnet, so that the cdc_ether
> driver does not need to be loaded as a library.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether
2026-07-09 12:01 ` [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether Oliver Neukum
@ 2026-07-09 13:52 ` Andrew Lunn
2026-07-09 18:08 ` Sergey Shtylyov
1 sibling, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2026-07-09 13:52 UTC (permalink / raw)
To: Oliver Neukum
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
On Thu, Jul 09, 2026 at 02:01:15PM +0200, Oliver Neukum wrote:
> Now that the driver no longer exports symbols to act
> as a library for other drivers other drivers don't
> depend on it. Remove the dependencies.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet
2026-07-09 12:37 ` [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Manuel Ebner
@ 2026-07-09 13:55 ` Andrew Lunn
0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2026-07-09 13:55 UTC (permalink / raw)
To: Manuel Ebner
Cc: Oliver Neukum, andrew+netdev, davem, edumazet, kuba, pabeni,
netdev, linux-usb, linux-kernel
On Thu, Jul 09, 2026 at 02:37:32PM +0200, Manuel Ebner wrote:
> On Thu, 2026-07-09 at 14:01 +0200, Oliver Neukum wrote:
>
> I guess a couple suggestions got lost, that's ok.
This patch is a pure move code around patch. It is bad practice to
make changes while moving code, since that needs a different sort of
review.
If the comments are to be improved, that should be in a separate
patch.
Andrew
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 7/7] net: usb: usbnet: remove outdated sanity check
2026-07-09 12:01 ` [PATCHv2 net-next 7/7] net: usb: usbnet: remove outdated sanity check Oliver Neukum
@ 2026-07-09 13:56 ` Andrew Lunn
0 siblings, 0 replies; 16+ messages in thread
From: Andrew Lunn @ 2026-07-09 13:56 UTC (permalink / raw)
To: Oliver Neukum
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, netdev, linux-usb,
linux-kernel, manuelebner
On Thu, Jul 09, 2026 at 02:01:16PM +0200, Oliver Neukum wrote:
> The cdc state is now included as a proper member in the descriptor.
> There is no point in checking whether it fits into the scratchpad
> area. Just remove the check.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Andrew
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether
2026-07-09 12:01 ` [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether Oliver Neukum
2026-07-09 13:52 ` Andrew Lunn
@ 2026-07-09 18:08 ` Sergey Shtylyov
1 sibling, 0 replies; 16+ messages in thread
From: Sergey Shtylyov @ 2026-07-09 18:08 UTC (permalink / raw)
To: Oliver Neukum, andrew+netdev, davem, edumazet, kuba, pabeni,
netdev, linux-usb, linux-kernel, manuelebner
On 7/9/26 3:01 PM, Oliver Neukum wrote:
> Now that the driver no longer exports symbols to act
> as a library for other drivers other drivers don't
> depend on it. Remove the dependencies.
>
> Signed-off-by: Oliver Neukum <oneukum@suse.com>
> ---
>
> v2:
> - added to allow removal of dependencies
>
> drivers/net/usb/Kconfig | 7 ++-----
> 1 file changed, 2 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
> index da0f6a138f4f..622ff080218e 100644
> --- a/drivers/net/usb/Kconfig
> +++ b/drivers/net/usb/Kconfig
[...]> @@ -634,7 +631,7 @@ config USB_NET_AQC111
>
> config USB_RTL8153_ECM
> tristate
> - depends on USB_NET_CDCETHER && (USB_RTL8152 || USB_RTL8152=n)
> + depends on (USB_RTL8152 || USB_RTL8152=n)
I think you could drop the parens, while at it...
[...]
MBR, Sergey
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-07-09 18:08 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-09 12:01 [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Oliver Neukum
2026-07-09 12:01 ` [PATCHv2 net-next 2/7] net: usb: usbnet: add cdc_state to struct usbnet Oliver Neukum
2026-07-09 13:49 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 3/7] net: usb: use cdc_state in " Oliver Neukum
2026-07-09 13:49 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 4/7] net: usb: int51x1: drop dependency on cdc_ether Oliver Neukum
2026-07-09 13:50 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 5/7] net: usb: move exported symbols from cdc_ether to usbnet Oliver Neukum
2026-07-09 13:51 ` Andrew Lunn
2026-07-09 12:01 ` [PATCHv2 net-next 6/7] net: usb: remove dependencies on cdc_ether Oliver Neukum
2026-07-09 13:52 ` Andrew Lunn
2026-07-09 18:08 ` Sergey Shtylyov
2026-07-09 12:01 ` [PATCHv2 net-next 7/7] net: usb: usbnet: remove outdated sanity check Oliver Neukum
2026-07-09 13:56 ` Andrew Lunn
2026-07-09 12:37 ` [PATCHv2 net-next 1/7] net: usb: centralize usbnet_cdc_zte_rx_fixup in usbnet Manuel Ebner
2026-07-09 13:55 ` Andrew Lunn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox