Commit 2dea75d9 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Sarah Sharp

USB: xhci - also free streams when resetting devices

Currently, when resetting a device, xHCI driver disables all but one
endpoints and frees their rings, but leaves alone any streams that
might have been allocated. Later, when users try to free allocated
streams, we oops in xhci_setup_no_streams_ep_input_ctx() because
ep->ring is NULL.

Let's free not only rings but also stream data as well, so that
calling free_streams() on a device that was reset will be safe.

This should be queued for stable trees back to 2.6.35.
Reviewed-by: default avatarMicah Elizabeth Scott <micah@vmware.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@vmware.com>
Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: stable@kernel.org
parent 386139d7
...@@ -2386,10 +2386,18 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev) ...@@ -2386,10 +2386,18 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
/* Everything but endpoint 0 is disabled, so free or cache the rings. */ /* Everything but endpoint 0 is disabled, so free or cache the rings. */
last_freed_endpoint = 1; last_freed_endpoint = 1;
for (i = 1; i < 31; ++i) { for (i = 1; i < 31; ++i) {
if (!virt_dev->eps[i].ring) struct xhci_virt_ep *ep = &virt_dev->eps[i];
continue;
xhci_free_or_cache_endpoint_ring(xhci, virt_dev, i); if (ep->ep_state & EP_HAS_STREAMS) {
last_freed_endpoint = i; xhci_free_stream_info(xhci, ep->stream_info);
ep->stream_info = NULL;
ep->ep_state &= ~EP_HAS_STREAMS;
}
if (ep->ring) {
xhci_free_or_cache_endpoint_ring(xhci, virt_dev, i);
last_freed_endpoint = i;
}
} }
xhci_dbg(xhci, "Output context after successful reset device cmd:\n"); xhci_dbg(xhci, "Output context after successful reset device cmd:\n");
xhci_dbg_ctx(xhci, virt_dev->out_ctx, last_freed_endpoint); xhci_dbg_ctx(xhci, virt_dev->out_ctx, last_freed_endpoint);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment