Test for retry of driver detach and interface claim

This commit is contained in:
Luke
2020-07-07 14:50:18 +12:00
parent 229fa93bc7
commit c6c934bf40

View File

@@ -65,32 +65,36 @@ impl RogCore {
} }
} }
if let Err(err) = dev_handle.set_auto_detach_kernel_driver(true) {
warn!("Auto-detach kernel driver failed: {:?}", err);
let mut fail_count = 10;
while fail_count > 0 {
warn!("Trying device reset");
fail_count -= 1;
dev_handle.reset()?;
std::thread::sleep(std::time::Duration::from_millis(500));
dev_handle dev_handle
.set_auto_detach_kernel_driver(true) .set_auto_detach_kernel_driver(true)
.map_err(|err| { .map_err(|err| {
error!("Auto-detach kernel driver failed: {:?}", err); error!("Auto-detach kernel driver failed: {:?}", err);
err err
})?; })?;
}
}
if let Err(err) = dev_handle.claim_interface(interface) { if let Err(err) = dev_handle.claim_interface(interface) {
warn!("Could not claim keyboard device interface: {:?}", err); warn!("Could not claim keyboard device interface: {:?}", err);
warn!("Trying to detach kernel driver then retry"); let mut fail_count = 10;
if let Ok(active) = dev_handle.kernel_driver_active(interface) { while fail_count > 0 {
if active { warn!("Sleeping");
dev_handle.reset()?; fail_count -= 1;
dev_handle.detach_kernel_driver(interface).map_err(|err| { std::thread::sleep(std::time::Duration::from_millis(500));
warn!("Could not detach kernel driver: {:?}", err);
err
})?;
} else {
warn!("Kernel driver not active, continue");
}
}
dev_handle.claim_interface(interface).map_err(|err| { dev_handle.claim_interface(interface).map_err(|err| {
error!("Could not claim keyboard device interface: {:?}", err); error!("Could not claim keyboard device interface: {:?}", err);
err err
})?; })?;
} }
}
Ok(RogCore { Ok(RogCore {
handle: dev_handle, handle: dev_handle,