qemu-usb: support policy labels w/o vendor/product

Fixes #4492
This commit is contained in:
Alexander Boettcher 2022-04-27 17:02:55 +02:00 committed by Christian Helmuth
parent 858505918a
commit dada0dff78

View File

@ -208,17 +208,21 @@ struct Completion : Usb::Completion
*/ */
struct Dev_info struct Dev_info
{ {
Session_label const label;
uint32_t const vendor, product; uint32_t const vendor, product;
uint16_t const bus, dev; uint16_t const bus, dev;
Dev_info(uint16_t bus, uint16_t dev, uint32_t vendor, uint32_t product) Dev_info(Session_label label, uint16_t bus, uint16_t dev,
uint32_t vendor, uint32_t product)
: :
vendor(vendor), product(product), bus(bus), dev(dev) label(label), vendor(vendor), product(product), bus(bus), dev(dev)
{ } { }
void print(Output &out) const void print(Output &out) const
{ {
Genode::print(out, Hex(bus, Hex::OMIT_PREFIX, Hex::PAD), ":", Genode::print(out, label, " ",
Hex(bus, Hex::OMIT_PREFIX, Hex::PAD), ":",
Hex(dev, Hex::OMIT_PREFIX, Hex::PAD), " (", Hex(dev, Hex::OMIT_PREFIX, Hex::PAD), " (",
"vendor=", Hex(vendor, Hex::OMIT_PREFIX), ", ", "vendor=", Hex(vendor, Hex::OMIT_PREFIX), ", ",
"product=", Hex(product, Hex::OMIT_PREFIX), ")"); "product=", Hex(product, Hex::OMIT_PREFIX), ")");
@ -232,6 +236,9 @@ struct Dev_info
if (vendor && product) if (vendor && product)
return vendor != other.vendor || product != other.product; return vendor != other.vendor || product != other.product;
if (label.length() && other.label.length())
return label != other.label;
return true; return true;
} }
}; };
@ -305,12 +312,10 @@ struct Usb_host_device : List<Usb_host_device>::Element
return result; return result;
} }
Usb_host_device(Entrypoint &ep, Allocator &alloc, Usb_host_device(Entrypoint &ep, Allocator &alloc, Env &env, Dev_info info)
Env &env, char const *label,
Dev_info info)
: :
label(label), _alloc(alloc), _alloc(alloc),
usb_raw(env, &_usb_alloc, label, 6*1024*1024, state_dispatcher), usb_raw(env, &_usb_alloc, info.label.string(), 6*1024*1024, state_dispatcher),
info(info), _ep(ep) info(info), _ep(ep)
{ {
usb_raw.tx_channel()->sigh_ack_avail(ack_avail_dispatcher); usb_raw.tx_channel()->sigh_ack_avail(ack_avail_dispatcher);
@ -997,21 +1002,19 @@ struct Usb_devices : List<Usb_host_device>
Xml_node devices_node(_devices_rom.local_addr<char>(), _devices_rom.size()); Xml_node devices_node(_devices_rom.local_addr<char>(), _devices_rom.size());
devices_node.for_each_sub_node("device", [&] (Xml_node const &node) { devices_node.for_each_sub_node("device", [&] (Xml_node const &node) {
unsigned product = node.attribute_value<unsigned>("product_id", 0); auto const product = node.attribute_value("product_id", 0u);
unsigned vendor = node.attribute_value<unsigned>("vendor_id", 0); auto const vendor = node.attribute_value("vendor_id", 0u);
unsigned bus = node.attribute_value<unsigned>("bus", 0); auto const bus = node.attribute_value("bus", 0u);
unsigned dev = node.attribute_value<unsigned>("dev", 0); auto const dev = node.attribute_value("dev", 0u);
Session_label label = node.attribute_value("label", String<160>());
Dev_info const dev_info(bus, dev, vendor, product); Dev_info const dev_info(label, bus, dev, vendor, product);
if (!node.has_attribute("label")) { if (!node.has_attribute("label")) {
error("no label found for device ", dev_info); error("no label found for device ", dev_info);
return; return;
} }
typedef String<128> Label;
Label const label = node.attribute_value("label", Label());
/* ignore if already created */ /* ignore if already created */
bool exists = false; bool exists = false;
for_each([&] (Usb_host_device &device) { for_each([&] (Usb_host_device &device) {
@ -1027,8 +1030,7 @@ struct Usb_devices : List<Usb_host_device>
try { try {
Usb_host_device *new_device = new (_alloc) Usb_host_device *new_device = new (_alloc)
Usb_host_device(_ep, _alloc, _env, label.string(), Usb_host_device(_ep, _alloc, _env, dev_info);
dev_info);
insert(new_device); insert(new_device);