usb: dwc3: clear 'res_trans_idx' as soon as it becomes invalid
authorPaul Zimmerman <Paul.Zimmerman@synopsys.com>
Sat, 25 Feb 2012 01:32:18 +0000 (17:32 -0800)
committerFelipe Balbi <balbi@ti.com>
Fri, 2 Mar 2012 10:12:11 +0000 (12:12 +0200)
Transfer resource index is cleared in hardware when XFERCOMPLETE
event is generated, so clear the driver's res_trans_idx variable
immediately after that event is received. The upcoming hibernation
patches depend on this change.

Signed-off-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/dwc3/ep0.c
drivers/usb/dwc3/gadget.c

index 4fa2c9873eab9e8927edab83a7cef120d43d05f1..73efdf6938a2acb92c0e246cc52e98b62a21188b 100644 (file)
@@ -617,6 +617,7 @@ static void dwc3_ep0_xfer_complete(struct dwc3 *dwc,
        struct dwc3_ep          *dep = dwc->eps[event->endpoint_number];
 
        dep->flags &= ~DWC3_EP_BUSY;
+       dep->res_trans_idx = 0;
        dwc->setup_packet_pending = false;
 
        switch (dwc->ep0state) {
index bfdfd4f151f8e46814af119a7ce7bb205ac4dd37..da317f6a8bce0bb3821ad659cc3c0148a54c174b 100644 (file)
@@ -1628,10 +1628,8 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc,
                status = -ECONNRESET;
 
        clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status);
-       if (clean_busy) {
+       if (clean_busy)
                dep->flags &= ~DWC3_EP_BUSY;
-               dep->res_trans_idx = 0;
-       }
 
        /*
         * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
@@ -1736,6 +1734,8 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
 
        switch (event->endpoint_event) {
        case DWC3_DEPEVT_XFERCOMPLETE:
+               dep->res_trans_idx = 0;
+
                if (usb_endpoint_xfer_isoc(dep->desc)) {
                        dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n",
                                        dep->name);