Bjørn Mork <[email protected]> writes:

> I guess we can add a workaround for this to cdc_ether.c, just like we
> recently did for cdc_ncm.c for other types of Huawei devices with the
> same problem.

Could you try the patch below and see if that makes the driver work with
this modem?  It's build tested only.


>From 330a716f964eab191b248a8ff7385c6be4261fca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]>
Date: Fri, 28 Jun 2013 10:49:25 +0200
Subject: [RFT] net: cdc_ether: allow combined control and data interface
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Bjørn Mork <[email protected]>
---
 drivers/net/usb/cdc_ether.c |   24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index 078795f..8da35f8 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;
 
@@ -353,7 +361,8 @@ void usbnet_cdc_unbind(struct usbnet *dev, struct 
usb_interface *intf)
        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);
+               if (info->data != info->control)
+                       usb_driver_release_interface(driver, info->data);
                info->data = NULL;
        }
 
@@ -361,7 +370,8 @@ void usbnet_cdc_unbind(struct usbnet *dev, struct 
usb_interface *intf)
        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);
+               if (info->data != info->control)
+                       usb_driver_release_interface(driver, info->control);
                info->control = NULL;
        }
 }
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to