From d3002b26ac627b9158fc6d7d05c841b1f1f008ac Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Tue, 10 Dec 2024 12:36:44 +0100 Subject: [PATCH] libusb: warn once and freeze when device vanishs Instead of repeatedly printing error messages when a device is not available anymore, print an error once and then sleep forever. There is no dynamic behaviour with respect to device availability implemented in the libusb yet. Instead, you can manage libusb components externally. Ref genodelabs/genode#5401 --- repos/libports/src/lib/libusb/genode_usb_raw.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/repos/libports/src/lib/libusb/genode_usb_raw.cc b/repos/libports/src/lib/libusb/genode_usb_raw.cc index 42672b7621..18610e8d32 100644 --- a/repos/libports/src/lib/libusb/genode_usb_raw.cc +++ b/repos/libports/src/lib/libusb/genode_usb_raw.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -168,6 +169,11 @@ void Usb_device::Interface::handle_events() /* complete USB request */ [this] (Urb &urb, Usb::Tagged_packet::Return_value v) { + if (v == Usb::Tagged_packet::NO_DEVICE) { + error("USB device has vanished, will freeze!"); + sleep_forever(); + } + if (v != Usb::Tagged_packet::OK) error("transfer failed, return value ", (int)v); @@ -218,6 +224,11 @@ void Usb_device::handle_events() /* complete USB request */ [this] (Urb &urb, Usb::Tagged_packet::Return_value v) { + if (v == Usb::Tagged_packet::NO_DEVICE) { + error("USB device has vanished, will freeze!"); + sleep_forever(); + } + if (v != Usb::Tagged_packet::OK) error("control transfer failed, return value ", (int)v);