From 8ca2c597e091a41988744a406ceaa64c826f6860 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Mon, 25 Apr 2022 11:13:23 +0200 Subject: [PATCH] os: extend USB C-API with claim/release To signal that a device gets used and released by a session introduce claim, release, and release all callbacks in the USB interface of the C-API. Ref genodelabs/genode#4483 --- repos/os/include/genode_c_api/usb.h | 21 +++++++++++++++++++++ repos/os/src/lib/genode_c_api/usb.cc | 24 +++++++++++++++++++----- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/repos/os/include/genode_c_api/usb.h b/repos/os/include/genode_c_api/usb.h index 36e3a39920..207a17e455 100644 --- a/repos/os/include/genode_c_api/usb.h +++ b/repos/os/include/genode_c_api/usb.h @@ -68,6 +68,24 @@ typedef int (*genode_usb_rpc_endp_desc_t) (genode_usb_bus_num_t bus, genode_usb_dev_num_t dev, unsigned idx, unsigned alt, unsigned endp, void * buf, unsigned long buf_size); +/** + * Callback to claim a given interface + */ +typedef int (*genode_usb_rpc_claim_t) + (genode_usb_bus_num_t bus, genode_usb_dev_num_t dev, unsigned iface); + +/** + * Callback to release a given interface + */ +typedef int (*genode_usb_rpc_release_t) + (genode_usb_bus_num_t bus, genode_usb_dev_num_t dev, unsigned iface); + +/** + * Callback to release all interfaces + */ +typedef void (*genode_usb_rpc_release_all_t) + (genode_usb_bus_num_t bus, genode_usb_dev_num_t dev); + struct genode_usb_rpc_callbacks { genode_shared_dataspace_alloc_attach_t alloc_fn; genode_shared_dataspace_free_t free_fn; @@ -76,6 +94,9 @@ struct genode_usb_rpc_callbacks { genode_usb_rpc_iface_desc_t iface_desc_fn; genode_usb_rpc_iface_extra_t iface_extra_fn; genode_usb_rpc_endp_desc_t endp_desc_fn; + genode_usb_rpc_claim_t claim_fn; + genode_usb_rpc_release_t release_fn; + genode_usb_rpc_release_all_t release_all_fn; }; /** diff --git a/repos/os/src/lib/genode_c_api/usb.cc b/repos/os/src/lib/genode_c_api/usb.cc index f6e4ff6a81..84138e872a 100644 --- a/repos/os/src/lib/genode_c_api/usb.cc +++ b/repos/os/src/lib/genode_c_api/usb.cc @@ -376,15 +376,27 @@ void genode_usb_session::endpoint_descriptor(unsigned interface_num, } -void genode_usb_session::claim_interface(unsigned) +void genode_usb_session::claim_interface(unsigned iface) { - warning(__func__, " gets ignored!"); + genode_usb_bus_num_t bus; + genode_usb_dev_num_t dev; + if (!_root.device_associated(this, bus, dev)) + throw Device_not_found(); + + if (_callbacks->claim_fn(bus, dev, iface)) + throw Interface_not_found(); } -void genode_usb_session::release_interface(unsigned) +void genode_usb_session::release_interface(unsigned iface) { - warning(__func__, " gets ignored!"); + genode_usb_bus_num_t bus; + genode_usb_dev_num_t dev; + if (!_root.device_associated(this, bus, dev)) + throw Device_not_found(); + + if (_callbacks->release_fn(bus, dev, iface)) + throw Interface_not_found(); } @@ -576,8 +588,10 @@ genode_usb_session * ::Root::_create_session(const char * args, void ::Root::_destroy_session(genode_usb_session * session) { _for_each_device([&] (Device & d) { - if (d.usb_session == session) + if (d.usb_session == session) { + _callbacks->release_all_fn(d.bus, d.dev); d.usb_session = nullptr; + } }); genode_usb_session_handle_t id = session->_id;