diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 9ba558406..dbd6cbf31 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -277,9 +277,12 @@ static void option_instat_callback(struct urb *urb); #define QUECTEL_PRODUCT_RM500Q 0x0800 #define QUECTEL_PRODUCT_RM520N 0x0801 #define QUECTEL_PRODUCT_EC200U 0x0901 +#define QUECTEL_PRODUCT_EC200U_CN 0x0901 #define QUECTEL_PRODUCT_EG912Y 0x6001 #define QUECTEL_PRODUCT_EC200S_CN 0x6002 #define QUECTEL_PRODUCT_EC200A 0x6005 +#define QUECTEL_PRODUCT_EC200A_CN 0x6005 +#define QUECTEL_PRODUCT_EC200N_CN 0x6005 #define QUECTEL_PRODUCT_EG916Q 0x6007 #define QUECTEL_PRODUCT_EM061K_LWW 0x6008 #define QUECTEL_PRODUCT_EM061K_LCN 0x6009 @@ -1277,6 +1280,10 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0xff, 0x30) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0, 0) }, + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U_CN) }, + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200A_CN) }, + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200N_CN) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), @@ -2418,6 +2425,7 @@ static struct usb_serial_driver option_1port_device = { .suspend = usb_wwan_suspend, .resume = usb_wwan_resume, #endif + .reset_resume = usb_wwan_resume, }; static struct usb_serial_driver * const serial_drivers[] = { @@ -2460,6 +2468,37 @@ static int option_probe(struct usb_serial *serial, if (device_flags & NUMEP2 && iface_desc->bNumEndpoints != 2) return -ENODEV; +#if 1 //Added by Quectel + //Quectel UC20's interface 4 can be used as USB Network device + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) + && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003) + && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) + return -ENODEV; + + //Quectel EC20(MDM9215)'s interface 4 can be used as USB Network device + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) + && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215) + && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) + return -ENODEV; + + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) { + __u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct); + struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc; + + if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) { + //ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB + return -ENODEV; + } + + if ((idProduct&0xF000) == 0x0000) { + //MDM interface 4 is QMI + if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3 + && intf->bInterfaceSubClass == 0xFF && intf->bInterfaceProtocol == 0xFF) + return -ENODEV; + } + } +#endif + /* Store the device flags so we can use them during attach. */ usb_set_serial_data(serial, (void *)device_flags); diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index 0017f6e96..86915a76a 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c @@ -436,6 +436,22 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, if (intfdata->use_zlp && dir == USB_DIR_OUT) urb->transfer_flags |= URB_ZERO_PACKET; +#if 1 //Added by Quectel for Zero Packet + if (dir == USB_DIR_OUT) { + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) + && serial->dev->descriptor.idProduct == cpu_to_le16(0x9090)) + urb->transfer_flags |= URB_ZERO_PACKET; + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) + && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)) + urb->transfer_flags |= URB_ZERO_PACKET; + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) + && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)) + urb->transfer_flags |= URB_ZERO_PACKET; + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) + urb->transfer_flags |= URB_ZERO_PACKET; + } +#endif + return urb; }