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