--- /dev/null
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+ Debug.c\r
+\r
+Abstract:\r
+\r
+\r
+Revision History\r
+--*/\r
+\r
+\r
+#include "Ehci.h"\r
+\r
+void \r
+DumpEHCIPortsStatus (\r
+ IN USB2_HC_DEV *HcDev\r
+ )\r
+{\r
+ UINT8 PortNumber;\r
+ UINT8 Index;\r
+ UINT32 Value;\r
+\r
+ ReadEhcCapabiltiyReg (\r
+ HcDev,\r
+ HCSPARAMS,\r
+ &Value\r
+ );\r
+\r
+ PortNumber = (UINT8) (Value & HCSP_NPORTS);\r
+\r
+ for (Index = 0; Index < PortNumber; Index++) {\r
+ ReadEhcOperationalReg (\r
+ HcDev,\r
+ PORTSC + 4 * Index,\r
+ &Value\r
+ );\r
+ DEBUG((gEHCDebugLevel, "Port[%d] = 0x%x\n", Index, Value));\r
+ }\r
+}\r
+\r
+\r
#include "Ehci.h"\r
\r
\r
+VOID\r
+HostReset (\r
+ IN USB2_HC_DEV *HcDev\r
+ )\r
+{\r
+ UINT32 Value;\r
+ UINT32 TimeOut;\r
+ \r
+ ReadEhcOperationalReg (\r
+ HcDev,\r
+ USBCMD,\r
+ &Value\r
+ );\r
+\r
+ Value = Value & (~USBCMD_RS);\r
+ WriteEhcOperationalReg (\r
+ HcDev,\r
+ USBCMD,\r
+ Value\r
+ );\r
+\r
+ TimeOut = 40;\r
+ while (TimeOut --) {\r
+ gBS->Stall (500);\r
+ ReadEhcOperationalReg (\r
+ HcDev,\r
+ USBSTS,\r
+ &Value\r
+ );\r
+ if ((Value & USBSTS_HCH) != 0) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (TimeOut == 0) {\r
+ DEBUG((gEHCErrorLevel, "TimeOut for clearing Run/Stop bit\n"));\r
+ }\r
+\r
+ ReadEhcOperationalReg (\r
+ HcDev,\r
+ USBCMD,\r
+ &Value\r
+ );\r
+ Value = Value | USBCMD_HCRESET;\r
+ WriteEhcOperationalReg (\r
+ HcDev,\r
+ USBCMD,\r
+ Value\r
+ );\r
+\r
+ TimeOut = 40;\r
+ while (TimeOut --) {\r
+ gBS->Stall (500);\r
+ ReadEhcOperationalReg (\r
+ HcDev,\r
+ USBCMD,\r
+ &Value\r
+ );\r
+ if ((Value & USBCMD_HCRESET) == 0) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (TimeOut == 0) {\r
+ DEBUG((gEHCErrorLevel, "TimeOut for Host Reset\n"));\r
+ }\r
+\r
+}\r
+\r
EFI_STATUS\r
ReadEhcCapabiltiyReg (\r
IN USB2_HC_DEV *HcDev,\r
);\r
}\r
\r
+VOID\r
+ClearLegacySupport (\r
+ IN USB2_HC_DEV *HcDev\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Stop the legacy USB SMI\r
+\r
+Arguments:\r
+\r
+ HcDev - USB2_HC_DEV\r
+\r
+Returns:\r
+\r
+ EFI_SUCCESS Success\r
+ EFI_DEVICE_ERROR Fail\r
+\r
+--*/\r
+{\r
+ UINT32 EECP;\r
+ UINT32 Value;\r
+ UINT32 TimeOut;\r
+\r
+ ReadEhcCapabiltiyReg (\r
+ HcDev,\r
+ HCCPARAMS,\r
+ &EECP\r
+ );\r
+\r
+ EECP = (EECP >> 8) & 0xFF;\r
+\r
+ DEBUG ((gEHCDebugLevel, "EHCI: EECPBase = 0x%x\n", EECP));\r
+\r
+\r
+ HcDev->PciIo->Pci.Read (\r
+ HcDev->PciIo,\r
+ EfiPciIoWidthUint32,\r
+ EECP,\r
+ 1,\r
+ &Value \r
+ );\r
+\r
+ DEBUG((gEHCDebugLevel, "EECP[0] = 0x%x\n", Value));\r
+\r
+ HcDev->PciIo->Pci.Read (\r
+ HcDev->PciIo,\r
+ EfiPciIoWidthUint32,\r
+ EECP + 0x4,\r
+ 1,\r
+ &Value \r
+ );\r
+\r
+ DEBUG((gEHCDebugLevel, "EECP[4] = 0x%x\n", Value));\r
+\r
+ HcDev->PciIo->Pci.Read (\r
+ HcDev->PciIo,\r
+ EfiPciIoWidthUint32,\r
+ EECP,\r
+ 1,\r
+ &Value \r
+ );\r
+\r
+ Value = Value | (0x1 << 24);\r
+ DEBUG((gEHCErrorLevel, "Value Written = 0x%x\n", Value));\r
+\r
+ HcDev->PciIo->Pci.Write (\r
+ HcDev->PciIo,\r
+ EfiPciIoWidthUint32,\r
+ EECP,\r
+ 1,\r
+ &Value \r
+ );\r
+\r
+ TimeOut = 40;\r
+ while (TimeOut --) {\r
+ gBS->Stall (500);\r
+\r
+ HcDev->PciIo->Pci.Read (\r
+ HcDev->PciIo,\r
+ EfiPciIoWidthUint32,\r
+ EECP,\r
+ 1,\r
+ &Value \r
+ );\r
+ if ((Value & 0x01010000) == 0x01000000) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (TimeOut == 0) {\r
+ DEBUG((gEHCErrorLevel, "Timeout for getting HC OS Owned Semaphore\n" ));\r
+ } \r
+ \r
+ DEBUG((gEHCErrorLevel, "After Release Value\n" ));\r
+\r
+ HcDev->PciIo->Pci.Read (\r
+ HcDev->PciIo,\r
+ EfiPciIoWidthUint32,\r
+ EECP,\r
+ 1,\r
+ &Value \r
+ );\r
+\r
+ DEBUG((gEHCDebugLevel, "EECP[0] = 0x%x\n", Value));\r
+\r
+ HcDev->PciIo->Pci.Read (\r
+ HcDev->PciIo,\r
+ EfiPciIoWidthUint32,\r
+ EECP + 0x4,\r
+ 1,\r
+ &Value \r
+ );\r
+\r
+ DEBUG((gEHCDebugLevel, "EECP[4] = 0x%x\n", Value));\r
+\r
+\r
+}\r
+\r
EFI_STATUS\r
GetCapabilityLen (\r
IN USB2_HC_DEV *HcDev\r