return XhciMmioBase;\r
}\r
\r
-/**\r
- Check if the timer is timeout.\r
- \r
- @param[in] UsbDebugPortHandle Pointer to USB Debug port handle\r
- @param[in] Timer The start timer from the begin.\r
- @param[in] TimeoutTicker Ticker number need time out.\r
-\r
- @return TRUE Timer time out occurs.\r
- @retval FALSE Timer does not time out.\r
-\r
-**/\r
-BOOLEAN\r
-IsTimerTimeout (\r
- IN USB3_DEBUG_PORT_HANDLE *UsbDebugPortHandle,\r
- IN UINT64 Timer,\r
- IN UINT64 TimeoutTicker\r
- )\r
-{\r
- UINT64 CurrentTimer;\r
- UINT64 Delta;\r
-\r
- CurrentTimer = GetPerformanceCounter ();\r
-\r
- if (UsbDebugPortHandle->TimerCountDown) {\r
- //\r
- // The timer counter counts down. Check for roll over condition.\r
- //\r
- if (CurrentTimer < Timer) {\r
- Delta = Timer - CurrentTimer;\r
- } else {\r
- //\r
- // Handle one roll-over. \r
- //\r
- Delta = UsbDebugPortHandle->TimerCycle - (CurrentTimer - Timer);\r
- }\r
- } else {\r
- //\r
- // The timer counter counts up. Check for roll over condition.\r
- //\r
- if (CurrentTimer > Timer) {\r
- Delta = CurrentTimer - Timer;\r
- } else {\r
- //\r
- // Handle one roll-over. \r
- //\r
- Delta = UsbDebugPortHandle->TimerCycle - (Timer - CurrentTimer);\r
- }\r
- }\r
- \r
- return (BOOLEAN) (Delta >= TimeoutTicker);\r
-}\r
-\r
/**\r
Update XHC MMIO base address when MMIO base address is changed.\r
\r
{\r
USB3_DEBUG_PORT_HANDLE *UsbDebugPortHandle;\r
RETURN_STATUS Status;\r
- UINTN Received;\r
- UINTN Total;\r
- UINTN Remaining;\r
UINT8 Index;\r
- UINTN Length;\r
- UINT64 Begin;\r
- UINT64 TimeoutTicker;\r
- UINT64 TimerRound;\r
- EFI_PHYSICAL_ADDRESS XhciMmioBase;\r
UINT8 *Data;\r
\r
- if (NumberOfBytes == 0 || Buffer == NULL) {\r
+ if (NumberOfBytes != 1 || Buffer == NULL || Timeout != 0) {\r
return 0;\r
}\r
\r
- Received = 0;\r
- Total = 0;\r
- Remaining = 0;\r
-\r
//\r
// If Handle is NULL, it means memory is ready for use.\r
// Use global variable to store handle value.\r
return 0;\r
}\r
\r
- XhciMmioBase = ProgramXhciBaseAddress ();\r
- UpdateXhcResource (UsbDebugPortHandle, XhciMmioBase);\r
- \r
if (NeedReinitializeHardware(UsbDebugPortHandle)) {\r
Status = InitializeUsbDebugHardware (UsbDebugPortHandle);\r
if (RETURN_ERROR(Status)) {\r
Data = (UINT8 *)(UINTN)UsbDebugPortHandle->Data;\r
\r
//\r
- // First read data from buffer, then read debug port hw to get received data.\r
+ // Read data from buffer\r
//\r
- if (UsbDebugPortHandle->DataCount > 0) {\r
- if (NumberOfBytes <= UsbDebugPortHandle->DataCount) {\r
- Total = NumberOfBytes;\r
- } else {\r
- Total = UsbDebugPortHandle->DataCount;\r
- }\r
-\r
- for (Index = 0; Index < Total; Index++) {\r
- Buffer[Index] = Data[Index];\r
- }\r
+ if (UsbDebugPortHandle->DataCount < 1) {\r
+ return 0;\r
+ } else {\r
+ *Buffer = Data[0];\r
\r
- for (Index = 0; Index < UsbDebugPortHandle->DataCount - Total; Index++) {\r
- if (Total + Index >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
+ for (Index = 0; Index < UsbDebugPortHandle->DataCount - 1; Index++) {\r
+ if ((Index + 1) >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
return 0;\r
}\r
- Data[Index] = Data[Total + Index];\r
+ Data[Index] = Data[Index + 1];\r
}\r
- UsbDebugPortHandle->DataCount = (UINT8)(UsbDebugPortHandle->DataCount - (UINT8)Total);\r
+ UsbDebugPortHandle->DataCount = (UINT8)(UsbDebugPortHandle->DataCount - 1);\r
+ return 1;\r
}\r
-\r
- //\r
- // If Timeout is equal to 0, then it means it should always wait until all data required are received.\r
- //\r
- Begin = 0;\r
- TimeoutTicker = 0; \r
- TimerRound = 0;\r
- if (Timeout != 0) {\r
- Begin = GetPerformanceCounter ();\r
- TimeoutTicker = DivU64x32 (\r
- MultU64x64 (\r
- UsbDebugPortHandle->TimerFrequency,\r
- Timeout\r
- ),\r
- 1000000u\r
- );\r
- TimerRound = DivU64x64Remainder (\r
- TimeoutTicker,\r
- DivU64x32 (UsbDebugPortHandle->TimerCycle, 2),\r
- &TimeoutTicker\r
- );\r
- }\r
-\r
- //\r
- // Read remaining data by executing one or more usb debug transfer transactions at usb debug port hw.\r
- //\r
- while (Total < NumberOfBytes) {\r
- if (Timeout != 0) {\r
- if (TimerRound == 0) {\r
- if (IsTimerTimeout (UsbDebugPortHandle, Begin, TimeoutTicker)) {\r
- //\r
- // If time out occurs.\r
- //\r
- return 0;\r
- }\r
- } else {\r
- if (IsTimerTimeout (UsbDebugPortHandle, Begin, DivU64x32 (UsbDebugPortHandle->TimerCycle, 2))) {\r
- TimerRound --;\r
- }\r
- }\r
- }\r
- Remaining = NumberOfBytes - Total;\r
- if (Remaining >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
- Received = XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE;\r
- Status = XhcDataTransfer (UsbDebugPortHandle, EfiUsbDataIn, Buffer + Total, &Received, DATA_TRANSFER_READ_TIMEOUT);\r
- } else {\r
- Received = XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE;\r
- Status = XhcDataTransfer (UsbDebugPortHandle, EfiUsbDataIn, (VOID *)Data, &Received, DATA_TRANSFER_READ_TIMEOUT);\r
- UsbDebugPortHandle->DataCount = (UINT8) Received;\r
-\r
- if (Remaining <= Received) {\r
- //\r
- // The data received are more than required\r
- //\r
- Length = (UINT8)Remaining;\r
- } else {\r
- //\r
- // The data received are less than the remaining bytes\r
- //\r
- Length = (UINT8)Received;\r
- }\r
-\r
- //\r
- // Copy required data from the data buffer to user buffer.\r
- //\r
- for (Index = 0; Index < Length; Index++) {\r
- (Buffer + Total)[Index] = Data[Index];\r
- UsbDebugPortHandle->DataCount--;\r
- }\r
-\r
- //\r
- // reorder the data buffer to make available data arranged from the beginning of the data buffer.\r
- //\r
- for (Index = 0; Index < Received - Length; Index++) {\r
- if (Length + Index >= XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE) {\r
- return 0;\r
- }\r
- Data[Index] = Data[Length + Index];\r
- }\r
- //\r
- // fixup the real required length of data.\r
- //\r
- Received = Length;\r
- }\r
- Total += Received;\r
- }\r
- return Total;\r
}\r
\r
/**\r
RETURN_STATUS Status;\r
USB3_DEBUG_PORT_HANDLE Handle;\r
USB3_DEBUG_PORT_HANDLE *UsbDebugPortHandle;\r
- UINT64 TimerStartValue;\r
- UINT64 TimerEndValue;\r
\r
//\r
// Validate the PCD PcdDebugPortHandleBufferSize value \r
UsbDebugPortHandle = &Handle;\r
}\r
\r
- UsbDebugPortHandle->TimerFrequency = GetPerformanceCounterProperties (\r
- &TimerStartValue,\r
- &TimerEndValue\r
- );\r
-\r
- if (TimerEndValue < TimerStartValue) {\r
- UsbDebugPortHandle->TimerCountDown = TRUE;\r
- UsbDebugPortHandle->TimerCycle = TimerStartValue - TimerEndValue;\r
- } else {\r
- UsbDebugPortHandle->TimerCountDown = FALSE;\r
- UsbDebugPortHandle->TimerCycle = TimerEndValue - TimerStartValue;\r
- } \r
-\r
if (Function == NULL && Context != NULL) {\r
return (DEBUG_PORT_HANDLE *) Context;\r
}\r