aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3/gadget.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/dwc3/gadget.c')
-rw-r--r--drivers/usb/dwc3/gadget.c82
1 files changed, 43 insertions, 39 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 8f65ab3a3b92..a03a485205c7 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -139,7 +139,8 @@ int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
139 udelay(5); 139 udelay(5);
140 } 140 }
141 141
142 dev_vdbg(dwc->dev, "link state change request timed out\n"); 142 dwc3_trace(trace_dwc3_gadget,
143 "link state change request timed out");
143 144
144 return -ETIMEDOUT; 145 return -ETIMEDOUT;
145} 146}
@@ -219,7 +220,7 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
219 220
220 fifo_size |= (last_fifo_depth << 16); 221 fifo_size |= (last_fifo_depth << 16);
221 222
222 dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", 223 dwc3_trace(trace_dwc3_gadget, "%s: Fifo Addr %04x Size %d",
223 dep->name, last_fifo_depth, fifo_size & 0xffff); 224 dep->name, last_fifo_depth, fifo_size & 0xffff);
224 225
225 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size); 226 dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size);
@@ -287,7 +288,8 @@ int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param)
287 do { 288 do {
288 reg = dwc3_readl(dwc->regs, DWC3_DGCMD); 289 reg = dwc3_readl(dwc->regs, DWC3_DGCMD);
289 if (!(reg & DWC3_DGCMD_CMDACT)) { 290 if (!(reg & DWC3_DGCMD_CMDACT)) {
290 dev_vdbg(dwc->dev, "Command Complete --> %d\n", 291 dwc3_trace(trace_dwc3_gadget,
292 "Command Complete --> %d",
291 DWC3_DGCMD_STATUS(reg)); 293 DWC3_DGCMD_STATUS(reg));
292 return 0; 294 return 0;
293 } 295 }
@@ -297,8 +299,11 @@ int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param)
297 * interrupt context. 299 * interrupt context.
298 */ 300 */
299 timeout--; 301 timeout--;
300 if (!timeout) 302 if (!timeout) {
303 dwc3_trace(trace_dwc3_gadget,
304 "Command Timed Out");
301 return -ETIMEDOUT; 305 return -ETIMEDOUT;
306 }
302 udelay(1); 307 udelay(1);
303 } while (1); 308 } while (1);
304} 309}
@@ -320,7 +325,8 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
320 do { 325 do {
321 reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep)); 326 reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep));
322 if (!(reg & DWC3_DEPCMD_CMDACT)) { 327 if (!(reg & DWC3_DEPCMD_CMDACT)) {
323 dev_vdbg(dwc->dev, "Command Complete --> %d\n", 328 dwc3_trace(trace_dwc3_gadget,
329 "Command Complete --> %d",
324 DWC3_DEPCMD_STATUS(reg)); 330 DWC3_DEPCMD_STATUS(reg));
325 return 0; 331 return 0;
326 } 332 }
@@ -330,8 +336,11 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
330 * interrupt context. 336 * interrupt context.
331 */ 337 */
332 timeout--; 338 timeout--;
333 if (!timeout) 339 if (!timeout) {
340 dwc3_trace(trace_dwc3_gadget,
341 "Command Timed Out");
334 return -ETIMEDOUT; 342 return -ETIMEDOUT;
343 }
335 344
336 udelay(1); 345 udelay(1);
337 } while (1); 346 } while (1);
@@ -352,9 +361,6 @@ static int dwc3_alloc_trb_pool(struct dwc3_ep *dep)
352 if (dep->trb_pool) 361 if (dep->trb_pool)
353 return 0; 362 return 0;
354 363
355 if (dep->number == 0 || dep->number == 1)
356 return 0;
357
358 dep->trb_pool = dma_alloc_coherent(dwc->dev, 364 dep->trb_pool = dma_alloc_coherent(dwc->dev,
359 sizeof(struct dwc3_trb) * DWC3_TRB_NUM, 365 sizeof(struct dwc3_trb) * DWC3_TRB_NUM,
360 &dep->trb_pool_dma, GFP_KERNEL); 366 &dep->trb_pool_dma, GFP_KERNEL);
@@ -492,7 +498,7 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
492 u32 reg; 498 u32 reg;
493 int ret; 499 int ret;
494 500
495 dev_vdbg(dwc->dev, "Enabling %s\n", dep->name); 501 dwc3_trace(trace_dwc3_gadget, "Enabling %s", dep->name);
496 502
497 if (!(dep->flags & DWC3_EP_ENABLED)) { 503 if (!(dep->flags & DWC3_EP_ENABLED)) {
498 ret = dwc3_gadget_start_config(dwc, dep); 504 ret = dwc3_gadget_start_config(dwc, dep);
@@ -729,10 +735,9 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
729 struct dwc3_request *req, dma_addr_t dma, 735 struct dwc3_request *req, dma_addr_t dma,
730 unsigned length, unsigned last, unsigned chain, unsigned node) 736 unsigned length, unsigned last, unsigned chain, unsigned node)
731{ 737{
732 struct dwc3 *dwc = dep->dwc;
733 struct dwc3_trb *trb; 738 struct dwc3_trb *trb;
734 739
735 dev_vdbg(dwc->dev, "%s: req %p dma %08llx length %d%s%s\n", 740 dwc3_trace(trace_dwc3_gadget, "%s: req %p dma %08llx length %d%s%s",
736 dep->name, req, (unsigned long long) dma, 741 dep->name, req, (unsigned long long) dma,
737 length, last ? " last" : "", 742 length, last ? " last" : "",
738 chain ? " chain" : ""); 743 chain ? " chain" : "");
@@ -934,7 +939,7 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param,
934 u32 cmd; 939 u32 cmd;
935 940
936 if (start_new && (dep->flags & DWC3_EP_BUSY)) { 941 if (start_new && (dep->flags & DWC3_EP_BUSY)) {
937 dev_vdbg(dwc->dev, "%s: endpoint busy\n", dep->name); 942 dwc3_trace(trace_dwc3_gadget, "%s: endpoint busy", dep->name);
938 return -EBUSY; 943 return -EBUSY;
939 } 944 }
940 dep->flags &= ~DWC3_EP_PENDING_REQUEST; 945 dep->flags &= ~DWC3_EP_PENDING_REQUEST;
@@ -1005,8 +1010,9 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc,
1005 u32 uf; 1010 u32 uf;
1006 1011
1007 if (list_empty(&dep->request_list)) { 1012 if (list_empty(&dep->request_list)) {
1008 dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", 1013 dwc3_trace(trace_dwc3_gadget,
1009 dep->name); 1014 "ISOC ep %s run out for requests",
1015 dep->name);
1010 dep->flags |= DWC3_EP_PENDING_REQUEST; 1016 dep->flags |= DWC3_EP_PENDING_REQUEST;
1011 return; 1017 return;
1012 } 1018 }
@@ -1113,15 +1119,10 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
1113 * handled. 1119 * handled.
1114 */ 1120 */
1115 if (dep->stream_capable) { 1121 if (dep->stream_capable) {
1116 int ret;
1117
1118 ret = __dwc3_gadget_kick_transfer(dep, 0, true); 1122 ret = __dwc3_gadget_kick_transfer(dep, 0, true);
1119 if (ret && ret != -EBUSY) { 1123 if (ret && ret != -EBUSY)
1120 struct dwc3 *dwc = dep->dwc;
1121
1122 dev_dbg(dwc->dev, "%s: failed to kick transfers\n", 1124 dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
1123 dep->name); 1125 dep->name);
1124 }
1125 } 1126 }
1126 1127
1127 return 0; 1128 return 0;
@@ -1152,8 +1153,6 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
1152 goto out; 1153 goto out;
1153 } 1154 }
1154 1155
1155 dev_vdbg(dwc->dev, "queing request %p to %s length %d\n",
1156 request, ep->name, request->length);
1157 trace_dwc3_ep_queue(req); 1156 trace_dwc3_ep_queue(req);
1158 1157
1159 ret = __dwc3_gadget_ep_queue(dep, req); 1158 ret = __dwc3_gadget_ep_queue(dep, req);
@@ -1416,7 +1415,7 @@ static int dwc3_gadget_set_selfpowered(struct usb_gadget *g,
1416 unsigned long flags; 1415 unsigned long flags;
1417 1416
1418 spin_lock_irqsave(&dwc->lock, flags); 1417 spin_lock_irqsave(&dwc->lock, flags);
1419 dwc->is_selfpowered = !!is_selfpowered; 1418 g->is_selfpowered = !!is_selfpowered;
1420 spin_unlock_irqrestore(&dwc->lock, flags); 1419 spin_unlock_irqrestore(&dwc->lock, flags);
1421 1420
1422 return 0; 1421 return 0;
@@ -1468,7 +1467,7 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
1468 udelay(1); 1467 udelay(1);
1469 } while (1); 1468 } while (1);
1470 1469
1471 dev_vdbg(dwc->dev, "gadget %s data soft-%s\n", 1470 dwc3_trace(trace_dwc3_gadget, "gadget %s data soft-%s",
1472 dwc->gadget_driver 1471 dwc->gadget_driver
1473 ? dwc->gadget_driver->function : "no-function", 1472 ? dwc->gadget_driver->function : "no-function",
1474 is_on ? "connect" : "disconnect"); 1473 is_on ? "connect" : "disconnect");
@@ -1688,7 +1687,7 @@ static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc,
1688 1687
1689 dep->endpoint.name = dep->name; 1688 dep->endpoint.name = dep->name;
1690 1689
1691 dev_vdbg(dwc->dev, "initializing %s\n", dep->name); 1690 dwc3_trace(trace_dwc3_gadget, "initializing %s", dep->name);
1692 1691
1693 if (epnum == 0 || epnum == 1) { 1692 if (epnum == 0 || epnum == 1) {
1694 usb_ep_set_maxpacket_limit(&dep->endpoint, 512); 1693 usb_ep_set_maxpacket_limit(&dep->endpoint, 512);
@@ -1725,13 +1724,15 @@ static int dwc3_gadget_init_endpoints(struct dwc3 *dwc)
1725 1724
1726 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0); 1725 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0);
1727 if (ret < 0) { 1726 if (ret < 0) {
1728 dev_vdbg(dwc->dev, "failed to allocate OUT endpoints\n"); 1727 dwc3_trace(trace_dwc3_gadget,
1728 "failed to allocate OUT endpoints");
1729 return ret; 1729 return ret;
1730 } 1730 }
1731 1731
1732 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1); 1732 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1);
1733 if (ret < 0) { 1733 if (ret < 0) {
1734 dev_vdbg(dwc->dev, "failed to allocate IN endpoints\n"); 1734 dwc3_trace(trace_dwc3_gadget,
1735 "failed to allocate IN endpoints");
1735 return ret; 1736 return ret;
1736 } 1737 }
1737 1738
@@ -1977,7 +1978,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
1977 } else { 1978 } else {
1978 int ret; 1979 int ret;
1979 1980
1980 dev_vdbg(dwc->dev, "%s: reason %s\n", 1981 dwc3_trace(trace_dwc3_gadget, "%s: reason %s",
1981 dep->name, event->status & 1982 dep->name, event->status &
1982 DEPEVT_STATUS_TRANSFER_ACTIVE 1983 DEPEVT_STATUS_TRANSFER_ACTIVE
1983 ? "Transfer Active" 1984 ? "Transfer Active"
@@ -2001,7 +2002,8 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
2001 2002
2002 switch (event->status) { 2003 switch (event->status) {
2003 case DEPEVT_STREAMEVT_FOUND: 2004 case DEPEVT_STREAMEVT_FOUND:
2004 dev_vdbg(dwc->dev, "Stream %d found and started\n", 2005 dwc3_trace(trace_dwc3_gadget,
2006 "Stream %d found and started",
2005 event->parameters); 2007 event->parameters);
2006 2008
2007 break; 2009 break;
@@ -2015,7 +2017,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
2015 dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name); 2017 dev_dbg(dwc->dev, "%s FIFO Overrun\n", dep->name);
2016 break; 2018 break;
2017 case DWC3_DEPEVT_EPCMDCMPLT: 2019 case DWC3_DEPEVT_EPCMDCMPLT:
2018 dev_vdbg(dwc->dev, "Endpoint Command Complete\n"); 2020 dwc3_trace(trace_dwc3_gadget, "Endpoint Command Complete");
2019 break; 2021 break;
2020 } 2022 }
2021} 2023}
@@ -2043,6 +2045,7 @@ static void dwc3_resume_gadget(struct dwc3 *dwc)
2043 if (dwc->gadget_driver && dwc->gadget_driver->resume) { 2045 if (dwc->gadget_driver && dwc->gadget_driver->resume) {
2044 spin_unlock(&dwc->lock); 2046 spin_unlock(&dwc->lock);
2045 dwc->gadget_driver->resume(&dwc->gadget); 2047 dwc->gadget_driver->resume(&dwc->gadget);
2048 spin_lock(&dwc->lock);
2046 } 2049 }
2047} 2050}
2048 2051
@@ -2079,7 +2082,7 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force)
2079 * We have discussed this with the IP Provider and it was 2082 * We have discussed this with the IP Provider and it was
2080 * suggested to giveback all requests here, but give HW some 2083 * suggested to giveback all requests here, but give HW some
2081 * extra time to synchronize with the interconnect. We're using 2084 * extra time to synchronize with the interconnect. We're using
2082 * an arbitraty 100us delay for that. 2085 * an arbitrary 100us delay for that.
2083 * 2086 *
2084 * Note also that a similar handling was tested by Synopsys 2087 * Note also that a similar handling was tested by Synopsys
2085 * (thanks a lot Paul) and nothing bad has come out of it. 2088 * (thanks a lot Paul) and nothing bad has come out of it.
@@ -2389,7 +2392,8 @@ static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,
2389 (pwropt != DWC3_GHWPARAMS1_EN_PWROPT_HIB)) { 2392 (pwropt != DWC3_GHWPARAMS1_EN_PWROPT_HIB)) {
2390 if ((dwc->link_state == DWC3_LINK_STATE_U3) && 2393 if ((dwc->link_state == DWC3_LINK_STATE_U3) &&
2391 (next == DWC3_LINK_STATE_RESUME)) { 2394 (next == DWC3_LINK_STATE_RESUME)) {
2392 dev_vdbg(dwc->dev, "ignoring transition U3 -> Resume\n"); 2395 dwc3_trace(trace_dwc3_gadget,
2396 "ignoring transition U3 -> Resume");
2393 return; 2397 return;
2394 } 2398 }
2395 } 2399 }
@@ -2511,22 +2515,22 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
2511 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info); 2515 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info);
2512 break; 2516 break;
2513 case DWC3_DEVICE_EVENT_EOPF: 2517 case DWC3_DEVICE_EVENT_EOPF:
2514 dev_vdbg(dwc->dev, "End of Periodic Frame\n"); 2518 dwc3_trace(trace_dwc3_gadget, "End of Periodic Frame");
2515 break; 2519 break;
2516 case DWC3_DEVICE_EVENT_SOF: 2520 case DWC3_DEVICE_EVENT_SOF:
2517 dev_vdbg(dwc->dev, "Start of Periodic Frame\n"); 2521 dwc3_trace(trace_dwc3_gadget, "Start of Periodic Frame");
2518 break; 2522 break;
2519 case DWC3_DEVICE_EVENT_ERRATIC_ERROR: 2523 case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
2520 dev_vdbg(dwc->dev, "Erratic Error\n"); 2524 dwc3_trace(trace_dwc3_gadget, "Erratic Error");
2521 break; 2525 break;
2522 case DWC3_DEVICE_EVENT_CMD_CMPL: 2526 case DWC3_DEVICE_EVENT_CMD_CMPL:
2523 dev_vdbg(dwc->dev, "Command Complete\n"); 2527 dwc3_trace(trace_dwc3_gadget, "Command Complete");
2524 break; 2528 break;
2525 case DWC3_DEVICE_EVENT_OVERFLOW: 2529 case DWC3_DEVICE_EVENT_OVERFLOW:
2526 dev_vdbg(dwc->dev, "Overflow\n"); 2530 dwc3_trace(trace_dwc3_gadget, "Overflow");
2527 break; 2531 break;
2528 default: 2532 default:
2529 dev_dbg(dwc->dev, "UNKNOWN IRQ %d\n", event->type); 2533 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type);
2530 } 2534 }
2531} 2535}
2532 2536