uhci: reset the queue head after handling a keyboard interrupt.
When an interrupt transfer completes, the UHCI loads the QELP in the QH with the link pointer from the TD (which is a null pointer in this case). We need to set the QELP back to point at the TD to enable the next interrupt transfer.
This commit is contained in:
parent
75bc6822f8
commit
08bbac1065
|
@ -339,6 +339,7 @@ static uint8_t get_keycode(const usb_hcd_t *hcd)
|
|||
outw(UHCI_USBSTS_INT | UHCI_USBSTS_ERR, UHCI_USBSTS);
|
||||
|
||||
for (int kbd_idx = 0; kbd_idx < ws->num_keyboards; kbd_idx++) {
|
||||
uhci_qh_t *kbd_qh = &ws->qh[1 + kbd_idx];
|
||||
uhci_td_t *kbd_td = &ws->td[3 + kbd_idx];
|
||||
|
||||
status = kbd_td->control_status;
|
||||
|
@ -361,6 +362,7 @@ static uint8_t get_keycode(const usb_hcd_t *hcd)
|
|||
|
||||
// Reenable the TD.
|
||||
write32(&kbd_td->control_status, kbd_td->driver_data[0]);
|
||||
write32(&kbd_qh->qe_link_ptr, (uintptr_t)kbd_td | UHCI_LP_TYPE_TD);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue