/* This hands the URB from HCD to its USB device driver, using its completion function. The HCD has freed all per-urb resources (and is done using urb->hcpriv). It also released all HCD locks; the device driver won't cause problems if it frees, modifies, or resubmits this URB.  */
void usb_hcd_giveback_urb(struct hc_gen_dev *hcd, struct urb *urb)
/* This hands the URB from HCD to its USB device driver, using its completion function. The HCD has freed all per-urb resources (and is done using urb->hcpriv). It also released all HCD locks; the device driver won't cause problems if it frees, modifies, or resubmits this URB.  */
void usb_hcd_giveback_urb(struct hc_gen_dev *hcd, struct urb *urb)
{
    if (likely(!urb->unlinked))
        urb->unlinked = urb->status;
    urb_unlink(urb);
    urb->complete(urb);
    usb_dec32((&urb->use_count));
    if (urb->reject)
    {
        hal_log_err("PANIC : usb_hcd_giveback_urb: submissions will fail");
    }
    return;
}