[ramips] DWC otg usb: compilation fixes and trivial bugfix in slave mode
[openwrt/svn-archive/archive.git] / target / linux / ramips / files / drivers / usb / dwc_otg / dwc_otg_hcd.c
1 /* ==========================================================================
2 * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.c $
3 * $Revision: 1.4 $
4 * $Date: 2008-11-21 05:39:15 $
5 * $Change: 1064940 $
6 *
7 * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
8 * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
9 * otherwise expressly agreed to in writing between Synopsys and you.
10 *
11 * The Software IS NOT an item of Licensed Software or Licensed Product under
12 * any End User Software License Agreement or Agreement for Licensed Product
13 * with Synopsys or any supplement thereto. You are permitted to use and
14 * redistribute this Software in source and binary forms, with or without
15 * modification, provided that redistributions of source code must retain this
16 * notice. You may not view, use, disclose, copy or distribute this file or
17 * any information contained herein except pursuant to this license grant from
18 * Synopsys. If you do not agree with this notice, including the disclaimer
19 * below, then you are not authorized to use the Software.
20 *
21 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 * DAMAGE.
32 * ========================================================================== */
33 #ifndef DWC_DEVICE_ONLY
34
35 /**
36 * @file
37 *
38 * This file contains the implementation of the HCD. In Linux, the HCD
39 * implements the hc_driver API.
40 */
41 #include <linux/kernel.h>
42 #include <linux/module.h>
43 #include <linux/moduleparam.h>
44 #include <linux/init.h>
45 #include <linux/device.h>
46 #include <linux/errno.h>
47 #include <linux/list.h>
48 #include <linux/interrupt.h>
49 #include <linux/string.h>
50 #include <linux/dma-mapping.h>
51 #include <linux/version.h>
52
53 #include "dwc_otg_driver.h"
54 #include "dwc_otg_hcd.h"
55 #include "dwc_otg_regs.h"
56
57 static const char dwc_otg_hcd_name[] = "dwc_otg";
58
59 static const struct hc_driver dwc_otg_hc_driver = {
60
61 .description = dwc_otg_hcd_name,
62 .product_desc = "DWC OTG Controller",
63 .hcd_priv_size = sizeof(dwc_otg_hcd_t),
64
65 .irq = dwc_otg_hcd_irq,
66
67 .flags = HCD_MEMORY | HCD_USB2,
68
69 //.reset =
70 .start = dwc_otg_hcd_start,
71 //.suspend =
72 //.resume =
73 .stop = dwc_otg_hcd_stop,
74
75 .urb_enqueue = dwc_otg_hcd_urb_enqueue,
76 .urb_dequeue = dwc_otg_hcd_urb_dequeue,
77 .endpoint_disable = dwc_otg_hcd_endpoint_disable,
78
79 .get_frame_number = dwc_otg_hcd_get_frame_number,
80
81 .hub_status_data = dwc_otg_hcd_hub_status_data,
82 .hub_control = dwc_otg_hcd_hub_control,
83 //.hub_suspend =
84 //.hub_resume =
85 };
86
87 /**
88 * Work queue function for starting the HCD when A-Cable is connected.
89 * The dwc_otg_hcd_start() must be called in a process context.
90 */
91 static void hcd_start_func(
92 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
93 void *_vp
94 #else
95 struct work_struct *_work
96 #endif
97 )
98 {
99 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
100 struct usb_hcd *usb_hcd = (struct usb_hcd *)_vp;
101 #else
102 struct delayed_work *dw = container_of(_work, struct delayed_work, work);
103 struct dwc_otg_hcd *otg_hcd = container_of(dw, struct dwc_otg_hcd, start_work);
104 struct usb_hcd *usb_hcd = container_of((void *)otg_hcd, struct usb_hcd, hcd_priv);
105 #endif
106 DWC_DEBUGPL(DBG_HCDV, "%s() %p\n", __func__, usb_hcd);
107 if (usb_hcd) {
108 dwc_otg_hcd_start(usb_hcd);
109 }
110 }
111
112 /**
113 * HCD Callback function for starting the HCD when A-Cable is
114 * connected.
115 *
116 * @param p void pointer to the <code>struct usb_hcd</code>
117 */
118 static int32_t dwc_otg_hcd_start_cb(void *p)
119 {
120 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(p);
121 dwc_otg_core_if_t *core_if = dwc_otg_hcd->core_if;
122 hprt0_data_t hprt0;
123
124 if (core_if->op_state == B_HOST) {
125 /*
126 * Reset the port. During a HNP mode switch the reset
127 * needs to occur within 1ms and have a duration of at
128 * least 50ms.
129 */
130 hprt0.d32 = dwc_otg_read_hprt0(core_if);
131 hprt0.b.prtrst = 1;
132 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
133 ((struct usb_hcd *)p)->self.is_b_host = 1;
134 } else {
135 ((struct usb_hcd *)p)->self.is_b_host = 0;
136 }
137
138 /* Need to start the HCD in a non-interrupt context. */
139 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
140 INIT_WORK(&dwc_otg_hcd->start_work, hcd_start_func, p);
141 // INIT_DELAYED_WORK(&dwc_otg_hcd->start_work, hcd_start_func, p);
142 #else
143 // INIT_WORK(&dwc_otg_hcd->start_work, hcd_start_func);
144 INIT_DELAYED_WORK(&dwc_otg_hcd->start_work, hcd_start_func);
145 #endif
146 // schedule_work(&dwc_otg_hcd->start_work);
147 queue_delayed_work(core_if->wq_otg, &dwc_otg_hcd->start_work, 50 * HZ / 1000);
148
149 return 1;
150 }
151
152 /**
153 * HCD Callback function for stopping the HCD.
154 *
155 * @param p void pointer to the <code>struct usb_hcd</code>
156 */
157 static int32_t dwc_otg_hcd_stop_cb(void *p)
158 {
159 struct usb_hcd *usb_hcd = (struct usb_hcd *)p;
160 DWC_DEBUGPL(DBG_HCDV, "%s(%p)\n", __func__, p);
161 dwc_otg_hcd_stop(usb_hcd);
162 return 1;
163 }
164
165 static void del_xfer_timers(dwc_otg_hcd_t *hcd)
166 {
167 #ifdef DEBUG
168 int i;
169 int num_channels = hcd->core_if->core_params->host_channels;
170 for (i = 0; i < num_channels; i++) {
171 del_timer(&hcd->core_if->hc_xfer_timer[i]);
172 }
173 #endif
174 }
175
176 static void del_timers(dwc_otg_hcd_t *hcd)
177 {
178 del_xfer_timers(hcd);
179 del_timer(&hcd->conn_timer);
180 }
181
182 /**
183 * Processes all the URBs in a single list of QHs. Completes them with
184 * -ETIMEDOUT and frees the QTD.
185 */
186 static void kill_urbs_in_qh_list(dwc_otg_hcd_t *hcd, struct list_head *qh_list)
187 {
188 struct list_head *qh_item;
189 dwc_otg_qh_t *qh;
190 struct list_head *qtd_item;
191 dwc_otg_qtd_t *qtd;
192
193 list_for_each(qh_item, qh_list) {
194 qh = list_entry(qh_item, dwc_otg_qh_t, qh_list_entry);
195 for (qtd_item = qh->qtd_list.next;
196 qtd_item != &qh->qtd_list;
197 qtd_item = qh->qtd_list.next) {
198 qtd = list_entry(qtd_item, dwc_otg_qtd_t, qtd_list_entry);
199 if (qtd->urb != NULL) {
200 dwc_otg_hcd_complete_urb(hcd, qtd->urb,
201 -ETIMEDOUT);
202 }
203 dwc_otg_hcd_qtd_remove_and_free(hcd, qtd);
204 }
205 }
206 }
207
208 /**
209 * Responds with an error status of ETIMEDOUT to all URBs in the non-periodic
210 * and periodic schedules. The QTD associated with each URB is removed from
211 * the schedule and freed. This function may be called when a disconnect is
212 * detected or when the HCD is being stopped.
213 */
214 static void kill_all_urbs(dwc_otg_hcd_t *hcd)
215 {
216 kill_urbs_in_qh_list(hcd, &hcd->non_periodic_sched_inactive);
217 kill_urbs_in_qh_list(hcd, &hcd->non_periodic_sched_active);
218 kill_urbs_in_qh_list(hcd, &hcd->periodic_sched_inactive);
219 kill_urbs_in_qh_list(hcd, &hcd->periodic_sched_ready);
220 kill_urbs_in_qh_list(hcd, &hcd->periodic_sched_assigned);
221 kill_urbs_in_qh_list(hcd, &hcd->periodic_sched_queued);
222 }
223
224 /**
225 * HCD Callback function for disconnect of the HCD.
226 *
227 * @param p void pointer to the <code>struct usb_hcd</code>
228 */
229 static int32_t dwc_otg_hcd_disconnect_cb(void *p)
230 {
231 gintsts_data_t intr;
232 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(p);
233
234 //DWC_DEBUGPL(DBG_HCDV, "%s(%p)\n", __func__, p);
235
236 /*
237 * Set status flags for the hub driver.
238 */
239 dwc_otg_hcd->flags.b.port_connect_status_change = 1;
240 dwc_otg_hcd->flags.b.port_connect_status = 0;
241
242 /*
243 * Shutdown any transfers in process by clearing the Tx FIFO Empty
244 * interrupt mask and status bits and disabling subsequent host
245 * channel interrupts.
246 */
247 intr.d32 = 0;
248 intr.b.nptxfempty = 1;
249 intr.b.ptxfempty = 1;
250 intr.b.hcintr = 1;
251 dwc_modify_reg32(&dwc_otg_hcd->core_if->core_global_regs->gintmsk, intr.d32, 0);
252 dwc_modify_reg32(&dwc_otg_hcd->core_if->core_global_regs->gintsts, intr.d32, 0);
253
254 del_timers(dwc_otg_hcd);
255
256 /*
257 * Turn off the vbus power only if the core has transitioned to device
258 * mode. If still in host mode, need to keep power on to detect a
259 * reconnection.
260 */
261 if (dwc_otg_is_device_mode(dwc_otg_hcd->core_if)) {
262 if (dwc_otg_hcd->core_if->op_state != A_SUSPEND) {
263 hprt0_data_t hprt0 = { .d32=0 };
264 DWC_PRINT("Disconnect: PortPower off\n");
265 hprt0.b.prtpwr = 0;
266 dwc_write_reg32(dwc_otg_hcd->core_if->host_if->hprt0, hprt0.d32);
267 }
268
269 dwc_otg_disable_host_interrupts(dwc_otg_hcd->core_if);
270 }
271
272 /* Respond with an error status to all URBs in the schedule. */
273 kill_all_urbs(dwc_otg_hcd);
274
275 if (dwc_otg_is_host_mode(dwc_otg_hcd->core_if)) {
276 /* Clean up any host channels that were in use. */
277 int num_channels;
278 int i;
279 dwc_hc_t *channel;
280 dwc_otg_hc_regs_t *hc_regs;
281 hcchar_data_t hcchar;
282
283 num_channels = dwc_otg_hcd->core_if->core_params->host_channels;
284
285 if (!dwc_otg_hcd->core_if->dma_enable) {
286 /* Flush out any channel requests in slave mode. */
287 for (i = 0; i < num_channels; i++) {
288 channel = dwc_otg_hcd->hc_ptr_array[i];
289 if (list_empty(&channel->hc_list_entry)) {
290 hc_regs = dwc_otg_hcd->core_if->host_if->hc_regs[i];
291 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
292 if (hcchar.b.chen) {
293 hcchar.b.chen = 0;
294 hcchar.b.chdis = 1;
295 hcchar.b.epdir = 0;
296 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
297 }
298 }
299 }
300 }
301
302 for (i = 0; i < num_channels; i++) {
303 channel = dwc_otg_hcd->hc_ptr_array[i];
304 if (list_empty(&channel->hc_list_entry)) {
305 hc_regs = dwc_otg_hcd->core_if->host_if->hc_regs[i];
306 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
307 if (hcchar.b.chen) {
308 /* Halt the channel. */
309 hcchar.b.chdis = 1;
310 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
311 }
312
313 dwc_otg_hc_cleanup(dwc_otg_hcd->core_if, channel);
314 list_add_tail(&channel->hc_list_entry,
315 &dwc_otg_hcd->free_hc_list);
316 }
317 }
318 }
319
320 /* A disconnect will end the session so the B-Device is no
321 * longer a B-host. */
322 ((struct usb_hcd *)p)->self.is_b_host = 0;
323 return 1;
324 }
325
326 /**
327 * Connection timeout function. An OTG host is required to display a
328 * message if the device does not connect within 10 seconds.
329 */
330 void dwc_otg_hcd_connect_timeout(unsigned long ptr)
331 {
332 DWC_DEBUGPL(DBG_HCDV, "%s(%x)\n", __func__, (int)ptr);
333 DWC_PRINT("Connect Timeout\n");
334 DWC_ERROR("Device Not Connected/Responding\n");
335 }
336
337 /**
338 * Start the connection timer. An OTG host is required to display a
339 * message if the device does not connect within 10 seconds. The
340 * timer is deleted if a port connect interrupt occurs before the
341 * timer expires.
342 */
343 static void dwc_otg_hcd_start_connect_timer(dwc_otg_hcd_t *hcd)
344 {
345 init_timer(&hcd->conn_timer);
346 hcd->conn_timer.function = dwc_otg_hcd_connect_timeout;
347 hcd->conn_timer.data = 0;
348 hcd->conn_timer.expires = jiffies + (HZ * 10);
349 add_timer(&hcd->conn_timer);
350 }
351
352 /**
353 * HCD Callback function for disconnect of the HCD.
354 *
355 * @param p void pointer to the <code>struct usb_hcd</code>
356 */
357 static int32_t dwc_otg_hcd_session_start_cb(void *p)
358 {
359 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(p);
360 DWC_DEBUGPL(DBG_HCDV, "%s(%p)\n", __func__, p);
361 dwc_otg_hcd_start_connect_timer(dwc_otg_hcd);
362 return 1;
363 }
364
365 /**
366 * HCD Callback structure for handling mode switching.
367 */
368 static dwc_otg_cil_callbacks_t hcd_cil_callbacks = {
369 .start = dwc_otg_hcd_start_cb,
370 .stop = dwc_otg_hcd_stop_cb,
371 .disconnect = dwc_otg_hcd_disconnect_cb,
372 .session_start = dwc_otg_hcd_session_start_cb,
373 .p = 0,
374 };
375
376 /**
377 * Reset tasklet function
378 */
379 static void reset_tasklet_func(unsigned long data)
380 {
381 dwc_otg_hcd_t *dwc_otg_hcd = (dwc_otg_hcd_t *)data;
382 dwc_otg_core_if_t *core_if = dwc_otg_hcd->core_if;
383 hprt0_data_t hprt0;
384
385 DWC_DEBUGPL(DBG_HCDV, "USB RESET tasklet called\n");
386
387 hprt0.d32 = dwc_otg_read_hprt0(core_if);
388 hprt0.b.prtrst = 1;
389 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
390 mdelay(60);
391
392 hprt0.b.prtrst = 0;
393 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
394 dwc_otg_hcd->flags.b.port_reset_change = 1;
395 }
396
397 static struct tasklet_struct reset_tasklet = {
398 .next = NULL,
399 .state = 0,
400 .count = ATOMIC_INIT(0),
401 .func = reset_tasklet_func,
402 .data = 0,
403 };
404
405 /**
406 * Initializes the HCD. This function allocates memory for and initializes the
407 * static parts of the usb_hcd and dwc_otg_hcd structures. It also registers the
408 * USB bus with the core and calls the hc_driver->start() function. It returns
409 * a negative error on failure.
410 */
411 int dwc_otg_hcd_init(struct device *dev)
412 {
413 dwc_otg_device_t *otg_dev = dev_get_drvdata(dev);
414 struct usb_hcd *hcd = NULL;
415 dwc_otg_hcd_t *dwc_otg_hcd = NULL;
416
417 int num_channels;
418 int i;
419 dwc_hc_t *channel;
420
421 int retval = 0;
422
423 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD INIT\n");
424
425 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
426 /* 2.6.20+ requires dev.dma_mask to be set prior to calling usb_create_hcd() */
427
428 /* Set device flags indicating whether the HCD supports DMA. */
429 if (otg_dev->core_if->dma_enable) {
430 DWC_PRINT("Using DMA mode\n");
431 dev->dma_mask = (void *)~0;
432 dev->coherent_dma_mask = ~0;
433
434 if (otg_dev->core_if->dma_desc_enable) {
435 DWC_PRINT("Device using Descriptor DMA mode\n");
436 } else {
437 DWC_PRINT("Device using Buffer DMA mode\n");
438 }
439 } else {
440 DWC_PRINT("Using Slave mode\n");
441 dev->dma_mask = (void *)0;
442 dev->coherent_dma_mask = 0;
443 }
444 #endif
445 /*
446 * Allocate memory for the base HCD plus the DWC OTG HCD.
447 * Initialize the base HCD.
448 */
449 hcd = usb_create_hcd(&dwc_otg_hc_driver, dev, dev_name(dev));
450 if (!hcd) {
451 retval = -ENOMEM;
452 goto error1;
453 }
454
455 dev_set_drvdata(dev, otg_dev);
456 hcd->regs = otg_dev->base;
457 hcd->rsrc_start = otg_dev->phys_addr;
458 hcd->rsrc_len = otg_dev->base_len;
459 hcd->self.otg_port = 1;
460 hcd->has_tt = 1;
461
462 /* Initialize the DWC OTG HCD. */
463 dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
464 dwc_otg_hcd->core_if = otg_dev->core_if;
465 otg_dev->hcd = dwc_otg_hcd;
466
467 /* */
468 spin_lock_init(&dwc_otg_hcd->lock);
469
470 /* Register the HCD CIL Callbacks */
471 dwc_otg_cil_register_hcd_callbacks(otg_dev->core_if,
472 &hcd_cil_callbacks, hcd);
473
474 /* Initialize the non-periodic schedule. */
475 INIT_LIST_HEAD(&dwc_otg_hcd->non_periodic_sched_inactive);
476 INIT_LIST_HEAD(&dwc_otg_hcd->non_periodic_sched_active);
477
478 /* Initialize the periodic schedule. */
479 INIT_LIST_HEAD(&dwc_otg_hcd->periodic_sched_inactive);
480 INIT_LIST_HEAD(&dwc_otg_hcd->periodic_sched_ready);
481 INIT_LIST_HEAD(&dwc_otg_hcd->periodic_sched_assigned);
482 INIT_LIST_HEAD(&dwc_otg_hcd->periodic_sched_queued);
483
484 /*
485 * Create a host channel descriptor for each host channel implemented
486 * in the controller. Initialize the channel descriptor array.
487 */
488 INIT_LIST_HEAD(&dwc_otg_hcd->free_hc_list);
489 num_channels = dwc_otg_hcd->core_if->core_params->host_channels;
490 memset(dwc_otg_hcd->hc_ptr_array, 0, sizeof(dwc_otg_hcd->hc_ptr_array));
491 for (i = 0; i < num_channels; i++) {
492 channel = kmalloc(sizeof(dwc_hc_t), GFP_KERNEL);
493 if (channel == NULL) {
494 retval = -ENOMEM;
495 DWC_ERROR("%s: host channel allocation failed\n", __func__);
496 goto error2;
497 }
498 memset(channel, 0, sizeof(dwc_hc_t));
499 channel->hc_num = i;
500 dwc_otg_hcd->hc_ptr_array[i] = channel;
501 #ifdef DEBUG
502 init_timer(&dwc_otg_hcd->core_if->hc_xfer_timer[i]);
503 #endif
504 DWC_DEBUGPL(DBG_HCDV, "HCD Added channel #%d, hc=%p\n", i, channel);
505 }
506
507 /* Initialize the Connection timeout timer. */
508 init_timer(&dwc_otg_hcd->conn_timer);
509
510 /* Initialize reset tasklet. */
511 reset_tasklet.data = (unsigned long) dwc_otg_hcd;
512 dwc_otg_hcd->reset_tasklet = &reset_tasklet;
513
514 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
515 /* Set device flags indicating whether the HCD supports DMA. */
516 if (otg_dev->core_if->dma_enable) {
517 DWC_PRINT("Using DMA mode\n");
518 dev->dma_mask = (void *)~0;
519 dev->coherent_dma_mask = ~0;
520
521 if (otg_dev->core_if->dma_desc_enable){
522 DWC_PRINT("Device using Descriptor DMA mode\n");
523 } else {
524 DWC_PRINT("Device using Buffer DMA mode\n");
525 }
526 } else {
527 DWC_PRINT("Using Slave mode\n");
528 dev->dma_mask = (void *)0;
529 dev->dev.coherent_dma_mask = 0;
530 }
531 #endif
532 /*
533 * Finish generic HCD initialization and start the HCD. This function
534 * allocates the DMA buffer pool, registers the USB bus, requests the
535 * IRQ line, and calls dwc_otg_hcd_start method.
536 */
537 retval = usb_add_hcd(hcd, otg_dev->irq, IRQF_SHARED);
538 if (retval < 0) {
539 goto error2;
540 }
541
542 /*
543 * Allocate space for storing data on status transactions. Normally no
544 * data is sent, but this space acts as a bit bucket. This must be
545 * done after usb_add_hcd since that function allocates the DMA buffer
546 * pool.
547 */
548 if (otg_dev->core_if->dma_enable) {
549 dwc_otg_hcd->status_buf =
550 dma_alloc_coherent(dev,
551 DWC_OTG_HCD_STATUS_BUF_SIZE,
552 &dwc_otg_hcd->status_buf_dma,
553 GFP_KERNEL | GFP_DMA);
554 } else {
555 dwc_otg_hcd->status_buf = kmalloc(DWC_OTG_HCD_STATUS_BUF_SIZE,
556 GFP_KERNEL);
557 }
558 if (!dwc_otg_hcd->status_buf) {
559 retval = -ENOMEM;
560 DWC_ERROR("%s: status_buf allocation failed\n", __func__);
561 goto error3;
562 }
563
564 dwc_otg_hcd->otg_dev = otg_dev;
565
566 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD Initialized HCD, bus=%s, usbbus=%d\n",
567 dev_name(dev), hcd->self.busnum);
568
569 return 0;
570
571 /* Error conditions */
572 error3:
573 usb_remove_hcd(hcd);
574 error2:
575 dwc_otg_hcd_free(hcd);
576 usb_put_hcd(hcd);
577
578 /* FIXME: 2008/05/03 by Steven
579 * write back to device:
580 * dwc_otg_hcd has already been released by dwc_otg_hcd_free()
581 */
582 dev_set_drvdata(dev, otg_dev);
583
584 error1:
585 return retval;
586 }
587
588 /**
589 * Removes the HCD.
590 * Frees memory and resources associated with the HCD and deregisters the bus.
591 */
592 void dwc_otg_hcd_remove(struct device *dev)
593 {
594 dwc_otg_device_t *otg_dev = dev_get_drvdata(dev);
595 dwc_otg_hcd_t *dwc_otg_hcd;
596 struct usb_hcd *hcd;
597
598 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD REMOVE\n");
599
600 if (!otg_dev) {
601 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev NULL!\n", __func__);
602 return;
603 }
604
605 dwc_otg_hcd = otg_dev->hcd;
606
607 if (!dwc_otg_hcd) {
608 DWC_DEBUGPL(DBG_ANY, "%s: otg_dev->hcd NULL!\n", __func__);
609 return;
610 }
611
612 hcd = dwc_otg_hcd_to_hcd(dwc_otg_hcd);
613
614 if (!hcd) {
615 DWC_DEBUGPL(DBG_ANY, "%s: dwc_otg_hcd_to_hcd(dwc_otg_hcd) NULL!\n", __func__);
616 return;
617 }
618
619 /* Turn off all interrupts */
620 dwc_write_reg32(&dwc_otg_hcd->core_if->core_global_regs->gintmsk, 0);
621 dwc_modify_reg32(&dwc_otg_hcd->core_if->core_global_regs->gahbcfg, 1, 0);
622
623 usb_remove_hcd(hcd);
624 dwc_otg_hcd_free(hcd);
625 usb_put_hcd(hcd);
626 }
627
628 /* =========================================================================
629 * Linux HC Driver Functions
630 * ========================================================================= */
631
632 /**
633 * Initializes dynamic portions of the DWC_otg HCD state.
634 */
635 static void hcd_reinit(dwc_otg_hcd_t *hcd)
636 {
637 struct list_head *item;
638 int num_channels;
639 int i;
640 dwc_hc_t *channel;
641
642 hcd->flags.d32 = 0;
643
644 hcd->non_periodic_qh_ptr = &hcd->non_periodic_sched_active;
645 hcd->non_periodic_channels = 0;
646 hcd->periodic_channels = 0;
647
648 /*
649 * Put all channels in the free channel list and clean up channel
650 * states.
651 */
652 item = hcd->free_hc_list.next;
653 while (item != &hcd->free_hc_list) {
654 list_del(item);
655 item = hcd->free_hc_list.next;
656 }
657 num_channels = hcd->core_if->core_params->host_channels;
658 for (i = 0; i < num_channels; i++) {
659 channel = hcd->hc_ptr_array[i];
660 list_add_tail(&channel->hc_list_entry, &hcd->free_hc_list);
661 dwc_otg_hc_cleanup(hcd->core_if, channel);
662 }
663
664 /* Initialize the DWC core for host mode operation. */
665 dwc_otg_core_host_init(hcd->core_if);
666 }
667
668 /** Initializes the DWC_otg controller and its root hub and prepares it for host
669 * mode operation. Activates the root port. Returns 0 on success and a negative
670 * error code on failure. */
671 int dwc_otg_hcd_start(struct usb_hcd *hcd)
672 {
673 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
674 dwc_otg_core_if_t *core_if = dwc_otg_hcd->core_if;
675 struct usb_bus *bus;
676
677 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
678 struct usb_device *udev;
679 int retval;
680 #endif
681
682 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD START\n");
683
684 bus = hcd_to_bus(hcd);
685
686 /* Initialize the bus state. If the core is in Device Mode
687 * HALT the USB bus and return. */
688 if (dwc_otg_is_device_mode(core_if)) {
689 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
690 hcd->state = HC_STATE_HALT;
691 #else
692 hcd->state = HC_STATE_RUNNING;
693 #endif
694 return 0;
695 }
696 hcd->state = HC_STATE_RUNNING;
697
698 /* Initialize and connect root hub if one is not already attached */
699 if (bus->root_hub) {
700 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD Has Root Hub\n");
701 /* Inform the HUB driver to resume. */
702 usb_hcd_resume_root_hub(hcd);
703 }
704 else {
705 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD Does Not Have Root Hub\n");
706
707 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
708 udev = usb_alloc_dev(NULL, bus, 0);
709 udev->speed = USB_SPEED_HIGH;
710 if (!udev) {
711 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD Error udev alloc\n");
712 return -ENODEV;
713 }
714 if ((retval = usb_hcd_register_root_hub(udev, hcd)) != 0) {
715 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD Error registering %d\n", retval);
716 return -ENODEV;
717 }
718 #endif
719 }
720
721 hcd_reinit(dwc_otg_hcd);
722
723 return 0;
724 }
725
726 static void qh_list_free(dwc_otg_hcd_t *hcd, struct list_head *qh_list)
727 {
728 struct list_head *item;
729 dwc_otg_qh_t *qh;
730
731 if (!qh_list->next) {
732 /* The list hasn't been initialized yet. */
733 return;
734 }
735
736 /* Ensure there are no QTDs or URBs left. */
737 kill_urbs_in_qh_list(hcd, qh_list);
738
739 for (item = qh_list->next; item != qh_list; item = qh_list->next) {
740 qh = list_entry(item, dwc_otg_qh_t, qh_list_entry);
741 dwc_otg_hcd_qh_remove_and_free(hcd, qh);
742 }
743 }
744
745 /**
746 * Halts the DWC_otg host mode operations in a clean manner. USB transfers are
747 * stopped.
748 */
749 void dwc_otg_hcd_stop(struct usb_hcd *hcd)
750 {
751 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
752 hprt0_data_t hprt0 = { .d32=0 };
753
754 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD STOP\n");
755
756 /* Turn off all host-specific interrupts. */
757 dwc_otg_disable_host_interrupts(dwc_otg_hcd->core_if);
758
759 /*
760 * The root hub should be disconnected before this function is called.
761 * The disconnect will clear the QTD lists (via ..._hcd_urb_dequeue)
762 * and the QH lists (via ..._hcd_endpoint_disable).
763 */
764
765 /* Turn off the vbus power */
766 DWC_PRINT("PortPower off\n");
767 hprt0.b.prtpwr = 0;
768 dwc_write_reg32(dwc_otg_hcd->core_if->host_if->hprt0, hprt0.d32);
769 }
770
771 /** Returns the current frame number. */
772 int dwc_otg_hcd_get_frame_number(struct usb_hcd *hcd)
773 {
774 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
775 hfnum_data_t hfnum;
776
777 hfnum.d32 = dwc_read_reg32(&dwc_otg_hcd->core_if->
778 host_if->host_global_regs->hfnum);
779
780 #ifdef DEBUG_SOF
781 DWC_DEBUGPL(DBG_HCDV, "DWC OTG HCD GET FRAME NUMBER %d\n", hfnum.b.frnum);
782 #endif
783 return hfnum.b.frnum;
784 }
785
786 /**
787 * Frees secondary storage associated with the dwc_otg_hcd structure contained
788 * in the struct usb_hcd field.
789 */
790 void dwc_otg_hcd_free(struct usb_hcd *hcd)
791 {
792 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
793 int i;
794
795 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD FREE\n");
796
797 del_timers(dwc_otg_hcd);
798
799 /* Free memory for QH/QTD lists */
800 qh_list_free(dwc_otg_hcd, &dwc_otg_hcd->non_periodic_sched_inactive);
801 qh_list_free(dwc_otg_hcd, &dwc_otg_hcd->non_periodic_sched_active);
802 qh_list_free(dwc_otg_hcd, &dwc_otg_hcd->periodic_sched_inactive);
803 qh_list_free(dwc_otg_hcd, &dwc_otg_hcd->periodic_sched_ready);
804 qh_list_free(dwc_otg_hcd, &dwc_otg_hcd->periodic_sched_assigned);
805 qh_list_free(dwc_otg_hcd, &dwc_otg_hcd->periodic_sched_queued);
806
807 /* Free memory for the host channels. */
808 for (i = 0; i < MAX_EPS_CHANNELS; i++) {
809 dwc_hc_t *hc = dwc_otg_hcd->hc_ptr_array[i];
810 if (hc != NULL) {
811 DWC_DEBUGPL(DBG_HCDV, "HCD Free channel #%i, hc=%p\n", i, hc);
812 kfree(hc);
813 }
814 }
815
816 if (dwc_otg_hcd->core_if->dma_enable) {
817 if (dwc_otg_hcd->status_buf_dma) {
818 dma_free_coherent(hcd->self.controller,
819 DWC_OTG_HCD_STATUS_BUF_SIZE,
820 dwc_otg_hcd->status_buf,
821 dwc_otg_hcd->status_buf_dma);
822 }
823 } else if (dwc_otg_hcd->status_buf != NULL) {
824 kfree(dwc_otg_hcd->status_buf);
825 }
826 }
827
828 #ifdef DEBUG
829 static void dump_urb_info(struct urb *urb, char* fn_name)
830 {
831 DWC_PRINT("%s, urb %p\n", fn_name, urb);
832 DWC_PRINT(" Device address: %d\n", usb_pipedevice(urb->pipe));
833 DWC_PRINT(" Endpoint: %d, %s\n", usb_pipeendpoint(urb->pipe),
834 (usb_pipein(urb->pipe) ? "IN" : "OUT"));
835 DWC_PRINT(" Endpoint type: %s\n",
836 ({char *pipetype;
837 switch (usb_pipetype(urb->pipe)) {
838 case PIPE_CONTROL: pipetype = "CONTROL"; break;
839 case PIPE_BULK: pipetype = "BULK"; break;
840 case PIPE_INTERRUPT: pipetype = "INTERRUPT"; break;
841 case PIPE_ISOCHRONOUS: pipetype = "ISOCHRONOUS"; break;
842 default: pipetype = "UNKNOWN"; break;
843 }; pipetype;}));
844 DWC_PRINT(" Speed: %s\n",
845 ({char *speed;
846 switch (urb->dev->speed) {
847 case USB_SPEED_HIGH: speed = "HIGH"; break;
848 case USB_SPEED_FULL: speed = "FULL"; break;
849 case USB_SPEED_LOW: speed = "LOW"; break;
850 default: speed = "UNKNOWN"; break;
851 }; speed;}));
852 DWC_PRINT(" Max packet size: %d\n",
853 usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe)));
854 DWC_PRINT(" Data buffer length: %d\n", urb->transfer_buffer_length);
855 DWC_PRINT(" Transfer buffer: %p, Transfer DMA: %p\n",
856 urb->transfer_buffer, (void *)urb->transfer_dma);
857 DWC_PRINT(" Setup buffer: %p, Setup DMA: %p\n",
858 urb->setup_packet, (void *)urb->setup_dma);
859 DWC_PRINT(" Interval: %d\n", urb->interval);
860 if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
861 int i;
862 for (i = 0; i < urb->number_of_packets; i++) {
863 DWC_PRINT(" ISO Desc %d:\n", i);
864 DWC_PRINT(" offset: %d, length %d\n",
865 urb->iso_frame_desc[i].offset,
866 urb->iso_frame_desc[i].length);
867 }
868 }
869 }
870
871 static void dump_channel_info(dwc_otg_hcd_t *hcd,
872 dwc_otg_qh_t *qh)
873 {
874 if (qh->channel != NULL) {
875 dwc_hc_t *hc = qh->channel;
876 struct list_head *item;
877 dwc_otg_qh_t *qh_item;
878 int num_channels = hcd->core_if->core_params->host_channels;
879 int i;
880
881 dwc_otg_hc_regs_t *hc_regs;
882 hcchar_data_t hcchar;
883 hcsplt_data_t hcsplt;
884 hctsiz_data_t hctsiz;
885 uint32_t hcdma;
886
887 hc_regs = hcd->core_if->host_if->hc_regs[hc->hc_num];
888 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
889 hcsplt.d32 = dwc_read_reg32(&hc_regs->hcsplt);
890 hctsiz.d32 = dwc_read_reg32(&hc_regs->hctsiz);
891 hcdma = dwc_read_reg32(&hc_regs->hcdma);
892
893 DWC_PRINT(" Assigned to channel %p:\n", hc);
894 DWC_PRINT(" hcchar 0x%08x, hcsplt 0x%08x\n", hcchar.d32, hcsplt.d32);
895 DWC_PRINT(" hctsiz 0x%08x, hcdma 0x%08x\n", hctsiz.d32, hcdma);
896 DWC_PRINT(" dev_addr: %d, ep_num: %d, ep_is_in: %d\n",
897 hc->dev_addr, hc->ep_num, hc->ep_is_in);
898 DWC_PRINT(" ep_type: %d\n", hc->ep_type);
899 DWC_PRINT(" max_packet: %d\n", hc->max_packet);
900 DWC_PRINT(" data_pid_start: %d\n", hc->data_pid_start);
901 DWC_PRINT(" xfer_started: %d\n", hc->xfer_started);
902 DWC_PRINT(" halt_status: %d\n", hc->halt_status);
903 DWC_PRINT(" xfer_buff: %p\n", hc->xfer_buff);
904 DWC_PRINT(" xfer_len: %d\n", hc->xfer_len);
905 DWC_PRINT(" qh: %p\n", hc->qh);
906 DWC_PRINT(" NP inactive sched:\n");
907 list_for_each(item, &hcd->non_periodic_sched_inactive) {
908 qh_item = list_entry(item, dwc_otg_qh_t, qh_list_entry);
909 DWC_PRINT(" %p\n", qh_item);
910 }
911 DWC_PRINT(" NP active sched:\n");
912 list_for_each(item, &hcd->non_periodic_sched_active) {
913 qh_item = list_entry(item, dwc_otg_qh_t, qh_list_entry);
914 DWC_PRINT(" %p\n", qh_item);
915 }
916 DWC_PRINT(" Channels: \n");
917 for (i = 0; i < num_channels; i++) {
918 dwc_hc_t *hc = hcd->hc_ptr_array[i];
919 DWC_PRINT(" %2d: %p\n", i, hc);
920 }
921 }
922 }
923 #endif
924
925 /** Starts processing a USB transfer request specified by a USB Request Block
926 * (URB). mem_flags indicates the type of memory allocation to use while
927 * processing this URB. */
928 int dwc_otg_hcd_urb_enqueue(struct usb_hcd *hcd,
929 struct urb *urb,
930 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
931 int mem_flags
932 #else
933 gfp_t mem_flags
934 #endif
935 )
936 {
937 int retval = 0;
938 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
939 dwc_otg_qtd_t *qtd;
940
941 #ifdef DEBUG
942 if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) {
943 dump_urb_info(urb, "dwc_otg_hcd_urb_enqueue");
944 }
945 #endif
946 if (!dwc_otg_hcd->flags.b.port_connect_status) {
947 /* No longer connected. */
948 return -ENODEV;
949 }
950
951 qtd = dwc_otg_hcd_qtd_create(urb);
952 if (qtd == NULL) {
953 DWC_ERROR("DWC OTG HCD URB Enqueue failed creating QTD\n");
954 return -ENOMEM;
955 }
956
957 retval = dwc_otg_hcd_qtd_add(qtd, dwc_otg_hcd);
958 if (retval < 0) {
959 DWC_ERROR("DWC OTG HCD URB Enqueue failed adding QTD. "
960 "Error status %d\n", retval);
961 dwc_otg_hcd_qtd_free(qtd);
962 }
963
964 return retval;
965 }
966
967 /** Aborts/cancels a USB transfer request. Always returns 0 to indicate
968 * success. */
969 int dwc_otg_hcd_urb_dequeue(struct usb_hcd *hcd,
970 struct urb *urb,
971 int status)
972 {
973 unsigned long flags;
974 dwc_otg_hcd_t *dwc_otg_hcd;
975 dwc_otg_qtd_t *urb_qtd;
976 dwc_otg_qh_t *qh;
977 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
978 struct usb_host_endpoint *ep = dwc_urb_to_endpoint(urb);
979 #endif
980
981 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD URB Dequeue\n");
982
983 dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
984
985 SPIN_LOCK_IRQSAVE(&dwc_otg_hcd->lock, flags);
986
987 urb_qtd = (dwc_otg_qtd_t *)urb->hcpriv;
988 qh = (dwc_otg_qh_t *)ep->hcpriv;
989
990 #ifdef DEBUG
991 if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) {
992 dump_urb_info(urb, "dwc_otg_hcd_urb_dequeue");
993 if (urb_qtd == qh->qtd_in_process) {
994 dump_channel_info(dwc_otg_hcd, qh);
995 }
996 }
997 #endif
998
999 if (urb_qtd == qh->qtd_in_process) {
1000 /* The QTD is in process (it has been assigned to a channel). */
1001
1002 if (dwc_otg_hcd->flags.b.port_connect_status) {
1003 /*
1004 * If still connected (i.e. in host mode), halt the
1005 * channel so it can be used for other transfers. If
1006 * no longer connected, the host registers can't be
1007 * written to halt the channel since the core is in
1008 * device mode.
1009 */
1010 dwc_otg_hc_halt(dwc_otg_hcd->core_if, qh->channel,
1011 DWC_OTG_HC_XFER_URB_DEQUEUE);
1012 }
1013 }
1014
1015 /*
1016 * Free the QTD and clean up the associated QH. Leave the QH in the
1017 * schedule if it has any remaining QTDs.
1018 */
1019 dwc_otg_hcd_qtd_remove_and_free(dwc_otg_hcd, urb_qtd);
1020 if (urb_qtd == qh->qtd_in_process) {
1021 dwc_otg_hcd_qh_deactivate(dwc_otg_hcd, qh, 0);
1022 qh->channel = NULL;
1023 qh->qtd_in_process = NULL;
1024 } else if (list_empty(&qh->qtd_list)) {
1025 dwc_otg_hcd_qh_remove(dwc_otg_hcd, qh);
1026 }
1027
1028 SPIN_UNLOCK_IRQRESTORE(&dwc_otg_hcd->lock, flags);
1029
1030 urb->hcpriv = NULL;
1031
1032 /* Higher layer software sets URB status. */
1033 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1034 usb_hcd_giveback_urb(hcd, urb, status);
1035 #else
1036 usb_hcd_giveback_urb(hcd, urb, NULL);
1037 #endif
1038 if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) {
1039 DWC_PRINT("Called usb_hcd_giveback_urb()\n");
1040 DWC_PRINT(" urb->status = %d\n", urb->status);
1041 }
1042
1043 return 0;
1044 }
1045
1046 /** Frees resources in the DWC_otg controller related to a given endpoint. Also
1047 * clears state in the HCD related to the endpoint. Any URBs for the endpoint
1048 * must already be dequeued. */
1049 void dwc_otg_hcd_endpoint_disable(struct usb_hcd *hcd,
1050 struct usb_host_endpoint *ep)
1051 {
1052 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
1053 dwc_otg_qh_t *qh;
1054
1055 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1056 unsigned long flags;
1057 int retry = 0;
1058 #endif
1059
1060 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD EP DISABLE: _bEndpointAddress=0x%02x, "
1061 "endpoint=%d\n", ep->desc.bEndpointAddress,
1062 dwc_ep_addr_to_endpoint(ep->desc.bEndpointAddress));
1063
1064 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
1065 rescan:
1066 SPIN_LOCK_IRQSAVE(&dwc_otg_hcd->lock, flags);
1067 qh = (dwc_otg_qh_t *)(ep->hcpriv);
1068 if (!qh)
1069 goto done;
1070
1071 /** Check that the QTD list is really empty */
1072 if (!list_empty(&qh->qtd_list)) {
1073 if (retry++ < 250) {
1074 SPIN_UNLOCK_IRQRESTORE(&dwc_otg_hcd->lock, flags);
1075 schedule_timeout_uninterruptible(1);
1076 goto rescan;
1077 }
1078
1079 DWC_WARN("DWC OTG HCD EP DISABLE:"
1080 " QTD List for this endpoint is not empty\n");
1081 }
1082
1083 dwc_otg_hcd_qh_remove_and_free(dwc_otg_hcd, qh);
1084 ep->hcpriv = NULL;
1085 done:
1086 SPIN_UNLOCK_IRQRESTORE(&dwc_otg_hcd->lock, flags);
1087
1088 #else // LINUX_VERSION_CODE
1089
1090 qh = (dwc_otg_qh_t *)(ep->hcpriv);
1091 if (qh != NULL) {
1092 #ifdef DEBUG
1093 /** Check that the QTD list is really empty */
1094 if (!list_empty(&qh->qtd_list)) {
1095 DWC_WARN("DWC OTG HCD EP DISABLE:"
1096 " QTD List for this endpoint is not empty\n");
1097 }
1098 #endif
1099 dwc_otg_hcd_qh_remove_and_free(dwc_otg_hcd, qh);
1100 ep->hcpriv = NULL;
1101 }
1102 #endif // LINUX_VERSION_CODE
1103 }
1104
1105 /** Handles host mode interrupts for the DWC_otg controller. Returns IRQ_NONE if
1106 * there was no interrupt to handle. Returns IRQ_HANDLED if there was a valid
1107 * interrupt.
1108 *
1109 * This function is called by the USB core when an interrupt occurs */
1110 irqreturn_t dwc_otg_hcd_irq(struct usb_hcd *hcd
1111 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
1112 , struct pt_regs *regs
1113 #endif
1114 )
1115 {
1116 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
1117 return IRQ_RETVAL(dwc_otg_hcd_handle_intr(dwc_otg_hcd));
1118 }
1119
1120 /** Creates Status Change bitmap for the root hub and root port. The bitmap is
1121 * returned in buf. Bit 0 is the status change indicator for the root hub. Bit 1
1122 * is the status change indicator for the single root port. Returns 1 if either
1123 * change indicator is 1, otherwise returns 0. */
1124 int dwc_otg_hcd_hub_status_data(struct usb_hcd *hcd, char *buf)
1125 {
1126 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
1127
1128 buf[0] = 0;
1129 buf[0] |= (dwc_otg_hcd->flags.b.port_connect_status_change ||
1130 dwc_otg_hcd->flags.b.port_reset_change ||
1131 dwc_otg_hcd->flags.b.port_enable_change ||
1132 dwc_otg_hcd->flags.b.port_suspend_change ||
1133 dwc_otg_hcd->flags.b.port_over_current_change) << 1;
1134
1135 #ifdef DEBUG
1136 if (buf[0]) {
1137 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB STATUS DATA:"
1138 " Root port status changed\n");
1139 DWC_DEBUGPL(DBG_HCDV, " port_connect_status_change: %d\n",
1140 dwc_otg_hcd->flags.b.port_connect_status_change);
1141 DWC_DEBUGPL(DBG_HCDV, " port_reset_change: %d\n",
1142 dwc_otg_hcd->flags.b.port_reset_change);
1143 DWC_DEBUGPL(DBG_HCDV, " port_enable_change: %d\n",
1144 dwc_otg_hcd->flags.b.port_enable_change);
1145 DWC_DEBUGPL(DBG_HCDV, " port_suspend_change: %d\n",
1146 dwc_otg_hcd->flags.b.port_suspend_change);
1147 DWC_DEBUGPL(DBG_HCDV, " port_over_current_change: %d\n",
1148 dwc_otg_hcd->flags.b.port_over_current_change);
1149 }
1150 #endif
1151 return (buf[0] != 0);
1152 }
1153
1154 #ifdef DWC_HS_ELECT_TST
1155 /*
1156 * Quick and dirty hack to implement the HS Electrical Test
1157 * SINGLE_STEP_GET_DEVICE_DESCRIPTOR feature.
1158 *
1159 * This code was copied from our userspace app "hset". It sends a
1160 * Get Device Descriptor control sequence in two parts, first the
1161 * Setup packet by itself, followed some time later by the In and
1162 * Ack packets. Rather than trying to figure out how to add this
1163 * functionality to the normal driver code, we just hijack the
1164 * hardware, using these two function to drive the hardware
1165 * directly.
1166 */
1167
1168 dwc_otg_core_global_regs_t *global_regs;
1169 dwc_otg_host_global_regs_t *hc_global_regs;
1170 dwc_otg_hc_regs_t *hc_regs;
1171 uint32_t *data_fifo;
1172
1173 static void do_setup(void)
1174 {
1175 gintsts_data_t gintsts;
1176 hctsiz_data_t hctsiz;
1177 hcchar_data_t hcchar;
1178 haint_data_t haint;
1179 hcint_data_t hcint;
1180
1181 /* Enable HAINTs */
1182 dwc_write_reg32(&hc_global_regs->haintmsk, 0x0001);
1183
1184 /* Enable HCINTs */
1185 dwc_write_reg32(&hc_regs->hcintmsk, 0x04a3);
1186
1187 /* Read GINTSTS */
1188 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1189 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1190
1191 /* Read HAINT */
1192 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1193 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1194
1195 /* Read HCINT */
1196 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1197 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1198
1199 /* Read HCCHAR */
1200 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1201 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1202
1203 /* Clear HCINT */
1204 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1205
1206 /* Clear HAINT */
1207 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1208
1209 /* Clear GINTSTS */
1210 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1211
1212 /* Read GINTSTS */
1213 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1214 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1215
1216 /*
1217 * Send Setup packet (Get Device Descriptor)
1218 */
1219
1220 /* Make sure channel is disabled */
1221 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1222 if (hcchar.b.chen) {
1223 //fprintf(stderr, "Channel already enabled 1, HCCHAR = %08x\n", hcchar.d32);
1224 hcchar.b.chdis = 1;
1225 // hcchar.b.chen = 1;
1226 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1227 //sleep(1);
1228 mdelay(1000);
1229
1230 /* Read GINTSTS */
1231 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1232 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1233
1234 /* Read HAINT */
1235 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1236 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1237
1238 /* Read HCINT */
1239 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1240 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1241
1242 /* Read HCCHAR */
1243 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1244 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1245
1246 /* Clear HCINT */
1247 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1248
1249 /* Clear HAINT */
1250 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1251
1252 /* Clear GINTSTS */
1253 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1254
1255 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1256 //if (hcchar.b.chen) {
1257 // fprintf(stderr, "** Channel _still_ enabled 1, HCCHAR = %08x **\n", hcchar.d32);
1258 //}
1259 }
1260
1261 /* Set HCTSIZ */
1262 hctsiz.d32 = 0;
1263 hctsiz.b.xfersize = 8;
1264 hctsiz.b.pktcnt = 1;
1265 hctsiz.b.pid = DWC_OTG_HC_PID_SETUP;
1266 dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32);
1267
1268 /* Set HCCHAR */
1269 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1270 hcchar.b.eptype = DWC_OTG_EP_TYPE_CONTROL;
1271 hcchar.b.epdir = 0;
1272 hcchar.b.epnum = 0;
1273 hcchar.b.mps = 8;
1274 hcchar.b.chen = 1;
1275 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1276
1277 /* Fill FIFO with Setup data for Get Device Descriptor */
1278 data_fifo = (uint32_t *)((char *)global_regs + 0x1000);
1279 dwc_write_reg32(data_fifo++, 0x01000680);
1280 dwc_write_reg32(data_fifo++, 0x00080000);
1281
1282 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1283 //fprintf(stderr, "Waiting for HCINTR intr 1, GINTSTS = %08x\n", gintsts.d32);
1284
1285 /* Wait for host channel interrupt */
1286 do {
1287 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1288 } while (gintsts.b.hcintr == 0);
1289
1290 //fprintf(stderr, "Got HCINTR intr 1, GINTSTS = %08x\n", gintsts.d32);
1291
1292 /* Disable HCINTs */
1293 dwc_write_reg32(&hc_regs->hcintmsk, 0x0000);
1294
1295 /* Disable HAINTs */
1296 dwc_write_reg32(&hc_global_regs->haintmsk, 0x0000);
1297
1298 /* Read HAINT */
1299 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1300 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1301
1302 /* Read HCINT */
1303 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1304 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1305
1306 /* Read HCCHAR */
1307 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1308 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1309
1310 /* Clear HCINT */
1311 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1312
1313 /* Clear HAINT */
1314 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1315
1316 /* Clear GINTSTS */
1317 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1318
1319 /* Read GINTSTS */
1320 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1321 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1322 }
1323
1324 static void do_in_ack(void)
1325 {
1326 gintsts_data_t gintsts;
1327 hctsiz_data_t hctsiz;
1328 hcchar_data_t hcchar;
1329 haint_data_t haint;
1330 hcint_data_t hcint;
1331 host_grxsts_data_t grxsts;
1332
1333 /* Enable HAINTs */
1334 dwc_write_reg32(&hc_global_regs->haintmsk, 0x0001);
1335
1336 /* Enable HCINTs */
1337 dwc_write_reg32(&hc_regs->hcintmsk, 0x04a3);
1338
1339 /* Read GINTSTS */
1340 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1341 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1342
1343 /* Read HAINT */
1344 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1345 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1346
1347 /* Read HCINT */
1348 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1349 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1350
1351 /* Read HCCHAR */
1352 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1353 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1354
1355 /* Clear HCINT */
1356 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1357
1358 /* Clear HAINT */
1359 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1360
1361 /* Clear GINTSTS */
1362 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1363
1364 /* Read GINTSTS */
1365 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1366 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1367
1368 /*
1369 * Receive Control In packet
1370 */
1371
1372 /* Make sure channel is disabled */
1373 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1374 if (hcchar.b.chen) {
1375 //fprintf(stderr, "Channel already enabled 2, HCCHAR = %08x\n", hcchar.d32);
1376 hcchar.b.chdis = 1;
1377 hcchar.b.chen = 1;
1378 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1379 //sleep(1);
1380 mdelay(1000);
1381
1382 /* Read GINTSTS */
1383 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1384 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1385
1386 /* Read HAINT */
1387 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1388 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1389
1390 /* Read HCINT */
1391 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1392 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1393
1394 /* Read HCCHAR */
1395 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1396 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1397
1398 /* Clear HCINT */
1399 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1400
1401 /* Clear HAINT */
1402 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1403
1404 /* Clear GINTSTS */
1405 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1406
1407 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1408 //if (hcchar.b.chen) {
1409 // fprintf(stderr, "** Channel _still_ enabled 2, HCCHAR = %08x **\n", hcchar.d32);
1410 //}
1411 }
1412
1413 /* Set HCTSIZ */
1414 hctsiz.d32 = 0;
1415 hctsiz.b.xfersize = 8;
1416 hctsiz.b.pktcnt = 1;
1417 hctsiz.b.pid = DWC_OTG_HC_PID_DATA1;
1418 dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32);
1419
1420 /* Set HCCHAR */
1421 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1422 hcchar.b.eptype = DWC_OTG_EP_TYPE_CONTROL;
1423 hcchar.b.epdir = 1;
1424 hcchar.b.epnum = 0;
1425 hcchar.b.mps = 8;
1426 hcchar.b.chen = 1;
1427 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1428
1429 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1430 //fprintf(stderr, "Waiting for RXSTSQLVL intr 1, GINTSTS = %08x\n", gintsts.d32);
1431
1432 /* Wait for receive status queue interrupt */
1433 do {
1434 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1435 } while (gintsts.b.rxstsqlvl == 0);
1436
1437 //fprintf(stderr, "Got RXSTSQLVL intr 1, GINTSTS = %08x\n", gintsts.d32);
1438
1439 /* Read RXSTS */
1440 grxsts.d32 = dwc_read_reg32(&global_regs->grxstsp);
1441 //fprintf(stderr, "GRXSTS: %08x\n", grxsts.d32);
1442
1443 /* Clear RXSTSQLVL in GINTSTS */
1444 gintsts.d32 = 0;
1445 gintsts.b.rxstsqlvl = 1;
1446 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1447
1448 switch (grxsts.b.pktsts) {
1449 case DWC_GRXSTS_PKTSTS_IN:
1450 /* Read the data into the host buffer */
1451 if (grxsts.b.bcnt > 0) {
1452 int i;
1453 int word_count = (grxsts.b.bcnt + 3) / 4;
1454
1455 data_fifo = (uint32_t *)((char *)global_regs + 0x1000);
1456
1457 for (i = 0; i < word_count; i++) {
1458 (void)dwc_read_reg32(data_fifo++);
1459 }
1460 }
1461
1462 //fprintf(stderr, "Received %u bytes\n", (unsigned)grxsts.b.bcnt);
1463 break;
1464
1465 default:
1466 //fprintf(stderr, "** Unexpected GRXSTS packet status 1 **\n");
1467 break;
1468 }
1469
1470 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1471 //fprintf(stderr, "Waiting for RXSTSQLVL intr 2, GINTSTS = %08x\n", gintsts.d32);
1472
1473 /* Wait for receive status queue interrupt */
1474 do {
1475 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1476 } while (gintsts.b.rxstsqlvl == 0);
1477
1478 //fprintf(stderr, "Got RXSTSQLVL intr 2, GINTSTS = %08x\n", gintsts.d32);
1479
1480 /* Read RXSTS */
1481 grxsts.d32 = dwc_read_reg32(&global_regs->grxstsp);
1482 //fprintf(stderr, "GRXSTS: %08x\n", grxsts.d32);
1483
1484 /* Clear RXSTSQLVL in GINTSTS */
1485 gintsts.d32 = 0;
1486 gintsts.b.rxstsqlvl = 1;
1487 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1488
1489 switch (grxsts.b.pktsts) {
1490 case DWC_GRXSTS_PKTSTS_IN_XFER_COMP:
1491 break;
1492
1493 default:
1494 //fprintf(stderr, "** Unexpected GRXSTS packet status 2 **\n");
1495 break;
1496 }
1497
1498 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1499 //fprintf(stderr, "Waiting for HCINTR intr 2, GINTSTS = %08x\n", gintsts.d32);
1500
1501 /* Wait for host channel interrupt */
1502 do {
1503 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1504 } while (gintsts.b.hcintr == 0);
1505
1506 //fprintf(stderr, "Got HCINTR intr 2, GINTSTS = %08x\n", gintsts.d32);
1507
1508 /* Read HAINT */
1509 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1510 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1511
1512 /* Read HCINT */
1513 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1514 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1515
1516 /* Read HCCHAR */
1517 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1518 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1519
1520 /* Clear HCINT */
1521 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1522
1523 /* Clear HAINT */
1524 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1525
1526 /* Clear GINTSTS */
1527 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1528
1529 /* Read GINTSTS */
1530 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1531 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1532
1533 // usleep(100000);
1534 // mdelay(100);
1535 mdelay(1);
1536
1537 /*
1538 * Send handshake packet
1539 */
1540
1541 /* Read HAINT */
1542 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1543 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1544
1545 /* Read HCINT */
1546 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1547 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1548
1549 /* Read HCCHAR */
1550 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1551 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1552
1553 /* Clear HCINT */
1554 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1555
1556 /* Clear HAINT */
1557 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1558
1559 /* Clear GINTSTS */
1560 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1561
1562 /* Read GINTSTS */
1563 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1564 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1565
1566 /* Make sure channel is disabled */
1567 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1568 if (hcchar.b.chen) {
1569 //fprintf(stderr, "Channel already enabled 3, HCCHAR = %08x\n", hcchar.d32);
1570 hcchar.b.chdis = 1;
1571 hcchar.b.chen = 1;
1572 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1573 //sleep(1);
1574 mdelay(1000);
1575
1576 /* Read GINTSTS */
1577 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1578 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1579
1580 /* Read HAINT */
1581 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1582 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1583
1584 /* Read HCINT */
1585 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1586 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1587
1588 /* Read HCCHAR */
1589 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1590 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1591
1592 /* Clear HCINT */
1593 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1594
1595 /* Clear HAINT */
1596 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1597
1598 /* Clear GINTSTS */
1599 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1600
1601 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1602 //if (hcchar.b.chen) {
1603 // fprintf(stderr, "** Channel _still_ enabled 3, HCCHAR = %08x **\n", hcchar.d32);
1604 //}
1605 }
1606
1607 /* Set HCTSIZ */
1608 hctsiz.d32 = 0;
1609 hctsiz.b.xfersize = 0;
1610 hctsiz.b.pktcnt = 1;
1611 hctsiz.b.pid = DWC_OTG_HC_PID_DATA1;
1612 dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32);
1613
1614 /* Set HCCHAR */
1615 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1616 hcchar.b.eptype = DWC_OTG_EP_TYPE_CONTROL;
1617 hcchar.b.epdir = 0;
1618 hcchar.b.epnum = 0;
1619 hcchar.b.mps = 8;
1620 hcchar.b.chen = 1;
1621 dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1622
1623 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1624 //fprintf(stderr, "Waiting for HCINTR intr 3, GINTSTS = %08x\n", gintsts.d32);
1625
1626 /* Wait for host channel interrupt */
1627 do {
1628 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1629 } while (gintsts.b.hcintr == 0);
1630
1631 //fprintf(stderr, "Got HCINTR intr 3, GINTSTS = %08x\n", gintsts.d32);
1632
1633 /* Disable HCINTs */
1634 dwc_write_reg32(&hc_regs->hcintmsk, 0x0000);
1635
1636 /* Disable HAINTs */
1637 dwc_write_reg32(&hc_global_regs->haintmsk, 0x0000);
1638
1639 /* Read HAINT */
1640 haint.d32 = dwc_read_reg32(&hc_global_regs->haint);
1641 //fprintf(stderr, "HAINT: %08x\n", haint.d32);
1642
1643 /* Read HCINT */
1644 hcint.d32 = dwc_read_reg32(&hc_regs->hcint);
1645 //fprintf(stderr, "HCINT: %08x\n", hcint.d32);
1646
1647 /* Read HCCHAR */
1648 hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1649 //fprintf(stderr, "HCCHAR: %08x\n", hcchar.d32);
1650
1651 /* Clear HCINT */
1652 dwc_write_reg32(&hc_regs->hcint, hcint.d32);
1653
1654 /* Clear HAINT */
1655 dwc_write_reg32(&hc_global_regs->haint, haint.d32);
1656
1657 /* Clear GINTSTS */
1658 dwc_write_reg32(&global_regs->gintsts, gintsts.d32);
1659
1660 /* Read GINTSTS */
1661 gintsts.d32 = dwc_read_reg32(&global_regs->gintsts);
1662 //fprintf(stderr, "GINTSTS: %08x\n", gintsts.d32);
1663 }
1664 #endif /* DWC_HS_ELECT_TST */
1665
1666 /** Handles hub class-specific requests. */
1667 int dwc_otg_hcd_hub_control(struct usb_hcd *hcd,
1668 u16 typeReq,
1669 u16 wValue,
1670 u16 wIndex,
1671 char *buf,
1672 u16 wLength)
1673 {
1674 int retval = 0;
1675
1676 dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd);
1677 dwc_otg_core_if_t *core_if = hcd_to_dwc_otg_hcd(hcd)->core_if;
1678 struct usb_hub_descriptor *desc;
1679 hprt0_data_t hprt0 = {.d32 = 0};
1680
1681 uint32_t port_status;
1682
1683 switch (typeReq) {
1684 case ClearHubFeature:
1685 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1686 "ClearHubFeature 0x%x\n", wValue);
1687 switch (wValue) {
1688 case C_HUB_LOCAL_POWER:
1689 case C_HUB_OVER_CURRENT:
1690 /* Nothing required here */
1691 break;
1692 default:
1693 retval = -EINVAL;
1694 DWC_ERROR("DWC OTG HCD - "
1695 "ClearHubFeature request %xh unknown\n", wValue);
1696 }
1697 break;
1698 case ClearPortFeature:
1699 if (!wIndex || wIndex > 1)
1700 goto error;
1701
1702 switch (wValue) {
1703 case USB_PORT_FEAT_ENABLE:
1704 DWC_DEBUGPL(DBG_ANY, "DWC OTG HCD HUB CONTROL - "
1705 "ClearPortFeature USB_PORT_FEAT_ENABLE\n");
1706 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1707 hprt0.b.prtena = 1;
1708 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1709 break;
1710 case USB_PORT_FEAT_SUSPEND:
1711 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1712 "ClearPortFeature USB_PORT_FEAT_SUSPEND\n");
1713 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1714 hprt0.b.prtres = 1;
1715 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1716 /* Clear Resume bit */
1717 mdelay(100);
1718 hprt0.b.prtres = 0;
1719 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1720 break;
1721 case USB_PORT_FEAT_POWER:
1722 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1723 "ClearPortFeature USB_PORT_FEAT_POWER\n");
1724 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1725 hprt0.b.prtpwr = 0;
1726 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1727 break;
1728 case USB_PORT_FEAT_INDICATOR:
1729 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1730 "ClearPortFeature USB_PORT_FEAT_INDICATOR\n");
1731 /* Port inidicator not supported */
1732 break;
1733 case USB_PORT_FEAT_C_CONNECTION:
1734 /* Clears drivers internal connect status change
1735 * flag */
1736 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1737 "ClearPortFeature USB_PORT_FEAT_C_CONNECTION\n");
1738 dwc_otg_hcd->flags.b.port_connect_status_change = 0;
1739 break;
1740 case USB_PORT_FEAT_C_RESET:
1741 /* Clears the driver's internal Port Reset Change
1742 * flag */
1743 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1744 "ClearPortFeature USB_PORT_FEAT_C_RESET\n");
1745 dwc_otg_hcd->flags.b.port_reset_change = 0;
1746 break;
1747 case USB_PORT_FEAT_C_ENABLE:
1748 /* Clears the driver's internal Port
1749 * Enable/Disable Change flag */
1750 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1751 "ClearPortFeature USB_PORT_FEAT_C_ENABLE\n");
1752 dwc_otg_hcd->flags.b.port_enable_change = 0;
1753 break;
1754 case USB_PORT_FEAT_C_SUSPEND:
1755 /* Clears the driver's internal Port Suspend
1756 * Change flag, which is set when resume signaling on
1757 * the host port is complete */
1758 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1759 "ClearPortFeature USB_PORT_FEAT_C_SUSPEND\n");
1760 dwc_otg_hcd->flags.b.port_suspend_change = 0;
1761 break;
1762 case USB_PORT_FEAT_C_OVER_CURRENT:
1763 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1764 "ClearPortFeature USB_PORT_FEAT_C_OVER_CURRENT\n");
1765 dwc_otg_hcd->flags.b.port_over_current_change = 0;
1766 break;
1767 default:
1768 retval = -EINVAL;
1769 DWC_ERROR("DWC OTG HCD - "
1770 "ClearPortFeature request %xh "
1771 "unknown or unsupported\n", wValue);
1772 }
1773 break;
1774 case GetHubDescriptor:
1775 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1776 "GetHubDescriptor\n");
1777 desc = (struct usb_hub_descriptor *)buf;
1778 desc->bDescLength = 9;
1779 desc->bDescriptorType = 0x29;
1780 desc->bNbrPorts = 1;
1781 desc->wHubCharacteristics = 0x08;
1782 desc->bPwrOn2PwrGood = 1;
1783 desc->bHubContrCurrent = 0;
1784 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
1785 desc->u.hs.DeviceRemovable[0] = 0;
1786 desc->u.hs.DeviceRemovable[1] = 0xff;
1787 #endif
1788 break;
1789 case GetHubStatus:
1790 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1791 "GetHubStatus\n");
1792 memset(buf, 0, 4);
1793 break;
1794 case GetPortStatus:
1795 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1796 "GetPortStatus\n");
1797
1798 if (!wIndex || wIndex > 1)
1799 goto error;
1800
1801 port_status = 0;
1802
1803 if (dwc_otg_hcd->flags.b.port_connect_status_change)
1804 port_status |= (1 << USB_PORT_FEAT_C_CONNECTION);
1805
1806 if (dwc_otg_hcd->flags.b.port_enable_change)
1807 port_status |= (1 << USB_PORT_FEAT_C_ENABLE);
1808
1809 if (dwc_otg_hcd->flags.b.port_suspend_change)
1810 port_status |= (1 << USB_PORT_FEAT_C_SUSPEND);
1811
1812 if (dwc_otg_hcd->flags.b.port_reset_change)
1813 port_status |= (1 << USB_PORT_FEAT_C_RESET);
1814
1815 if (dwc_otg_hcd->flags.b.port_over_current_change) {
1816 DWC_ERROR("Device Not Supported\n");
1817 port_status |= (1 << USB_PORT_FEAT_C_OVER_CURRENT);
1818 }
1819
1820 if (!dwc_otg_hcd->flags.b.port_connect_status) {
1821 /*
1822 * The port is disconnected, which means the core is
1823 * either in device mode or it soon will be. Just
1824 * return 0's for the remainder of the port status
1825 * since the port register can't be read if the core
1826 * is in device mode.
1827 */
1828 *((__le32 *) buf) = cpu_to_le32(port_status);
1829 break;
1830 }
1831
1832 hprt0.d32 = dwc_read_reg32(core_if->host_if->hprt0);
1833 DWC_DEBUGPL(DBG_HCDV, " HPRT0: 0x%08x\n", hprt0.d32);
1834
1835 if (hprt0.b.prtconnsts)
1836 port_status |= (1 << USB_PORT_FEAT_CONNECTION);
1837
1838 if (hprt0.b.prtena)
1839 port_status |= (1 << USB_PORT_FEAT_ENABLE);
1840
1841 if (hprt0.b.prtsusp)
1842 port_status |= (1 << USB_PORT_FEAT_SUSPEND);
1843
1844 if (hprt0.b.prtovrcurract)
1845 port_status |= (1 << USB_PORT_FEAT_OVER_CURRENT);
1846
1847 if (hprt0.b.prtrst)
1848 port_status |= (1 << USB_PORT_FEAT_RESET);
1849
1850 if (hprt0.b.prtpwr)
1851 port_status |= (1 << USB_PORT_FEAT_POWER);
1852
1853 if (hprt0.b.prtspd == DWC_HPRT0_PRTSPD_HIGH_SPEED)
1854 port_status |= USB_PORT_STAT_HIGH_SPEED;
1855 else if (hprt0.b.prtspd == DWC_HPRT0_PRTSPD_LOW_SPEED)
1856 port_status |= USB_PORT_STAT_LOW_SPEED;
1857
1858 if (hprt0.b.prttstctl)
1859 port_status |= (1 << USB_PORT_FEAT_TEST);
1860
1861 /* USB_PORT_FEAT_INDICATOR unsupported always 0 */
1862
1863 *((__le32 *) buf) = cpu_to_le32(port_status);
1864
1865 break;
1866 case SetHubFeature:
1867 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1868 "SetHubFeature\n");
1869 /* No HUB features supported */
1870 break;
1871 case SetPortFeature:
1872 if (wValue != USB_PORT_FEAT_TEST && (!wIndex || wIndex > 1))
1873 goto error;
1874
1875 if (!dwc_otg_hcd->flags.b.port_connect_status) {
1876 /*
1877 * The port is disconnected, which means the core is
1878 * either in device mode or it soon will be. Just
1879 * return without doing anything since the port
1880 * register can't be written if the core is in device
1881 * mode.
1882 */
1883 break;
1884 }
1885
1886 switch (wValue) {
1887 case USB_PORT_FEAT_SUSPEND:
1888 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1889 "SetPortFeature - USB_PORT_FEAT_SUSPEND\n");
1890 if (hcd->self.otg_port == wIndex &&
1891 hcd->self.b_hnp_enable) {
1892 gotgctl_data_t gotgctl = {.d32=0};
1893 gotgctl.b.hstsethnpen = 1;
1894 dwc_modify_reg32(&core_if->core_global_regs->gotgctl,
1895 0, gotgctl.d32);
1896 core_if->op_state = A_SUSPEND;
1897 }
1898 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1899 hprt0.b.prtsusp = 1;
1900 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1901 //DWC_PRINT("SUSPEND: HPRT0=%0x\n", hprt0.d32);
1902 /* Suspend the Phy Clock */
1903 {
1904 pcgcctl_data_t pcgcctl = {.d32=0};
1905 pcgcctl.b.stoppclk = 1;
1906 dwc_write_reg32(core_if->pcgcctl, pcgcctl.d32);
1907 }
1908
1909 /* For HNP the bus must be suspended for at least 200ms. */
1910 if (hcd->self.b_hnp_enable) {
1911 mdelay(200);
1912 //DWC_PRINT("SUSPEND: wait complete! (%d)\n", _hcd->state);
1913 }
1914 break;
1915 case USB_PORT_FEAT_POWER:
1916 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1917 "SetPortFeature - USB_PORT_FEAT_POWER\n");
1918 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1919 hprt0.b.prtpwr = 1;
1920 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1921 break;
1922 case USB_PORT_FEAT_RESET:
1923 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1924 "SetPortFeature - USB_PORT_FEAT_RESET\n");
1925 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1926 /* When B-Host the Port reset bit is set in
1927 * the Start HCD Callback function, so that
1928 * the reset is started within 1ms of the HNP
1929 * success interrupt. */
1930 if (!hcd->self.is_b_host) {
1931 hprt0.b.prtrst = 1;
1932 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1933 }
1934 /* Clear reset bit in 10ms (FS/LS) or 50ms (HS) */
1935 MDELAY(60);
1936 hprt0.b.prtrst = 0;
1937 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1938 break;
1939
1940 #ifdef DWC_HS_ELECT_TST
1941 case USB_PORT_FEAT_TEST:
1942 {
1943 uint32_t t;
1944 gintmsk_data_t gintmsk;
1945
1946 t = (wIndex >> 8); /* MSB wIndex USB */
1947 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
1948 "SetPortFeature - USB_PORT_FEAT_TEST %d\n", t);
1949 warn("USB_PORT_FEAT_TEST %d\n", t);
1950 if (t < 6) {
1951 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1952 hprt0.b.prttstctl = t;
1953 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1954 } else {
1955 /* Setup global vars with reg addresses (quick and
1956 * dirty hack, should be cleaned up)
1957 */
1958 global_regs = core_if->core_global_regs;
1959 hc_global_regs = core_if->host_if->host_global_regs;
1960 hc_regs = (dwc_otg_hc_regs_t *)((char *)global_regs + 0x500);
1961 data_fifo = (uint32_t *)((char *)global_regs + 0x1000);
1962
1963 if (t == 6) { /* HS_HOST_PORT_SUSPEND_RESUME */
1964 /* Save current interrupt mask */
1965 gintmsk.d32 = dwc_read_reg32(&global_regs->gintmsk);
1966
1967 /* Disable all interrupts while we muck with
1968 * the hardware directly
1969 */
1970 dwc_write_reg32(&global_regs->gintmsk, 0);
1971
1972 /* 15 second delay per the test spec */
1973 mdelay(15000);
1974
1975 /* Drive suspend on the root port */
1976 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1977 hprt0.b.prtsusp = 1;
1978 hprt0.b.prtres = 0;
1979 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1980
1981 /* 15 second delay per the test spec */
1982 mdelay(15000);
1983
1984 /* Drive resume on the root port */
1985 hprt0.d32 = dwc_otg_read_hprt0(core_if);
1986 hprt0.b.prtsusp = 0;
1987 hprt0.b.prtres = 1;
1988 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1989 mdelay(100);
1990
1991 /* Clear the resume bit */
1992 hprt0.b.prtres = 0;
1993 dwc_write_reg32(core_if->host_if->hprt0, hprt0.d32);
1994
1995 /* Restore interrupts */
1996 dwc_write_reg32(&global_regs->gintmsk, gintmsk.d32);
1997 } else if (t == 7) { /* SINGLE_STEP_GET_DEVICE_DESCRIPTOR setup */
1998 /* Save current interrupt mask */
1999 gintmsk.d32 = dwc_read_reg32(&global_regs->gintmsk);
2000
2001 /* Disable all interrupts while we muck with
2002 * the hardware directly
2003 */
2004 dwc_write_reg32(&global_regs->gintmsk, 0);
2005
2006 /* 15 second delay per the test spec */
2007 mdelay(15000);
2008
2009 /* Send the Setup packet */
2010 do_setup();
2011
2012 /* 15 second delay so nothing else happens for awhile */
2013 mdelay(15000);
2014
2015 /* Restore interrupts */
2016 dwc_write_reg32(&global_regs->gintmsk, gintmsk.d32);
2017 } else if (t == 8) { /* SINGLE_STEP_GET_DEVICE_DESCRIPTOR execute */
2018 /* Save current interrupt mask */
2019 gintmsk.d32 = dwc_read_reg32(&global_regs->gintmsk);
2020
2021 /* Disable all interrupts while we muck with
2022 * the hardware directly
2023 */
2024 dwc_write_reg32(&global_regs->gintmsk, 0);
2025
2026 /* Send the Setup packet */
2027 do_setup();
2028
2029 /* 15 second delay so nothing else happens for awhile */
2030 mdelay(15000);
2031
2032 /* Send the In and Ack packets */
2033 do_in_ack();
2034
2035 /* 15 second delay so nothing else happens for awhile */
2036 mdelay(15000);
2037
2038 /* Restore interrupts */
2039 dwc_write_reg32(&global_regs->gintmsk, gintmsk.d32);
2040 }
2041 }
2042 break;
2043 }
2044 #endif /* DWC_HS_ELECT_TST */
2045
2046 case USB_PORT_FEAT_INDICATOR:
2047 DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD HUB CONTROL - "
2048 "SetPortFeature - USB_PORT_FEAT_INDICATOR\n");
2049 /* Not supported */
2050 break;
2051 default:
2052 retval = -EINVAL;
2053 DWC_ERROR("DWC OTG HCD - "
2054 "SetPortFeature request %xh "
2055 "unknown or unsupported\n", wValue);
2056 break;
2057 }
2058 break;
2059 default:
2060 error:
2061 retval = -EINVAL;
2062 DWC_WARN("DWC OTG HCD - "
2063 "Unknown hub control request type or invalid typeReq: %xh wIndex: %xh wValue: %xh\n",
2064 typeReq, wIndex, wValue);
2065 break;
2066 }
2067
2068 return retval;
2069 }
2070
2071 /**
2072 * Assigns transactions from a QTD to a free host channel and initializes the
2073 * host channel to perform the transactions. The host channel is removed from
2074 * the free list.
2075 *
2076 * @param hcd The HCD state structure.
2077 * @param qh Transactions from the first QTD for this QH are selected and
2078 * assigned to a free host channel.
2079 */
2080 static void assign_and_init_hc(dwc_otg_hcd_t *hcd, dwc_otg_qh_t *qh)
2081 {
2082 dwc_hc_t *hc;
2083 dwc_otg_qtd_t *qtd;
2084 struct urb *urb;
2085
2086 DWC_DEBUGPL(DBG_HCDV, "%s(%p,%p)\n", __func__, hcd, qh);
2087
2088 hc = list_entry(hcd->free_hc_list.next, dwc_hc_t, hc_list_entry);
2089
2090 /* Remove the host channel from the free list. */
2091 list_del_init(&hc->hc_list_entry);
2092
2093 qtd = list_entry(qh->qtd_list.next, dwc_otg_qtd_t, qtd_list_entry);
2094 urb = qtd->urb;
2095 qh->channel = hc;
2096 qh->qtd_in_process = qtd;
2097
2098 /*
2099 * Use usb_pipedevice to determine device address. This address is
2100 * 0 before the SET_ADDRESS command and the correct address afterward.
2101 */
2102 hc->dev_addr = usb_pipedevice(urb->pipe);
2103 hc->ep_num = usb_pipeendpoint(urb->pipe);
2104
2105 if (urb->dev->speed == USB_SPEED_LOW) {
2106 hc->speed = DWC_OTG_EP_SPEED_LOW;
2107 } else if (urb->dev->speed == USB_SPEED_FULL) {
2108 hc->speed = DWC_OTG_EP_SPEED_FULL;
2109 } else {
2110 hc->speed = DWC_OTG_EP_SPEED_HIGH;
2111 }
2112
2113 hc->max_packet = dwc_max_packet(qh->maxp);
2114
2115 hc->xfer_started = 0;
2116 hc->halt_status = DWC_OTG_HC_XFER_NO_HALT_STATUS;
2117 hc->error_state = (qtd->error_count > 0);
2118 hc->halt_on_queue = 0;
2119 hc->halt_pending = 0;
2120 hc->requests = 0;
2121
2122 /*
2123 * The following values may be modified in the transfer type section
2124 * below. The xfer_len value may be reduced when the transfer is
2125 * started to accommodate the max widths of the XferSize and PktCnt
2126 * fields in the HCTSIZn register.
2127 */
2128 hc->do_ping = qh->ping_state;
2129 hc->ep_is_in = (usb_pipein(urb->pipe) != 0);
2130 hc->data_pid_start = qh->data_toggle;
2131 hc->multi_count = 1;
2132
2133 if (hcd->core_if->dma_enable) {
2134 hc->xfer_buff = (uint8_t *)urb->transfer_dma + urb->actual_length;
2135 } else {
2136 hc->xfer_buff = (uint8_t *)urb->transfer_buffer + urb->actual_length;
2137 }
2138 hc->xfer_len = urb->transfer_buffer_length - urb->actual_length;
2139 hc->xfer_count = 0;
2140
2141 /*
2142 * Set the split attributes
2143 */
2144 hc->do_split = 0;
2145 if (qh->do_split) {
2146 hc->do_split = 1;
2147 hc->xact_pos = qtd->isoc_split_pos;
2148 hc->complete_split = qtd->complete_split;
2149 hc->hub_addr = urb->dev->tt->hub->devnum;
2150 hc->port_addr = urb->dev->ttport;
2151 }
2152
2153 switch (usb_pipetype(urb->pipe)) {
2154 case PIPE_CONTROL:
2155 hc->ep_type = DWC_OTG_EP_TYPE_CONTROL;
2156 switch (qtd->control_phase) {
2157 case DWC_OTG_CONTROL_SETUP:
2158 DWC_DEBUGPL(DBG_HCDV, " Control setup transaction\n");
2159 hc->do_ping = 0;
2160 hc->ep_is_in = 0;
2161 hc->data_pid_start = DWC_OTG_HC_PID_SETUP;
2162 if (hcd->core_if->dma_enable) {
2163 hc->xfer_buff = (uint8_t *)urb->setup_dma;
2164 } else {
2165 hc->xfer_buff = (uint8_t *)urb->setup_packet;
2166 }
2167 hc->xfer_len = 8;
2168 break;
2169 case DWC_OTG_CONTROL_DATA:
2170 DWC_DEBUGPL(DBG_HCDV, " Control data transaction\n");
2171 hc->data_pid_start = qtd->data_toggle;
2172 break;
2173 case DWC_OTG_CONTROL_STATUS:
2174 /*
2175 * Direction is opposite of data direction or IN if no
2176 * data.
2177 */
2178 DWC_DEBUGPL(DBG_HCDV, " Control status transaction\n");
2179 if (urb->transfer_buffer_length == 0) {
2180 hc->ep_is_in = 1;
2181 } else {
2182 hc->ep_is_in = (usb_pipein(urb->pipe) != USB_DIR_IN);
2183 }
2184 if (hc->ep_is_in) {
2185 hc->do_ping = 0;
2186 }
2187 hc->data_pid_start = DWC_OTG_HC_PID_DATA1;
2188 hc->xfer_len = 0;
2189 if (hcd->core_if->dma_enable) {
2190 hc->xfer_buff = (uint8_t *)hcd->status_buf_dma;
2191 } else {
2192 hc->xfer_buff = (uint8_t *)hcd->status_buf;
2193 }
2194 break;
2195 }
2196 break;
2197 case PIPE_BULK:
2198 hc->ep_type = DWC_OTG_EP_TYPE_BULK;
2199 break;
2200 case PIPE_INTERRUPT:
2201 hc->ep_type = DWC_OTG_EP_TYPE_INTR;
2202 break;
2203 case PIPE_ISOCHRONOUS:
2204 {
2205 struct usb_iso_packet_descriptor *frame_desc;
2206 frame_desc = &urb->iso_frame_desc[qtd->isoc_frame_index];
2207 hc->ep_type = DWC_OTG_EP_TYPE_ISOC;
2208 if (hcd->core_if->dma_enable) {
2209 hc->xfer_buff = (uint8_t *)urb->transfer_dma;
2210 } else {
2211 hc->xfer_buff = (uint8_t *)urb->transfer_buffer;
2212 }
2213 hc->xfer_buff += frame_desc->offset + qtd->isoc_split_offset;
2214 hc->xfer_len = frame_desc->length - qtd->isoc_split_offset;
2215
2216 if (hc->xact_pos == DWC_HCSPLIT_XACTPOS_ALL) {
2217 if (hc->xfer_len <= 188) {
2218 hc->xact_pos = DWC_HCSPLIT_XACTPOS_ALL;
2219 }
2220 else {
2221 hc->xact_pos = DWC_HCSPLIT_XACTPOS_BEGIN;
2222 }
2223 }
2224 }
2225 break;
2226 }
2227
2228 if (hc->ep_type == DWC_OTG_EP_TYPE_INTR ||
2229 hc->ep_type == DWC_OTG_EP_TYPE_ISOC) {
2230 /*
2231 * This value may be modified when the transfer is started to
2232 * reflect the actual transfer length.
2233 */
2234 hc->multi_count = dwc_hb_mult(qh->maxp);
2235 }
2236
2237 dwc_otg_hc_init(hcd->core_if, hc);
2238 hc->qh = qh;
2239 }
2240
2241 /**
2242 * This function selects transactions from the HCD transfer schedule and
2243 * assigns them to available host channels. It is called from HCD interrupt
2244 * handler functions.
2245 *
2246 * @param hcd The HCD state structure.
2247 *
2248 * @return The types of new transactions that were assigned to host channels.
2249 */
2250 dwc_otg_transaction_type_e dwc_otg_hcd_select_transactions(dwc_otg_hcd_t *hcd)
2251 {
2252 struct list_head *qh_ptr;
2253 dwc_otg_qh_t *qh;
2254 int num_channels;
2255 dwc_otg_transaction_type_e ret_val = DWC_OTG_TRANSACTION_NONE;
2256
2257 #ifdef DEBUG_SOF
2258 DWC_DEBUGPL(DBG_HCD, " Select Transactions\n");
2259 #endif
2260
2261 /* Process entries in the periodic ready list. */
2262 qh_ptr = hcd->periodic_sched_ready.next;
2263 while (qh_ptr != &hcd->periodic_sched_ready &&
2264 !list_empty(&hcd->free_hc_list)) {
2265
2266 qh = list_entry(qh_ptr, dwc_otg_qh_t, qh_list_entry);
2267 assign_and_init_hc(hcd, qh);
2268
2269 /*
2270 * Move the QH from the periodic ready schedule to the
2271 * periodic assigned schedule.
2272 */
2273 qh_ptr = qh_ptr->next;
2274 list_move(&qh->qh_list_entry, &hcd->periodic_sched_assigned);
2275
2276 ret_val = DWC_OTG_TRANSACTION_PERIODIC;
2277 }
2278
2279 /*
2280 * Process entries in the inactive portion of the non-periodic
2281 * schedule. Some free host channels may not be used if they are
2282 * reserved for periodic transfers.
2283 */
2284 qh_ptr = hcd->non_periodic_sched_inactive.next;
2285 num_channels = hcd->core_if->core_params->host_channels;
2286 while (qh_ptr != &hcd->non_periodic_sched_inactive &&
2287 (hcd->non_periodic_channels <
2288 num_channels - hcd->periodic_channels) &&
2289 !list_empty(&hcd->free_hc_list)) {
2290
2291 qh = list_entry(qh_ptr, dwc_otg_qh_t, qh_list_entry);
2292 assign_and_init_hc(hcd, qh);
2293
2294 /*
2295 * Move the QH from the non-periodic inactive schedule to the
2296 * non-periodic active schedule.
2297 */
2298 qh_ptr = qh_ptr->next;
2299 list_move(&qh->qh_list_entry, &hcd->non_periodic_sched_active);
2300
2301 if (ret_val == DWC_OTG_TRANSACTION_NONE) {
2302 ret_val = DWC_OTG_TRANSACTION_NON_PERIODIC;
2303 } else {
2304 ret_val = DWC_OTG_TRANSACTION_ALL;
2305 }
2306
2307 hcd->non_periodic_channels++;
2308 }
2309
2310 return ret_val;
2311 }
2312
2313 /**
2314 * Attempts to queue a single transaction request for a host channel
2315 * associated with either a periodic or non-periodic transfer. This function
2316 * assumes that there is space available in the appropriate request queue. For
2317 * an OUT transfer or SETUP transaction in Slave mode, it checks whether space
2318 * is available in the appropriate Tx FIFO.
2319 *
2320 * @param hcd The HCD state structure.
2321 * @param hc Host channel descriptor associated with either a periodic or
2322 * non-periodic transfer.
2323 * @param fifo_dwords_avail Number of DWORDs available in the periodic Tx
2324 * FIFO for periodic transfers or the non-periodic Tx FIFO for non-periodic
2325 * transfers.
2326 *
2327 * @return 1 if a request is queued and more requests may be needed to
2328 * complete the transfer, 0 if no more requests are required for this
2329 * transfer, -1 if there is insufficient space in the Tx FIFO.
2330 */
2331 static int queue_transaction(dwc_otg_hcd_t *hcd,
2332 dwc_hc_t *hc,
2333 uint16_t fifo_dwords_avail)
2334 {
2335 int retval;
2336
2337 if (hcd->core_if->dma_enable) {
2338 if (!hc->xfer_started) {
2339 dwc_otg_hc_start_transfer(hcd->core_if, hc);
2340 hc->qh->ping_state = 0;
2341 }
2342 retval = 0;
2343 } else if (hc->halt_pending) {
2344 /* Don't queue a request if the channel has been halted. */
2345 retval = 0;
2346 } else if (hc->halt_on_queue) {
2347 dwc_otg_hc_halt(hcd->core_if, hc, hc->halt_status);
2348 retval = 0;
2349 } else if (hc->do_ping) {
2350 if (!hc->xfer_started) {
2351 dwc_otg_hc_start_transfer(hcd->core_if, hc);
2352 }
2353 retval = 0;
2354 } else if (!hc->ep_is_in ||
2355 hc->data_pid_start == DWC_OTG_HC_PID_SETUP) {
2356 if ((fifo_dwords_avail * 4) >= hc->max_packet) {
2357 if (!hc->xfer_started) {
2358 dwc_otg_hc_start_transfer(hcd->core_if, hc);
2359 retval = 1;
2360 } else {
2361 retval = dwc_otg_hc_continue_transfer(hcd->core_if, hc);
2362 }
2363 } else {
2364 retval = -1;
2365 }
2366 } else {
2367 if (!hc->xfer_started) {
2368 dwc_otg_hc_start_transfer(hcd->core_if, hc);
2369 retval = 1;
2370 } else {
2371 retval = dwc_otg_hc_continue_transfer(hcd->core_if, hc);
2372 }
2373 }
2374
2375 return retval;
2376 }
2377
2378 /**
2379 * Processes active non-periodic channels and queues transactions for these
2380 * channels to the DWC_otg controller. After queueing transactions, the NP Tx
2381 * FIFO Empty interrupt is enabled if there are more transactions to queue as
2382 * NP Tx FIFO or request queue space becomes available. Otherwise, the NP Tx
2383 * FIFO Empty interrupt is disabled.
2384 */
2385 static void process_non_periodic_channels(dwc_otg_hcd_t *hcd)
2386 {
2387 gnptxsts_data_t tx_status;
2388 struct list_head *orig_qh_ptr;
2389 dwc_otg_qh_t *qh;
2390 int status;
2391 int no_queue_space = 0;
2392 int no_fifo_space = 0;
2393 int more_to_do = 0;
2394
2395 dwc_otg_core_global_regs_t *global_regs = hcd->core_if->core_global_regs;
2396
2397 DWC_DEBUGPL(DBG_HCDV, "Queue non-periodic transactions\n");
2398 #ifdef DEBUG
2399 tx_status.d32 = dwc_read_reg32(&global_regs->gnptxsts);
2400 DWC_DEBUGPL(DBG_HCDV, " NP Tx Req Queue Space Avail (before queue): %d\n",
2401 tx_status.b.nptxqspcavail);
2402 DWC_DEBUGPL(DBG_HCDV, " NP Tx FIFO Space Avail (before queue): %d\n",
2403 tx_status.b.nptxfspcavail);
2404 #endif
2405 /*
2406 * Keep track of the starting point. Skip over the start-of-list
2407 * entry.
2408 */
2409 if (hcd->non_periodic_qh_ptr == &hcd->non_periodic_sched_active) {
2410 hcd->non_periodic_qh_ptr = hcd->non_periodic_qh_ptr->next;
2411 }
2412 orig_qh_ptr = hcd->non_periodic_qh_ptr;
2413
2414 /*
2415 * Process once through the active list or until no more space is
2416 * available in the request queue or the Tx FIFO.
2417 */
2418 do {
2419 tx_status.d32 = dwc_read_reg32(&global_regs->gnptxsts);
2420 if (!hcd->core_if->dma_enable && tx_status.b.nptxqspcavail == 0) {
2421 no_queue_space = 1;
2422 break;
2423 }
2424
2425 qh = list_entry(hcd->non_periodic_qh_ptr, dwc_otg_qh_t, qh_list_entry);
2426 status = queue_transaction(hcd, qh->channel, tx_status.b.nptxfspcavail);
2427
2428 if (status > 0) {
2429 more_to_do = 1;
2430 } else if (status < 0) {
2431 no_fifo_space = 1;
2432 break;
2433 }
2434
2435 /* Advance to next QH, skipping start-of-list entry. */
2436 hcd->non_periodic_qh_ptr = hcd->non_periodic_qh_ptr->next;
2437 if (hcd->non_periodic_qh_ptr == &hcd->non_periodic_sched_active) {
2438 hcd->non_periodic_qh_ptr = hcd->non_periodic_qh_ptr->next;
2439 }
2440
2441 } while (hcd->non_periodic_qh_ptr != orig_qh_ptr);
2442
2443 if (!hcd->core_if->dma_enable) {
2444 gintmsk_data_t intr_mask = {.d32 = 0};
2445 intr_mask.b.nptxfempty = 1;
2446
2447 #ifdef DEBUG
2448 tx_status.d32 = dwc_read_reg32(&global_regs->gnptxsts);
2449 DWC_DEBUGPL(DBG_HCDV, " NP Tx Req Queue Space Avail (after queue): %d\n",
2450 tx_status.b.nptxqspcavail);
2451 DWC_DEBUGPL(DBG_HCDV, " NP Tx FIFO Space Avail (after queue): %d\n",
2452 tx_status.b.nptxfspcavail);
2453 #endif
2454 if (more_to_do || no_queue_space || no_fifo_space) {
2455 /*
2456 * May need to queue more transactions as the request
2457 * queue or Tx FIFO empties. Enable the non-periodic
2458 * Tx FIFO empty interrupt. (Always use the half-empty
2459 * level to ensure that new requests are loaded as
2460 * soon as possible.)
2461 */
2462 dwc_modify_reg32(&global_regs->gintmsk, 0, intr_mask.d32);
2463 } else {
2464 /*
2465 * Disable the Tx FIFO empty interrupt since there are
2466 * no more transactions that need to be queued right
2467 * now. This function is called from interrupt
2468 * handlers to queue more transactions as transfer
2469 * states change.
2470 */
2471 dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, 0);
2472 }
2473 }
2474 }
2475
2476 /**
2477 * Processes periodic channels for the next frame and queues transactions for
2478 * these channels to the DWC_otg controller. After queueing transactions, the
2479 * Periodic Tx FIFO Empty interrupt is enabled if there are more transactions
2480 * to queue as Periodic Tx FIFO or request queue space becomes available.
2481 * Otherwise, the Periodic Tx FIFO Empty interrupt is disabled.
2482 */
2483 static void process_periodic_channels(dwc_otg_hcd_t *hcd)
2484 {
2485 hptxsts_data_t tx_status;
2486 struct list_head *qh_ptr;
2487 dwc_otg_qh_t *qh;
2488 int status;
2489 int no_queue_space = 0;
2490 int no_fifo_space = 0;
2491
2492 dwc_otg_host_global_regs_t *host_regs;
2493 host_regs = hcd->core_if->host_if->host_global_regs;
2494
2495 DWC_DEBUGPL(DBG_HCDV, "Queue periodic transactions\n");
2496 #ifdef DEBUG
2497 tx_status.d32 = dwc_read_reg32(&host_regs->hptxsts);
2498 DWC_DEBUGPL(DBG_HCDV, " P Tx Req Queue Space Avail (before queue): %d\n",
2499 tx_status.b.ptxqspcavail);
2500 DWC_DEBUGPL(DBG_HCDV, " P Tx FIFO Space Avail (before queue): %d\n",
2501 tx_status.b.ptxfspcavail);
2502 #endif
2503
2504 qh_ptr = hcd->periodic_sched_assigned.next;
2505 while (qh_ptr != &hcd->periodic_sched_assigned) {
2506 tx_status.d32 = dwc_read_reg32(&host_regs->hptxsts);
2507 if (tx_status.b.ptxqspcavail == 0) {
2508 no_queue_space = 1;
2509 break;
2510 }
2511
2512 qh = list_entry(qh_ptr, dwc_otg_qh_t, qh_list_entry);
2513
2514 /*
2515 * Set a flag if we're queuing high-bandwidth in slave mode.
2516 * The flag prevents any halts to get into the request queue in
2517 * the middle of multiple high-bandwidth packets getting queued.
2518 */
2519 if (!hcd->core_if->dma_enable &&
2520 qh->channel->multi_count > 1)
2521 {
2522 hcd->core_if->queuing_high_bandwidth = 1;
2523 }
2524
2525 status = queue_transaction(hcd, qh->channel, tx_status.b.ptxfspcavail);
2526 if (status < 0) {
2527 no_fifo_space = 1;
2528 break;
2529 }
2530
2531 /*
2532 * In Slave mode, stay on the current transfer until there is
2533 * nothing more to do or the high-bandwidth request count is
2534 * reached. In DMA mode, only need to queue one request. The
2535 * controller automatically handles multiple packets for
2536 * high-bandwidth transfers.
2537 */
2538 if (hcd->core_if->dma_enable || status == 0 ||
2539 qh->channel->requests == qh->channel->multi_count) {
2540 qh_ptr = qh_ptr->next;
2541 /*
2542 * Move the QH from the periodic assigned schedule to
2543 * the periodic queued schedule.
2544 */
2545 list_move(&qh->qh_list_entry, &hcd->periodic_sched_queued);
2546
2547 /* done queuing high bandwidth */
2548 hcd->core_if->queuing_high_bandwidth = 0;
2549 }
2550 }
2551
2552 if (!hcd->core_if->dma_enable) {
2553 dwc_otg_core_global_regs_t *global_regs;
2554 gintmsk_data_t intr_mask = {.d32 = 0};
2555
2556 global_regs = hcd->core_if->core_global_regs;
2557 intr_mask.b.ptxfempty = 1;
2558 #ifdef DEBUG
2559 tx_status.d32 = dwc_read_reg32(&host_regs->hptxsts);
2560 DWC_DEBUGPL(DBG_HCDV, " P Tx Req Queue Space Avail (after queue): %d\n",
2561 tx_status.b.ptxqspcavail);
2562 DWC_DEBUGPL(DBG_HCDV, " P Tx FIFO Space Avail (after queue): %d\n",
2563 tx_status.b.ptxfspcavail);
2564 #endif
2565 if (!list_empty(&hcd->periodic_sched_assigned) ||
2566 no_queue_space || no_fifo_space) {
2567 /*
2568 * May need to queue more transactions as the request
2569 * queue or Tx FIFO empties. Enable the periodic Tx
2570 * FIFO empty interrupt. (Always use the half-empty
2571 * level to ensure that new requests are loaded as
2572 * soon as possible.)
2573 */
2574 dwc_modify_reg32(&global_regs->gintmsk, 0, intr_mask.d32);
2575 } else {
2576 /*
2577 * Disable the Tx FIFO empty interrupt since there are
2578 * no more transactions that need to be queued right
2579 * now. This function is called from interrupt
2580 * handlers to queue more transactions as transfer
2581 * states change.
2582 */
2583 dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, 0);
2584 }
2585 }
2586 }
2587
2588 /**
2589 * This function processes the currently active host channels and queues
2590 * transactions for these channels to the DWC_otg controller. It is called
2591 * from HCD interrupt handler functions.
2592 *
2593 * @param hcd The HCD state structure.
2594 * @param tr_type The type(s) of transactions to queue (non-periodic,
2595 * periodic, or both).
2596 */
2597 void dwc_otg_hcd_queue_transactions(dwc_otg_hcd_t *hcd,
2598 dwc_otg_transaction_type_e tr_type)
2599 {
2600 #ifdef DEBUG_SOF
2601 DWC_DEBUGPL(DBG_HCD, "Queue Transactions\n");
2602 #endif
2603 /* Process host channels associated with periodic transfers. */
2604 if ((tr_type == DWC_OTG_TRANSACTION_PERIODIC ||
2605 tr_type == DWC_OTG_TRANSACTION_ALL) &&
2606 !list_empty(&hcd->periodic_sched_assigned)) {
2607
2608 process_periodic_channels(hcd);
2609 }
2610
2611 /* Process host channels associated with non-periodic transfers. */
2612 if (tr_type == DWC_OTG_TRANSACTION_NON_PERIODIC ||
2613 tr_type == DWC_OTG_TRANSACTION_ALL) {
2614 if (!list_empty(&hcd->non_periodic_sched_active)) {
2615 process_non_periodic_channels(hcd);
2616 } else {
2617 /*
2618 * Ensure NP Tx FIFO empty interrupt is disabled when
2619 * there are no non-periodic transfers to process.
2620 */
2621 gintmsk_data_t gintmsk = {.d32 = 0};
2622 gintmsk.b.nptxfempty = 1;
2623 dwc_modify_reg32(&hcd->core_if->core_global_regs->gintmsk,
2624 gintmsk.d32, 0);
2625 }
2626 }
2627 }
2628
2629 /**
2630 * Sets the final status of an URB and returns it to the device driver. Any
2631 * required cleanup of the URB is performed.
2632 */
2633 void dwc_otg_hcd_complete_urb(dwc_otg_hcd_t *hcd, struct urb *urb, int status)
2634 {
2635 #ifdef DEBUG
2636 if (CHK_DEBUG_LEVEL(DBG_HCDV | DBG_HCD_URB)) {
2637 DWC_PRINT("%s: urb %p, device %d, ep %d %s, status=%d\n",
2638 __func__, urb, usb_pipedevice(urb->pipe),
2639 usb_pipeendpoint(urb->pipe),
2640 usb_pipein(urb->pipe) ? "IN" : "OUT", status);
2641 if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
2642 int i;
2643 for (i = 0; i < urb->number_of_packets; i++) {
2644 DWC_PRINT(" ISO Desc %d status: %d\n",
2645 i, urb->iso_frame_desc[i].status);
2646 }
2647 }
2648 }
2649 #endif
2650
2651 urb->status = status;
2652 urb->hcpriv = NULL;
2653 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
2654 usb_hcd_giveback_urb(dwc_otg_hcd_to_hcd(hcd), urb, status);
2655 #else
2656 usb_hcd_giveback_urb(dwc_otg_hcd_to_hcd(hcd), urb, NULL);
2657 #endif
2658 }
2659
2660 /*
2661 * Returns the Queue Head for an URB.
2662 */
2663 dwc_otg_qh_t *dwc_urb_to_qh(struct urb *urb)
2664 {
2665 struct usb_host_endpoint *ep = dwc_urb_to_endpoint(urb);
2666 return (dwc_otg_qh_t *)ep->hcpriv;
2667 }
2668
2669 #ifdef DEBUG
2670 void dwc_print_setup_data(uint8_t *setup)
2671 {
2672 int i;
2673 if (CHK_DEBUG_LEVEL(DBG_HCD)){
2674 DWC_PRINT("Setup Data = MSB ");
2675 for (i = 7; i >= 0; i--) DWC_PRINT("%02x ", setup[i]);
2676 DWC_PRINT("\n");
2677 DWC_PRINT(" bmRequestType Tranfer = %s\n", (setup[0] & 0x80) ? "Device-to-Host" : "Host-to-Device");
2678 DWC_PRINT(" bmRequestType Type = ");
2679 switch ((setup[0] & 0x60) >> 5) {
2680 case 0: DWC_PRINT("Standard\n"); break;
2681 case 1: DWC_PRINT("Class\n"); break;
2682 case 2: DWC_PRINT("Vendor\n"); break;
2683 case 3: DWC_PRINT("Reserved\n"); break;
2684 }
2685 DWC_PRINT(" bmRequestType Recipient = ");
2686 switch (setup[0] & 0x1f) {
2687 case 0: DWC_PRINT("Device\n"); break;
2688 case 1: DWC_PRINT("Interface\n"); break;
2689 case 2: DWC_PRINT("Endpoint\n"); break;
2690 case 3: DWC_PRINT("Other\n"); break;
2691 default: DWC_PRINT("Reserved\n"); break;
2692 }
2693 DWC_PRINT(" bRequest = 0x%0x\n", setup[1]);
2694 DWC_PRINT(" wValue = 0x%0x\n", *((uint16_t *)&setup[2]));
2695 DWC_PRINT(" wIndex = 0x%0x\n", *((uint16_t *)&setup[4]));
2696 DWC_PRINT(" wLength = 0x%0x\n\n", *((uint16_t *)&setup[6]));
2697 }
2698 }
2699 #endif
2700
2701 void dwc_otg_hcd_dump_frrem(dwc_otg_hcd_t *hcd) {
2702 #if defined(DEBUG) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
2703 DWC_PRINT("Frame remaining at SOF:\n");
2704 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2705 hcd->frrem_samples, hcd->frrem_accum,
2706 (hcd->frrem_samples > 0) ?
2707 hcd->frrem_accum/hcd->frrem_samples : 0);
2708
2709 DWC_PRINT("\n");
2710 DWC_PRINT("Frame remaining at start_transfer (uframe 7):\n");
2711 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2712 hcd->core_if->hfnum_7_samples, hcd->core_if->hfnum_7_frrem_accum,
2713 (hcd->core_if->hfnum_7_samples > 0) ?
2714 hcd->core_if->hfnum_7_frrem_accum/hcd->core_if->hfnum_7_samples : 0);
2715 DWC_PRINT("Frame remaining at start_transfer (uframe 0):\n");
2716 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2717 hcd->core_if->hfnum_0_samples, hcd->core_if->hfnum_0_frrem_accum,
2718 (hcd->core_if->hfnum_0_samples > 0) ?
2719 hcd->core_if->hfnum_0_frrem_accum/hcd->core_if->hfnum_0_samples : 0);
2720 DWC_PRINT("Frame remaining at start_transfer (uframe 1-6):\n");
2721 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2722 hcd->core_if->hfnum_other_samples, hcd->core_if->hfnum_other_frrem_accum,
2723 (hcd->core_if->hfnum_other_samples > 0) ?
2724 hcd->core_if->hfnum_other_frrem_accum/hcd->core_if->hfnum_other_samples : 0);
2725
2726 DWC_PRINT("\n");
2727 DWC_PRINT("Frame remaining at sample point A (uframe 7):\n");
2728 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2729 hcd->hfnum_7_samples_a, hcd->hfnum_7_frrem_accum_a,
2730 (hcd->hfnum_7_samples_a > 0) ?
2731 hcd->hfnum_7_frrem_accum_a/hcd->hfnum_7_samples_a : 0);
2732 DWC_PRINT("Frame remaining at sample point A (uframe 0):\n");
2733 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2734 hcd->hfnum_0_samples_a, hcd->hfnum_0_frrem_accum_a,
2735 (hcd->hfnum_0_samples_a > 0) ?
2736 hcd->hfnum_0_frrem_accum_a/hcd->hfnum_0_samples_a : 0);
2737 DWC_PRINT("Frame remaining at sample point A (uframe 1-6):\n");
2738 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2739 hcd->hfnum_other_samples_a, hcd->hfnum_other_frrem_accum_a,
2740 (hcd->hfnum_other_samples_a > 0) ?
2741 hcd->hfnum_other_frrem_accum_a/hcd->hfnum_other_samples_a : 0);
2742
2743 DWC_PRINT("\n");
2744 DWC_PRINT("Frame remaining at sample point B (uframe 7):\n");
2745 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2746 hcd->hfnum_7_samples_b, hcd->hfnum_7_frrem_accum_b,
2747 (hcd->hfnum_7_samples_b > 0) ?
2748 hcd->hfnum_7_frrem_accum_b/hcd->hfnum_7_samples_b : 0);
2749 DWC_PRINT("Frame remaining at sample point B (uframe 0):\n");
2750 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2751 hcd->hfnum_0_samples_b, hcd->hfnum_0_frrem_accum_b,
2752 (hcd->hfnum_0_samples_b > 0) ?
2753 hcd->hfnum_0_frrem_accum_b/hcd->hfnum_0_samples_b : 0);
2754 DWC_PRINT("Frame remaining at sample point B (uframe 1-6):\n");
2755 DWC_PRINT(" samples %u, accum %llu, avg %llu\n",
2756 hcd->hfnum_other_samples_b, hcd->hfnum_other_frrem_accum_b,
2757 (hcd->hfnum_other_samples_b > 0) ?
2758 hcd->hfnum_other_frrem_accum_b/hcd->hfnum_other_samples_b : 0);
2759 #endif
2760 }
2761
2762 void dwc_otg_hcd_dump_state(dwc_otg_hcd_t *hcd)
2763 {
2764 #ifdef DEBUG
2765 int num_channels;
2766 int i;
2767 gnptxsts_data_t np_tx_status;
2768 hptxsts_data_t p_tx_status;
2769
2770 num_channels = hcd->core_if->core_params->host_channels;
2771 DWC_PRINT("\n");
2772 DWC_PRINT("************************************************************\n");
2773 DWC_PRINT("HCD State:\n");
2774 DWC_PRINT(" Num channels: %d\n", num_channels);
2775 for (i = 0; i < num_channels; i++) {
2776 dwc_hc_t *hc = hcd->hc_ptr_array[i];
2777 DWC_PRINT(" Channel %d:\n", i);
2778 DWC_PRINT(" dev_addr: %d, ep_num: %d, ep_is_in: %d\n",
2779 hc->dev_addr, hc->ep_num, hc->ep_is_in);
2780 DWC_PRINT(" speed: %d\n", hc->speed);
2781 DWC_PRINT(" ep_type: %d\n", hc->ep_type);
2782 DWC_PRINT(" max_packet: %d\n", hc->max_packet);
2783 DWC_PRINT(" data_pid_start: %d\n", hc->data_pid_start);
2784 DWC_PRINT(" multi_count: %d\n", hc->multi_count);
2785 DWC_PRINT(" xfer_started: %d\n", hc->xfer_started);
2786 DWC_PRINT(" xfer_buff: %p\n", hc->xfer_buff);
2787 DWC_PRINT(" xfer_len: %d\n", hc->xfer_len);
2788 DWC_PRINT(" xfer_count: %d\n", hc->xfer_count);
2789 DWC_PRINT(" halt_on_queue: %d\n", hc->halt_on_queue);
2790 DWC_PRINT(" halt_pending: %d\n", hc->halt_pending);
2791 DWC_PRINT(" halt_status: %d\n", hc->halt_status);
2792 DWC_PRINT(" do_split: %d\n", hc->do_split);
2793 DWC_PRINT(" complete_split: %d\n", hc->complete_split);
2794 DWC_PRINT(" hub_addr: %d\n", hc->hub_addr);
2795 DWC_PRINT(" port_addr: %d\n", hc->port_addr);
2796 DWC_PRINT(" xact_pos: %d\n", hc->xact_pos);
2797 DWC_PRINT(" requests: %d\n", hc->requests);
2798 DWC_PRINT(" qh: %p\n", hc->qh);
2799 if (hc->xfer_started) {
2800 hfnum_data_t hfnum;
2801 hcchar_data_t hcchar;
2802 hctsiz_data_t hctsiz;
2803 hcint_data_t hcint;
2804 hcintmsk_data_t hcintmsk;
2805 hfnum.d32 = dwc_read_reg32(&hcd->core_if->host_if->host_global_regs->hfnum);
2806 hcchar.d32 = dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]->hcchar);
2807 hctsiz.d32 = dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]->hctsiz);
2808 hcint.d32 = dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]->hcint);
2809 hcintmsk.d32 = dwc_read_reg32(&hcd->core_if->host_if->hc_regs[i]->hcintmsk);
2810 DWC_PRINT(" hfnum: 0x%08x\n", hfnum.d32);
2811 DWC_PRINT(" hcchar: 0x%08x\n", hcchar.d32);
2812 DWC_PRINT(" hctsiz: 0x%08x\n", hctsiz.d32);
2813 DWC_PRINT(" hcint: 0x%08x\n", hcint.d32);
2814 DWC_PRINT(" hcintmsk: 0x%08x\n", hcintmsk.d32);
2815 }
2816 if (hc->xfer_started && hc->qh && hc->qh->qtd_in_process) {
2817 dwc_otg_qtd_t *qtd;
2818 struct urb *urb;
2819 qtd = hc->qh->qtd_in_process;
2820 urb = qtd->urb;
2821 DWC_PRINT(" URB Info:\n");
2822 DWC_PRINT(" qtd: %p, urb: %p\n", qtd, urb);
2823 if (urb) {
2824 DWC_PRINT(" Dev: %d, EP: %d %s\n",
2825 usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe),
2826 usb_pipein(urb->pipe) ? "IN" : "OUT");
2827 DWC_PRINT(" Max packet size: %d\n",
2828 usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe)));
2829 DWC_PRINT(" transfer_buffer: %p\n", urb->transfer_buffer);
2830 DWC_PRINT(" transfer_dma: %p\n", (void *)urb->transfer_dma);
2831 DWC_PRINT(" transfer_buffer_length: %d\n", urb->transfer_buffer_length);
2832 DWC_PRINT(" actual_length: %d\n", urb->actual_length);
2833 }
2834 }
2835 }
2836 DWC_PRINT(" non_periodic_channels: %d\n", hcd->non_periodic_channels);
2837 DWC_PRINT(" periodic_channels: %d\n", hcd->periodic_channels);
2838 DWC_PRINT(" periodic_usecs: %d\n", hcd->periodic_usecs);
2839 np_tx_status.d32 = dwc_read_reg32(&hcd->core_if->core_global_regs->gnptxsts);
2840 DWC_PRINT(" NP Tx Req Queue Space Avail: %d\n", np_tx_status.b.nptxqspcavail);
2841 DWC_PRINT(" NP Tx FIFO Space Avail: %d\n", np_tx_status.b.nptxfspcavail);
2842 p_tx_status.d32 = dwc_read_reg32(&hcd->core_if->host_if->host_global_regs->hptxsts);
2843 DWC_PRINT(" P Tx Req Queue Space Avail: %d\n", p_tx_status.b.ptxqspcavail);
2844 DWC_PRINT(" P Tx FIFO Space Avail: %d\n", p_tx_status.b.ptxfspcavail);
2845 dwc_otg_hcd_dump_frrem(hcd);
2846 dwc_otg_dump_global_registers(hcd->core_if);
2847 dwc_otg_dump_host_registers(hcd->core_if);
2848 DWC_PRINT("************************************************************\n");
2849 DWC_PRINT("\n");
2850 #endif
2851 }
2852 #endif /* DWC_DEVICE_ONLY */