|
|
|
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(+)
|
|
|
|
|
|
|
|
--- a/drivers/net/usb/qmi_wwan.c
|
|
|
|
+++ b/drivers/net/usb/qmi_wwan.c
|
|
|
|
@@ -822,6 +822,7 @@ static const struct usb_device_id produc
|
|
|
|
{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 produc
|
|
|
|
};
|
|
|
|
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_int
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|