--- /usr/src/sys/dev/usb/net/if_cdce.c (revision 326218) +++ /usr/src/sys/dev/usb/net/if_cdce.c (working copy) @@ -284,6 +284,9 @@ {USB_VENDOR(USB_VENDOR_HUAWEI), USB_IFACE_CLASS(UICLASS_VENDOR), USB_IFACE_SUBCLASS(0x02), USB_IFACE_PROTOCOL(0x76), USB_DRIVER_INFO(0)}, + {USB_VENDOR(USB_VENDOR_HUAWEI), USB_IFACE_CLASS(UICLASS_VENDOR), + USB_IFACE_SUBCLASS(0x03), USB_IFACE_PROTOCOL(0x16), + USB_DRIVER_INFO(0)}, }; static const STRUCT_USB_DUAL_ID cdce_dual_devs[] = { --- /usr/src/sys/dev/usb/serial/u3g.c (revision 326218) +++ /usr/src/sys/dev/usb/serial/u3g.c (working copy) @@ -306,7 +306,7 @@ U3G_DEV(HUAWEI, E173, 0), U3G_DEV(HUAWEI, E173_INIT, U3GINIT_HUAWEISCSI), U3G_DEV(HUAWEI, E3131, 0), - U3G_DEV(HUAWEI, E3131_INIT, U3GINIT_HUAWEISCSI), + U3G_DEV(HUAWEI, E3131_INIT, U3GINIT_HUAWEISCSI2), U3G_DEV(HUAWEI, E180V, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, E220, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, E220BIS, U3GINIT_HUAWEI), @@ -324,6 +324,8 @@ U3G_DEV(HUAWEI, K3770_INIT, U3GINIT_HUAWEISCSI), U3G_DEV(HUAWEI, K4505, U3GINIT_HUAWEI), U3G_DEV(HUAWEI, K4505_INIT, U3GINIT_HUAWEISCSI), + U3G_DEV(HUAWEI, E3272_INIT, U3GINIT_HUAWEISCSI), + U3G_DEV(HUAWEI, E3272, 0), U3G_DEV(HUAWEI, ETS2055, U3GINIT_HUAWEI), U3G_DEV(KYOCERA2, CDMA_MSM_K, 0), U3G_DEV(KYOCERA2, KPC680, 0), @@ -590,6 +592,17 @@ MODULE_VERSION(u3g, 1); USB_PNP_HOST_INFO(u3g_devs); +/* Huawei specific: see if_cdce.c for more ids. */ +#define U3G_HUAWEI_IS_CDC(info, iface_descr) \ + ((info)->idVendor == USB_VENDOR_HUAWEI && \ + (iface_descr)->bInterfaceClass == UICLASS_VENDOR && \ + (((iface_descr)->bInterfaceSubClass == 0x02 && \ + ((iface_descr)->bInterfaceProtocol == 0x16 || \ + (iface_descr)->bInterfaceProtocol == 0x46 || \ + (iface_descr)->bInterfaceProtocol == 0x76)) || \ + ((iface_descr)->bInterfaceSubClass == 0x03 && \ + (iface_descr)->bInterfaceProtocol == 0x16))) + static int u3g_sierra_init(struct usb_device *udev) { @@ -839,6 +852,10 @@ if (uaa->info.bInterfaceClass != UICLASS_VENDOR) { return (ENXIO); } + /* Huawei specific: skip 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)); } @@ -882,6 +899,9 @@ id = usbd_get_interface_descriptor(iface); if (id == NULL || id->bInterfaceClass != UICLASS_VENDOR) continue; + /* Huawei specific: skip cdce devices. */ + if (U3G_HUAWEI_IS_CDC(&uaa->info, id)) + continue; usbd_set_parent_iface(uaa->device, i, uaa->info.bIfaceIndex); iface_valid |= (1<