1b2d1fe67SHans de Goede /*
2b2d1fe67SHans de Goede * USB quirk handling
3b2d1fe67SHans de Goede *
4b2d1fe67SHans de Goede * Copyright (c) 2012 Red Hat, Inc.
5b2d1fe67SHans de Goede *
6b2d1fe67SHans de Goede * Red Hat Authors:
7b2d1fe67SHans de Goede * Hans de Goede <hdegoede@redhat.com>
8b2d1fe67SHans de Goede *
9b2d1fe67SHans de Goede * This program is free software; you can redistribute it and/or modify
10b2d1fe67SHans de Goede * it under the terms of the GNU General Public License as published by
11b2d1fe67SHans de Goede * the Free Software Foundation; either version 2 of the License, or
12b2d1fe67SHans de Goede * (at your option) any later version.
13b2d1fe67SHans de Goede */
14b2d1fe67SHans de Goede
15e532b2e0SPeter Maydell #include "qemu/osdep.h"
16b2d1fe67SHans de Goede #include "quirks.h"
17b2d1fe67SHans de Goede #include "hw/usb.h"
18b2d1fe67SHans de Goede
usb_id_match(const struct usb_device_id * ids,uint16_t vendor_id,uint16_t product_id,uint8_t interface_class,uint8_t interface_subclass,uint8_t interface_protocol)19b2d1fe67SHans de Goede static bool usb_id_match(const struct usb_device_id *ids,
20b2d1fe67SHans de Goede uint16_t vendor_id, uint16_t product_id,
21b2d1fe67SHans de Goede uint8_t interface_class, uint8_t interface_subclass,
22b2d1fe67SHans de Goede uint8_t interface_protocol) {
23b2d1fe67SHans de Goede int i;
24b2d1fe67SHans de Goede
25*092b6d1eSPhilippe Mathieu-Daudé for (i = 0; ids[i].terminating_entry == 0; i++) {
26b2d1fe67SHans de Goede if (ids[i].vendor_id == vendor_id &&
27b2d1fe67SHans de Goede ids[i].product_id == product_id &&
28*092b6d1eSPhilippe Mathieu-Daudé (ids[i].interface_protocol_used == 0 ||
29b2d1fe67SHans de Goede (ids[i].interface_class == interface_class &&
30b2d1fe67SHans de Goede ids[i].interface_subclass == interface_subclass &&
31b2d1fe67SHans de Goede ids[i].interface_protocol == interface_protocol))) {
32b2d1fe67SHans de Goede return true;
33b2d1fe67SHans de Goede }
34b2d1fe67SHans de Goede }
35b2d1fe67SHans de Goede return false;
36b2d1fe67SHans de Goede }
37b2d1fe67SHans de Goede
usb_get_quirks(uint16_t vendor_id,uint16_t product_id,uint8_t interface_class,uint8_t interface_subclass,uint8_t interface_protocol)38b2d1fe67SHans de Goede int usb_get_quirks(uint16_t vendor_id, uint16_t product_id,
39b2d1fe67SHans de Goede uint8_t interface_class, uint8_t interface_subclass,
40b2d1fe67SHans de Goede uint8_t interface_protocol)
41b2d1fe67SHans de Goede {
42b2d1fe67SHans de Goede int quirks = 0;
43b2d1fe67SHans de Goede
44b2d1fe67SHans de Goede if (usb_id_match(usbredir_raw_serial_ids, vendor_id, product_id,
45b2d1fe67SHans de Goede interface_class, interface_subclass, interface_protocol)) {
46b2d1fe67SHans de Goede quirks |= USB_QUIRK_BUFFER_BULK_IN;
47b2d1fe67SHans de Goede }
48b2d1fe67SHans de Goede if (usb_id_match(usbredir_ftdi_serial_ids, vendor_id, product_id,
49b2d1fe67SHans de Goede interface_class, interface_subclass, interface_protocol)) {
50b2d1fe67SHans de Goede quirks |= USB_QUIRK_BUFFER_BULK_IN | USB_QUIRK_IS_FTDI;
51b2d1fe67SHans de Goede }
52b2d1fe67SHans de Goede
53b2d1fe67SHans de Goede return quirks;
54b2d1fe67SHans de Goede }
55