usb-linux: introduce a usb_linux_alt_setting function
The next patch in this series introduces multiple ways to get the alt setting dependent upon usb_fs_type, it is cleaner to put this into its own function. Note that this patch also changes the assumed alt setting in case of an error getting the alt setting to be 0 (a sane default) rather then the interface numberwhich makes no sense. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
d2d979c628
commit
ed3a328db9
40
usb-linux.c
40
usb-linux.c
|
@ -823,13 +823,35 @@ usbdevfs:
|
||||||
return configuration;
|
return configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t usb_linux_get_alt_setting(USBHostDevice *s,
|
||||||
|
uint8_t configuration, uint8_t interface)
|
||||||
|
{
|
||||||
|
uint8_t alt_setting;
|
||||||
|
struct usb_ctrltransfer ct;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE;
|
||||||
|
ct.bRequest = USB_REQ_GET_INTERFACE;
|
||||||
|
ct.wValue = 0;
|
||||||
|
ct.wIndex = interface;
|
||||||
|
ct.wLength = 1;
|
||||||
|
ct.data = &alt_setting;
|
||||||
|
ct.timeout = 50;
|
||||||
|
ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
|
||||||
|
if (ret < 0) {
|
||||||
|
/* Assume alt 0 on error */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return alt_setting;
|
||||||
|
}
|
||||||
|
|
||||||
/* returns 1 on problem encountered or 0 for success */
|
/* returns 1 on problem encountered or 0 for success */
|
||||||
static int usb_linux_update_endp_table(USBHostDevice *s)
|
static int usb_linux_update_endp_table(USBHostDevice *s)
|
||||||
{
|
{
|
||||||
uint8_t *descriptors;
|
uint8_t *descriptors;
|
||||||
uint8_t devep, type, configuration, alt_interface;
|
uint8_t devep, type, configuration, alt_interface;
|
||||||
struct usb_ctrltransfer ct;
|
int interface, length, i;
|
||||||
int interface, ret, length, i;
|
|
||||||
|
|
||||||
i = usb_linux_get_configuration(s);
|
i = usb_linux_get_configuration(s);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
|
@ -858,19 +880,7 @@ static int usb_linux_update_endp_table(USBHostDevice *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
interface = descriptors[i + 2];
|
interface = descriptors[i + 2];
|
||||||
|
alt_interface = usb_linux_get_alt_setting(s, configuration, interface);
|
||||||
ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE;
|
|
||||||
ct.bRequest = USB_REQ_GET_INTERFACE;
|
|
||||||
ct.wValue = 0;
|
|
||||||
ct.wIndex = interface;
|
|
||||||
ct.wLength = 1;
|
|
||||||
ct.data = &alt_interface;
|
|
||||||
ct.timeout = 50;
|
|
||||||
|
|
||||||
ret = ioctl(s->fd, USBDEVFS_CONTROL, &ct);
|
|
||||||
if (ret < 0) {
|
|
||||||
alt_interface = interface;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the current interface descriptor is the active interface
|
/* the current interface descriptor is the active interface
|
||||||
* and has endpoints */
|
* and has endpoints */
|
||||||
|
|
Loading…
Reference in a new issue