Patchwork [v2] net: cdc_ether: allow combined control and data interface

login
register
mail settings
Submitter Bjørn Mork
Date June 29, 2013, 10:03 a.m.
Message ID <1372500186-23567-1-git-send-email-bjorn@mork.no>
Download mbox | patch
Permalink /patch/255728/
State Accepted
Delegated to: David Miller
Headers show

Comments

Bjørn Mork - June 29, 2013, 10:03 a.m.
Some Icera based Huawei modems handled by this driver are not
completely CDC ECM compliant, using the same USB interface for both
control and data. The CDC functional descriptors include a Union
naming this interface as both master and slave, so it is supportable
by relaxing the descriptor parsing in case these interfaces are
identical.

This has been tested on a Huawei K3806 and verified to add support
for that device.

Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
---
v2: Simplified unbind logic.  Thanks to Oliver Neukum


 drivers/net/usb/cdc_ether.c |   22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)
David Miller - July 2, 2013, 6:38 a.m.
From: Bjørn Mork <bjorn@mork.no>
Date: Sat, 29 Jun 2013 12:03:06 +0200

> Some Icera based Huawei modems handled by this driver are not
> completely CDC ECM compliant, using the same USB interface for both
> control and data. The CDC functional descriptors include a Union
> naming this interface as both master and slave, so it is supportable
> by relaxing the descriptor parsing in case these interfaces are
> identical.
> 
> This has been tested on a Huawei K3806 and verified to add support
> for that device.
> 
> Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com>
> Signed-off-by: Bjørn Mork <bjorn@mork.no>
> ---
> v2: Simplified unbind logic.  Thanks to Oliver Neukum

Oliver if you could give this a quick review, that would be
great.

Thanks.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Oliver Neukum - July 2, 2013, 8:17 a.m.
On Saturday 29 June 2013 12:03:06 Bjørn Mork wrote:
> Some Icera based Huawei modems handled by this driver are not
> completely CDC ECM compliant, using the same USB interface for both
> control and data. The CDC functional descriptors include a Union
> naming this interface as both master and slave, so it is supportable
> by relaxing the descriptor parsing in case these interfaces are
> identical.
> 
> This has been tested on a Huawei K3806 and verified to add support
> for that device.
> 
> Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com>
> Signed-off-by: Bjørn Mork <bjorn@mork.no>
Acked-by: Oliver Neukum <oliver@neukum.org>

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - July 2, 2013, 8:48 a.m.
From: Oliver Neukum <oliver@neukum.org>
Date: Tue, 02 Jul 2013 10:17:51 +0200

> On Saturday 29 June 2013 12:03:06 Bjørn Mork wrote:
>> Some Icera based Huawei modems handled by this driver are not
>> completely CDC ECM compliant, using the same USB interface for both
>> control and data. The CDC functional descriptors include a Union
>> naming this interface as both master and slave, so it is supportable
>> by relaxing the descriptor parsing in case these interfaces are
>> identical.
>> 
>> This has been tested on a Huawei K3806 and verified to add support
>> for that device.
>> 
>> Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com>
>> Signed-off-by: Bjørn Mork <bjorn@mork.no>
> Acked-by: Oliver Neukum <oliver@neukum.org>

Applied, thanks for the review Oliver.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Oliver Neukum - July 2, 2013, 9:06 a.m.
On Monday 01 July 2013 23:38:17 David Miller wrote:
> From: Bjørn Mork <bjorn@mork.no>
> Date: Sat, 29 Jun 2013 12:03:06 +0200
> 
> > Some Icera based Huawei modems handled by this driver are not
> > completely CDC ECM compliant, using the same USB interface for both
> > control and data. The CDC functional descriptors include a Union
> > naming this interface as both master and slave, so it is supportable
> > by relaxing the descriptor parsing in case these interfaces are
> > identical.
> > 
> > This has been tested on a Huawei K3806 and verified to add support
> > for that device.
> > 
> > Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com>
> > Signed-off-by: Bjørn Mork <bjorn@mork.no>
> > ---
> > v2: Simplified unbind logic.  Thanks to Oliver Neukum
> 
> Oliver if you could give this a quick review, that would be
> great.

Done.

	Sorry for the delay
		Oliver

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index 04ee044..4393f14 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -215,6 +215,10 @@  int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
 					goto bad_desc;
 			}
 
+			/* some devices merge these - skip class check */
+			if (info->control == info->data)
+				goto next_desc;
+
 			/* a data interface altsetting does the real i/o */
 			d = &info->data->cur_altsetting->desc;
 			if (d->bInterfaceClass != USB_CLASS_CDC_DATA) {
@@ -304,19 +308,23 @@  next_desc:
 	/* claim data interface and set it up ... with side effects.
 	 * network traffic can't flow until an altsetting is enabled.
 	 */
-	status = usb_driver_claim_interface(driver, info->data, dev);
-	if (status < 0)
-		return status;
+	if (info->data != info->control) {
+		status = usb_driver_claim_interface(driver, info->data, dev);
+		if (status < 0)
+			return status;
+	}
 	status = usbnet_get_endpoints(dev, info->data);
 	if (status < 0) {
 		/* ensure immediate exit from usbnet_disconnect */
 		usb_set_intfdata(info->data, NULL);
-		usb_driver_release_interface(driver, info->data);
+		if (info->data != info->control)
+			usb_driver_release_interface(driver, info->data);
 		return status;
 	}
 
 	/* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */
-	dev->status = NULL;
+	if (info->data != info->control)
+		dev->status = NULL;
 	if (info->control->cur_altsetting->desc.bNumEndpoints == 1) {
 		struct usb_endpoint_descriptor	*desc;
 
@@ -349,6 +357,10 @@  void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
 	struct cdc_state		*info = (void *) &dev->data;
 	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 */