Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: ehci: handle large bulk URBs correctly (again)

USB: ehci: Fixes completion for multi-qtd URB the short read case

When use of urb->status in the EHCI driver was reworked last August
(commit 14c04c0f88f228fee1f412be91d6edcb935c78aa), a bug was inserted
in the handling of early completion for bulk transactions that need
more than one qTD (e.g. more than 20KB in one URB).

This patch resolves that problem by ensuring that the early completion
status is preserved until the URB is handed back to its submitter,
instead of resetting it after each qTD.

Signed-off-by: Misha Zhilin <misha@epiphan.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Cc: stable@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Misha Zhilin and committed by
Greg Kroah-Hartman
b5f7a0ec 14f3546f

+1 -1
+1 -1
drivers/usb/host/ehci-q.c
··· 319 319 if (likely (last->urb != urb)) { 320 320 ehci_urb_done(ehci, last->urb, last_status); 321 321 count++; 322 + last_status = -EINPROGRESS; 322 323 } 323 324 ehci_qtd_free (ehci, last); 324 325 last = NULL; 325 - last_status = -EINPROGRESS; 326 326 } 327 327 328 328 /* ignore urbs submitted during completions we reported */