diff options
Diffstat (limited to 'freed-ora/current/f16/net-qmi_wwan-fix-Gobi-device-probing.patch')
-rw-r--r-- | freed-ora/current/f16/net-qmi_wwan-fix-Gobi-device-probing.patch | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/freed-ora/current/f16/net-qmi_wwan-fix-Gobi-device-probing.patch b/freed-ora/current/f16/net-qmi_wwan-fix-Gobi-device-probing.patch new file mode 100644 index 000000000..9dce14f4a --- /dev/null +++ b/freed-ora/current/f16/net-qmi_wwan-fix-Gobi-device-probing.patch @@ -0,0 +1,194 @@ +From b9f90eb2740203ff2592efe640409ad48335d1c2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no> +Date: Thu, 21 Jun 2012 02:45:58 +0000 +Subject: [PATCH] net: qmi_wwan: fix Gobi device probing +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Ignoring interfaces with additional descriptors is not a reliable +method for locating the correct interface on Gobi devices. There +is at least one device where this method fails: +https://bbs.archlinux.org/viewtopic.php?id=143506 + +The result is that the AT command port (interface #2) is hidden +from qcserial, preventing traditional serial modem usage: + +[ 15.562552] qmi_wwan 4-1.6:1.0: cdc-wdm0: USB WDM device +[ 15.562691] qmi_wwan 4-1.6:1.0: wwan0: register 'qmi_wwan' at usb-0000:00:1d.0-1.6, Qualcomm Gobi wwan/QMI device, 1e:df:3c:3a:4e:3b +[ 15.563383] qmi_wwan: probe of 4-1.6:1.1 failed with error -22 +[ 15.564189] qmi_wwan 4-1.6:1.2: cdc-wdm1: USB WDM device +[ 15.564302] qmi_wwan 4-1.6:1.2: wwan1: register 'qmi_wwan' at usb-0000:00:1d.0-1.6, Qualcomm Gobi wwan/QMI device, 1e:df:3c:3a:4e:3b +[ 15.564328] qmi_wwan: probe of 4-1.6:1.3 failed with error -22 +[ 15.569376] qcserial 4-1.6:1.1: Qualcomm USB modem converter detected +[ 15.569440] usb 4-1.6: Qualcomm USB modem converter now attached to ttyUSB0 +[ 15.570372] qcserial 4-1.6:1.3: Qualcomm USB modem converter detected +[ 15.570430] usb 4-1.6: Qualcomm USB modem converter now attached to ttyUSB1 + +Use static interface numbers taken from the interface map in +qcserial for all Gobi devices instead: + + Gobi 1K USB layout: + 0: serial port (doesn't respond) + 1: serial port (doesn't respond) + 2: AT-capable modem port + 3: QMI/net + + Gobi 2K+ USB layout: + 0: QMI/net + 1: DM/DIAG (use libqcdm from ModemManager for communication) + 2: AT-capable modem port + 3: NMEA + +This should be more reliable over all, and will also prevent the +noisy "probe failed" messages. The whitelisting logic is expected +to be replaced by direct interface number matching in 3.6. + +Reported-by: Heinrich Siebmanns (Harvey) <H.Siebmanns@t-online.de> +Cc: <stable@vger.kernel.org> # v3.4: 0000188 USB: qmi_wwan: Make forced int 4 whitelist generic +Cc: <stable@vger.kernel.org> # v3.4: f7142e6 USB: qmi_wwan: Add ZTE (Vodafone) K3520-Z +Cc: <stable@vger.kernel.org> # v3.4 +Signed-off-by: Bjørn Mork <bjorn@mork.no> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/usb/qmi_wwan.c | 83 +++++++++++++++++++++----------------------- + 1 file changed, 40 insertions(+), 43 deletions(-) + +diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c +index 3b20678..3767a12 100644 +--- a/drivers/net/usb/qmi_wwan.c ++++ b/drivers/net/usb/qmi_wwan.c +@@ -257,29 +257,6 @@ err: + return rv; + } + +-/* Gobi devices uses identical class/protocol codes for all interfaces regardless +- * of function. Some of these are CDC ACM like and have the exact same endpoints +- * we are looking for. This leaves two possible strategies for identifying the +- * correct interface: +- * a) hardcoding interface number, or +- * b) use the fact that the wwan interface is the only one lacking additional +- * (CDC functional) descriptors +- * +- * Let's see if we can get away with the generic b) solution. +- */ +-static int qmi_wwan_bind_gobi(struct usbnet *dev, struct usb_interface *intf) +-{ +- int rv = -EINVAL; +- +- /* ignore any interface with additional descriptors */ +- if (intf->cur_altsetting->extralen) +- goto err; +- +- rv = qmi_wwan_bind_shared(dev, intf); +-err: +- return rv; +-} +- + static void qmi_wwan_unbind_shared(struct usbnet *dev, struct usb_interface *intf) + { + struct usb_driver *subdriver = (void *)dev->data[0]; +@@ -347,15 +324,15 @@ static const struct driver_info qmi_wwan_shared = { + .manage_power = qmi_wwan_manage_power, + }; + +-static const struct driver_info qmi_wwan_gobi = { +- .description = "Qualcomm Gobi wwan/QMI device", ++static const struct driver_info qmi_wwan_force_int0 = { ++ .description = "Qualcomm WWAN/QMI device", + .flags = FLAG_WWAN, +- .bind = qmi_wwan_bind_gobi, ++ .bind = qmi_wwan_bind_shared, + .unbind = qmi_wwan_unbind_shared, + .manage_power = qmi_wwan_manage_power, ++ .data = BIT(0), /* interface whitelist bitmap */ + }; + +-/* ZTE suck at making USB descriptors */ + static const struct driver_info qmi_wwan_force_int1 = { + .description = "Qualcomm WWAN/QMI device", + .flags = FLAG_WWAN, +@@ -365,6 +342,15 @@ static const struct driver_info qmi_wwan_force_int1 = { + .data = BIT(1), /* interface whitelist bitmap */ + }; + ++static const struct driver_info qmi_wwan_force_int3 = { ++ .description = "Qualcomm WWAN/QMI device", ++ .flags = FLAG_WWAN, ++ .bind = qmi_wwan_bind_shared, ++ .unbind = qmi_wwan_unbind_shared, ++ .manage_power = qmi_wwan_manage_power, ++ .data = BIT(3), /* interface whitelist bitmap */ ++}; ++ + static const struct driver_info qmi_wwan_force_int4 = { + .description = "Qualcomm WWAN/QMI device", + .flags = FLAG_WWAN, +@@ -390,16 +376,23 @@ static const struct driver_info qmi_wwan_force_int4 = { + static const struct driver_info qmi_wwan_sierra = { + .description = "Sierra Wireless wwan/QMI device", + .flags = FLAG_WWAN, +- .bind = qmi_wwan_bind_gobi, ++ .bind = qmi_wwan_bind_shared, + .unbind = qmi_wwan_unbind_shared, + .manage_power = qmi_wwan_manage_power, + .data = BIT(8) | BIT(19), /* interface whitelist bitmap */ + }; + + #define HUAWEI_VENDOR_ID 0x12D1 ++ ++/* Gobi 1000 QMI/wwan interface number is 3 according to qcserial */ ++#define QMI_GOBI1K_DEVICE(vend, prod) \ ++ USB_DEVICE(vend, prod), \ ++ .driver_info = (unsigned long)&qmi_wwan_force_int3 ++ ++/* Gobi 2000 and Gobi 3000 QMI/wwan interface number is 0 according to qcserial */ + #define QMI_GOBI_DEVICE(vend, prod) \ + USB_DEVICE(vend, prod), \ +- .driver_info = (unsigned long)&qmi_wwan_gobi ++ .driver_info = (unsigned long)&qmi_wwan_force_int0 + + static const struct usb_device_id products[] = { + { /* Huawei E392, E398 and possibly others sharing both device id and more... */ +@@ -510,20 +503,24 @@ static const struct usb_device_id products[] = { + .bInterfaceProtocol = 0xff, + .driver_info = (unsigned long)&qmi_wwan_sierra, + }, +- {QMI_GOBI_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ +- {QMI_GOBI_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ +- {QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ +- {QMI_GOBI_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ +- {QMI_GOBI_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ ++ ++ /* Gobi 1000 devices */ ++ {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ ++ {QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ ++ {QMI_GOBI1K_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ ++ {QMI_GOBI1K_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ ++ {QMI_GOBI1K_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ ++ ++ /* Gobi 2000 and 3000 devices */ + {QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ + {QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */ + {QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */ +-- +1.7.10.2 + |