--- /usr/src/sys/dev/usb/net/if_cdce.c (revision 269431) +++ /usr/src/sys/dev/usb/net/if_cdce.c (working copy) @@ -277,6 +277,12 @@ {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLA300, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)}, {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC700, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)}, {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC750, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)}, + {USB_VENDOR(USB_VENDOR_HUAWEI), USB_IFACE_CLASS(UICLASS_VENDOR), + USB_IFACE_SUBCLASS(UISUBCLASS_ABSTRACT_CONTROL_MODEL), + USB_IFACE_PROTOCOL(0x16), USB_DRIVER_INFO(0)}, + {USB_VENDOR(USB_VENDOR_HUAWEI), USB_IFACE_CLASS(UICLASS_VENDOR), + USB_IFACE_SUBCLASS(UISUBCLASS_ABSTRACT_CONTROL_MODEL), + USB_IFACE_PROTOCOL(0x76), USB_DRIVER_INFO(0)}, }; static const STRUCT_USB_DUAL_ID cdce_dual_devs[] = { --- /usr/src/sys/dev/usb/serial/u3g.c (revision 269431) +++ /usr/src/sys/dev/usb/serial/u3g.c (working copy) @@ -76,14 +76,6 @@ #define U3G_CONFIG_INDEX 0 #define U3G_BSIZE 2048 -#define U3GSP_GPRS 0 -#define U3GSP_EDGE 1 -#define U3GSP_CDMA 2 -#define U3GSP_UMTS 3 -#define U3GSP_HSDPA 4 -#define U3GSP_HSUPA 5 -#define U3GSP_HSPA 6 -#define U3GSP_MAX 7 /* Eject methods; See also usb_quirks.h:UQ_MSC_EJECT_* */ #define U3GINIT_HUAWEI 1 /* Requires Huawei init command */ @@ -327,6 +319,8 @@ U3G_DEV(HUAWEI, K4505, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, K4505_INIT, U3GINIT_HUAWEISCSI), U3G_DEV(HUAWEI, ETS2055, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E3272_INIT, U3GINIT_HUAWEISCSI), + U3G_DEV(HUAWEI, E3272, 0), U3G_DEV(KYOCERA2, CDMA_MSM_K, 0), U3G_DEV(KYOCERA2, KPC680, 0), U3G_DEV(LONGCHEER, WM66, U3GINIT_HUAWEI), @@ -345,6 +339,7 @@ U3G_DEV(NOVATEL, MC547, 0), U3G_DEV(NOVATEL, MC679, 0), U3G_DEV(NOVATEL, MC950D, 0), + U3G_DEV(NOVATEL, MC990D, 0), U3G_DEV(NOVATEL, MIFI2200, U3GINIT_SCSIEJECT), U3G_DEV(NOVATEL, MIFI2200V, U3GINIT_SCSIEJECT), U3G_DEV(NOVATEL, U720, 0), @@ -607,6 +602,14 @@ return (0); } +/* Huawei specific: see if_cdce.c for more ids. */ +#define U3G_HUAWEI_IS_CDC(info, iface_descr) \ + ((info)->idVendor == USB_VENDOR_HUAWEI && \ + (iface_descr)->bInterfaceSubClass == UISUBCLASS_ABSTRACT_CONTROL_MODEL && \ + ((iface_descr)->bInterfaceProtocol == 0x16 || \ + (iface_descr)->bInterfaceProtocol == 0x76)) + + static void u3g_sael_m460_init(struct usb_device *udev) { @@ -814,6 +817,10 @@ if (uaa->info.bInterfaceClass != UICLASS_VENDOR) { return (ENXIO); } + /* Huawei specific: skeep cdce devices. */ + if (U3G_HUAWEI_IS_CDC(&uaa->info, &uaa->info)) { + return (ENXIO); + } return (usbd_lookup_id_by_uaa(u3g_devs, sizeof(u3g_devs), uaa)); } @@ -857,6 +864,9 @@ id = usbd_get_interface_descriptor(iface); if (id == NULL || id->bInterfaceClass != UICLASS_VENDOR) continue; + /* Huawei specific: skeep cdce devices. */ + if (U3G_HUAWEI_IS_CDC(&uaa->info, id)) + continue; usbd_set_parent_iface(uaa->device, i, uaa->info.bIfaceIndex); iface_valid |= (1<data_timeout = (data_timeout + USB_MS_HZ); sc->actlen = 0; sc->cmd_len = cmd_len; + sc->error = 0; memset(&sc->cbw->CBWCDB, 0, sizeof(sc->cbw->CBWCDB)); memcpy(&sc->cbw->CBWCDB, cmd_ptr, cmd_len); DPRINTFN(1, "SCSI cmd = %*D\n", (int)cmd_len, (char *)sc->cbw->CBWCDB, ":"); @@ -843,11 +844,14 @@ break; default: DPRINTF("Unknown eject method (%d)\n", method); - err = 0; + err = USB_ERR_INVAL; break; } + /* Supress error. */ + if (err == USB_ERR_STALLED) + err = 0; DPRINTF("Eject CD command status: %s\n", usbd_errstr(err)); bbb_detach(sc); - return (0); + return (err); } --- /usr/src/sys/dev/usb/usbdevs (revision 269431) +++ /usr/src/sys/dev/usb/usbdevs (working copy) @@ -2341,9 +2341,11 @@ product HUAWEI E3131 0x1506 3G modem product HUAWEI K3765_INIT 0x1520 K3765 Initial product HUAWEI K4505_INIT 0x1521 K4505 Initial +product HUAWEI E3272_INIT 0x155b LTE modem initial product HUAWEI ETS2055 0x1803 CDMA modem product HUAWEI E173 0x1c05 3G modem product HUAWEI E173_INIT 0x1c0b 3G modem initial +product HUAWEI E3272 0x1c1e LTE modem /* HUAWEI 3com products */ product HUAWEI3COM WUB320G 0x0009 Aolynk WUB320g @@ -3237,6 +3239,7 @@ product NOVATEL U727_2 0x5100 Merlin U727 CDMA product NOVATEL U760 0x6000 Novatel U760 product NOVATEL MC760 0x6002 Novatel MC760 +product NOVATEL MC990D 0x7001 Novatel MC990D product NOVATEL MC547 0x7042 Novatel MC547 product NOVATEL MC679 0x7031 Novatel MC679 product NOVATEL2 FLEXPACKGPS 0x0100 NovAtel FlexPack GPS receiver