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.c151
1 files changed, 107 insertions, 44 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 5255fe975ea1..3df1a1973b05 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -178,8 +178,8 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
178 if (!(dep->flags & DWC3_EP_ENABLED)) 178 if (!(dep->flags & DWC3_EP_ENABLED))
179 continue; 179 continue;
180 180
181 if (usb_endpoint_xfer_bulk(dep->desc) 181 if (usb_endpoint_xfer_bulk(dep->endpoint.desc)
182 || usb_endpoint_xfer_isoc(dep->desc)) 182 || usb_endpoint_xfer_isoc(dep->endpoint.desc))
183 mult = 3; 183 mult = 3;
184 184
185 /* 185 /*
@@ -229,7 +229,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
229 * completed (not the LINK TRB). 229 * completed (not the LINK TRB).
230 */ 230 */
231 if (((dep->busy_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) && 231 if (((dep->busy_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
232 usb_endpoint_xfer_isoc(dep->desc)) 232 usb_endpoint_xfer_isoc(dep->endpoint.desc))
233 dep->busy_slot++; 233 dep->busy_slot++;
234 } 234 }
235 list_del(&req->list); 235 list_del(&req->list);
@@ -276,6 +276,33 @@ static const char *dwc3_gadget_ep_cmd_string(u8 cmd)
276 } 276 }
277} 277}
278 278
279int dwc3_send_gadget_generic_command(struct dwc3 *dwc, int cmd, u32 param)
280{
281 u32 timeout = 500;
282 u32 reg;
283
284 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param);
285 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT);
286
287 do {
288 reg = dwc3_readl(dwc->regs, DWC3_DGCMD);
289 if (!(reg & DWC3_DGCMD_CMDACT)) {
290 dev_vdbg(dwc->dev, "Command Complete --> %d\n",
291 DWC3_DGCMD_STATUS(reg));
292 return 0;
293 }
294
295 /*
296 * We can't sleep here, because it's also called from
297 * interrupt context.
298 */
299 timeout--;
300 if (!timeout)
301 return -ETIMEDOUT;
302 udelay(1);
303 } while (1);
304}
305
279int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, 306int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
280 unsigned cmd, struct dwc3_gadget_ep_cmd_params *params) 307 unsigned cmd, struct dwc3_gadget_ep_cmd_params *params)
281{ 308{
@@ -470,7 +497,7 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
470 if (ret) 497 if (ret)
471 return ret; 498 return ret;
472 499
473 dep->desc = desc; 500 dep->endpoint.desc = desc;
474 dep->comp_desc = comp_desc; 501 dep->comp_desc = comp_desc;
475 dep->type = usb_endpoint_type(desc); 502 dep->type = usb_endpoint_type(desc);
476 dep->flags |= DWC3_EP_ENABLED; 503 dep->flags |= DWC3_EP_ENABLED;
@@ -533,7 +560,6 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
533 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg); 560 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
534 561
535 dep->stream_capable = false; 562 dep->stream_capable = false;
536 dep->desc = NULL;
537 dep->endpoint.desc = NULL; 563 dep->endpoint.desc = NULL;
538 dep->comp_desc = NULL; 564 dep->comp_desc = NULL;
539 dep->type = 0; 565 dep->type = 0;
@@ -694,7 +720,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
694 720
695 /* Skip the LINK-TRB on ISOC */ 721 /* Skip the LINK-TRB on ISOC */
696 if (((cur_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) && 722 if (((cur_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
697 usb_endpoint_xfer_isoc(dep->desc)) 723 usb_endpoint_xfer_isoc(dep->endpoint.desc))
698 return; 724 return;
699 725
700 if (!req->trb) { 726 if (!req->trb) {
@@ -707,7 +733,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
707 trb->bpl = lower_32_bits(dma); 733 trb->bpl = lower_32_bits(dma);
708 trb->bph = upper_32_bits(dma); 734 trb->bph = upper_32_bits(dma);
709 735
710 switch (usb_endpoint_type(dep->desc)) { 736 switch (usb_endpoint_type(dep->endpoint.desc)) {
711 case USB_ENDPOINT_XFER_CONTROL: 737 case USB_ENDPOINT_XFER_CONTROL:
712 trb->ctrl = DWC3_TRBCTL_CONTROL_SETUP; 738 trb->ctrl = DWC3_TRBCTL_CONTROL_SETUP;
713 break; 739 break;
@@ -732,7 +758,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
732 BUG(); 758 BUG();
733 } 759 }
734 760
735 if (usb_endpoint_xfer_isoc(dep->desc)) { 761 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
736 trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI; 762 trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
737 trb->ctrl |= DWC3_TRB_CTRL_CSP; 763 trb->ctrl |= DWC3_TRB_CTRL_CSP;
738 } else { 764 } else {
@@ -743,7 +769,7 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
743 trb->ctrl |= DWC3_TRB_CTRL_LST; 769 trb->ctrl |= DWC3_TRB_CTRL_LST;
744 } 770 }
745 771
746 if (usb_endpoint_xfer_bulk(dep->desc) && dep->stream_capable) 772 if (usb_endpoint_xfer_bulk(dep->endpoint.desc) && dep->stream_capable)
747 trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(req->request.stream_id); 773 trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(req->request.stream_id);
748 774
749 trb->ctrl |= DWC3_TRB_CTRL_HWO; 775 trb->ctrl |= DWC3_TRB_CTRL_HWO;
@@ -771,7 +797,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
771 trbs_left = (dep->busy_slot - dep->free_slot) & DWC3_TRB_MASK; 797 trbs_left = (dep->busy_slot - dep->free_slot) & DWC3_TRB_MASK;
772 798
773 /* Can't wrap around on a non-isoc EP since there's no link TRB */ 799 /* Can't wrap around on a non-isoc EP since there's no link TRB */
774 if (!usb_endpoint_xfer_isoc(dep->desc)) { 800 if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
775 max = DWC3_TRB_NUM - (dep->free_slot & DWC3_TRB_MASK); 801 max = DWC3_TRB_NUM - (dep->free_slot & DWC3_TRB_MASK);
776 if (trbs_left > max) 802 if (trbs_left > max)
777 trbs_left = max; 803 trbs_left = max;
@@ -797,7 +823,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
797 * processed from the first TRB until the last one. Since we 823 * processed from the first TRB until the last one. Since we
798 * don't wrap around we have to start at the beginning. 824 * don't wrap around we have to start at the beginning.
799 */ 825 */
800 if (usb_endpoint_xfer_isoc(dep->desc)) { 826 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
801 dep->busy_slot = 1; 827 dep->busy_slot = 1;
802 dep->free_slot = 1; 828 dep->free_slot = 1;
803 } else { 829 } else {
@@ -807,7 +833,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
807 } 833 }
808 834
809 /* The last TRB is a link TRB, not used for xfer */ 835 /* The last TRB is a link TRB, not used for xfer */
810 if ((trbs_left <= 1) && usb_endpoint_xfer_isoc(dep->desc)) 836 if ((trbs_left <= 1) && usb_endpoint_xfer_isoc(dep->endpoint.desc))
811 return; 837 return;
812 838
813 list_for_each_entry_safe(req, n, &dep->request_list, list) { 839 list_for_each_entry_safe(req, n, &dep->request_list, list) {
@@ -930,10 +956,12 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param,
930 } 956 }
931 957
932 dep->flags |= DWC3_EP_BUSY; 958 dep->flags |= DWC3_EP_BUSY;
933 dep->res_trans_idx = dwc3_gadget_ep_get_transfer_index(dwc,
934 dep->number);
935 959
936 WARN_ON_ONCE(!dep->res_trans_idx); 960 if (start_new) {
961 dep->res_trans_idx = dwc3_gadget_ep_get_transfer_index(dwc,
962 dep->number);
963 WARN_ON_ONCE(!dep->res_trans_idx);
964 }
937 965
938 return 0; 966 return 0;
939} 967}
@@ -967,28 +995,37 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
967 995
968 list_add_tail(&req->list, &dep->request_list); 996 list_add_tail(&req->list, &dep->request_list);
969 997
998 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && (dep->flags & DWC3_EP_BUSY))
999 dep->flags |= DWC3_EP_PENDING_REQUEST;
1000
970 /* 1001 /*
971 * There is one special case: XferNotReady with 1002 * There are two special cases:
972 * empty list of requests. We need to kick the 1003 *
973 * transfer here in that situation, otherwise 1004 * 1. XferNotReady with empty list of requests. We need to kick the
974 * we will be NAKing forever. 1005 * transfer here in that situation, otherwise we will be NAKing
1006 * forever. If we get XferNotReady before gadget driver has a
1007 * chance to queue a request, we will ACK the IRQ but won't be
1008 * able to receive the data until the next request is queued.
1009 * The following code is handling exactly that.
975 * 1010 *
976 * If we get XferNotReady before gadget driver 1011 * 2. XferInProgress on Isoc EP with an active transfer. We need to
977 * has a chance to queue a request, we will ACK 1012 * kick the transfer here after queuing a request, otherwise the
978 * the IRQ but won't be able to receive the data 1013 * core may not see the modified TRB(s).
979 * until the next request is queued. The following
980 * code is handling exactly that.
981 */ 1014 */
982 if (dep->flags & DWC3_EP_PENDING_REQUEST) { 1015 if (dep->flags & DWC3_EP_PENDING_REQUEST) {
983 int ret; 1016 int ret;
984 int start_trans; 1017 int start_trans = 1;
1018 u8 trans_idx = dep->res_trans_idx;
985 1019
986 start_trans = 1; 1020 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
987 if (usb_endpoint_xfer_isoc(dep->desc) && 1021 (dep->flags & DWC3_EP_BUSY)) {
988 (dep->flags & DWC3_EP_BUSY))
989 start_trans = 0; 1022 start_trans = 0;
1023 WARN_ON_ONCE(!trans_idx);
1024 } else {
1025 trans_idx = 0;
1026 }
990 1027
991 ret = __dwc3_gadget_kick_transfer(dep, 0, start_trans); 1028 ret = __dwc3_gadget_kick_transfer(dep, trans_idx, start_trans);
992 if (ret && ret != -EBUSY) { 1029 if (ret && ret != -EBUSY) {
993 struct dwc3 *dwc = dep->dwc; 1030 struct dwc3 *dwc = dep->dwc;
994 1031
@@ -1011,7 +1048,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
1011 1048
1012 int ret; 1049 int ret;
1013 1050
1014 if (!dep->desc) { 1051 if (!dep->endpoint.desc) {
1015 dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n", 1052 dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n",
1016 request, ep->name); 1053 request, ep->name);
1017 return -ESHUTDOWN; 1054 return -ESHUTDOWN;
@@ -1125,7 +1162,7 @@ static int dwc3_gadget_ep_set_halt(struct usb_ep *ep, int value)
1125 1162
1126 spin_lock_irqsave(&dwc->lock, flags); 1163 spin_lock_irqsave(&dwc->lock, flags);
1127 1164
1128 if (usb_endpoint_xfer_isoc(dep->desc)) { 1165 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
1129 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name); 1166 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name);
1130 ret = -EINVAL; 1167 ret = -EINVAL;
1131 goto out; 1168 goto out;
@@ -1356,7 +1393,24 @@ static int dwc3_gadget_start(struct usb_gadget *g,
1356 1393
1357 reg = dwc3_readl(dwc->regs, DWC3_DCFG); 1394 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
1358 reg &= ~(DWC3_DCFG_SPEED_MASK); 1395 reg &= ~(DWC3_DCFG_SPEED_MASK);
1359 reg |= dwc->maximum_speed; 1396
1397 /**
1398 * WORKAROUND: DWC3 revision < 2.20a have an issue
1399 * which would cause metastability state on Run/Stop
1400 * bit if we try to force the IP to USB2-only mode.
1401 *
1402 * Because of that, we cannot configure the IP to any
1403 * speed other than the SuperSpeed
1404 *
1405 * Refers to:
1406 *
1407 * STAR#9000525659: Clock Domain Crossing on DCTL in
1408 * USB 2.0 Mode
1409 */
1410 if (dwc->revision < DWC3_REVISION_220A)
1411 reg |= DWC3_DCFG_SUPERSPEED;
1412 else
1413 reg |= dwc->maximum_speed;
1360 dwc3_writel(dwc->regs, DWC3_DCFG, reg); 1414 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
1361 1415
1362 dwc->start_config_issued = false; 1416 dwc->start_config_issued = false;
@@ -1681,7 +1735,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
1681 case DWC3_DEPEVT_XFERCOMPLETE: 1735 case DWC3_DEPEVT_XFERCOMPLETE:
1682 dep->res_trans_idx = 0; 1736 dep->res_trans_idx = 0;
1683 1737
1684 if (usb_endpoint_xfer_isoc(dep->desc)) { 1738 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
1685 dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n", 1739 dev_dbg(dwc->dev, "%s is an Isochronous endpoint\n",
1686 dep->name); 1740 dep->name);
1687 return; 1741 return;
@@ -1690,7 +1744,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
1690 dwc3_endpoint_transfer_complete(dwc, dep, event, 1); 1744 dwc3_endpoint_transfer_complete(dwc, dep, event, 1);
1691 break; 1745 break;
1692 case DWC3_DEPEVT_XFERINPROGRESS: 1746 case DWC3_DEPEVT_XFERINPROGRESS:
1693 if (!usb_endpoint_xfer_isoc(dep->desc)) { 1747 if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
1694 dev_dbg(dwc->dev, "%s is not an Isochronous endpoint\n", 1748 dev_dbg(dwc->dev, "%s is not an Isochronous endpoint\n",
1695 dep->name); 1749 dep->name);
1696 return; 1750 return;
@@ -1699,7 +1753,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
1699 dwc3_endpoint_transfer_complete(dwc, dep, event, 0); 1753 dwc3_endpoint_transfer_complete(dwc, dep, event, 0);
1700 break; 1754 break;
1701 case DWC3_DEPEVT_XFERNOTREADY: 1755 case DWC3_DEPEVT_XFERNOTREADY:
1702 if (usb_endpoint_xfer_isoc(dep->desc)) { 1756 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
1703 dwc3_gadget_start_isoc(dwc, dep, event); 1757 dwc3_gadget_start_isoc(dwc, dep, event);
1704 } else { 1758 } else {
1705 int ret; 1759 int ret;
@@ -1720,7 +1774,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
1720 1774
1721 break; 1775 break;
1722 case DWC3_DEPEVT_STREAMEVT: 1776 case DWC3_DEPEVT_STREAMEVT:
1723 if (!usb_endpoint_xfer_bulk(dep->desc)) { 1777 if (!usb_endpoint_xfer_bulk(dep->endpoint.desc)) {
1724 dev_err(dwc->dev, "Stream event for non-Bulk %s\n", 1778 dev_err(dwc->dev, "Stream event for non-Bulk %s\n",
1725 dep->name); 1779 dep->name);
1726 return; 1780 return;
@@ -1916,6 +1970,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
1916 1970
1917 reg = dwc3_readl(dwc->regs, DWC3_DCTL); 1971 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
1918 reg &= ~DWC3_DCTL_TSTCTRL_MASK; 1972 reg &= ~DWC3_DCTL_TSTCTRL_MASK;
1973 reg &= ~(DWC3_DCTL_INITU1ENA | DWC3_DCTL_INITU2ENA);
1919 dwc3_writel(dwc->regs, DWC3_DCTL, reg); 1974 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
1920 dwc->test_mode = false; 1975 dwc->test_mode = false;
1921 1976
@@ -2263,8 +2318,7 @@ int __devinit dwc3_gadget_init(struct dwc3 *dwc)
2263 goto err1; 2318 goto err1;
2264 } 2319 }
2265 2320
2266 dwc->setup_buf = kzalloc(sizeof(*dwc->setup_buf) * 2, 2321 dwc->setup_buf = kzalloc(DWC3_EP0_BOUNCE_SIZE, GFP_KERNEL);
2267 GFP_KERNEL);
2268 if (!dwc->setup_buf) { 2322 if (!dwc->setup_buf) {
2269 dev_err(dwc->dev, "failed to allocate setup buffer\n"); 2323 dev_err(dwc->dev, "failed to allocate setup buffer\n");
2270 ret = -ENOMEM; 2324 ret = -ENOMEM;
@@ -2272,7 +2326,8 @@ int __devinit dwc3_gadget_init(struct dwc3 *dwc)
2272 } 2326 }
2273 2327
2274 dwc->ep0_bounce = dma_alloc_coherent(dwc->dev, 2328 dwc->ep0_bounce = dma_alloc_coherent(dwc->dev,
2275 512, &dwc->ep0_bounce_addr, GFP_KERNEL); 2329 DWC3_EP0_BOUNCE_SIZE, &dwc->ep0_bounce_addr,
2330 GFP_KERNEL);
2276 if (!dwc->ep0_bounce) { 2331 if (!dwc->ep0_bounce) {
2277 dev_err(dwc->dev, "failed to allocate ep0 bounce buffer\n"); 2332 dev_err(dwc->dev, "failed to allocate ep0 bounce buffer\n");
2278 ret = -ENOMEM; 2333 ret = -ENOMEM;
@@ -2313,6 +2368,14 @@ int __devinit dwc3_gadget_init(struct dwc3 *dwc)
2313 goto err5; 2368 goto err5;
2314 } 2369 }
2315 2370
2371 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2372 reg |= DWC3_DCFG_LPM_CAP;
2373 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2374
2375 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2376 reg |= DWC3_DCTL_ACCEPTU1ENA | DWC3_DCTL_ACCEPTU2ENA;
2377 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
2378
2316 /* Enable all but Start and End of Frame IRQs */ 2379 /* Enable all but Start and End of Frame IRQs */
2317 reg = (DWC3_DEVTEN_VNDRDEVTSTRCVEDEN | 2380 reg = (DWC3_DEVTEN_VNDRDEVTSTRCVEDEN |
2318 DWC3_DEVTEN_EVNTOVERFLOWEN | 2381 DWC3_DEVTEN_EVNTOVERFLOWEN |
@@ -2351,8 +2414,8 @@ err5:
2351 dwc3_gadget_free_endpoints(dwc); 2414 dwc3_gadget_free_endpoints(dwc);
2352 2415
2353err4: 2416err4:
2354 dma_free_coherent(dwc->dev, 512, dwc->ep0_bounce, 2417 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE,
2355 dwc->ep0_bounce_addr); 2418 dwc->ep0_bounce, dwc->ep0_bounce_addr);
2356 2419
2357err3: 2420err3:
2358 kfree(dwc->setup_buf); 2421 kfree(dwc->setup_buf);
@@ -2381,8 +2444,8 @@ void dwc3_gadget_exit(struct dwc3 *dwc)
2381 2444
2382 dwc3_gadget_free_endpoints(dwc); 2445 dwc3_gadget_free_endpoints(dwc);
2383 2446
2384 dma_free_coherent(dwc->dev, 512, dwc->ep0_bounce, 2447 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE,
2385 dwc->ep0_bounce_addr); 2448 dwc->ep0_bounce, dwc->ep0_bounce_addr);
2386 2449
2387 kfree(dwc->setup_buf); 2450 kfree(dwc->setup_buf);
2388 2451