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
This commit is contained in:
n_hibma 2014-08-05 12:08:50 +00:00
parent 4ae596a432
commit 3c2dc8ad2a
2 changed files with 63 additions and 1 deletions

View File

@ -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 cdce_ue_methods = {
.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_host_devs[] = {
{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)
{

View File

@ -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