Kernel: Make PS/2 controller not hang if device keeps sending resend

This commit is contained in:
Bananymous 2024-11-19 00:18:48 +02:00
parent f8ef11b4d2
commit 627ca432cc
1 changed files with 5 additions and 4 deletions

View File

@ -70,18 +70,19 @@ namespace Kernel::Input
BAN::ErrorOr<void> PS2Controller::device_send_byte_and_wait_ack(uint8_t device_index, uint8_t byte) BAN::ErrorOr<void> PS2Controller::device_send_byte_and_wait_ack(uint8_t device_index, uint8_t byte)
{ {
LockGuard _(m_mutex); LockGuard _(m_mutex);
for (;;) for (size_t attempt = 0; attempt < 10; attempt++)
{ {
TRY(device_send_byte(device_index, byte)); TRY(device_send_byte(device_index, byte));
uint8_t response = TRY(read_byte()); uint8_t response = TRY(read_byte());
if (response == PS2::Response::RESEND) if (response == PS2::Response::RESEND)
continue; continue;
if (response == PS2::Response::ACK) if (response == PS2::Response::ACK)
break; return {};
dwarnln_if(DEBUG_PS2, "PS/2 device on port {} did not respond with expected ACK, got {2H}", device_index, byte); dwarnln_if(DEBUG_PS2, "PS/2 device on port {} did not respond with expected ACK, got {2H}", device_index, byte);
return BAN::Error::from_errno(EBADMSG); return BAN::Error::from_errno(EBADMSG);
} }
return {}; dwarnln_if(DEBUG_PS2, "PS/2 device on port {} is in resend loop", device_index, byte);
return BAN::Error::from_errno(EBADMSG);
} }
uint8_t PS2Controller::get_device_index(PS2Device* device) const uint8_t PS2Controller::get_device_index(PS2Device* device) const
@ -244,7 +245,7 @@ namespace Kernel::Input
if (fadt && fadt->revision > 1 && !(fadt->iapc_boot_arch & (1 << 1))) if (fadt && fadt->revision > 1 && !(fadt->iapc_boot_arch & (1 << 1)))
{ {
dwarnln_if(DEBUG_PS2, "No PS/2 available"); dwarnln_if(DEBUG_PS2, "No PS/2 available");
return {}; return BAN::Error::from_errno(ENODEV);
} }
// Disable Devices // Disable Devices