From: Greg Kroah-Hartman Date: Mon, 29 Mar 2010 20:08:35 +0000 (-0700) Subject: .32 patches X-Git-Tag: v2.6.27.46~29 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cedcf92a196ee1e3ec9de93a156dc894ee85143f;p=thirdparty%2Fkernel%2Fstable-queue.git .32 patches --- diff --git a/queue-2.6.32/series b/queue-2.6.32/series index 1cfe2a03ae3..643133c2d87 100644 --- a/queue-2.6.32/series +++ b/queue-2.6.32/series @@ -62,3 +62,13 @@ nfs-avoid-a-deadlock-in-nfs_release_page.patch nfs-prevent-another-deadlock-in-nfs_release_page.patch tty-keep-the-default-buffering-to-sub-page-units.patch tty-take-a-256-byte-padding-into-account-when-buffering-below-sub-page-units.patch +usb-fix-usbfs-regression.patch +usb-ehci-fix-itd-list-order.patch +usb-ehci-adjust-ehci_iso_stream-for-changes-in-ehci_qh.patch +usb-qcserial-add-new-device-ids.patch +usb-xhci-re-initialize-cmd_completion.patch +usb-serial-ftdi-add-contec-vendor-and-product-id.patch +usb-option-fix-incorrect-manufacturer-name-in-usb-serial-option-maxon-cmotech.patch +usb-option-move-hardcoded-pid-to-a-macro-in-usb-serial-option.patch +usb-option-add-support-for-a-new-cmotech-device-to-usb-serial-option.patch +usb-r8a66597-hcd-fix-removed-from-an-attached-hub.patch diff --git a/queue-2.6.32/usb-ehci-adjust-ehci_iso_stream-for-changes-in-ehci_qh.patch b/queue-2.6.32/usb-ehci-adjust-ehci_iso_stream-for-changes-in-ehci_qh.patch new file mode 100644 index 00000000000..adaea8ae5ba --- /dev/null +++ b/queue-2.6.32/usb-ehci-adjust-ehci_iso_stream-for-changes-in-ehci_qh.patch @@ -0,0 +1,68 @@ +From 1082f57abfa26590b60c43f503afb24102a37016 Mon Sep 17 00:00:00 2001 +From: Clemens Ladisch +Date: Mon, 1 Mar 2010 17:18:56 +0100 +Subject: USB: EHCI: adjust ehci_iso_stream for changes in ehci_qh + +From: Clemens Ladisch + +commit 1082f57abfa26590b60c43f503afb24102a37016 upstream. + +The EHCI driver stores in usb_host_endpoint.hcpriv a pointer to either +an ehci_qh or an ehci_iso_stream structure, and uses the contents of the +hw_info1 field to distinguish the two cases. + +After ehci_qh was split into hw and sw parts, ehci_iso_stream must also +be adjusted so that it again looks like an ehci_qh structure. + +This fixes a NULL pointer access in ehci_endpoint_disable() when it +tries to access qh->hw->hw_info1. + +Signed-off-by: Clemens Ladisch +Reported-by: Colin Fletcher +Acked-by: Alan Stern +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/ehci-hcd.c | 2 +- + drivers/usb/host/ehci-sched.c | 4 ++-- + drivers/usb/host/ehci.h | 5 ++--- + 3 files changed, 5 insertions(+), 6 deletions(-) + +--- a/drivers/usb/host/ehci-hcd.c ++++ b/drivers/usb/host/ehci-hcd.c +@@ -993,7 +993,7 @@ rescan: + /* endpoints can be iso streams. for now, we don't + * accelerate iso completions ... so spin a while. + */ +- if (qh->hw->hw_info1 == 0) { ++ if (qh->hw == NULL) { + ehci_vdbg (ehci, "iso delay\n"); + goto idle_timeout; + } +--- a/drivers/usb/host/ehci-sched.c ++++ b/drivers/usb/host/ehci-sched.c +@@ -1121,8 +1121,8 @@ iso_stream_find (struct ehci_hcd *ehci, + urb->interval); + } + +- /* if dev->ep [epnum] is a QH, info1.maxpacket is nonzero */ +- } else if (unlikely (stream->hw_info1 != 0)) { ++ /* if dev->ep [epnum] is a QH, hw is set */ ++ } else if (unlikely (stream->hw != NULL)) { + ehci_dbg (ehci, "dev %s ep%d%s, not iso??\n", + urb->dev->devpath, epnum, + usb_pipein(urb->pipe) ? "in" : "out"); +--- a/drivers/usb/host/ehci.h ++++ b/drivers/usb/host/ehci.h +@@ -394,9 +394,8 @@ struct ehci_iso_sched { + * acts like a qh would, if EHCI had them for ISO. + */ + struct ehci_iso_stream { +- /* first two fields match QH, but info1 == 0 */ +- __hc32 hw_next; +- __hc32 hw_info1; ++ /* first field matches ehci_hq, but is NULL */ ++ struct ehci_qh_hw *hw; + + u32 refcount; + u8 bEndpointAddress; diff --git a/queue-2.6.32/usb-ehci-fix-itd-list-order.patch b/queue-2.6.32/usb-ehci-fix-itd-list-order.patch new file mode 100644 index 00000000000..01d16da8b19 --- /dev/null +++ b/queue-2.6.32/usb-ehci-fix-itd-list-order.patch @@ -0,0 +1,61 @@ +From 92bc3648e6027384479852b770a542722fadee7c Mon Sep 17 00:00:00 2001 +From: Clemens Ladisch +Date: Mon, 1 Mar 2010 09:12:50 +0100 +Subject: USB: EHCI: fix ITD list order + +From: Clemens Ladisch + +commit 92bc3648e6027384479852b770a542722fadee7c upstream. + +When isochronous URBs are shorter than one frame and when more than one +ITD in a frame has been completed before the interrupt can be handled, +scan_periodic() completes the URBs in the order in which they are found +in the descriptor list. Therefore, the descriptor list must contain the +ITDs in the correct order, i.e., a new ITD must be linked in after any +previous ITDs of the same endpoint. + +This should fix garbled capture data in the USB audio drivers. + +Signed-off-by: Clemens Ladisch +Reported-by: Colin Fletcher +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/ehci-sched.c | 24 +++++++++++++++++++----- + 1 file changed, 19 insertions(+), 5 deletions(-) + +--- a/drivers/usb/host/ehci-sched.c ++++ b/drivers/usb/host/ehci-sched.c +@@ -1553,13 +1553,27 @@ itd_patch( + static inline void + itd_link (struct ehci_hcd *ehci, unsigned frame, struct ehci_itd *itd) + { +- /* always prepend ITD/SITD ... only QH tree is order-sensitive */ +- itd->itd_next = ehci->pshadow [frame]; +- itd->hw_next = ehci->periodic [frame]; +- ehci->pshadow [frame].itd = itd; ++ union ehci_shadow *prev = &ehci->pshadow[frame]; ++ __hc32 *hw_p = &ehci->periodic[frame]; ++ union ehci_shadow here = *prev; ++ __hc32 type = 0; ++ ++ /* skip any iso nodes which might belong to previous microframes */ ++ while (here.ptr) { ++ type = Q_NEXT_TYPE(ehci, *hw_p); ++ if (type == cpu_to_hc32(ehci, Q_TYPE_QH)) ++ break; ++ prev = periodic_next_shadow(ehci, prev, type); ++ hw_p = shadow_next_periodic(ehci, &here, type); ++ here = *prev; ++ } ++ ++ itd->itd_next = here; ++ itd->hw_next = *hw_p; ++ prev->itd = itd; + itd->frame = frame; + wmb (); +- ehci->periodic[frame] = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD); ++ *hw_p = cpu_to_hc32(ehci, itd->itd_dma | Q_TYPE_ITD); + } + + /* fit urb's itds into the selected schedule slot; activate as needed */ diff --git a/queue-2.6.32/usb-fix-usbfs-regression.patch b/queue-2.6.32/usb-fix-usbfs-regression.patch new file mode 100644 index 00000000000..36df5ffddf1 --- /dev/null +++ b/queue-2.6.32/usb-fix-usbfs-regression.patch @@ -0,0 +1,56 @@ +From 7152b592593b9d48b33f8997b1dfd6df9143f7ec Mon Sep 17 00:00:00 2001 +From: Alan Stern +Date: Sat, 6 Mar 2010 15:04:03 -0500 +Subject: USB: fix usbfs regression + +From: Alan Stern + +commit 7152b592593b9d48b33f8997b1dfd6df9143f7ec upstream. + +This patch (as1352) fixes a bug in the way isochronous input data is +returned to userspace for usbfs transfers. The entire buffer must be +copied, not just the first actual_length bytes, because the individual +packets will be discontiguous if any of them are short. + +Reported-by: Markus Rechberger +Signed-off-by: Alan Stern +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/core/devio.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +--- a/drivers/usb/core/devio.c ++++ b/drivers/usb/core/devio.c +@@ -1176,6 +1176,13 @@ static int proc_do_submiturb(struct dev_ + free_async(as); + return -ENOMEM; + } ++ /* Isochronous input data may end up being discontiguous ++ * if some of the packets are short. Clear the buffer so ++ * that the gaps don't leak kernel data to userspace. ++ */ ++ if (is_in && uurb->type == USBDEVFS_URB_TYPE_ISO) ++ memset(as->urb->transfer_buffer, 0, ++ uurb->buffer_length); + } + as->urb->dev = ps->dev; + as->urb->pipe = (uurb->type << 30) | +@@ -1312,10 +1319,14 @@ static int processcompl(struct async *as + void __user *addr = as->userurb; + unsigned int i; + +- if (as->userbuffer && urb->actual_length) +- if (copy_to_user(as->userbuffer, urb->transfer_buffer, +- urb->actual_length)) ++ if (as->userbuffer && urb->actual_length) { ++ if (urb->number_of_packets > 0) /* Isochronous */ ++ i = urb->transfer_buffer_length; ++ else /* Non-Isoc */ ++ i = urb->actual_length; ++ if (copy_to_user(as->userbuffer, urb->transfer_buffer, i)) + goto err_out; ++ } + if (put_user(as->status, &userurb->status)) + goto err_out; + if (put_user(urb->actual_length, &userurb->actual_length)) diff --git a/queue-2.6.32/usb-option-add-support-for-a-new-cmotech-device-to-usb-serial-option.patch b/queue-2.6.32/usb-option-add-support-for-a-new-cmotech-device-to-usb-serial-option.patch new file mode 100644 index 00000000000..fdc120a310b --- /dev/null +++ b/queue-2.6.32/usb-option-add-support-for-a-new-cmotech-device-to-usb-serial-option.patch @@ -0,0 +1,34 @@ +From 3b04872aa75006e2a4adaaec21e9c9ede8b8ad9d Mon Sep 17 00:00:00 2001 +From: Nathaniel McCallum +Date: Thu, 11 Mar 2010 13:09:26 -0500 +Subject: USB: option: add support for a new CMOTECH device to usb/serial/option + +From: Nathaniel McCallum + +commit 3b04872aa75006e2a4adaaec21e9c9ede8b8ad9d upstream. + +Signed-off-by: Nathaniel McCallum +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -289,6 +289,7 @@ static int option_resume(struct usb_ser + #define QUALCOMM_VENDOR_ID 0x05C6 + + #define CMOTECH_VENDOR_ID 0x16d8 ++#define CMOTECH_PRODUCT_6008 0x6008 + #define CMOTECH_PRODUCT_6280 0x6280 + + #define TELIT_VENDOR_ID 0x1bc7 +@@ -522,6 +523,7 @@ static struct usb_device_id option_ids[] + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ ++ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ diff --git a/queue-2.6.32/usb-option-fix-incorrect-manufacturer-name-in-usb-serial-option-maxon-cmotech.patch b/queue-2.6.32/usb-option-fix-incorrect-manufacturer-name-in-usb-serial-option-maxon-cmotech.patch new file mode 100644 index 00000000000..75379ccb4ff --- /dev/null +++ b/queue-2.6.32/usb-option-fix-incorrect-manufacturer-name-in-usb-serial-option-maxon-cmotech.patch @@ -0,0 +1,36 @@ +From eaff4cdc978f414cf7b5441a333de3070d80e9c7 Mon Sep 17 00:00:00 2001 +From: Nathaniel McCallum +Date: Thu, 11 Mar 2010 13:09:24 -0500 +Subject: USB: option: fix incorrect manufacturer name in usb/serial/option: MAXON->CMOTECH + +From: Nathaniel McCallum + +commit eaff4cdc978f414cf7b5441a333de3070d80e9c7 upstream. + +Signed-off-by: Nathaniel McCallum +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -288,7 +288,7 @@ static int option_resume(struct usb_ser + + #define QUALCOMM_VENDOR_ID 0x05C6 + +-#define MAXON_VENDOR_ID 0x16d8 ++#define CMOTECH_VENDOR_ID 0x16d8 + + #define TELIT_VENDOR_ID 0x1bc7 + #define TELIT_PRODUCT_UC864E 0x1003 +@@ -520,7 +520,7 @@ static struct usb_device_id option_ids[] + { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ +- { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ ++ { USB_DEVICE(CMOTECH_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ diff --git a/queue-2.6.32/usb-option-move-hardcoded-pid-to-a-macro-in-usb-serial-option.patch b/queue-2.6.32/usb-option-move-hardcoded-pid-to-a-macro-in-usb-serial-option.patch new file mode 100644 index 00000000000..519d41f03db --- /dev/null +++ b/queue-2.6.32/usb-option-move-hardcoded-pid-to-a-macro-in-usb-serial-option.patch @@ -0,0 +1,35 @@ +From bb73ed2a268a29ab1b7d8cc50b5f248578e7e188 Mon Sep 17 00:00:00 2001 +From: Nathaniel McCallum +Date: Thu, 11 Mar 2010 13:01:17 -0500 +Subject: USB: option: move hardcoded PID to a macro in usb/serial/option + +From: Nathaniel McCallum + +commit bb73ed2a268a29ab1b7d8cc50b5f248578e7e188 upstream. + +Signed-off-by: Nathaniel McCallum +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 +@@ -289,6 +289,7 @@ static int option_resume(struct usb_ser + #define QUALCOMM_VENDOR_ID 0x05C6 + + #define CMOTECH_VENDOR_ID 0x16d8 ++#define CMOTECH_PRODUCT_6280 0x6280 + + #define TELIT_VENDOR_ID 0x1bc7 + #define TELIT_PRODUCT_UC864E 0x1003 +@@ -520,7 +521,7 @@ static struct usb_device_id option_ids[] + { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ +- { USB_DEVICE(CMOTECH_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ ++ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ diff --git a/queue-2.6.32/usb-qcserial-add-new-device-ids.patch b/queue-2.6.32/usb-qcserial-add-new-device-ids.patch new file mode 100644 index 00000000000..d66914cdca7 --- /dev/null +++ b/queue-2.6.32/usb-qcserial-add-new-device-ids.patch @@ -0,0 +1,57 @@ +From 0725e95ea56698774e893edb7e7276b1d6890954 Mon Sep 17 00:00:00 2001 +From: Bernhard Rosenkraenzer +Date: Wed, 10 Mar 2010 12:36:43 +0100 +Subject: USB: qcserial: add new device ids + +From: Bernhard Rosenkraenzer + +commit 0725e95ea56698774e893edb7e7276b1d6890954 upstream. + +This patch adds various USB device IDs for Gobi 2000 devices, as found in the +drivers available at https://www.codeaurora.org/wiki/GOBI_Releases + +Signed-off-by: Bernhard Rosenkraenzer +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/qcserial.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +--- a/drivers/usb/serial/qcserial.c ++++ b/drivers/usb/serial/qcserial.c +@@ -47,6 +47,35 @@ static struct usb_device_id id_table[] = + {USB_DEVICE(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ + {USB_DEVICE(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ + {USB_DEVICE(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ ++ {USB_DEVICE(0x413c, 0x8185)}, /* Dell Gobi 2000 QDL device (N0218, VU936) */ ++ {USB_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ ++ {USB_DEVICE(0x05c6, 0x9224)}, /* Sony Gobi 2000 QDL device (N0279, VU730) */ ++ {USB_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */ ++ {USB_DEVICE(0x05c6, 0x9244)}, /* Samsung Gobi 2000 QDL device (VL176) */ ++ {USB_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */ ++ {USB_DEVICE(0x03f0, 0x241d)}, /* HP Gobi 2000 QDL device (VP412) */ ++ {USB_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */ ++ {USB_DEVICE(0x05c6, 0x9214)}, /* Acer Gobi 2000 QDL device (VP413) */ ++ {USB_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */ ++ {USB_DEVICE(0x05c6, 0x9264)}, /* Asus Gobi 2000 QDL device (VR305) */ ++ {USB_DEVICE(0x05c6, 0x9265)}, /* Asus Gobi 2000 Modem device (VR305) */ ++ {USB_DEVICE(0x05c6, 0x9234)}, /* Top Global Gobi 2000 QDL device (VR306) */ ++ {USB_DEVICE(0x05c6, 0x9235)}, /* Top Global Gobi 2000 Modem device (VR306) */ ++ {USB_DEVICE(0x05c6, 0x9274)}, /* iRex Technologies Gobi 2000 QDL device (VR307) */ ++ {USB_DEVICE(0x05c6, 0x9275)}, /* iRex Technologies Gobi 2000 Modem device (VR307) */ ++ {USB_DEVICE(0x1199, 0x9000)}, /* Sierra Wireless Gobi 2000 QDL device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9001)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9002)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9003)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9004)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9005)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9006)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9007)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9008)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x9009)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x1199, 0x900a)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ ++ {USB_DEVICE(0x16d8, 0x8001)}, /* CMDTech Gobi 2000 QDL device (VU922) */ ++ {USB_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ + { } /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, id_table); diff --git a/queue-2.6.32/usb-r8a66597-hcd-fix-removed-from-an-attached-hub.patch b/queue-2.6.32/usb-r8a66597-hcd-fix-removed-from-an-attached-hub.patch new file mode 100644 index 00000000000..d2682d145cb --- /dev/null +++ b/queue-2.6.32/usb-r8a66597-hcd-fix-removed-from-an-attached-hub.patch @@ -0,0 +1,73 @@ +From d835933436ac0d1e8f5b35fe809fd4e767e55d6e Mon Sep 17 00:00:00 2001 +From: Yoshihiro Shimoda +Date: Tue, 16 Mar 2010 12:29:35 +0900 +Subject: usb: r8a66597-hcd: fix removed from an attached hub + +From: Yoshihiro Shimoda + +commit d835933436ac0d1e8f5b35fe809fd4e767e55d6e upstream. + +fix the problem that when a USB hub is attached to the r8a66597-hcd and +a device is removed from that hub, it's likely that a kernel panic follows. + +Reported-by: Markus Pietrek +Signed-off-by: Yoshihiro Shimoda +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/r8a66597-hcd.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +--- a/drivers/usb/host/r8a66597-hcd.c ++++ b/drivers/usb/host/r8a66597-hcd.c +@@ -418,7 +418,7 @@ static u8 alloc_usb_address(struct r8a66 + + /* this function must be called with interrupt disabled */ + static void free_usb_address(struct r8a66597 *r8a66597, +- struct r8a66597_device *dev) ++ struct r8a66597_device *dev, int reset) + { + int port; + +@@ -430,7 +430,13 @@ static void free_usb_address(struct r8a6 + dev->state = USB_STATE_DEFAULT; + r8a66597->address_map &= ~(1 << dev->address); + dev->address = 0; +- dev_set_drvdata(&dev->udev->dev, NULL); ++ /* ++ * Only when resetting USB, it is necessary to erase drvdata. When ++ * a usb device with usb hub is disconnect, "dev->udev" is already ++ * freed on usb_desconnect(). So we cannot access the data. ++ */ ++ if (reset) ++ dev_set_drvdata(&dev->udev->dev, NULL); + list_del(&dev->device_list); + kfree(dev); + +@@ -1067,7 +1073,7 @@ static void r8a66597_usb_disconnect(stru + struct r8a66597_device *dev = r8a66597->root_hub[port].dev; + + disable_r8a66597_pipe_all(r8a66597, dev); +- free_usb_address(r8a66597, dev); ++ free_usb_address(r8a66597, dev, 0); + + start_root_hub_sampling(r8a66597, port, 0); + } +@@ -2085,7 +2091,7 @@ static void update_usb_address_map(struc + spin_lock_irqsave(&r8a66597->lock, flags); + dev = get_r8a66597_device(r8a66597, addr); + disable_r8a66597_pipe_all(r8a66597, dev); +- free_usb_address(r8a66597, dev); ++ free_usb_address(r8a66597, dev, 0); + put_child_connect_map(r8a66597, addr); + spin_unlock_irqrestore(&r8a66597->lock, flags); + } +@@ -2228,7 +2234,7 @@ static int r8a66597_hub_control(struct u + rh->port |= (1 << USB_PORT_FEAT_RESET); + + disable_r8a66597_pipe_all(r8a66597, dev); +- free_usb_address(r8a66597, dev); ++ free_usb_address(r8a66597, dev, 1); + + r8a66597_mdfy(r8a66597, USBRST, USBRST | UACT, + get_dvstctr_reg(port)); diff --git a/queue-2.6.32/usb-serial-ftdi-add-contec-vendor-and-product-id.patch b/queue-2.6.32/usb-serial-ftdi-add-contec-vendor-and-product-id.patch new file mode 100644 index 00000000000..160c65a0866 --- /dev/null +++ b/queue-2.6.32/usb-serial-ftdi-add-contec-vendor-and-product-id.patch @@ -0,0 +1,50 @@ +From dee5658b482e9e2ac7d6205dc876fc11d4008138 Mon Sep 17 00:00:00 2001 +From: Daniel Sangorrin +Date: Thu, 11 Mar 2010 14:10:58 -0800 +Subject: USB: serial: ftdi: add CONTEC vendor and product id + +From: Daniel Sangorrin + +commit dee5658b482e9e2ac7d6205dc876fc11d4008138 upstream. + +This is a patch to ftdi_sio_ids.h and ftdi_sio.c that adds identifiers for +CONTEC USB serial converter. I tested it with the device COM-1(USB)H + +[akpm@linux-foundation.org: keep the VIDs sorted a bit] +Signed-off-by: Daniel Sangorrin +Cc: Andreas Mohr +Cc: Radek Liboska +Signed-off-by: Andrew Morton +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 1 + + drivers/usb/serial/ftdi_sio_ids.h | 7 +++++++ + 2 files changed, 8 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -658,6 +658,7 @@ static struct usb_device_id id_table_com + { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, + { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) }, + { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) }, ++ { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) }, +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -501,6 +501,13 @@ + #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ + + /* ++ * Contec products (http://www.contec.com) ++ * Submitted by Daniel Sangorrin ++ */ ++#define CONTEC_VID 0x06CE /* Vendor ID */ ++#define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ ++ ++/* + * Definitions for B&B Electronics products. + */ + #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ diff --git a/queue-2.6.32/usb-xhci-re-initialize-cmd_completion.patch b/queue-2.6.32/usb-xhci-re-initialize-cmd_completion.patch new file mode 100644 index 00000000000..202f60afd94 --- /dev/null +++ b/queue-2.6.32/usb-xhci-re-initialize-cmd_completion.patch @@ -0,0 +1,32 @@ +From 1d68064a7d80da4a7334cab0356162e36229c1a1 Mon Sep 17 00:00:00 2001 +From: Andiry Xu +Date: Fri, 12 Mar 2010 17:10:04 +0800 +Subject: USB: xHCI: re-initialize cmd_completion + +From: Andiry Xu + +commit 1d68064a7d80da4a7334cab0356162e36229c1a1 upstream. + +When a signal interrupts a Configure Endpoint command, the cmd_completion used +in xhci_configure_endpoint() is not re-initialized and the +wait_for_completion_interruptible_timeout() will return failure. Initialize +cmd_completion in xhci_configure_endpoint(). + +Signed-off-by: Andiry Xu +Signed-off-by: Sarah Sharp +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/xhci-hcd.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/usb/host/xhci-hcd.c ++++ b/drivers/usb/host/xhci-hcd.c +@@ -1157,6 +1157,7 @@ static int xhci_configure_endpoint(struc + cmd_completion = &virt_dev->cmd_completion; + cmd_status = &virt_dev->cmd_status; + } ++ init_completion(cmd_completion); + + if (!ctx_change) + ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma,