| From a2794d2fe7edd0d35482ec3216494a316db79bfa Mon Sep 17 00:00:00 2001 |
| From: Kristian Evensen <kristian.evensen@gmail.com> |
| Date: Mon, 13 Jan 2020 15:14:05 +0100 |
| Subject: [PATCH] USB: serial: option: Add support for Quectel RM500Q |
| |
| commit accf227de4d211b52c830a58b2df00d5739f2389 upstream. |
| |
| RM500Q is a 5G module from Quectel, supporting both standalone and |
| non-standalone modes. Unlike other recent Quectel modems, it is possible |
| to identify the diagnostic interface (bInterfaceProtocol is unique). |
| Thus, there is no need to check for the number of endpoints or reserve |
| interfaces. The interface number is still dynamic though, so matching on |
| interface number is not possible and two entries have to be added to the |
| table. |
| |
| Output from usb-devices with all interfaces enabled (order is diag, |
| nmea, at_port, modem, rmnet and adb): |
| |
| Bus 004 Device 007: ID 2c7c:0800 Quectel Wireless Solutions Co., Ltd. |
| Device Descriptor: |
| bLength 18 |
| bDescriptorType 1 |
| bcdUSB 3.20 |
| bDeviceClass 0 (Defined at Interface level) |
| bDeviceSubClass 0 |
| bDeviceProtocol 0 |
| bMaxPacketSize0 9 |
| idVendor 0x2c7c Quectel Wireless Solutions Co., Ltd. |
| idProduct 0x0800 |
| bcdDevice 4.14 |
| iManufacturer 1 Quectel |
| iProduct 2 LTE-A Module |
| iSerial 3 40046d60 |
| bNumConfigurations 1 |
| Configuration Descriptor: |
| bLength 9 |
| bDescriptorType 2 |
| wTotalLength 328 |
| bNumInterfaces 6 |
| bConfigurationValue 1 |
| iConfiguration 4 DIAG_SER_RMNET |
| bmAttributes 0xa0 |
| (Bus Powered) |
| Remote Wakeup |
| MaxPower 224mA |
| Interface Descriptor: |
| bLength 9 |
| bDescriptorType 4 |
| bInterfaceNumber 0 |
| bAlternateSetting 0 |
| bNumEndpoints 2 |
| bInterfaceClass 255 Vendor Specific Class |
| bInterfaceSubClass 255 Vendor Specific Subclass |
| bInterfaceProtocol 48 |
| iInterface 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x81 EP 1 IN |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x01 EP 1 OUT |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Interface Descriptor: |
| bLength 9 |
| bDescriptorType 4 |
| bInterfaceNumber 1 |
| bAlternateSetting 0 |
| bNumEndpoints 3 |
| bInterfaceClass 255 Vendor Specific Class |
| bInterfaceSubClass 0 |
| bInterfaceProtocol 0 |
| iInterface 0 |
| ** UNRECOGNIZED: 05 24 00 10 01 |
| ** UNRECOGNIZED: 05 24 01 00 00 |
| ** UNRECOGNIZED: 04 24 02 02 |
| ** UNRECOGNIZED: 05 24 06 00 00 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x83 EP 3 IN |
| bmAttributes 3 |
| Transfer Type Interrupt |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x000a 1x 10 bytes |
| bInterval 9 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x82 EP 2 IN |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x02 EP 2 OUT |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Interface Descriptor: |
| bLength 9 |
| bDescriptorType 4 |
| bInterfaceNumber 2 |
| bAlternateSetting 0 |
| bNumEndpoints 3 |
| bInterfaceClass 255 Vendor Specific Class |
| bInterfaceSubClass 0 |
| bInterfaceProtocol 0 |
| iInterface 0 |
| ** UNRECOGNIZED: 05 24 00 10 01 |
| ** UNRECOGNIZED: 05 24 01 00 00 |
| ** UNRECOGNIZED: 04 24 02 02 |
| ** UNRECOGNIZED: 05 24 06 00 00 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x85 EP 5 IN |
| bmAttributes 3 |
| Transfer Type Interrupt |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x000a 1x 10 bytes |
| bInterval 9 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x84 EP 4 IN |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x03 EP 3 OUT |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Interface Descriptor: |
| bLength 9 |
| bDescriptorType 4 |
| bInterfaceNumber 3 |
| bAlternateSetting 0 |
| bNumEndpoints 3 |
| bInterfaceClass 255 Vendor Specific Class |
| bInterfaceSubClass 0 |
| bInterfaceProtocol 0 |
| iInterface 0 |
| ** UNRECOGNIZED: 05 24 00 10 01 |
| ** UNRECOGNIZED: 05 24 01 00 00 |
| ** UNRECOGNIZED: 04 24 02 02 |
| ** UNRECOGNIZED: 05 24 06 00 00 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x87 EP 7 IN |
| bmAttributes 3 |
| Transfer Type Interrupt |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x000a 1x 10 bytes |
| bInterval 9 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x86 EP 6 IN |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x04 EP 4 OUT |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Interface Descriptor: |
| bLength 9 |
| bDescriptorType 4 |
| bInterfaceNumber 4 |
| bAlternateSetting 0 |
| bNumEndpoints 3 |
| bInterfaceClass 255 Vendor Specific Class |
| bInterfaceSubClass 255 Vendor Specific Subclass |
| bInterfaceProtocol 255 Vendor Specific Protocol |
| iInterface 5 CDEV Serial |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x88 EP 8 IN |
| bmAttributes 3 |
| Transfer Type Interrupt |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0008 1x 8 bytes |
| bInterval 9 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x8e EP 14 IN |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 6 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x0f EP 15 OUT |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 2 |
| Interface Descriptor: |
| bLength 9 |
| bDescriptorType 4 |
| bInterfaceNumber 5 |
| bAlternateSetting 0 |
| bNumEndpoints 2 |
| bInterfaceClass 255 Vendor Specific Class |
| bInterfaceSubClass 66 |
| bInterfaceProtocol 1 |
| iInterface 6 ADB Interface |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x05 EP 5 OUT |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Endpoint Descriptor: |
| bLength 7 |
| bDescriptorType 5 |
| bEndpointAddress 0x89 EP 9 IN |
| bmAttributes 2 |
| Transfer Type Bulk |
| Synch Type None |
| Usage Type Data |
| wMaxPacketSize 0x0400 1x 1024 bytes |
| bInterval 0 |
| bMaxBurst 0 |
| Binary Object Store Descriptor: |
| bLength 5 |
| bDescriptorType 15 |
| wTotalLength 42 |
| bNumDeviceCaps 3 |
| USB 2.0 Extension Device Capability: |
| bLength 7 |
| bDescriptorType 16 |
| bDevCapabilityType 2 |
| bmAttributes 0x00000006 |
| Link Power Management (LPM) Supported |
| SuperSpeed USB Device Capability: |
| bLength 10 |
| bDescriptorType 16 |
| bDevCapabilityType 3 |
| bmAttributes 0x00 |
| wSpeedsSupported 0x000f |
| Device can operate at Low Speed (1Mbps) |
| Device can operate at Full Speed (12Mbps) |
| Device can operate at High Speed (480Mbps) |
| Device can operate at SuperSpeed (5Gbps) |
| bFunctionalitySupport 1 |
| Lowest fully-functional device speed is Full Speed (12Mbps) |
| bU1DevExitLat 1 micro seconds |
| bU2DevExitLat 500 micro seconds |
| ** UNRECOGNIZED: 14 10 0a 00 01 00 00 00 00 11 00 00 30 40 0a 00 b0 40 0a 00 |
| Device Status: 0x0000 |
| (Bus Powered) |
| |
| Signed-off-by: Kristian Evensen <kristian.evensen@gmail.com> |
| Cc: stable <stable@vger.kernel.org> |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
| index 2d919d0e6e45..62bad1b2c18e 100644 |
| --- a/drivers/usb/serial/option.c |
| +++ b/drivers/usb/serial/option.c |
| @@ -248,6 +248,7 @@ static void option_instat_callback(struct urb *urb); |
| #define QUECTEL_PRODUCT_BG96 0x0296 |
| #define QUECTEL_PRODUCT_EP06 0x0306 |
| #define QUECTEL_PRODUCT_EM12 0x0512 |
| +#define QUECTEL_PRODUCT_RM500Q 0x0800 |
| |
| #define CMOTECH_VENDOR_ID 0x16d8 |
| #define CMOTECH_PRODUCT_6001 0x6001 |
| @@ -1104,6 +1105,9 @@ static const struct usb_device_id option_ids[] = { |
| { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0xff, 0xff), |
| .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, |
| { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0, 0) }, |
| + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) }, |
| + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, |
| + |
| { 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), |
| -- |
| 2.7.4 |
| |