summaryrefslogtreecommitdiff
path: root/common/usbx_host_controllers/inc/ux_hcd_ehci.h
blob: eec2cb6308fae777d789314f04c13f534786eef1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
/***************************************************************************
 * Copyright (c) 2024 Microsoft Corporation
 * Copyright (c) 2026-present Eclipse ThreadX contributors
 *
 * This program and the accompanying materials are made available under the
 * terms of the MIT License which is available at
 * https://opensource.org/licenses/MIT.
 *
 * SPDX-License-Identifier: MIT
 **************************************************************************/


/**************************************************************************/
/**************************************************************************/
/**                                                                       */
/** USBX Component                                                        */
/**                                                                       */
/**   EHCI Controller                                                     */
/**                                                                       */
/**************************************************************************/
/**************************************************************************/


/**************************************************************************/
/*                                                                        */
/*  COMPONENT DEFINITION                                   RELEASE        */
/*                                                                        */
/*    ux_hcd_ehci.h                                       PORTABLE C      */
/*                                                           6.1.8        */
/*  AUTHOR                                                                */
/*                                                                        */
/*    Chaoqiong Xiao, Microsoft Corporation                               */
/*                                                                        */
/*  DESCRIPTION                                                           */
/*                                                                        */
/*    This file contains all the header and extern functions used by the  */
/*    USBX host EHCI Controller.                                          */
/*                                                                        */
/**************************************************************************/

#ifndef UX_HCD_EHCI_H
#define UX_HCD_EHCI_H

/* Determine if a C++ compiler is being used.  If so, ensure that standard
   C is used to process the API information.  */

#ifdef   __cplusplus

/* Yes, C++ compiler is present.  Use standard C.  */
extern   "C" {

#endif


/* Possible defined EHCI HCD extensions.  */

/* Extension for peripheral host mode select (function like).  */
/* #define UX_HCD_EHCI_EXT_USB_HOST_MODE_ENABLE(hcd_ehci) */

/* Extension for embedded TT (UX_TRUE/UX_FALSE).  */
/* #define UX_HCD_EHCI_EXT_EMBEDDED_TT_SUPPORT */

/* Extension for phy high speed mode select (function like).  */
/* #define UX_HCD_EHCI_EXT_USBPHY_HIGHSPEED_MODE_SET(hcd_ehci, on_off) */

/* Define EHCI generic definitions.  */

#define UX_EHCI_CONTROLLER                                  2
#define UX_EHCI_MAX_PAYLOAD                                 16384
#define UX_EHCI_FRAME_DELAY                                 4
#define UX_EHCI_PAGE_SIZE                                   4096
#define UX_EHCI_PAGE_ALIGN                                  0xfffff000


/* Define EHCI host controller capability registers.  */

#define EHCI_HCCR_CAP_LENGTH                                0x00
#define EHCI_HCCR_HCS_PARAMS                                0x01
#define EHCI_HCCR_HCC_PARAMS                                0x02
#define EHCI_HCCR_HCSP_PORT_ROUTE                           0x03


/* Define EHCI host controller registers.  */

#define EHCI_HCOR_USB_COMMAND                               (hcd_ehci -> ux_hcd_ehci_hcor + 0x00)
#define EHCI_HCOR_USB_STATUS                                (hcd_ehci -> ux_hcd_ehci_hcor + 0x01)
#define EHCI_HCOR_USB_INTERRUPT                             (hcd_ehci -> ux_hcd_ehci_hcor + 0x02)
#define EHCI_HCOR_FRAME_INDEX                               (hcd_ehci -> ux_hcd_ehci_hcor + 0x03)
#define EHCI_HCOR_FRAME_LIST_BASE_ADDRESS                   (hcd_ehci -> ux_hcd_ehci_hcor + 0x05)
#define EHCI_HCOR_ASYNCH_LIST_ADDRESS                       (hcd_ehci -> ux_hcd_ehci_hcor + 0x06)
#define EHCI_HCOR_CONFIG_FLAG                               (hcd_ehci -> ux_hcd_ehci_hcor + 0x10)
#define EHCI_HCOR_PORT_SC                                   (hcd_ehci -> ux_hcd_ehci_hcor + 0x11)


/* Define EHCI IO control register values.  */

#define EHCI_HC_IO_RS                                       0x00000001u
#define EHCI_HC_IO_HCRESET                                  0x00000002u
#define EHCI_HC_IO_PSE                                      0x00000010u
#define EHCI_HC_IO_ASE                                      0x00000020u
#define EHCI_HC_IO_IAAD                                     0x00000040u
#define EHCI_HC_IO_ITC                                      0x00010000u
#define EHCI_HC_IO_FRAME_SIZE_1024                          0x00000000u
#define EHCI_HC_IO_FRAME_SIZE_512                           0x00000004u
#define EHCI_HC_IO_FRAME_SIZE_256                           0x00000008u
#define EHCI_HC_IO_FRAME_SIZE_128                           0x0000000Cu
#define EHCI_HC_IO_FRAME_SIZE_64                            0x00008000u
#define EHCI_HC_IO_FRAME_SIZE_32                            0x00008004u

/* The number if entries in the periodic tree can be changed to save space IF and only IF the PFLF flag in the HCCPARAMS register
   allows it. Setting values less than 1024 in controllers without the ability to change the Frame List Size leads to a EHCI crash.  */

#ifndef UX_EHCI_FRAME_LIST_ENTRIES
#define UX_EHCI_FRAME_LIST_ENTRIES                          1024
#endif
#define UX_EHCI_FRAME_LIST_MASK                             EHCI_HC_IO_FRAME_SIZE_1024

/* Define EHCI HCOR status register.  */

#define EHCI_HC_STS_USB_INT                                 0x00000001u
#define EHCI_HC_STS_USB_ERR_INT                             0x00000002u
#define EHCI_HC_STS_PCD                                     0x00000004u
#define EHCI_HC_STS_FLR                                     0x00000008u
#define EHCI_HC_STS_HSE                                     0x00000010u
#define EHCI_HC_STS_IAA                                     0x00000020u
#define EHCI_HC_STS_HC_HALTED                               0x00001000u
#define EHCI_HC_STS_RECLAMATION                             0x00002000u
#define EHCI_HC_STS_PSS                                     0x00004000u
#define EHCI_HC_STS_ASS                                     0x00008000u

#define EHCI_HC_INTERRUPT_ENABLE_NORMAL                     (EHCI_HC_STS_USB_INT|EHCI_HC_STS_USB_ERR_INT|EHCI_HC_STS_PCD|EHCI_HC_STS_HSE|EHCI_HC_STS_IAA)


/* Define EHCI HCOR root HUB command/status.  */

#define EHCI_HC_RH_PPC                                      0x00000010u
#define EHCI_HC_RH_PSM                                      0x00000100u
#define EHCI_HC_RH_NPS                                      0x00000200u
#define EHCI_HC_RH_DT                                       0x00000400u
#define EHCI_HC_RH_OCPM                                     0x00000800u
#define EHCI_HC_RH_NOCP                                     0x00001000u

#define EHCI_HC_PS_CCS                                      0x00000001u
#define EHCI_HC_PS_CSC                                      0x00000002u
#define EHCI_HC_PS_PE                                       0x00000004u
#define EHCI_HC_PS_PEC                                      0x00000008u
#define EHCI_HC_PS_OCA                                      0x00000010u
#define EHCI_HC_PS_OCC                                      0x00000020u
#define EHCI_HC_PS_FPR                                      0x00000040u
#define EHCI_HC_PS_SUSPEND                                  0x00000080u
#define EHCI_HC_PS_PR                                       0x00000100u
#define EHCI_HC_PS_PP                                       0x00001000u
#define EHCI_HC_PS_SPEED_MASK                               0x00000c00u
#define EHCI_HC_PS_SPEED_LOW                                0x00000400u
#define EHCI_HC_PS_PO                                       0x00002000u
#define EHCI_HC_PS_EMBEDDED_TT_SPEED_MASK                   0x0c000000u
#define EHCI_HC_PS_EMBEDDED_TT_SPEED_FULL                   0x00000000u
#define EHCI_HC_PS_EMBEDDED_TT_SPEED_LOW                    0x04000000u
#define EHCI_HC_PS_EMBEDDED_TT_SPEED_HIGH                   0x08000000u

#define EHCI_HC_RH_POWER_STABLE_DELAY                       25
#define EHCI_HC_RH_RESET_DELAY                              50
#define EHCI_HC_RH_RESET_SETTLE_DELAY                       5


/* Define EHCI interrupt status register definitions.  */

#define EHCI_HC_INT_IE                                      0x00000001u
#define EHCI_HC_INT_EIE                                     0x00000002u
#define EHCI_HC_INT_PCIE                                    0x00000004u
#define EHCI_HC_INT_FLRE                                    0x00000008u
#define EHCI_HC_INT_HSER                                    0x00000010u
#define EHCI_HC_INT_IAAE                                    0x00000020u


/* Define EHCI frame interval definition.  */

#define EHCI_HC_FM_INTERVAL_CLEAR                           0x8000ffff
#define EHCI_HC_FM_INTERVAL_SET                             0x27780000


/* Define EHCI static definition.  */

#define UX_EHCI_AVAILABLE_BANDWIDTH                         6000
#define UX_EHCI_STOP                                        0
#define UX_EHCI_START                                       1
#define UX_EHCI_ROUTE_TO_LOCAL_HC                           1
#define UX_EHCI_INIT_DELAY                                  1000
#define UX_EHCI_RESET_RETRY                                 1000
#define UX_EHCI_RESET_DELAY                                 100
#define UX_EHCI_PORT_RESET_RETRY                            10
#define UX_EHCI_PORT_RESET_DELAY                            50


/* Define EHCI initialization values.  */

#define UX_EHCI_COMMAND_STATUS_RESET                        0
#define UX_EHCI_INIT_RESET_DELAY                            10


/* Define EHCI completion code errors.  */

#define UX_EHCI_NO_ERROR                                    0x00
#define UX_EHCI_ERROR_CRC                                   0x01
#define UX_EHCI_ERROR_BIT_STUFFING                          0x02
#define UX_EHCI_ERROR_DATA_TOGGLE                           0x03
#define UX_EHCI_ERROR_STALL                                 0x04
#define UX_EHCI_ERROR_DEVICE_NOT_RESPONDING                 0x05
#define UX_EHCI_ERROR_PID_FAILURE                           0x06
#define UX_EHCI_ERROR_DATA_OVERRUN                          0x08
#define UX_EHCI_ERROR_DATA_UNDERRUN                         0x09
#define UX_EHCI_ERROR_BUFFER_OVERRUN                        0x0c
#define UX_EHCI_ERROR_BUFFER_UNDERRUN                       0x0d
#define UX_EHCI_ERROR_NOT_ACCESSED                          0x0f
#define UX_EHCI_ERROR_NAK                                   0x10
#define UX_EHCI_ERROR_BABBLE                                0x11

/* EHCI general descriptor type (Link Pointer).  */

#define UX_EHCI_LP_MASK                                    (0xFFFFFFE0u) /* 32-byte align.  */

#define UX_EHCI_TYP_MASK                                   (0x3u<<1)
#define UX_EHCI_TYP_ITD                                    (0x0u<<1)
#define UX_EHCI_TYP_QH                                     (0x1u<<1)
#define UX_EHCI_TYP_SITD                                   (0x2u<<1)
#define UX_EHCI_TYP_FSTN                                   (0x3u<<1)

#define UX_EHCI_T                                          (0x1u<<0)

/* EHCI general descriptor type (Capabilities).  */

#define UX_EHCI_ENDPT_MASK                                 (0xFu<<8)
#define UX_EHCI_ENDPT_SHIFT                                (8)

#define UX_EHCI_DEVICE_ADDRESS_MASK                        (0x3Fu<<0)

#define UX_EHCI_CMASK_MASK                                 (0xFFu<<8)
#define UX_EHCI_CMASK_0                                    (0x01u<<8)
#define UX_EHCI_CMASK_1                                    (0x02u<<8)
#define UX_EHCI_CMASK_2                                    (0x04u<<8)
#define UX_EHCI_CMASK_3                                    (0x08u<<8)
#define UX_EHCI_CMASK_4                                    (0x10u<<8)
#define UX_EHCI_CMASK_5                                    (0x20u<<8)
#define UX_EHCI_CMASK_6                                    (0x40u<<8)
#define UX_EHCI_CMASK_7                                    (0x80u<<8)
#define UX_EHCI_CMASK_ISOOUT_ANY                           (0x00u<<8)
#define UX_EHCI_CMASK_INT_Y0                               (0x1Cu<<8)
#define UX_EHCI_CMASK_INT_Y1                               (0x31u<<8)
#define UX_EHCI_CMASK_INT_Y2                               (0x70u<<8)
#define UX_EHCI_CMASK_INT_Y3                               (0xE0u<<8)
#define UX_EHCI_CMASK_INT_Y4                               (0xC1u<<8)
#define UX_EHCI_CMASK_INT_Y5                               (0x81u<<8)
#define UX_EHCI_CMASK_INT_Y7                               (0x07u<<8)
#define UX_EHCI_CMASK_ISOIN_C1                             (0x01u<<8)
#define UX_EHCI_CMASK_ISOIN_C2                             (0x03u<<8)
#define UX_EHCI_CMASK_ISOIN_C3                             (0x07u<<8)
#define UX_EHCI_CMASK_ISOIN_C4                             (0x0Fu<<8)
#define UX_EHCI_CMASK_ISOIN_C5                             (0x1Fu<<8)
#define UX_EHCI_CMASK_ISOIN_C6                             (0x3Fu<<8)

#define UX_EHCI_SMASK_MASK                                 (0xFFu<<0)
#define UX_EHCI_SMASK_0                                    (0x01u<<0)
#define UX_EHCI_SMASK_1                                    (0x02u<<0)
#define UX_EHCI_SMASK_2                                    (0x04u<<0)
#define UX_EHCI_SMASK_3                                    (0x08u<<0)
#define UX_EHCI_SMASK_4                                    (0x10u<<0)
#define UX_EHCI_SMASK_5                                    (0x20u<<0)
#define UX_EHCI_SMASK_6                                    (0x40u<<0)
#define UX_EHCI_SMASK_7                                    (0x80u<<0)
#define UX_EHCI_SMASK_INTERVAL_1                           (0xFFu<<0)
#define UX_EHCI_SMASK_INTERVAL_2                           (0x55u<<0)
#define UX_EHCI_SMASK_INTERVAL_3                           (0x11u<<0)
#define UX_EHCI_SMASK_INTERVAL_4                           (0x01u<<0)


/* EHCI general descriptor type (Buffer pointer page part).  */

#define UX_EHCI_BP_MASK                                    (0xFFFFF000u) /* 4K align.  */

/* Define EHCI pointers.  */

typedef union UX_EHCI_POINTER_UNION {
    ULONG                               value;
    VOID                                *void_ptr;
    UCHAR                               *u8_ptr;
    USHORT                              *u16_ptr;
    ULONG                               *u32_ptr;
} UX_EHCI_POINTER;

typedef union UX_EHCI_LINK_POINTER_UNION {
    ULONG                               value;
    VOID                                *void_ptr;
    UCHAR                               *u8_ptr;
    USHORT                              *u16_ptr;
    ULONG                               *u32_ptr;
    struct UX_EHCI_ED_STRUCT            *qh_ptr;
    struct UX_EHCI_ED_STRUCT            *ed_ptr;
    struct UX_EHCI_TD_STRUCT            *td_ptr;
    struct UX_EHCI_HSISO_TD_STRUCT      *itd_ptr;
    struct UX_EHCI_FSISO_TD_STRUCT      *sitd_ptr;
} UX_EHCI_LINK_POINTER;

typedef union UX_EHCI_PERIODIC_LINK_POINTER_UNION {
    ULONG                               value;
    VOID                                *void_ptr;
    UCHAR                               *u8_ptr;
    USHORT                              *u16_ptr;
    ULONG                               *u32_ptr;
    struct UX_EHCI_ED_STRUCT            *qh_ptr;
    struct UX_EHCI_ED_STRUCT            *ed_ptr;
    struct UX_EHCI_HSISO_TD_STRUCT      *itd_ptr;
    struct UX_EHCI_FSISO_TD_STRUCT      *sitd_ptr;
} UX_EHCI_PERIODIC_LINK_POINTER;


/* Define the EHCI structure.  */

typedef struct UX_HCD_EHCI_STRUCT
{

    struct UX_HCD_STRUCT
                    *ux_hcd_ehci_hcd_owner;
    ULONG           ux_hcd_ehci_hcor;
    struct UX_EHCI_ED_STRUCT
                    **ux_hcd_ehci_frame_list;
    ULONG           *ux_hcd_ehci_base;
    UINT            ux_hcd_ehci_nb_root_hubs;
    struct UX_EHCI_TD_STRUCT
                    *ux_hcd_ehci_done_head;
    struct UX_EHCI_ED_STRUCT
                    *ux_hcd_ehci_ed_list;
    struct UX_EHCI_TD_STRUCT
                    *ux_hcd_ehci_td_list;
    struct UX_EHCI_FSISO_TD_STRUCT
                    *ux_hcd_ehci_fsiso_td_list;
    struct UX_EHCI_HSISO_TD_STRUCT
                    *ux_hcd_ehci_hsiso_td_list;
    struct UX_EHCI_ED_STRUCT
                    *ux_hcd_ehci_asynch_head_list;
    struct UX_EHCI_ED_STRUCT
                    *ux_hcd_ehci_asynch_first_list;
    struct UX_EHCI_ED_STRUCT
                    *ux_hcd_ehci_asynch_last_list;
    struct UX_EHCI_HSISO_TD_STRUCT
                    *ux_hcd_ehci_hsiso_scan_list;
    struct UX_EHCI_FSISO_TD_STRUCT
                    *ux_hcd_ehci_fsiso_scan_list;
    struct UX_TRANSFER_STRUCT
                    *ux_hcd_ehci_iso_done_transfer_head;
    struct UX_TRANSFER_STRUCT
                    *ux_hcd_ehci_iso_done_transfer_tail;
    struct UX_EHCI_ED_STRUCT
                    *ux_hcd_ehci_interrupt_ed_list;
    UX_MUTEX        ux_hcd_ehci_periodic_mutex;
    UX_SEMAPHORE    ux_hcd_ehci_protect_semaphore;
    UX_SEMAPHORE    ux_hcd_ehci_doorbell_semaphore;
    ULONG           ux_hcd_ehci_frame_list_size;
    ULONG           ux_hcd_ehci_interrupt_count;
    ULONG           ux_hcd_ehci_embedded_tt;
} UX_HCD_EHCI;


/* Define EHCI ED structure.  */

typedef struct UX_EHCI_ED_STRUCT
{

    struct UX_EHCI_ED_STRUCT
                    *ux_ehci_ed_queue_head;
    ULONG           ux_ehci_ed_cap0;
    ULONG           ux_ehci_ed_cap1;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_ed_current_td;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_ed_queue_element;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_ed_alternate_td;
    ULONG           ux_ehci_ed_state;
    VOID            *ux_ehci_ed_bp0;
    VOID            *ux_ehci_ed_bp1;
    VOID            *ux_ehci_ed_bp2;
    VOID            *ux_ehci_ed_bp3;
    VOID            *ux_ehci_ed_bp4;
    /* 12 DWords, 48 bytes QH for controller end.  */

    ULONG           ux_ehci_ed_status;
    struct UX_EHCI_ED_STRUCT
                    *ux_ehci_ed_next_ed;
    struct UX_EHCI_ED_STRUCT
                    *ux_ehci_ed_previous_ed;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_ed_first_td;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_ed_last_td;
    union {
        struct {                                            /* For anchor.  */
            struct UX_EHCI_ED_STRUCT
                    *ux_ehci_ed_next_anchor;                /* + 1 DWord.   */
            USHORT  ux_ehci_ed_microframe_load[8];          /* + 4 DWords.  */
            UCHAR   ux_ehci_ed_microframe_ssplit_count[8];  /* + 2 DWords.  */
        } ANCHOR;
        struct {                                            /* As interrupt ED.  */
            struct UX_EHCI_ED_STRUCT
                        *ux_ehci_ed_anchor;                 /* + 1 DWord.  */
            struct UX_ENDPOINT_STRUCT
                        *ux_ehci_ed_endpoint;               /* + 1 Dword.  */
        } INTR;
        struct {                                            /* Space: 7 DWord.  */
            ULONG       ux_ehci_ed_reserved[7];
        } RESERVED;
    } REF_AS;
    /* 24 DWord aligned.  */
} UX_EHCI_ED;


/* Define EHCI ED bitmap.  */

#define UX_EHCI_QH_TYP_ITD                                  0u
#define UX_EHCI_QH_TYP_QH                                   2u
#define UX_EHCI_QH_TYP_SITD                                 4u
#define UX_EHCI_QH_TYP_FSTN                                 6u

#define UX_EHCI_QH_T                                        1u

#define UX_EHCI_QH_STATIC                                   0x80000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_7                        0x40000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_6                        0x20000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_5                        0x10000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_4                        0x08000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_3                        0x04000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_2                        0x02000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_1                        0x01000000u
#define UX_EHCI_QH_SSPLIT_SCH_FULL_0                        0x00800000u

#define UX_EHCI_QH_MPS_LOC                                  16u
#define UX_EHCI_QH_MPS_MASK                                 0x07ff0000u
#define UX_EHCI_QH_NCR                                      0xf0000000u
#define UX_EHCI_QH_CEF                                      0x08000000u
#define UX_EHCI_QH_ED_AD_LOC                                8u
#define UX_EHCI_QH_HBPM                                     0x40000000u
#define UX_EHCI_QH_HBPM_LOC                                 30u
#define UX_EHCI_QH_HEAD                                     0x00008000u

#define UX_EHCI_QH_HIGH_SPEED                               0x00002000u
#define UX_EHCI_QH_LOW_SPEED                                0x00001000u

#define UX_EHCI_QH_HUB_ADDR_LOC                             16u
#define UX_EHCI_QH_PORT_NUMBER_LOC                          23u
#define UX_EHCI_QH_MULT_LOC                                 30u
#define UX_EHCI_QH_MULT_MASK                                0xc0000000u
#define UX_EHCI_QH_C_MASK                                   0x00001c00u
#define UX_EHCI_QH_IS_MASK                                  0x00000001u

#define UX_EHCI_QH_SMASK_MASK                               0x000000FFu
#define UX_EHCI_QH_SMASK_0                                  0x00000001u
#define UX_EHCI_QH_SMASK_1                                  0x00000002u
#define UX_EHCI_QH_SMASK_2                                  0x00000004u
#define UX_EHCI_QH_SMASK_3                                  0x00000008u
#define UX_EHCI_QH_SMASK_4                                  0x00000010u
#define UX_EHCI_QH_SMASK_5                                  0x00000020u
#define UX_EHCI_QH_SMASK_6                                  0x00000040u
#define UX_EHCI_QH_SMASK_7                                  0x00000080u

#define UX_EHCI_QH_DTC                                      0x00004000u
#define UX_EHCI_QH_TOGGLE                                   0x80000000u
#define UX_EHCI_LINK_ADDRESS_MASK                           0xfffffff0u
#define UX_EHCI_TOGGLE_0                                    0u
#define UX_EHCI_TOGGLE_1                                    0x80000000u

/* Define EHCI TD structure.  */

typedef struct UX_EHCI_TD_STRUCT
{

    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_td_link_pointer;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_td_alternate_link_pointer;
    ULONG           ux_ehci_td_control;
    VOID            *ux_ehci_td_bp0;
    VOID            *ux_ehci_td_bp1;
    VOID            *ux_ehci_td_bp2;
    VOID            *ux_ehci_td_bp3;
    VOID            *ux_ehci_td_bp4;
    /* 8-DWords, 32-bytes qTD for controller.  */
    struct UX_TRANSFER_STRUCT
                    *ux_ehci_td_transfer_request;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_td_next_td_transfer_request;
    struct UX_EHCI_ED_STRUCT
                    *ux_ehci_td_ed;
    ULONG           ux_ehci_td_length;
    ULONG           ux_ehci_td_status;
    ULONG           ux_ehci_td_phase;
    ULONG           ux_ehci_td_reserved_2[2];
    /* 16-DWord aligned.  */
} UX_EHCI_TD;


/* Define EHCI TD bitmap.  */

#define UX_EHCI_TD_T                                        1u
#define UX_EHCI_TD_LG_LOC                                   16u
#define UX_EHCI_TD_LG_MASK                                  0x7fffu
#define UX_EHCI_TD_IOC                                      0x00008000u
#define UX_EHCI_TD_CERR                                     0x00000c00u

#define UX_EHCI_TD_PING                                     1u
#define UX_EHCI_TD_DO_COMPLETE_SPLIT                        2u
#define UX_EHCI_TD_MISSED_MICRO_FRAMES                      4u
#define UX_EHCI_TD_TRANSACTION_ERROR                        8u
#define UX_EHCI_TD_BABBLE_DETECTED                          0x10u
#define UX_EHCI_TD_DATA_BUFFER_ERROR                        0x20u
#define UX_EHCI_TD_HALTED                                   0x40u
#define UX_EHCI_TD_ACTIVE                                   0x80u

#define UX_EHCI_PID_OUT                                     0x00000000u
#define UX_EHCI_PID_IN                                      0x00000100u
#define UX_EHCI_PID_SETUP                                   0x00000200u
#define UX_EHCI_PID_MASK                                    0x00000300u

#define  UX_EHCI_TD_SETUP_PHASE                             0x00010000u
#define  UX_EHCI_TD_DATA_PHASE                              0x00020000u
#define  UX_EHCI_TD_STATUS_PHASE                            0x00040000u

/* Define EHCI ISOCHRONOUS TD extension structure.  */

typedef struct UX_EHCI_HSISO_ED_STRUCT
{
    struct UX_ENDPOINT_STRUCT
                    *ux_ehci_hsiso_ed_endpoint;
    struct UX_EHCI_ED_STRUCT
                    *ux_ehci_hsiso_ed_anchor;
    struct UX_TRANSFER_STRUCT
                    *ux_ehci_hsiso_ed_transfer_head;
    struct UX_TRANSFER_STRUCT
                    *ux_ehci_hsiso_ed_transfer_tail;
    struct UX_TRANSFER_STRUCT
                    *ux_ehci_hsiso_ed_transfer_first_new;
    struct UX_EHCI_HSISO_TD_STRUCT
                    *ux_ehci_hsiso_ed_fr_td[4];
    UCHAR           ux_ehci_hsiso_ed_frindex;           /* 1st usable micro-frame.  */
    UCHAR           ux_ehci_hsiso_ed_frinterval;        /* Micro-frame interval.  */
    UCHAR           ux_ehci_hsiso_ed_frinterval_shift;  /* Shift for micro-frame interval.  */
    UCHAR           ux_ehci_hsiso_ed_nb_tds;
    USHORT          ux_ehci_hsiso_ed_frstart;           /* Start micro-frame.  */
    USHORT          ux_ehci_hsiso_ed_frload;
    USHORT          ux_ehci_hsiso_ed_fr_hc;             /* Micro-frame HC process count.  */
    USHORT          ux_ehci_hsiso_ed_fr_sw;             /* Micro-frame SW load count.  */
} UX_EHCI_HSISO_ED;

/* Define EHCI ISOCHRONOUS TD structure.  */

typedef struct UX_EHCI_HSISO_TD_STRUCT
{

    union UX_EHCI_PERIODIC_LINK_POINTER_UNION
                    ux_ehci_hsiso_td_next_lp;
    ULONG           ux_ehci_hsiso_td_control[8];
    VOID            *ux_ehci_hsiso_td_bp[7];
    /* 16 DWords, 64-bytes iTD for controller end.  */
    UCHAR           ux_ehci_hsiso_td_status;
    UCHAR           ux_ehci_hsiso_td_frload;            /* REQ load map.  */
    USHORT          ux_ehci_hsiso_td_max_trans_size;
    union UX_EHCI_PERIODIC_LINK_POINTER_UNION
                    ux_ehci_hsiso_td_previous_lp;
    struct UX_EHCI_HSISO_TD_STRUCT
                    *ux_ehci_hsiso_td_next_scan_td;
    struct UX_EHCI_HSISO_TD_STRUCT
                    *ux_ehci_hsiso_td_previous_scan_td;
    struct UX_TRANSFER_STRUCT
                    *ux_ehci_hsiso_td_fr_transfer[3];
    struct UX_EHCI_HSISO_ED_STRUCT
                    *ux_ehci_hsiso_td_ed;
    /* 24 DWord aligned.  */
} UX_EHCI_HSISO_TD;


/* Next Link Pointer(LP).  */

#define UX_EHCI_HSISO_LP_MASK                                  UX_EHCI_LP_MASK

#define UX_EHCI_HSISO_TYP_MASK                                 UX_EHCI_TYP_MASK
#define UX_EHCI_HSISO_TYP_ITD                                  UX_EHCI_TYP_ITD
#define UX_EHCI_HSISO_TYP_QH                                   UX_EHCI_TYP_QH
#define UX_EHCI_HSISO_TYP_SITD                                 UX_EHCI_TYP_SITD
#define UX_EHCI_HSISO_TYP_FSTN                                 UX_EHCI_TYP_FSTN

#define UX_EHCI_HSISO_T                                        UX_EHCI_T

/* Transaction Status and Control.  */

#define UX_EHCI_HSISO_STATUS_MASK                              0xF0000000u
#define UX_EHCI_HSISO_STATUS_ACTIVE                            0x80000000u
#define UX_EHCI_HSISO_STATUS_DATA_BUFFER_ERR                   0x40000000u
#define UX_EHCI_HSISO_STATUS_BABBLE_DETECTED                   0x20000000u
#define UX_EHCI_HSISO_STATUS_XACT_ERR                          0x10000000u

#define UX_EHCI_HSISO_XACT_LENGTH_MASK                         0x0FFF0000u
#define UX_EHCI_HSISO_XACT_LENGTH_SHIFT                        16
#define UX_EHCI_HSISO_XACT_LENGTH_VALUE_MAX                    0xC00

#define UX_EHCI_HSISO_IOC                                      0x00008000u
#define UX_EHCI_HSISO_IOC_SHIFT                                15

#define UX_EHCI_HSISO_PG_MASK                                  0x00007000u
#define UX_EHCI_HSISO_PG_SHIFT                                 12

#define UX_EHCI_HSISO_XACT_OFFSET_MASK                         0x00000FFFu

/* Buffer Page Pointer List.  */

#define UX_EHCI_HSISO_BP_MASK                                  UX_EHCI_BP_MASK

/* BP0  */

#define UX_EHCI_HSISO_ENDPT_MASK                               UX_EHCI_ENDPT_MASK
#define UX_EHCI_HSISO_ENDPT_SHIFT                              UX_EHCI_ENDPT_SHIFT

#define UX_EHCI_HSISO_DEVICE_ADDRESS_MASK                      UX_EHCI_DEVICE_ADDRESS_MASK

/* BP1  */

#define UX_EHCI_HSISO_DIRECTION                                (0x1u << 11)
#define UX_EHCI_HSISO_DIRECTION_IN                             UX_EHCI_HSISO_DIRECTION
#define UX_EHCI_HSISO_DIRECTION_OUT                            0

#define UX_EHCI_HSISO_MAX_PACKET_SIZE_MASK                     0x000007FFu
#define UX_EHCI_HSISO_MAX_PACKET_SIZE_MAX                      0x00000400

/* BP2  */

#define UX_EHCI_HSISO_MULTI_MASK                               0x00000003u
#define UX_EHCI_HSISO_MULTI_ONE                                1
#define UX_EHCI_HSISO_MULTI_TWO                                2
#define UX_EHCI_HSISO_MULTI_THREE                              3

/* Define EHCI FS ISOCHRONOUS TD structure.  */

typedef struct UX_EHCI_FSISO_TD_STRUCT
{
    union UX_EHCI_PERIODIC_LINK_POINTER_UNION
                    ux_ehci_fsiso_td_next_lp;
    ULONG           ux_ehci_fsiso_td_cap0;  /* endpoint */
    ULONG           ux_ehci_fsiso_td_cap1;  /* uFrame schedule */
    ULONG           ux_ehci_fsiso_td_state;
    VOID            *ux_ehci_fsiso_td_bp[2];
    VOID            *ux_ehci_fsiso_td_back_pointer;
    /* 7 DWords, 28-bytes siTD for controller end.  */

    UCHAR           ux_ehci_fsiso_td_status;
    UCHAR           ux_ehci_fsiso_td_frindex;
    UCHAR           ux_ehci_fsiso_td_nb_ed_tds;
    UCHAR           reserved[1];
    struct UX_ENDPOINT_STRUCT
                    *ux_ehci_fsiso_td_endpoint;
    struct UX_TRANSFER_STRUCT
                    *ux_ehci_fsiso_td_transfer_head;
    struct UX_TRANSFER_STRUCT
                    *ux_ehci_fsiso_td_transfer_tail;
    union UX_EHCI_PERIODIC_LINK_POINTER_UNION
                    ux_ehci_fsiso_td_previous_lp;
    struct UX_EHCI_FSISO_TD_STRUCT
                    *ux_ehci_fsiso_td_next_scan_td;
    struct UX_EHCI_FSISO_TD_STRUCT
                    *ux_ehci_fsiso_td_previous_scan_td;
    struct UX_EHCI_ED_STRUCT
                    *ux_ehci_fsiso_td_anchor;
    struct UX_EHCI_TD_STRUCT
                    *ux_ehci_fsiso_td_next_ed_td;
    /* 16-DWord aligned.  */
} UX_EHCI_FSISO_TD;

/* Next Link Pointer (LP).  */

#define UX_EHCI_FSISO_LP_MASK                              UX_EHCI_LP_MASK

#define UX_EHCI_FSISO_TYP_MASK                             UX_EHCI_TYP_MASK
#define UX_EHCI_FSISO_TYP_ITD                              UX_EHCI_TYP_ITD
#define UX_EHCI_FSISO_TYP_QH                               UX_EHCI_TYP_QH
#define UX_EHCI_FSISO_TYP_SITD                             UX_EHCI_TYP_SITD
#define UX_EHCI_FSISO_TYP_FSTN                             UX_EHCI_TYP_FSTN

#define UX_EHCI_FSISO_T                                    UX_EHCI_T

/* Endpoint Capabilities/Characteristics.  */

#define UX_EHCI_FSISO_DIRECTION                            0x80000000u
#define UX_EHCI_FSISO_DIRECTION_IN                         0x80000000u
#define UX_EHCI_FSISO_DIRECTION_OUT                        0x00000000

#define UX_EHCI_FSISO_PORT_NUMBER_MASK                     0x7F000000u
#define UX_EHCI_FSISO_PORT_NUMBER_SHIFT                    24

#define UX_EHCI_FSISO_HUB_ADDRESS_MASK                     0x003F0000u
#define UX_EHCI_FSISO_HUB_ADDRESS_SHIFT                    16

#define UX_EHCI_FSISO_ENDPT_MASK                           UX_EHCI_ENDPT_MASK
#define UX_EHCI_FSISO_ENDPT_SHIFT                          UX_EHCI_ENDPT_SHIFT

#define UX_EHCI_FSISO_DEVICE_ADDRESS_MASK                  UX_EHCI_DEVICE_ADDRESS_MASK

/* Micro-frame Schedule Control.  */

#define UX_EHCI_FSISO_UFRAME_CMASK_MASK                    UX_EHCI_CMASK_MASK
#define UX_EHCI_FSISO_UFRAME_CMASK_0                       UX_EHCI_CMASK_0
#define UX_EHCI_FSISO_UFRAME_CMASK_1                       UX_EHCI_CMASK_1
#define UX_EHCI_FSISO_UFRAME_CMASK_2                       UX_EHCI_CMASK_2
#define UX_EHCI_FSISO_UFRAME_CMASK_3                       UX_EHCI_CMASK_3
#define UX_EHCI_FSISO_UFRAME_CMASK_4                       UX_EHCI_CMASK_4
#define UX_EHCI_FSISO_UFRAME_CMASK_5                       UX_EHCI_CMASK_5
#define UX_EHCI_FSISO_UFRAME_CMASK_6                       UX_EHCI_CMASK_6
#define UX_EHCI_FSISO_UFRAME_CMASK_7                       UX_EHCI_CMASK_7

#define UX_EHCI_FSISO_UFRAME_SMASK_MASK                    UX_EHCI_SMASK_MASK
#define UX_EHCI_FSISO_UFRAME_SMASK_0                       UX_EHCI_SMASK_0
#define UX_EHCI_FSISO_UFRAME_SMASK_1                       UX_EHCI_SMASK_1
#define UX_EHCI_FSISO_UFRAME_SMASK_2                       UX_EHCI_SMASK_2
#define UX_EHCI_FSISO_UFRAME_SMASK_3                       UX_EHCI_SMASK_3
#define UX_EHCI_FSISO_UFRAME_SMASK_4                       UX_EHCI_SMASK_4
#define UX_EHCI_FSISO_UFRAME_SMASK_5                       UX_EHCI_SMASK_5
#define UX_EHCI_FSISO_UFRAME_SMASK_6                       UX_EHCI_SMASK_6
#define UX_EHCI_FSISO_UFRAME_SMASK_7                       UX_EHCI_SMASK_7

/* Transfer State.  */

/* Transfer Status and Control.  */

#define UX_EHCI_FSISO_IOC                                  0x80000000u

#define UX_EHCI_FSISO_P                                    0x40000000u

#define UX_EHCI_FSISO_TOTAL_BYTES_MASK                     0x03FF0000u
#define UX_EHCI_FSISO_TOTAL_BYTES_SHIFT                    16
#define UX_EHCI_FSISO_TOTAL_BYTES_MAX_VALUE                1023

#define UX_EHCI_FSISO_CPROMASK_MASK                        0x0000FF00u
#define UX_EHCI_FSISO_CPROMASK_SHIFT                       8

#define UX_EHCI_FSISO_STATUS_MASK                          0x000000FFu
#define UX_EHCI_FSISO_STATUS_ACTIVE                        0x00000080u
#define UX_EHCI_FSISO_STATUS_ERR                           0x00000040u
#define UX_EHCI_FSISO_STATUS_DATA_BUFFER_ERR               0x00000020u
#define UX_EHCI_FSISO_STATUS_BABBLE_DETECTED               0x00000010u
#define UX_EHCI_FSISO_STATUS_XACTERR                       0x00000008u
#define UX_EHCI_FSISO_STATUS_MISSED_MFRAME                 0x00000004u

#define UX_EHCI_FSISO_STATUS_SPLIT_STATE_MASK              0x00000002u
#define UX_EHCI_FSISO_STATUS_SPLIT_STATE_DO_START          0x00000000u
#define UX_EHCI_FSISO_STATUS_SPLIT_STATE_DO_COMPLETE       0x00000002u

/* Buffer Page Pointer List.  */

#define UX_EHCI_FSISO_BP_MASK                              UX_EHCI_BP_MASK

/* BP0  */

#define UX_EHCI_FSISO_CURRENT_OFFSET_MASK                  0x00000FFFu

/* BP1  */

#define UX_EHCI_FSISO_TP_MASK                              0x0000000Cu
#define UX_EHCI_FSISO_TP_ALL                               0x00000000u
#define UX_EHCI_FSISO_TP_BEGIN                             0x00000004u
#define UX_EHCI_FSISO_TP_MID                               0x00000008u
#define UX_EHCI_FSISO_TP_END                               0x0000000Cu

#define UX_EHCI_FSISO_TCOUNT_MASK                          0x00000007u
#define UX_EHCI_FSISO_TCOUNT_MAX                           6


/* Define EHCI function prototypes.  */

void _ux_hcd_ehci_periodic_descriptor_link(VOID* prev, VOID* prev_next, VOID* next_prev, VOID* next);
UX_EHCI_TD          *_ux_hcd_ehci_asynch_td_process(UX_EHCI_ED *ed, UX_EHCI_TD *td);
UX_EHCI_HSISO_TD    *_ux_hcd_ehci_hsisochronous_tds_process(UX_HCD_EHCI *hcd_ehci, UX_EHCI_HSISO_TD* itd);
UX_EHCI_FSISO_TD    *_ux_hcd_ehci_fsisochronous_tds_process(UX_HCD_EHCI *hcd_ehci, UX_EHCI_FSISO_TD* sitd);
UINT    _ux_hcd_ehci_asynchronous_endpoint_create(UX_HCD_EHCI *hcd_ehci, UX_ENDPOINT *endpoint);
UINT    _ux_hcd_ehci_asynchronous_endpoint_destroy(UX_HCD_EHCI *hcd_ehci, UX_ENDPOINT *endpoint);
UINT    _ux_hcd_ehci_controller_disable(UX_HCD_EHCI *hcd_ehci);
VOID    _ux_hcd_ehci_done_queue_process(UX_HCD_EHCI *hcd_ehci);
VOID    _ux_hcd_ehci_door_bell_wait(UX_HCD_EHCI *hcd_ehci);
UINT    _ux_hcd_ehci_ed_clean(UX_EHCI_ED *ed);
UX_EHCI_ED          *_ux_hcd_ehci_ed_obtain(UX_HCD_EHCI *hcd_ehci);
UINT    _ux_hcd_ehci_endpoint_reset(UX_HCD_EHCI *hcd_ehci, UX_ENDPOINT *endpoint);
UINT    _ux_hcd_ehci_entry(UX_HCD *hcd, UINT function, VOID *parameter);
UINT    _ux_hcd_ehci_frame_number_get(UX_HCD_EHCI *hcd_ehci, ULONG *frame_number);
VOID    _ux_hcd_ehci_frame_number_set(UX_HCD_EHCI *hcd_ehci, ULONG frame_number);
UX_EHCI_FSISO_TD    *_ux_hcd_ehci_fsisochronous_td_obtain(UX_HCD_EHCI *hcd_ehci);
UX_EHCI_HSISO_TD    *_ux_hcd_ehci_hsisochronous_td_obtain(UX_HCD_EHCI *hcd_ehci);
UINT    _ux_hcd_ehci_initialize(UX_HCD *hcd);
UINT    _ux_hcd_ehci_interrupt_endpoint_create(UX_HCD_EHCI *hcd_ehci, UX_ENDPOINT *endpoint);
UINT    _ux_hcd_ehci_interrupt_endpoint_destroy(UX_HCD_EHCI *hcd_ehci, UX_ENDPOINT *endpoint);
VOID    _ux_hcd_ehci_interrupt_handler(VOID);
UINT    _ux_hcd_ehci_isochronous_endpoint_create(UX_HCD_EHCI *hcd_ehci, UX_ENDPOINT *endpoint);
UINT    _ux_hcd_ehci_isochronous_endpoint_destroy(UX_HCD_EHCI *hcd_ehci, UX_ENDPOINT *endpoint);
UX_EHCI_ED          *_ux_hcd_ehci_least_traffic_list_get(UX_HCD_EHCI *hcd_ehci, ULONG microframe_load[8], ULONG microframe_ssplit_count[8]);
UX_EHCI_ED          *_ux_hcd_ehci_poll_rate_entry_get(UX_HCD_EHCI *hcd_ehci, UX_EHCI_ED *ed_list, ULONG poll_depth);
VOID    _ux_hcd_ehci_next_td_clean(UX_EHCI_TD *td);
UINT    _ux_hcd_ehci_periodic_tree_create(UX_HCD_EHCI *hcd_ehci);
UINT    _ux_hcd_ehci_port_disable(UX_HCD_EHCI *hcd_ehci, ULONG port_index);
UINT    _ux_hcd_ehci_port_reset(UX_HCD_EHCI *hcd_ehci, ULONG port_index);
UINT    _ux_hcd_ehci_port_resume(UX_HCD_EHCI *hcd_ehci, UINT port_index);
ULONG   _ux_hcd_ehci_port_status_get(UX_HCD_EHCI *hcd_ehci, ULONG port_index);
UINT    _ux_hcd_ehci_port_suspend(UX_HCD_EHCI *hcd_ehci, ULONG port_index);
UINT    _ux_hcd_ehci_power_down_port(UX_HCD_EHCI *hcd_ehci, ULONG port_index);
UINT    _ux_hcd_ehci_power_on_port(UX_HCD_EHCI *hcd_ehci, ULONG port_index);
VOID    _ux_hcd_ehci_power_root_hubs(UX_HCD_EHCI *hcd_ehci);
ULONG   _ux_hcd_ehci_register_read(UX_HCD_EHCI *hcd_ehci, ULONG ehci_register);
VOID    _ux_hcd_ehci_register_write(UX_HCD_EHCI *hcd_ehci, ULONG ehci_register, ULONG value);
UX_EHCI_TD          *_ux_hcd_ehci_regular_td_obtain(UX_HCD_EHCI *hcd_ehci);
UINT    _ux_hcd_ehci_request_bulk_transfer(UX_HCD_EHCI *hcd_ehci, UX_TRANSFER *transfer_request);
UINT    _ux_hcd_ehci_request_control_transfer(UX_HCD_EHCI *hcd_ehci, UX_TRANSFER *transfer_request);
UINT    _ux_hcd_ehci_request_interrupt_transfer(UX_HCD_EHCI *hcd_ehci, UX_TRANSFER *transfer_request);
UINT    _ux_hcd_ehci_request_isochronous_transfer(UX_HCD_EHCI *hcd_ehci, UX_TRANSFER *transfer_request);
UINT    _ux_hcd_ehci_request_transfer(UX_HCD_EHCI *hcd_ehci, UX_TRANSFER *transfer_request);
UINT    _ux_hcd_ehci_request_transfer_add(UX_HCD_EHCI *hcd_ehci, UX_EHCI_ED *ed, ULONG phase, ULONG pid,
                                    ULONG toggle, UCHAR * buffer_address, ULONG buffer_length, UX_TRANSFER *transfer_request);
UINT    _ux_hcd_ehci_transfer_abort(UX_HCD_EHCI *hcd_ehci,UX_TRANSFER *transfer_request);
VOID    _ux_hcd_ehci_transfer_request_process(UX_TRANSFER *transfer_request);

#define ux_hcd_ehci_initialize                      _ux_hcd_ehci_initialize
#define ux_hcd_ehci_interrupt_handler               _ux_hcd_ehci_interrupt_handler

/* Determine if a C++ compiler is being used.  If so, complete the standard
   C conditional started above.  */
#ifdef __cplusplus
}
#endif

#endif