 092b6d1e88
			
		
	
	
		092b6d1e88
		
	
	
	
	
		
			
			The USB descriptor sizes are specified as 16-bit for idVendor / idProduct, and 8-bit for bInterfaceClass / bInterfaceSubClass / bInterfaceProtocol. Doing so we reduce the usbredir_raw_serial_ids[] and usbredir_ftdi_serial_ids[] arrays from 16KiB to 6KiB (size reported on x86_64 host, building with --extra-cflags=-Os). Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.8 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 "qemu/osdep.h"
 | |
| #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].terminating_entry == 0; i++) {
 | |
|         if (ids[i].vendor_id  == vendor_id &&
 | |
|             ids[i].product_id == product_id &&
 | |
|             (ids[i].interface_protocol_used == 0 ||
 | |
|              (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;
 | |
| }
 |