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
This commit is contained in:
Stefan Kalkowski 2022-04-25 11:13:23 +02:00 committed by Christian Helmuth
parent 2e9e5c37b5
commit 8ca2c597e0
2 changed files with 40 additions and 5 deletions

View File

@ -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;
};
/**

View File

@ -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;