| From 9d5b5ed796d7afd7e8d2ac4b4fb77c6a49463f4b Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz> |
| Date: Tue, 3 Nov 2015 11:25:28 +0100 |
| Subject: USB: qcserial: Add support for Quectel EC20 Mini PCIe module |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz> |
| |
| commit 9d5b5ed796d7afd7e8d2ac4b4fb77c6a49463f4b upstream. |
| |
| It seems like this device has same vendor and product IDs as G2K |
| devices, but it has different number of interfaces(4 vs 5) and also |
| different interface layout which makes it currently unusable: |
| |
| usbcore: registered new interface driver qcserial |
| usbserial: USB Serial support registered for Qualcomm USB modem |
| usb 2-1.2: unknown number of interfaces: 5 |
| |
| lsusb output: |
| |
| Bus 002 Device 003: ID 05c6:9215 Qualcomm, Inc. Acer Gobi 2000 Wireless |
| Device Descriptor: |
| bLength 18 |
| bDescriptorType 1 |
| bcdUSB 2.00 |
| bDeviceClass 0 (Defined at Interface level) |
| bDeviceSubClass 0 |
| bDeviceProtocol 0 |
| bMaxPacketSize0 64 |
| idVendor 0x05c6 Qualcomm, Inc. |
| idProduct 0x9215 Acer Gobi 2000 Wireless Modem |
| bcdDevice 2.32 |
| iManufacturer 1 Quectel |
| iProduct 2 Quectel LTE Module |
| iSerial 0 |
| bNumConfigurations 1 |
| Configuration Descriptor: |
| bLength 9 |
| bDescriptorType 2 |
| wTotalLength 209 |
| bNumInterfaces 5 |
| bConfigurationValue 1 |
| iConfiguration 0 |
| bmAttributes 0xa0 |
| (Bus Powered) |
| Remote Wakeup |
| MaxPower 500mA |
| |
| Signed-off-by: Petr Štetiar <ynezz@true.cz> |
| [johan: rename define and add comment ] |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/serial/qcserial.c | 40 ++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 40 insertions(+) |
| |
| --- a/drivers/usb/serial/qcserial.c |
| +++ b/drivers/usb/serial/qcserial.c |
| @@ -22,6 +22,8 @@ |
| #define DRIVER_AUTHOR "Qualcomm Inc" |
| #define DRIVER_DESC "Qualcomm USB Serial driver" |
| |
| +#define QUECTEL_EC20_PID 0x9215 |
| + |
| /* standard device layouts supported by this driver */ |
| enum qcserial_layouts { |
| QCSERIAL_G2K = 0, /* Gobi 2000 */ |
| @@ -169,6 +171,38 @@ static const struct usb_device_id id_tab |
| }; |
| MODULE_DEVICE_TABLE(usb, id_table); |
| |
| +static int handle_quectel_ec20(struct device *dev, int ifnum) |
| +{ |
| + int altsetting = 0; |
| + |
| + /* |
| + * Quectel EC20 Mini PCIe LTE module layout: |
| + * 0: DM/DIAG (use libqcdm from ModemManager for communication) |
| + * 1: NMEA |
| + * 2: AT-capable modem port |
| + * 3: Modem interface |
| + * 4: NDIS |
| + */ |
| + switch (ifnum) { |
| + case 0: |
| + dev_dbg(dev, "Quectel EC20 DM/DIAG interface found\n"); |
| + break; |
| + case 1: |
| + dev_dbg(dev, "Quectel EC20 NMEA GPS interface found\n"); |
| + break; |
| + case 2: |
| + case 3: |
| + dev_dbg(dev, "Quectel EC20 Modem port found\n"); |
| + break; |
| + case 4: |
| + /* Don't claim the QMI/net interface */ |
| + altsetting = -1; |
| + break; |
| + } |
| + |
| + return altsetting; |
| +} |
| + |
| static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) |
| { |
| struct usb_host_interface *intf = serial->interface->cur_altsetting; |
| @@ -237,6 +271,12 @@ static int qcprobe(struct usb_serial *se |
| altsetting = -1; |
| break; |
| case QCSERIAL_G2K: |
| + /* handle non-standard layouts */ |
| + if (nintf == 5 && id->idProduct == QUECTEL_EC20_PID) { |
| + altsetting = handle_quectel_ec20(dev, ifnum); |
| + goto done; |
| + } |
| + |
| /* |
| * Gobi 2K+ USB layout: |
| * 0: QMI/net |