diff --git a/repos/dde_linux/src/lib/usb/raw/raw.cc b/repos/dde_linux/src/lib/usb/raw/raw.cc index 0c79d8bc1d..0e1316928b 100644 --- a/repos/dde_linux/src/lib/usb/raw/raw.cc +++ b/repos/dde_linux/src/lib/usb/raw/raw.cc @@ -226,6 +226,11 @@ class Usb::Worker p.succeded = true; } + if (err >= 0 + && p.control.request == USB_REQ_CLEAR_FEATURE + && p.control.value == USB_ENDPOINT_HALT) { + usb_reset_endpoint(_device->udev, p.control.index); + } kfree(buf); } @@ -249,6 +254,10 @@ class Usb::Worker urb->actual_length); } + if (urb->status == -EPIPE) { + p.error = Packet_descriptor::STALL_ERROR; + } + _ack_packet(p); } diff --git a/repos/os/include/usb_session/usb_session.h b/repos/os/include/usb_session/usb_session.h index d1acd9b03f..043cfe2697 100644 --- a/repos/os/include/usb_session/usb_session.h +++ b/repos/os/include/usb_session/usb_session.h @@ -76,6 +76,10 @@ struct Usb::Packet_descriptor : Genode::Packet_descriptor }; }; + enum Error { NO_ERROR, STALL_ERROR }; + + Error error = NO_ERROR; + bool is_read_transfer() { return transfer.ep & ENDPOINT_IN; } Packet_descriptor(off_t offset = 0, size_t size = 0)