From: Greg Kroah-Hartman Date: Wed, 3 Oct 2012 19:55:58 +0000 (-0700) Subject: 3.5-stable patches X-Git-Tag: v3.0.45~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dd96d2a58c2a1096357af86d4ecf15e155f0e5cd;p=thirdparty%2Fkernel%2Fstable-queue.git 3.5-stable patches added patches: usb-ftdi_sio-add-tiao-usb-multi-protocol-adapter-tumpa-support.patch usb-gadget-initialize-the-strings-in-tcm_usb_gadget-properly.patch usb-gadget-make-g_printer-enumerate-again.patch usb-host-xhci-fix-null-pointer-dereferencing-with-71c731a-for-non-x86-systems.patch usb-option-blacklist-qmi-interface-on-zte-mf683.patch usb-qcaux-add-pantech-vendor-class-match.patch usb-serial-fix-up-bug-with-missing.patch --- diff --git a/queue-3.5/series b/queue-3.5/series index 375bd0b832a..01a1081bc33 100644 --- a/queue-3.5/series +++ b/queue-3.5/series @@ -3,3 +3,10 @@ dm-mpath-only-retry-ioctl-when-no-paths-if-queue_if_no_path-set.patch dm-handle-requests-beyond-end-of-device-instead-of-using-bug_on.patch dm-table-clear-add_random-unless-all-devices-have-it-set.patch dm-verity-fix-overflow-check.patch +usb-gadget-make-g_printer-enumerate-again.patch +usb-gadget-initialize-the-strings-in-tcm_usb_gadget-properly.patch +usb-option-blacklist-qmi-interface-on-zte-mf683.patch +usb-ftdi_sio-add-tiao-usb-multi-protocol-adapter-tumpa-support.patch +usb-qcaux-add-pantech-vendor-class-match.patch +usb-host-xhci-fix-null-pointer-dereferencing-with-71c731a-for-non-x86-systems.patch +usb-serial-fix-up-bug-with-missing.patch diff --git a/queue-3.5/usb-ftdi_sio-add-tiao-usb-multi-protocol-adapter-tumpa-support.patch b/queue-3.5/usb-ftdi_sio-add-tiao-usb-multi-protocol-adapter-tumpa-support.patch new file mode 100644 index 00000000000..086353a9fa6 --- /dev/null +++ b/queue-3.5/usb-ftdi_sio-add-tiao-usb-multi-protocol-adapter-tumpa-support.patch @@ -0,0 +1,54 @@ +From 54575b05af36959dfb6a49a3e9ca0c2b456b7126 Mon Sep 17 00:00:00 2001 +From: Antonio Ospite +Date: Sun, 23 Sep 2012 09:57:25 +0200 +Subject: USB: ftdi_sio: add TIAO USB Multi-Protocol Adapter (TUMPA) support + +From: Antonio Ospite + +commit 54575b05af36959dfb6a49a3e9ca0c2b456b7126 upstream. + +TIAO/DIYGADGET USB Multi-Protocol Adapter (TUMPA) is an FTDI FT2232H +based device which provides an easily accessible JTAG, SPI, I2C, serial +breakout. + +http://www.diygadget.com/tiao-usb-multi-protocol-adapter-jtag-spi-i2c-serial.html +http://www.tiaowiki.com/w/TIAO_USB_Multi_Protocol_Adapter_User%27s_Manual + +FTDI FT2232H provides two serial channels (A and B), but on the TUMPA +channel A is dedicated to JTAG/SPI while channel B can be used for +UART/RS-232: use the ftdi_jtag_quirk to expose only channel B as +a usb-serial interface to userspace. + +Signed-off-by: Antonio Ospite +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 2 ++ + drivers/usb/serial/ftdi_sio_ids.h | 5 +++++ + 2 files changed, 7 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -584,6 +584,8 @@ static struct usb_device_id id_table_com + { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) }, ++ { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID), ++ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + /* + * ELV devices: + */ +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -517,6 +517,11 @@ + */ + #define FTDI_TAVIR_STK500_PID 0xFA33 /* STK500 AVR programmer */ + ++/* ++ * TIAO product ids (FTDI_VID) ++ * http://www.tiaowiki.com/w/Main_Page ++ */ ++#define FTDI_TIAO_UMPA_PID 0x8a98 /* TIAO/DIYGADGET USB Multi-Protocol Adapter */ + + + /********************************/ diff --git a/queue-3.5/usb-gadget-initialize-the-strings-in-tcm_usb_gadget-properly.patch b/queue-3.5/usb-gadget-initialize-the-strings-in-tcm_usb_gadget-properly.patch new file mode 100644 index 00000000000..e9d765a23c2 --- /dev/null +++ b/queue-3.5/usb-gadget-initialize-the-strings-in-tcm_usb_gadget-properly.patch @@ -0,0 +1,126 @@ +From 18786da4853017d983ff6911648543ca617c12d1 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 6 Sep 2012 20:11:18 +0200 +Subject: usb: gadget: initialize the strings in tcm_usb_gadget properly + +From: Sebastian Andrzej Siewior + +commit 18786da4853017d983ff6911648543ca617c12d1 upstream. + +I have no idea what I've been thinking while I was doing this in the first +place. Now the strings are initialized properly and reported by lsusb. + +Acked-by: Michal Nazarewicz +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/gadget/tcm_usb_gadget.c | 33 ++++++++++++++++++++------------- + drivers/usb/gadget/tcm_usb_gadget.h | 14 ++++++++------ + 2 files changed, 28 insertions(+), 19 deletions(-) + +--- a/drivers/usb/gadget/tcm_usb_gadget.c ++++ b/drivers/usb/gadget/tcm_usb_gadget.c +@@ -1983,7 +1983,6 @@ static struct usb_interface_descriptor b + .bInterfaceClass = USB_CLASS_MASS_STORAGE, + .bInterfaceSubClass = USB_SC_SCSI, + .bInterfaceProtocol = USB_PR_BULK, +- .iInterface = USB_G_STR_INT_UAS, + }; + + static struct usb_interface_descriptor uasp_intf_desc = { +@@ -1994,7 +1993,6 @@ static struct usb_interface_descriptor u + .bInterfaceClass = USB_CLASS_MASS_STORAGE, + .bInterfaceSubClass = USB_SC_SCSI, + .bInterfaceProtocol = USB_PR_UAS, +- .iInterface = USB_G_STR_INT_BBB, + }; + + static struct usb_endpoint_descriptor uasp_bi_desc = { +@@ -2215,20 +2213,16 @@ static struct usb_device_descriptor usbg + .bDeviceClass = USB_CLASS_PER_INTERFACE, + .idVendor = cpu_to_le16(UAS_VENDOR_ID), + .idProduct = cpu_to_le16(UAS_PRODUCT_ID), +- .iManufacturer = USB_G_STR_MANUFACTOR, +- .iProduct = USB_G_STR_PRODUCT, +- .iSerialNumber = USB_G_STR_SERIAL, +- + .bNumConfigurations = 1, + }; + + static struct usb_string usbg_us_strings[] = { +- { USB_G_STR_MANUFACTOR, "Target Manufactor"}, +- { USB_G_STR_PRODUCT, "Target Product"}, +- { USB_G_STR_SERIAL, "000000000001"}, +- { USB_G_STR_CONFIG, "default config"}, +- { USB_G_STR_INT_UAS, "USB Attached SCSI"}, +- { USB_G_STR_INT_BBB, "Bulk Only Transport"}, ++ [USB_G_STR_MANUFACTOR].s = "Target Manufactor", ++ [USB_G_STR_PRODUCT].s = "Target Product", ++ [USB_G_STR_SERIAL].s = "000000000001", ++ [USB_G_STR_CONFIG].s = "default config", ++ [USB_G_STR_INT_UAS].s = "USB Attached SCSI", ++ [USB_G_STR_INT_BBB].s = "Bulk Only Transport", + { }, + }; + +@@ -2250,7 +2244,6 @@ static int guas_unbind(struct usb_compos + static struct usb_configuration usbg_config_driver = { + .label = "Linux Target", + .bConfigurationValue = 1, +- .iConfiguration = USB_G_STR_CONFIG, + .bmAttributes = USB_CONFIG_ATT_SELFPOWER, + }; + +@@ -2423,6 +2416,9 @@ static int usbg_cfg_bind(struct usb_conf + fu->function.disable = usbg_disable; + fu->tpg = the_only_tpg_I_currently_have; + ++ bot_intf_desc.iInterface = usbg_us_strings[USB_G_STR_INT_BBB].id; ++ uasp_intf_desc.iInterface = usbg_us_strings[USB_G_STR_INT_UAS].id; ++ + ret = usb_add_function(c, &fu->function); + if (ret) + goto err; +@@ -2437,6 +2433,17 @@ static int usb_target_bind(struct usb_co + { + int ret; + ++ ret = usb_string_ids_tab(cdev, usbg_us_strings); ++ if (ret) ++ return ret; ++ ++ usbg_device_desc.iManufacturer = ++ usbg_us_strings[USB_G_STR_MANUFACTOR].id; ++ usbg_device_desc.iProduct = usbg_us_strings[USB_G_STR_PRODUCT].id; ++ usbg_device_desc.iSerialNumber = usbg_us_strings[USB_G_STR_SERIAL].id; ++ usbg_config_driver.iConfiguration = ++ usbg_us_strings[USB_G_STR_CONFIG].id; ++ + ret = usb_add_config(cdev, &usbg_config_driver, + usbg_cfg_bind); + return 0; +--- a/drivers/usb/gadget/tcm_usb_gadget.h ++++ b/drivers/usb/gadget/tcm_usb_gadget.h +@@ -16,12 +16,14 @@ + #define UASP_SS_EP_COMP_LOG_STREAMS 4 + #define UASP_SS_EP_COMP_NUM_STREAMS (1 << UASP_SS_EP_COMP_LOG_STREAMS) + +-#define USB_G_STR_MANUFACTOR 1 +-#define USB_G_STR_PRODUCT 2 +-#define USB_G_STR_SERIAL 3 +-#define USB_G_STR_CONFIG 4 +-#define USB_G_STR_INT_UAS 5 +-#define USB_G_STR_INT_BBB 6 ++enum { ++ USB_G_STR_MANUFACTOR, ++ USB_G_STR_PRODUCT, ++ USB_G_STR_SERIAL, ++ USB_G_STR_CONFIG, ++ USB_G_STR_INT_UAS, ++ USB_G_STR_INT_BBB, ++}; + + #define USB_G_ALT_INT_BBB 0 + #define USB_G_ALT_INT_UAS 1 diff --git a/queue-3.5/usb-gadget-make-g_printer-enumerate-again.patch b/queue-3.5/usb-gadget-make-g_printer-enumerate-again.patch new file mode 100644 index 00000000000..6bf60d6de85 --- /dev/null +++ b/queue-3.5/usb-gadget-make-g_printer-enumerate-again.patch @@ -0,0 +1,278 @@ +From 5a175bb84d7344fbe5e26cf61b597129e7c80564 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 6 Sep 2012 20:11:17 +0200 +Subject: usb: gadget: make g_printer enumerate again + +From: Sebastian Andrzej Siewior + +commit 5a175bb84d7344fbe5e26cf61b597129e7c80564 upstream. + +This was broken in 2e87edf49 ("usb: gadget: make g_printer use +composite"). +The USB-strings were not setup properly and were not used. No function +was added which results in an empty USB config. +While fixing this, the interface number is now auto generated and not +hard coded to 0. + +Acked-by: Michal Nazarewicz +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/gadget/printer.c | 128 +++++++++++++++++++++---------------------- + 1 file changed, 65 insertions(+), 63 deletions(-) + +--- a/drivers/usb/gadget/printer.c ++++ b/drivers/usb/gadget/printer.c +@@ -141,18 +141,14 @@ module_param(qlen, uint, S_IRUGO|S_IWUSR + * descriptors are built on demand. + */ + +-#define STRING_MANUFACTURER 1 +-#define STRING_PRODUCT 2 +-#define STRING_SERIALNUM 3 ++#define STRING_MANUFACTURER 0 ++#define STRING_PRODUCT 1 ++#define STRING_SERIALNUM 2 + + /* holds our biggest descriptor */ + #define USB_DESC_BUFSIZE 256 + #define USB_BUFSIZE 8192 + +-/* This device advertises one configuration. */ +-#define DEV_CONFIG_VALUE 1 +-#define PRINTER_INTERFACE 0 +- + static struct usb_device_descriptor device_desc = { + .bLength = sizeof device_desc, + .bDescriptorType = USB_DT_DEVICE, +@@ -162,16 +158,12 @@ static struct usb_device_descriptor devi + .bDeviceProtocol = 0, + .idVendor = cpu_to_le16(PRINTER_VENDOR_NUM), + .idProduct = cpu_to_le16(PRINTER_PRODUCT_NUM), +- .iManufacturer = STRING_MANUFACTURER, +- .iProduct = STRING_PRODUCT, +- .iSerialNumber = STRING_SERIALNUM, + .bNumConfigurations = 1 + }; + + static struct usb_interface_descriptor intf_desc = { + .bLength = sizeof intf_desc, + .bDescriptorType = USB_DT_INTERFACE, +- .bInterfaceNumber = PRINTER_INTERFACE, + .bNumEndpoints = 2, + .bInterfaceClass = USB_CLASS_PRINTER, + .bInterfaceSubClass = 1, /* Printer Sub-Class */ +@@ -260,9 +252,9 @@ static char pnp_string [1024] = + + /* static strings, in UTF-8 */ + static struct usb_string strings [] = { +- { STRING_MANUFACTURER, manufacturer, }, +- { STRING_PRODUCT, product_desc, }, +- { STRING_SERIALNUM, serial_num, }, ++ [STRING_MANUFACTURER].s = manufacturer, ++ [STRING_PRODUCT].s = product_desc, ++ [STRING_SERIALNUM].s = serial_num, + { } /* end of list */ + }; + +@@ -871,25 +863,13 @@ static int set_interface(struct printer_ + int result = 0; + + /* Free the current interface */ +- switch (dev->interface) { +- case PRINTER_INTERFACE: +- printer_reset_interface(dev); +- break; +- } ++ printer_reset_interface(dev); + +- switch (number) { +- case PRINTER_INTERFACE: +- result = set_printer_interface(dev); +- if (result) { +- printer_reset_interface(dev); +- } else { +- dev->interface = PRINTER_INTERFACE; +- } +- break; +- default: +- result = -EINVAL; +- /* FALL THROUGH */ +- } ++ result = set_printer_interface(dev); ++ if (result) ++ printer_reset_interface(dev); ++ else ++ dev->interface = number; + + if (!result) + INFO(dev, "Using interface %x\n", number); +@@ -972,7 +952,7 @@ static int printer_func_setup(struct usb + switch (ctrl->bRequest) { + case 0: /* Get the IEEE-1284 PNP String */ + /* Only one printer interface is supported. */ +- if ((wIndex>>8) != PRINTER_INTERFACE) ++ if ((wIndex>>8) != dev->interface) + break; + + value = (pnp_string[0]<<8)|pnp_string[1]; +@@ -983,7 +963,7 @@ static int printer_func_setup(struct usb + + case 1: /* Get Port Status */ + /* Only one printer interface is supported. */ +- if (wIndex != PRINTER_INTERFACE) ++ if (wIndex != dev->interface) + break; + + *(u8 *)req->buf = dev->printer_status; +@@ -992,7 +972,7 @@ static int printer_func_setup(struct usb + + case 2: /* Soft Reset */ + /* Only one printer interface is supported. */ +- if (wIndex != PRINTER_INTERFACE) ++ if (wIndex != dev->interface) + break; + + printer_soft_reset(dev); +@@ -1020,6 +1000,37 @@ unknown: + static int __init printer_func_bind(struct usb_configuration *c, + struct usb_function *f) + { ++ struct printer_dev *dev = container_of(f, struct printer_dev, function); ++ struct usb_composite_dev *cdev = c->cdev; ++ struct usb_ep *in_ep, *out_ep; ++ int id; ++ ++ id = usb_interface_id(c, f); ++ if (id < 0) ++ return id; ++ intf_desc.bInterfaceNumber = id; ++ ++ /* all we really need is bulk IN/OUT */ ++ in_ep = usb_ep_autoconfig(cdev->gadget, &fs_ep_in_desc); ++ if (!in_ep) { ++autoconf_fail: ++ dev_err(&cdev->gadget->dev, "can't autoconfigure on %s\n", ++ cdev->gadget->name); ++ return -ENODEV; ++ } ++ in_ep->driver_data = in_ep; /* claim */ ++ ++ out_ep = usb_ep_autoconfig(cdev->gadget, &fs_ep_out_desc); ++ if (!out_ep) ++ goto autoconf_fail; ++ out_ep->driver_data = out_ep; /* claim */ ++ ++ /* assumes that all endpoints are dual-speed */ ++ hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; ++ hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; ++ ++ dev->in_ep = in_ep; ++ dev->out_ep = out_ep; + return 0; + } + +@@ -1035,7 +1046,8 @@ static int printer_func_set_alt(struct u + int ret = -ENOTSUPP; + + if (!alt) +- ret = set_interface(dev, PRINTER_INTERFACE); ++ ret = set_interface(dev, intf); ++ + return ret; + } + +@@ -1107,13 +1119,14 @@ static int __init printer_bind_config(st + { + struct usb_gadget *gadget = c->cdev->gadget; + struct printer_dev *dev; +- struct usb_ep *in_ep, *out_ep; + int status = -ENOMEM; + int gcnum; + size_t len; + u32 i; + struct usb_request *req; + ++ usb_ep_autoconfig_reset(gadget); ++ + dev = &usb_printer_gadget; + + dev->function.name = shortname; +@@ -1125,6 +1138,10 @@ static int __init printer_bind_config(st + dev->function.set_alt = printer_func_set_alt; + dev->function.disable = printer_func_disable; + ++ status = usb_add_function(c, &dev->function); ++ if (status) ++ return status; ++ + /* Setup the sysfs files for the printer gadget. */ + dev->pdev = device_create(usb_gadget_class, NULL, g_printer_devno, + NULL, "g_printer"); +@@ -1169,26 +1186,6 @@ static int __init printer_bind_config(st + pnp_string[0] = (len >> 8) & 0xFF; + pnp_string[1] = len & 0xFF; + +- /* all we really need is bulk IN/OUT */ +- usb_ep_autoconfig_reset(gadget); +- in_ep = usb_ep_autoconfig(gadget, &fs_ep_in_desc); +- if (!in_ep) { +-autoconf_fail: +- dev_err(&gadget->dev, "can't autoconfigure on %s\n", +- gadget->name); +- return -ENODEV; +- } +- in_ep->driver_data = in_ep; /* claim */ +- +- out_ep = usb_ep_autoconfig(gadget, &fs_ep_out_desc); +- if (!out_ep) +- goto autoconf_fail; +- out_ep->driver_data = out_ep; /* claim */ +- +- /* assumes that all endpoints are dual-speed */ +- hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; +- hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; +- + usb_gadget_set_selfpowered(gadget); + + if (gadget->is_otg) { +@@ -1215,9 +1212,6 @@ autoconf_fail: + dev->current_rx_bytes = 0; + dev->current_rx_buf = NULL; + +- dev->in_ep = in_ep; +- dev->out_ep = out_ep; +- + for (i = 0; i < QLEN; i++) { + req = printer_req_alloc(dev->in_ep, USB_BUFSIZE, GFP_KERNEL); + if (!req) { +@@ -1250,8 +1244,6 @@ autoconf_fail: + dev->gadget = gadget; + + INFO(dev, "%s, version: " DRIVER_VERSION "\n", driver_desc); +- INFO(dev, "using %s, OUT %s IN %s\n", gadget->name, out_ep->name, +- in_ep->name); + return 0; + + fail: +@@ -1266,7 +1258,17 @@ static int printer_unbind(struct usb_com + + static int __init printer_bind(struct usb_composite_dev *cdev) + { +- return usb_add_config(cdev, &printer_cfg_driver, printer_bind_config); ++ int ret; ++ ++ ret = usb_string_ids_tab(cdev, strings); ++ if (ret < 0) ++ return ret; ++ device_desc.iManufacturer = strings[STRING_MANUFACTURER].id; ++ device_desc.iProduct = strings[STRING_PRODUCT].id; ++ device_desc.iSerialNumber = strings[STRING_SERIALNUM].id; ++ ++ ret = usb_add_config(cdev, &printer_cfg_driver, printer_bind_config); ++ return ret; + } + + static struct usb_composite_driver printer_driver = { diff --git a/queue-3.5/usb-host-xhci-fix-null-pointer-dereferencing-with-71c731a-for-non-x86-systems.patch b/queue-3.5/usb-host-xhci-fix-null-pointer-dereferencing-with-71c731a-for-non-x86-systems.patch new file mode 100644 index 00000000000..0e63f88deab --- /dev/null +++ b/queue-3.5/usb-host-xhci-fix-null-pointer-dereferencing-with-71c731a-for-non-x86-systems.patch @@ -0,0 +1,42 @@ +From 457a73d346187c2cc5d599072f38676f18f130e0 Mon Sep 17 00:00:00 2001 +From: Vivek Gautam +Date: Sat, 22 Sep 2012 18:11:19 +0530 +Subject: usb: host: xhci: Fix Null pointer dereferencing with 71c731a for non-x86 systems + +From: Vivek Gautam + +commit 457a73d346187c2cc5d599072f38676f18f130e0 upstream. + +In 71c731a: usb: host: xhci: Fix Compliance Mode on SN65LVPE502CP Hardware +when extracting DMI strings (vendor or product_name) to mark them as quirk +we may get NULL pointer in case of non-x86 systems which won't define +CONFIG_DMI. Hence susbsequent strstr() calls crash while driver probing. + +So, returning 'false' here in case we get a NULL vendor or product_name. + +This is tested with ARM (exynos) system. + +This patch should be backported to stable kernels as old as 3.6, that +contain the commit 71c731a296f1b08a3724bd1b514b64f1bda87a23 "usb: host: +xhci: Fix Compliance Mode on SN65LVPE502CP Hardware" + +Signed-off-by: Vivek Gautam +Signed-off-by: Sarah Sharp +Reported-by: Sebastian Gottschall (DD-WRT) +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/xhci.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/usb/host/xhci.c ++++ b/drivers/usb/host/xhci.c +@@ -470,6 +470,8 @@ static bool compliance_mode_recovery_tim + + dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME); + dmi_sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR); ++ if (!dmi_product_name || !dmi_sys_vendor) ++ return false; + + if (!(strstr(dmi_sys_vendor, "Hewlett-Packard"))) + return false; diff --git a/queue-3.5/usb-option-blacklist-qmi-interface-on-zte-mf683.patch b/queue-3.5/usb-option-blacklist-qmi-interface-on-zte-mf683.patch new file mode 100644 index 00000000000..b05ab740403 --- /dev/null +++ b/queue-3.5/usb-option-blacklist-qmi-interface-on-zte-mf683.patch @@ -0,0 +1,31 @@ +From 160c9425ac52cb30502be2d9c5e848cec91bb115 Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Wed, 19 Sep 2012 22:02:12 +0200 +Subject: USB: option: blacklist QMI interface on ZTE MF683 + +From: Bjørn Mork + +commit 160c9425ac52cb30502be2d9c5e848cec91bb115 upstream. + +Interface #5 on ZTE MF683 is a QMI/wwan interface. + +Signed-off-by: Bjørn Mork +Cc: Shawn J. Goff +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -870,7 +870,8 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, diff --git a/queue-3.5/usb-qcaux-add-pantech-vendor-class-match.patch b/queue-3.5/usb-qcaux-add-pantech-vendor-class-match.patch new file mode 100644 index 00000000000..cf784dcdcbc --- /dev/null +++ b/queue-3.5/usb-qcaux-add-pantech-vendor-class-match.patch @@ -0,0 +1,49 @@ +From c638eb2872b3af079501e7ee44cbb8a5cce9b4b5 Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Wed, 19 Sep 2012 22:02:03 +0200 +Subject: USB: qcaux: add Pantech vendor class match + +From: Bjørn Mork + +commit c638eb2872b3af079501e7ee44cbb8a5cce9b4b5 upstream. + +The three Pantech devices UML190 (106c:3716), UML290 (106c:3718) and +P4200 (106c:3721) all use the same subclasses to identify vendor +specific functions. Replace the existing device specific entries +with generic vendor matching, adding support for the P4200. + +Signed-off-by: Bjørn Mork +Cc: Thomas Schäfer +Acked-by: Dan Williams +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/qcaux.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +--- a/drivers/usb/serial/qcaux.c ++++ b/drivers/usb/serial/qcaux.c +@@ -36,8 +36,6 @@ + #define UTSTARCOM_PRODUCT_UM175_V1 0x3712 + #define UTSTARCOM_PRODUCT_UM175_V2 0x3714 + #define UTSTARCOM_PRODUCT_UM175_ALLTEL 0x3715 +-#define PANTECH_PRODUCT_UML190_VZW 0x3716 +-#define PANTECH_PRODUCT_UML290_VZW 0x3718 + + /* CMOTECH devices */ + #define CMOTECH_VENDOR_ID 0x16d8 +@@ -68,11 +66,9 @@ static struct usb_device_id id_table[] = + { USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) }, + { USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) }, + { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_U520, 0xff, 0x00, 0x00) }, +- { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xfe, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfd, 0xff) }, /* NMEA */ +- { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfe, 0xff) }, /* WMC */ +- { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xff, 0xff) }, /* DIAG */ ++ { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfd, 0xff) }, /* NMEA */ ++ { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfe, 0xff) }, /* WMC */ ++ { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xff, 0xff) }, /* DIAG */ + { }, + }; + MODULE_DEVICE_TABLE(usb, id_table); diff --git a/queue-3.5/usb-serial-fix-up-bug-with-missing.patch b/queue-3.5/usb-serial-fix-up-bug-with-missing.patch new file mode 100644 index 00000000000..815c2b274f7 --- /dev/null +++ b/queue-3.5/usb-serial-fix-up-bug-with-missing.patch @@ -0,0 +1,45 @@ +From 44b0f0836b62171617d56c6528c821ceaa6ea506 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman +Date: Wed, 19 Sep 2012 08:15:21 +0100 +Subject: USB: serial: fix up bug with missing {} + +From: Greg Kroah-Hartman + +commit 44b0f0836b62171617d56c6528c821ceaa6ea506 upstream. + +As reported by Fengguang: + +FYI, coccinelle warns about + +drivers/usb/serial/usb-serial.c:1415:3-51: code aligned with following code on line 1416 + +vim +1415 drivers/usb/serial/usb-serial.c + + 1412 /* we only set the reset_resume field if the serial_driver has one */ + 1413 for (sd = serial_drivers; *sd; ++sd) { + 1414 if ((*sd)->reset_resume) +> 1415 udriver->reset_resume = usb_serial_reset_resume; +> 1416 break; + 1417 } + +Reported-by: Fengguang Wu +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/usb-serial.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/usb/serial/usb-serial.c ++++ b/drivers/usb/serial/usb-serial.c +@@ -1426,9 +1426,10 @@ int usb_serial_register_drivers(struct u + + /* we only set the reset_resume field if the serial_driver has one */ + for (sd = serial_drivers; *sd; ++sd) { +- if ((*sd)->reset_resume) ++ if ((*sd)->reset_resume) { + udriver->reset_resume = usb_serial_reset_resume; + break; ++ } + } + + rc = usb_register(udriver);