Merge branch 'linux-linaro-lsk-v4.4-android' of git://git.linaro.org/kernel/linux...
[firefly-linux-kernel-4.4.55.git] / drivers / usb / dwc3 / ep0.c
index f13e9e9fb834a2ad15367a21990897abee5fb305..257c725e5d7ab631c90394ef065d98152f86841a 100644 (file)
@@ -63,10 +63,10 @@ static void dwc3_ep0_prepare_one_trb(struct dwc3 *dwc, u8 epnum,
 
        dep = dwc->eps[epnum];
 
-       trb = &dwc->ep0_trb[dep->free_slot];
+       trb = &dwc->ep0_trb[dep->trb_enqueue];
 
        if (chain)
-               dep->free_slot++;
+               dep->trb_enqueue++;
 
        trb->bpl = lower_32_bits(buf_dma);
        trb->bph = upper_32_bits(buf_dma);
@@ -101,8 +101,7 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum)
        params.param0 = upper_32_bits(dwc->ep0_trb_addr);
        params.param1 = lower_32_bits(dwc->ep0_trb_addr);
 
-       ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
-                       DWC3_DEPCMD_STARTTRANSFER, &params);
+       ret = dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_STARTTRANSFER, &params);
        if (ret < 0) {
                dwc3_trace(trace_dwc3_ep0, "%s STARTTRANSFER failed",
                                dep->name);
@@ -110,9 +109,7 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum)
        }
 
        dep->flags |= DWC3_EP_BUSY;
-       dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc,
-                       dep->number);
-
+       dep->resource_index = dwc3_gadget_ep_get_transfer_index(dep);
        dwc->ep0_next_event = DWC3_EP0_COMPLETE;
 
        return 0;
@@ -127,7 +124,7 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
        req->request.status     = -EINPROGRESS;
        req->epnum              = dep->number;
 
-       list_add_tail(&req->list, &dep->request_list);
+       list_add_tail(&req->list, &dep->pending_list);
 
        /*
         * Gadget driver might not be quick enough to queue a request
@@ -243,7 +240,7 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request,
        }
 
        /* we share one TRB for ep0/1 */
-       if (!list_empty(&dep->request_list)) {
+       if (!list_empty(&dep->pending_list)) {
                ret = -EBUSY;
                goto out;
        }
@@ -275,10 +272,10 @@ static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
        dep->flags = DWC3_EP_ENABLED;
        dwc->delayed_status = false;
 
-       if (!list_empty(&dep->request_list)) {
+       if (!list_empty(&dep->pending_list)) {
                struct dwc3_request     *req;
 
-               req = next_request(&dep->request_list);
+               req = next_request(&dep->pending_list);
                dwc3_gadget_giveback(dep, req, -ECONNRESET);
        }
 
@@ -464,8 +461,18 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
                        if (!set)
                                return -EINVAL;
 
-                       dwc->test_mode_nr = wIndex >> 8;
-                       dwc->test_mode = true;
+                       switch (wIndex >> 8) {
+                       case TEST_J:
+                       case TEST_K:
+                       case TEST_SE0_NAK:
+                       case TEST_PACKET:
+                       case TEST_FORCE_EN:
+                               dwc->test_mode_nr = wIndex >> 8;
+                               dwc->test_mode = true;
+                               break;
+                       default:
+                               return -EINVAL;
+                       }
                        break;
                default:
                        return -EINVAL;
@@ -490,7 +497,7 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
        case USB_RECIP_ENDPOINT:
                switch (wValue) {
                case USB_ENDPOINT_HALT:
-                       dep = dwc3_wIndex_to_dep(dwc, wIndex);
+                       dep = dwc3_wIndex_to_dep(dwc, ctrl->wIndex);
                        if (!dep)
                                return -EINVAL;
                        if (set == 0 && (dep->flags & DWC3_EP_WEDGE))
@@ -587,9 +594,6 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
                        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
                        reg |= (DWC3_DCTL_ACCEPTU1ENA | DWC3_DCTL_ACCEPTU2ENA);
                        dwc3_writel(dwc->regs, DWC3_DCTL, reg);
-
-                       dwc->resize_fifos = true;
-                       dwc3_trace(trace_dwc3_ep0, "resize FIFOs flag SET");
                }
                break;
 
@@ -616,8 +620,8 @@ static void dwc3_ep0_set_sel_cmpl(struct usb_ep *ep, struct usb_request *req)
        struct timing {
                u8      u1sel;
                u8      u1pel;
-               u16     u2sel;
-               u16     u2pel;
+               __le16  u2sel;
+               __le16  u2pel;
        } __packed timing;
 
        int             ret;
@@ -810,12 +814,14 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
 
        trace_dwc3_complete_trb(ep0, trb);
 
-       r = next_request(&ep0->request_list);
+       r = next_request(&ep0->pending_list);
        if (!r)
                return;
 
        status = DWC3_TRB_SIZE_TRBSTS(trb->size);
        if (status == DWC3_TRBSTS_SETUP_PENDING) {
+               dwc->setup_packet_pending = true;
+
                dwc3_trace(trace_dwc3_ep0, "Setup Pending received");
 
                if (r)
@@ -847,7 +853,7 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
                        trb++;
                        length = trb->size & DWC3_TRB_SIZE_MASK;
 
-                       ep0->free_slot = 0;
+                       ep0->trb_enqueue = 0;
                }
 
                transfer_size = roundup((ur->length - transfer_size),
@@ -896,8 +902,8 @@ static void dwc3_ep0_complete_status(struct dwc3 *dwc,
 
        trace_dwc3_complete_trb(dep, trb);
 
-       if (!list_empty(&dep->request_list)) {
-               r = next_request(&dep->request_list);
+       if (!list_empty(&dep->pending_list)) {
+               r = next_request(&dep->pending_list);
 
                dwc3_gadget_giveback(dep, r, 0);
        }
@@ -915,8 +921,10 @@ static void dwc3_ep0_complete_status(struct dwc3 *dwc,
        }
 
        status = DWC3_TRB_SIZE_TRBSTS(trb->size);
-       if (status == DWC3_TRBSTS_SETUP_PENDING)
+       if (status == DWC3_TRBSTS_SETUP_PENDING) {
+               dwc->setup_packet_pending = true;
                dwc3_trace(trace_dwc3_ep0, "Setup Pending received");
+       }
 
        dwc->ep0state = EP0_SETUP_PHASE;
        dwc3_ep0_out_start(dwc);
@@ -971,7 +979,7 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
                ret = usb_gadget_map_request(&dwc->gadget, &req->request,
                                dep->number);
                if (ret) {
-                       dev_dbg(dwc->dev, "failed to map request\n");
+                       dwc3_trace(trace_dwc3_ep0, "failed to map request");
                        return;
                }
 
@@ -1000,7 +1008,7 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
                ret = usb_gadget_map_request(&dwc->gadget, &req->request,
                                dep->number);
                if (ret) {
-                       dev_dbg(dwc->dev, "failed to map request\n");
+                       dwc3_trace(trace_dwc3_ep0, "failed to map request");
                        return;
                }
 
@@ -1028,12 +1036,6 @@ static int dwc3_ep0_start_control_status(struct dwc3_ep *dep)
 
 static void __dwc3_ep0_do_control_status(struct dwc3 *dwc, struct dwc3_ep *dep)
 {
-       if (dwc->resize_fifos) {
-               dwc3_trace(trace_dwc3_ep0, "Resizing FIFOs");
-               dwc3_gadget_resize_tx_fifos(dwc);
-               dwc->resize_fifos = 0;
-       }
-
        WARN_ON(dwc3_ep0_start_control_status(dep));
 }
 
@@ -1058,7 +1060,7 @@ static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep)
        cmd |= DWC3_DEPCMD_CMDIOC;
        cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
        memset(&params, 0, sizeof(params));
-       ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
+       ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
        WARN_ON_ONCE(ret);
        dep->resource_index = 0;
 }
@@ -1066,8 +1068,6 @@ static void dwc3_ep0_end_control_data(struct dwc3 *dwc, struct dwc3_ep *dep)
 static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
                const struct dwc3_event_depevt *event)
 {
-       dwc->setup_packet_pending = true;
-
        switch (event->status) {
        case DEPEVT_STATUS_CONTROL_DATA:
                dwc3_trace(trace_dwc3_ep0, "Control Data");
@@ -1114,11 +1114,8 @@ static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
 void dwc3_ep0_interrupt(struct dwc3 *dwc,
                const struct dwc3_event_depevt *event)
 {
-       u8                      epnum = event->endpoint_number;
-
-       dwc3_trace(trace_dwc3_ep0, "%s while ep%d%s in state '%s'",
-                       dwc3_ep_event_string(event->endpoint_event),
-                       epnum >> 1, (epnum & 1) ? "in" : "out",
+       dwc3_trace(trace_dwc3_ep0, "%s: state '%s'",
+                       dwc3_ep_event_string(event),
                        dwc3_ep0_state_string(dwc->ep0state));
 
        switch (event->endpoint_event) {