From 5fdc723c38914eda727b903a48647aa85ff8d34b Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 8 Mar 2026 20:23:09 -0600 Subject: [PATCH] ps2d: limit mouse resets to 10 --- drivers/input/ps2d/src/controller.rs | 5 +++++ drivers/input/ps2d/src/mouse.rs | 14 +++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/input/ps2d/src/controller.rs b/drivers/input/ps2d/src/controller.rs index c017e52f77..28982cccd3 100644 --- a/drivers/input/ps2d/src/controller.rs +++ b/drivers/input/ps2d/src/controller.rs @@ -102,6 +102,8 @@ pub struct Ps2 { data: Pio, status: ReadOnly>, command: WriteOnly>, + //TODO: keep in state instead + pub mouse_resets: usize, } #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] @@ -109,6 +111,8 @@ pub struct Ps2 { data: Mmio, status: ReadOnly>, command: WriteOnly>, + //TODO: keep in state instead + pub mouse_resets: usize, } impl Ps2 { @@ -118,6 +122,7 @@ impl Ps2 { data: Pio::new(0x60), status: ReadOnly::new(Pio::new(0x64)), command: WriteOnly::new(Pio::new(0x64)), + mouse_resets: 0, } } diff --git a/drivers/input/ps2d/src/mouse.rs b/drivers/input/ps2d/src/mouse.rs index 02d66c44e1..9e95ab889b 100644 --- a/drivers/input/ps2d/src/mouse.rs +++ b/drivers/input/ps2d/src/mouse.rs @@ -1,6 +1,7 @@ use crate::controller::Ps2; use std::time::Duration; +pub const RESET_RETRIES: usize = 10; pub const RESET_TIMEOUT: Duration = Duration::from_millis(1000); pub const COMMAND_TIMEOUT: Duration = Duration::from_millis(100); @@ -125,6 +126,13 @@ pub enum MouseResult { impl MouseState { pub fn reset(&mut self, ps2: &mut Ps2) -> MouseResult { + if ps2.mouse_resets < RESET_RETRIES { + ps2.mouse_resets += 1; + } else { + log::error!("tried to reset mouse {} times, giving up", ps2.mouse_resets); + *self = MouseState::None; + return MouseResult::None; + } match ps2.mouse_command_async(MouseCommand::Reset as u8) { Ok(()) => { *self = MouseState::Reset; @@ -337,7 +345,6 @@ impl MouseState { } pub fn handle_timeout(&mut self, ps2: &mut Ps2) -> MouseResult { - let mut res = MouseResult::None; match *self { MouseState::None | MouseState::Streaming { .. } => MouseResult::None, MouseState::Init => { @@ -346,13 +353,10 @@ impl MouseState { } MouseState::Reset => { log::warn!("timeout waiting for mouse reset"); - //TODO: retry reset? - *self = MouseState::None; - MouseResult::None + self.reset(ps2) } MouseState::Bat => { log::warn!("timeout waiting for BAT completion"); - //TODO: limit number of resets self.reset(ps2) } MouseState::IdentifyTouchpad { .. } => {