Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 280831
b: refs/heads/master
c: 5bdb1dc
h: refs/heads/master
i:
  280829: 134a104
  280827: 74e4080
  280823: 3570581
  280815: 6c5c3f0
  280799: fbecc98
  280767: 6fa1d3f
  280703: a58ece8
  280575: cd71a68
v: v3
  • Loading branch information
Sebastian Andrzej Siewior authored and Felipe Balbi committed Dec 12, 2011
1 parent fd798b4 commit 0c975dc
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f0f2b2a2db85f99637376caf25e46623af56acad
refs/heads/master: 5bdb1dcc63304a407e70020c1118fca1642bebaa
1 change: 1 addition & 0 deletions trunk/drivers/usb/dwc3/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,7 @@ struct dwc3 {
unsigned ep0_bounced:1;
unsigned ep0_expect_in:1;
unsigned start_config_issued:1;
unsigned delayed_status:1;

enum dwc3_ep0_next ep0_next_event;
enum dwc3_ep0_state ep0state;
Expand Down
26 changes: 23 additions & 3 deletions trunk/drivers/usb/dwc3/ep0.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,14 @@

#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/composite.h>

#include "core.h"
#include "gadget.h"
#include "io.h"

static void dwc3_ep0_do_control_status(struct dwc3 *dwc, u32 epnum);

static const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
{
switch (state) {
Expand Down Expand Up @@ -122,6 +125,8 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,
static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
struct dwc3_request *req)
{
struct dwc3 *dwc = dep->dwc;
u32 type;
int ret = 0;

req->request.actual = 0;
Expand All @@ -140,9 +145,7 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
* IRQ we were waiting for is long gone.
*/
if (dep->flags & DWC3_EP_PENDING_REQUEST) {
struct dwc3 *dwc = dep->dwc;
unsigned direction;
u32 type;

direction = !!(dep->flags & DWC3_EP0_DIR_IN);

Expand All @@ -162,6 +165,10 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
req->request.dma, req->request.length, type);
dep->flags &= ~(DWC3_EP_PENDING_REQUEST |
DWC3_EP0_DIR_IN);

} else if (dwc->delayed_status && (dwc->ep0state == EP0_STATUS_PHASE)) {
dwc->delayed_status = false;
dwc3_ep0_do_control_status(dwc, 1);
}

return ret;
Expand Down Expand Up @@ -211,6 +218,7 @@ static void dwc3_ep0_stall_and_restart(struct dwc3 *dwc)
/* stall is always issued on EP0 */
__dwc3_gadget_ep_set_halt(dep, 1);
dep->flags = DWC3_EP_ENABLED;
dwc->delayed_status = false;

if (!list_empty(&dep->request_list)) {
struct dwc3_request *req;
Expand Down Expand Up @@ -472,8 +480,10 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
if (!cfg)
dwc->dev_state = DWC3_ADDRESS_STATE;
break;
default:
ret = -EINVAL;
}
return 0;
return ret;
}

static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
Expand Down Expand Up @@ -536,6 +546,9 @@ static void dwc3_ep0_inspect_setup(struct dwc3 *dwc,
else
ret = dwc3_ep0_delegate_req(dwc, ctrl);

if (ret == USB_GADGET_DELAYED_STATUS)
dwc->delayed_status = true;

if (ret >= 0)
return;

Expand Down Expand Up @@ -801,6 +814,13 @@ static void dwc3_ep0_xfernotready(struct dwc3 *dwc,
dwc3_ep0_stall_and_restart(dwc);
return;
}

if (dwc->delayed_status) {
WARN_ON_ONCE(event->endpoint_number != 1);
dev_vdbg(dwc->dev, "Mass Storage delayed status\n");
return;
}

dwc3_ep0_do_control_status(dwc, event->endpoint_number);
}
}
Expand Down

0 comments on commit 0c975dc

Please sign in to comment.