diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 85fba64c3fcf..b1d438a48450 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -554,6 +554,16 @@ static const struct driver_info wwan_info = { .manage_power = usbnet_manage_power, }; +static const struct driver_info lte_info = { + .description = "CDC Ethernet Device(lte)", + .flags = FLAG_ETHER | FLAG_POINTTOPOINT | FLAG_LTE, + .bind = usbnet_cdc_bind, + .unbind = usbnet_cdc_unbind, + .status = usbnet_cdc_status, + .set_rx_mode = usbnet_cdc_update_filter, + .manage_power = usbnet_manage_power, +}; + /*-------------------------------------------------------------------------*/ #define HUAWEI_VENDOR_ID 0x12D1 @@ -914,6 +924,12 @@ static const struct usb_device_id products[] = { USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), .driver_info = (unsigned long)&wwan_info, +}, { + /* RM310 modules*/ + USB_DEVICE_AND_INTERFACE_INFO(0x1286, 0x4E3C, USB_CLASS_COMM, + USB_CDC_SUBCLASS_ETHERNET, + USB_CDC_PROTO_NONE), + .driver_info = (unsigned long)<e_info, }, { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 84b354f76dea..938f83595f42 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -1756,6 +1756,10 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) if ((dev->driver_info->flags & FLAG_WWAN) != 0) strcpy(net->name, "wwan%d"); + /* LTE devices should always be named "lte%d" */ + if ((dev->driver_info->flags & FLAG_LTE) != 0) + strcpy(net->name, "lte%d"); + /* devices that cannot do ARP */ if ((dev->driver_info->flags & FLAG_NOARP) != 0) net->flags |= IFF_NOARP; diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 3cc659a62782..c738db5364c3 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -568,6 +568,7 @@ static void option_instat_callback(struct urb *urb); static const struct usb_device_id option_ids[] = { + { USB_DEVICE(0x1286, 0x4e3c) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) }, diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index 912472f26e4f..168780cebd14 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c @@ -491,6 +491,7 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, { struct usb_serial *serial = port->serial; struct urb *urb; + struct usb_device_descriptor *desc = &serial->dev->descriptor; urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ if (!urb) @@ -500,6 +501,11 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, usb_sndbulkpipe(serial->dev, endpoint) | dir, buf, len, callback, ctx); + if (dir == USB_DIR_OUT) { + if ((desc->idVendor == cpu_to_le16(0x1286) && + desc->idProduct == cpu_to_le16(0x4e3c))) + urb->transfer_flags |= URB_ZERO_PACKET; + } return urb; } diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index e2ec3582e549..232a990ca0ca 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h @@ -122,6 +122,8 @@ struct driver_info { #define FLAG_RX_ASSEMBLE 0x4000 /* rx packets may span >1 frames */ #define FLAG_NOARP 0x8000 /* device can't do ARP */ +#define FLAG_LTE 0x10000 /* use "lte%d" names */ + /* init device ... can sleep, or cause probe() failure */ int (*bind)(struct usbnet *, struct usb_interface *);