spin_lock(&vdev->priv_lock);
 
        list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) {
+               struct urb *urb;
+
+               /* give back urb of unsent unlink request */
                pr_info("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
+
+               urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);
+               if (!urb) {
+                       list_del(&unlink->list);
+                       kfree(unlink);
+                       continue;
+               }
+
+               urb->status = -ENODEV;
+
+               usb_hcd_unlink_urb_from_ep(hcd, urb);
+
                list_del(&unlink->list);
+
+               spin_unlock(&vdev->priv_lock);
+               spin_unlock_irqrestore(&vhci->lock, flags);
+
+               usb_hcd_giveback_urb(hcd, urb, urb->status);
+
+               spin_lock_irqsave(&vhci->lock, flags);
+               spin_lock(&vdev->priv_lock);
+
                kfree(unlink);
        }