MdeModulePkg/XhciDxe: Add access xHCI Extended Capabilities Pointer
Add support process Port Speed field value of PORTSC according to Supported Protocol Capability (define in xHCI spec 1.1) REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3914 The value of Port Speed field in PORTSC bit[10:13] (xHCI spec 1.1 section 5.4.8) should be change to use this value to query thru Protocol Speed ID (PSI) (xHCI spec 1.1 section 7.2.1) in xHCI Supported Protocol Capability and return the value according the Protocol Speed ID (PSIV) Dword. With this mechanism may able to detect more kind of Protocol Speed in USB3 and also compatiable with three kind of speed of USB2. Cc: Jenny Huang <jenny.huang@intel.com> Cc: More Shih <more.shih@intel.com> Cc: Hao A Wu <hao.a.wu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Signed-off-by: Ian Chiu <Ian.chiu@intel.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
@@ -399,24 +399,31 @@ XhcGetRootHubPortStatus (
|
||||
|
||||
//
|
||||
// According to XHCI 1.1 spec November 2017,
|
||||
// bit 10~13 of the root port status register identifies the speed of the attached device.
|
||||
// Section 7.2 xHCI Support Protocol Capability
|
||||
//
|
||||
switch ((State & XHC_PORTSC_PS) >> 10) {
|
||||
case 2:
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED;
|
||||
break;
|
||||
PortStatus->PortStatus = XhcCheckUsbPortSpeedUsedPsic (Xhc, ((State & XHC_PORTSC_PS) >> 10));
|
||||
if (PortStatus->PortStatus == 0) {
|
||||
//
|
||||
// According to XHCI 1.1 spec November 2017,
|
||||
// bit 10~13 of the root port status register identifies the speed of the attached device.
|
||||
//
|
||||
switch ((State & XHC_PORTSC_PS) >> 10) {
|
||||
case 2:
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED;
|
||||
break;
|
||||
case 3:
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_SUPER_SPEED;
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_SUPER_SPEED;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1826,6 +1833,8 @@ XhcCreateUsbHc (
|
||||
Xhc->ExtCapRegBase = ExtCapReg << 2;
|
||||
Xhc->UsbLegSupOffset = XhcGetCapabilityAddr (Xhc, XHC_CAP_USB_LEGACY);
|
||||
Xhc->DebugCapSupOffset = XhcGetCapabilityAddr (Xhc, XHC_CAP_USB_DEBUG);
|
||||
Xhc->Usb2SupOffset = XhcGetSupportedProtocolCapabilityAddr (Xhc, XHC_SUPPORTED_PROTOCOL_DW0_MAJOR_REVISION_USB2);
|
||||
Xhc->Usb3SupOffset = XhcGetSupportedProtocolCapabilityAddr (Xhc, XHC_SUPPORTED_PROTOCOL_DW0_MAJOR_REVISION_USB3);
|
||||
|
||||
DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: Capability length 0x%x\n", Xhc->CapLength));
|
||||
DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: HcSParams1 0x%x\n", Xhc->HcSParams1));
|
||||
@@ -1835,6 +1844,8 @@ XhcCreateUsbHc (
|
||||
DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: RTSOff 0x%x\n", Xhc->RTSOff));
|
||||
DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: UsbLegSupOffset 0x%x\n", Xhc->UsbLegSupOffset));
|
||||
DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: DebugCapSupOffset 0x%x\n", Xhc->DebugCapSupOffset));
|
||||
DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: Usb2SupOffset 0x%x\n", Xhc->Usb2SupOffset));
|
||||
DEBUG ((DEBUG_INFO, "XhcCreateUsb3Hc: Usb3SupOffset 0x%x\n", Xhc->Usb3SupOffset));
|
||||
|
||||
//
|
||||
// Create AsyncRequest Polling Timer
|
||||
|
Reference in New Issue
Block a user