/*++\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
+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
Ehchlp.c\r
- \r
-Abstract: \r
- \r
+\r
+Abstract:\r
+\r
\r
Revision History\r
--*/\r
{\r
UINT32 Value;\r
UINT32 TimeOut;\r
- \r
+\r
ReadEhcOperationalReg (\r
HcDev,\r
USBCMD,\r
Routine Description:\r
\r
Read Ehc Capabitlity register\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
CapabiltiyRegAddr - Ehc Capability register address\r
Data - A pointer to data read from register\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
return HcDev->PciIo->Mem.Read (\r
Routine Description:\r
\r
Read Ehc Operation register\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
OperationalRegAddr - Ehc Operation register address\r
Data - A pointer to data read from register\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
ASSERT (HcDev->UsbCapabilityLen);\r
Routine Description:\r
\r
Write Ehc Operation register\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
OperationalRegAddr - Ehc Operation register address\r
Data - 32bit write to register\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
ASSERT (HcDev->UsbCapabilityLen);\r
);\r
}\r
\r
+\r
+\r
VOID\r
ClearLegacySupport (\r
IN USB2_HC_DEV *HcDev\r
EfiPciIoWidthUint32,\r
EECP,\r
1,\r
- &Value \r
+ &Value\r
);\r
\r
DEBUG((gEHCDebugLevel, "EECP[0] = 0x%x\n", Value));\r
EfiPciIoWidthUint32,\r
EECP + 0x4,\r
1,\r
- &Value \r
+ &Value\r
);\r
\r
DEBUG((gEHCDebugLevel, "EECP[4] = 0x%x\n", Value));\r
EfiPciIoWidthUint32,\r
EECP,\r
1,\r
- &Value \r
+ &Value\r
);\r
\r
Value = Value | (0x1 << 24);\r
EfiPciIoWidthUint32,\r
EECP,\r
1,\r
- &Value \r
+ &Value\r
);\r
\r
TimeOut = 40;\r
EfiPciIoWidthUint32,\r
EECP,\r
1,\r
- &Value \r
+ &Value\r
);\r
if ((Value & 0x01010000) == 0x01000000) {\r
break;\r
\r
if (TimeOut == 0) {\r
DEBUG((gEHCErrorLevel, "Timeout for getting HC OS Owned Semaphore\n" ));\r
- } \r
- \r
+ }\r
+\r
DEBUG((gEHCErrorLevel, "After Release Value\n" ));\r
\r
HcDev->PciIo->Pci.Read (\r
EfiPciIoWidthUint32,\r
EECP,\r
1,\r
- &Value \r
+ &Value\r
);\r
\r
DEBUG((gEHCDebugLevel, "EECP[0] = 0x%x\n", Value));\r
EfiPciIoWidthUint32,\r
EECP + 0x4,\r
1,\r
- &Value \r
+ &Value\r
);\r
\r
DEBUG((gEHCDebugLevel, "EECP[4] = 0x%x\n", Value));\r
Routine Description:\r
\r
Get the length of capability register\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Set the length of Frame List\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Length - the required length of frame list\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_INVALID_PARAMETER Invalid parameter\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Set base address of frame list first entry\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
FrameBuffer - base address of first entry of frame list\r
- \r
+\r
Returns:\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Set address of first Async schedule Qh\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
QhPtr - A pointer to first Qh in the Async schedule\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Set register of control and data structure segment\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
\r
--*/\r
{\r
Routine Description:\r
\r
Set Ehc port routing bit\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Set Ehc door bell bit\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Clear Ehc all status bits\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
UINT32 UsbStatusAddr;\r
Routine Description:\r
\r
Enable periodic schedule\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Disable periodic schedule\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Enable asynchrounous schedule\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Disable asynchrounous schedule\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Reset Ehc\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Start Ehc schedule execution\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_DEVICE_ERROR Fail\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Whether frame list is programmable\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE Programmable\r
FALSE Unprogrammable\r
- \r
+\r
--*/\r
{\r
BOOLEAN Value;\r
Routine Description:\r
\r
Whether periodic schedule is enabled\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE Enabled\r
FALSE Disabled\r
- \r
+\r
--*/\r
{\r
BOOLEAN Value;\r
Routine Description:\r
\r
Whether asynchronous schedule is enabled\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE Enabled\r
FALSE Disabled\r
- \r
+\r
--*/\r
{\r
BOOLEAN Value;\r
Routine Description:\r
\r
Whether port is enabled\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE Enabled\r
FALSE Disabled\r
- \r
+\r
--*/\r
{\r
UINT32 PortStatusControlAddr;\r
Routine Description:\r
\r
Whether Ehc is reseted\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE Reseted\r
FALSE Unreseted\r
- \r
+\r
--*/\r
{\r
BOOLEAN Value;\r
Routine Description:\r
\r
Whether Ehc is halted\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE Halted\r
FALSE Not halted\r
- \r
+\r
--*/\r
{\r
BOOLEAN Value;\r
Routine Description:\r
\r
Whether Ehc is system error\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE System error\r
FALSE No system error\r
- \r
+\r
--*/\r
{\r
BOOLEAN Value;\r
BOOLEAN\r
IsHighSpeedDevice (\r
IN EFI_USB2_HC_PROTOCOL *This,\r
- IN UINT8 PortNum \r
+ IN UINT8 PortNum\r
)\r
/*++\r
\r
Routine Description:\r
\r
Whether high speed device attached\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
- \r
+ HcDev - USB2_HC_DEV\r
+\r
Returns:\r
\r
TRUE High speed\r
FALSE Full speed\r
- \r
+\r
--*/\r
{\r
USB2_HC_DEV *HcDev;\r
UINT32 PortStatusControlAddr;\r
UINT32 PortStatusControlReg;\r
- \r
+\r
HcDev = USB2_HC_DEV_FROM_THIS (This);\r
PortStatusControlAddr = (UINT32) (PORTSC + (4 * PortNum));\r
\r
Routine Description:\r
\r
wait for Ehc reset or timeout\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
wait for Ehc halt or timeout\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
wait for Ehc not halt or timeout\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Wait for Ehc asynchronous schedule enable or timeout\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Wait for Ehc asynchronous schedule disable or timeout\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Wait for Ehc periodic schedule enable or timeout\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
Routine Description:\r
\r
Wait for periodic schedule disable or timeout\r
- \r
+\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
- \r
+\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
\r
Arguments:\r
\r
- HcDev - USB2_HC_DEV \r
+ HcDev - USB2_HC_DEV\r
Timeout - timeout threshold\r
\r
Returns:\r
\r
EFI_SUCCESS Success\r
EFI_TIMEOUT Timeout\r
- \r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
\r
UsbCommandAddr = USBCMD;\r
Delay = (Timeout / 50) + 1;\r
- \r
+\r
do {\r
Status = ReadEhcOperationalReg (\r
HcDev,\r