diff mbox

net: cdc_ncm: add Huawei devices

Message ID 1352812783-741-1-git-send-email-bjorn@mork.no
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Bjørn Mork Nov. 13, 2012, 1:19 p.m. UTC
A number of Huawei 3G and LTE modems implement a CDC NCM function,
including the necessary functional descriptors, but using a non
standard interface layout and class/subclass/protocol codes.

These devices can be handled by this driver with only a minor
change to the probing logic, allowing a single combined control
and data interface.  This works because the devices
- include a CDC Union descriptor labelling the combined
  interface as both master and slave, and
- have an alternate setting #1 for the bulk endpoints on the
  combined interface.

The 3G/LTE network connection is managed by vendor specific AT
commands on a serial function in the same composite device.
Handling the managment function is out of the scope of this
driver.  It will be handled by an appropriate USB serial
driver.

Reported-and-Tested-by: Olof Ermis <olof.ermis@gmail.com>
Reported-and-Tested-by: Tommy Cheng <tommy7765@yahoo.com>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
---
Hello David,

This patch had to touch more than just the device id table to
deal with the combined NCM interface on these devices.  The
changes will not affect any currently supported devices because
(ctx->data != ctx->control) always is true for those.

I am therefore requesting that this patch is put in the stable
queue like other device additons.

I guess it may be too late for v3.7, but FWIW I have verified
that the patch applies cleanly to both the current net-next/master
and to net/master, and will not cause merge conflicts either way.
I have also verified that it applies cleanly to the v3.6.6 stable
release.


Bjørn

 drivers/net/usb/cdc_ncm.c |   22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

Comments

David Miller Nov. 13, 2012, 7:34 p.m. UTC | #1
From: Bjørn Mork <bjorn@mork.no>
Date: Tue, 13 Nov 2012 14:19:43 +0100

> A number of Huawei 3G and LTE modems implement a CDC NCM function,
> including the necessary functional descriptors, but using a non
> standard interface layout and class/subclass/protocol codes.
> 
> These devices can be handled by this driver with only a minor
> change to the probing logic, allowing a single combined control
> and data interface.  This works because the devices
> - include a CDC Union descriptor labelling the combined
>   interface as both master and slave, and
> - have an alternate setting #1 for the bulk endpoints on the
>   combined interface.
> 
> The 3G/LTE network connection is managed by vendor specific AT
> commands on a serial function in the same composite device.
> Handling the managment function is out of the scope of this
> driver.  It will be handled by an appropriate USB serial
> driver.
> 
> Reported-and-Tested-by: Olof Ermis <olof.ermis@gmail.com>
> Reported-and-Tested-by: Tommy Cheng <tommy7765@yahoo.com>
> Signed-off-by: Bjørn Mork <bjorn@mork.no>

Applied to net, thanks.

> I am therefore requesting that this patch is put in the stable
> queue like other device additons.
> 
> I guess it may be too late for v3.7, but FWIW I have verified
> that the patch applies cleanly to both the current net-next/master
> and to net/master, and will not cause merge conflicts either way.
> I have also verified that it applies cleanly to the v3.6.6 stable
> release.

There were quite a few ID additions and I don't think most of them
were actually queued up for -stable submission.

Can you make a list of patches that still need to be submitted to
-stable, including this one?

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
diff mbox

Patch

diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index 4cd582a..74fab1a 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -540,10 +540,12 @@  advance:
 	    (ctx->ether_desc == NULL) || (ctx->control != intf))
 		goto error;
 
-	/* claim interfaces, if any */
-	temp = usb_driver_claim_interface(driver, ctx->data, dev);
-	if (temp)
-		goto error;
+	/* claim data interface, if different from control */
+	if (ctx->data != ctx->control) {
+		temp = usb_driver_claim_interface(driver, ctx->data, dev);
+		if (temp)
+			goto error;
+	}
 
 	iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber;
 
@@ -623,6 +625,10 @@  static void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf)
 
 	tasklet_kill(&ctx->bh);
 
+	/* handle devices with combined control and data interface */
+	if (ctx->control == ctx->data)
+		ctx->data = NULL;
+
 	/* disconnect master --> disconnect slave */
 	if (intf == ctx->control && ctx->data) {
 		usb_set_intfdata(ctx->data, NULL);
@@ -1245,6 +1251,14 @@  static const struct usb_device_id cdc_devs[] = {
 	  .driver_info = (unsigned long) &wwan_info,
 	},
 
+	/* Huawei NCM devices disguised as vendor specific */
+	{ USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x16),
+	  .driver_info = (unsigned long)&wwan_info,
+	},
+	{ USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x46),
+	  .driver_info = (unsigned long)&wwan_info,
+	},
+
 	/* Generic CDC-NCM devices */
 	{ USB_INTERFACE_INFO(USB_CLASS_COMM,
 		USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),