1b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri/** @file
2b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
3b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  Copyright (c) 2015-2016, Linaro Limited. All rights reserved.
4b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
5b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  This program and the accompanying materials
6b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  are licensed and made available under the terms and conditions of the BSD License
7b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  which accompanies this distribution.  The full text of the license may be found at
8b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  http://opensource.org/licenses/bsd-license.php
9b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
10b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
13b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri**/
14b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
15b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri#include "DwUsbHostDxe.h"
16b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri#include "DwcHw.h"
17b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
18b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_USB_PCIIO_DEVICE_PATH DwHcDevicePath =
19b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
20b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  {
21b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri    { ACPI_DEVICE_PATH, ACPI_DP, { sizeof (ACPI_HID_DEVICE_PATH), 0 } },
22b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri    EISA_PNP_ID(0x0A03),  // HID
23b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri    0                     // UID
24b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  },
25b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  {
26b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri    { HARDWARE_DEVICE_PATH, HW_PCI_DP, { sizeof (PCI_DEVICE_PATH), 0 } },
27b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri    0,
28b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri    0
29b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  },
30b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0} }
31b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri};
32b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
33b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID DwHcInit (IN DWUSB_OTGHC_DEV *DwHc);
34b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID DwCoreInit (IN DWUSB_OTGHC_DEV *DwHc);
35b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
36d3862b27437942119994801f19365e63100374e4Shivamurthy ShastriSTATIC DW_USB_PROTOCOL          *DwUsb;
37d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri
38b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriUINT32
39b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriWait4Bit (
40b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT32     Reg,
41b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT32     Mask,
42b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN BOOLEAN    Set
43b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
44b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
45b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32  Timeout = 1000000;
46b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32  Value;
47b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
48b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        while (--Timeout) {
49b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                Value = MmioRead32 (Reg);
50b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                if (!Set)
51b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        Value = ~Value;
52b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
53b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                if ((Value & Mask) == Mask)
54b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        return 0;
55b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
56b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                MicroSecondDelay (1);
57b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
58b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
59b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DEBUG ((EFI_D_ERROR, "Wait4Bit: Timeout (Reg:0x%x, mask:0x%x, wait_set:%d)\n", Reg, Mask, Set));
60b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
61b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        return 1;
62b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
63b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
64b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriUINT32
65b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriWait4Chhltd (
66b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV	*DwHc,
67b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT32		*Sub,
68b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT32		*Toggle,
69b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN BOOLEAN		IgnoreAck
70b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
71b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
72b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32	HcintCompHltAck = DWC2_HCINT_XFERCOMP | DWC2_HCINT_CHHLTD;
73b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	INT32	Ret;
74b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32	Hcint, Hctsiz;
75b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
76b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MicroSecondDelay (100);
77b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Ret = Wait4Bit (DwHc->DwUsbBase + HCINT(DWC2_HC_CHANNEL), DWC2_HCINT_CHHLTD, 1);
78b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Ret)
79b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return Ret;
80b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
81b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MicroSecondDelay (100);
82b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Hcint = MmioRead32 (DwHc->DwUsbBase + HCINT(DWC2_HC_CHANNEL));
83b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hcint & (DWC2_HCINT_NAK | DWC2_HCINT_FRMOVRUN)) {
84b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		DEBUG ((EFI_D_INFO, "Wait4Chhltd: ERROR\n"));
85b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return 1;
86b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
87b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
88b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (IgnoreAck)
89b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Hcint &= ~DWC2_HCINT_ACK;
90b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	else
91b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		HcintCompHltAck |= DWC2_HCINT_ACK;
92b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
93b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hcint != HcintCompHltAck) {
94b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		DEBUG ((EFI_D_ERROR, "Wait4Chhltd: HCINT Error 0x%x\n", Hcint));
95b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return 1;
96b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
97b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
98b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Hctsiz = MmioRead32 (DwHc->DwUsbBase + HCTSIZ(DWC2_HC_CHANNEL));
99b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*Sub = (Hctsiz & DWC2_HCTSIZ_XFERSIZE_MASK) >> DWC2_HCTSIZ_XFERSIZE_OFFSET;
100b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*Toggle = (Hctsiz & DWC2_HCTSIZ_PID_MASK) >> DWC2_HCTSIZ_PID_OFFSET;
101b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
102b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return 0;
103b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
104b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
105b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
106b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwOtgHcInit (
107b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV	*DwHc,
108b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT8		HcNum,
109b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT8		DevAddr,
110b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT8		Endpoint,
111b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT8		EpDir,
112b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT8		EpType,
113b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT16		MaxPacket
114b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
115b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
116b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32	Hcchar = (DevAddr << DWC2_HCCHAR_DEVADDR_OFFSET) |
117b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			(Endpoint << DWC2_HCCHAR_EPNUM_OFFSET) |
118b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			(EpDir << DWC2_HCCHAR_EPDIR_OFFSET) |
119b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			(EpType << DWC2_HCCHAR_EPTYPE_OFFSET) |
120b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			(MaxPacket << DWC2_HCCHAR_MPS_OFFSET);
121b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
122b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + HCINT(HcNum), 0x3FFF);
123b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
124b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + HCCHAR(HcNum), Hcchar);
125b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
126b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + HCSPLT(HcNum), 0);
127b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
128b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
129b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
130b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwCoreReset (
131b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV *DwHc
132b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
133b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
134b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32  Status;
135b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
136b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Status = Wait4Bit (DwHc->DwUsbBase + GRSTCTL, DWC2_GRSTCTL_AHBIDLE, 1);
137b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (Status)
138b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                DEBUG ((EFI_D_ERROR, "DwCoreReset: Timeout!\n"));
139b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
140b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MmioWrite32 (DwHc->DwUsbBase + GRSTCTL, DWC2_GRSTCTL_CSFTRST);
141b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
142b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Status = Wait4Bit (DwHc->DwUsbBase + GRSTCTL, DWC2_GRSTCTL_CSFTRST, 0);
143b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (Status)
144b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                DEBUG ((EFI_D_ERROR, "DwCoreReset: Timeout!\n"));
145b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
146b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MicroSecondDelay (100000);
147b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
148b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
149b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
150b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcTransfer (
151b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN     DWUSB_OTGHC_DEV	*DwHc,
152b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN     UINT8			DeviceAddress,
153b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN     UINTN			MaximumPacketLength,
154b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN OUT UINT32			*Pid,
155b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN     UINT32			TransferDirection,
156b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN OUT VOID			*Data,
157b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN OUT UINTN			*DataLength,
158b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN     UINT32			EpAddress,
159b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN     UINT32			EpType,
160b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT    UINT32			*TransferResult,
161b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN     BOOLEAN		IgnoreAck
162b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
163b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
164b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32                          TxferLen;
165b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32                          Done = 0;
166b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32                          NumPackets;
167b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32                          Sub;
168b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32                          Ret = 0;
169b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UINT32                          StopTransfer = 0;
170b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        EFI_STATUS                      Status = EFI_SUCCESS;
171b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
172b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        do {
173b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                DwOtgHcInit (DwHc, DWC2_HC_CHANNEL, DeviceAddress, EpAddress, TransferDirection, EpType, MaximumPacketLength);
174b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
175b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                TxferLen = *DataLength - Done;
176b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                if (TxferLen > DWC2_MAX_TRANSFER_SIZE)
177b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        TxferLen = DWC2_MAX_TRANSFER_SIZE - MaximumPacketLength + 1;
178b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                if (TxferLen > DWC2_DATA_BUF_SIZE)
179b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        TxferLen = DWC2_DATA_BUF_SIZE - MaximumPacketLength + 1;
180b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
181b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                if (TxferLen > 0) {
182b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        NumPackets = (TxferLen + MaximumPacketLength - 1) / MaximumPacketLength;
183b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        if (NumPackets > DWC2_MAX_PACKET_COUNT) {
184b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                NumPackets = DWC2_MAX_PACKET_COUNT;
185b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                TxferLen = NumPackets * MaximumPacketLength;
186b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        }
187b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                } else {
188b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        NumPackets = 1;
189b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                }
190b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
191b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                if (TransferDirection)
192b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	                TxferLen = NumPackets * MaximumPacketLength;
193b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
194b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                MmioWrite32 (DwHc->DwUsbBase + HCTSIZ(DWC2_HC_CHANNEL), (TxferLen << DWC2_HCTSIZ_XFERSIZE_OFFSET) |
195b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                        (NumPackets << DWC2_HCTSIZ_PKTCNT_OFFSET) |
196b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                        (*Pid << DWC2_HCTSIZ_PID_OFFSET));
197b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
198b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if (!TransferDirection) {
199b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			CopyMem (DwHc->AlignedBuffer, Data+Done, *DataLength);
200b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		}
201b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
202b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                MmioWrite32 (DwHc->DwUsbBase + HCDMA(DWC2_HC_CHANNEL), (UINTN)DwHc->AlignedBuffer);
203b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
204b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                MmioAndThenOr32 (DwHc->DwUsbBase + HCCHAR(DWC2_HC_CHANNEL), ~(DWC2_HCCHAR_MULTICNT_MASK |
205b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                                                DWC2_HCCHAR_CHEN |
206b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri										DWC2_HCCHAR_CHDIS),
207b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri									     ((1 << DWC2_HCCHAR_MULTICNT_OFFSET) |
208b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri										DWC2_HCCHAR_CHEN));
209b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
210b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                Ret = Wait4Chhltd (DwHc, &Sub, Pid, IgnoreAck);
211b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                if (Ret) {
212b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        *TransferResult = EFI_USB_ERR_STALL;
213b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        Status = EFI_DEVICE_ERROR;
214b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        break;
215b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                }
216b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
217b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if (TransferDirection) {
218b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	                TxferLen -= Sub;
219b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	                CopyMem (Data+Done, DwHc->AlignedBuffer, TxferLen);
220b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	                if (Sub)
221b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		                StopTransfer = 1;
222b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		}
223b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
224b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                Done += TxferLen;
225b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        } while (Done < *DataLength && !StopTransfer);
226b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
227b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MmioWrite32 (DwHc->DwUsbBase + HCINTMSK(DWC2_HC_CHANNEL), 0);
228b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MmioWrite32 (DwHc->DwUsbBase + HCINT(DWC2_HC_CHANNEL), 0xFFFFFFFF);
229b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
230b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*DataLength = Done;
231b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
232b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        return Status;
233b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
234b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
235b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri/**
236b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_USB2_HC_PROTOCOL APIs
237b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri**/
238b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
239b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
240b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
241b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcGetCapability (
242b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL  *This,
243b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT UINT8                 *MaxSpeed,
244b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT UINT8                 *PortNumber,
245b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT UINT8                 *Is64BitCapable
246b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
247b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
248b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((MaxSpeed == NULL) || (PortNumber == NULL) || (Is64BitCapable == NULL)) {
249b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
250b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
251b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
252b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*MaxSpeed = EFI_USB_SPEED_HIGH;
253b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*PortNumber = 1;
254b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*Is64BitCapable = 1;
255b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
256b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_SUCCESS;
257b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
258b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
259b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
260b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
261b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcReset (
262b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN EFI_USB2_HC_PROTOCOL *This,
263b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN UINT16               Attributes
264b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
265b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
266b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV	*DwHc;
267d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        EFI_STATUS       Status;
268d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        UINT8            UsbMode;
269b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
270b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
271b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
272d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        //Mode: 1 for device, 0 for Host
273d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        UsbMode = USB_HOST_MODE;
274d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        Status = DwUsb->PhyInit(UsbMode);
275d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        if (EFI_ERROR(Status)) {
276d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri           return Status;
277d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        }
278d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri
279b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwCoreInit(DwHc);
280b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHcInit(DwHc);
281b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
282b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MmioAndThenOr32 (DwHc->DwUsbBase + HPRT0,
283b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
284b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                  DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG),
285b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                  DWC2_HPRT0_PRTRST);
286b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
287b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MicroSecondDelay (50000);
288b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
289b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MmioAnd32 (DwHc->DwUsbBase + HPRT0, ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
290b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG |
291b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                DWC2_HPRT0_PRTRST));
292b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
293b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_SUCCESS;
294b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
295b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
296b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
297b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
298b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcGetState (
299b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN   EFI_USB2_HC_PROTOCOL  *This,
300b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT  EFI_USB_HC_STATE      *State
301b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
302b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
303b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV	*DwHc;
304b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
305b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
306b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
307b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*State = DwHc->DwHcState;
308b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
309b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_SUCCESS;
310b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
311b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
312b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
313b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
314b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcSetState (
315b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN EFI_USB2_HC_PROTOCOL *This,
316b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN EFI_USB_HC_STATE     State
317b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
318b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
319b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV *DwHc;
320b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
321b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
322b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
323b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc->DwHcState = State;
324b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
325b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_SUCCESS;
326b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
327b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
328b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
329b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
330b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcGetRootHubPortStatus (
331b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN   EFI_USB2_HC_PROTOCOL  *This,
332b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN   UINT8                 PortNumber,
333b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT  EFI_USB_PORT_STATUS   *PortStatus
334b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
335b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
336b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV	*DwHc;
337b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32		Hprt0;
338b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
339b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (PortNumber > DWC2_HC_CHANNEL)
340b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                return EFI_INVALID_PARAMETER;
341b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
342b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (PortStatus == NULL)
343b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
344b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
345b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
346b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
347b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	PortStatus->PortStatus = 0;
348b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	PortStatus->PortChangeStatus = 0;
349b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
350b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
351b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTCONNSTS) {
352b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortStatus |= USB_PORT_STAT_CONNECTION;
353b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
354b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
355b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTENA) {
356b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortStatus |= USB_PORT_STAT_ENABLE;
357b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
358b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
359b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTSUSP) {
360b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortStatus |= USB_PORT_STAT_SUSPEND;
361b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
362b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
363b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTOVRCURRACT) {
364b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortStatus |= USB_PORT_STAT_OVERCURRENT;
365b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
366b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
367b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTRST) {
368b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortStatus |= USB_PORT_STAT_RESET;
369b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
370b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
371b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTPWR) {
372b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortStatus |= USB_PORT_STAT_POWER;
373b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
374b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
375b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED;
376b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
377b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTENCHNG) {
378b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri//		PortStatus->PortChangeStatus |= USB_PORT_STAT_C_ENABLE;
379b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
380b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
381b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTCONNDET) {
382b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortChangeStatus |= USB_PORT_STAT_C_CONNECTION;
383b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
384b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
385b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Hprt0 & DWC2_HPRT0_PRTOVRCURRCHNG) {
386b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		PortStatus->PortChangeStatus |= USB_PORT_STAT_C_OVERCURRENT;
387b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
388b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
389b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_SUCCESS;
390b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
391b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
392b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
393b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
394b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcSetRootHubPortFeature (
395b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL  *This,
396b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                 PortNumber,
397b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB_PORT_FEATURE  PortFeature
398b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
399b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
400b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV		*DwHc;
401b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32			Hprt0;
402b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EFI_STATUS		Status = EFI_SUCCESS;
403b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
404b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (PortNumber > DWC2_HC_CHANNEL) {
405b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                Status = EFI_INVALID_PARAMETER;
406b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                goto End;
407b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
408b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
409b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
410b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
411b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	switch (PortFeature) {
412b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortEnable:
413b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
414b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortSuspend:
415b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
416b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
417b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG);
418b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 |= DWC2_HPRT0_PRTSUSP;
419b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
420b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
421b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortReset:
422b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        MmioAndThenOr32 (DwHc->DwUsbBase + HPRT0,
423b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
424b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG),
425b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                                DWC2_HPRT0_PRTRST);
426b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        MicroSecondDelay (50000);
427b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        MmioAnd32 (DwHc->DwUsbBase + HPRT0, ~DWC2_HPRT0_PRTRST);
428b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
429b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortPower:
430b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
431b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
432b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG);
433b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 |= DWC2_HPRT0_PRTPWR;
434b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
435b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
436b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortOwner:
437b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
438b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		default:
439b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Status = EFI_INVALID_PARAMETER;
440b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
441b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
442b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
443b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEnd:
444b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
445b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
446b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
447b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
448b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
449b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcClearRootHubPortFeature (
450b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL  *This,
451b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                 PortNumber,
452b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB_PORT_FEATURE  PortFeature
453b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
454b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
455b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV		*DwHc;
456b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32			Hprt0;
457b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EFI_STATUS		Status = EFI_SUCCESS;
458b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
459b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (PortNumber > DWC2_HC_CHANNEL) {
460b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Status = EFI_INVALID_PARAMETER;
461b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		goto End;
462b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
463b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
464b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
465b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
466b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	switch (PortFeature) {
467b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortEnable:
468b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
469b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
470b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG);
471b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 |= DWC2_HPRT0_PRTENA;
472b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
473b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
474b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortReset:
475b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioAndThenOr32 (DwHc->DwUsbBase + HPRT0,
476b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri						~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
477b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri						DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG),
478b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri						DWC2_HPRT0_PRTRST);
479b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MicroSecondDelay (50000);
480b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioAnd32 (DwHc->DwUsbBase + HPRT0, ~DWC2_HPRT0_PRTRST);
481b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
482b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortSuspend:
483b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + PCGCCTL, 0);
484b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MicroSecondDelay (40000);
485b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
486b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
487b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG);
488b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 |= DWC2_HPRT0_PRTRES;
489b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
490b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~DWC2_HPRT0_PRTSUSP;
491b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MicroSecondDelay (150000);
492b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~DWC2_HPRT0_PRTRES;
493b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
494b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
495b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortPower:
496b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
497b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
498b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG);
499b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~DWC2_HPRT0_PRTPWR;
500b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
501b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
502b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortOwner:
503b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
504b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortConnectChange:
505b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
506b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~DWC2_HPRT0_PRTCONNDET;
507b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
508b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
509b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortResetChange:
510b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
511b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortEnableChange:
512b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
513b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~DWC2_HPRT0_PRTENCHNG;
514b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
515b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
516b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortSuspendChange:
517b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
518b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		case EfiUsbPortOverCurrentChange:
519b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
520b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 &= ~DWC2_HPRT0_PRTOVRCURRCHNG;
521b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
522b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
523b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		default:
524b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Status = EFI_INVALID_PARAMETER;
525b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			break;
526b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
527b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
528b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEnd:
529b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
530b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
531b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
532b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
533b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
534b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcControlTransfer (
535b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL                *This,
536b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceAddress,
537b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceSpeed,
538b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               MaximumPacketLength,
539b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB_DEVICE_REQUEST              *Request,
540b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB_DATA_DIRECTION              TransferDirection,
541b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT VOID                            *Data,
542b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT UINTN                           *DataLength,
543b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               TimeOut,
544b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR  *Translator,
545b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT UINT32                              *TransferResult
546b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
547b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
548b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV		*DwHc;
549b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EFI_STATUS		Status;
550b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32			Pid;
551b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINTN			Length;
552b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EFI_USB_DATA_DIRECTION	StatusDirection;
553b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32			Direction;
554b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
555b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((Request == NULL) || (TransferResult == NULL)) {
556b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
557b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
558b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
559b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((TransferDirection != EfiUsbDataIn) &&
560b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	    (TransferDirection != EfiUsbDataOut) &&
561b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	    (TransferDirection != EfiUsbNoData)) {
562b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
563b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
564b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
565b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((TransferDirection == EfiUsbNoData) &&
566b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	    ((Data != NULL) || (*DataLength != 0))) {
567b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
568b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
569b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
570b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if ((TransferDirection != EfiUsbNoData) &&
571b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri            ((Data == NULL) || (*DataLength == 0))) {
572b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                return EFI_INVALID_PARAMETER;
573b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
574b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
575b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((MaximumPacketLength != 8) && (MaximumPacketLength != 16) &&
576b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	    (MaximumPacketLength != 32) && (MaximumPacketLength != 64)) {
577b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
578b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
579b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
580b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((DeviceSpeed == EFI_USB_SPEED_LOW) && (MaximumPacketLength != 8)) {
581b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
582b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
583b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
584b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc  = DWHC_FROM_THIS(This);
585b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
586b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*TransferResult = EFI_USB_ERR_SYSTEM;
587b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status		= EFI_DEVICE_ERROR;
588b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
589b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Pid = DWC2_HC_PID_SETUP;
590b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Length = 8;
591b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = DwHcTransfer (DwHc, DeviceAddress, MaximumPacketLength, &Pid, 0, Request, &Length,
592b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					0, DWC2_HCCHAR_EPTYPE_CONTROL, TransferResult, 1);
593b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
594b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (EFI_ERROR(Status)) {
595b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		DEBUG ((EFI_D_ERROR, "DwHcControlTransfer: Setup Stage Error\n"));
596b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		goto EXIT;
597b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
598b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
599b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Data) {
600b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Pid = DWC2_HC_PID_DATA1;
601b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
602b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if (TransferDirection == EfiUsbDataIn)
603b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Direction = 1;
604b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		else
605b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Direction = 0;
606b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
607b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Status = DwHcTransfer (DwHc, DeviceAddress, MaximumPacketLength, &Pid, Direction,
608b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					Data, DataLength, 0, DWC2_HCCHAR_EPTYPE_CONTROL, TransferResult, 0);
609b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
610b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if (EFI_ERROR(Status)) {
611b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			DEBUG ((EFI_D_ERROR, "DwHcControlTransfer: Data Stage Error\n"));
612b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			goto EXIT;
613b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		}
614b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
615b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
616b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((TransferDirection == EfiUsbDataOut) || (TransferDirection == EfiUsbNoData))
617b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		StatusDirection = 1;
618b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	else
619b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		StatusDirection = 0;
620b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
621b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Pid = DWC2_HC_PID_DATA1;
622b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Length = 0;
623b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = DwHcTransfer (DwHc, DeviceAddress, MaximumPacketLength, &Pid, StatusDirection, DwHc->StatusBuffer,
624b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri				&Length, 0, DWC2_HCCHAR_EPTYPE_CONTROL, TransferResult, 0);
625b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
626b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (EFI_ERROR(Status)) {
627b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		DEBUG ((EFI_D_ERROR, "DwHcControlTransfer: Status Stage Error\n"));
628b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		goto EXIT;
629b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
630b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
631b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEXIT:
632b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
633b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
634b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
635b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
636b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
637b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcBulkTransfer (
638b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL                *This,
639b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceAddress,
640b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               EndPointAddress,
641b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceSpeed,
642b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               MaximumPacketLength,
643b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DataBuffersNumber,
644b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT VOID                            *Data[EFI_USB_MAX_BULK_BUFFER_NUM],
645b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT UINTN                           *DataLength,
646b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT UINT8                           *DataToggle,
647b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               TimeOut,
648b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR  *Translator,
649b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT UINT32                              *TransferResult
650b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
651b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
652b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV		*DwHc;
653b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EFI_STATUS		Status;
654b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT8			TransferDirection;
655b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT8			EpAddress;
656b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32			Pid;
657b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
658b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((Data == NULL) || (Data[0] == NULL) ||
659b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		(DataLength == NULL) || (*DataLength == 0) ||
660b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		(TransferResult == NULL)) {
661b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			return EFI_INVALID_PARAMETER;
662b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
663b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
664b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((*DataToggle != 0) && (*DataToggle != 1))
665b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
666b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
667b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if ((DeviceSpeed == EFI_USB_SPEED_LOW) || (DeviceSpeed == EFI_USB_SPEED_SUPER))
668b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
669b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
670b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (((DeviceSpeed == EFI_USB_SPEED_FULL) && (MaximumPacketLength > 64)) ||
671b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		((DeviceSpeed == EFI_USB_SPEED_HIGH) && (MaximumPacketLength > 512)))
672b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			return EFI_INVALID_PARAMETER;
673b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
674b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
675b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
676b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*TransferResult		= EFI_USB_ERR_SYSTEM;
677b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status			= EFI_DEVICE_ERROR;
678b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	TransferDirection	= (EndPointAddress >> 7) & 0x01;
679b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EpAddress		= EndPointAddress & 0x0F;
680b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Pid			= (*DataToggle << 1);
681b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
682b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = DwHcTransfer (DwHc, DeviceAddress, MaximumPacketLength, &Pid, TransferDirection, Data[0], DataLength,
683b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri				EpAddress, DWC2_HCCHAR_EPTYPE_BULK, TransferResult, 1);
684b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
685b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*DataToggle = (Pid >> 1);
686b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
687b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
688b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
689b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
690b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
691b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
692b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcAsyncInterruptTransfer (
693b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL                  *This,
694b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                                 DeviceAddress,
695b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                                 EndPointAddress,
696b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                                 DeviceSpeed,
697b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                                 MaximumPacketLength,
698b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  BOOLEAN                               IsNewTransfer,
699b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT UINT8                             *DataToggle,
700b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                                 PollingInterval,
701b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                                 DataLength,
702b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR    *Translator,
703b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_ASYNC_USB_TRANSFER_CALLBACK       CallBackFunction,
704b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  VOID                                  *Context OPTIONAL
705b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
706b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
707b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DWUSB_OTGHC_DEV                 *DwHc;
708b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        VOID                            *Data;
709b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EFI_STATUS			Status;
710b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32				TransferResult;
711b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32				Pid;
712b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT8				TransferDirection;
713b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT8				EpAddress;
714b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
715b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (!(EndPointAddress & USB_ENDPOINT_DIR_IN))
716b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_INVALID_PARAMETER;
717b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
718b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (IsNewTransfer) {
719b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if (DataLength == 0)
720b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			return EFI_INVALID_PARAMETER;
721b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
722b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if ((*DataToggle != 1) && (*DataToggle != 0))
723b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			return EFI_INVALID_PARAMETER;
724b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
725b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if ((PollingInterval > 255) || (PollingInterval < 1))
726b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			return EFI_INVALID_PARAMETER;
727b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
728b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
729b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = DWHC_FROM_THIS (This);
730b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
731b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (!IsNewTransfer)
732b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return EFI_SUCCESS;
733b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
734b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Data = AllocateZeroPool (DataLength);
735b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (Data == NULL) {
736b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                DEBUG ((EFI_D_ERROR, "DwHcAsyncInterruptTransfer: failed to allocate buffer\n"));
737b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                Status = EFI_OUT_OF_RESOURCES;
738b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                goto EXIT;
739b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
740b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
741b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status			= EFI_SUCCESS;
742b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	TransferResult		= EFI_USB_NOERROR;
743b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EpAddress		= EndPointAddress & 0x0F;
744b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	TransferDirection	= (EndPointAddress >> 7) & 0x01;
745b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Pid			= (*DataToggle << 1);
746b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
747b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
748b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = DwHcTransfer (DwHc, DeviceAddress, MaximumPacketLength, &Pid, TransferDirection, Data, &DataLength,
749b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri				EpAddress, DWC2_HCCHAR_EPTYPE_INTR, &TransferResult, 1);
750b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
751b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	*DataToggle = (Pid >> 1);
752b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
753b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (CallBackFunction != NULL)
754b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		CallBackFunction (Data, DataLength, Context, TransferResult);
755b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
756b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEXIT:
757b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
758b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
759b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
760b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
761b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
762b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcSyncInterruptTransfer (
763b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL                *This,
764b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceAddress,
765b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               EndPointAddress,
766b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceSpeed,
767b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               MaximumPacketLength,
768b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT VOID                            *Data,
769b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT UINTN                           *DataLength,
770b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT UINT8                           *DataToggle,
771b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               TimeOut,
772b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR  *Translator,
773b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT UINT32                              *TransferResult
774b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
775b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
776b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_UNSUPPORTED;
777b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
778b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
779b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
780b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
781b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcIsochronousTransfer (
782b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL                *This,
783b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceAddress,
784b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               EndPointAddress,
785b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceSpeed,
786b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               MaximumPacketLength,
787b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DataBuffersNumber,
788b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT VOID                            *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
789b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               DataLength,
790b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR  *Translator,
791b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  OUT UINT32                              *TransferResult
792b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
793b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
794b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_UNSUPPORTED;
795b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
796b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
797b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
798b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
799b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcAsyncIsochronousTransfer (
800b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_PROTOCOL                *This,
801b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceAddress,
802b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               EndPointAddress,
803b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DeviceSpeed,
804b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               MaximumPacketLength,
805b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINT8                               DataBuffersNumber,
806b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  OUT VOID                            *Data[EFI_USB_MAX_ISO_BUFFER_NUM],
807b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  UINTN                               DataLength,
808b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_USB2_HC_TRANSACTION_TRANSLATOR  *Translator,
809b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  EFI_ASYNC_USB_TRANSFER_CALLBACK     IsochronousCallBack,
810b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN  VOID                                *Context
811b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
812b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
813b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return EFI_UNSUPPORTED;
814b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
815b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
816b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri/**
817b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriSupported Functions
818b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri**/
819b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
820b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
821b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriInitFslspClkSel (
822b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV *DwHc
823b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
824b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
825b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32	PhyClk;
826b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
827b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	PhyClk = DWC2_HCFG_FSLSPCLKSEL_30_60_MHZ;
828b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
829b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioAndThenOr32 (DwHc->DwUsbBase + HCFG,
830b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri				~DWC2_HCFG_FSLSPCLKSEL_MASK,
831b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri				PhyClk << DWC2_HCFG_FSLSPCLKSEL_OFFSET);
832b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
833b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
834b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
835b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwFlushTxFifo (
836b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV *DwHc,
837b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN INT32 Num
838b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
839b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
840b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32 Status;
841b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
842b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GRSTCTL, DWC2_GRSTCTL_TXFFLSH | (Num << DWC2_GRSTCTL_TXFNUM_OFFSET));
843b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
844b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = Wait4Bit (DwHc->DwUsbBase + GRSTCTL, DWC2_GRSTCTL_TXFFLSH, 0);
845b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Status)
846b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		DEBUG ((EFI_D_ERROR, "DwFlushTxFifo: Timeout!\n"));
847b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
848b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MicroSecondDelay (1);
849b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
850b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
851b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
852b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwFlushRxFifo (
853b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV *DwHc
854b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
855b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
856b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32 Status;
857b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
858b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GRSTCTL, DWC2_GRSTCTL_RXFFLSH);
859b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
860b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = Wait4Bit (DwHc->DwUsbBase + GRSTCTL, DWC2_GRSTCTL_RXFFLSH, 0);
861b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (Status)
862b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		DEBUG ((EFI_D_ERROR, "DwFlushRxFifo: Timeout!\n"));
863b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
864b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MicroSecondDelay (1);
865b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
866b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
867b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
868b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwHcInit (
869b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV *DwHc
870b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
871b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
872b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32 NpTxFifoSz = 0;
873b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32 pTxFifoSz = 0;
874b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32 Hprt0 = 0;
875b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	INT32  i, Status, NumChannels;
876b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
877b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + PCGCCTL, 0);
878b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
879b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	InitFslspClkSel (DwHc);
880b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
881b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GRXFSIZ, DWC2_HOST_RX_FIFO_SIZE);
882b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
883b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	NpTxFifoSz |= DWC2_HOST_NPERIO_TX_FIFO_SIZE << DWC2_FIFOSIZE_DEPTH_OFFSET;
884b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	NpTxFifoSz |= DWC2_HOST_RX_FIFO_SIZE << DWC2_FIFOSIZE_STARTADDR_OFFSET;
885b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GNPTXFSIZ, NpTxFifoSz);
886b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
887b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	pTxFifoSz |= DWC2_HOST_PERIO_TX_FIFO_SIZE << DWC2_FIFOSIZE_DEPTH_OFFSET;
888b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	pTxFifoSz |= (DWC2_HOST_RX_FIFO_SIZE + DWC2_HOST_NPERIO_TX_FIFO_SIZE) <<
889b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri									DWC2_FIFOSIZE_STARTADDR_OFFSET;
890b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + HPTXFSIZ, pTxFifoSz);
891b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
892b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioAnd32 (DwHc->DwUsbBase + GOTGCTL, ~(DWC2_GOTGCTL_HSTSETHNPEN));
893b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
894b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwFlushTxFifo (DwHc, 0x10);
895b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwFlushRxFifo (DwHc);
896b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
897b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	NumChannels = MmioRead32 (DwHc->DwUsbBase + GHWCFG2);
898b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	NumChannels &= DWC2_HWCFG2_NUM_HOST_CHAN_MASK;
899b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	NumChannels >>= DWC2_HWCFG2_NUM_HOST_CHAN_OFFSET;
900b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	NumChannels += 1;
901b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
902b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	for (i=0; i<NumChannels; i++)
903b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		MmioAndThenOr32 (DwHc->DwUsbBase + HCCHAR(i),
904b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					~(DWC2_HCCHAR_CHEN | DWC2_HCCHAR_EPDIR),
905b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					DWC2_HCCHAR_CHDIS);
906b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
907b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	for (i=0; i<NumChannels; i++) {
908b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		MmioAndThenOr32 (DwHc->DwUsbBase + HCCHAR(i),
909b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					~DWC2_HCCHAR_EPDIR,
910b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri					(DWC2_HCCHAR_CHEN | DWC2_HCCHAR_CHDIS));
911b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Status = Wait4Bit (DwHc->DwUsbBase + HCCHAR(i), DWC2_HCCHAR_CHEN, 0);
912b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if (Status)
913b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			DEBUG ((EFI_D_ERROR, "DwHcInit: Timeout!\n"));
914b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
915b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
916b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (MmioRead32 (DwHc->DwUsbBase + GINTSTS) & DWC2_GINTSTS_CURMODE_HOST) {
917b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Hprt0 = MmioRead32 (DwHc->DwUsbBase + HPRT0);
918b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Hprt0 &= ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET);
919b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		Hprt0 &= ~(DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG);
920b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
921b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		if (!(Hprt0 & DWC2_HPRT0_PRTPWR)) {
922b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			Hprt0 |= DWC2_HPRT0_PRTPWR;
923b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			MmioWrite32 (DwHc->DwUsbBase + HPRT0, Hprt0);
924b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		}
925b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
926b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
927b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
928b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
929b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwCoreInit (
930b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN DWUSB_OTGHC_DEV *DwHc
931b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
932b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
933b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32		AhbCfg = 0;
934b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32		UsbCfg = 0;
935b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
936b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg = MmioRead32 (DwHc->DwUsbBase + GUSBCFG);
937b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
938b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg |= DWC2_GUSBCFG_ULPI_EXT_VBUS_DRV;
939b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg &= ~DWC2_GUSBCFG_TERM_SEL_DL_PULSE;
940b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
941b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GUSBCFG, UsbCfg);
942b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
943b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwCoreReset (DwHc);
944b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
945b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg &= ~(DWC2_GUSBCFG_ULPI_UTMI_SEL | DWC2_GUSBCFG_PHYIF);
946b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg |= CONFIG_DWC2_PHY_TYPE << DWC2_GUSBCFG_ULPI_UTMI_SEL_OFFSET;
947b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
948b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg &= ~DWC2_GUSBCFG_DDRSEL;
949b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
950b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GUSBCFG, UsbCfg);
951b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
952b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwCoreReset (DwHc);
953b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
954b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg = MmioRead32 (DwHc->DwUsbBase + GUSBCFG);
955b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UsbCfg &= ~(DWC2_GUSBCFG_ULPI_FSLS | DWC2_GUSBCFG_ULPI_CLK_SUS_M);
956b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GUSBCFG, UsbCfg);
957b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
958b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	AhbCfg |= DWC2_GAHBCFG_HBURSTLEN_INCR4;
959b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	AhbCfg |= DWC2_GAHBCFG_DMAENABLE;
960b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
961b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioWrite32 (DwHc->DwUsbBase + GAHBCFG, AhbCfg);
962b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	MmioOr32 (DwHc->DwUsbBase + GUSBCFG, DWC2_GUSBCFG_HNPCAP | DWC2_GUSBCFG_SRPCAP);
963b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
964b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
965b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDWUSB_OTGHC_DEV *
966b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriCreateDwUsbHc (
967b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  VOID
968b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
969b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
970b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DWUSB_OTGHC_DEV	*DwHc;
971b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32		Pages;
972b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
973b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc = AllocateZeroPool (sizeof(DWUSB_OTGHC_DEV));
974b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
975b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (DwHc == NULL) {
976b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                return NULL;
977b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
978b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
979b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->Signature                                 = DWUSB_OTGHC_DEV_SIGNATURE;
980b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.GetCapability                  = DwHcGetCapability;
981b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.Reset                          = DwHcReset;
982b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.GetState                       = DwHcGetState;
983b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.SetState                       = DwHcSetState;
984b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.ControlTransfer                = DwHcControlTransfer;
985b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.BulkTransfer                   = DwHcBulkTransfer;
986b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.AsyncInterruptTransfer         = DwHcAsyncInterruptTransfer;
987b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.SyncInterruptTransfer          = DwHcSyncInterruptTransfer;
988b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.IsochronousTransfer            = DwHcIsochronousTransfer;
989b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.AsyncIsochronousTransfer       = DwHcAsyncIsochronousTransfer;
990b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.GetRootHubPortStatus           = DwHcGetRootHubPortStatus;
991b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.SetRootHubPortFeature          = DwHcSetRootHubPortFeature;
992b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.ClearRootHubPortFeature        = DwHcClearRootHubPortFeature;
993b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.MajorRevision                  = 0x02;
994b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc->DwUsbOtgHc.MinorRevision                  = 0x00;
995b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc->DwUsbBase					= FixedPcdGet32 (PcdDwUsbDxeBaseAddress);
996b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
997b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	CopyMem (&DwHc->DevicePath, &DwHcDevicePath, sizeof(DwHcDevicePath));
998b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
999b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Pages = EFI_SIZE_TO_PAGES (DWC2_STATUS_BUF_SIZE);
1000b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc->StatusBuffer = UncachedAllocatePages (Pages);
1001b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (DwHc->StatusBuffer == NULL) {
1002b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		DEBUG ((EFI_D_ERROR, "CreateDwUsbHc: No page availablefor StatusBuffer\n"));
1003b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		return NULL;
1004b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
1005b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1006b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Pages = EFI_SIZE_TO_PAGES (DWC2_DATA_BUF_SIZE);
1007b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc->AlignedBuffer = UncachedAllocatePages (Pages);
1008b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (DwHc->AlignedBuffer == NULL) {
1009b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                DEBUG ((EFI_D_ERROR, "CreateDwUsbHc: No page availablefor AlignedBuffer\n"));
1010b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                return NULL;
1011b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
1012b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1013b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        return DwHc;
1014b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
1015b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1016b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriVOID
1017b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
1018b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwUsbHcExitBootService (
1019b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  EFI_EVENT	Event,
1020b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  VOID		*Context
1021b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
1022b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
1023b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV		*DwHc;
1024b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1025b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = (DWUSB_OTGHC_DEV *) Context;
1026b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1027b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MmioAndThenOr32 (DwHc->DwUsbBase + HPRT0,
1028b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                ~(DWC2_HPRT0_PRTENA | DWC2_HPRT0_PRTCONNDET |
1029b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                  DWC2_HPRT0_PRTENCHNG | DWC2_HPRT0_PRTOVRCURRCHNG),
1030b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                                  DWC2_HPRT0_PRTRST);
1031b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1032b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        MicroSecondDelay (50000);
1033b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1034b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwCoreReset (DwHc);
1035b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
1036b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1037b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri/**
1038b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  UEFI Driver Entry Point API
1039b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1040b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  @param  ImageHandle       EFI_HANDLE.
1041b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  @param  SystemTable       EFI_SYSTEM_TABLE.
1042b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1043b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  @return EFI_SUCCESS       Success.
1044b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri          EFI_DEVICE_ERROR  Fail.
1045b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri**/
1046b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1047b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
1048b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
1049b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwUsbHostEntryPoint (
1050b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN EFI_HANDLE           ImageHandle,
1051b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN EFI_SYSTEM_TABLE     *SystemTable
1052b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
1053b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
1054b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	EFI_STATUS                      Status;
1055b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DWUSB_OTGHC_DEV                 *DwHc;
1056b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32				Pages;
1057b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1058b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = EFI_SUCCESS;
1059b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1060b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	DwHc = CreateDwUsbHc ();
1061b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1062b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (DwHc == NULL) {
1063b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                Status = EFI_OUT_OF_RESOURCES;
1064b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                goto EXIT;
1065b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
1066b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1067d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        Status = gBS->LocateProtocol (&gDwUsbProtocolGuid, NULL, (VOID **) &DwUsb);
1068d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        if (EFI_ERROR (Status)) {
1069d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri           return Status;
1070d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri        }
1071d3862b27437942119994801f19365e63100374e4Shivamurthy Shastri
1072b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Status = gBS->InstallMultipleProtocolInterfaces (
1073b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        &DwHc->DeviceHandle,
1074b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        &gEfiUsb2HcProtocolGuid,	&DwHc->DwUsbOtgHc,
1075b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			&gEfiDevicePathProtocolGuid,	&DwHc->DevicePath,
1076b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri			NULL
1077b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        );
1078b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1079b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (EFI_ERROR (Status)) {
1080b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                goto FREE_DWUSBHC;
1081b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
1082b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1083b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Status = gBS->CreateEventEx (
1084b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        EVT_NOTIFY_SIGNAL,
1085b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        TPL_NOTIFY,
1086b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        DwUsbHcExitBootService,
1087b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        DwHc,
1088b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        &gEfiEventExitBootServicesGuid,
1089b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        &DwHc->ExitBootServiceEvent
1090b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                        );
1091b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1092b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (EFI_ERROR (Status)) {
1093b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                goto UNINSTALL_PROTOCOL;
1094b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
1095b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1096b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
1097b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1098b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriUNINSTALL_PROTOCOL:
1099b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	gBS->UninstallMultipleProtocolInterfaces (
1100b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		&DwHc->DeviceHandle,
1101b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		&gEfiUsb2HcProtocolGuid,	&DwHc->DwUsbOtgHc,
1102b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		&gEfiDevicePathProtocolGuid,	&DwHc->DevicePath,
1103b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		NULL
1104b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		);
1105b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriFREE_DWUSBHC:
1106b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Pages = EFI_SIZE_TO_PAGES (DWC2_STATUS_BUF_SIZE);
1107b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UncachedFreePages (DwHc->StatusBuffer, Pages);
1108b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Pages = EFI_SIZE_TO_PAGES (DWC2_DATA_BUF_SIZE);
1109b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UncachedFreePages (DwHc->AlignedBuffer, Pages);
1110b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	gBS->FreePool (DwHc);
1111b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEXIT:
1112b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
1113b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
1114b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1115b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFI_STATUS
1116b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriEFIAPI
1117b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy ShastriDwUsbHostExitPoint (
1118b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  IN EFI_HANDLE	ImageHandle
1119b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri  )
1120b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri{
1121b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        EFI_STATUS              Status;
1122b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        EFI_USB2_HC_PROTOCOL    *DwUsbHc;
1123b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DWUSB_OTGHC_DEV         *DwHc;
1124b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	UINT32			Pages;
1125b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1126b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	Status = EFI_SUCCESS;
1127b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1128b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Status = gBS->LocateProtocol (&gEfiUsb2HcProtocolGuid, NULL, (VOID **) &DwUsbHc);
1129b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1130b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (EFI_ERROR (Status)) {
1131b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                return Status;
1132b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
1133b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1134b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        DwHc  = DWHC_FROM_THIS(DwUsbHc);
1135b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1136b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	if (DwHc->ExitBootServiceEvent != NULL) {
1137b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri		gBS->CloseEvent (DwHc->ExitBootServiceEvent);
1138b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	}
1139b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1140b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        gBS->UninstallMultipleProtocolInterfaces (
1141b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                &DwHc->DeviceHandle,
1142b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                &gEfiUsb2HcProtocolGuid,        &DwHc->DwUsbOtgHc,
1143b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                &gEfiDevicePathProtocolGuid,    &DwHc->DevicePath,
1144b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                NULL
1145b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                );
1146b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1147b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        if (EFI_ERROR (Status)) {
1148b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri                return Status;
1149b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        }
1150b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1151b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Pages = EFI_SIZE_TO_PAGES (DWC2_STATUS_BUF_SIZE);
1152b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UncachedFreePages (DwHc->StatusBuffer, Pages);
1153b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        Pages = EFI_SIZE_TO_PAGES (DWC2_DATA_BUF_SIZE);
1154b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri        UncachedFreePages (DwHc->AlignedBuffer, Pages);
1155b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	FreePool (DwHc);
1156b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri
1157b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri	return Status;
1158b125d2fc8ff88deca9a3bd89e33d58be0821118fShivamurthy Shastri}
1159