usb-linux: Get the alt. setting from sysfs rather then asking the dev
At least one device I have lies when receiving a USB_REQ_GET_INTERFACE, always returning 0 even if the alternate setting is different. This is likely caused because in practice this control message is never used as the operating system's usb stack knows which alternate setting it has told the device to get into, and thus this ctrl message does not get tested by device manufacturers. When usb_fs_type == USB_FS_SYS, the active alt. setting can be read directly from sysfs, which allows using this device through qemu's usb redirection. More in general it seems a good idea to not send needless control msg's to devices, esp. as the code in question is called every time a set_interface is done. Which happens multiple times during virtual machine startup, and when device drivers are activating the usb device. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
		
							parent
							
								
									ed3a328db9
								
							
						
					
					
						commit
						c43831fb47
					
				
							
								
								
									
										18
									
								
								usb-linux.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								usb-linux.c
									
									
									
									
									
								
							| @ -830,6 +830,24 @@ static uint8_t usb_linux_get_alt_setting(USBHostDevice *s, | ||||
|     struct usb_ctrltransfer ct; | ||||
|     int ret; | ||||
| 
 | ||||
|     if (usb_fs_type == USB_FS_SYS) { | ||||
|         char device_name[64], line[1024]; | ||||
|         int alt_setting; | ||||
| 
 | ||||
|         sprintf(device_name, "%d-%d:%d.%d", s->bus_num, s->devpath, | ||||
|                 (int)configuration, (int)interface); | ||||
| 
 | ||||
|         if (!usb_host_read_file(line, sizeof(line), "bAlternateSetting", | ||||
|                                 device_name)) { | ||||
|             goto usbdevfs; | ||||
|         } | ||||
|         if (sscanf(line, "%d", &alt_setting) != 1) { | ||||
|             goto usbdevfs; | ||||
|         } | ||||
|         return alt_setting; | ||||
|     } | ||||
| 
 | ||||
| usbdevfs: | ||||
|     ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE; | ||||
|     ct.bRequest = USB_REQ_GET_INTERFACE; | ||||
|     ct.wValue = 0; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Hans de Goede
						Hans de Goede