Home Home > GIT Browse > SLE12-SP4
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2019-10-11 16:00:42 +0200
committerJiri Slaby <jslaby@suse.cz>2019-10-16 10:57:23 +0200
commite5d56481c2f705c964c98c46fa036abee4cdebc6 (patch)
tree7f2459ca709e8904568f7fb7f4a26849677ca3c5
parent4c3c2e39d07daaaf929425adc434edd6f4747d3b (diff)
cdc_ether: fix rndis support for Mediatek based smartphones
(networking-stable-19_09_15).
-rw-r--r--patches.suse/cdc_ether-fix-rndis-support-for-Mediatek-based-smart.patch104
-rw-r--r--series.conf1
2 files changed, 105 insertions, 0 deletions
diff --git a/patches.suse/cdc_ether-fix-rndis-support-for-Mediatek-based-smart.patch b/patches.suse/cdc_ether-fix-rndis-support-for-Mediatek-based-smart.patch
new file mode 100644
index 0000000000..cde0393ed3
--- /dev/null
+++ b/patches.suse/cdc_ether-fix-rndis-support-for-Mediatek-based-smart.patch
@@ -0,0 +1,104 @@
+From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no>
+Date: Thu, 12 Sep 2019 10:42:00 +0200
+Subject: cdc_ether: fix rndis support for Mediatek based smartphones
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+Git-commit: 4d7ffcf3bf1be98d876c570cab8fc31d9fa92725
+Patch-mainline: 5.3
+References: networking-stable-19_09_15
+
+A Mediatek based smartphone owner reports problems with USB
+tethering in Linux. The verbose USB listing shows a rndis_host
+interface pair (e0/01/03 + 10/00/00), but the driver fails to
+bind with
+
+[ 355.960428] usb 1-4: bad CDC descriptors
+
+The problem is a failsafe test intended to filter out ACM serial
+functions using the same 02/02/ff class/subclass/protocol as RNDIS.
+The serial functions are recognized by their non-zero bmCapabilities.
+
+No RNDIS function with non-zero bmCapabilities were known at the time
+this failsafe was added. But it turns out that some Wireless class
+RNDIS functions are using the bmCapabilities field. These functions
+are uniquely identified as RNDIS by their class/subclass/protocol, so
+the failing test can safely be disabled. The same applies to the two
+types of Misc class RNDIS functions.
+
+Applying the failsafe to Communication class functions only retains
+the original functionality, and fixes the problem for the Mediatek based
+smartphone.
+
+Tow examples of CDC functional descriptors with non-zero bmCapabilities
+from Wireless class RNDIS functions are:
+
+0e8d:000a Mediatek Crosscall Spider X5 3G Phone
+
+ CDC Header:
+ bcdCDC 1.10
+ CDC ACM:
+ bmCapabilities 0x0f
+ connection notifications
+ sends break
+ line coding and serial state
+ get/set/clear comm features
+ CDC Union:
+ bMasterInterface 0
+ bSlaveInterface 1
+ CDC Call Management:
+ bmCapabilities 0x03
+ call management
+ use DataInterface
+ bDataInterface 1
+
+and
+
+19d2:1023 ZTE K4201-z
+
+ CDC Header:
+ bcdCDC 1.10
+ CDC ACM:
+ bmCapabilities 0x02
+ line coding and serial state
+ CDC Call Management:
+ bmCapabilities 0x03
+ call management
+ use DataInterface
+ bDataInterface 1
+ CDC Union:
+ bMasterInterface 0
+ bSlaveInterface 1
+
+The Mediatek example is believed to apply to most smartphones with
+Mediatek firmware. The ZTE example is most likely also part of a larger
+family of devices/firmwares.
+
+Suggested-by: Lars Melin <larsm17@gmail.com>
+Signed-off-by: Bjørn Mork <bjorn@mork.no>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+---
+ drivers/net/usb/cdc_ether.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/usb/cdc_ether.c
++++ b/drivers/net/usb/cdc_ether.c
+@@ -212,8 +212,15 @@ int usbnet_generic_cdc_bind(struct usbne
+ goto bad_desc;
+ }
+ skip:
+- if ( rndis &&
+- header.usb_cdc_acm_descriptor &&
++ /* Communcation class functions with bmCapabilities are not
++ * RNDIS. But some Wireless class RNDIS functions use
++ * bmCapabilities for their own purpose. The failsafe is
++ * therefore applied only to Communication class RNDIS
++ * functions. The rndis test is redundant, but a cheap
++ * optimization.
++ */
++ if (rndis && is_rndis(&intf->cur_altsetting->desc) &&
++ header.usb_cdc_acm_descriptor &&
+ header.usb_cdc_acm_descriptor->bmCapabilities) {
+ dev_dbg(&intf->dev,
+ "ACM capabilities %02x, not really RNDIS?\n",
diff --git a/series.conf b/series.conf
index fd51518327..f7f6a8679b 100644
--- a/series.conf
+++ b/series.conf
@@ -24553,6 +24553,7 @@
patches.suse/ipv6-Fix-the-link-time-qualifier-of-ping_v6_proc_exi.patch
patches.suse/net-Fix-null-de-reference-of-device-refcount.patch
patches.suse/sctp-Fix-the-link-time-qualifier-of-sctp_ctrlsock_ex.patch
+ patches.suse/cdc_ether-fix-rndis-support-for-Mediatek-based-smart.patch
patches.suse/tpm_tis_core-Set-TPM_CHIP_FLAG_IRQ-before-probing-fo.patch
patches.suse/edac-amd64-decode-syndrome-before-translating-address.patch
patches.suse/hwmon-lm75-Fix-write-operations-for-negative-tempera.patch