|
@@ -1618,6 +1618,7 @@ static int unlink1(struct usb_hcd *hcd, struct urb *urb, int status)
|
|
|
int usb_hcd_unlink_urb (struct urb *urb, int status)
|
|
|
{
|
|
|
struct usb_hcd *hcd;
|
|
|
+ struct usb_device *udev = urb->dev;
|
|
|
int retval = -EIDRM;
|
|
|
unsigned long flags;
|
|
|
|
|
@@ -1629,20 +1630,19 @@ int usb_hcd_unlink_urb (struct urb *urb, int status)
|
|
|
spin_lock_irqsave(&hcd_urb_unlink_lock, flags);
|
|
|
if (atomic_read(&urb->use_count) > 0) {
|
|
|
retval = 0;
|
|
|
- usb_get_dev(urb->dev);
|
|
|
+ usb_get_dev(udev);
|
|
|
}
|
|
|
spin_unlock_irqrestore(&hcd_urb_unlink_lock, flags);
|
|
|
if (retval == 0) {
|
|
|
hcd = bus_to_hcd(urb->dev->bus);
|
|
|
retval = unlink1(hcd, urb, status);
|
|
|
- usb_put_dev(urb->dev);
|
|
|
+ if (retval == 0)
|
|
|
+ retval = -EINPROGRESS;
|
|
|
+ else if (retval != -EIDRM && retval != -EBUSY)
|
|
|
+ dev_dbg(&udev->dev, "hcd_unlink_urb %p fail %d\n",
|
|
|
+ urb, retval);
|
|
|
+ usb_put_dev(udev);
|
|
|
}
|
|
|
-
|
|
|
- if (retval == 0)
|
|
|
- retval = -EINPROGRESS;
|
|
|
- else if (retval != -EIDRM && retval != -EBUSY)
|
|
|
- dev_dbg(&urb->dev->dev, "hcd_unlink_urb %p fail %d\n",
|
|
|
- urb, retval);
|
|
|
return retval;
|
|
|
}
|
|
|
|