Enhance Ps2Mouse and Ps2Keyboard driver and fix for random hangs in System waiting for the Key if no KBC is present.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8473 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -228,6 +228,18 @@ PS2MouseDriverStart (
|
||||
// Initialize keyboard controller if necessary
|
||||
//
|
||||
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
|
||||
//
|
||||
// Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.
|
||||
//
|
||||
if ((Data & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {
|
||||
//
|
||||
// If nobody decodes KBC I/O port, it will read back as 0xFF.
|
||||
// Check the Time-Out and Parity bit to see if it has an active KBC in system
|
||||
//
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
|
||||
goto ErrorExit;
|
||||
}
|
||||
if ((Data & KBC_SYSF) != KBC_SYSF) {
|
||||
Status = KbcSelfTest (IsaIo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -329,7 +341,9 @@ PS2MouseDriverStart (
|
||||
|
||||
ErrorExit:
|
||||
|
||||
KbcDisableAux (IsaIo);
|
||||
if (Status != EFI_DEVICE_ERROR) {
|
||||
KbcDisableAux (IsaIo);
|
||||
}
|
||||
|
||||
if (StatusCode != 0) {
|
||||
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
|
||||
@ -350,13 +364,16 @@ ErrorExit:
|
||||
if ((MouseDev != NULL) && (MouseDev->ControllerNameTable != NULL)) {
|
||||
FreeUnicodeStringTable (MouseDev->ControllerNameTable);
|
||||
}
|
||||
//
|
||||
// Since there will be no timer handler for mouse input any more,
|
||||
// exhaust input data just in case there is still mouse data left
|
||||
//
|
||||
EmptyStatus = EFI_SUCCESS;
|
||||
while (!EFI_ERROR (EmptyStatus)) {
|
||||
EmptyStatus = In8042Data (IsaIo, &Data);
|
||||
|
||||
if (Status != EFI_DEVICE_ERROR) {
|
||||
//
|
||||
// Since there will be no timer handler for mouse input any more,
|
||||
// exhaust input data just in case there is still mouse data left
|
||||
//
|
||||
EmptyStatus = EFI_SUCCESS;
|
||||
while (!EFI_ERROR (EmptyStatus)) {
|
||||
EmptyStatus = In8042Data (IsaIo, &Data);
|
||||
}
|
||||
}
|
||||
|
||||
if (MouseDev != NULL) {
|
||||
|
Reference in New Issue
Block a user