mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/Usb: Boost the r/w performance by reducing stall time on polling cmd execution status
Signed-off-by: Feng Tian <feng.tian@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Elvin Li <elvin.li@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14442 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
22feb630eb
commit
ca24313165
|
@ -2,7 +2,7 @@
|
|||
|
||||
EHCI transfer scheduling routines.
|
||||
|
||||
Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -694,7 +694,7 @@ EhcExecTransfer (
|
|||
BOOLEAN InfiniteLoop;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Loop = (TimeOut * EHC_1_MILLISECOND / EHC_SYNC_POLL_INTERVAL) + 1;
|
||||
Loop = TimeOut * EHC_1_MILLISECOND;
|
||||
Finished = FALSE;
|
||||
InfiniteLoop = FALSE;
|
||||
|
||||
|
@ -714,7 +714,7 @@ EhcExecTransfer (
|
|||
break;
|
||||
}
|
||||
|
||||
gBS->Stall (EHC_SYNC_POLL_INTERVAL);
|
||||
gBS->Stall (EHC_1_MICROSECOND);
|
||||
}
|
||||
|
||||
if (!Finished) {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
PEIM to produce gPeiUsb2HostControllerPpiGuid based on gPeiUsbControllerPpiGuid
|
||||
which is used to enable recovery function from USB Drivers.
|
||||
|
||||
Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -532,6 +532,8 @@ EhcInitHC (
|
|||
the subsequent bulk transfer.
|
||||
@param TimeOut Indicates the maximum time, in millisecond, which the
|
||||
transfer is allowed to complete.
|
||||
If Timeout is 0, then the caller must wait for the function
|
||||
to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
@param Translator A pointr to the transaction translator data.
|
||||
@param TransferResult A pointer to the detailed result information of the
|
||||
bulk transfer.
|
||||
|
@ -995,6 +997,8 @@ ON_EXIT:
|
|||
@param Data Data buffer to be transmitted or received from USB device.
|
||||
@param DataLength The size (in bytes) of the data buffer.
|
||||
@param TimeOut Indicates the maximum timeout, in millisecond.
|
||||
If Timeout is 0, then the caller must wait for the function
|
||||
to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
@param Translator Transaction translator to be used by this device.
|
||||
@param TransferResult Return the result of this control transfer.
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
PEIM to produce gPeiUsb2HostControllerPpiGuid based on gPeiUsbControllerPpiGuid
|
||||
which is used to enable recovery function from USB Drivers.
|
||||
|
||||
Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -425,19 +425,29 @@ EhcExecTransfer (
|
|||
UINTN Index;
|
||||
UINTN Loop;
|
||||
BOOLEAN Finished;
|
||||
BOOLEAN InfiniteLoop;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Loop = (TimeOut * EHC_1_MILLISECOND / EHC_SYNC_POLL_INTERVAL) + 1;
|
||||
Finished = FALSE;
|
||||
Loop = TimeOut * EHC_1_MILLISECOND;
|
||||
Finished = FALSE;
|
||||
InfiniteLoop = FALSE;
|
||||
|
||||
for (Index = 0; Index < Loop; Index++) {
|
||||
//
|
||||
// If Timeout is 0, then the caller must wait for the function to be completed
|
||||
// until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
//
|
||||
if (TimeOut == 0) {
|
||||
InfiniteLoop = TRUE;
|
||||
}
|
||||
|
||||
for (Index = 0; InfiniteLoop || (Index < Loop); Index++) {
|
||||
Finished = EhcCheckUrbResult (Ehc, Urb);
|
||||
|
||||
if (Finished) {
|
||||
break;
|
||||
}
|
||||
|
||||
MicroSecondDelay (EHC_SYNC_POLL_INTERVAL);
|
||||
MicroSecondDelay (EHC_1_MICROSECOND);
|
||||
}
|
||||
|
||||
if (!Finished) {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
The EHCI register operation routines.
|
||||
|
||||
Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -580,7 +580,7 @@ UhciExecuteTransfer (
|
|||
|
||||
Finished = FALSE;
|
||||
Status = EFI_SUCCESS;
|
||||
Delay = (TimeOut * UHC_1_MILLISECOND / UHC_SYNC_POLL_INTERVAL) + 1;
|
||||
Delay = TimeOut * UHC_1_MILLISECOND;
|
||||
InfiniteLoop = FALSE;
|
||||
|
||||
//
|
||||
|
@ -602,7 +602,7 @@ UhciExecuteTransfer (
|
|||
break;
|
||||
}
|
||||
|
||||
gBS->Stall (UHC_SYNC_POLL_INTERVAL);
|
||||
gBS->Stall (UHC_1_MICROSECOND);
|
||||
}
|
||||
|
||||
if (!Finished) {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
PEIM to produce gPeiUsbHostControllerPpiGuid based on gPeiUsbControllerPpiGuid
|
||||
which is used to enable recovery function from USB Drivers.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved. <BR>
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved. <BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -153,6 +153,8 @@ UhcPeimEntry (
|
|||
@param Data Data buffer to be transmitted or received from USB device.
|
||||
@param DataLength The size (in bytes) of the data buffer.
|
||||
@param TimeOut Indicates the maximum timeout, in millisecond.
|
||||
If Timeout is 0, then the caller must wait for the function
|
||||
to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
@param TransferResult Return the result of this control transfer.
|
||||
|
||||
@retval EFI_SUCCESS Transfer was completed successfully.
|
||||
|
@ -391,6 +393,8 @@ UhcControlTransfer (
|
|||
the subsequent bulk transfer.
|
||||
@param TimeOut Indicates the maximum time, in millisecond, which the
|
||||
transfer is allowed to complete.
|
||||
If Timeout is 0, then the caller must wait for the function
|
||||
to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
@param TransferResult A pointer to the detailed result information of the
|
||||
bulk transfer.
|
||||
|
||||
|
@ -2508,12 +2512,21 @@ ExecuteControlTransfer (
|
|||
{
|
||||
UINTN ErrTDPos;
|
||||
UINTN Delay;
|
||||
BOOLEAN InfiniteLoop;
|
||||
|
||||
ErrTDPos = 0;
|
||||
*TransferResult = EFI_USB_NOERROR;
|
||||
*ActualLen = 0;
|
||||
InfiniteLoop = FALSE;
|
||||
|
||||
Delay = (TimeOut * STALL_1_MILLI_SECOND / 200) + 1;
|
||||
Delay = TimeOut * STALL_1_MILLI_SECOND;
|
||||
//
|
||||
// If Timeout is 0, then the caller must wait for the function to be completed
|
||||
// until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
//
|
||||
if (TimeOut == 0) {
|
||||
InfiniteLoop = TRUE;
|
||||
}
|
||||
|
||||
do {
|
||||
|
||||
|
@ -2525,11 +2538,10 @@ ExecuteControlTransfer (
|
|||
if ((*TransferResult & EFI_USB_ERR_NOTEXECUTE) != EFI_USB_ERR_NOTEXECUTE) {
|
||||
break;
|
||||
}
|
||||
MicroSecondDelay (200);
|
||||
MicroSecondDelay (STALL_1_MICRO_SECOND);
|
||||
Delay--;
|
||||
|
||||
} while (Delay != 0);
|
||||
|
||||
} while (InfiniteLoop || (Delay != 0));
|
||||
|
||||
if (*TransferResult != EFI_USB_NOERROR) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
|
@ -2566,12 +2578,21 @@ ExecBulkTransfer (
|
|||
UINTN ErrTDPos;
|
||||
UINTN ScrollNum;
|
||||
UINTN Delay;
|
||||
BOOLEAN InfiniteLoop;
|
||||
|
||||
ErrTDPos = 0;
|
||||
*TransferResult = EFI_USB_NOERROR;
|
||||
*ActualLen = 0;
|
||||
InfiniteLoop = FALSE;
|
||||
|
||||
Delay = (TimeOut * STALL_1_MILLI_SECOND / 200) + 1;
|
||||
Delay = TimeOut * STALL_1_MILLI_SECOND;
|
||||
//
|
||||
// If Timeout is 0, then the caller must wait for the function to be completed
|
||||
// until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
//
|
||||
if (TimeOut == 0) {
|
||||
InfiniteLoop = TRUE;
|
||||
}
|
||||
|
||||
do {
|
||||
|
||||
|
@ -2582,10 +2603,10 @@ ExecBulkTransfer (
|
|||
if ((*TransferResult & EFI_USB_ERR_NOTEXECUTE) != EFI_USB_ERR_NOTEXECUTE) {
|
||||
break;
|
||||
}
|
||||
MicroSecondDelay (200);
|
||||
MicroSecondDelay (STALL_1_MICRO_SECOND);
|
||||
Delay--;
|
||||
|
||||
} while (Delay != 0);
|
||||
} while (InfiniteLoop || (Delay != 0));
|
||||
|
||||
//
|
||||
// has error
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Private Header file for Usb Host Controller PEIM
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -94,6 +94,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
#define OUTPUT_PACKET_ID 0xE1
|
||||
#define ERROR_PACKET_ID 0x55
|
||||
|
||||
#define STALL_1_MICRO_SECOND 1
|
||||
#define STALL_1_MILLI_SECOND 1000
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Provides some data structure definitions used by the XHCI host controller driver.
|
||||
|
||||
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -41,6 +41,10 @@ typedef struct _USB_DEV_CONTEXT USB_DEV_CONTEXT;
|
|||
#include "XhciSched.h"
|
||||
#include "ComponentName.h"
|
||||
|
||||
//
|
||||
// The unit is microsecond, setting it as 1us.
|
||||
//
|
||||
#define XHC_1_MICROSECOND (1)
|
||||
//
|
||||
// Convert millisecond to microsecond.
|
||||
//
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
XHCI transfer scheduling routines.
|
||||
|
||||
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
@ -1101,7 +1101,7 @@ XhcExecTransfer (
|
|||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Loop = (Timeout * XHC_1_MILLISECOND / XHC_POLL_DELAY) + 1;
|
||||
Loop = Timeout * XHC_1_MILLISECOND;
|
||||
if (Timeout == 0) {
|
||||
Loop = 0xFFFFFFFF;
|
||||
}
|
||||
|
@ -1113,7 +1113,7 @@ XhcExecTransfer (
|
|||
if (Urb->Finished) {
|
||||
break;
|
||||
}
|
||||
gBS->Stall (XHC_POLL_DELAY);
|
||||
gBS->Stall (XHC_1_MICROSECOND);
|
||||
}
|
||||
|
||||
if (Index == Loop) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
The module is used to implement Usb Io PPI interfaces.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved. <BR>
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved. <BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -24,7 +24,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
@param This The pointer of PEI_USB_IO_PPI.
|
||||
@param Request USB device request to send.
|
||||
@param Direction Specifies the data direction for the data stage.
|
||||
@param Timeout Indicates the maximum timeout, in millisecond.
|
||||
@param Timeout Indicates the maximum timeout, in millisecond. If Timeout
|
||||
is 0, then the caller must wait for the function to be
|
||||
completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
@param Data Data buffer to be transmitted or received from USB device.
|
||||
@param DataLength The size (in bytes) of the data buffer.
|
||||
|
||||
|
@ -96,7 +98,9 @@ PeiUsbControlTransfer (
|
|||
from or receive into.
|
||||
@param DataLength The lenght of the data buffer.
|
||||
@param Timeout Indicates the maximum time, in millisecond, which the
|
||||
transfer is allowed to complete.
|
||||
transfer is allowed to complete. If Timeout is 0, then
|
||||
the caller must wait for the function to be completed
|
||||
until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
|
||||
@retval EFI_SUCCESS The transfer was completed successfully.
|
||||
@retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Usb Peim definition.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved. <BR>
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved. <BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -71,7 +71,9 @@ typedef struct {
|
|||
@param This The pointer of PEI_USB_IO_PPI.
|
||||
@param Request USB device request to send.
|
||||
@param Direction Specifies the data direction for the data stage.
|
||||
@param Timeout Indicates the maximum timeout, in millisecond.
|
||||
@param Timeout Indicates the maximum timeout, in millisecond. If Timeout
|
||||
is 0, then the caller must wait for the function to be
|
||||
completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
@param Data Data buffer to be transmitted or received from USB device.
|
||||
@param DataLength The size (in bytes) of the data buffer.
|
||||
|
||||
|
@ -104,7 +106,9 @@ PeiUsbControlTransfer (
|
|||
from or receive into.
|
||||
@param DataLength The lenght of the data buffer.
|
||||
@param Timeout Indicates the maximum time, in millisecond, which the
|
||||
transfer is allowed to complete.
|
||||
transfer is allowed to complete. If Timeout is 0, then
|
||||
the caller must wait for the function to be completed
|
||||
until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
|
||||
|
||||
@retval EFI_SUCCESS The transfer was completed successfully.
|
||||
@retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource.
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Refer to section 16.1 of the UEFI 2.3 Specification for more information on
|
||||
these interfaces.
|
||||
|
||||
Copyright (c) 2010, Intel Corporation. All rights reserved. <BR>
|
||||
Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved. <BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -62,6 +62,9 @@ typedef struct _PEI_USB2_HOST_CONTROLLER_PPI PEI_USB2_HOST_CONTROLLER_PPI;
|
|||
actually transferred.
|
||||
@param[in] TimeOut Indicates the maximum time, in milliseconds,
|
||||
that the transfer is allowed to complete.
|
||||
If Timeout is 0, then the caller must wait for
|
||||
the function to be completed until EFI_SUCCESS
|
||||
or EFI_DEVICE_ERROR is returned.
|
||||
@param[in] Translator A pointer to the transaction translator data.
|
||||
@param[out] TransferResult A pointer to the detailed result information
|
||||
generated by this control transfer.
|
||||
|
@ -114,6 +117,9 @@ EFI_STATUS
|
|||
@param[in,out] DataToggle A pointer to the data toggle value.
|
||||
@param[in] TimeOut Indicates the maximum time, in milliseconds,
|
||||
in which the transfer is allowed to complete.
|
||||
If Timeout is 0, then the caller must wait for
|
||||
the function to be completed until EFI_SUCCESS
|
||||
or EFI_DEVICE_ERROR is returned.
|
||||
@param[in] Translator A pointer to the transaction translator data.
|
||||
@param[out] TransferResult A pointer to the detailed result information
|
||||
of the bulk transfer.
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Refer to section 16.1 of the UEFI 2.3 Specification for more information on
|
||||
these interfaces.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -61,7 +61,10 @@ typedef struct _PEI_USB_HOST_CONTROLLER_PPI PEI_USB_HOST_CONTROLLER_PPI;
|
|||
On output, indicates the amount of data
|
||||
actually transferred.
|
||||
@param[in] TimeOut Indicates the maximum time, in milliseconds,
|
||||
that the transfer is allowed to complete.
|
||||
that the transfer is allowed to complete.
|
||||
If Timeout is 0, then the caller must wait for
|
||||
the function to be completed until EFI_SUCCESS
|
||||
or EFI_DEVICE_ERROR is returned.
|
||||
@param[out] TransferResult A pointer to the detailed result information
|
||||
generated by this control transfer.
|
||||
|
||||
|
@ -107,6 +110,9 @@ EFI_STATUS
|
|||
@param[in,out] DataToggle A pointer to the data toggle value.
|
||||
@param[in] TimeOut Indicates the maximum time, in milliseconds,
|
||||
in which the transfer is allowed to complete.
|
||||
If Timeout is 0, then the caller must wait for
|
||||
the function to be completed until EFI_SUCCESS
|
||||
or EFI_DEVICE_ERROR is returned.
|
||||
@param[out] TransferResult A pointer to the detailed result information
|
||||
of the bulk transfer.
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
Refer to section 16.2.4 of the UEFI 2.3 Specification for more information on
|
||||
these interfaces.
|
||||
|
||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions
|
||||
|
@ -47,8 +47,11 @@ typedef struct _PEI_USB_IO_PPI PEI_USB_IO_PPI;
|
|||
@param[in] Direction Specifies the data direction for the transfer. There
|
||||
are three values available:
|
||||
EfiUsbDataIn, EfiUsbDataOut and EfiUsbNoData.
|
||||
@param[in] TimeOut Indicates the maximum time, in milliseconds, that
|
||||
@param[in] Timeout Indicates the maximum time, in milliseconds, that
|
||||
the transfer is allowed to complete.
|
||||
If Timeout is 0, then the caller must wait for the
|
||||
function to be completed until EFI_SUCCESS or
|
||||
EFI_DEVICE_ERROR is returned.
|
||||
@param[in,out] Data A pointer to the buffer of data that will be
|
||||
transmitted to or received from the USB device.
|
||||
@param[in] DataLength On input, indicates the size, in bytes, of the data
|
||||
|
@ -82,10 +85,13 @@ EFI_STATUS
|
|||
|
||||
@param[in] PeiServices The pointer to the PEI Services Table.
|
||||
@param[in] This The pointer to this instance of the PEI_USB_IO_PPI.
|
||||
@param[in] EndPointAddress The endpoint address.
|
||||
@param[in] DeviceEndpoint The endpoint address.
|
||||
@param[in] Data The data buffer to be transfered.
|
||||
@param[in] DataLength The length of data buffer.
|
||||
@param[in] TimeOut The timeout for the transfer, in milliseconds.
|
||||
@param[in] Timeout The timeout for the transfer, in milliseconds.
|
||||
If Timeout is 0, then the caller must wait for the
|
||||
function to be completed until EFI_SUCCESS or
|
||||
EFI_DEVICE_ERROR is returned.
|
||||
|
||||
@retval EFI_SUCCESS The bulk transfer completed successfully.
|
||||
@retval EFI_INVALID_PARAMETER Some parameters are invalid.
|
||||
|
|
Loading…
Reference in New Issue