\r
The EHCI register operation routines.\r
\r
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
-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) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
// terminate the transfer\r
//\r
if (!IsLow && (TdHw->ShortPacket == 1) && (Len < Td->DataLen)) {\r
- DEBUG ((EFI_D_INFO, "UhciCheckTdStatus: short packet read occured\n"));\r
+ DEBUG ((EFI_D_VERBOSE, "UhciCheckTdStatus: short packet read occured\n"));\r
\r
Finished = TRUE;\r
goto ON_EXIT;\r
UINTN Delay;\r
BOOLEAN Finished;\r
EFI_STATUS Status;\r
+ BOOLEAN InfiniteLoop;\r
+\r
+ Finished = FALSE;\r
+ Status = EFI_SUCCESS;\r
+ Delay = TimeOut * UHC_1_MILLISECOND;\r
+ InfiniteLoop = FALSE;\r
\r
- Finished = FALSE;\r
- Status = EFI_SUCCESS;\r
- Delay = (TimeOut * UHC_1_MILLISECOND / UHC_SYNC_POLL_INTERVAL) + 1;\r
+ //\r
+ // According to UEFI spec section 16.2.4, If Timeout is 0, then the caller\r
+ // must wait for the function to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR\r
+ // is returned.\r
+ //\r
+ if (TimeOut == 0) {\r
+ InfiniteLoop = TRUE;\r
+ }\r
\r
- for (Index = 0; Index < Delay; Index++) {\r
+ for (Index = 0; InfiniteLoop || (Index < Delay); Index++) {\r
Finished = UhciCheckTdStatus (Uhc, Td, IsLow, QhResult);\r
\r
//\r
break;\r
}\r
\r
- gBS->Stall (UHC_SYNC_POLL_INTERVAL);\r
+ gBS->Stall (UHC_1_MICROSECOND);\r
}\r
\r
if (!Finished) {\r
\r
//\r
// Copy the data to temporary buffer if there are some\r
- // data transferred. We may have zero-length packet\r
+ // data transferred. We may have zero-length packet.\r
+ // Make sure the data received from HW is no more than expected.\r
//\r
Data = NULL;\r
\r
- if (QhResult.Complete != 0) {\r
+ if ((QhResult.Complete != 0) && (QhResult.Complete <= AsyncReq->DataLen)) {\r
Data = AllocatePool (QhResult.Complete);\r
\r
if (Data == NULL) {\r