if (hwreq->req.complete != NULL) {
                        spin_unlock(hwep->lock);
-                       hwreq->req.complete(&hwep->ep, &hwreq->req);
+                       usb_gadget_giveback_request(&hwep->ep, &hwreq->req);
                        spin_lock(hwep->lock);
                }
        }
                        if ((hwep->type == USB_ENDPOINT_XFER_CONTROL) &&
                                        hwreq->req.length)
                                hweptemp = hwep->ci->ep0in;
-                       hwreq->req.complete(&hweptemp->ep, &hwreq->req);
+                       usb_gadget_giveback_request(&hweptemp->ep, &hwreq->req);
                        spin_lock(hwep->lock);
                }
        }
 
        if (hwreq->req.complete != NULL) {
                spin_unlock(hwep->lock);
-               hwreq->req.complete(&hwep->ep, &hwreq->req);
+               usb_gadget_giveback_request(&hwep->ep, &hwreq->req);
                spin_lock(hwep->lock);
        }
 
 
                                        hs_req = ep->req;
                                        ep->req = NULL;
                                        list_del_init(&hs_req->queue);
-                                       hs_req->req.complete(&ep->ep,
-                                                            &hs_req->req);
+                                       usb_gadget_giveback_request(&ep->ep,
+                                                                   &hs_req->req);
                                }
 
                                /* If we have pending request, then start it */
 
        if (hs_req->req.complete) {
                spin_unlock(&hsotg->lock);
-               hs_req->req.complete(&hs_ep->ep, &hs_req->req);
+               usb_gadget_giveback_request(&hs_ep->ep, &hs_req->req);
                spin_lock(&hsotg->lock);
        }
 
 
        trace_dwc3_gadget_giveback(req);
 
        spin_unlock(&dwc->lock);
-       req->request.complete(&dep->endpoint, &req->request);
+       usb_gadget_giveback_request(&dep->endpoint, &req->request);
        spin_lock(&dwc->lock);
 }
 
 
                &req->req, req->req.length, ep->ep.name, sts);
 
        spin_unlock(&dev->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&dev->lock);
        ep->halted = halted;
 }
 
 
        ep->stopped = 1;
        spin_unlock(&udc->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&udc->lock);
        ep->stopped = stopped;
 
 
                        list_del_init(&req->queue);
                        usba_ep_writel(ep, CTL_DIS, USBA_RX_BK_RDY);
                        spin_unlock(&udc->lock);
-                       req->req.complete(&ep->ep, &req->req);
+                       usb_gadget_giveback_request(&ep->ep, &req->req);
                        spin_lock(&udc->lock);
                }
 
                ep->ep.name, req, req->req.status, req->req.actual);
 
        spin_unlock(&udc->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&udc->lock);
 }
 
 
                        breq->req.status = -ESHUTDOWN;
 
                        spin_unlock_irqrestore(&udc->lock, flags);
-                       breq->req.complete(&iudma->bep->ep, &breq->req);
+                       usb_gadget_giveback_request(&iudma->bep->ep, &breq->req);
                        spin_lock_irqsave(&udc->lock, flags);
                }
        }
 
                req->req.status = -ESHUTDOWN;
 
                spin_unlock(&dum->lock);
-               req->req.complete(&ep->ep, &req->req);
+               usb_gadget_giveback_request(&ep->ep, &req->req);
                spin_lock(&dum->lock);
        }
 }
                spin_unlock(&dum->lock);
                _req->actual = _req->length;
                _req->status = 0;
-               _req->complete(_ep, _req);
+               usb_gadget_giveback_request(_ep, _req);
                spin_lock(&dum->lock);
        }  else
                list_add_tail(&req->queue, &ep->queue);
                dev_dbg(udc_dev(dum),
                                "dequeued req %p from %s, len %d buf %p\n",
                                req, _ep->name, _req->length, _req->buf);
-               _req->complete(_ep, _req);
+               usb_gadget_giveback_request(_ep, _req);
        }
        local_irq_restore(flags);
        return retval;
                        list_del_init(&req->queue);
 
                        spin_unlock(&dum->lock);
-                       req->req.complete(&ep->ep, &req->req);
+                       usb_gadget_giveback_request(&ep->ep, &req->req);
                        spin_lock(&dum->lock);
 
                        /* requests might have been unlinked... */
                                                req);
 
                                spin_unlock(&dum->lock);
-                               req->req.complete(&ep->ep, &req->req);
+                               usb_gadget_giveback_request(&ep->ep, &req->req);
                                spin_lock(&dum->lock);
                                ep->already_seen = 0;
                                goto restart;
 
                req->req.status = status;
 
        spin_unlock(&ep->fotg210->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&ep->fotg210->lock);
 
        if (ep->epnum) {
 
        ep->stopped = 1;
        spin_unlock(&udc->lock);
 
-       /* this complete() should a func implemented by gadget layer,
-        * eg fsg->bulk_in_complete() */
-       if (req->req.complete)
-               req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
 
        spin_lock(&udc->lock);
 
 MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_LICENSE("GPL");
-
 
        ep->stopped = 1;
 
        spin_unlock(&ep->udc->lock);
-       /* complete() is from gadget layer,
-        * eg fsg->bulk_in_complete() */
-       if (req->req.complete)
-               req->req.complete(&ep->ep, &req->req);
+
+       usb_gadget_giveback_request(&ep->ep, &req->req);
 
        spin_lock(&ep->udc->lock);
        ep->stopped = stopped;
 
                req->req.status = status;
 
        spin_unlock(&ep->fusb300->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&ep->fusb300->lock);
 
        if (ep->epnum) {
 
        /* don't modify queue heads during completion callback */
        ep->stopped = 1;
        spin_unlock(&dev->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&dev->lock);
        ep->stopped = stopped;
 }
 
        } else if (req->req.complete) {
                spin_unlock(&dev->lock);
 
-               req->req.complete(&ep->ep, &req->req);
+               usb_gadget_giveback_request(&ep->ep, &req->req);
 
                spin_lock(&dev->lock);
        }
 
 
        ep->req_pending = 0;
        spin_unlock(&udc->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&udc->lock);
 }
 
 
                restart = 1;
 
        spin_unlock(&ep->m66592->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&ep->m66592->lock);
 
        if (restart) {
 
        }
 
        spin_unlock(&ep->u3d->lock);
-       /*
-        * complete() is from gadget layer,
-        * eg fsg->bulk_in_complete()
-        */
-       if (req->req.complete)
-               req->req.complete(&ep->ep, &req->req);
+
+       usb_gadget_giveback_request(&ep->ep, &req->req);
 
        spin_lock(&ep->u3d->lock);
 }
 
        ep->stopped = 1;
 
        spin_unlock(&ep->udc->lock);
-       /*
-        * complete() is from gadget layer,
-        * eg fsg->bulk_in_complete()
-        */
-       if (req->req.complete)
-               req->req.complete(&ep->ep, &req->req);
+
+       usb_gadget_giveback_request(&ep->ep, &req->req);
 
        spin_lock(&ep->udc->lock);
        ep->stopped = stopped;
 
        /* don't modify queue heads during completion callback */
        ep->stopped = 1;
        spin_unlock(&dev->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&dev->lock);
        ep->stopped = stopped;
 }
 
        /* don't modify queue heads during completion callback */
        ep->stopped = 1;
        spin_unlock(&dev->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&dev->lock);
        ep->stopped = stopped;
 }
 
        /* don't modify queue heads during completion callback */
        ep->stopped = 1;
        spin_unlock(&ep->udc->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&ep->udc->lock);
        ep->stopped = stopped;
 }
 
        spin_unlock(&dev->lock);
        if (!ep->in)
                pch_udc_ep_clear_rrdy(ep);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&dev->lock);
        ep->halted = halted;
 }
 
 
        /* don't modify queue heads during completion callback */
        ep->stopped = 1;
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        ep->stopped = stopped;
 }
 
 
        if (pflags)
                spin_unlock_irqrestore(&ep->lock, *pflags);
        local_irq_save(flags);
-       req->req.complete(&req->udc_usb_ep->usb_ep, &req->req);
+       usb_gadget_giveback_request(&req->udc_usb_ep->usb_ep, &req->req);
        local_irq_restore(flags);
        if (pflags)
                spin_lock_irqsave(&ep->lock, *pflags);
 
                sudmac_free_channel(ep->r8a66597, ep, req);
 
        spin_unlock(&ep->r8a66597->lock);
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        spin_lock(&ep->r8a66597->lock);
 
        if (restart) {
 
 
        hsep->stopped = 1;
        spin_unlock(&hsudc->lock);
-       if (hsreq->req.complete != NULL)
-               hsreq->req.complete(&hsep->ep, &hsreq->req);
+       usb_gadget_giveback_request(&hsep->ep, &hsreq->req);
        spin_lock(&hsudc->lock);
        hsep->stopped = stopped;
 }
 
                status = req->req.status;
 
        ep->halted = 1;
-       req->req.complete(&ep->ep, &req->req);
+       usb_gadget_giveback_request(&ep->ep, &req->req);
        ep->halted = halted;
 }
 
 
                                ep->end_point.name, request,
                                req->request.actual, req->request.length,
                                request->status);
-       req->request.complete(&req->ep->end_point, &req->request);
+       usb_gadget_giveback_request(&req->ep->end_point, &req->request);
        spin_lock(&musb->lock);
        ep->busy = busy;
 }
 
        dev_dbg(dev, "pipe %d : queue pop\n", usbhs_pipe_number(pipe));
 
        ureq->req.status = status;
-       ureq->req.complete(&uep->ep, &ureq->req);
+       usb_gadget_giveback_request(&uep->ep, &ureq->req);
 }
 
 static void usbhsg_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt)