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: [1/2] USB: serial: option: improve Quectel EP06 detection From: Johan Hovold Message-Id: <20180913092152.770-1-johan@kernel.org> Date: Thu, 13 Sep 2018 11:21:49 +0200 To: Kristian Evensen Cc: linux-usb@vger.kernel.org, =?UTF-8?q?Bj=C3=B8rn=20Mork?= , Dan Williams , Lars Melin , linux-kernel@vger.kernel.org, stable , Johan Hovold List-ID: RnJvbTogS3Jpc3RpYW4gRXZlbnNlbiA8a3Jpc3RpYW4uZXZlbnNlbkBnbWFpbC5jb20+CgpUaGUg UXVlY3RlbCBFUDA2IChhbmQgRU0wNi9FRzA2KSBMVEUgbW9kZW0gc3VwcG9ydHMgdXBkYXRpbmcg dGhlIFVTQgpjb25maWd1cmF0aW9uLCB3aXRob3V0IHRoZSBWSUQvUElEIG9yIGNvbmZpZ3VyYXRp b24gbnVtYmVyIGNoYW5naW5nLgpXaGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQgYW5k IGludGVyZmFjZXMgYXJlIGFkZGVkL3JlbW92ZWQsIHRoZQppbnRlcmZhY2UgbnVtYmVycyBhcmUg dXBkYXRlZC4gVGhpcyBjYXVzZXMgb3VyIGN1cnJlbnQgY29kZSBmb3IgbWF0Y2hpbmcKRVAwNiBu b3QgdG8gd29yayBhcyBpbnRlbmRlZCwgYXMgdGhlIGFzc3VtcHRpb24gYWJvdXQgcmVzZXJ2ZWQK aW50ZXJmYWNlcyBubyBsb25nZXIgaG9sZHMuIElmIGZvciBleGFtcGxlIHRoZSBkaWFnbm9zdGlj IChmaXJzdCkKaW50ZXJmYWNlIGlzIHJlbW92ZWQsIG9wdGlvbiB3aWxsICh0cnkgdG8pIGJpbmQg dG8gdGhlIFFNSSBpbnRlcmZhY2UuCgpUaGlzIHBhdGNoIGltcHJvdmVzIEVQMDYgZGV0ZWN0aW9u IGJ5IHJlcGxhY2luZyB0aGUgY3VycmVudCBtYXRjaCB3aXRoCnR3byBtYXRjaGVzLCBhbmQgdGhv c2UgbWF0Y2hlcyBjaGVjayBjbGFzcywgc3ViY2xhc3MgYW5kIHByb3RvY29sIGFzCndlbGwgYXMg VklEIGFuZCBQSUQuIFRoZSBkaWFnIGludGVyZmFjZSBleHBvcnRzIGNsYXNzLCBzdWJjbGFzcyBh bmQKcHJvdG9jb2wgYXMgMHhmZi4gRm9yIHRoZSBvdGhlciBzZXJpYWwgaW50ZXJmYWNlcywgY2xh c3MgaXMgMHhmZiBhbmQKc3ViY2xhc3MgYW5kIHByb3RvY29sIGFyZSBib3RoIDB4MC4KClRoZSBt b2RlbSBjYW4gZXhwb3J0IHRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhbmQgYWx3YXlzIGluIHRoaXMg b3JkZXI6CmRpYWcsIG5tZWEsIGF0LCBwcHAuIHFtaSBhbmQgYWRiLiBUaGlzIG1lYW5zIHRoYXQg ZGlhZyBjYW4gb25seSBldmVyIGJlCmludGVyZmFjZSAwLCBhbmQgaW50ZXJmYWNlIG51bWJlcnMg MS01IHNob3VsZCBiZSBtYXJrZWQgYXMgcmVzZXJ2ZWQuIFRoZQp0aHJlZSBvdGhlciBzZXJpYWwg ZGV2aWNlcyBjYW4gaGF2ZSBpbnRlcmZhY2UgbnVtYmVycyAwLTMsIGJ1dCBJIGhhdmUKbm90IG1h cmtlZCBhbnkgaW50ZXJmYWNlcyBhcyByZXNlcnZlZC4gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSBz ZXJpYWwKZGV2aWNlcyBhcmUgdGhlIG9ubHkgaW50ZXJmYWNlcyBleHBvcnRlZCBieSB0aGUgZGV2 aWNlIHdoZXJlIHN1YmNsYXNzCmFuZCBwcm90b2NvbCBpcyAweDAuCgpRTUkgZXhwb3J0cyB0aGUg c2FtZSBjbGFzcywgc3ViY2xhc3MgYW5kIHByb3RvY29sIHZhbHVlcyBhcyB0aGUgZGlhZwppbnRl cmZhY2UuIEhvd2V2ZXIsIHRoZSB0d28gaW50ZXJmYWNlcyBoYXZlIGRpZmZlcmVudCBudW1iZXIg b2YKZW5kcG9pbnRzLCBRTUkgaGFzIHRocmVlIGFuZCBkaWFnIHR3by4gSSBoYXZlIGFkZGVkIGEg Y2hlY2sgZm9yIG51bWJlcgpvZiBpbnRlcmZhY2VzIGlmIFZJRC9QSUQgbWF0Y2hlcyB0aGUgRVAw NiwgYW5kIHdlIGlnbm9yZSB0aGUgZGV2aWNlIGlmCm51bWJlciBvZiBpbnRlcmZhY2VzIGVxdWFs cyB0aHJlZSAoYW5kIHN1YmNsYXNzIGlzIHNldCkuCgpTaWduZWQtb2ZmLWJ5OiBLcmlzdGlhbiBF dmVuc2VuIDxrcmlzdGlhbi5ldmVuc2VuQGdtYWlsLmNvbT4KQWNrZWQtYnk6IERhbiBXaWxsaWFt cyA8ZGNid0ByZWRoYXQuY29tPgpbIGpvaGFuOiBkcm9wIHVuZWVkZWQgUlNWRCg1KSBmb3IgQURC IF0KQ2M6IHN0YWJsZSA8c3RhYmxlQHZnZXIua2VybmVsLm9yZz4KU2lnbmVkLW9mZi1ieTogSm9o YW4gSG92b2xkIDxqb2hhbkBrZXJuZWwub3JnPgotLS0KIGRyaXZlcnMvdXNiL3NlcmlhbC9vcHRp b24uYyB8IDE4ICsrKysrKysrKysrKysrKystLQogMSBmaWxlIGNoYW5nZWQsIDE2IGluc2VydGlv bnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29w dGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IDAyMTViNzBjNGVmYy4u MzgyZmVhZmJkMTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysr IGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC0xMDgxLDggKzEwODEsOSBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgb3B0aW9uX2lkc1tdID0gewogCSAgLmRyaXZl cl9pbmZvID0gUlNWRCg0KSB9LAogCXsgVVNCX0RFVklDRShRVUVDVEVMX1ZFTkRPUl9JRCwgUVVF Q1RFTF9QUk9EVUNUX0JHOTYpLAogCSAgLmRyaXZlcl9pbmZvID0gUlNWRCg0KSB9LAotCXsgVVNC X0RFVklDRShRVUVDVEVMX1ZFTkRPUl9JRCwgUVVFQ1RFTF9QUk9EVUNUX0VQMDYpLAotCSAgLmRy aXZlcl9pbmZvID0gUlNWRCg0KSB8IFJTVkQoNSkgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVS RkFDRV9JTkZPKFFVRUNURUxfVkVORE9SX0lELCBRVUVDVEVMX1BST0RVQ1RfRVAwNiwgMHhmZiwg MHhmZiwgMHhmZiksCisJICAuZHJpdmVyX2luZm8gPSBSU1ZEKDEpIHwgUlNWRCgyKSB8IFJTVkQo MykgfCBSU1ZEKDQpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhRVUVDVEVM X1ZFTkRPUl9JRCwgUVVFQ1RFTF9QUk9EVUNUX0VQMDYsIDB4ZmYsIDAsIDApIH0sCiAJeyBVU0Jf REVWSUNFKENNT1RFQ0hfVkVORE9SX0lELCBDTU9URUNIX1BST0RVQ1RfNjAwMSkgfSwKIAl7IFVT Ql9ERVZJQ0UoQ01PVEVDSF9WRU5ET1JfSUQsIENNT1RFQ0hfUFJPRFVDVF9DTVVfMzAwKSB9LAog CXsgVVNCX0RFVklDRShDTU9URUNIX1ZFTkRPUl9JRCwgQ01PVEVDSF9QUk9EVUNUXzYwMDMpLApA QCAtMTk4NSw2ICsxOTg2LDcgQEAgc3RhdGljIGludCBvcHRpb25fcHJvYmUoc3RydWN0IHVzYl9z ZXJpYWwgKnNlcmlhbCwKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppZmFj ZV9kZXNjID0KIAkJCQkmc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjOwor CXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKmRldl9kZXNjID0gJnNlcmlhbC0+ZGV2LT5k ZXNjcmlwdG9yOwogCXVuc2lnbmVkIGxvbmcgZGV2aWNlX2ZsYWdzID0gaWQtPmRyaXZlcl9pbmZv OwogCiAJLyogTmV2ZXIgYmluZCB0byB0aGUgQ0QtUm9tIGVtdWxhdGlvbiBpbnRlcmZhY2UJKi8K QEAgLTE5OTksNiArMjAwMSwxOCBAQCBzdGF0aWMgaW50IG9wdGlvbl9wcm9iZShzdHJ1Y3QgdXNi X3NlcmlhbCAqc2VyaWFsLAogCWlmIChkZXZpY2VfZmxhZ3MgJiBSU1ZEKGlmYWNlX2Rlc2MtPmJJ bnRlcmZhY2VOdW1iZXIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qCisJICogRG9uJ3QgYmlu ZCB0byB0aGUgUU1JIGRldmljZSBvZiB0aGUgUXVlY3RlbCBFUDA2L0VHMDYvRU0wNi4gQ2xhc3Ms CisJICogc3ViY2xhc3MgYW5kIHByb3RvY29sIGlzIDB4ZmYgZm9yIGJvdGggdGhlIGRpYWdub3N0 aWMgcG9ydCBhbmQgdGhlCisJICogUU1JIGludGVyZmFjZSwgYnV0IHRoZSBkaWFnbm9zdGljIHBv cnQgb25seSBoYXMgdHdvIGVuZHBvaW50cyAoUU1JCisJICogaGFzIHRocmVlKS4KKwkgKi8KKwlp ZiAoZGV2X2Rlc2MtPmlkVmVuZG9yID09IGNwdV90b19sZTE2KFFVRUNURUxfVkVORE9SX0lEKSAm JgorCSAgICBkZXZfZGVzYy0+aWRQcm9kdWN0ID09IGNwdV90b19sZTE2KFFVRUNURUxfUFJPRFVD VF9FUDA2KSAmJgorCSAgICBpZmFjZV9kZXNjLT5iSW50ZXJmYWNlU3ViQ2xhc3MgJiYgaWZhY2Vf ZGVzYy0+Yk51bUVuZHBvaW50cyA9PSAzKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCS8q IFN0b3JlIHRoZSBkZXZpY2UgZmxhZ3Mgc28gd2UgY2FuIHVzZSB0aGVtIGR1cmluZyBhdHRhY2gu ICovCiAJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsICh2b2lkICopZGV2aWNlX2ZsYWdzKTsK IAo= 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=-2.9 required=3.0 tests=DKIM_SIGNED, MAILING_LIST_MULTI,SPF_PASS,T_DKIM_INVALID,USER_AGENT_GIT 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 B403BC04ABB for ; Thu, 13 Sep 2018 09:22:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5AD1520854 for ; Thu, 13 Sep 2018 09:22:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="uFgei6WY" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5AD1520854 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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 S1727628AbeIMOam (ORCPT ); Thu, 13 Sep 2018 10:30:42 -0400 Received: from mail-lj1-f196.google.com ([209.85.208.196]:46374 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726509AbeIMOam (ORCPT ); Thu, 13 Sep 2018 10:30:42 -0400 Received: by mail-lj1-f196.google.com with SMTP id 203-v6so3992488ljj.13; Thu, 13 Sep 2018 02:22:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NvyjQMihlUHdoi57V5s5noOvDcWJQCxt1PQLEaYWtY4=; b=uFgei6WYWCBvEkcQtVweGI0aitdAe5azgluUXyyGcsb1/HlCD99vwTl5DyYWaq2DRQ zAoUUA3Jo7RDb5J2aD2UF+l4qN+Zw1KKd0WiZ5+V1GNsYETrTaoM3/15rWJG0AKuFMrB 4T44J/pCqIDsphbE2x8XVIKxUrMEahyGRGUL+uql9verBBH9iWcbsOjyM5Bf/cZOKsU2 sU3mN2FBWzsT7AcgJNd0etHOhygzwn9SyJBzBm7uPGXC2/gDXdGN0tfYpSNt8wEeb9HT wZ4apRf3MFOdwC0z4XoZ02M37Zt7rABt7wF5oRGlgIqKJO5mDFSq9PasxX1ReBhCroef gc5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=NvyjQMihlUHdoi57V5s5noOvDcWJQCxt1PQLEaYWtY4=; b=OcV8ka5ETdZkGnegngR9hHEdVtpLwYd3ZwbPd6NtQWLlq0PhOwiQpaW/Ll+I+gqrtC up6wVEPnVY3PcQdUKNizWLYz43KdT/5IgOG8KtaE49oGhRpUrHk1Kd4jlZXhxun8DD+x g6UQ/TVPUlEhzMRHbO06RSsdlJUNdOC42ICctsokSmTBpi0iR1N7r0MTZexm7xegSzJV s8OV7S3/kaFG/6ZOVRWMrpcCqnHIVhlLgQAHHkQxubRkRBwXgvzwRZ68C64XeP3eXZJJ TdBBkg+XgiayF2u2BNrohmAvCt4EnNGxoxP3lhw504Dr9Fzrf0wdrbfreRicmlab5yNi GzOQ== X-Gm-Message-State: APzg51B/nA+VIsjrObankItPyts56JTBcNNljeSJ5sJw74P7LW7uKZMR w7SZZ93fkMA48Ukfo0FyR54= X-Google-Smtp-Source: ANB0Vdasamz84fHVn4cizh9CFNDuPxuKhuKGuujbRjSu8iPlLBxPbfGbekHA0KxgV//LpGjHAyv8eQ== X-Received: by 2002:a2e:947:: with SMTP id 68-v6mr3766863ljj.1.1536830521359; Thu, 13 Sep 2018 02:22:01 -0700 (PDT) Received: from xi.terra (c-74bee655.07-184-6d6c6d4.bbcust.telenor.se. [85.230.190.116]) by smtp.gmail.com with ESMTPSA id m11-v6sm604363lfk.70.2018.09.13.02.22.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Sep 2018 02:22:00 -0700 (PDT) Received: from johan by xi.terra with local (Exim 4.91) (envelope-from ) id 1g0Np3-0000DA-Fv; Thu, 13 Sep 2018 11:22:01 +0200 From: Johan Hovold To: Kristian Evensen Cc: linux-usb@vger.kernel.org, =?UTF-8?q?Bj=C3=B8rn=20Mork?= , Dan Williams , Lars Melin , linux-kernel@vger.kernel.org, stable , Johan Hovold Subject: [PATCH 1/2] USB: serial: option: improve Quectel EP06 detection Date: Thu, 13 Sep 2018 11:21:49 +0200 Message-Id: <20180913092152.770-1-johan@kernel.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180913091753.GA3443@localhost> References: <20180913091753.GA3443@localhost> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Kristian Evensen 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). Signed-off-by: Kristian Evensen Acked-by: Dan Williams [ johan: drop uneeded RSVD(5) for ADB ] Cc: stable Signed-off-by: Johan Hovold --- drivers/usb/serial/option.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 0215b70c4efc..382feafbd127 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) }, + { 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,18 @@ 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); -- 2.19.0