mirror of https://github.com/hak5/openwrt.git
115 lines
3.3 KiB
Diff
115 lines
3.3 KiB
Diff
From 128524b9db3e4f4245226852bee771bd03db75be Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz>
|
|
Date: Tue, 3 Nov 2015 11:01:42 +0100
|
|
Subject: [PATCH 1/2] 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
|
|
|
|
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>
|
|
---
|
|
drivers/usb/serial/qcserial.c | 39 +++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 39 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_IDPRODUCT 0x9215
|
|
+
|
|
/* standard device layouts supported by this driver */
|
|
enum qcserial_layouts {
|
|
QCSERIAL_G2K = 0, /* Gobi 2000 */
|
|
@@ -167,6 +169,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;
|
|
@@ -235,6 +269,11 @@ static int qcprobe(struct usb_serial *se
|
|
altsetting = -1;
|
|
break;
|
|
case QCSERIAL_G2K:
|
|
+ if (nintf == 5 && id->idProduct == QUECTEL_EC20_IDPRODUCT) {
|
|
+ altsetting = handle_quectel_ec20(dev, ifnum);
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
/*
|
|
* Gobi 2K+ USB layout:
|
|
* 0: QMI/net
|