Thanks, i dropped the 4.0 part as we dont have that in trunk anymore John
On 11/11/2015 14:18, Petr Štetiar wrote: > * 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 <yn...@true.cz> > --- > ...l-Add-support-for-Quectel-EC20-Mini-PCIe-.patch | 119 > ++++++++++++++++++++ > ...n-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch | 101 +++++++++++++++++ > ...l-Add-support-for-Quectel-EC20-Mini-PCIe-.patch | 119 > ++++++++++++++++++++ > ...n-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch | 101 +++++++++++++++++ > ...l-Add-support-for-Quectel-EC20-Mini-PCIe-.patch | 119 > ++++++++++++++++++++ > ...n-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch | 101 +++++++++++++++++ > ...l-Add-support-for-Quectel-EC20-Mini-PCIe-.patch | 119 > ++++++++++++++++++++ > ...n-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch | 101 +++++++++++++++++ > 8 files changed, 880 insertions(+) > create mode 100644 > target/linux/generic/patches-3.18/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > create mode 100644 > target/linux/generic/patches-3.18/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch > create mode 100644 > target/linux/generic/patches-4.0/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > create mode 100644 > target/linux/generic/patches-4.0/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch > create mode 100644 > target/linux/generic/patches-4.1/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > create mode 100644 > target/linux/generic/patches-4.1/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch > create mode 100644 > target/linux/generic/patches-4.3/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > create mode 100644 > target/linux/generic/patches-4.3/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch > > diff --git > a/target/linux/generic/patches-3.18/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > > b/target/linux/generic/patches-3.18/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > new file mode 100644 > index 0000000..f56941c > --- /dev/null > +++ > b/target/linux/generic/patches-3.18/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > @@ -0,0 +1,119 @@ > +From 128524b9db3e4f4245226852bee771bd03db75be Mon Sep 17 00:00:00 2001 > +From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <yn...@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 <yn...@true.cz> > +--- > + drivers/usb/serial/qcserial.c | 39 +++++++++++++++++++++++++++++++++++++++ > + 1 file changed, 39 insertions(+) > + > +diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c > +index ebcec8c..d462132 100644 > +--- 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_table[] = { > + }; > + 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 *serial, const > struct usb_device_id *id) > + 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 > +-- > +1.7.9.5 > + > diff --git > a/target/linux/generic/patches-3.18/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch > > b/target/linux/generic/patches-3.18/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-3.18/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?= <yn...@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 <yn...@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 > + > diff --git > a/target/linux/generic/patches-4.0/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > > b/target/linux/generic/patches-4.0/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > new file mode 100644 > index 0000000..f56941c > --- /dev/null > +++ > b/target/linux/generic/patches-4.0/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > @@ -0,0 +1,119 @@ > +From 128524b9db3e4f4245226852bee771bd03db75be Mon Sep 17 00:00:00 2001 > +From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <yn...@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 <yn...@true.cz> > +--- > + drivers/usb/serial/qcserial.c | 39 +++++++++++++++++++++++++++++++++++++++ > + 1 file changed, 39 insertions(+) > + > +diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c > +index ebcec8c..d462132 100644 > +--- 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_table[] = { > + }; > + 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 *serial, const > struct usb_device_id *id) > + 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 > +-- > +1.7.9.5 > + > diff --git > a/target/linux/generic/patches-4.0/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch > > b/target/linux/generic/patches-4.0/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.0/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?= <yn...@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 <yn...@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 > + > diff --git > a/target/linux/generic/patches-4.1/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > > b/target/linux/generic/patches-4.1/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > new file mode 100644 > index 0000000..f56941c > --- /dev/null > +++ > b/target/linux/generic/patches-4.1/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > @@ -0,0 +1,119 @@ > +From 128524b9db3e4f4245226852bee771bd03db75be Mon Sep 17 00:00:00 2001 > +From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <yn...@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 <yn...@true.cz> > +--- > + drivers/usb/serial/qcserial.c | 39 +++++++++++++++++++++++++++++++++++++++ > + 1 file changed, 39 insertions(+) > + > +diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c > +index ebcec8c..d462132 100644 > +--- 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_table[] = { > + }; > + 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 *serial, const > struct usb_device_id *id) > + 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 > +-- > +1.7.9.5 > + > 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?= <yn...@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 <yn...@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 > + > diff --git > a/target/linux/generic/patches-4.3/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > > b/target/linux/generic/patches-4.3/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > new file mode 100644 > index 0000000..f56941c > --- /dev/null > +++ > b/target/linux/generic/patches-4.3/192-USB-qcserial-Add-support-for-Quectel-EC20-Mini-PCIe-.patch > @@ -0,0 +1,119 @@ > +From 128524b9db3e4f4245226852bee771bd03db75be Mon Sep 17 00:00:00 2001 > +From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <yn...@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 <yn...@true.cz> > +--- > + drivers/usb/serial/qcserial.c | 39 +++++++++++++++++++++++++++++++++++++++ > + 1 file changed, 39 insertions(+) > + > +diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c > +index ebcec8c..d462132 100644 > +--- 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_table[] = { > + }; > + 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 *serial, const > struct usb_device_id *id) > + 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 > +-- > +1.7.9.5 > + > diff --git > a/target/linux/generic/patches-4.3/193-USB-qmi_wwan-Add-quirk-for-Quectel-EC20-Mini-PCIe-mo.patch > > b/target/linux/generic/patches-4.3/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.3/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?= <yn...@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 <yn...@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 > + > _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel