From dbd527de10bf916febd63f3633aaf88ad9f568a9 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 31 Aug 2014 22:58:04 +0200 Subject: [PATCH] usb_keyboard: Try clearing endpoint stall on transfer failure. As the keyboard is used from usb_hid in the userland as well, we quite probably are not in sync with the data toggle. Clearing the stall should restore the toggle and make things work. --- src/add-ons/kernel/debugger/usb_keyboard/usb_keyboard.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/debugger/usb_keyboard/usb_keyboard.cpp b/src/add-ons/kernel/debugger/usb_keyboard/usb_keyboard.cpp index ee91d2981a..94d79add64 100644 --- a/src/add-ons/kernel/debugger/usb_keyboard/usb_keyboard.cpp +++ b/src/add-ons/kernel/debugger/usb_keyboard/usb_keyboard.cpp @@ -206,9 +206,15 @@ debugger_getchar(void) set_debug_variable("_usbTransferLength", (uint64)sUSBTransferLength); status_t status = evaluate_debug_command("usb_process_transfer"); - if (status != B_OK) + if (status == B_DEV_PENDING) return -1; + if (status != B_OK) { + // try clearing a possibly set halt due to toggle mismatches + evaluate_debug_command("usb_clear_stall"); + return -1; + } + bool phantomState = true; for (size_t i = 2; i < sUSBTransferLength; i++) { if (sUSBTransferData[i] != 0x01) {