diff options
author | Paul Zimmerman <Paul.Zimmerman@synopsys.com> | 2012-04-27 07:17:35 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-03-05 15:40:03 -0500 |
commit | b992e6813e257269e9599ca07be8bd52df784bf5 (patch) | |
tree | 8582fc96886d9e472d1dff2da9bdbd9c4fb70916 /drivers/usb/dwc3 | |
parent | 356363bf6b2fc4785d874ef87ed2fad4b8543490 (diff) |
usb: dwc3: gadget: add 'force' argument to stop_active_transfer
It's not always we need to force a transfer to be removed
from the core's internal cache. This extra argument will
help differentiating those two cases.
Signed-off-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index df9749eac6ac..f1cb0984046e 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -570,13 +570,13 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, | |||
570 | return 0; | 570 | return 0; |
571 | } | 571 | } |
572 | 572 | ||
573 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum); | 573 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force); |
574 | static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) | 574 | static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) |
575 | { | 575 | { |
576 | struct dwc3_request *req; | 576 | struct dwc3_request *req; |
577 | 577 | ||
578 | if (!list_empty(&dep->req_queued)) { | 578 | if (!list_empty(&dep->req_queued)) { |
579 | dwc3_stop_active_transfer(dwc, dep->number); | 579 | dwc3_stop_active_transfer(dwc, dep->number, true); |
580 | 580 | ||
581 | /* - giveback all requests to gadget driver */ | 581 | /* - giveback all requests to gadget driver */ |
582 | while (!list_empty(&dep->req_queued)) { | 582 | while (!list_empty(&dep->req_queued)) { |
@@ -1099,7 +1099,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
1099 | */ | 1099 | */ |
1100 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { | 1100 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { |
1101 | if (list_empty(&dep->req_queued)) { | 1101 | if (list_empty(&dep->req_queued)) { |
1102 | dwc3_stop_active_transfer(dwc, dep->number); | 1102 | dwc3_stop_active_transfer(dwc, dep->number, true); |
1103 | dep->flags = DWC3_EP_ENABLED; | 1103 | dep->flags = DWC3_EP_ENABLED; |
1104 | } | 1104 | } |
1105 | return 0; | 1105 | return 0; |
@@ -1185,7 +1185,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, | |||
1185 | } | 1185 | } |
1186 | if (r == req) { | 1186 | if (r == req) { |
1187 | /* wait until it is processed */ | 1187 | /* wait until it is processed */ |
1188 | dwc3_stop_active_transfer(dwc, dep->number); | 1188 | dwc3_stop_active_transfer(dwc, dep->number, true); |
1189 | goto out1; | 1189 | goto out1; |
1190 | } | 1190 | } |
1191 | dev_err(dwc->dev, "request %p was not queued to %s\n", | 1191 | dev_err(dwc->dev, "request %p was not queued to %s\n", |
@@ -1881,7 +1881,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
1881 | */ | 1881 | */ |
1882 | dep->flags = DWC3_EP_PENDING_REQUEST; | 1882 | dep->flags = DWC3_EP_PENDING_REQUEST; |
1883 | } else { | 1883 | } else { |
1884 | dwc3_stop_active_transfer(dwc, dep->number); | 1884 | dwc3_stop_active_transfer(dwc, dep->number, true); |
1885 | dep->flags = DWC3_EP_ENABLED; | 1885 | dep->flags = DWC3_EP_ENABLED; |
1886 | } | 1886 | } |
1887 | return 1; | 1887 | return 1; |
@@ -2028,7 +2028,7 @@ static void dwc3_disconnect_gadget(struct dwc3 *dwc) | |||
2028 | } | 2028 | } |
2029 | } | 2029 | } |
2030 | 2030 | ||
2031 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum) | 2031 | static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force) |
2032 | { | 2032 | { |
2033 | struct dwc3_ep *dep; | 2033 | struct dwc3_ep *dep; |
2034 | struct dwc3_gadget_ep_cmd_params params; | 2034 | struct dwc3_gadget_ep_cmd_params params; |
@@ -2060,7 +2060,8 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum) | |||
2060 | */ | 2060 | */ |
2061 | 2061 | ||
2062 | cmd = DWC3_DEPCMD_ENDTRANSFER; | 2062 | cmd = DWC3_DEPCMD_ENDTRANSFER; |
2063 | cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC; | 2063 | cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0; |
2064 | cmd |= DWC3_DEPCMD_CMDIOC; | ||
2064 | cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); | 2065 | cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); |
2065 | memset(¶ms, 0, sizeof(params)); | 2066 | memset(¶ms, 0, sizeof(params)); |
2066 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); | 2067 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); |