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