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:
@ -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) {
|
||||
|
Reference in New Issue
Block a user