//\r
// The length of data which were transferred.\r
//\r
- CheckedUrb->Completed += (CheckedUrb->DataLen - EvtTrb->Length);\r
+ CheckedUrb->Completed += (((TRANSFER_TRB_NORMAL*)TRBPtr)->Length - EvtTrb->Length);\r
} else {\r
CheckedUrb->Result |= EFI_USB_ERR_TIMEOUT;\r
}\r
)\r
{\r
TRANSFER_RING *Ring;\r
- UINT64 Begin;\r
- UINT64 TimeoutTicker;\r
- UINT64 TimerRound;\r
TRB_TEMPLATE *Trb;\r
+ UINTN Loop;\r
+ UINTN Index;\r
\r
- Begin = 0;\r
- TimeoutTicker = 0; \r
- TimerRound = 0;\r
-\r
- XhcRingDoorBell (Handle, Urb);\r
-\r
- if (Timeout != 0) {\r
- Begin = GetPerformanceCounter ();\r
- TimeoutTicker = DivU64x32 (\r
- MultU64x64 (\r
- Handle->TimerFrequency,\r
- Timeout\r
- ),\r
- 1000000u\r
- );\r
- TimerRound = DivU64x64Remainder (\r
- TimeoutTicker,\r
- DivU64x32 (Handle->TimerCycle, 2),\r
- &TimeoutTicker\r
- );\r
+ Loop = Timeout / XHC_DEBUG_PORT_1_MILLISECOND;\r
+ if (Timeout == 0) {\r
+ Loop = 0xFFFFFFFF;\r
}\r
-\r
+ XhcRingDoorBell (Handle, Urb);\r
//\r
// Event Ring Not Empty bit can only be set to 1 by XHC after ringing door bell with some delay.\r
//\r
- while (TRUE) {\r
- if (Timeout != 0) {\r
- if (TimerRound == 0) {\r
- if (IsTimerTimeout (Handle, Begin, TimeoutTicker)) {\r
- //\r
- // If time out occurs.\r
- //\r
- Urb->Result |= EFI_USB_ERR_TIMEOUT;\r
- break;\r
- }\r
- } else {\r
- if (IsTimerTimeout (Handle, Begin, DivU64x32 (Handle->TimerCycle, 2))) {\r
- TimerRound --;\r
- }\r
- }\r
- }\r
+ for (Index = 0; Index < Loop; Index++) {\r
XhcCheckUrbResult (Handle, Urb);\r
if (Urb->Finished) {\r
break;\r
}\r
+ MicroSecondDelay (XHC_DEBUG_PORT_1_MILLISECOND);\r
}\r
- \r
+ if (Index == Loop) {\r
+ //\r
+ // If time out occurs.\r
+ //\r
+ Urb->Result |= EFI_USB_ERR_TIMEOUT;\r
+ } \r
//\r
// If URB transfer is error, restore transfer ring to original value before URB transfer\r
// This will make the current transfer TRB is always at the latest unused one in transfer ring.\r