mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-15 17:54:25 +02:00
MdeModulePkg/XhciDxe: Abort the Address Device cmd when time out
https://bugzilla.tianocore.org/show_bug.cgi?id=4552 Following XHCI spec 4.6.1.2, software may abort the execution of Address Device Command when command failed due to timeout. Cc: Hao A Wu <hao.a.wu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: More Shih <more.shih@intel.com> Cc: Jenny Huang <jenny.huang@intel.com> Signed-off-by: Xianglei Cai <xianglei.cai@intel.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
parent
43dcf453fc
commit
d11f0ea045
@ -2107,6 +2107,26 @@ RingIntTransferDoorBell (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set Command abort
|
||||||
|
|
||||||
|
@param Xhc The XHCI Instance.
|
||||||
|
@param SlotId The slot id to be disabled.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
XhcCmdRingCmdAbort (
|
||||||
|
IN USB_XHCI_INSTANCE *Xhc,
|
||||||
|
IN UINT8 SlotId
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Set XHC_CRCR_CA bit in XHC_CRCR_OFFSET to abort command.
|
||||||
|
//
|
||||||
|
DEBUG ((DEBUG_INFO, "Command Ring Control set Command Abort, SlotId: %d\n", SlotId));
|
||||||
|
XhcSetOpRegBit (Xhc, XHC_CRCR_OFFSET, XHC_CRCR_CA);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Assign and initialize the device slot for a new device.
|
Assign and initialize the device slot for a new device.
|
||||||
|
|
||||||
@ -2317,6 +2337,14 @@ XhcInitializeDeviceSlot (
|
|||||||
Xhc->UsbDevContext[SlotId].XhciDevAddr = DeviceAddress;
|
Xhc->UsbDevContext[SlotId].XhciDevAddr = DeviceAddress;
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_ERROR, " Slot %d address not assigned successfully. Status = %r\n", SlotId, Status));
|
DEBUG ((DEBUG_ERROR, " Slot %d address not assigned successfully. Status = %r\n", SlotId, Status));
|
||||||
|
//
|
||||||
|
// Software may abort the execution of Address Device Command when command failed
|
||||||
|
// due to timeout by following XHCI spec. 4.6.1.2.
|
||||||
|
//
|
||||||
|
if (Status == EFI_TIMEOUT) {
|
||||||
|
XhcCmdRingCmdAbort (Xhc, SlotId);
|
||||||
|
}
|
||||||
|
|
||||||
XhcDisableSlotCmd (Xhc, SlotId);
|
XhcDisableSlotCmd (Xhc, SlotId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2533,6 +2561,14 @@ XhcInitializeDeviceSlot64 (
|
|||||||
Xhc->UsbDevContext[SlotId].XhciDevAddr = DeviceAddress;
|
Xhc->UsbDevContext[SlotId].XhciDevAddr = DeviceAddress;
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_ERROR, " Slot %d address not assigned successfully. Status = %r\n", SlotId, Status));
|
DEBUG ((DEBUG_ERROR, " Slot %d address not assigned successfully. Status = %r\n", SlotId, Status));
|
||||||
|
//
|
||||||
|
// Software may abort the execution of Address Device Command when command failed
|
||||||
|
// due to timeout by following XHCI spec. 4.6.1.2.
|
||||||
|
//
|
||||||
|
if (Status == EFI_TIMEOUT) {
|
||||||
|
XhcCmdRingCmdAbort (Xhc, SlotId);
|
||||||
|
}
|
||||||
|
|
||||||
XhcDisableSlotCmd64 (Xhc, SlotId);
|
XhcDisableSlotCmd64 (Xhc, SlotId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user