qemu/hw/usb/quirks.c
<<
>>
Prefs
   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
  19static 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
  38int 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