diff options
| -rw-r--r-- | drivers/usb/misc/usbtest.c | 39 | 
1 files changed, 25 insertions, 14 deletions
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 5f1a19d1497..a9f06d76960 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c @@ -1072,23 +1072,34 @@ static int unlink1 (struct usbtest_dev *dev, int pipe, int size, int async)  	 */  	msleep (jiffies % (2 * INTERRUPT_RATE));  	if (async) { -retry: -		retval = usb_unlink_urb (urb); -		if (retval == -EBUSY || retval == -EIDRM) { -			/* we can't unlink urbs while they're completing. -			 * or if they've completed, and we haven't resubmitted. -			 * "normal" drivers would prevent resubmission, but -			 * since we're testing unlink paths, we can't. -			 */ -			ERROR(dev,  "unlink retry\n"); -			goto retry; +		while (!completion_done(&completion)) { +			retval = usb_unlink_urb(urb); + +			switch (retval) { +			case -EBUSY: +			case -EIDRM: +				/* we can't unlink urbs while they're completing +				 * or if they've completed, and we haven't +				 * resubmitted. "normal" drivers would prevent +				 * resubmission, but since we're testing unlink +				 * paths, we can't. +				 */ +				ERROR(dev, "unlink retry\n"); +				continue; +			case 0: +			case -EINPROGRESS: +				break; + +			default: +				dev_err(&dev->intf->dev, +					"unlink fail %d\n", retval); +				return retval; +			} + +			break;  		}  	} else  		usb_kill_urb (urb); -	if (!(retval == 0 || retval == -EINPROGRESS)) { -		dev_err(&dev->intf->dev, "unlink fail %d\n", retval); -		return retval; -	}  	wait_for_completion (&completion);  	retval = urb->status;  |