summaryrefslogtreecommitdiff
path: root/target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch
diff options
context:
space:
mode:
authorJohn Crispin <john@openwrt.org>2015-11-21 21:25:54 +0000
committerJohn Crispin <john@openwrt.org>2015-11-21 21:25:54 +0000
commit058275197bbd3734e923aaabe58cab61cc291634 (patch)
treee8202ac508daebbbcd44cc3e9eea023619d4ffee /target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch
parent570c35a599217cd549d9025f4d71eaab0313ab36 (diff)
downloadmtk-20170518-058275197bbd3734e923aaabe58cab61cc291634.zip
mtk-20170518-058275197bbd3734e923aaabe58cab61cc291634.tar.gz
mtk-20170518-058275197bbd3734e923aaabe58cab61cc291634.tar.bz2
kernel/generic: 3.18, 4.y: Add support for Quectel EC20 Mini PCIe module
* both patches (qcserial/qmi_wwan) were submitted upstream[1,2] * build tested on 3.18 and 4.1 * run tested on imx6 platform with 4.1 1. http://article.gmane.org/gmane.linux.usb.general/132998 2. http://article.gmane.org/gmane.linux.usb.general/133113 Signed-off-by: Petr Štetiar <ynezz@true.cz> SVN-Revision: 47567
Diffstat (limited to 'target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch')
-rw-r--r--target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch b/target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch
new file mode 100644
index 0000000..3b08571
--- /dev/null
+++ b/target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch
@@ -0,0 +1,101 @@
+From fe29727caa7fe434fcb3166df2a62672bc516b54 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz>
+Date: Wed, 4 Nov 2015 16:23:37 +0100
+Subject: [PATCH 2/2] USB: qmi_wwan: Add quirk for Quectel EC20 Mini PCIe
+ module
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+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 where EC20 has QMI on interface 4 instead of 0.
+
+lsusb output:
+
+ Bus 002 Device 003: ID 05c6:9215 Qualcomm, Inc. Acer Gobi 2000
+ 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/net/usb/qmi_wwan.c | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 2a7c1be..b81a32c 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -822,6 +822,7 @@ static const struct usb_device_id products[] = {
+ {QMI_GOBI_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */
+ {QMI_GOBI_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */
+ {QMI_GOBI_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
++ {QMI_FIXED_INTF(0x05c6, 0x9215, 4)}, /* Quectel EC20 Mini PCIe */
+ {QMI_GOBI_DEVICE(0x05c6, 0x9265)}, /* Asus Gobi 2000 Modem device (VR305) */
+ {QMI_GOBI_DEVICE(0x05c6, 0x9235)}, /* Top Global Gobi 2000 Modem device (VR306) */
+ {QMI_GOBI_DEVICE(0x05c6, 0x9275)}, /* iRex Technologies Gobi 2000 Modem device (VR307) */
+@@ -853,10 +854,24 @@ static const struct usb_device_id products[] = {
+ };
+ MODULE_DEVICE_TABLE(usb, products);
+
++static bool quectel_ec20_detected(struct usb_interface *intf)
++{
++ struct usb_device *dev = interface_to_usbdev(intf);
++
++ if (dev->actconfig &&
++ le16_to_cpu(dev->descriptor.idVendor) == 0x05c6 &&
++ le16_to_cpu(dev->descriptor.idProduct) == 0x9215 &&
++ dev->actconfig->desc.bNumInterfaces == 5)
++ return true;
++
++ return false;
++}
++
+ static int qmi_wwan_probe(struct usb_interface *intf,
+ const struct usb_device_id *prod)
+ {
+ struct usb_device_id *id = (struct usb_device_id *)prod;
++ struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc;
+
+ /* Workaround to enable dynamic IDs. This disables usbnet
+ * blacklisting functionality. Which, if required, can be
+@@ -868,6 +883,12 @@ static int qmi_wwan_probe(struct usb_interface *intf,
+ id->driver_info = (unsigned long)&qmi_wwan_info;
+ }
+
++ /* Quectel EC20 quirk where we've QMI on interface 4 instead of 0 */
++ if (quectel_ec20_detected(intf) && desc->bInterfaceNumber == 0) {
++ dev_dbg(&intf->dev, "Quectel EC20 quirk, skipping interface 0\n");
++ return -ENODEV;
++ }
++
+ return usbnet_probe(intf, id);
+ }
+
+--
+1.7.9.5
+