xref: /openbmc/qemu/hw/usb/quirks.c (revision 52a96afa)
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