Author: n_hibma
Date: Tue Aug  5 12:08:50 2014
New Revision: 269584
URL: http://svnweb.freebsd.org/changeset/base/269584

Log:
  Add support for Huawei E3272 modems which are supported by the CDC
  ethernet class.
  
  Note: This is untested as I do not have a device like this. That is
  reflected in the MFC timeout.
  
  PR:           192345
  Submitted by: rozhuk.im gmail.com
  MFC after:    4 weeks

Modified:
  head/sys/dev/usb/net/if_cdce.c
  head/sys/dev/usb/usbdevs

Modified: head/sys/dev/usb/net/if_cdce.c
==============================================================================
--- head/sys/dev/usb/net/if_cdce.c      Tue Aug  5 12:04:40 2014        
(r269583)
+++ head/sys/dev/usb/net/if_cdce.c      Tue Aug  5 12:08:50 2014        
(r269584)
@@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$");
 #define        USB_DEBUG_VAR cdce_debug
 #include <dev/usb/usb_debug.h>
 #include <dev/usb/usb_process.h>
+#include <dev/usb/usb_msctest.h>
 #include "usb_if.h"
 
 #include <dev/usb/net/usb_ethernet.h>
@@ -251,8 +252,11 @@ static driver_t cdce_driver = {
 };
 
 static devclass_t cdce_devclass;
+static eventhandler_tag cdce_etag;
 
-DRIVER_MODULE(cdce, uhub, cdce_driver, cdce_devclass, NULL, 0);
+static int  cdce_driver_loaded(struct module *, int, void *);
+
+DRIVER_MODULE(cdce, uhub, cdce_driver, cdce_devclass, cdce_driver_loaded, 0);
 MODULE_VERSION(cdce, 1);
 MODULE_DEPEND(cdce, uether, 1, 1, 1);
 MODULE_DEPEND(cdce, usb, 1, 1, 1);
@@ -267,6 +271,10 @@ static const struct usb_ether_methods cd
        .ue_setpromisc = cdce_setpromisc,
 };
 
+static const STRUCT_USB_HOST_ID cdce_switch_devs[] = {
+       {USB_VPI(USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E3272_INIT, 
MSC_EJECT_HUAWEI2)},
+};
+
 static const STRUCT_USB_HOST_ID cdce_host_devs[] = {
        {USB_VPI(USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632, 
CDCE_FLAG_NO_UNION)},
        {USB_VPI(USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250, 
CDCE_FLAG_NO_UNION)},
@@ -281,6 +289,16 @@ static const STRUCT_USB_HOST_ID cdce_hos
        {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(0x02), USB_IFACE_PROTOCOL(0x16),
+               USB_DRIVER_INFO(0)},
+       {USB_VENDOR(USB_VENDOR_HUAWEI), USB_IFACE_CLASS(UICLASS_VENDOR),
+               USB_IFACE_SUBCLASS(0x02), USB_IFACE_PROTOCOL(0x46),
+               USB_DRIVER_INFO(0)},
+       {USB_VENDOR(USB_VENDOR_HUAWEI), USB_IFACE_CLASS(UICLASS_VENDOR),
+               USB_IFACE_SUBCLASS(0x02), USB_IFACE_PROTOCOL(0x76),
+               USB_DRIVER_INFO(0)},
 };
 
 static const STRUCT_USB_DUAL_ID cdce_dual_devs[] = {
@@ -474,6 +492,48 @@ cdce_ncm_init(struct cdce_softc *sc)
 }
 #endif
 
+static void
+cdce_test_autoinst(void *arg, struct usb_device *udev,
+    struct usb_attach_arg *uaa)
+{
+       struct usb_interface *iface;
+       struct usb_interface_descriptor *id;
+
+       if (uaa->dev_state != UAA_DEV_READY)
+               return;
+
+       iface = usbd_get_iface(udev, 0);
+       if (iface == NULL)
+               return;
+       id = iface->idesc;
+       if (id == NULL || id->bInterfaceClass != UICLASS_MASS)
+               return;
+       if (usbd_lookup_id_by_uaa(cdce_switch_devs, sizeof(cdce_switch_devs), 
uaa))
+               return;         /* no device match */
+
+       if (usb_msc_eject(udev, 0, USB_GET_DRIVER_INFO(uaa)) == 0) {
+               /* success, mark the udev as disappearing */
+               uaa->dev_state = UAA_DEV_EJECTING;
+       }
+}
+
+static int
+cdce_driver_loaded(struct module *mod, int what, void *arg)
+{
+       switch (what) {
+       case MOD_LOAD:
+               /* register our autoinstall handler */
+               cdce_etag = EVENTHANDLER_REGISTER(usb_dev_configured,
+                   cdce_test_autoinst, NULL, EVENTHANDLER_PRI_ANY);
+               return (0);
+       case MOD_UNLOAD:
+               EVENTHANDLER_DEREGISTER(usb_dev_configured, cdce_etag);
+               return (0);
+       default:
+               return (EOPNOTSUPP);
+       }
+}
+
 static int
 cdce_probe(device_t dev)
 {

Modified: head/sys/dev/usb/usbdevs
==============================================================================
--- head/sys/dev/usb/usbdevs    Tue Aug  5 12:04:40 2014        (r269583)
+++ head/sys/dev/usb/usbdevs    Tue Aug  5 12:08:50 2014        (r269584)
@@ -2342,9 +2342,11 @@ product HUAWEI E392              0x1505  LTE modem
 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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to