Module Name:    src
Committed By:   soren
Date:           Sat Aug  3 16:04:30 UTC 2013

Modified Files:
        src/sys/dev/usb: u3g.c ugensa.c usbdevs

Log Message:
Add support for some new and old ZTE modems, some of which have a
SFF-8070i virtual installer CD instead of a SCSI class one.

Recent Huawei modems support (and in the case of the very latest models,
require) the use of a CDC NCM interface as an alternative to PPP. Avoid
attaching u3g to that interface.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/u3g.c
cvs rdiff -u -r1.30 -r1.31 src/sys/dev/usb/ugensa.c
cvs rdiff -u -r1.650 -r1.651 src/sys/dev/usb/usbdevs

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/u3g.c
diff -u src/sys/dev/usb/u3g.c:1.28 src/sys/dev/usb/u3g.c:1.29
--- src/sys/dev/usb/u3g.c:1.28	Thu Mar 14 13:08:56 2013
+++ src/sys/dev/usb/u3g.c	Sat Aug  3 16:04:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: u3g.c,v 1.28 2013/03/14 13:08:56 nonaka Exp $	*/
+/*	$NetBSD: u3g.c,v 1.29 2013/08/03 16:04:30 soren Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: u3g.c,v 1.28 2013/03/14 13:08:56 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: u3g.c,v 1.29 2013/08/03 16:04:30 soren Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -219,8 +219,6 @@ static const struct usb_devno u3g_devs[]
 	{ USB_VENDOR_OPTIONNV, USB_PRODUCT_OPTIONNV_HSDPA },
 	{ USB_VENDOR_OPTIONNV, USB_PRODUCT_OPTIONNV_GTMAXHSUPA },
 	/* OEM: Qualcomm, Inc. */
-	{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_CDMA_MSM },
-	{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_ZTE_MF626 },
 	{ USB_VENDOR_QUALCOMM, USB_PRODUCT_QUALCOMM_NTT_DOCOMO_L02C_MODEM },
 
 	/* OEM: Sierra Wireless: */
@@ -254,6 +252,12 @@ static const struct usb_devno u3g_devs[]
 	/* Toshiba */
 	{ USB_VENDOR_TOSHIBA, USB_PRODUCT_TOSHIBA_HSDPA_MODEM_EU870DT1 },
 
+	/* ZTE */
+	{ USB_VENDOR_ZTE, USB_PRODUCT_ZTE_MF622 },
+	{ USB_VENDOR_ZTE, USB_PRODUCT_ZTE_MF626 },
+	{ USB_VENDOR_ZTE, USB_PRODUCT_ZTE_MF628 },
+	{ USB_VENDOR_ZTE, USB_PRODUCT_ZTE_MF820D },
+
 	/* 4G Systems */
 	{ USB_VENDOR_4GSYSTEMS, USB_PRODUCT_4GSYSTEMS_XSSTICK_P14 },
 };
@@ -271,7 +275,7 @@ send_bulkmsg(usbd_device_handle dev, voi
 	/* Move the device into the configured state. */
 	err = usbd_set_config_index(dev, 0, 0);
 	if (err) {
-		aprint_error("u3g: failed to set configuration index\n");
+		aprint_error("u3ginit: failed to set config index\n");
 		return UMATCH_NONE;
 	}
 
@@ -330,7 +334,7 @@ send_bulkmsg(usbd_device_handle dev, voi
 }
 
 static int
-u3g_novatel_reinit(usbd_device_handle dev)
+u3g_bulk_scsi_eject(usbd_device_handle dev)
 {
 	unsigned char cmd[31];
 
@@ -347,7 +351,9 @@ u3g_novatel_reinit(usbd_device_handle de
 	/* 13: CBW Lun: 0 */
 	/* 14: CBW Length */
 	cmd[14] = 0x06;
+
 	/* Rest is the SCSI payload */
+
 	/* 0: SCSI START/STOP opcode */
 	cmd[15] = 0x1b;
 	/* 1..3 unused */
@@ -359,6 +365,37 @@ u3g_novatel_reinit(usbd_device_handle de
 }
 
 static int
+u3g_bulk_ata_eject(usbd_device_handle dev)
+{
+	unsigned char cmd[31];
+
+	memset(cmd, 0, sizeof(cmd));
+	/* Byte 0..3: Command Block Wrapper (CBW) signature */
+	cmd[0] = 0x55; 
+	cmd[1] = 0x53;
+	cmd[2] = 0x42;
+	cmd[3] = 0x43;
+	/* 4..7: CBW Tag, has to unique, but only a single transfer used. */
+	cmd[4] = 0x01;
+	/* 8..11: CBW Transfer Length, no data here */
+	/* 12: CBW Flag: output, so 0 */
+	/* 13: CBW Lun: 0 */
+	/* 14: CBW Length */
+	cmd[14] = 0x06;
+
+	/* Rest is the SCSI payload */
+
+	/* 0: ATA pass-through */
+	cmd[15] = 0x85;
+	/* 1..3 unused */
+	/* 4 XXX What is this command? */
+	cmd[19] = 0x24;
+	/* 5: unused */
+
+	return send_bulkmsg(dev, cmd, sizeof(cmd));
+}
+
+static int
 u3g_huawei_reinit(usbd_device_handle dev)
 {
 	/*
@@ -517,7 +554,7 @@ u3ginit_match(device_t parent, cfdata_t 
 		switch (uaa->product){
 		case USB_PRODUCT_NOVATEL2_MC950D_DRIVER:
 		case USB_PRODUCT_NOVATEL2_U760_DRIVER:
-			return u3g_novatel_reinit(uaa->device);
+			return u3g_bulk_scsi_eject(uaa->device);
 			break;
 		default:
 			break;
@@ -529,14 +566,21 @@ u3ginit_match(device_t parent, cfdata_t 
 			return u3g_sierra_reinit(uaa->device);
 		break;
 
-	case USB_VENDOR_QUALCOMMINC:
-		if (uaa->product == USB_PRODUCT_QUALCOMMINC_ZTE_STOR)
-			return u3g_novatel_reinit(uaa->device);
-		break;
-
 	case USB_VENDOR_QUALCOMM:
 		if (uaa->product == USB_PRODUCT_QUALCOMM_NTT_DOCOMO_L02C_STORAGE)
-			return u3g_novatel_reinit(uaa->device);
+			return u3g_bulk_scsi_eject(uaa->device);
+		break;
+
+	case USB_VENDOR_ZTE:
+		switch (uaa->product){
+		case USB_PRODUCT_ZTE_INSTALLER:
+		case USB_PRODUCT_ZTE_MF820D_INSTALLER:
+			(void)u3g_bulk_ata_eject(uaa->device);
+			(void)u3g_bulk_scsi_eject(uaa->device);
+			return UMATCH_HIGHEST;
+		default:
+			break;
+		}
 		break;
 
 	case USB_VENDOR_4GSYSTEMS:
@@ -614,6 +658,14 @@ u3g_match(device_t parent, cfdata_t matc
 	}
 
 	/*
+	 * Huawei modems use the vendor-specific class for all interfaces,
+	 * both tty and CDC NCM, which we should avoid attaching to.
+	 */
+	if (uaa->vendor == USB_VENDOR_HUAWEI && id->bInterfaceSubClass == 2 &&
+	    (id->bInterfaceProtocol & 0xf) == 6)	/* 0x16, 0x46, 0x76 */
+		return (UMATCH_NONE);
+
+	/*
 	 * 3G modems generally report vendor-specific class
 	 *
 	 * XXX: this may be too generalised.

Index: src/sys/dev/usb/ugensa.c
diff -u src/sys/dev/usb/ugensa.c:1.30 src/sys/dev/usb/ugensa.c:1.31
--- src/sys/dev/usb/ugensa.c:1.30	Fri Dec 23 00:51:46 2011
+++ src/sys/dev/usb/ugensa.c	Sat Aug  3 16:04:30 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ugensa.c,v 1.30 2011/12/23 00:51:46 jakllsch Exp $	*/
+/*	$NetBSD: ugensa.c,v 1.31 2013/08/03 16:04:30 soren Exp $	*/
 
 /*
  * Copyright (c) 2004, 2005 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ugensa.c,v 1.30 2011/12/23 00:51:46 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ugensa.c,v 1.31 2013/08/03 16:04:30 soren Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -96,8 +96,8 @@ static const struct ugensa_type ugensa_d
 	{{ USB_VENDOR_DELL, USB_PRODUCT_DELL_HSDPA }, 0 },
 	{{ USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_FLEXPACKGPS }, 0 },
 	{{ USB_VENDOR_QUALCOMM_K, USB_PRODUCT_QUALCOMM_K_CDMA_MSM_K }, 0 },
-	{{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_AC8700 }, 0 },
 	{{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_USB305 }, 0 },
+	{{ USB_VENDOR_ZTE, USB_PRODUCT_ZTE_AC8700 }, 0 },
 
 	/*
 	 * The following devices are untested, but they are purported to

Index: src/sys/dev/usb/usbdevs
diff -u src/sys/dev/usb/usbdevs:1.650 src/sys/dev/usb/usbdevs:1.651
--- src/sys/dev/usb/usbdevs:1.650	Mon May 27 16:32:58 2013
+++ src/sys/dev/usb/usbdevs	Sat Aug  3 16:04:30 2013
@@ -1,4 +1,4 @@
-$NetBSD: usbdevs,v 1.650 2013/05/27 16:32:58 kiyohara Exp $
+$NetBSD: usbdevs,v 1.651 2013/08/03 16:04:30 soren Exp $
 
 /*
  * Copyright (c) 1998-2004 The NetBSD Foundation, Inc.
@@ -529,7 +529,7 @@ vendor AMIT		0x18c5	AMIT
 vendor QCOM		0x18e8	Qcom
 vendor LINKSYS3		0x1915	Linksys
 vendor MEINBERG		0x1938	Meinberg Funkuhren
-vendor QUALCOMMINC	0x19d2	Qualcomm, Incorporated
+vendor ZTE		0x19d2	ZTE
 vendor QUANTA		0x1a32	Quanta
 vendor TERMINUS		0x1a40	Terminus Technology
 vendor WINCHIPHEAD2	0x1a86	QinHeng Electronics
@@ -2578,10 +2578,6 @@ product QUALCOMM NTT_DOCOMO_L02C_STORAGE
 product QUALCOMM MSM_HSDPA	0x6613	HSDPA MSM
 product QUALCOMM2 RWT_FCT       0x3100  RWT FCT-CDMA 2000 1xRTT modem
 product QUALCOMM2 CDMA_MSM	0x3196	CDMA Technologies MSM modem
-product QUALCOMMINC CDMA_MSM	0x0001	CDMA Technologies MSM modem
-product QUALCOMMINC ZTE_MF626	0x0031	CDMA Technologies MSM modem
-product QUALCOMMINC ZTE_STOR	0x2000  USB ZTE Storage
-product QUALCOMMINC AC8700	0xfffe	CDMA 1xEVDO USB modem
 
 /* Qualcomm Kyocera products */
 product QUALCOMM_K CDMA_MSM_K	0x17da	Qualcomm Kyocera CDMA Technologies MSM
@@ -2685,6 +2681,8 @@ product ROLAND UA3FX		0x0051	EDIROL UA-3
 product ROLAND FANTOMX		0x006d	Fantom-X MIDI Synth.
 product ROLAND UA25 		0x0074	EDIROL UA-25
 product ROLAND UA101		0x007d	EDIROL UA-101
+product ROLAND PC50A		0x008b	EDIROL PC-50 (advanced)
+product ROLAND PC50		0x008c	EDIROL PC-50
 product ROLAND UA101F		0x008d	EDIROL UA-101 USB1
 product ROLAND UA1EX		0x0096	EDIROL UA-1EX
 product ROLAND UM3		0x009A	EDIROL UM-3
@@ -3300,6 +3298,16 @@ product ZINWELL RT3070		0x5257	RT3070
 product ZOOM 2986L		0x9700	2986L Fax modem
 product ZOOM 3095		0x3095	3095 USB Fax modem
 
+/* ZTE products */
+product ZTE MF622		0x0001	MF622 modem
+product ZTE MF628		0x0015	MF628 modem
+product ZTE MF626		0x0031	MF626 modem
+product ZTE MF820D_INSTALLER	0x0166	MF820D CD
+product ZTE MF820D		0x0167	MF820D modem
+product ZTE INSTALLER		0x2000  UMTS CD
+product ZTE MC2718		0xffe8	MC2718 modem
+product ZTE AC8700		0xfffe	CDMA 1xEVDO USB modem
+
 /* Zydas Technology Corporation products */
 product ZYDAS ZD1201		0x1201	ZD1201
 product ZYDAS ZD1211		0x1211	ZD1211 WLAN abg

Reply via email to