From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FC86C433F5 for ; Mon, 10 Sep 2018 14:43:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 336E920854 for ; Mon, 10 Sep 2018 14:43:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 336E920854 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728735AbeIJTiC (ORCPT ); Mon, 10 Sep 2018 15:38:02 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:39636 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728439AbeIJTiB (ORCPT ); Mon, 10 Sep 2018 15:38:01 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E7D4A401EF36; Mon, 10 Sep 2018 14:43:35 +0000 (UTC) Received: from ovpn-112-55.rdu2.redhat.com (ovpn-112-55.rdu2.redhat.com [10.10.112.55]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4B4E210EE78E; Mon, 10 Sep 2018 14:43:35 +0000 (UTC) Message-ID: Subject: Re: [PATCH] option: Improve Quectel EP06 detection From: Dan Williams To: Kristian Evensen , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Date: Mon, 10 Sep 2018 09:43:34 -0500 In-Reply-To: <20180908125754.1947-1-kristian.evensen@gmail.com> References: <20180908125754.1947-1-kristian.evensen@gmail.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 10 Sep 2018 14:43:35 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 10 Sep 2018 14:43:35 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'dcbw@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, 2018-09-08 at 14:57 +0200, Kristian Evensen wrote: > The Quectel EP06 (and EM06/EG06) LTE modem supports updating the USB > configuration, without the VID/PID or configuration number changing. > When the configuration is updated and interfaces are added/removed, > the > interface numbers are updated. This causes our current code for > matching > EP06 not to work as intended, as the assumption about reserved > interfaces no longer holds. If for example the diagnostic (first) > interface is removed, option will (try to) bind to the QMI interface. > > This patch improves EP06 detection by replacing the current match > with > two matches, and those matches check class, subclass and protocol as > well as VID and PID. The diag interface exports class, subclass and > protocol as 0xff. For the other serial interfaces, class is 0xff and > subclass and protocol are both 0x0. > > The modem can export the following devices and always in this order: > diag, nmea, at, ppp. qmi and adb. This means that diag can only ever > be > interface 0, and interface numbers 1-5 should be marked as reserved. > The > three other serial devices can have interface numbers 0-3, but I have > not marked any interfaces as reserved. The reason is that the serial > devices are the only interfaces exported by the device where subclass > and protocol is 0x0. > > QMI exports the same class, subclass and protocol values as the diag > interface. However, the two interfaces have different number of > endpoints, QMI has three and diag two. I have added a check for > number > of interfaces if VID/PID matches the EP06, and we ignore the device > if > number of interfaces equals three (and subclass is set). I double-checked the permutations & logic and it makes sense to me. Acked-by: Dan Williams > Signed-off-by: Kristian Evensen > --- > drivers/usb/serial/option.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/serial/option.c > b/drivers/usb/serial/option.c > index 0215b70c4efc..835dcd2875a7 100644 > --- a/drivers/usb/serial/option.c > +++ b/drivers/usb/serial/option.c > @@ -1081,8 +1081,9 @@ static const struct usb_device_id option_ids[] > = { > .driver_info = RSVD(4) }, > { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), > .driver_info = RSVD(4) }, > - { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06), > - .driver_info = RSVD(4) | RSVD(5) }, > + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, > QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff), > + .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | > RSVD(5) }, > + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, > QUECTEL_PRODUCT_EP06, 0xff, 0, 0) }, > { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, > { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, > { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), > @@ -1985,6 +1986,7 @@ static int option_probe(struct usb_serial > *serial, > { > struct usb_interface_descriptor *iface_desc = > &serial->interface->cur_altsetting- > >desc; > + struct usb_device_descriptor *dev_desc = &serial->dev- > >descriptor; > unsigned long device_flags = id->driver_info; > > /* Never bind to the CD-Rom emulation interface */ > @@ -1999,6 +2001,17 @@ static int option_probe(struct usb_serial > *serial, > if (device_flags & RSVD(iface_desc->bInterfaceNumber)) > return -ENODEV; > > + /* > + * Don't bind to the QMI device of the Quectel > EP06/EG06/EM06. Class, > + * subclass and protocol is 0xff for both the diagnostic > port and the > + * QMI interface, but the diagnostic port only has two > endpoints (QMI > + * has three). > + */ > + if (dev_desc->idVendor == cpu_to_le16(QUECTEL_VENDOR_ID) && > + dev_desc->idProduct == cpu_to_le16(QUECTEL_PRODUCT_EP06) > && > + iface_desc->bInterfaceSubClass && iface_desc- > >bNumEndpoints == 3) > + return -ENODEV; > + > /* Store the device flags so we can use them during attach. > */ > usb_set_serial_data(serial, (void *)device_flags); > From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: option: Improve Quectel EP06 detection From: Dan Williams Message-Id: Date: Mon, 10 Sep 2018 09:43:34 -0500 To: Kristian Evensen , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org List-ID: T24gU2F0LCAyMDE4LTA5LTA4IGF0IDE0OjU3ICswMjAwLCBLcmlzdGlhbiBFdmVuc2VuIHdyb3Rl Ogo+IFRoZSBRdWVjdGVsIEVQMDYgKGFuZCBFTTA2L0VHMDYpIExURSBtb2RlbSBzdXBwb3J0cyB1 cGRhdGluZyB0aGUgVVNCCj4gY29uZmlndXJhdGlvbiwgd2l0aG91dCB0aGUgVklEL1BJRCBvciBj b25maWd1cmF0aW9uIG51bWJlciBjaGFuZ2luZy4KPiBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGlz IHVwZGF0ZWQgYW5kIGludGVyZmFjZXMgYXJlIGFkZGVkL3JlbW92ZWQsCj4gdGhlCj4gaW50ZXJm YWNlIG51bWJlcnMgYXJlIHVwZGF0ZWQuIFRoaXMgY2F1c2VzIG91ciBjdXJyZW50IGNvZGUgZm9y Cj4gbWF0Y2hpbmcKPiBFUDA2IG5vdCB0byB3b3JrIGFzIGludGVuZGVkLCBhcyB0aGUgYXNzdW1w dGlvbiBhYm91dCByZXNlcnZlZAo+IGludGVyZmFjZXMgbm8gbG9uZ2VyIGhvbGRzLiBJZiBmb3Ig ZXhhbXBsZSB0aGUgZGlhZ25vc3RpYyAoZmlyc3QpCj4gaW50ZXJmYWNlIGlzIHJlbW92ZWQsIG9w dGlvbiB3aWxsICh0cnkgdG8pIGJpbmQgdG8gdGhlIFFNSSBpbnRlcmZhY2UuCj4gCj4gVGhpcyBw YXRjaCBpbXByb3ZlcyBFUDA2IGRldGVjdGlvbiBieSByZXBsYWNpbmcgdGhlIGN1cnJlbnQgbWF0 Y2gKPiB3aXRoCj4gdHdvIG1hdGNoZXMsIGFuZCB0aG9zZSBtYXRjaGVzIGNoZWNrIGNsYXNzLCBz dWJjbGFzcyBhbmQgcHJvdG9jb2wgYXMKPiB3ZWxsIGFzIFZJRCBhbmQgUElELiBUaGUgZGlhZyBp bnRlcmZhY2UgZXhwb3J0cyBjbGFzcywgc3ViY2xhc3MgYW5kCj4gcHJvdG9jb2wgYXMgMHhmZi4g Rm9yIHRoZSBvdGhlciBzZXJpYWwgaW50ZXJmYWNlcywgY2xhc3MgaXMgMHhmZiBhbmQKPiBzdWJj bGFzcyBhbmQgcHJvdG9jb2wgYXJlIGJvdGggMHgwLgo+IAo+IFRoZSBtb2RlbSBjYW4gZXhwb3J0 IHRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhbmQgYWx3YXlzIGluIHRoaXMgb3JkZXI6Cj4gZGlhZywg bm1lYSwgYXQsIHBwcC4gcW1pIGFuZCBhZGIuIFRoaXMgbWVhbnMgdGhhdCBkaWFnIGNhbiBvbmx5 IGV2ZXIKPiBiZQo+IGludGVyZmFjZSAwLCBhbmQgaW50ZXJmYWNlIG51bWJlcnMgMS01IHNob3Vs ZCBiZSBtYXJrZWQgYXMgcmVzZXJ2ZWQuCj4gVGhlCj4gdGhyZWUgb3RoZXIgc2VyaWFsIGRldmlj ZXMgY2FuIGhhdmUgaW50ZXJmYWNlIG51bWJlcnMgMC0zLCBidXQgSSBoYXZlCj4gbm90IG1hcmtl ZCBhbnkgaW50ZXJmYWNlcyBhcyByZXNlcnZlZC4gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSBzZXJp YWwKPiBkZXZpY2VzIGFyZSB0aGUgb25seSBpbnRlcmZhY2VzIGV4cG9ydGVkIGJ5IHRoZSBkZXZp Y2Ugd2hlcmUgc3ViY2xhc3MKPiBhbmQgcHJvdG9jb2wgaXMgMHgwLgo+IAo+IFFNSSBleHBvcnRz IHRoZSBzYW1lIGNsYXNzLCBzdWJjbGFzcyBhbmQgcHJvdG9jb2wgdmFsdWVzIGFzIHRoZSBkaWFn Cj4gaW50ZXJmYWNlLiBIb3dldmVyLCB0aGUgdHdvIGludGVyZmFjZXMgaGF2ZSBkaWZmZXJlbnQg bnVtYmVyIG9mCj4gZW5kcG9pbnRzLCBRTUkgaGFzIHRocmVlIGFuZCBkaWFnIHR3by4gSSBoYXZl IGFkZGVkIGEgY2hlY2sgZm9yCj4gbnVtYmVyCj4gb2YgaW50ZXJmYWNlcyBpZiBWSUQvUElEIG1h dGNoZXMgdGhlIEVQMDYsIGFuZCB3ZSBpZ25vcmUgdGhlIGRldmljZQo+IGlmCj4gbnVtYmVyIG9m IGludGVyZmFjZXMgZXF1YWxzIHRocmVlIChhbmQgc3ViY2xhc3MgaXMgc2V0KS4KCkkgZG91Ymxl LWNoZWNrZWQgdGhlIHBlcm11dGF0aW9ucyAmIGxvZ2ljIGFuZCBpdCBtYWtlcyBzZW5zZSB0byBt ZS4KCkFja2VkLWJ5OiBEYW4gV2lsbGlhbXMgPGRjYndAcmVkaGF0LmNvbT4KCj4gU2lnbmVkLW9m Zi1ieTogS3Jpc3RpYW4gRXZlbnNlbiA8a3Jpc3RpYW4uZXZlbnNlbkBnbWFpbC5jb20+Cj4gLS0t Cj4gIGRyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyB8IDE3ICsrKysrKysrKysrKysrKy0tCj4g IDEgZmlsZSBjaGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQo+IAo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKPiBiL2RyaXZlcnMvdXNiL3Nl cmlhbC9vcHRpb24uYwo+IGluZGV4IDAyMTViNzBjNGVmYy4uODM1ZGNkMjg3NWE3IDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwo+ICsrKyBiL2RyaXZlcnMvdXNiL3Nl cmlhbC9vcHRpb24uYwo+IEBAIC0xMDgxLDggKzEwODEsOSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0 IHVzYl9kZXZpY2VfaWQgb3B0aW9uX2lkc1tdCj4gPSB7Cj4gIAkgIC5kcml2ZXJfaW5mbyA9IFJT VkQoNCkgfSwKPiAgCXsgVVNCX0RFVklDRShRVUVDVEVMX1ZFTkRPUl9JRCwgUVVFQ1RFTF9QUk9E VUNUX0JHOTYpLAo+ICAJICAuZHJpdmVyX2luZm8gPSBSU1ZEKDQpIH0sCj4gLQl7IFVTQl9ERVZJ Q0UoUVVFQ1RFTF9WRU5ET1JfSUQsIFFVRUNURUxfUFJPRFVDVF9FUDA2KSwKPiAtCSAgLmRyaXZl cl9pbmZvID0gUlNWRCg0KSB8IFJTVkQoNSkgfSwKPiArCXsgVVNCX0RFVklDRV9BTkRfSU5URVJG QUNFX0lORk8oUVVFQ1RFTF9WRU5ET1JfSUQsCj4gUVVFQ1RFTF9QUk9EVUNUX0VQMDYsIDB4ZmYs IDB4ZmYsIDB4ZmYpLAo+ICsJICAuZHJpdmVyX2luZm8gPSBSU1ZEKDEpIHwgUlNWRCgyKSB8IFJT VkQoMykgfCBSU1ZEKDQpIHwKPiBSU1ZEKDUpIH0sCj4gKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVS RkFDRV9JTkZPKFFVRUNURUxfVkVORE9SX0lELAo+IFFVRUNURUxfUFJPRFVDVF9FUDA2LCAweGZm LCAwLCAwKSB9LAo+ICAJeyBVU0JfREVWSUNFKENNT1RFQ0hfVkVORE9SX0lELCBDTU9URUNIX1BS T0RVQ1RfNjAwMSkgfSwKPiAgCXsgVVNCX0RFVklDRShDTU9URUNIX1ZFTkRPUl9JRCwgQ01PVEVD SF9QUk9EVUNUX0NNVV8zMDApIH0sCj4gIAl7IFVTQl9ERVZJQ0UoQ01PVEVDSF9WRU5ET1JfSUQs IENNT1RFQ0hfUFJPRFVDVF82MDAzKSwKPiBAQCAtMTk4NSw2ICsxOTg2LDcgQEAgc3RhdGljIGlu dCBvcHRpb25fcHJvYmUoc3RydWN0IHVzYl9zZXJpYWwKPiAqc2VyaWFsLAo+ICB7Cj4gIAlzdHJ1 Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppZmFjZV9kZXNjID0KPiAgCQkJCSZzZXJpYWwt PmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctCj4gPmRlc2M7Cj4gKwlzdHJ1Y3QgdXNiX2Rldmlj ZV9kZXNjcmlwdG9yICpkZXZfZGVzYyA9ICZzZXJpYWwtPmRldi0KPiA+ZGVzY3JpcHRvcjsKPiAg CXVuc2lnbmVkIGxvbmcgZGV2aWNlX2ZsYWdzID0gaWQtPmRyaXZlcl9pbmZvOwo+ICAKPiAgCS8q IE5ldmVyIGJpbmQgdG8gdGhlIENELVJvbSBlbXVsYXRpb24gaW50ZXJmYWNlCSovCj4gQEAgLTE5 OTksNiArMjAwMSwxNyBAQCBzdGF0aWMgaW50IG9wdGlvbl9wcm9iZShzdHJ1Y3QgdXNiX3Nlcmlh bAo+ICpzZXJpYWwsCj4gIAlpZiAoZGV2aWNlX2ZsYWdzICYgUlNWRChpZmFjZV9kZXNjLT5iSW50 ZXJmYWNlTnVtYmVyKSkKPiAgCQlyZXR1cm4gLUVOT0RFVjsKPiAgCj4gKwkvKgo+ICsJICogRG9u J3QgYmluZCB0byB0aGUgUU1JIGRldmljZSBvZiB0aGUgUXVlY3RlbAo+IEVQMDYvRUcwNi9FTTA2 LiBDbGFzcywKPiArCSAqIHN1YmNsYXNzIGFuZCBwcm90b2NvbCBpcyAweGZmIGZvciBib3RoIHRo ZSBkaWFnbm9zdGljCj4gcG9ydCBhbmQgdGhlCj4gKwkgKiBRTUkgaW50ZXJmYWNlLCBidXQgdGhl IGRpYWdub3N0aWMgcG9ydCBvbmx5IGhhcyB0d28KPiBlbmRwb2ludHMgKFFNSQo+ICsJICogaGFz IHRocmVlKS4KPiArCSAqLwo+ICsJaWYgKGRldl9kZXNjLT5pZFZlbmRvciA9PSBjcHVfdG9fbGUx NihRVUVDVEVMX1ZFTkRPUl9JRCkgJiYKPiArCSAgICBkZXZfZGVzYy0+aWRQcm9kdWN0ID09IGNw dV90b19sZTE2KFFVRUNURUxfUFJPRFVDVF9FUDA2KQo+ICYmCj4gKwkgICAgaWZhY2VfZGVzYy0+ YkludGVyZmFjZVN1YkNsYXNzICYmIGlmYWNlX2Rlc2MtCj4gPmJOdW1FbmRwb2ludHMgPT0gMykK PiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gIAkvKiBTdG9yZSB0aGUgZGV2aWNlIGZsYWdzIHNv IHdlIGNhbiB1c2UgdGhlbSBkdXJpbmcgYXR0YWNoLgo+ICovCj4gIAl1c2Jfc2V0X3NlcmlhbF9k YXRhKHNlcmlhbCwgKHZvaWQgKilkZXZpY2VfZmxhZ3MpOwo+Cg==