usb: dwc3: gadget: remove unnecessary _irqsave()
[linux-2.6-block.git] / drivers / usb / dwc3 / gadget.c
index 0c25704dcb6ba398a98012cf0d9480c9de4f44e2..cca806e09e5bcd747d9795b7c041d3b69a8e47e6 100644 (file)
@@ -948,7 +948,6 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param,
                dwc3_trace(trace_dwc3_gadget, "%s: endpoint busy", dep->name);
                return -EBUSY;
        }
-       dep->flags &= ~DWC3_EP_PENDING_REQUEST;
 
        /*
         * If we are getting here after a short-out-packet we don't enqueue any
@@ -1050,6 +1049,8 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
        req->direction          = dep->direction;
        req->epnum              = dep->number;
 
+       trace_dwc3_ep_queue(req);
+
        /*
         * We only add to our list of requests now and
         * start consuming the list once we get XferNotReady
@@ -1069,6 +1070,19 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
 
        list_add_tail(&req->list, &dep->request_list);
 
+       /*
+        * If there are no pending requests and the endpoint isn't already
+        * busy, we will just start the request straight away.
+        *
+        * This will save one IRQ (XFER_NOT_READY) and possibly make it a
+        * little bit faster.
+        */
+       if (!usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
+                       !(dep->flags & DWC3_EP_BUSY)) {
+               ret = __dwc3_gadget_kick_transfer(dep, 0, true);
+               goto out;
+       }
+
        /*
         * There are a few special cases:
         *
@@ -1096,10 +1110,10 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
                }
 
                ret = __dwc3_gadget_kick_transfer(dep, 0, true);
-               if (ret && ret != -EBUSY)
-                       dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
-                                       dep->name);
-               return ret;
+               if (!ret)
+                       dep->flags &= ~DWC3_EP_PENDING_REQUEST;
+
+               goto out;
        }
 
        /*
@@ -1113,10 +1127,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
                WARN_ON_ONCE(!dep->resource_index);
                ret = __dwc3_gadget_kick_transfer(dep, dep->resource_index,
                                false);
-               if (ret && ret != -EBUSY)
-                       dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
-                                       dep->name);
-               return ret;
+               goto out;
        }
 
        /*
@@ -1124,14 +1135,17 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
         * right away, otherwise host will not know we have streams to be
         * handled.
         */
-       if (dep->stream_capable) {
+       if (dep->stream_capable)
                ret = __dwc3_gadget_kick_transfer(dep, 0, true);
-               if (ret && ret != -EBUSY)
-                       dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
-                                       dep->name);
-       }
 
-       return 0;
+out:
+       if (ret && ret != -EBUSY)
+               dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
+                               dep->name);
+       if (ret == -EBUSY)
+               ret = 0;
+
+       return ret;
 }
 
 static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
@@ -1159,8 +1173,6 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
                goto out;
        }
 
-       trace_dwc3_ep_queue(req);
-
        ret = __dwc3_gadget_ep_queue(dep, req);
 
 out:
@@ -1955,6 +1967,14 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc,
 
                dwc->u1u2 = 0;
        }
+
+       if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
+               int ret;
+
+               ret = __dwc3_gadget_kick_transfer(dep, 0, is_xfer_complete);
+               if (!ret || ret == -EBUSY)
+                       return;
+       }
 }
 
 static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
@@ -1992,15 +2012,16 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
                if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
                        dwc3_gadget_start_isoc(dwc, dep, event);
                } else {
+                       int active;
                        int ret;
 
+                       active = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE;
+
                        dwc3_trace(trace_dwc3_gadget, "%s: reason %s",
-                                       dep->name, event->status &
-                                       DEPEVT_STATUS_TRANSFER_ACTIVE
-                                       ? "Transfer Active"
+                                       dep->name, active ? "Transfer Active"
                                        : "Transfer Not Active");
 
-                       ret = __dwc3_gadget_kick_transfer(dep, 0, 1);
+                       ret = __dwc3_gadget_kick_transfer(dep, 0, !active);
                        if (!ret || ret == -EBUSY)
                                return;
 
@@ -2621,16 +2642,15 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
 static irqreturn_t dwc3_thread_interrupt(int irq, void *_dwc)
 {
        struct dwc3 *dwc = _dwc;
-       unsigned long flags;
        irqreturn_t ret = IRQ_NONE;
        int i;
 
-       spin_lock_irqsave(&dwc->lock, flags);
+       spin_lock(&dwc->lock);
 
        for (i = 0; i < dwc->num_event_buffers; i++)
                ret |= dwc3_process_event_buf(dwc, i);
 
-       spin_unlock_irqrestore(&dwc->lock, flags);
+       spin_unlock(&dwc->lock);
 
        return ret;
 }
@@ -2665,8 +2685,6 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc)
        int                             i;
        irqreturn_t                     ret = IRQ_NONE;
 
-       spin_lock(&dwc->lock);
-
        for (i = 0; i < dwc->num_event_buffers; i++) {
                irqreturn_t status;
 
@@ -2675,8 +2693,6 @@ static irqreturn_t dwc3_interrupt(int irq, void *_dwc)
                        ret = status;
        }
 
-       spin_unlock(&dwc->lock);
-
        return ret;
 }