b2d1fe67d0
Buffered bulk mode is intended for bulk *input* endpoints, where the data is of a streaming nature (not part of a command-response protocol). These endpoints' input buffer may overflow if data is not read quickly enough. So in buffered bulk mode the usb-host takes care of the submitting and re-submitting of bulk transfers. Buffered bulk mode is necessary for reliable operation with the bulk in endpoints of usb to serial convertors. Unfortunatelty buffered bulk input mode will only work with certain devices, therefor this patch also adds a usb-id table to enable it for devices which need it, while leaving the bulk ep handling for other devices unmodified. Note that the bumping of the required usbredir from 0.5.3 to 0.6 does not mean that we will now need a newer usbredir release then qemu-1.3, .pc files reporting 0.5.3 have only ever existed in usbredir builds directly from git, so qemu-1.3 needs the 0.6 release too. Changes in v2: -Split of quirk handling into quirks.c Signed-off-by: Hans de Goede <hdegoede@redhat.com>
54 lines
1.7 KiB
C
54 lines
1.7 KiB
C
/*
|
|
* USB quirk handling
|
|
*
|
|
* Copyright (c) 2012 Red Hat, Inc.
|
|
*
|
|
* Red Hat Authors:
|
|
* Hans de Goede <hdegoede@redhat.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
#include "quirks.h"
|
|
#include "hw/usb.h"
|
|
|
|
static bool 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) {
|
|
int i;
|
|
|
|
for (i = 0; ids[i].vendor_id != -1; i++) {
|
|
if (ids[i].vendor_id == vendor_id &&
|
|
ids[i].product_id == product_id &&
|
|
(ids[i].interface_class == -1 ||
|
|
(ids[i].interface_class == interface_class &&
|
|
ids[i].interface_subclass == interface_subclass &&
|
|
ids[i].interface_protocol == interface_protocol))) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int usb_get_quirks(uint16_t vendor_id, uint16_t product_id,
|
|
uint8_t interface_class, uint8_t interface_subclass,
|
|
uint8_t interface_protocol)
|
|
{
|
|
int quirks = 0;
|
|
|
|
if (usb_id_match(usbredir_raw_serial_ids, vendor_id, product_id,
|
|
interface_class, interface_subclass, interface_protocol)) {
|
|
quirks |= USB_QUIRK_BUFFER_BULK_IN;
|
|
}
|
|
if (usb_id_match(usbredir_ftdi_serial_ids, vendor_id, product_id,
|
|
interface_class, interface_subclass, interface_protocol)) {
|
|
quirks |= USB_QUIRK_BUFFER_BULK_IN | USB_QUIRK_IS_FTDI;
|
|
}
|
|
|
|
return quirks;
|
|
}
|