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

usb: wusbcore: skip done segs before completing aborted transfer

When completing an aborted transfer, skip done segs before calling
wa_complete_remaining_xfer_segs to avoid a runtime warning. The warning
is harmless in this case but avoiding it prevents false error reports.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Thomas Pugliese and committed by
Greg Kroah-Hartman
b94be0db f5502528

+14 -3
+14 -3
drivers/usb/wusbcore/wa-xfer.c
··· 459 459 __func__, urb->status); 460 460 if (xfer) { 461 461 unsigned long flags; 462 - int done; 462 + int done, seg_index = 0; 463 463 struct wa_rpipe *rpipe = xfer->ep->hcpriv; 464 464 465 465 dev_err(dev, "%s: cleaning up xfer %p ID 0x%08X.\n", 466 466 __func__, xfer, wa_xfer_id(xfer)); 467 467 spin_lock_irqsave(&xfer->lock, flags); 468 - /* mark all segs as aborted. */ 469 - wa_complete_remaining_xfer_segs(xfer, 0, 468 + /* skip done segs. */ 469 + while (seg_index < xfer->segs) { 470 + struct wa_seg *seg = xfer->seg[seg_index]; 471 + 472 + if ((seg->status == WA_SEG_DONE) || 473 + (seg->status == WA_SEG_ERROR)) { 474 + ++seg_index; 475 + } else { 476 + break; 477 + } 478 + } 479 + /* mark remaining segs as aborted. */ 480 + wa_complete_remaining_xfer_segs(xfer, seg_index, 470 481 WA_SEG_ABORTED); 471 482 done = __wa_xfer_is_done(xfer); 472 483 spin_unlock_irqrestore(&xfer->lock, flags);