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