blob: 4c9fe7b551009595c34905d4a2c08a28ee237dfb [file] [log] [blame]
Felipe Balbi72246da2011-08-19 18:10:58 +03001/**
2 * gadget.c - DesignWare USB3 DRD Controller Gadget Framework Link
3 *
4 * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
Felipe Balbi72246da2011-08-19 18:10:58 +03005 *
6 * Authors: Felipe Balbi <balbi@ti.com>,
7 * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
8 *
Felipe Balbi5945f782013-06-30 14:15:11 +03009 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 of
11 * the License as published by the Free Software Foundation.
Felipe Balbi72246da2011-08-19 18:10:58 +030012 *
Felipe Balbi5945f782013-06-30 14:15:11 +030013 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
Felipe Balbi72246da2011-08-19 18:10:58 +030017 */
18
19#include <linux/kernel.h>
20#include <linux/delay.h>
21#include <linux/slab.h>
22#include <linux/spinlock.h>
23#include <linux/platform_device.h>
24#include <linux/pm_runtime.h>
25#include <linux/interrupt.h>
26#include <linux/io.h>
27#include <linux/list.h>
28#include <linux/dma-mapping.h>
29
30#include <linux/usb/ch9.h>
31#include <linux/usb/gadget.h>
32
Felipe Balbi80977dc2014-08-19 16:37:22 -050033#include "debug.h"
Felipe Balbi72246da2011-08-19 18:10:58 +030034#include "core.h"
35#include "gadget.h"
36#include "io.h"
37
Felipe Balbi04a9bfc2012-01-02 18:25:43 +020038/**
39 * dwc3_gadget_set_test_mode - Enables USB2 Test Modes
40 * @dwc: pointer to our context structure
41 * @mode: the mode to set (J, K SE0 NAK, Force Enable)
42 *
43 * Caller should take care of locking. This function will
44 * return 0 on success or -EINVAL if wrong Test Selector
45 * is passed
46 */
47int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
48{
49 u32 reg;
50
51 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
52 reg &= ~DWC3_DCTL_TSTCTRL_MASK;
53
54 switch (mode) {
55 case TEST_J:
56 case TEST_K:
57 case TEST_SE0_NAK:
58 case TEST_PACKET:
59 case TEST_FORCE_EN:
60 reg |= mode << 1;
61 break;
62 default:
63 return -EINVAL;
64 }
65
66 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
67
68 return 0;
69}
70
Felipe Balbi8598bde2012-01-02 18:55:57 +020071/**
Paul Zimmerman911f1f82012-04-27 13:35:15 +030072 * dwc3_gadget_get_link_state - Gets current state of USB Link
73 * @dwc: pointer to our context structure
74 *
75 * Caller should take care of locking. This function will
76 * return the link state on success (>= 0) or -ETIMEDOUT.
77 */
78int dwc3_gadget_get_link_state(struct dwc3 *dwc)
79{
80 u32 reg;
81
82 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
83
84 return DWC3_DSTS_USBLNKST(reg);
85}
86
87/**
Felipe Balbi8598bde2012-01-02 18:55:57 +020088 * dwc3_gadget_set_link_state - Sets USB Link to a particular State
89 * @dwc: pointer to our context structure
90 * @state: the state to put link into
91 *
92 * Caller should take care of locking. This function will
Paul Zimmermanaee63e32012-02-24 17:32:15 -080093 * return 0 on success or -ETIMEDOUT.
Felipe Balbi8598bde2012-01-02 18:55:57 +020094 */
95int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state)
96{
Paul Zimmermanaee63e32012-02-24 17:32:15 -080097 int retries = 10000;
Felipe Balbi8598bde2012-01-02 18:55:57 +020098 u32 reg;
99
Paul Zimmerman802fde92012-04-27 13:10:52 +0300100 /*
101 * Wait until device controller is ready. Only applies to 1.94a and
102 * later RTL.
103 */
104 if (dwc->revision >= DWC3_REVISION_194A) {
105 while (--retries) {
106 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
107 if (reg & DWC3_DSTS_DCNRD)
108 udelay(5);
109 else
110 break;
111 }
112
113 if (retries <= 0)
114 return -ETIMEDOUT;
115 }
116
Felipe Balbi8598bde2012-01-02 18:55:57 +0200117 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
118 reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
119
120 /* set requested state */
121 reg |= DWC3_DCTL_ULSTCHNGREQ(state);
122 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
123
Paul Zimmerman802fde92012-04-27 13:10:52 +0300124 /*
125 * The following code is racy when called from dwc3_gadget_wakeup,
126 * and is not needed, at least on newer versions
127 */
128 if (dwc->revision >= DWC3_REVISION_194A)
129 return 0;
130
Felipe Balbi8598bde2012-01-02 18:55:57 +0200131 /* wait for a change in DSTS */
Paul Zimmermanaed430e2012-04-27 12:52:01 +0300132 retries = 10000;
Felipe Balbi8598bde2012-01-02 18:55:57 +0200133 while (--retries) {
134 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
135
Felipe Balbi8598bde2012-01-02 18:55:57 +0200136 if (DWC3_DSTS_USBLNKST(reg) == state)
137 return 0;
138
Paul Zimmermanaee63e32012-02-24 17:32:15 -0800139 udelay(5);
Felipe Balbi8598bde2012-01-02 18:55:57 +0200140 }
141
Felipe Balbi73815282015-01-27 13:48:14 -0600142 dwc3_trace(trace_dwc3_gadget,
143 "link state change request timed out");
Felipe Balbi8598bde2012-01-02 18:55:57 +0200144
145 return -ETIMEDOUT;
146}
147
Felipe Balbief966b92016-04-05 13:09:51 +0300148static void dwc3_ep_inc_enq(struct dwc3_ep *dep)
Felipe Balbi457e84b2012-01-18 18:04:09 +0200149{
Felipe Balbief966b92016-04-05 13:09:51 +0300150 dep->trb_enqueue++;
Felipe Balbi4faf7552016-04-05 13:14:31 +0300151 dep->trb_enqueue %= DWC3_TRB_NUM;
Felipe Balbief966b92016-04-05 13:09:51 +0300152}
Felipe Balbi457e84b2012-01-18 18:04:09 +0200153
Felipe Balbief966b92016-04-05 13:09:51 +0300154static void dwc3_ep_inc_deq(struct dwc3_ep *dep)
155{
156 dep->trb_dequeue++;
Felipe Balbi4faf7552016-04-05 13:14:31 +0300157 dep->trb_dequeue %= DWC3_TRB_NUM;
Felipe Balbief966b92016-04-05 13:09:51 +0300158}
Felipe Balbi457e84b2012-01-18 18:04:09 +0200159
Felipe Balbief966b92016-04-05 13:09:51 +0300160static int dwc3_ep_is_last_trb(unsigned int index)
161{
Felipe Balbi4faf7552016-04-05 13:14:31 +0300162 return index == DWC3_TRB_NUM - 1;
Felipe Balbi457e84b2012-01-18 18:04:09 +0200163}
164
Felipe Balbi72246da2011-08-19 18:10:58 +0300165void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
166 int status)
167{
168 struct dwc3 *dwc = dep->dwc;
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530169 int i;
Felipe Balbi72246da2011-08-19 18:10:58 +0300170
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200171 if (req->started) {
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530172 i = 0;
173 do {
Felipe Balbief966b92016-04-05 13:09:51 +0300174 dwc3_ep_inc_deq(dep);
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530175 /*
176 * Skip LINK TRB. We can't use req->trb and check for
177 * DWC3_TRBCTL_LINK_TRB because it points the TRB we
178 * just completed (not the LINK TRB).
179 */
Felipe Balbi36b68aa2016-04-05 13:24:36 +0300180 if (dwc3_ep_is_last_trb(dep->trb_dequeue))
Felipe Balbief966b92016-04-05 13:09:51 +0300181 dwc3_ep_inc_deq(dep);
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530182 } while(++i < req->request.num_mapped_sgs);
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200183 req->started = false;
Felipe Balbi72246da2011-08-19 18:10:58 +0300184 }
185 list_del(&req->list);
Felipe Balbieeb720f2011-11-28 12:46:59 +0200186 req->trb = NULL;
Felipe Balbi72246da2011-08-19 18:10:58 +0300187
188 if (req->request.status == -EINPROGRESS)
189 req->request.status = status;
190
Pratyush Anand0416e492012-08-10 13:42:16 +0530191 if (dwc->ep0_bounced && dep->number == 0)
192 dwc->ep0_bounced = false;
193 else
194 usb_gadget_unmap_request(&dwc->gadget, &req->request,
195 req->direction);
Felipe Balbi72246da2011-08-19 18:10:58 +0300196
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -0500197 trace_dwc3_gadget_giveback(req);
Felipe Balbi72246da2011-08-19 18:10:58 +0300198
199 spin_unlock(&dwc->lock);
Michal Sojka304f7e52014-09-24 22:43:19 +0200200 usb_gadget_giveback_request(&dep->endpoint, &req->request);
Felipe Balbi72246da2011-08-19 18:10:58 +0300201 spin_lock(&dwc->lock);
202}
203
Felipe Balbi3ece0ec2014-09-05 09:47:44 -0500204int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param)
Felipe Balbib09bb642012-04-24 16:19:11 +0300205{
206 u32 timeout = 500;
207 u32 reg;
208
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -0500209 trace_dwc3_gadget_generic_cmd(cmd, param);
Felipe Balbi427c3df2014-04-25 14:14:14 -0500210
Felipe Balbib09bb642012-04-24 16:19:11 +0300211 dwc3_writel(dwc->regs, DWC3_DGCMDPAR, param);
212 dwc3_writel(dwc->regs, DWC3_DGCMD, cmd | DWC3_DGCMD_CMDACT);
213
214 do {
215 reg = dwc3_readl(dwc->regs, DWC3_DGCMD);
216 if (!(reg & DWC3_DGCMD_CMDACT)) {
Felipe Balbi73815282015-01-27 13:48:14 -0600217 dwc3_trace(trace_dwc3_gadget,
218 "Command Complete --> %d",
Felipe Balbib09bb642012-04-24 16:19:11 +0300219 DWC3_DGCMD_STATUS(reg));
Subbaraya Sundeep Bhatta891b1dc2015-05-21 15:46:47 +0530220 if (DWC3_DGCMD_STATUS(reg))
221 return -EINVAL;
Felipe Balbib09bb642012-04-24 16:19:11 +0300222 return 0;
223 }
224
225 /*
226 * We can't sleep here, because it's also called from
227 * interrupt context.
228 */
229 timeout--;
Felipe Balbi73815282015-01-27 13:48:14 -0600230 if (!timeout) {
231 dwc3_trace(trace_dwc3_gadget,
232 "Command Timed Out");
Felipe Balbib09bb642012-04-24 16:19:11 +0300233 return -ETIMEDOUT;
Felipe Balbi73815282015-01-27 13:48:14 -0600234 }
Felipe Balbib09bb642012-04-24 16:19:11 +0300235 udelay(1);
236 } while (1);
237}
238
Felipe Balbic36d8e92016-04-04 12:46:33 +0300239static int __dwc3_gadget_wakeup(struct dwc3 *dwc);
240
Felipe Balbi72246da2011-08-19 18:10:58 +0300241int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
242 unsigned cmd, struct dwc3_gadget_ep_cmd_params *params)
243{
244 struct dwc3_ep *dep = dwc->eps[ep];
Sebastian Andrzej Siewior61d58242011-08-29 16:46:38 +0200245 u32 timeout = 500;
Felipe Balbi72246da2011-08-19 18:10:58 +0300246 u32 reg;
247
Felipe Balbi2b0f11d2016-04-04 09:19:17 +0300248 int susphy = false;
Felipe Balbic0ca3242016-04-04 09:11:51 +0300249 int ret = -EINVAL;
Felipe Balbi72246da2011-08-19 18:10:58 +0300250
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -0500251 trace_dwc3_gadget_ep_cmd(dep, cmd, params);
Felipe Balbi72246da2011-08-19 18:10:58 +0300252
Felipe Balbi2b0f11d2016-04-04 09:19:17 +0300253 /*
254 * Synopsys Databook 2.60a states, on section 6.3.2.5.[1-8], that if
255 * we're issuing an endpoint command, we must check if
256 * GUSB2PHYCFG.SUSPHY bit is set. If it is, then we need to clear it.
257 *
258 * We will also set SUSPHY bit to what it was before returning as stated
259 * by the same section on Synopsys databook.
260 */
261 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
262 if (unlikely(reg & DWC3_GUSB2PHYCFG_SUSPHY)) {
263 susphy = true;
264 reg &= ~DWC3_GUSB2PHYCFG_SUSPHY;
265 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
266 }
267
Felipe Balbic36d8e92016-04-04 12:46:33 +0300268 if (cmd == DWC3_DEPCMD_STARTTRANSFER) {
269 int needs_wakeup;
270
271 needs_wakeup = (dwc->link_state == DWC3_LINK_STATE_U1 ||
272 dwc->link_state == DWC3_LINK_STATE_U2 ||
273 dwc->link_state == DWC3_LINK_STATE_U3);
274
275 if (unlikely(needs_wakeup)) {
276 ret = __dwc3_gadget_wakeup(dwc);
277 dev_WARN_ONCE(dwc->dev, ret, "wakeup failed --> %d\n",
278 ret);
279 }
280 }
281
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300282 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR0(ep), params->param0);
283 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR1(ep), params->param1);
284 dwc3_writel(dwc->regs, DWC3_DEPCMDPAR2(ep), params->param2);
Felipe Balbi72246da2011-08-19 18:10:58 +0300285
286 dwc3_writel(dwc->regs, DWC3_DEPCMD(ep), cmd | DWC3_DEPCMD_CMDACT);
287 do {
288 reg = dwc3_readl(dwc->regs, DWC3_DEPCMD(ep));
289 if (!(reg & DWC3_DEPCMD_CMDACT)) {
Konrad Leszczynski7b9cc7a2016-02-12 15:21:46 +0000290 int cmd_status = DWC3_DEPCMD_STATUS(reg);
291
Felipe Balbi73815282015-01-27 13:48:14 -0600292 dwc3_trace(trace_dwc3_gadget,
293 "Command Complete --> %d",
Konrad Leszczynski7b9cc7a2016-02-12 15:21:46 +0000294 cmd_status);
295
296 switch (cmd_status) {
297 case 0:
298 ret = 0;
Felipe Balbic0ca3242016-04-04 09:11:51 +0300299 break;
Konrad Leszczynski7b9cc7a2016-02-12 15:21:46 +0000300 case DEPEVT_TRANSFER_NO_RESOURCE:
301 dwc3_trace(trace_dwc3_gadget, "%s: no resource available");
302 ret = -EINVAL;
303 break;
304 case DEPEVT_TRANSFER_BUS_EXPIRY:
305 /*
306 * SW issues START TRANSFER command to
307 * isochronous ep with future frame interval. If
308 * future interval time has already passed when
309 * core receives the command, it will respond
310 * with an error status of 'Bus Expiry'.
311 *
312 * Instead of always returning -EINVAL, let's
313 * give a hint to the gadget driver that this is
314 * the case by returning -EAGAIN.
315 */
316 dwc3_trace(trace_dwc3_gadget, "%s: bus expiry");
317 ret = -EAGAIN;
318 break;
319 default:
320 dev_WARN(dwc->dev, "UNKNOWN cmd status\n");
321 }
322
Felipe Balbic0ca3242016-04-04 09:11:51 +0300323 break;
Felipe Balbi72246da2011-08-19 18:10:58 +0300324 }
325
326 /*
Felipe Balbi72246da2011-08-19 18:10:58 +0300327 * We can't sleep here, because it is also called from
328 * interrupt context.
329 */
330 timeout--;
Felipe Balbi73815282015-01-27 13:48:14 -0600331 if (!timeout) {
332 dwc3_trace(trace_dwc3_gadget,
333 "Command Timed Out");
Felipe Balbic0ca3242016-04-04 09:11:51 +0300334 ret = -ETIMEDOUT;
335 break;
Felipe Balbi73815282015-01-27 13:48:14 -0600336 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300337 } while (1);
Felipe Balbic0ca3242016-04-04 09:11:51 +0300338
Felipe Balbi2b0f11d2016-04-04 09:19:17 +0300339 if (unlikely(susphy)) {
340 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
341 reg |= DWC3_GUSB2PHYCFG_SUSPHY;
342 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
343 }
344
Felipe Balbic0ca3242016-04-04 09:11:51 +0300345 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +0300346}
347
John Youn50c763f2016-05-31 17:49:56 -0700348static int dwc3_send_clear_stall_ep_cmd(struct dwc3_ep *dep)
349{
350 struct dwc3 *dwc = dep->dwc;
351 struct dwc3_gadget_ep_cmd_params params;
352 u32 cmd = DWC3_DEPCMD_CLEARSTALL;
353
354 /*
355 * As of core revision 2.60a the recommended programming model
356 * is to set the ClearPendIN bit when issuing a Clear Stall EP
357 * command for IN endpoints. This is to prevent an issue where
358 * some (non-compliant) hosts may not send ACK TPs for pending
359 * IN transfers due to a mishandled error condition. Synopsys
360 * STAR 9000614252.
361 */
362 if (dep->direction && (dwc->revision >= DWC3_REVISION_260A))
363 cmd |= DWC3_DEPCMD_CLEARPENDIN;
364
365 memset(&params, 0, sizeof(params));
366
367 return dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
368}
369
Felipe Balbi72246da2011-08-19 18:10:58 +0300370static dma_addr_t dwc3_trb_dma_offset(struct dwc3_ep *dep,
Felipe Balbif6bafc62012-02-06 11:04:53 +0200371 struct dwc3_trb *trb)
Felipe Balbi72246da2011-08-19 18:10:58 +0300372{
Paul Zimmermanc439ef82011-09-30 10:58:45 +0300373 u32 offset = (char *) trb - (char *) dep->trb_pool;
Felipe Balbi72246da2011-08-19 18:10:58 +0300374
375 return dep->trb_pool_dma + offset;
376}
377
378static int dwc3_alloc_trb_pool(struct dwc3_ep *dep)
379{
380 struct dwc3 *dwc = dep->dwc;
381
382 if (dep->trb_pool)
383 return 0;
384
Felipe Balbi72246da2011-08-19 18:10:58 +0300385 dep->trb_pool = dma_alloc_coherent(dwc->dev,
386 sizeof(struct dwc3_trb) * DWC3_TRB_NUM,
387 &dep->trb_pool_dma, GFP_KERNEL);
388 if (!dep->trb_pool) {
389 dev_err(dep->dwc->dev, "failed to allocate trb pool for %s\n",
390 dep->name);
391 return -ENOMEM;
392 }
393
394 return 0;
395}
396
397static void dwc3_free_trb_pool(struct dwc3_ep *dep)
398{
399 struct dwc3 *dwc = dep->dwc;
400
401 dma_free_coherent(dwc->dev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM,
402 dep->trb_pool, dep->trb_pool_dma);
403
404 dep->trb_pool = NULL;
405 dep->trb_pool_dma = 0;
406}
407
John Younc4509602016-02-16 20:10:53 -0800408static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep);
409
410/**
411 * dwc3_gadget_start_config - Configure EP resources
412 * @dwc: pointer to our controller context structure
413 * @dep: endpoint that is being enabled
414 *
415 * The assignment of transfer resources cannot perfectly follow the
416 * data book due to the fact that the controller driver does not have
417 * all knowledge of the configuration in advance. It is given this
418 * information piecemeal by the composite gadget framework after every
419 * SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook
420 * programming model in this scenario can cause errors. For two
421 * reasons:
422 *
423 * 1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION
424 * and SET_INTERFACE (8.1.5). This is incorrect in the scenario of
425 * multiple interfaces.
426 *
427 * 2) The databook does not mention doing more DEPXFERCFG for new
428 * endpoint on alt setting (8.1.6).
429 *
430 * The following simplified method is used instead:
431 *
432 * All hardware endpoints can be assigned a transfer resource and this
433 * setting will stay persistent until either a core reset or
434 * hibernation. So whenever we do a DEPSTARTCFG(0) we can go ahead and
435 * do DEPXFERCFG for every hardware endpoint as well. We are
436 * guaranteed that there are as many transfer resources as endpoints.
437 *
438 * This function is called for each endpoint when it is being enabled
439 * but is triggered only when called for EP0-out, which always happens
440 * first, and which should only happen in one of the above conditions.
441 */
Felipe Balbi72246da2011-08-19 18:10:58 +0300442static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep)
443{
444 struct dwc3_gadget_ep_cmd_params params;
445 u32 cmd;
John Younc4509602016-02-16 20:10:53 -0800446 int i;
447 int ret;
448
449 if (dep->number)
450 return 0;
Felipe Balbi72246da2011-08-19 18:10:58 +0300451
452 memset(&params, 0x00, sizeof(params));
John Younc4509602016-02-16 20:10:53 -0800453 cmd = DWC3_DEPCMD_DEPSTARTCFG;
Felipe Balbi72246da2011-08-19 18:10:58 +0300454
John Younc4509602016-02-16 20:10:53 -0800455 ret = dwc3_send_gadget_ep_cmd(dwc, 0, cmd, &params);
456 if (ret)
457 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +0300458
John Younc4509602016-02-16 20:10:53 -0800459 for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
460 struct dwc3_ep *dep = dwc->eps[i];
461
462 if (!dep)
463 continue;
464
465 ret = dwc3_gadget_set_xfer_resource(dwc, dep);
466 if (ret)
467 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +0300468 }
469
470 return 0;
471}
472
473static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep,
Felipe Balbic90bfae2011-11-29 13:11:21 +0200474 const struct usb_endpoint_descriptor *desc,
Felipe Balbi4b345c92012-07-16 14:08:16 +0300475 const struct usb_ss_ep_comp_descriptor *comp_desc,
Paul Zimmerman265b70a2013-12-19 12:38:49 -0600476 bool ignore, bool restore)
Felipe Balbi72246da2011-08-19 18:10:58 +0300477{
478 struct dwc3_gadget_ep_cmd_params params;
479
480 memset(&params, 0x00, sizeof(params));
481
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300482 params.param0 = DWC3_DEPCFG_EP_TYPE(usb_endpoint_type(desc))
Chanho Parkd2e9a132012-08-31 16:54:07 +0900483 | DWC3_DEPCFG_MAX_PACKET_SIZE(usb_endpoint_maxp(desc));
484
485 /* Burst size is only needed in SuperSpeed mode */
John Younee5cd412016-02-05 17:08:45 -0800486 if (dwc->gadget.speed >= USB_SPEED_SUPER) {
Felipe Balbi676e3492016-04-26 10:49:07 +0300487 u32 burst = dep->endpoint.maxburst;
488 u32 nump;
489 u32 reg;
Chanho Parkd2e9a132012-08-31 16:54:07 +0900490
Felipe Balbi676e3492016-04-26 10:49:07 +0300491 /* update NumP */
492 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
493 nump = DWC3_DCFG_NUMP(reg);
494 nump = max(nump, burst);
495 reg &= ~DWC3_DCFG_NUMP_MASK;
496 reg |= nump << DWC3_DCFG_NUMP_SHIFT;
497 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
498
499 params.param0 |= DWC3_DEPCFG_BURST_SIZE(burst - 1);
Chanho Parkd2e9a132012-08-31 16:54:07 +0900500 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300501
Felipe Balbi4b345c92012-07-16 14:08:16 +0300502 if (ignore)
503 params.param0 |= DWC3_DEPCFG_IGN_SEQ_NUM;
504
Paul Zimmerman265b70a2013-12-19 12:38:49 -0600505 if (restore) {
506 params.param0 |= DWC3_DEPCFG_ACTION_RESTORE;
507 params.param2 |= dep->saved_state;
508 }
509
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300510 params.param1 = DWC3_DEPCFG_XFER_COMPLETE_EN
511 | DWC3_DEPCFG_XFER_NOT_READY_EN;
Felipe Balbi72246da2011-08-19 18:10:58 +0300512
Felipe Balbi18b7ede2012-01-02 13:35:41 +0200513 if (usb_ss_max_streams(comp_desc) && usb_endpoint_xfer_bulk(desc)) {
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300514 params.param1 |= DWC3_DEPCFG_STREAM_CAPABLE
515 | DWC3_DEPCFG_STREAM_EVENT_EN;
Felipe Balbi879631a2011-09-30 10:58:47 +0300516 dep->stream_capable = true;
517 }
518
Felipe Balbi0b93a4c2014-09-04 10:28:10 -0500519 if (!usb_endpoint_xfer_control(desc))
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300520 params.param1 |= DWC3_DEPCFG_XFER_IN_PROGRESS_EN;
Felipe Balbi72246da2011-08-19 18:10:58 +0300521
522 /*
523 * We are doing 1:1 mapping for endpoints, meaning
524 * Physical Endpoints 2 maps to Logical Endpoint 2 and
525 * so on. We consider the direction bit as part of the physical
526 * endpoint number. So USB endpoint 0x81 is 0x03.
527 */
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300528 params.param1 |= DWC3_DEPCFG_EP_NUMBER(dep->number);
Felipe Balbi72246da2011-08-19 18:10:58 +0300529
530 /*
531 * We must use the lower 16 TX FIFOs even though
532 * HW might have more
533 */
534 if (dep->direction)
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300535 params.param0 |= DWC3_DEPCFG_FIFO_NUMBER(dep->number >> 1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300536
537 if (desc->bInterval) {
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300538 params.param1 |= DWC3_DEPCFG_BINTERVAL_M1(desc->bInterval - 1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300539 dep->interval = 1 << (desc->bInterval - 1);
540 }
541
542 return dwc3_send_gadget_ep_cmd(dwc, dep->number,
543 DWC3_DEPCMD_SETEPCONFIG, &params);
544}
545
546static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep)
547{
548 struct dwc3_gadget_ep_cmd_params params;
549
550 memset(&params, 0x00, sizeof(params));
551
Felipe Balbidc1c70a2011-09-30 10:58:51 +0300552 params.param0 = DWC3_DEPXFERCFG_NUM_XFER_RES(1);
Felipe Balbi72246da2011-08-19 18:10:58 +0300553
554 return dwc3_send_gadget_ep_cmd(dwc, dep->number,
555 DWC3_DEPCMD_SETTRANSFRESOURCE, &params);
556}
557
558/**
559 * __dwc3_gadget_ep_enable - Initializes a HW endpoint
560 * @dep: endpoint to be initialized
561 * @desc: USB Endpoint Descriptor
562 *
563 * Caller should take care of locking
564 */
565static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
Felipe Balbic90bfae2011-11-29 13:11:21 +0200566 const struct usb_endpoint_descriptor *desc,
Felipe Balbi4b345c92012-07-16 14:08:16 +0300567 const struct usb_ss_ep_comp_descriptor *comp_desc,
Paul Zimmerman265b70a2013-12-19 12:38:49 -0600568 bool ignore, bool restore)
Felipe Balbi72246da2011-08-19 18:10:58 +0300569{
570 struct dwc3 *dwc = dep->dwc;
571 u32 reg;
Andy Shevchenkob09e99e2014-05-15 15:53:32 +0300572 int ret;
Felipe Balbi72246da2011-08-19 18:10:58 +0300573
Felipe Balbi73815282015-01-27 13:48:14 -0600574 dwc3_trace(trace_dwc3_gadget, "Enabling %s", dep->name);
Felipe Balbiff62d6b2013-07-12 19:09:39 +0300575
Felipe Balbi72246da2011-08-19 18:10:58 +0300576 if (!(dep->flags & DWC3_EP_ENABLED)) {
577 ret = dwc3_gadget_start_config(dwc, dep);
578 if (ret)
579 return ret;
580 }
581
Paul Zimmerman265b70a2013-12-19 12:38:49 -0600582 ret = dwc3_gadget_set_ep_config(dwc, dep, desc, comp_desc, ignore,
583 restore);
Felipe Balbi72246da2011-08-19 18:10:58 +0300584 if (ret)
585 return ret;
586
587 if (!(dep->flags & DWC3_EP_ENABLED)) {
Felipe Balbif6bafc62012-02-06 11:04:53 +0200588 struct dwc3_trb *trb_st_hw;
589 struct dwc3_trb *trb_link;
Felipe Balbi72246da2011-08-19 18:10:58 +0300590
Ido Shayevitz16e78db2012-03-12 20:25:24 +0200591 dep->endpoint.desc = desc;
Felipe Balbic90bfae2011-11-29 13:11:21 +0200592 dep->comp_desc = comp_desc;
Felipe Balbi72246da2011-08-19 18:10:58 +0300593 dep->type = usb_endpoint_type(desc);
594 dep->flags |= DWC3_EP_ENABLED;
595
596 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
597 reg |= DWC3_DALEPENA_EP(dep->number);
598 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
599
Felipe Balbi36b68aa2016-04-05 13:24:36 +0300600 if (usb_endpoint_xfer_control(desc))
Felipe Balbie901aa12016-03-16 14:01:37 +0200601 goto out;
Felipe Balbi72246da2011-08-19 18:10:58 +0300602
Felipe Balbi36b68aa2016-04-05 13:24:36 +0300603 /* Link TRB. The HWO bit is never reset */
Felipe Balbi72246da2011-08-19 18:10:58 +0300604 trb_st_hw = &dep->trb_pool[0];
605
Felipe Balbif6bafc62012-02-06 11:04:53 +0200606 trb_link = &dep->trb_pool[DWC3_TRB_NUM - 1];
Jack Pham1200a822014-10-21 16:31:10 -0700607 memset(trb_link, 0, sizeof(*trb_link));
Felipe Balbi72246da2011-08-19 18:10:58 +0300608
Felipe Balbif6bafc62012-02-06 11:04:53 +0200609 trb_link->bpl = lower_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw));
610 trb_link->bph = upper_32_bits(dwc3_trb_dma_offset(dep, trb_st_hw));
611 trb_link->ctrl |= DWC3_TRBCTL_LINK_TRB;
612 trb_link->ctrl |= DWC3_TRB_CTRL_HWO;
Felipe Balbi72246da2011-08-19 18:10:58 +0300613 }
614
Felipe Balbie901aa12016-03-16 14:01:37 +0200615out:
Felipe Balbiaa739972015-07-20 14:48:13 -0500616 switch (usb_endpoint_type(desc)) {
617 case USB_ENDPOINT_XFER_CONTROL:
Felipe Balbie901aa12016-03-16 14:01:37 +0200618 /* don't change name */
Felipe Balbiaa739972015-07-20 14:48:13 -0500619 break;
620 case USB_ENDPOINT_XFER_ISOC:
621 strlcat(dep->name, "-isoc", sizeof(dep->name));
622 break;
623 case USB_ENDPOINT_XFER_BULK:
624 strlcat(dep->name, "-bulk", sizeof(dep->name));
625 break;
626 case USB_ENDPOINT_XFER_INT:
627 strlcat(dep->name, "-int", sizeof(dep->name));
628 break;
629 default:
630 dev_err(dwc->dev, "invalid endpoint transfer type\n");
631 }
632
Felipe Balbi72246da2011-08-19 18:10:58 +0300633 return 0;
634}
635
Paul Zimmermanb992e682012-04-27 14:17:35 +0300636static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force);
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200637static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
Felipe Balbi72246da2011-08-19 18:10:58 +0300638{
639 struct dwc3_request *req;
640
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200641 if (!list_empty(&dep->started_list)) {
Paul Zimmermanb992e682012-04-27 14:17:35 +0300642 dwc3_stop_active_transfer(dwc, dep->number, true);
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200643
Pratyush Anand57911502012-07-06 15:19:10 +0530644 /* - giveback all requests to gadget driver */
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200645 while (!list_empty(&dep->started_list)) {
646 req = next_request(&dep->started_list);
Pratyush Anand15916332012-06-15 11:54:36 +0530647
648 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
649 }
Felipe Balbiea53b882012-02-17 12:10:04 +0200650 }
651
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200652 while (!list_empty(&dep->pending_list)) {
653 req = next_request(&dep->pending_list);
Felipe Balbi72246da2011-08-19 18:10:58 +0300654
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200655 dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
Felipe Balbi72246da2011-08-19 18:10:58 +0300656 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300657}
658
659/**
660 * __dwc3_gadget_ep_disable - Disables a HW endpoint
661 * @dep: the endpoint to disable
662 *
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200663 * This function also removes requests which are currently processed ny the
664 * hardware and those which are not yet scheduled.
665 * Caller should take care of locking.
Felipe Balbi72246da2011-08-19 18:10:58 +0300666 */
Felipe Balbi72246da2011-08-19 18:10:58 +0300667static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
668{
669 struct dwc3 *dwc = dep->dwc;
670 u32 reg;
671
Felipe Balbi7eaeac52015-07-20 14:46:15 -0500672 dwc3_trace(trace_dwc3_gadget, "Disabling %s", dep->name);
673
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +0200674 dwc3_remove_requests(dwc, dep);
Felipe Balbi72246da2011-08-19 18:10:58 +0300675
Felipe Balbi687ef982014-04-16 10:30:33 -0500676 /* make sure HW endpoint isn't stalled */
677 if (dep->flags & DWC3_EP_STALL)
Felipe Balbi7a608552014-09-24 14:19:52 -0500678 __dwc3_gadget_ep_set_halt(dep, 0, false);
Felipe Balbi687ef982014-04-16 10:30:33 -0500679
Felipe Balbi72246da2011-08-19 18:10:58 +0300680 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA);
681 reg &= ~DWC3_DALEPENA_EP(dep->number);
682 dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
683
Felipe Balbi879631a2011-09-30 10:58:47 +0300684 dep->stream_capable = false;
Ido Shayevitzf9c56cd2012-02-08 13:56:48 +0200685 dep->endpoint.desc = NULL;
Felipe Balbic90bfae2011-11-29 13:11:21 +0200686 dep->comp_desc = NULL;
Felipe Balbi72246da2011-08-19 18:10:58 +0300687 dep->type = 0;
Felipe Balbi879631a2011-09-30 10:58:47 +0300688 dep->flags = 0;
Felipe Balbi72246da2011-08-19 18:10:58 +0300689
Felipe Balbiaa739972015-07-20 14:48:13 -0500690 snprintf(dep->name, sizeof(dep->name), "ep%d%s",
691 dep->number >> 1,
692 (dep->number & 1) ? "in" : "out");
693
Felipe Balbi72246da2011-08-19 18:10:58 +0300694 return 0;
695}
696
697/* -------------------------------------------------------------------------- */
698
699static int dwc3_gadget_ep0_enable(struct usb_ep *ep,
700 const struct usb_endpoint_descriptor *desc)
701{
702 return -EINVAL;
703}
704
705static int dwc3_gadget_ep0_disable(struct usb_ep *ep)
706{
707 return -EINVAL;
708}
709
710/* -------------------------------------------------------------------------- */
711
712static int dwc3_gadget_ep_enable(struct usb_ep *ep,
713 const struct usb_endpoint_descriptor *desc)
714{
715 struct dwc3_ep *dep;
716 struct dwc3 *dwc;
717 unsigned long flags;
718 int ret;
719
720 if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) {
721 pr_debug("dwc3: invalid parameters\n");
722 return -EINVAL;
723 }
724
725 if (!desc->wMaxPacketSize) {
726 pr_debug("dwc3: missing wMaxPacketSize\n");
727 return -EINVAL;
728 }
729
730 dep = to_dwc3_ep(ep);
731 dwc = dep->dwc;
732
Felipe Balbi95ca9612015-12-10 13:08:20 -0600733 if (dev_WARN_ONCE(dwc->dev, dep->flags & DWC3_EP_ENABLED,
734 "%s is already enabled\n",
735 dep->name))
Felipe Balbic6f83f32012-08-15 12:28:29 +0300736 return 0;
Felipe Balbic6f83f32012-08-15 12:28:29 +0300737
Felipe Balbi72246da2011-08-19 18:10:58 +0300738 spin_lock_irqsave(&dwc->lock, flags);
Paul Zimmerman265b70a2013-12-19 12:38:49 -0600739 ret = __dwc3_gadget_ep_enable(dep, desc, ep->comp_desc, false, false);
Felipe Balbi72246da2011-08-19 18:10:58 +0300740 spin_unlock_irqrestore(&dwc->lock, flags);
741
742 return ret;
743}
744
745static int dwc3_gadget_ep_disable(struct usb_ep *ep)
746{
747 struct dwc3_ep *dep;
748 struct dwc3 *dwc;
749 unsigned long flags;
750 int ret;
751
752 if (!ep) {
753 pr_debug("dwc3: invalid parameters\n");
754 return -EINVAL;
755 }
756
757 dep = to_dwc3_ep(ep);
758 dwc = dep->dwc;
759
Felipe Balbi95ca9612015-12-10 13:08:20 -0600760 if (dev_WARN_ONCE(dwc->dev, !(dep->flags & DWC3_EP_ENABLED),
761 "%s is already disabled\n",
762 dep->name))
Felipe Balbi72246da2011-08-19 18:10:58 +0300763 return 0;
Felipe Balbi72246da2011-08-19 18:10:58 +0300764
Felipe Balbi72246da2011-08-19 18:10:58 +0300765 spin_lock_irqsave(&dwc->lock, flags);
766 ret = __dwc3_gadget_ep_disable(dep);
767 spin_unlock_irqrestore(&dwc->lock, flags);
768
769 return ret;
770}
771
772static struct usb_request *dwc3_gadget_ep_alloc_request(struct usb_ep *ep,
773 gfp_t gfp_flags)
774{
775 struct dwc3_request *req;
776 struct dwc3_ep *dep = to_dwc3_ep(ep);
Felipe Balbi72246da2011-08-19 18:10:58 +0300777
778 req = kzalloc(sizeof(*req), gfp_flags);
Jingoo Han734d5a52014-07-17 12:45:11 +0900779 if (!req)
Felipe Balbi72246da2011-08-19 18:10:58 +0300780 return NULL;
Felipe Balbi72246da2011-08-19 18:10:58 +0300781
782 req->epnum = dep->number;
783 req->dep = dep;
Felipe Balbi72246da2011-08-19 18:10:58 +0300784
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -0500785 trace_dwc3_alloc_request(req);
786
Felipe Balbi72246da2011-08-19 18:10:58 +0300787 return &req->request;
788}
789
790static void dwc3_gadget_ep_free_request(struct usb_ep *ep,
791 struct usb_request *request)
792{
793 struct dwc3_request *req = to_dwc3_request(request);
794
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -0500795 trace_dwc3_free_request(req);
Felipe Balbi72246da2011-08-19 18:10:58 +0300796 kfree(req);
797}
798
Felipe Balbic71fc372011-11-22 11:37:34 +0200799/**
800 * dwc3_prepare_one_trb - setup one TRB from one request
801 * @dep: endpoint for which this request is prepared
802 * @req: dwc3_request pointer
803 */
Felipe Balbi68e823e2011-11-28 12:25:01 +0200804static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
Felipe Balbieeb720f2011-11-28 12:46:59 +0200805 struct dwc3_request *req, dma_addr_t dma,
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530806 unsigned length, unsigned last, unsigned chain, unsigned node)
Felipe Balbic71fc372011-11-22 11:37:34 +0200807{
Felipe Balbif6bafc62012-02-06 11:04:53 +0200808 struct dwc3_trb *trb;
Felipe Balbic71fc372011-11-22 11:37:34 +0200809
Felipe Balbi73815282015-01-27 13:48:14 -0600810 dwc3_trace(trace_dwc3_gadget, "%s: req %p dma %08llx length %d%s%s",
Felipe Balbieeb720f2011-11-28 12:46:59 +0200811 dep->name, req, (unsigned long long) dma,
812 length, last ? " last" : "",
813 chain ? " chain" : "");
814
Pratyush Anand915e2022013-01-14 15:59:35 +0530815
Felipe Balbi4faf7552016-04-05 13:14:31 +0300816 trb = &dep->trb_pool[dep->trb_enqueue];
Felipe Balbic71fc372011-11-22 11:37:34 +0200817
Felipe Balbieeb720f2011-11-28 12:46:59 +0200818 if (!req->trb) {
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200819 dwc3_gadget_move_started_request(req);
Felipe Balbif6bafc62012-02-06 11:04:53 +0200820 req->trb = trb;
821 req->trb_dma = dwc3_trb_dma_offset(dep, trb);
Felipe Balbi4faf7552016-04-05 13:14:31 +0300822 req->first_trb_index = dep->trb_enqueue;
Felipe Balbieeb720f2011-11-28 12:46:59 +0200823 }
Felipe Balbic71fc372011-11-22 11:37:34 +0200824
Felipe Balbief966b92016-04-05 13:09:51 +0300825 dwc3_ep_inc_enq(dep);
Felipe Balbi36b68aa2016-04-05 13:24:36 +0300826 /* Skip the LINK-TRB */
827 if (dwc3_ep_is_last_trb(dep->trb_enqueue))
Felipe Balbief966b92016-04-05 13:09:51 +0300828 dwc3_ep_inc_enq(dep);
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530829
Felipe Balbif6bafc62012-02-06 11:04:53 +0200830 trb->size = DWC3_TRB_SIZE_LENGTH(length);
831 trb->bpl = lower_32_bits(dma);
832 trb->bph = upper_32_bits(dma);
Felipe Balbic71fc372011-11-22 11:37:34 +0200833
Ido Shayevitz16e78db2012-03-12 20:25:24 +0200834 switch (usb_endpoint_type(dep->endpoint.desc)) {
Felipe Balbic71fc372011-11-22 11:37:34 +0200835 case USB_ENDPOINT_XFER_CONTROL:
Felipe Balbif6bafc62012-02-06 11:04:53 +0200836 trb->ctrl = DWC3_TRBCTL_CONTROL_SETUP;
Felipe Balbic71fc372011-11-22 11:37:34 +0200837 break;
838
839 case USB_ENDPOINT_XFER_ISOC:
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530840 if (!node)
841 trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST;
842 else
843 trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS;
Felipe Balbica4d44e2016-03-10 13:53:27 +0200844
845 /* always enable Interrupt on Missed ISOC */
846 trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
Felipe Balbic71fc372011-11-22 11:37:34 +0200847 break;
848
849 case USB_ENDPOINT_XFER_BULK:
850 case USB_ENDPOINT_XFER_INT:
Felipe Balbif6bafc62012-02-06 11:04:53 +0200851 trb->ctrl = DWC3_TRBCTL_NORMAL;
Felipe Balbic71fc372011-11-22 11:37:34 +0200852 break;
853 default:
854 /*
855 * This is only possible with faulty memory because we
856 * checked it already :)
857 */
858 BUG();
859 }
860
Felipe Balbica4d44e2016-03-10 13:53:27 +0200861 /* always enable Continue on Short Packet */
862 trb->ctrl |= DWC3_TRB_CTRL_CSP;
Felipe Balbif3af3652013-12-13 14:19:33 -0600863
Felipe Balbi8e7046b2016-04-06 10:01:14 +0300864 if (!req->request.no_interrupt && !chain)
Felipe Balbica4d44e2016-03-10 13:53:27 +0200865 trb->ctrl |= DWC3_TRB_CTRL_IOC | DWC3_TRB_CTRL_ISP_IMI;
866
867 if (last)
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530868 trb->ctrl |= DWC3_TRB_CTRL_LST;
Felipe Balbif6bafc62012-02-06 11:04:53 +0200869
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530870 if (chain)
871 trb->ctrl |= DWC3_TRB_CTRL_CHN;
872
Ido Shayevitz16e78db2012-03-12 20:25:24 +0200873 if (usb_endpoint_xfer_bulk(dep->endpoint.desc) && dep->stream_capable)
Felipe Balbif6bafc62012-02-06 11:04:53 +0200874 trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(req->request.stream_id);
875
876 trb->ctrl |= DWC3_TRB_CTRL_HWO;
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -0500877
878 trace_dwc3_prepare_trb(dep, trb);
Felipe Balbic71fc372011-11-22 11:37:34 +0200879}
880
Felipe Balbic4233572016-05-12 14:08:34 +0300881static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
882{
883 struct dwc3_trb *tmp;
884
885 /*
886 * If enqueue & dequeue are equal than it is either full or empty.
887 *
888 * One way to know for sure is if the TRB right before us has HWO bit
889 * set or not. If it has, then we're definitely full and can't fit any
890 * more transfers in our ring.
891 */
892 if (dep->trb_enqueue == dep->trb_dequeue) {
893 /* If we're full, enqueue/dequeue are > 0 */
894 if (dep->trb_enqueue) {
895 tmp = &dep->trb_pool[dep->trb_enqueue - 1];
896 if (tmp->ctrl & DWC3_TRB_CTRL_HWO)
897 return 0;
898 }
899
900 return DWC3_TRB_NUM - 1;
901 }
902
903 return dep->trb_dequeue - dep->trb_enqueue;
904}
905
Felipe Balbi72246da2011-08-19 18:10:58 +0300906/*
907 * dwc3_prepare_trbs - setup TRBs from requests
908 * @dep: endpoint for which requests are being prepared
Felipe Balbi72246da2011-08-19 18:10:58 +0300909 *
Paul Zimmerman1d046792012-02-15 18:56:56 -0800910 * The function goes through the requests list and sets up TRBs for the
911 * transfers. The function returns once there are no more TRBs available or
912 * it runs out of requests.
Felipe Balbi72246da2011-08-19 18:10:58 +0300913 */
Felipe Balbic4233572016-05-12 14:08:34 +0300914static void dwc3_prepare_trbs(struct dwc3_ep *dep)
Felipe Balbi72246da2011-08-19 18:10:58 +0300915{
Felipe Balbi68e823e2011-11-28 12:25:01 +0200916 struct dwc3_request *req, *n;
Felipe Balbi72246da2011-08-19 18:10:58 +0300917 u32 trbs_left;
Felipe Balbic71fc372011-11-22 11:37:34 +0200918 unsigned int last_one = 0;
Felipe Balbi72246da2011-08-19 18:10:58 +0300919
920 BUILD_BUG_ON_NOT_POWER_OF_2(DWC3_TRB_NUM);
921
Felipe Balbic4233572016-05-12 14:08:34 +0300922 trbs_left = dwc3_calc_trbs_left(dep);
Felipe Balbi72246da2011-08-19 18:10:58 +0300923
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200924 list_for_each_entry_safe(req, n, &dep->pending_list, list) {
Felipe Balbieeb720f2011-11-28 12:46:59 +0200925 unsigned length;
926 dma_addr_t dma;
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530927 last_one = false;
Felipe Balbi72246da2011-08-19 18:10:58 +0300928
Felipe Balbieeb720f2011-11-28 12:46:59 +0200929 if (req->request.num_mapped_sgs > 0) {
930 struct usb_request *request = &req->request;
931 struct scatterlist *sg = request->sg;
932 struct scatterlist *s;
933 int i;
Felipe Balbi72246da2011-08-19 18:10:58 +0300934
Felipe Balbieeb720f2011-11-28 12:46:59 +0200935 for_each_sg(sg, s, request->num_mapped_sgs, i) {
936 unsigned chain = true;
Felipe Balbi72246da2011-08-19 18:10:58 +0300937
Felipe Balbieeb720f2011-11-28 12:46:59 +0200938 length = sg_dma_len(s);
939 dma = sg_dma_address(s);
Felipe Balbi72246da2011-08-19 18:10:58 +0300940
Felipe Balbi6aff4832016-05-13 10:07:47 +0300941 if (sg_is_last(s)) {
942 if (list_is_last(&req->list, &dep->pending_list))
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530943 last_one = true;
Felipe Balbi6aff4832016-05-13 10:07:47 +0300944
Felipe Balbieeb720f2011-11-28 12:46:59 +0200945 chain = false;
946 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300947
Felipe Balbieeb720f2011-11-28 12:46:59 +0200948 trbs_left--;
949 if (!trbs_left)
950 last_one = true;
Felipe Balbi72246da2011-08-19 18:10:58 +0300951
Felipe Balbieeb720f2011-11-28 12:46:59 +0200952 if (last_one)
953 chain = false;
Felipe Balbi72246da2011-08-19 18:10:58 +0300954
Felipe Balbieeb720f2011-11-28 12:46:59 +0200955 dwc3_prepare_one_trb(dep, req, dma, length,
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530956 last_one, chain, i);
Felipe Balbi72246da2011-08-19 18:10:58 +0300957
Felipe Balbieeb720f2011-11-28 12:46:59 +0200958 if (last_one)
959 break;
960 }
Amit Virdi39e60632015-01-13 14:27:21 +0530961
962 if (last_one)
963 break;
Felipe Balbi72246da2011-08-19 18:10:58 +0300964 } else {
Felipe Balbieeb720f2011-11-28 12:46:59 +0200965 dma = req->request.dma;
966 length = req->request.length;
967 trbs_left--;
968
969 if (!trbs_left)
Felipe Balbi6aff4832016-05-13 10:07:47 +0300970 last_one = true;
Felipe Balbieeb720f2011-11-28 12:46:59 +0200971
972 /* Is this the last request? */
Felipe Balbiaa3342c2016-03-14 11:01:31 +0200973 if (list_is_last(&req->list, &dep->pending_list))
Felipe Balbi6aff4832016-05-13 10:07:47 +0300974 last_one = true;
Felipe Balbieeb720f2011-11-28 12:46:59 +0200975
976 dwc3_prepare_one_trb(dep, req, dma, length,
Pratyush Anande5ba5ec2013-01-14 15:59:37 +0530977 last_one, false, 0);
Felipe Balbieeb720f2011-11-28 12:46:59 +0200978
979 if (last_one)
980 break;
Felipe Balbi72246da2011-08-19 18:10:58 +0300981 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300982 }
Felipe Balbi72246da2011-08-19 18:10:58 +0300983}
984
Felipe Balbi4fae2e32016-05-12 16:53:59 +0300985static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param)
Felipe Balbi72246da2011-08-19 18:10:58 +0300986{
987 struct dwc3_gadget_ep_cmd_params params;
988 struct dwc3_request *req;
989 struct dwc3 *dwc = dep->dwc;
Felipe Balbi4fae2e32016-05-12 16:53:59 +0300990 int starting;
Felipe Balbi72246da2011-08-19 18:10:58 +0300991 int ret;
992 u32 cmd;
993
Felipe Balbi4fae2e32016-05-12 16:53:59 +0300994 starting = !(dep->flags & DWC3_EP_BUSY);
Felipe Balbi72246da2011-08-19 18:10:58 +0300995
Felipe Balbi4fae2e32016-05-12 16:53:59 +0300996 dwc3_prepare_trbs(dep);
997 req = next_request(&dep->started_list);
Felipe Balbi72246da2011-08-19 18:10:58 +0300998 if (!req) {
999 dep->flags |= DWC3_EP_PENDING_REQUEST;
1000 return 0;
1001 }
1002
1003 memset(&params, 0, sizeof(params));
Felipe Balbi72246da2011-08-19 18:10:58 +03001004
Felipe Balbi4fae2e32016-05-12 16:53:59 +03001005 if (starting) {
Pratyush Anand1877d6c2013-01-14 15:59:36 +05301006 params.param0 = upper_32_bits(req->trb_dma);
1007 params.param1 = lower_32_bits(req->trb_dma);
Felipe Balbi72246da2011-08-19 18:10:58 +03001008 cmd = DWC3_DEPCMD_STARTTRANSFER;
Pratyush Anand1877d6c2013-01-14 15:59:36 +05301009 } else {
Felipe Balbi72246da2011-08-19 18:10:58 +03001010 cmd = DWC3_DEPCMD_UPDATETRANSFER;
Pratyush Anand1877d6c2013-01-14 15:59:36 +05301011 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001012
1013 cmd |= DWC3_DEPCMD_PARAM(cmd_param);
1014 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
1015 if (ret < 0) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001016 /*
1017 * FIXME we need to iterate over the list of requests
1018 * here and stop, unmap, free and del each of the linked
Paul Zimmerman1d046792012-02-15 18:56:56 -08001019 * requests instead of what we do now.
Felipe Balbi72246da2011-08-19 18:10:58 +03001020 */
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02001021 usb_gadget_unmap_request(&dwc->gadget, &req->request,
1022 req->direction);
Felipe Balbi72246da2011-08-19 18:10:58 +03001023 list_del(&req->list);
1024 return ret;
1025 }
1026
1027 dep->flags |= DWC3_EP_BUSY;
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001028
Felipe Balbi4fae2e32016-05-12 16:53:59 +03001029 if (starting) {
Felipe Balbib4996a82012-06-06 12:04:13 +03001030 dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc,
Paul Zimmermanf898ae02012-03-29 18:16:54 +00001031 dep->number);
Felipe Balbib4996a82012-06-06 12:04:13 +03001032 WARN_ON_ONCE(!dep->resource_index);
Paul Zimmermanf898ae02012-03-29 18:16:54 +00001033 }
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001034
Felipe Balbi72246da2011-08-19 18:10:58 +03001035 return 0;
1036}
1037
Pratyush Anandd6d6ec72012-05-25 18:54:56 +05301038static void __dwc3_gadget_start_isoc(struct dwc3 *dwc,
1039 struct dwc3_ep *dep, u32 cur_uf)
1040{
1041 u32 uf;
1042
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001043 if (list_empty(&dep->pending_list)) {
Felipe Balbi73815282015-01-27 13:48:14 -06001044 dwc3_trace(trace_dwc3_gadget,
1045 "ISOC ep %s run out for requests",
1046 dep->name);
Pratyush Anandf4a53c52012-08-30 12:21:43 +05301047 dep->flags |= DWC3_EP_PENDING_REQUEST;
Pratyush Anandd6d6ec72012-05-25 18:54:56 +05301048 return;
1049 }
1050
1051 /* 4 micro frames in the future */
1052 uf = cur_uf + dep->interval * 4;
1053
Felipe Balbi4fae2e32016-05-12 16:53:59 +03001054 __dwc3_gadget_kick_transfer(dep, uf);
Pratyush Anandd6d6ec72012-05-25 18:54:56 +05301055}
1056
1057static void dwc3_gadget_start_isoc(struct dwc3 *dwc,
1058 struct dwc3_ep *dep, const struct dwc3_event_depevt *event)
1059{
1060 u32 cur_uf, mask;
1061
1062 mask = ~(dep->interval - 1);
1063 cur_uf = event->parameters & mask;
1064
1065 __dwc3_gadget_start_isoc(dwc, dep, cur_uf);
1066}
1067
Felipe Balbi72246da2011-08-19 18:10:58 +03001068static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
1069{
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02001070 struct dwc3 *dwc = dep->dwc;
1071 int ret;
1072
Felipe Balbibb423982015-11-16 15:31:21 -06001073 if (!dep->endpoint.desc) {
Felipe Balbiec5e7952015-11-16 16:04:13 -06001074 dwc3_trace(trace_dwc3_gadget,
1075 "trying to queue request %p to disabled %s\n",
Felipe Balbibb423982015-11-16 15:31:21 -06001076 &req->request, dep->endpoint.name);
1077 return -ESHUTDOWN;
1078 }
1079
1080 if (WARN(req->dep != dep, "request %p belongs to '%s'\n",
1081 &req->request, req->dep->name)) {
Felipe Balbiec5e7952015-11-16 16:04:13 -06001082 dwc3_trace(trace_dwc3_gadget, "request %p belongs to '%s'\n",
1083 &req->request, req->dep->name);
Felipe Balbibb423982015-11-16 15:31:21 -06001084 return -EINVAL;
1085 }
1086
Felipe Balbi72246da2011-08-19 18:10:58 +03001087 req->request.actual = 0;
1088 req->request.status = -EINPROGRESS;
1089 req->direction = dep->direction;
1090 req->epnum = dep->number;
1091
Felipe Balbife84f522015-09-01 09:01:38 -05001092 trace_dwc3_ep_queue(req);
1093
Felipe Balbi72246da2011-08-19 18:10:58 +03001094 /*
1095 * We only add to our list of requests now and
1096 * start consuming the list once we get XferNotReady
1097 * IRQ.
1098 *
1099 * That way, we avoid doing anything that we don't need
1100 * to do now and defer it until the point we receive a
1101 * particular token from the Host side.
1102 *
1103 * This will also avoid Host cancelling URBs due to too
Paul Zimmerman1d046792012-02-15 18:56:56 -08001104 * many NAKs.
Felipe Balbi72246da2011-08-19 18:10:58 +03001105 */
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02001106 ret = usb_gadget_map_request(&dwc->gadget, &req->request,
1107 dep->direction);
1108 if (ret)
1109 return ret;
1110
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001111 list_add_tail(&req->list, &dep->pending_list);
Felipe Balbi72246da2011-08-19 18:10:58 +03001112
1113 /*
Felipe Balbi1d6a3912015-09-14 11:27:46 -05001114 * If there are no pending requests and the endpoint isn't already
1115 * busy, we will just start the request straight away.
1116 *
1117 * This will save one IRQ (XFER_NOT_READY) and possibly make it a
1118 * little bit faster.
1119 */
1120 if (!usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
Felipe Balbi62e345a2015-11-30 15:24:29 -06001121 !usb_endpoint_xfer_int(dep->endpoint.desc) &&
Felipe Balbi1d6a3912015-09-14 11:27:46 -05001122 !(dep->flags & DWC3_EP_BUSY)) {
Felipe Balbi4fae2e32016-05-12 16:53:59 +03001123 ret = __dwc3_gadget_kick_transfer(dep, 0);
Felipe Balbia8f32812015-09-16 10:40:07 -05001124 goto out;
Felipe Balbi1d6a3912015-09-14 11:27:46 -05001125 }
1126
1127 /*
Felipe Balbib511e5e2012-06-06 12:00:50 +03001128 * There are a few special cases:
Felipe Balbi72246da2011-08-19 18:10:58 +03001129 *
Paul Zimmermanf898ae02012-03-29 18:16:54 +00001130 * 1. XferNotReady with empty list of requests. We need to kick the
1131 * transfer here in that situation, otherwise we will be NAKing
1132 * forever. If we get XferNotReady before gadget driver has a
1133 * chance to queue a request, we will ACK the IRQ but won't be
1134 * able to receive the data until the next request is queued.
1135 * The following code is handling exactly that.
1136 *
Felipe Balbi72246da2011-08-19 18:10:58 +03001137 */
1138 if (dep->flags & DWC3_EP_PENDING_REQUEST) {
Pratyush Anandf4a53c52012-08-30 12:21:43 +05301139 /*
1140 * If xfernotready is already elapsed and it is a case
1141 * of isoc transfer, then issue END TRANSFER, so that
1142 * you can receive xfernotready again and can have
1143 * notion of current microframe.
1144 */
1145 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001146 if (list_empty(&dep->started_list)) {
Paul Zimmermanb992e682012-04-27 14:17:35 +03001147 dwc3_stop_active_transfer(dwc, dep->number, true);
Pratyush Anandcdc359d2013-01-14 15:59:34 +05301148 dep->flags = DWC3_EP_ENABLED;
1149 }
Pratyush Anandf4a53c52012-08-30 12:21:43 +05301150 return 0;
1151 }
1152
Felipe Balbi4fae2e32016-05-12 16:53:59 +03001153 ret = __dwc3_gadget_kick_transfer(dep, 0);
Felipe Balbi89185912015-09-15 09:49:14 -05001154 if (!ret)
1155 dep->flags &= ~DWC3_EP_PENDING_REQUEST;
1156
Felipe Balbia8f32812015-09-16 10:40:07 -05001157 goto out;
Felipe Balbia0925322012-05-22 10:24:11 +03001158 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001159
Felipe Balbib511e5e2012-06-06 12:00:50 +03001160 /*
1161 * 2. XferInProgress on Isoc EP with an active transfer. We need to
1162 * kick the transfer here after queuing a request, otherwise the
1163 * core may not see the modified TRB(s).
1164 */
1165 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
Pratyush Anand79c90462012-08-07 16:54:18 +05301166 (dep->flags & DWC3_EP_BUSY) &&
1167 !(dep->flags & DWC3_EP_MISSED_ISOC)) {
Felipe Balbib4996a82012-06-06 12:04:13 +03001168 WARN_ON_ONCE(!dep->resource_index);
Felipe Balbi4fae2e32016-05-12 16:53:59 +03001169 ret = __dwc3_gadget_kick_transfer(dep, dep->resource_index);
Felipe Balbia8f32812015-09-16 10:40:07 -05001170 goto out;
Felipe Balbib511e5e2012-06-06 12:00:50 +03001171 }
1172
Felipe Balbib997ada2012-07-26 13:26:50 +03001173 /*
1174 * 4. Stream Capable Bulk Endpoints. We need to start the transfer
1175 * right away, otherwise host will not know we have streams to be
1176 * handled.
1177 */
Felipe Balbia8f32812015-09-16 10:40:07 -05001178 if (dep->stream_capable)
Felipe Balbi4fae2e32016-05-12 16:53:59 +03001179 ret = __dwc3_gadget_kick_transfer(dep, 0);
Felipe Balbib997ada2012-07-26 13:26:50 +03001180
Felipe Balbia8f32812015-09-16 10:40:07 -05001181out:
1182 if (ret && ret != -EBUSY)
Felipe Balbiec5e7952015-11-16 16:04:13 -06001183 dwc3_trace(trace_dwc3_gadget,
1184 "%s: failed to kick transfers\n",
Felipe Balbia8f32812015-09-16 10:40:07 -05001185 dep->name);
1186 if (ret == -EBUSY)
1187 ret = 0;
1188
1189 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001190}
1191
Felipe Balbi04c03d12015-12-02 10:06:45 -06001192static void __dwc3_gadget_ep_zlp_complete(struct usb_ep *ep,
1193 struct usb_request *request)
1194{
1195 dwc3_gadget_ep_free_request(ep, request);
1196}
1197
1198static int __dwc3_gadget_ep_queue_zlp(struct dwc3 *dwc, struct dwc3_ep *dep)
1199{
1200 struct dwc3_request *req;
1201 struct usb_request *request;
1202 struct usb_ep *ep = &dep->endpoint;
1203
1204 dwc3_trace(trace_dwc3_gadget, "queueing ZLP\n");
1205 request = dwc3_gadget_ep_alloc_request(ep, GFP_ATOMIC);
1206 if (!request)
1207 return -ENOMEM;
1208
1209 request->length = 0;
1210 request->buf = dwc->zlp_buf;
1211 request->complete = __dwc3_gadget_ep_zlp_complete;
1212
1213 req = to_dwc3_request(request);
1214
1215 return __dwc3_gadget_ep_queue(dep, req);
1216}
1217
Felipe Balbi72246da2011-08-19 18:10:58 +03001218static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
1219 gfp_t gfp_flags)
1220{
1221 struct dwc3_request *req = to_dwc3_request(request);
1222 struct dwc3_ep *dep = to_dwc3_ep(ep);
1223 struct dwc3 *dwc = dep->dwc;
1224
1225 unsigned long flags;
1226
1227 int ret;
1228
Zhuang Jin Canfdee4eb2014-09-03 14:26:34 +08001229 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbi72246da2011-08-19 18:10:58 +03001230 ret = __dwc3_gadget_ep_queue(dep, req);
Felipe Balbi04c03d12015-12-02 10:06:45 -06001231
1232 /*
1233 * Okay, here's the thing, if gadget driver has requested for a ZLP by
1234 * setting request->zero, instead of doing magic, we will just queue an
1235 * extra usb_request ourselves so that it gets handled the same way as
1236 * any other request.
1237 */
John Yound92618982015-12-22 12:23:20 -08001238 if (ret == 0 && request->zero && request->length &&
1239 (request->length % ep->maxpacket == 0))
Felipe Balbi04c03d12015-12-02 10:06:45 -06001240 ret = __dwc3_gadget_ep_queue_zlp(dwc, dep);
1241
Felipe Balbi72246da2011-08-19 18:10:58 +03001242 spin_unlock_irqrestore(&dwc->lock, flags);
1243
1244 return ret;
1245}
1246
1247static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
1248 struct usb_request *request)
1249{
1250 struct dwc3_request *req = to_dwc3_request(request);
1251 struct dwc3_request *r = NULL;
1252
1253 struct dwc3_ep *dep = to_dwc3_ep(ep);
1254 struct dwc3 *dwc = dep->dwc;
1255
1256 unsigned long flags;
1257 int ret = 0;
1258
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -05001259 trace_dwc3_ep_dequeue(req);
1260
Felipe Balbi72246da2011-08-19 18:10:58 +03001261 spin_lock_irqsave(&dwc->lock, flags);
1262
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001263 list_for_each_entry(r, &dep->pending_list, list) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001264 if (r == req)
1265 break;
1266 }
1267
1268 if (r != req) {
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001269 list_for_each_entry(r, &dep->started_list, list) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001270 if (r == req)
1271 break;
1272 }
1273 if (r == req) {
1274 /* wait until it is processed */
Paul Zimmermanb992e682012-04-27 14:17:35 +03001275 dwc3_stop_active_transfer(dwc, dep->number, true);
Pratyush Anande8d4e8b2012-06-15 11:54:00 +05301276 goto out1;
Felipe Balbi72246da2011-08-19 18:10:58 +03001277 }
1278 dev_err(dwc->dev, "request %p was not queued to %s\n",
1279 request, ep->name);
1280 ret = -EINVAL;
1281 goto out0;
1282 }
1283
Pratyush Anande8d4e8b2012-06-15 11:54:00 +05301284out1:
Felipe Balbi72246da2011-08-19 18:10:58 +03001285 /* giveback the request */
1286 dwc3_gadget_giveback(dep, req, -ECONNRESET);
1287
1288out0:
1289 spin_unlock_irqrestore(&dwc->lock, flags);
1290
1291 return ret;
1292}
1293
Felipe Balbi7a608552014-09-24 14:19:52 -05001294int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol)
Felipe Balbi72246da2011-08-19 18:10:58 +03001295{
1296 struct dwc3_gadget_ep_cmd_params params;
1297 struct dwc3 *dwc = dep->dwc;
1298 int ret;
1299
Felipe Balbi5ad02fb2014-09-24 10:48:26 -05001300 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
1301 dev_err(dwc->dev, "%s is of Isochronous type\n", dep->name);
1302 return -EINVAL;
1303 }
1304
Felipe Balbi72246da2011-08-19 18:10:58 +03001305 memset(&params, 0x00, sizeof(params));
1306
1307 if (value) {
Felipe Balbi7a608552014-09-24 14:19:52 -05001308 if (!protocol && ((dep->direction && dep->flags & DWC3_EP_BUSY) ||
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001309 (!list_empty(&dep->started_list) ||
1310 !list_empty(&dep->pending_list)))) {
Felipe Balbiec5e7952015-11-16 16:04:13 -06001311 dwc3_trace(trace_dwc3_gadget,
Felipe Balbi052ba52ef2016-04-05 15:05:05 +03001312 "%s: pending request, cannot halt",
Felipe Balbi7a608552014-09-24 14:19:52 -05001313 dep->name);
1314 return -EAGAIN;
1315 }
1316
Felipe Balbi72246da2011-08-19 18:10:58 +03001317 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
1318 DWC3_DEPCMD_SETSTALL, &params);
1319 if (ret)
Dan Carpenter3f892042014-03-07 14:20:22 +03001320 dev_err(dwc->dev, "failed to set STALL on %s\n",
Felipe Balbi72246da2011-08-19 18:10:58 +03001321 dep->name);
1322 else
1323 dep->flags |= DWC3_EP_STALL;
1324 } else {
John Youn50c763f2016-05-31 17:49:56 -07001325 ret = dwc3_send_clear_stall_ep_cmd(dep);
Felipe Balbi72246da2011-08-19 18:10:58 +03001326 if (ret)
Dan Carpenter3f892042014-03-07 14:20:22 +03001327 dev_err(dwc->dev, "failed to clear STALL on %s\n",
Felipe Balbi72246da2011-08-19 18:10:58 +03001328 dep->name);
1329 else
Alan Sterna535d812013-11-01 12:05:12 -04001330 dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
Felipe Balbi72246da2011-08-19 18:10:58 +03001331 }
Paul Zimmerman52754552011-09-30 10:58:44 +03001332
Felipe Balbi72246da2011-08-19 18:10:58 +03001333 return ret;
1334}
1335
1336static int dwc3_gadget_ep_set_halt(struct usb_ep *ep, int value)
1337{
1338 struct dwc3_ep *dep = to_dwc3_ep(ep);
1339 struct dwc3 *dwc = dep->dwc;
1340
1341 unsigned long flags;
1342
1343 int ret;
1344
1345 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbi7a608552014-09-24 14:19:52 -05001346 ret = __dwc3_gadget_ep_set_halt(dep, value, false);
Felipe Balbi72246da2011-08-19 18:10:58 +03001347 spin_unlock_irqrestore(&dwc->lock, flags);
1348
1349 return ret;
1350}
1351
1352static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep)
1353{
1354 struct dwc3_ep *dep = to_dwc3_ep(ep);
Paul Zimmerman249a4562012-02-24 17:32:16 -08001355 struct dwc3 *dwc = dep->dwc;
1356 unsigned long flags;
Felipe Balbi95aa4e82014-09-24 10:50:14 -05001357 int ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001358
Paul Zimmerman249a4562012-02-24 17:32:16 -08001359 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbi72246da2011-08-19 18:10:58 +03001360 dep->flags |= DWC3_EP_WEDGE;
1361
Pratyush Anand08f0d962012-06-25 22:40:43 +05301362 if (dep->number == 0 || dep->number == 1)
Felipe Balbi95aa4e82014-09-24 10:50:14 -05001363 ret = __dwc3_gadget_ep0_set_halt(ep, 1);
Pratyush Anand08f0d962012-06-25 22:40:43 +05301364 else
Felipe Balbi7a608552014-09-24 14:19:52 -05001365 ret = __dwc3_gadget_ep_set_halt(dep, 1, false);
Felipe Balbi95aa4e82014-09-24 10:50:14 -05001366 spin_unlock_irqrestore(&dwc->lock, flags);
1367
1368 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001369}
1370
1371/* -------------------------------------------------------------------------- */
1372
1373static struct usb_endpoint_descriptor dwc3_gadget_ep0_desc = {
1374 .bLength = USB_DT_ENDPOINT_SIZE,
1375 .bDescriptorType = USB_DT_ENDPOINT,
1376 .bmAttributes = USB_ENDPOINT_XFER_CONTROL,
1377};
1378
1379static const struct usb_ep_ops dwc3_gadget_ep0_ops = {
1380 .enable = dwc3_gadget_ep0_enable,
1381 .disable = dwc3_gadget_ep0_disable,
1382 .alloc_request = dwc3_gadget_ep_alloc_request,
1383 .free_request = dwc3_gadget_ep_free_request,
1384 .queue = dwc3_gadget_ep0_queue,
1385 .dequeue = dwc3_gadget_ep_dequeue,
Pratyush Anand08f0d962012-06-25 22:40:43 +05301386 .set_halt = dwc3_gadget_ep0_set_halt,
Felipe Balbi72246da2011-08-19 18:10:58 +03001387 .set_wedge = dwc3_gadget_ep_set_wedge,
1388};
1389
1390static const struct usb_ep_ops dwc3_gadget_ep_ops = {
1391 .enable = dwc3_gadget_ep_enable,
1392 .disable = dwc3_gadget_ep_disable,
1393 .alloc_request = dwc3_gadget_ep_alloc_request,
1394 .free_request = dwc3_gadget_ep_free_request,
1395 .queue = dwc3_gadget_ep_queue,
1396 .dequeue = dwc3_gadget_ep_dequeue,
1397 .set_halt = dwc3_gadget_ep_set_halt,
1398 .set_wedge = dwc3_gadget_ep_set_wedge,
1399};
1400
1401/* -------------------------------------------------------------------------- */
1402
1403static int dwc3_gadget_get_frame(struct usb_gadget *g)
1404{
1405 struct dwc3 *dwc = gadget_to_dwc(g);
1406 u32 reg;
1407
1408 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1409 return DWC3_DSTS_SOFFN(reg);
1410}
1411
Felipe Balbi218ef7b2016-04-04 11:24:04 +03001412static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
Felipe Balbi72246da2011-08-19 18:10:58 +03001413{
Felipe Balbi72246da2011-08-19 18:10:58 +03001414 unsigned long timeout;
Felipe Balbi72246da2011-08-19 18:10:58 +03001415
Felipe Balbi218ef7b2016-04-04 11:24:04 +03001416 int ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001417 u32 reg;
1418
Felipe Balbi72246da2011-08-19 18:10:58 +03001419 u8 link_state;
1420 u8 speed;
1421
Felipe Balbi72246da2011-08-19 18:10:58 +03001422 /*
1423 * According to the Databook Remote wakeup request should
1424 * be issued only when the device is in early suspend state.
1425 *
1426 * We can check that via USB Link State bits in DSTS register.
1427 */
1428 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1429
1430 speed = reg & DWC3_DSTS_CONNECTSPD;
John Younee5cd412016-02-05 17:08:45 -08001431 if ((speed == DWC3_DSTS_SUPERSPEED) ||
1432 (speed == DWC3_DSTS_SUPERSPEED_PLUS)) {
Felipe Balbiec5e7952015-11-16 16:04:13 -06001433 dwc3_trace(trace_dwc3_gadget, "no wakeup on SuperSpeed\n");
Felipe Balbi6b742892016-05-13 10:19:42 +03001434 return 0;
Felipe Balbi72246da2011-08-19 18:10:58 +03001435 }
1436
1437 link_state = DWC3_DSTS_USBLNKST(reg);
1438
1439 switch (link_state) {
1440 case DWC3_LINK_STATE_RX_DET: /* in HS, means Early Suspend */
1441 case DWC3_LINK_STATE_U3: /* in HS, means SUSPEND */
1442 break;
1443 default:
Felipe Balbiec5e7952015-11-16 16:04:13 -06001444 dwc3_trace(trace_dwc3_gadget,
1445 "can't wakeup from '%s'\n",
1446 dwc3_gadget_link_string(link_state));
Felipe Balbi218ef7b2016-04-04 11:24:04 +03001447 return -EINVAL;
Felipe Balbi72246da2011-08-19 18:10:58 +03001448 }
1449
Felipe Balbi8598bde2012-01-02 18:55:57 +02001450 ret = dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RECOV);
1451 if (ret < 0) {
1452 dev_err(dwc->dev, "failed to put link in Recovery\n");
Felipe Balbi218ef7b2016-04-04 11:24:04 +03001453 return ret;
Felipe Balbi8598bde2012-01-02 18:55:57 +02001454 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001455
Paul Zimmerman802fde92012-04-27 13:10:52 +03001456 /* Recent versions do this automatically */
1457 if (dwc->revision < DWC3_REVISION_194A) {
1458 /* write zeroes to Link Change Request */
Felipe Balbifcc023c2012-05-24 10:27:56 +03001459 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
Paul Zimmerman802fde92012-04-27 13:10:52 +03001460 reg &= ~DWC3_DCTL_ULSTCHNGREQ_MASK;
1461 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
1462 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001463
Paul Zimmerman1d046792012-02-15 18:56:56 -08001464 /* poll until Link State changes to ON */
Felipe Balbi72246da2011-08-19 18:10:58 +03001465 timeout = jiffies + msecs_to_jiffies(100);
1466
Paul Zimmerman1d046792012-02-15 18:56:56 -08001467 while (!time_after(jiffies, timeout)) {
Felipe Balbi72246da2011-08-19 18:10:58 +03001468 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1469
1470 /* in HS, means ON */
1471 if (DWC3_DSTS_USBLNKST(reg) == DWC3_LINK_STATE_U0)
1472 break;
1473 }
1474
1475 if (DWC3_DSTS_USBLNKST(reg) != DWC3_LINK_STATE_U0) {
1476 dev_err(dwc->dev, "failed to send remote wakeup\n");
Felipe Balbi218ef7b2016-04-04 11:24:04 +03001477 return -EINVAL;
Felipe Balbi72246da2011-08-19 18:10:58 +03001478 }
1479
Felipe Balbi218ef7b2016-04-04 11:24:04 +03001480 return 0;
1481}
1482
1483static int dwc3_gadget_wakeup(struct usb_gadget *g)
1484{
1485 struct dwc3 *dwc = gadget_to_dwc(g);
1486 unsigned long flags;
1487 int ret;
1488
1489 spin_lock_irqsave(&dwc->lock, flags);
1490 ret = __dwc3_gadget_wakeup(dwc);
Felipe Balbi72246da2011-08-19 18:10:58 +03001491 spin_unlock_irqrestore(&dwc->lock, flags);
1492
1493 return ret;
1494}
1495
1496static int dwc3_gadget_set_selfpowered(struct usb_gadget *g,
1497 int is_selfpowered)
1498{
1499 struct dwc3 *dwc = gadget_to_dwc(g);
Paul Zimmerman249a4562012-02-24 17:32:16 -08001500 unsigned long flags;
Felipe Balbi72246da2011-08-19 18:10:58 +03001501
Paul Zimmerman249a4562012-02-24 17:32:16 -08001502 spin_lock_irqsave(&dwc->lock, flags);
Peter Chenbcdea502015-01-28 16:32:40 +08001503 g->is_selfpowered = !!is_selfpowered;
Paul Zimmerman249a4562012-02-24 17:32:16 -08001504 spin_unlock_irqrestore(&dwc->lock, flags);
Felipe Balbi72246da2011-08-19 18:10:58 +03001505
1506 return 0;
1507}
1508
Felipe Balbi7b2a0362013-12-19 13:43:19 -06001509static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
Felipe Balbi72246da2011-08-19 18:10:58 +03001510{
1511 u32 reg;
Sebastian Andrzej Siewior61d58242011-08-29 16:46:38 +02001512 u32 timeout = 500;
Felipe Balbi72246da2011-08-19 18:10:58 +03001513
1514 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
Felipe Balbi8db7ed12012-01-18 18:32:29 +02001515 if (is_on) {
Paul Zimmerman802fde92012-04-27 13:10:52 +03001516 if (dwc->revision <= DWC3_REVISION_187A) {
1517 reg &= ~DWC3_DCTL_TRGTULST_MASK;
1518 reg |= DWC3_DCTL_TRGTULST_RX_DET;
1519 }
1520
1521 if (dwc->revision >= DWC3_REVISION_194A)
1522 reg &= ~DWC3_DCTL_KEEP_CONNECT;
1523 reg |= DWC3_DCTL_RUN_STOP;
Felipe Balbi7b2a0362013-12-19 13:43:19 -06001524
1525 if (dwc->has_hibernation)
1526 reg |= DWC3_DCTL_KEEP_CONNECT;
1527
Felipe Balbi9fcb3bd2013-02-08 17:55:58 +02001528 dwc->pullups_connected = true;
Felipe Balbi8db7ed12012-01-18 18:32:29 +02001529 } else {
Felipe Balbi72246da2011-08-19 18:10:58 +03001530 reg &= ~DWC3_DCTL_RUN_STOP;
Felipe Balbi7b2a0362013-12-19 13:43:19 -06001531
1532 if (dwc->has_hibernation && !suspend)
1533 reg &= ~DWC3_DCTL_KEEP_CONNECT;
1534
Felipe Balbi9fcb3bd2013-02-08 17:55:58 +02001535 dwc->pullups_connected = false;
Felipe Balbi8db7ed12012-01-18 18:32:29 +02001536 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001537
1538 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
1539
1540 do {
1541 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
1542 if (is_on) {
1543 if (!(reg & DWC3_DSTS_DEVCTRLHLT))
1544 break;
1545 } else {
1546 if (reg & DWC3_DSTS_DEVCTRLHLT)
1547 break;
1548 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001549 timeout--;
1550 if (!timeout)
Pratyush Anand6f17f742012-07-02 10:21:55 +05301551 return -ETIMEDOUT;
Sebastian Andrzej Siewior61d58242011-08-29 16:46:38 +02001552 udelay(1);
Felipe Balbi72246da2011-08-19 18:10:58 +03001553 } while (1);
1554
Felipe Balbi73815282015-01-27 13:48:14 -06001555 dwc3_trace(trace_dwc3_gadget, "gadget %s data soft-%s",
Felipe Balbi72246da2011-08-19 18:10:58 +03001556 dwc->gadget_driver
1557 ? dwc->gadget_driver->function : "no-function",
1558 is_on ? "connect" : "disconnect");
Pratyush Anand6f17f742012-07-02 10:21:55 +05301559
1560 return 0;
Felipe Balbi72246da2011-08-19 18:10:58 +03001561}
1562
1563static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
1564{
1565 struct dwc3 *dwc = gadget_to_dwc(g);
1566 unsigned long flags;
Pratyush Anand6f17f742012-07-02 10:21:55 +05301567 int ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001568
1569 is_on = !!is_on;
1570
1571 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbi7b2a0362013-12-19 13:43:19 -06001572 ret = dwc3_gadget_run_stop(dwc, is_on, false);
Felipe Balbi72246da2011-08-19 18:10:58 +03001573 spin_unlock_irqrestore(&dwc->lock, flags);
1574
Pratyush Anand6f17f742012-07-02 10:21:55 +05301575 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001576}
1577
Felipe Balbi8698e2a2013-02-08 15:24:04 +02001578static void dwc3_gadget_enable_irq(struct dwc3 *dwc)
1579{
1580 u32 reg;
1581
1582 /* Enable all but Start and End of Frame IRQs */
1583 reg = (DWC3_DEVTEN_VNDRDEVTSTRCVEDEN |
1584 DWC3_DEVTEN_EVNTOVERFLOWEN |
1585 DWC3_DEVTEN_CMDCMPLTEN |
1586 DWC3_DEVTEN_ERRTICERREN |
1587 DWC3_DEVTEN_WKUPEVTEN |
1588 DWC3_DEVTEN_ULSTCNGEN |
1589 DWC3_DEVTEN_CONNECTDONEEN |
1590 DWC3_DEVTEN_USBRSTEN |
1591 DWC3_DEVTEN_DISCONNEVTEN);
1592
1593 dwc3_writel(dwc->regs, DWC3_DEVTEN, reg);
1594}
1595
1596static void dwc3_gadget_disable_irq(struct dwc3 *dwc)
1597{
1598 /* mask all interrupts */
1599 dwc3_writel(dwc->regs, DWC3_DEVTEN, 0x00);
1600}
1601
1602static irqreturn_t dwc3_interrupt(int irq, void *_dwc);
Felipe Balbib15a7622011-06-30 16:57:15 +03001603static irqreturn_t dwc3_thread_interrupt(int irq, void *_dwc);
Felipe Balbi8698e2a2013-02-08 15:24:04 +02001604
Felipe Balbid7be2952016-05-04 15:49:37 +03001605static int __dwc3_gadget_start(struct dwc3 *dwc)
Felipe Balbi72246da2011-08-19 18:10:58 +03001606{
Felipe Balbi72246da2011-08-19 18:10:58 +03001607 struct dwc3_ep *dep;
Felipe Balbi72246da2011-08-19 18:10:58 +03001608 int ret = 0;
1609 u32 reg;
1610
Felipe Balbi72246da2011-08-19 18:10:58 +03001611 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
1612 reg &= ~(DWC3_DCFG_SPEED_MASK);
Felipe Balbi07e7f472012-03-23 12:20:31 +02001613
1614 /**
1615 * WORKAROUND: DWC3 revision < 2.20a have an issue
1616 * which would cause metastability state on Run/Stop
1617 * bit if we try to force the IP to USB2-only mode.
1618 *
1619 * Because of that, we cannot configure the IP to any
1620 * speed other than the SuperSpeed
1621 *
1622 * Refers to:
1623 *
1624 * STAR#9000525659: Clock Domain Crossing on DCTL in
1625 * USB 2.0 Mode
1626 */
Felipe Balbif7e846f2013-06-30 14:29:51 +03001627 if (dwc->revision < DWC3_REVISION_220A) {
Felipe Balbi07e7f472012-03-23 12:20:31 +02001628 reg |= DWC3_DCFG_SUPERSPEED;
Felipe Balbif7e846f2013-06-30 14:29:51 +03001629 } else {
1630 switch (dwc->maximum_speed) {
1631 case USB_SPEED_LOW:
1632 reg |= DWC3_DSTS_LOWSPEED;
1633 break;
1634 case USB_SPEED_FULL:
1635 reg |= DWC3_DSTS_FULLSPEED1;
1636 break;
1637 case USB_SPEED_HIGH:
1638 reg |= DWC3_DSTS_HIGHSPEED;
1639 break;
John Youn75808622016-02-05 17:09:13 -08001640 case USB_SPEED_SUPER_PLUS:
1641 reg |= DWC3_DSTS_SUPERSPEED_PLUS;
1642 break;
Felipe Balbif7e846f2013-06-30 14:29:51 +03001643 default:
John Youn77966eb2016-02-19 17:31:01 -08001644 dev_err(dwc->dev, "invalid dwc->maximum_speed (%d)\n",
1645 dwc->maximum_speed);
1646 /* fall through */
1647 case USB_SPEED_SUPER:
1648 reg |= DWC3_DCFG_SUPERSPEED;
1649 break;
Felipe Balbif7e846f2013-06-30 14:29:51 +03001650 }
1651 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001652 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
1653
Felipe Balbi2a58f9c2016-04-28 10:56:28 +03001654 /*
1655 * We are telling dwc3 that we want to use DCFG.NUMP as ACK TP's NUMP
1656 * field instead of letting dwc3 itself calculate that automatically.
1657 *
1658 * This way, we maximize the chances that we'll be able to get several
1659 * bursts of data without going through any sort of endpoint throttling.
1660 */
1661 reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG);
1662 reg &= ~DWC3_GRXTHRCFG_PKTCNTSEL;
1663 dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg);
1664
Felipe Balbi72246da2011-08-19 18:10:58 +03001665 /* Start with SuperSpeed Default */
1666 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
1667
1668 dep = dwc->eps[0];
Paul Zimmerman265b70a2013-12-19 12:38:49 -06001669 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false,
1670 false);
Felipe Balbi72246da2011-08-19 18:10:58 +03001671 if (ret) {
1672 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
Felipe Balbid7be2952016-05-04 15:49:37 +03001673 goto err0;
Felipe Balbi72246da2011-08-19 18:10:58 +03001674 }
1675
1676 dep = dwc->eps[1];
Paul Zimmerman265b70a2013-12-19 12:38:49 -06001677 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false,
1678 false);
Felipe Balbi72246da2011-08-19 18:10:58 +03001679 if (ret) {
1680 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
Felipe Balbid7be2952016-05-04 15:49:37 +03001681 goto err1;
Felipe Balbi72246da2011-08-19 18:10:58 +03001682 }
1683
1684 /* begin to receive SETUP packets */
Felipe Balbic7fcdeb2011-08-27 22:28:36 +03001685 dwc->ep0state = EP0_SETUP_PHASE;
Felipe Balbi72246da2011-08-19 18:10:58 +03001686 dwc3_ep0_out_start(dwc);
1687
Felipe Balbi8698e2a2013-02-08 15:24:04 +02001688 dwc3_gadget_enable_irq(dwc);
1689
Felipe Balbid7be2952016-05-04 15:49:37 +03001690 return 0;
1691
1692err1:
1693 __dwc3_gadget_ep_disable(dwc->eps[0]);
1694
1695err0:
1696 return ret;
1697}
1698
1699static int dwc3_gadget_start(struct usb_gadget *g,
1700 struct usb_gadget_driver *driver)
1701{
1702 struct dwc3 *dwc = gadget_to_dwc(g);
1703 unsigned long flags;
1704 int ret = 0;
1705 int irq;
1706
1707 irq = platform_get_irq(to_platform_device(dwc->dev), 0);
1708 ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt,
1709 IRQF_SHARED, "dwc3", dwc->ev_buf);
1710 if (ret) {
1711 dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
1712 irq, ret);
1713 goto err0;
1714 }
1715
1716 spin_lock_irqsave(&dwc->lock, flags);
1717 if (dwc->gadget_driver) {
1718 dev_err(dwc->dev, "%s is already bound to %s\n",
1719 dwc->gadget.name,
1720 dwc->gadget_driver->driver.name);
1721 ret = -EBUSY;
1722 goto err1;
1723 }
1724
1725 dwc->gadget_driver = driver;
1726
1727 __dwc3_gadget_start(dwc);
Felipe Balbi72246da2011-08-19 18:10:58 +03001728 spin_unlock_irqrestore(&dwc->lock, flags);
1729
1730 return 0;
1731
Felipe Balbib0d7ffd2013-06-27 10:00:18 +03001732err1:
Felipe Balbi72246da2011-08-19 18:10:58 +03001733 spin_unlock_irqrestore(&dwc->lock, flags);
Felipe Balbid7be2952016-05-04 15:49:37 +03001734 free_irq(irq, dwc);
Felipe Balbib0d7ffd2013-06-27 10:00:18 +03001735
1736err0:
Felipe Balbi72246da2011-08-19 18:10:58 +03001737 return ret;
1738}
1739
Felipe Balbid7be2952016-05-04 15:49:37 +03001740static void __dwc3_gadget_stop(struct dwc3 *dwc)
1741{
1742 dwc3_gadget_disable_irq(dwc);
1743 __dwc3_gadget_ep_disable(dwc->eps[0]);
1744 __dwc3_gadget_ep_disable(dwc->eps[1]);
1745}
1746
Felipe Balbi22835b82014-10-17 12:05:12 -05001747static int dwc3_gadget_stop(struct usb_gadget *g)
Felipe Balbi72246da2011-08-19 18:10:58 +03001748{
1749 struct dwc3 *dwc = gadget_to_dwc(g);
1750 unsigned long flags;
Felipe Balbi8698e2a2013-02-08 15:24:04 +02001751 int irq;
Felipe Balbi72246da2011-08-19 18:10:58 +03001752
1753 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbid7be2952016-05-04 15:49:37 +03001754 __dwc3_gadget_stop(dwc);
Felipe Balbi72246da2011-08-19 18:10:58 +03001755 dwc->gadget_driver = NULL;
Felipe Balbi72246da2011-08-19 18:10:58 +03001756 spin_unlock_irqrestore(&dwc->lock, flags);
1757
Felipe Balbib0d7ffd2013-06-27 10:00:18 +03001758 irq = platform_get_irq(to_platform_device(dwc->dev), 0);
Felipe Balbidea520a2016-03-30 09:39:34 +03001759 free_irq(irq, dwc->ev_buf);
Felipe Balbib0d7ffd2013-06-27 10:00:18 +03001760
Felipe Balbi72246da2011-08-19 18:10:58 +03001761 return 0;
1762}
Paul Zimmerman802fde92012-04-27 13:10:52 +03001763
Felipe Balbi72246da2011-08-19 18:10:58 +03001764static const struct usb_gadget_ops dwc3_gadget_ops = {
1765 .get_frame = dwc3_gadget_get_frame,
1766 .wakeup = dwc3_gadget_wakeup,
1767 .set_selfpowered = dwc3_gadget_set_selfpowered,
1768 .pullup = dwc3_gadget_pullup,
1769 .udc_start = dwc3_gadget_start,
1770 .udc_stop = dwc3_gadget_stop,
1771};
1772
1773/* -------------------------------------------------------------------------- */
1774
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001775static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc,
1776 u8 num, u32 direction)
Felipe Balbi72246da2011-08-19 18:10:58 +03001777{
1778 struct dwc3_ep *dep;
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001779 u8 i;
Felipe Balbi72246da2011-08-19 18:10:58 +03001780
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001781 for (i = 0; i < num; i++) {
1782 u8 epnum = (i << 1) | (!!direction);
Felipe Balbi72246da2011-08-19 18:10:58 +03001783
Felipe Balbi72246da2011-08-19 18:10:58 +03001784 dep = kzalloc(sizeof(*dep), GFP_KERNEL);
Jingoo Han734d5a52014-07-17 12:45:11 +09001785 if (!dep)
Felipe Balbi72246da2011-08-19 18:10:58 +03001786 return -ENOMEM;
Felipe Balbi72246da2011-08-19 18:10:58 +03001787
1788 dep->dwc = dwc;
1789 dep->number = epnum;
Felipe Balbi9aa62ae2013-07-12 19:10:59 +03001790 dep->direction = !!direction;
Felipe Balbi72246da2011-08-19 18:10:58 +03001791 dwc->eps[epnum] = dep;
1792
1793 snprintf(dep->name, sizeof(dep->name), "ep%d%s", epnum >> 1,
1794 (epnum & 1) ? "in" : "out");
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001795
Felipe Balbi72246da2011-08-19 18:10:58 +03001796 dep->endpoint.name = dep->name;
Felipe Balbi72246da2011-08-19 18:10:58 +03001797
Felipe Balbi73815282015-01-27 13:48:14 -06001798 dwc3_trace(trace_dwc3_gadget, "initializing %s", dep->name);
Felipe Balbi653df352013-07-12 19:11:57 +03001799
Felipe Balbi72246da2011-08-19 18:10:58 +03001800 if (epnum == 0 || epnum == 1) {
Robert Baldygae117e742013-12-13 12:23:38 +01001801 usb_ep_set_maxpacket_limit(&dep->endpoint, 512);
Pratyush Anand6048e4c2013-01-18 16:53:56 +05301802 dep->endpoint.maxburst = 1;
Felipe Balbi72246da2011-08-19 18:10:58 +03001803 dep->endpoint.ops = &dwc3_gadget_ep0_ops;
1804 if (!epnum)
1805 dwc->gadget.ep0 = &dep->endpoint;
1806 } else {
1807 int ret;
1808
Robert Baldygae117e742013-12-13 12:23:38 +01001809 usb_ep_set_maxpacket_limit(&dep->endpoint, 1024);
Sebastian Andrzej Siewior12d36c12011-11-03 20:27:50 +01001810 dep->endpoint.max_streams = 15;
Felipe Balbi72246da2011-08-19 18:10:58 +03001811 dep->endpoint.ops = &dwc3_gadget_ep_ops;
1812 list_add_tail(&dep->endpoint.ep_list,
1813 &dwc->gadget.ep_list);
1814
1815 ret = dwc3_alloc_trb_pool(dep);
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001816 if (ret)
Felipe Balbi72246da2011-08-19 18:10:58 +03001817 return ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001818 }
Felipe Balbi25b8ff62011-11-04 12:32:47 +02001819
Robert Baldygaa474d3b2015-07-31 16:00:19 +02001820 if (epnum == 0 || epnum == 1) {
1821 dep->endpoint.caps.type_control = true;
1822 } else {
1823 dep->endpoint.caps.type_iso = true;
1824 dep->endpoint.caps.type_bulk = true;
1825 dep->endpoint.caps.type_int = true;
1826 }
1827
1828 dep->endpoint.caps.dir_in = !!direction;
1829 dep->endpoint.caps.dir_out = !direction;
1830
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001831 INIT_LIST_HEAD(&dep->pending_list);
1832 INIT_LIST_HEAD(&dep->started_list);
Felipe Balbi72246da2011-08-19 18:10:58 +03001833 }
1834
1835 return 0;
1836}
1837
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001838static int dwc3_gadget_init_endpoints(struct dwc3 *dwc)
1839{
1840 int ret;
1841
1842 INIT_LIST_HEAD(&dwc->gadget.ep_list);
1843
1844 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0);
1845 if (ret < 0) {
Felipe Balbi73815282015-01-27 13:48:14 -06001846 dwc3_trace(trace_dwc3_gadget,
1847 "failed to allocate OUT endpoints");
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001848 return ret;
1849 }
1850
1851 ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1);
1852 if (ret < 0) {
Felipe Balbi73815282015-01-27 13:48:14 -06001853 dwc3_trace(trace_dwc3_gadget,
1854 "failed to allocate IN endpoints");
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001855 return ret;
1856 }
1857
1858 return 0;
1859}
1860
Felipe Balbi72246da2011-08-19 18:10:58 +03001861static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
1862{
1863 struct dwc3_ep *dep;
1864 u8 epnum;
1865
1866 for (epnum = 0; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
1867 dep = dwc->eps[epnum];
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03001868 if (!dep)
1869 continue;
George Cherian5bf8fae2013-05-27 14:35:49 +05301870 /*
1871 * Physical endpoints 0 and 1 are special; they form the
1872 * bi-directional USB endpoint 0.
1873 *
1874 * For those two physical endpoints, we don't allocate a TRB
1875 * pool nor do we add them the endpoints list. Due to that, we
1876 * shouldn't do these two operations otherwise we would end up
1877 * with all sorts of bugs when removing dwc3.ko.
1878 */
1879 if (epnum != 0 && epnum != 1) {
1880 dwc3_free_trb_pool(dep);
Felipe Balbi72246da2011-08-19 18:10:58 +03001881 list_del(&dep->endpoint.ep_list);
George Cherian5bf8fae2013-05-27 14:35:49 +05301882 }
Felipe Balbi72246da2011-08-19 18:10:58 +03001883
1884 kfree(dep);
1885 }
1886}
1887
Felipe Balbi72246da2011-08-19 18:10:58 +03001888/* -------------------------------------------------------------------------- */
Felipe Balbie5caff62013-02-26 15:11:05 +02001889
Pratyush Anande5ba5ec2013-01-14 15:59:37 +05301890static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep,
1891 struct dwc3_request *req, struct dwc3_trb *trb,
1892 const struct dwc3_event_depevt *event, int status)
1893{
1894 unsigned int count;
1895 unsigned int s_pkt = 0;
1896 unsigned int trb_status;
1897
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -05001898 trace_dwc3_complete_trb(dep, trb);
1899
Pratyush Anande5ba5ec2013-01-14 15:59:37 +05301900 if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN)
1901 /*
1902 * We continue despite the error. There is not much we
1903 * can do. If we don't clean it up we loop forever. If
1904 * we skip the TRB then it gets overwritten after a
1905 * while since we use them in a ring buffer. A BUG()
1906 * would help. Lets hope that if this occurs, someone
1907 * fixes the root cause instead of looking away :)
1908 */
1909 dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n",
1910 dep->name, trb);
1911 count = trb->size & DWC3_TRB_SIZE_MASK;
1912
1913 if (dep->direction) {
1914 if (count) {
1915 trb_status = DWC3_TRB_SIZE_TRBSTS(trb->size);
1916 if (trb_status == DWC3_TRBSTS_MISSED_ISOC) {
Felipe Balbiec5e7952015-11-16 16:04:13 -06001917 dwc3_trace(trace_dwc3_gadget,
1918 "%s: incomplete IN transfer\n",
Pratyush Anande5ba5ec2013-01-14 15:59:37 +05301919 dep->name);
1920 /*
1921 * If missed isoc occurred and there is
1922 * no request queued then issue END
1923 * TRANSFER, so that core generates
1924 * next xfernotready and we will issue
1925 * a fresh START TRANSFER.
1926 * If there are still queued request
1927 * then wait, do not issue either END
1928 * or UPDATE TRANSFER, just attach next
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001929 * request in pending_list during
Pratyush Anande5ba5ec2013-01-14 15:59:37 +05301930 * giveback.If any future queued request
1931 * is successfully transferred then we
1932 * will issue UPDATE TRANSFER for all
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001933 * request in the pending_list.
Pratyush Anande5ba5ec2013-01-14 15:59:37 +05301934 */
1935 dep->flags |= DWC3_EP_MISSED_ISOC;
1936 } else {
1937 dev_err(dwc->dev, "incomplete IN transfer %s\n",
1938 dep->name);
1939 status = -ECONNRESET;
1940 }
1941 } else {
1942 dep->flags &= ~DWC3_EP_MISSED_ISOC;
1943 }
1944 } else {
1945 if (count && (event->status & DEPEVT_STATUS_SHORT))
1946 s_pkt = 1;
1947 }
1948
1949 /*
1950 * We assume here we will always receive the entire data block
1951 * which we should receive. Meaning, if we program RX to
1952 * receive 4K but we receive only 2K, we assume that's all we
1953 * should receive and we simply bounce the request back to the
1954 * gadget driver for further processing.
1955 */
1956 req->request.actual += req->request.length - count;
1957 if (s_pkt)
1958 return 1;
1959 if ((event->status & DEPEVT_STATUS_LST) &&
1960 (trb->ctrl & (DWC3_TRB_CTRL_LST |
1961 DWC3_TRB_CTRL_HWO)))
1962 return 1;
1963 if ((event->status & DEPEVT_STATUS_IOC) &&
1964 (trb->ctrl & DWC3_TRB_CTRL_IOC))
1965 return 1;
1966 return 0;
1967}
1968
Felipe Balbi72246da2011-08-19 18:10:58 +03001969static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
1970 const struct dwc3_event_depevt *event, int status)
1971{
1972 struct dwc3_request *req;
Felipe Balbif6bafc62012-02-06 11:04:53 +02001973 struct dwc3_trb *trb;
Pratyush Anande5ba5ec2013-01-14 15:59:37 +05301974 unsigned int slot;
1975 unsigned int i;
1976 int ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03001977
1978 do {
Felipe Balbiaa3342c2016-03-14 11:01:31 +02001979 req = next_request(&dep->started_list);
Felipe Balbiac7bdcc2015-11-16 16:13:57 -06001980 if (WARN_ON_ONCE(!req))
Ville Syrjäläd115d702015-08-31 19:48:28 +03001981 return 1;
Felipe Balbiac7bdcc2015-11-16 16:13:57 -06001982
Ville Syrjäläd115d702015-08-31 19:48:28 +03001983 i = 0;
1984 do {
Felipe Balbi53fd8812016-04-04 15:33:41 +03001985 slot = req->first_trb_index + i;
Felipe Balbi36b68aa2016-04-05 13:24:36 +03001986 if (slot == DWC3_TRB_NUM - 1)
Ville Syrjäläd115d702015-08-31 19:48:28 +03001987 slot++;
1988 slot %= DWC3_TRB_NUM;
1989 trb = &dep->trb_pool[slot];
Felipe Balbi72246da2011-08-19 18:10:58 +03001990
Ville Syrjäläd115d702015-08-31 19:48:28 +03001991 ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
1992 event, status);
1993 if (ret)
1994 break;
1995 } while (++i < req->request.num_mapped_sgs);
1996
1997 dwc3_gadget_giveback(dep, req, status);
1998
Pratyush Anande5ba5ec2013-01-14 15:59:37 +05301999 if (ret)
Felipe Balbi72246da2011-08-19 18:10:58 +03002000 break;
Ville Syrjäläd115d702015-08-31 19:48:28 +03002001 } while (1);
Felipe Balbi72246da2011-08-19 18:10:58 +03002002
Pratyush Anandcdc359d2013-01-14 15:59:34 +05302003 if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
Felipe Balbiaa3342c2016-03-14 11:01:31 +02002004 list_empty(&dep->started_list)) {
2005 if (list_empty(&dep->pending_list)) {
Pratyush Anandcdc359d2013-01-14 15:59:34 +05302006 /*
2007 * If there is no entry in request list then do
2008 * not issue END TRANSFER now. Just set PENDING
2009 * flag, so that END TRANSFER is issued when an
2010 * entry is added into request list.
2011 */
2012 dep->flags = DWC3_EP_PENDING_REQUEST;
2013 } else {
Paul Zimmermanb992e682012-04-27 14:17:35 +03002014 dwc3_stop_active_transfer(dwc, dep->number, true);
Pratyush Anandcdc359d2013-01-14 15:59:34 +05302015 dep->flags = DWC3_EP_ENABLED;
2016 }
Pratyush Anand7efea862013-01-14 15:59:32 +05302017 return 1;
2018 }
2019
Felipe Balbi72246da2011-08-19 18:10:58 +03002020 return 1;
2021}
2022
2023static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc,
Jingoo Han029d97f2014-07-04 15:00:51 +09002024 struct dwc3_ep *dep, const struct dwc3_event_depevt *event)
Felipe Balbi72246da2011-08-19 18:10:58 +03002025{
2026 unsigned status = 0;
2027 int clean_busy;
Felipe Balbie18b7972015-05-29 10:06:38 -05002028 u32 is_xfer_complete;
2029
2030 is_xfer_complete = (event->endpoint_event == DWC3_DEPEVT_XFERCOMPLETE);
Felipe Balbi72246da2011-08-19 18:10:58 +03002031
2032 if (event->status & DEPEVT_STATUS_BUSERR)
2033 status = -ECONNRESET;
2034
Paul Zimmerman1d046792012-02-15 18:56:56 -08002035 clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status);
Felipe Balbie18b7972015-05-29 10:06:38 -05002036 if (clean_busy && (is_xfer_complete ||
2037 usb_endpoint_xfer_isoc(dep->endpoint.desc)))
Felipe Balbi72246da2011-08-19 18:10:58 +03002038 dep->flags &= ~DWC3_EP_BUSY;
Felipe Balbifae2b902011-10-14 13:00:30 +03002039
2040 /*
2041 * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
2042 * See dwc3_gadget_linksts_change_interrupt() for 1st half.
2043 */
2044 if (dwc->revision < DWC3_REVISION_183A) {
2045 u32 reg;
2046 int i;
2047
2048 for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
Moiz Sonasath348e0262012-08-01 14:08:30 -05002049 dep = dwc->eps[i];
Felipe Balbifae2b902011-10-14 13:00:30 +03002050
2051 if (!(dep->flags & DWC3_EP_ENABLED))
2052 continue;
2053
Felipe Balbiaa3342c2016-03-14 11:01:31 +02002054 if (!list_empty(&dep->started_list))
Felipe Balbifae2b902011-10-14 13:00:30 +03002055 return;
2056 }
2057
2058 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2059 reg |= dwc->u1u2;
2060 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
2061
2062 dwc->u1u2 = 0;
2063 }
Felipe Balbi8a1a9c92015-09-21 14:32:00 -05002064
Felipe Balbie6e709b2015-09-28 15:16:56 -05002065 if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbi8a1a9c92015-09-21 14:32:00 -05002066 int ret;
2067
Felipe Balbi4fae2e32016-05-12 16:53:59 +03002068 ret = __dwc3_gadget_kick_transfer(dep, 0);
Felipe Balbi8a1a9c92015-09-21 14:32:00 -05002069 if (!ret || ret == -EBUSY)
2070 return;
2071 }
Felipe Balbi72246da2011-08-19 18:10:58 +03002072}
2073
Felipe Balbi72246da2011-08-19 18:10:58 +03002074static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
2075 const struct dwc3_event_depevt *event)
2076{
2077 struct dwc3_ep *dep;
2078 u8 epnum = event->endpoint_number;
2079
2080 dep = dwc->eps[epnum];
2081
Felipe Balbi3336abb2012-06-06 09:19:35 +03002082 if (!(dep->flags & DWC3_EP_ENABLED))
2083 return;
2084
Felipe Balbi72246da2011-08-19 18:10:58 +03002085 if (epnum == 0 || epnum == 1) {
2086 dwc3_ep0_interrupt(dwc, event);
2087 return;
2088 }
2089
2090 switch (event->endpoint_event) {
2091 case DWC3_DEPEVT_XFERCOMPLETE:
Felipe Balbib4996a82012-06-06 12:04:13 +03002092 dep->resource_index = 0;
Paul Zimmermanc2df85c2012-02-24 17:32:18 -08002093
Ido Shayevitz16e78db2012-03-12 20:25:24 +02002094 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbiec5e7952015-11-16 16:04:13 -06002095 dwc3_trace(trace_dwc3_gadget,
2096 "%s is an Isochronous endpoint\n",
Felipe Balbi72246da2011-08-19 18:10:58 +03002097 dep->name);
2098 return;
2099 }
2100
Jingoo Han029d97f2014-07-04 15:00:51 +09002101 dwc3_endpoint_transfer_complete(dwc, dep, event);
Felipe Balbi72246da2011-08-19 18:10:58 +03002102 break;
2103 case DWC3_DEPEVT_XFERINPROGRESS:
Jingoo Han029d97f2014-07-04 15:00:51 +09002104 dwc3_endpoint_transfer_complete(dwc, dep, event);
Felipe Balbi72246da2011-08-19 18:10:58 +03002105 break;
2106 case DWC3_DEPEVT_XFERNOTREADY:
Ido Shayevitz16e78db2012-03-12 20:25:24 +02002107 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
Felipe Balbi72246da2011-08-19 18:10:58 +03002108 dwc3_gadget_start_isoc(dwc, dep, event);
2109 } else {
Felipe Balbi6bb4fe12015-09-28 14:49:02 -05002110 int active;
Felipe Balbi72246da2011-08-19 18:10:58 +03002111 int ret;
2112
Felipe Balbi6bb4fe12015-09-28 14:49:02 -05002113 active = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE;
2114
Felipe Balbi73815282015-01-27 13:48:14 -06002115 dwc3_trace(trace_dwc3_gadget, "%s: reason %s",
Felipe Balbi6bb4fe12015-09-28 14:49:02 -05002116 dep->name, active ? "Transfer Active"
Felipe Balbi72246da2011-08-19 18:10:58 +03002117 : "Transfer Not Active");
2118
Felipe Balbi4fae2e32016-05-12 16:53:59 +03002119 ret = __dwc3_gadget_kick_transfer(dep, 0);
Felipe Balbi72246da2011-08-19 18:10:58 +03002120 if (!ret || ret == -EBUSY)
2121 return;
2122
Felipe Balbiec5e7952015-11-16 16:04:13 -06002123 dwc3_trace(trace_dwc3_gadget,
2124 "%s: failed to kick transfers\n",
Felipe Balbi72246da2011-08-19 18:10:58 +03002125 dep->name);
2126 }
2127
2128 break;
Felipe Balbi879631a2011-09-30 10:58:47 +03002129 case DWC3_DEPEVT_STREAMEVT:
Ido Shayevitz16e78db2012-03-12 20:25:24 +02002130 if (!usb_endpoint_xfer_bulk(dep->endpoint.desc)) {
Felipe Balbi879631a2011-09-30 10:58:47 +03002131 dev_err(dwc->dev, "Stream event for non-Bulk %s\n",
2132 dep->name);
2133 return;
2134 }
2135
2136 switch (event->status) {
2137 case DEPEVT_STREAMEVT_FOUND:
Felipe Balbi73815282015-01-27 13:48:14 -06002138 dwc3_trace(trace_dwc3_gadget,
2139 "Stream %d found and started",
Felipe Balbi879631a2011-09-30 10:58:47 +03002140 event->parameters);
2141
2142 break;
2143 case DEPEVT_STREAMEVT_NOTFOUND:
2144 /* FALLTHROUGH */
2145 default:
Felipe Balbiec5e7952015-11-16 16:04:13 -06002146 dwc3_trace(trace_dwc3_gadget,
2147 "unable to find suitable stream\n");
Felipe Balbi879631a2011-09-30 10:58:47 +03002148 }
2149 break;
Felipe Balbi72246da2011-08-19 18:10:58 +03002150 case DWC3_DEPEVT_RXTXFIFOEVT:
Felipe Balbiec5e7952015-11-16 16:04:13 -06002151 dwc3_trace(trace_dwc3_gadget, "%s FIFO Overrun\n", dep->name);
Felipe Balbi72246da2011-08-19 18:10:58 +03002152 break;
Felipe Balbi72246da2011-08-19 18:10:58 +03002153 case DWC3_DEPEVT_EPCMDCMPLT:
Felipe Balbi73815282015-01-27 13:48:14 -06002154 dwc3_trace(trace_dwc3_gadget, "Endpoint Command Complete");
Felipe Balbi72246da2011-08-19 18:10:58 +03002155 break;
2156 }
2157}
2158
2159static void dwc3_disconnect_gadget(struct dwc3 *dwc)
2160{
2161 if (dwc->gadget_driver && dwc->gadget_driver->disconnect) {
2162 spin_unlock(&dwc->lock);
2163 dwc->gadget_driver->disconnect(&dwc->gadget);
2164 spin_lock(&dwc->lock);
2165 }
2166}
2167
Felipe Balbibc5ba2e2014-02-26 10:17:07 -06002168static void dwc3_suspend_gadget(struct dwc3 *dwc)
2169{
Dan Carpenter73a30bf2014-03-07 14:19:57 +03002170 if (dwc->gadget_driver && dwc->gadget_driver->suspend) {
Felipe Balbibc5ba2e2014-02-26 10:17:07 -06002171 spin_unlock(&dwc->lock);
2172 dwc->gadget_driver->suspend(&dwc->gadget);
2173 spin_lock(&dwc->lock);
2174 }
2175}
2176
2177static void dwc3_resume_gadget(struct dwc3 *dwc)
2178{
Dan Carpenter73a30bf2014-03-07 14:19:57 +03002179 if (dwc->gadget_driver && dwc->gadget_driver->resume) {
Felipe Balbibc5ba2e2014-02-26 10:17:07 -06002180 spin_unlock(&dwc->lock);
2181 dwc->gadget_driver->resume(&dwc->gadget);
Felipe Balbi5c7b3b02015-01-29 10:29:18 -06002182 spin_lock(&dwc->lock);
Felipe Balbi8e744752014-11-06 14:27:53 +08002183 }
2184}
2185
2186static void dwc3_reset_gadget(struct dwc3 *dwc)
2187{
2188 if (!dwc->gadget_driver)
2189 return;
2190
2191 if (dwc->gadget.speed != USB_SPEED_UNKNOWN) {
2192 spin_unlock(&dwc->lock);
2193 usb_gadget_udc_reset(&dwc->gadget, dwc->gadget_driver);
Felipe Balbibc5ba2e2014-02-26 10:17:07 -06002194 spin_lock(&dwc->lock);
2195 }
2196}
2197
Paul Zimmermanb992e682012-04-27 14:17:35 +03002198static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force)
Felipe Balbi72246da2011-08-19 18:10:58 +03002199{
2200 struct dwc3_ep *dep;
2201 struct dwc3_gadget_ep_cmd_params params;
2202 u32 cmd;
2203 int ret;
2204
2205 dep = dwc->eps[epnum];
2206
Felipe Balbib4996a82012-06-06 12:04:13 +03002207 if (!dep->resource_index)
Pratyush Anand3daf74d2012-06-23 02:23:08 +05302208 return;
2209
Pratyush Anand57911502012-07-06 15:19:10 +05302210 /*
2211 * NOTICE: We are violating what the Databook says about the
2212 * EndTransfer command. Ideally we would _always_ wait for the
2213 * EndTransfer Command Completion IRQ, but that's causing too
2214 * much trouble synchronizing between us and gadget driver.
2215 *
2216 * We have discussed this with the IP Provider and it was
2217 * suggested to giveback all requests here, but give HW some
2218 * extra time to synchronize with the interconnect. We're using
Mickael Maisondc93b412014-12-23 17:34:43 +01002219 * an arbitrary 100us delay for that.
Pratyush Anand57911502012-07-06 15:19:10 +05302220 *
2221 * Note also that a similar handling was tested by Synopsys
2222 * (thanks a lot Paul) and nothing bad has come out of it.
2223 * In short, what we're doing is:
2224 *
2225 * - Issue EndTransfer WITH CMDIOC bit set
2226 * - Wait 100us
2227 */
2228
Pratyush Anand3daf74d2012-06-23 02:23:08 +05302229 cmd = DWC3_DEPCMD_ENDTRANSFER;
Paul Zimmermanb992e682012-04-27 14:17:35 +03002230 cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
2231 cmd |= DWC3_DEPCMD_CMDIOC;
Felipe Balbib4996a82012-06-06 12:04:13 +03002232 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
Pratyush Anand3daf74d2012-06-23 02:23:08 +05302233 memset(&params, 0, sizeof(params));
2234 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);
2235 WARN_ON_ONCE(ret);
Felipe Balbib4996a82012-06-06 12:04:13 +03002236 dep->resource_index = 0;
Felipe Balbi041d81f2012-10-04 11:58:00 +03002237 dep->flags &= ~DWC3_EP_BUSY;
Pratyush Anand57911502012-07-06 15:19:10 +05302238 udelay(100);
Felipe Balbi72246da2011-08-19 18:10:58 +03002239}
2240
2241static void dwc3_stop_active_transfers(struct dwc3 *dwc)
2242{
2243 u32 epnum;
2244
2245 for (epnum = 2; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
2246 struct dwc3_ep *dep;
2247
2248 dep = dwc->eps[epnum];
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03002249 if (!dep)
2250 continue;
2251
Felipe Balbi72246da2011-08-19 18:10:58 +03002252 if (!(dep->flags & DWC3_EP_ENABLED))
2253 continue;
2254
Sebastian Andrzej Siewior624407f2011-08-29 13:56:37 +02002255 dwc3_remove_requests(dwc, dep);
Felipe Balbi72246da2011-08-19 18:10:58 +03002256 }
2257}
2258
2259static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)
2260{
2261 u32 epnum;
2262
2263 for (epnum = 1; epnum < DWC3_ENDPOINTS_NUM; epnum++) {
2264 struct dwc3_ep *dep;
Felipe Balbi72246da2011-08-19 18:10:58 +03002265 int ret;
2266
2267 dep = dwc->eps[epnum];
Felipe Balbi6a1e3ef2011-05-05 16:21:59 +03002268 if (!dep)
2269 continue;
Felipe Balbi72246da2011-08-19 18:10:58 +03002270
2271 if (!(dep->flags & DWC3_EP_STALL))
2272 continue;
2273
2274 dep->flags &= ~DWC3_EP_STALL;
2275
John Youn50c763f2016-05-31 17:49:56 -07002276 ret = dwc3_send_clear_stall_ep_cmd(dep);
Felipe Balbi72246da2011-08-19 18:10:58 +03002277 WARN_ON_ONCE(ret);
2278 }
2279}
2280
2281static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
2282{
Felipe Balbic4430a22012-05-24 10:30:01 +03002283 int reg;
2284
Felipe Balbi72246da2011-08-19 18:10:58 +03002285 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2286 reg &= ~DWC3_DCTL_INITU1ENA;
2287 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
2288
2289 reg &= ~DWC3_DCTL_INITU2ENA;
2290 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
Felipe Balbi72246da2011-08-19 18:10:58 +03002291
Felipe Balbi72246da2011-08-19 18:10:58 +03002292 dwc3_disconnect_gadget(dwc);
2293
2294 dwc->gadget.speed = USB_SPEED_UNKNOWN;
Felipe Balbidf62df52011-10-14 15:11:49 +03002295 dwc->setup_packet_pending = false;
Felipe Balbi06a374e2014-10-10 15:24:00 -05002296 usb_gadget_set_state(&dwc->gadget, USB_STATE_NOTATTACHED);
Felipe Balbi72246da2011-08-19 18:10:58 +03002297}
2298
Felipe Balbi72246da2011-08-19 18:10:58 +03002299static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
2300{
2301 u32 reg;
2302
Felipe Balbidf62df52011-10-14 15:11:49 +03002303 /*
2304 * WORKAROUND: DWC3 revisions <1.88a have an issue which
2305 * would cause a missing Disconnect Event if there's a
2306 * pending Setup Packet in the FIFO.
2307 *
2308 * There's no suggested workaround on the official Bug
2309 * report, which states that "unless the driver/application
2310 * is doing any special handling of a disconnect event,
2311 * there is no functional issue".
2312 *
2313 * Unfortunately, it turns out that we _do_ some special
2314 * handling of a disconnect event, namely complete all
2315 * pending transfers, notify gadget driver of the
2316 * disconnection, and so on.
2317 *
2318 * Our suggested workaround is to follow the Disconnect
2319 * Event steps here, instead, based on a setup_packet_pending
Felipe Balbib5d335e2015-11-16 16:20:34 -06002320 * flag. Such flag gets set whenever we have a SETUP_PENDING
2321 * status for EP0 TRBs and gets cleared on XferComplete for the
Felipe Balbidf62df52011-10-14 15:11:49 +03002322 * same endpoint.
2323 *
2324 * Refers to:
2325 *
2326 * STAR#9000466709: RTL: Device : Disconnect event not
2327 * generated if setup packet pending in FIFO
2328 */
2329 if (dwc->revision < DWC3_REVISION_188A) {
2330 if (dwc->setup_packet_pending)
2331 dwc3_gadget_disconnect_interrupt(dwc);
2332 }
2333
Felipe Balbi8e744752014-11-06 14:27:53 +08002334 dwc3_reset_gadget(dwc);
Felipe Balbi72246da2011-08-19 18:10:58 +03002335
2336 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2337 reg &= ~DWC3_DCTL_TSTCTRL_MASK;
2338 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
Gerard Cauvy3b637362012-02-10 12:21:18 +02002339 dwc->test_mode = false;
Felipe Balbi72246da2011-08-19 18:10:58 +03002340
2341 dwc3_stop_active_transfers(dwc);
2342 dwc3_clear_stall_all_ep(dwc);
2343
2344 /* Reset device address to zero */
2345 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2346 reg &= ~(DWC3_DCFG_DEVADDR_MASK);
2347 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
Felipe Balbi72246da2011-08-19 18:10:58 +03002348}
2349
2350static void dwc3_update_ram_clk_sel(struct dwc3 *dwc, u32 speed)
2351{
2352 u32 reg;
2353 u32 usb30_clock = DWC3_GCTL_CLK_BUS;
2354
2355 /*
2356 * We change the clock only at SS but I dunno why I would want to do
2357 * this. Maybe it becomes part of the power saving plan.
2358 */
2359
John Younee5cd412016-02-05 17:08:45 -08002360 if ((speed != DWC3_DSTS_SUPERSPEED) &&
2361 (speed != DWC3_DSTS_SUPERSPEED_PLUS))
Felipe Balbi72246da2011-08-19 18:10:58 +03002362 return;
2363
2364 /*
2365 * RAMClkSel is reset to 0 after USB reset, so it must be reprogrammed
2366 * each time on Connect Done.
2367 */
2368 if (!usb30_clock)
2369 return;
2370
2371 reg = dwc3_readl(dwc->regs, DWC3_GCTL);
2372 reg |= DWC3_GCTL_RAMCLKSEL(usb30_clock);
2373 dwc3_writel(dwc->regs, DWC3_GCTL, reg);
2374}
2375
Felipe Balbi72246da2011-08-19 18:10:58 +03002376static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
2377{
Felipe Balbi72246da2011-08-19 18:10:58 +03002378 struct dwc3_ep *dep;
2379 int ret;
2380 u32 reg;
2381 u8 speed;
2382
Felipe Balbi72246da2011-08-19 18:10:58 +03002383 reg = dwc3_readl(dwc->regs, DWC3_DSTS);
2384 speed = reg & DWC3_DSTS_CONNECTSPD;
2385 dwc->speed = speed;
2386
2387 dwc3_update_ram_clk_sel(dwc, speed);
2388
2389 switch (speed) {
John Youn75808622016-02-05 17:09:13 -08002390 case DWC3_DCFG_SUPERSPEED_PLUS:
2391 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
2392 dwc->gadget.ep0->maxpacket = 512;
2393 dwc->gadget.speed = USB_SPEED_SUPER_PLUS;
2394 break;
Felipe Balbi72246da2011-08-19 18:10:58 +03002395 case DWC3_DCFG_SUPERSPEED:
Felipe Balbi05870c5b2011-10-14 14:51:38 +03002396 /*
2397 * WORKAROUND: DWC3 revisions <1.90a have an issue which
2398 * would cause a missing USB3 Reset event.
2399 *
2400 * In such situations, we should force a USB3 Reset
2401 * event by calling our dwc3_gadget_reset_interrupt()
2402 * routine.
2403 *
2404 * Refers to:
2405 *
2406 * STAR#9000483510: RTL: SS : USB3 reset event may
2407 * not be generated always when the link enters poll
2408 */
2409 if (dwc->revision < DWC3_REVISION_190A)
2410 dwc3_gadget_reset_interrupt(dwc);
2411
Felipe Balbi72246da2011-08-19 18:10:58 +03002412 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
2413 dwc->gadget.ep0->maxpacket = 512;
2414 dwc->gadget.speed = USB_SPEED_SUPER;
2415 break;
2416 case DWC3_DCFG_HIGHSPEED:
2417 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(64);
2418 dwc->gadget.ep0->maxpacket = 64;
2419 dwc->gadget.speed = USB_SPEED_HIGH;
2420 break;
2421 case DWC3_DCFG_FULLSPEED2:
2422 case DWC3_DCFG_FULLSPEED1:
2423 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(64);
2424 dwc->gadget.ep0->maxpacket = 64;
2425 dwc->gadget.speed = USB_SPEED_FULL;
2426 break;
2427 case DWC3_DCFG_LOWSPEED:
2428 dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(8);
2429 dwc->gadget.ep0->maxpacket = 8;
2430 dwc->gadget.speed = USB_SPEED_LOW;
2431 break;
2432 }
2433
Pratyush Anand2b758352013-01-14 15:59:31 +05302434 /* Enable USB2 LPM Capability */
2435
John Younee5cd412016-02-05 17:08:45 -08002436 if ((dwc->revision > DWC3_REVISION_194A) &&
2437 (speed != DWC3_DCFG_SUPERSPEED) &&
2438 (speed != DWC3_DCFG_SUPERSPEED_PLUS)) {
Pratyush Anand2b758352013-01-14 15:59:31 +05302439 reg = dwc3_readl(dwc->regs, DWC3_DCFG);
2440 reg |= DWC3_DCFG_LPM_CAP;
2441 dwc3_writel(dwc->regs, DWC3_DCFG, reg);
2442
2443 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2444 reg &= ~(DWC3_DCTL_HIRD_THRES_MASK | DWC3_DCTL_L1_HIBER_EN);
2445
Huang Rui460d0982014-10-31 11:11:18 +08002446 reg |= DWC3_DCTL_HIRD_THRES(dwc->hird_threshold);
Pratyush Anand2b758352013-01-14 15:59:31 +05302447
Huang Rui80caf7d2014-10-28 19:54:26 +08002448 /*
2449 * When dwc3 revisions >= 2.40a, LPM Erratum is enabled and
2450 * DCFG.LPMCap is set, core responses with an ACK and the
2451 * BESL value in the LPM token is less than or equal to LPM
2452 * NYET threshold.
2453 */
2454 WARN_ONCE(dwc->revision < DWC3_REVISION_240A
2455 && dwc->has_lpm_erratum,
2456 "LPM Erratum not available on dwc3 revisisions < 2.40a\n");
2457
2458 if (dwc->has_lpm_erratum && dwc->revision >= DWC3_REVISION_240A)
2459 reg |= DWC3_DCTL_LPM_ERRATA(dwc->lpm_nyet_threshold);
2460
Pratyush Anand2b758352013-01-14 15:59:31 +05302461 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
Felipe Balbi356363b2013-12-19 16:37:05 -06002462 } else {
2463 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2464 reg &= ~DWC3_DCTL_HIRD_THRES_MASK;
2465 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
Pratyush Anand2b758352013-01-14 15:59:31 +05302466 }
2467
Felipe Balbi72246da2011-08-19 18:10:58 +03002468 dep = dwc->eps[0];
Paul Zimmerman265b70a2013-12-19 12:38:49 -06002469 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true,
2470 false);
Felipe Balbi72246da2011-08-19 18:10:58 +03002471 if (ret) {
2472 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2473 return;
2474 }
2475
2476 dep = dwc->eps[1];
Paul Zimmerman265b70a2013-12-19 12:38:49 -06002477 ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, true,
2478 false);
Felipe Balbi72246da2011-08-19 18:10:58 +03002479 if (ret) {
2480 dev_err(dwc->dev, "failed to enable %s\n", dep->name);
2481 return;
2482 }
2483
2484 /*
2485 * Configure PHY via GUSB3PIPECTLn if required.
2486 *
2487 * Update GTXFIFOSIZn
2488 *
2489 * In both cases reset values should be sufficient.
2490 */
2491}
2492
2493static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc)
2494{
Felipe Balbi72246da2011-08-19 18:10:58 +03002495 /*
2496 * TODO take core out of low power mode when that's
2497 * implemented.
2498 */
2499
Jiebing Liad14d4e2014-12-11 13:26:29 +08002500 if (dwc->gadget_driver && dwc->gadget_driver->resume) {
2501 spin_unlock(&dwc->lock);
2502 dwc->gadget_driver->resume(&dwc->gadget);
2503 spin_lock(&dwc->lock);
2504 }
Felipe Balbi72246da2011-08-19 18:10:58 +03002505}
2506
2507static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,
2508 unsigned int evtinfo)
2509{
Felipe Balbifae2b902011-10-14 13:00:30 +03002510 enum dwc3_link_state next = evtinfo & DWC3_LINK_STATE_MASK;
Felipe Balbi0b0cc1c2012-09-18 21:39:24 +03002511 unsigned int pwropt;
2512
2513 /*
2514 * WORKAROUND: DWC3 < 2.50a have an issue when configured without
2515 * Hibernation mode enabled which would show up when device detects
2516 * host-initiated U3 exit.
2517 *
2518 * In that case, device will generate a Link State Change Interrupt
2519 * from U3 to RESUME which is only necessary if Hibernation is
2520 * configured in.
2521 *
2522 * There are no functional changes due to such spurious event and we
2523 * just need to ignore it.
2524 *
2525 * Refers to:
2526 *
2527 * STAR#9000570034 RTL: SS Resume event generated in non-Hibernation
2528 * operational mode
2529 */
2530 pwropt = DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1);
2531 if ((dwc->revision < DWC3_REVISION_250A) &&
2532 (pwropt != DWC3_GHWPARAMS1_EN_PWROPT_HIB)) {
2533 if ((dwc->link_state == DWC3_LINK_STATE_U3) &&
2534 (next == DWC3_LINK_STATE_RESUME)) {
Felipe Balbi73815282015-01-27 13:48:14 -06002535 dwc3_trace(trace_dwc3_gadget,
2536 "ignoring transition U3 -> Resume");
Felipe Balbi0b0cc1c2012-09-18 21:39:24 +03002537 return;
2538 }
2539 }
Felipe Balbifae2b902011-10-14 13:00:30 +03002540
2541 /*
2542 * WORKAROUND: DWC3 Revisions <1.83a have an issue which, depending
2543 * on the link partner, the USB session might do multiple entry/exit
2544 * of low power states before a transfer takes place.
2545 *
2546 * Due to this problem, we might experience lower throughput. The
2547 * suggested workaround is to disable DCTL[12:9] bits if we're
2548 * transitioning from U1/U2 to U0 and enable those bits again
2549 * after a transfer completes and there are no pending transfers
2550 * on any of the enabled endpoints.
2551 *
2552 * This is the first half of that workaround.
2553 *
2554 * Refers to:
2555 *
2556 * STAR#9000446952: RTL: Device SS : if U1/U2 ->U0 takes >128us
2557 * core send LGO_Ux entering U0
2558 */
2559 if (dwc->revision < DWC3_REVISION_183A) {
2560 if (next == DWC3_LINK_STATE_U0) {
2561 u32 u1u2;
2562 u32 reg;
2563
2564 switch (dwc->link_state) {
2565 case DWC3_LINK_STATE_U1:
2566 case DWC3_LINK_STATE_U2:
2567 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
2568 u1u2 = reg & (DWC3_DCTL_INITU2ENA
2569 | DWC3_DCTL_ACCEPTU2ENA
2570 | DWC3_DCTL_INITU1ENA
2571 | DWC3_DCTL_ACCEPTU1ENA);
2572
2573 if (!dwc->u1u2)
2574 dwc->u1u2 = reg & u1u2;
2575
2576 reg &= ~u1u2;
2577
2578 dwc3_writel(dwc->regs, DWC3_DCTL, reg);
2579 break;
2580 default:
2581 /* do nothing */
2582 break;
2583 }
2584 }
2585 }
2586
Felipe Balbibc5ba2e2014-02-26 10:17:07 -06002587 switch (next) {
2588 case DWC3_LINK_STATE_U1:
2589 if (dwc->speed == USB_SPEED_SUPER)
2590 dwc3_suspend_gadget(dwc);
2591 break;
2592 case DWC3_LINK_STATE_U2:
2593 case DWC3_LINK_STATE_U3:
2594 dwc3_suspend_gadget(dwc);
2595 break;
2596 case DWC3_LINK_STATE_RESUME:
2597 dwc3_resume_gadget(dwc);
2598 break;
2599 default:
2600 /* do nothing */
2601 break;
2602 }
2603
Felipe Balbie57ebc12014-04-22 13:20:12 -05002604 dwc->link_state = next;
Felipe Balbi72246da2011-08-19 18:10:58 +03002605}
2606
Felipe Balbie1dadd32014-02-25 14:47:54 -06002607static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc,
2608 unsigned int evtinfo)
2609{
2610 unsigned int is_ss = evtinfo & BIT(4);
2611
2612 /**
2613 * WORKAROUND: DWC3 revison 2.20a with hibernation support
2614 * have a known issue which can cause USB CV TD.9.23 to fail
2615 * randomly.
2616 *
2617 * Because of this issue, core could generate bogus hibernation
2618 * events which SW needs to ignore.
2619 *
2620 * Refers to:
2621 *
2622 * STAR#9000546576: Device Mode Hibernation: Issue in USB 2.0
2623 * Device Fallback from SuperSpeed
2624 */
2625 if (is_ss ^ (dwc->speed == USB_SPEED_SUPER))
2626 return;
2627
2628 /* enter hibernation here */
2629}
2630
Felipe Balbi72246da2011-08-19 18:10:58 +03002631static void dwc3_gadget_interrupt(struct dwc3 *dwc,
2632 const struct dwc3_event_devt *event)
2633{
2634 switch (event->type) {
2635 case DWC3_DEVICE_EVENT_DISCONNECT:
2636 dwc3_gadget_disconnect_interrupt(dwc);
2637 break;
2638 case DWC3_DEVICE_EVENT_RESET:
2639 dwc3_gadget_reset_interrupt(dwc);
2640 break;
2641 case DWC3_DEVICE_EVENT_CONNECT_DONE:
2642 dwc3_gadget_conndone_interrupt(dwc);
2643 break;
2644 case DWC3_DEVICE_EVENT_WAKEUP:
2645 dwc3_gadget_wakeup_interrupt(dwc);
2646 break;
Felipe Balbie1dadd32014-02-25 14:47:54 -06002647 case DWC3_DEVICE_EVENT_HIBER_REQ:
2648 if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation,
2649 "unexpected hibernation event\n"))
2650 break;
2651
2652 dwc3_gadget_hibernation_interrupt(dwc, event->event_info);
2653 break;
Felipe Balbi72246da2011-08-19 18:10:58 +03002654 case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
2655 dwc3_gadget_linksts_change_interrupt(dwc, event->event_info);
2656 break;
2657 case DWC3_DEVICE_EVENT_EOPF:
Felipe Balbi73815282015-01-27 13:48:14 -06002658 dwc3_trace(trace_dwc3_gadget, "End of Periodic Frame");
Felipe Balbi72246da2011-08-19 18:10:58 +03002659 break;
2660 case DWC3_DEVICE_EVENT_SOF:
Felipe Balbi73815282015-01-27 13:48:14 -06002661 dwc3_trace(trace_dwc3_gadget, "Start of Periodic Frame");
Felipe Balbi72246da2011-08-19 18:10:58 +03002662 break;
2663 case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
Felipe Balbi73815282015-01-27 13:48:14 -06002664 dwc3_trace(trace_dwc3_gadget, "Erratic Error");
Felipe Balbi72246da2011-08-19 18:10:58 +03002665 break;
2666 case DWC3_DEVICE_EVENT_CMD_CMPL:
Felipe Balbi73815282015-01-27 13:48:14 -06002667 dwc3_trace(trace_dwc3_gadget, "Command Complete");
Felipe Balbi72246da2011-08-19 18:10:58 +03002668 break;
2669 case DWC3_DEVICE_EVENT_OVERFLOW:
Felipe Balbi73815282015-01-27 13:48:14 -06002670 dwc3_trace(trace_dwc3_gadget, "Overflow");
Felipe Balbi72246da2011-08-19 18:10:58 +03002671 break;
2672 default:
Felipe Balbie9f2aa82015-01-27 13:49:28 -06002673 dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type);
Felipe Balbi72246da2011-08-19 18:10:58 +03002674 }
2675}
2676
2677static void dwc3_process_event_entry(struct dwc3 *dwc,
2678 const union dwc3_event *event)
2679{
Felipe Balbi2c4cbe6e52014-04-30 17:45:10 -05002680 trace_dwc3_event(event->raw);
2681
Felipe Balbi72246da2011-08-19 18:10:58 +03002682 /* Endpoint IRQ, handle it and return early */
2683 if (event->type.is_devspec == 0) {
2684 /* depevt */
2685 return dwc3_endpoint_interrupt(dwc, &event->depevt);
2686 }
2687
2688 switch (event->type.type) {
2689 case DWC3_EVENT_TYPE_DEV:
2690 dwc3_gadget_interrupt(dwc, &event->devt);
2691 break;
2692 /* REVISIT what to do with Carkit and I2C events ? */
2693 default:
2694 dev_err(dwc->dev, "UNKNOWN IRQ type %d\n", event->raw);
2695 }
2696}
2697
Felipe Balbidea520a2016-03-30 09:39:34 +03002698static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt)
Felipe Balbif42f2442013-06-12 21:25:08 +03002699{
Felipe Balbidea520a2016-03-30 09:39:34 +03002700 struct dwc3 *dwc = evt->dwc;
Felipe Balbif42f2442013-06-12 21:25:08 +03002701 irqreturn_t ret = IRQ_NONE;
2702 int left;
2703 u32 reg;
2704
Felipe Balbif42f2442013-06-12 21:25:08 +03002705 left = evt->count;
2706
2707 if (!(evt->flags & DWC3_EVENT_PENDING))
2708 return IRQ_NONE;
2709
2710 while (left > 0) {
2711 union dwc3_event event;
2712
2713 event.raw = *(u32 *) (evt->buf + evt->lpos);
2714
2715 dwc3_process_event_entry(dwc, &event);
2716
2717 /*
2718 * FIXME we wrap around correctly to the next entry as
2719 * almost all entries are 4 bytes in size. There is one
2720 * entry which has 12 bytes which is a regular entry
2721 * followed by 8 bytes data. ATM I don't know how
2722 * things are organized if we get next to the a
2723 * boundary so I worry about that once we try to handle
2724 * that.
2725 */
2726 evt->lpos = (evt->lpos + 4) % DWC3_EVENT_BUFFERS_SIZE;
2727 left -= 4;
2728
Felipe Balbi660e9bd2016-03-30 09:26:24 +03002729 dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 4);
Felipe Balbif42f2442013-06-12 21:25:08 +03002730 }
2731
2732 evt->count = 0;
2733 evt->flags &= ~DWC3_EVENT_PENDING;
2734 ret = IRQ_HANDLED;
2735
2736 /* Unmask interrupt */
Felipe Balbi660e9bd2016-03-30 09:26:24 +03002737 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
Felipe Balbif42f2442013-06-12 21:25:08 +03002738 reg &= ~DWC3_GEVNTSIZ_INTMASK;
Felipe Balbi660e9bd2016-03-30 09:26:24 +03002739 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
Felipe Balbif42f2442013-06-12 21:25:08 +03002740
2741 return ret;
2742}
2743
Felipe Balbidea520a2016-03-30 09:39:34 +03002744static irqreturn_t dwc3_thread_interrupt(int irq, void *_evt)
Felipe Balbib15a7622011-06-30 16:57:15 +03002745{
Felipe Balbidea520a2016-03-30 09:39:34 +03002746 struct dwc3_event_buffer *evt = _evt;
2747 struct dwc3 *dwc = evt->dwc;
Felipe Balbie5f68b4a2015-10-12 13:25:44 -05002748 unsigned long flags;
Felipe Balbib15a7622011-06-30 16:57:15 +03002749 irqreturn_t ret = IRQ_NONE;
Felipe Balbib15a7622011-06-30 16:57:15 +03002750
Felipe Balbie5f68b4a2015-10-12 13:25:44 -05002751 spin_lock_irqsave(&dwc->lock, flags);
Felipe Balbidea520a2016-03-30 09:39:34 +03002752 ret = dwc3_process_event_buf(evt);
Felipe Balbie5f68b4a2015-10-12 13:25:44 -05002753 spin_unlock_irqrestore(&dwc->lock, flags);
Felipe Balbib15a7622011-06-30 16:57:15 +03002754
2755 return ret;
2756}
2757
Felipe Balbidea520a2016-03-30 09:39:34 +03002758static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
Felipe Balbi72246da2011-08-19 18:10:58 +03002759{
Felipe Balbidea520a2016-03-30 09:39:34 +03002760 struct dwc3 *dwc = evt->dwc;
Felipe Balbi72246da2011-08-19 18:10:58 +03002761 u32 count;
Felipe Balbie8adfc32013-06-12 21:11:14 +03002762 u32 reg;
Felipe Balbi72246da2011-08-19 18:10:58 +03002763
Felipe Balbi660e9bd2016-03-30 09:26:24 +03002764 count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(0));
Felipe Balbi72246da2011-08-19 18:10:58 +03002765 count &= DWC3_GEVNTCOUNT_MASK;
2766 if (!count)
2767 return IRQ_NONE;
2768
Felipe Balbib15a7622011-06-30 16:57:15 +03002769 evt->count = count;
2770 evt->flags |= DWC3_EVENT_PENDING;
Felipe Balbi72246da2011-08-19 18:10:58 +03002771
Felipe Balbie8adfc32013-06-12 21:11:14 +03002772 /* Mask interrupt */
Felipe Balbi660e9bd2016-03-30 09:26:24 +03002773 reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
Felipe Balbie8adfc32013-06-12 21:11:14 +03002774 reg |= DWC3_GEVNTSIZ_INTMASK;
Felipe Balbi660e9bd2016-03-30 09:26:24 +03002775 dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
Felipe Balbie8adfc32013-06-12 21:11:14 +03002776
Felipe Balbib15a7622011-06-30 16:57:15 +03002777 return IRQ_WAKE_THREAD;
Felipe Balbi72246da2011-08-19 18:10:58 +03002778}
2779
Felipe Balbidea520a2016-03-30 09:39:34 +03002780static irqreturn_t dwc3_interrupt(int irq, void *_evt)
Felipe Balbi72246da2011-08-19 18:10:58 +03002781{
Felipe Balbidea520a2016-03-30 09:39:34 +03002782 struct dwc3_event_buffer *evt = _evt;
Felipe Balbi72246da2011-08-19 18:10:58 +03002783
Felipe Balbidea520a2016-03-30 09:39:34 +03002784 return dwc3_check_event_buf(evt);
Felipe Balbi72246da2011-08-19 18:10:58 +03002785}
2786
2787/**
2788 * dwc3_gadget_init - Initializes gadget related registers
Paul Zimmerman1d046792012-02-15 18:56:56 -08002789 * @dwc: pointer to our controller context structure
Felipe Balbi72246da2011-08-19 18:10:58 +03002790 *
2791 * Returns 0 on success otherwise negative errno.
2792 */
Bill Pemberton41ac7b32012-11-19 13:21:48 -05002793int dwc3_gadget_init(struct dwc3 *dwc)
Felipe Balbi72246da2011-08-19 18:10:58 +03002794{
Felipe Balbi72246da2011-08-19 18:10:58 +03002795 int ret;
Felipe Balbi72246da2011-08-19 18:10:58 +03002796
2797 dwc->ctrl_req = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ctrl_req),
2798 &dwc->ctrl_req_addr, GFP_KERNEL);
2799 if (!dwc->ctrl_req) {
2800 dev_err(dwc->dev, "failed to allocate ctrl request\n");
2801 ret = -ENOMEM;
2802 goto err0;
2803 }
2804
Kishon Vijay Abraham I2abd9d52015-07-27 12:25:31 +05302805 dwc->ep0_trb = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ep0_trb) * 2,
Felipe Balbi72246da2011-08-19 18:10:58 +03002806 &dwc->ep0_trb_addr, GFP_KERNEL);
2807 if (!dwc->ep0_trb) {
2808 dev_err(dwc->dev, "failed to allocate ep0 trb\n");
2809 ret = -ENOMEM;
2810 goto err1;
2811 }
2812
Felipe Balbi3ef35fa2012-05-04 12:58:14 +03002813 dwc->setup_buf = kzalloc(DWC3_EP0_BOUNCE_SIZE, GFP_KERNEL);
Felipe Balbi72246da2011-08-19 18:10:58 +03002814 if (!dwc->setup_buf) {
Felipe Balbi72246da2011-08-19 18:10:58 +03002815 ret = -ENOMEM;
2816 goto err2;
2817 }
2818
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002819 dwc->ep0_bounce = dma_alloc_coherent(dwc->dev,
Felipe Balbi3ef35fa2012-05-04 12:58:14 +03002820 DWC3_EP0_BOUNCE_SIZE, &dwc->ep0_bounce_addr,
2821 GFP_KERNEL);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002822 if (!dwc->ep0_bounce) {
2823 dev_err(dwc->dev, "failed to allocate ep0 bounce buffer\n");
2824 ret = -ENOMEM;
2825 goto err3;
2826 }
2827
Felipe Balbi04c03d12015-12-02 10:06:45 -06002828 dwc->zlp_buf = kzalloc(DWC3_ZLP_BUF_SIZE, GFP_KERNEL);
2829 if (!dwc->zlp_buf) {
2830 ret = -ENOMEM;
2831 goto err4;
2832 }
2833
Felipe Balbi72246da2011-08-19 18:10:58 +03002834 dwc->gadget.ops = &dwc3_gadget_ops;
Felipe Balbi72246da2011-08-19 18:10:58 +03002835 dwc->gadget.speed = USB_SPEED_UNKNOWN;
Felipe Balbieeb720f2011-11-28 12:46:59 +02002836 dwc->gadget.sg_supported = true;
Felipe Balbi72246da2011-08-19 18:10:58 +03002837 dwc->gadget.name = "dwc3-gadget";
Jianqiang Tang6a4290c2016-01-20 14:09:39 +08002838 dwc->gadget.is_otg = dwc->dr_mode == USB_DR_MODE_OTG;
Felipe Balbi72246da2011-08-19 18:10:58 +03002839
2840 /*
Ben McCauleyb9e51b22015-11-16 10:47:24 -06002841 * FIXME We might be setting max_speed to <SUPER, however versions
2842 * <2.20a of dwc3 have an issue with metastability (documented
2843 * elsewhere in this driver) which tells us we can't set max speed to
2844 * anything lower than SUPER.
2845 *
2846 * Because gadget.max_speed is only used by composite.c and function
2847 * drivers (i.e. it won't go into dwc3's registers) we are allowing this
2848 * to happen so we avoid sending SuperSpeed Capability descriptor
2849 * together with our BOS descriptor as that could confuse host into
2850 * thinking we can handle super speed.
2851 *
2852 * Note that, in fact, we won't even support GetBOS requests when speed
2853 * is less than super speed because we don't have means, yet, to tell
2854 * composite.c that we are USB 2.0 + LPM ECN.
2855 */
2856 if (dwc->revision < DWC3_REVISION_220A)
2857 dwc3_trace(trace_dwc3_gadget,
2858 "Changing max_speed on rev %08x\n",
2859 dwc->revision);
2860
2861 dwc->gadget.max_speed = dwc->maximum_speed;
2862
2863 /*
David Cohena4b9d942013-12-09 15:55:38 -08002864 * Per databook, DWC3 needs buffer size to be aligned to MaxPacketSize
2865 * on ep out.
2866 */
2867 dwc->gadget.quirk_ep_out_aligned_size = true;
2868
2869 /*
Felipe Balbi72246da2011-08-19 18:10:58 +03002870 * REVISIT: Here we should clear all pending IRQs to be
2871 * sure we're starting from a well known location.
2872 */
2873
2874 ret = dwc3_gadget_init_endpoints(dwc);
2875 if (ret)
Felipe Balbi04c03d12015-12-02 10:06:45 -06002876 goto err5;
Felipe Balbi72246da2011-08-19 18:10:58 +03002877
Felipe Balbi72246da2011-08-19 18:10:58 +03002878 ret = usb_add_gadget_udc(dwc->dev, &dwc->gadget);
2879 if (ret) {
2880 dev_err(dwc->dev, "failed to register udc\n");
Felipe Balbi04c03d12015-12-02 10:06:45 -06002881 goto err5;
Felipe Balbi72246da2011-08-19 18:10:58 +03002882 }
2883
2884 return 0;
2885
Felipe Balbi04c03d12015-12-02 10:06:45 -06002886err5:
2887 kfree(dwc->zlp_buf);
2888
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002889err4:
David Cohene1f80462013-09-11 17:42:47 -07002890 dwc3_gadget_free_endpoints(dwc);
Felipe Balbi3ef35fa2012-05-04 12:58:14 +03002891 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE,
2892 dwc->ep0_bounce, dwc->ep0_bounce_addr);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002893
Felipe Balbi72246da2011-08-19 18:10:58 +03002894err3:
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02002895 kfree(dwc->setup_buf);
Felipe Balbi72246da2011-08-19 18:10:58 +03002896
2897err2:
2898 dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb),
2899 dwc->ep0_trb, dwc->ep0_trb_addr);
2900
2901err1:
2902 dma_free_coherent(dwc->dev, sizeof(*dwc->ctrl_req),
2903 dwc->ctrl_req, dwc->ctrl_req_addr);
2904
2905err0:
2906 return ret;
2907}
2908
Felipe Balbi7415f172012-04-30 14:56:33 +03002909/* -------------------------------------------------------------------------- */
2910
Felipe Balbi72246da2011-08-19 18:10:58 +03002911void dwc3_gadget_exit(struct dwc3 *dwc)
2912{
Felipe Balbi72246da2011-08-19 18:10:58 +03002913 usb_del_gadget_udc(&dwc->gadget);
Felipe Balbi72246da2011-08-19 18:10:58 +03002914
Felipe Balbi72246da2011-08-19 18:10:58 +03002915 dwc3_gadget_free_endpoints(dwc);
2916
Felipe Balbi3ef35fa2012-05-04 12:58:14 +03002917 dma_free_coherent(dwc->dev, DWC3_EP0_BOUNCE_SIZE,
2918 dwc->ep0_bounce, dwc->ep0_bounce_addr);
Felipe Balbi5812b1c2011-08-27 22:07:53 +03002919
Felipe Balbi0fc9a1b2011-12-19 11:32:34 +02002920 kfree(dwc->setup_buf);
Felipe Balbi04c03d12015-12-02 10:06:45 -06002921 kfree(dwc->zlp_buf);
Felipe Balbi72246da2011-08-19 18:10:58 +03002922
2923 dma_free_coherent(dwc->dev, sizeof(*dwc->ep0_trb),
2924 dwc->ep0_trb, dwc->ep0_trb_addr);
2925
2926 dma_free_coherent(dwc->dev, sizeof(*dwc->ctrl_req),
2927 dwc->ctrl_req, dwc->ctrl_req_addr);
Felipe Balbi72246da2011-08-19 18:10:58 +03002928}
Felipe Balbi7415f172012-04-30 14:56:33 +03002929
Felipe Balbi0b0231a2014-10-07 10:19:23 -05002930int dwc3_gadget_suspend(struct dwc3 *dwc)
Felipe Balbi7415f172012-04-30 14:56:33 +03002931{
Felipe Balbi9f8a67b2016-05-04 15:50:27 +03002932 int ret;
2933
Roger Quadros9772b472016-04-12 11:33:29 +03002934 if (!dwc->gadget_driver)
2935 return 0;
2936
Felipe Balbi9f8a67b2016-05-04 15:50:27 +03002937 ret = dwc3_gadget_run_stop(dwc, false, false);
2938 if (ret < 0)
2939 return ret;
Felipe Balbi7415f172012-04-30 14:56:33 +03002940
Felipe Balbi9f8a67b2016-05-04 15:50:27 +03002941 dwc3_disconnect_gadget(dwc);
2942 __dwc3_gadget_stop(dwc);
Felipe Balbi7415f172012-04-30 14:56:33 +03002943
2944 return 0;
2945}
2946
2947int dwc3_gadget_resume(struct dwc3 *dwc)
2948{
Felipe Balbi7415f172012-04-30 14:56:33 +03002949 int ret;
2950
Roger Quadros9772b472016-04-12 11:33:29 +03002951 if (!dwc->gadget_driver)
2952 return 0;
2953
Felipe Balbi9f8a67b2016-05-04 15:50:27 +03002954 ret = __dwc3_gadget_start(dwc);
2955 if (ret < 0)
Felipe Balbi7415f172012-04-30 14:56:33 +03002956 goto err0;
2957
Felipe Balbi9f8a67b2016-05-04 15:50:27 +03002958 ret = dwc3_gadget_run_stop(dwc, true, false);
2959 if (ret < 0)
Felipe Balbi7415f172012-04-30 14:56:33 +03002960 goto err1;
2961
Felipe Balbi7415f172012-04-30 14:56:33 +03002962 return 0;
2963
2964err1:
Felipe Balbi9f8a67b2016-05-04 15:50:27 +03002965 __dwc3_gadget_stop(dwc);
Felipe Balbi7415f172012-04-30 14:56:33 +03002966
2967err0:
2968 return ret;
2969}