Skip to content

Commit ec6ce70

Browse files
jacmetgregkh
authored andcommitted
usb: gadget: composite: fix OS descriptors w_value logic
The OS descriptors logic had the high/low byte of w_value inverted, causing the extended properties to not be accessible for interface != 0. >From the Microsoft documentation: https://learn.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-os-1-0-descriptors-specification OS_Desc_CompatID.doc (w_index = 0x4): - wValue: High Byte = InterfaceNumber. InterfaceNumber is set to the number of the interface or function that is associated with the descriptor, typically 0x00. Because a device can have only one extended compat ID descriptor, it should ignore InterfaceNumber, regardless of the value, and simply return the descriptor. Low Byte = 0. PageNumber is used to retrieve descriptors that are larger than 64 KB. The header section is 16 bytes, so PageNumber is set to 0 for this request. We currently do not support >64KB compat ID descriptors, so verify that the low byte is 0. OS_Desc_Ext_Prop.doc (w_index = 0x5): - wValue: High byte = InterfaceNumber. The high byte of wValue is set to the number of the interface or function that is associated with the descriptor. Low byte = PageNumber. The low byte of wValue is used to retrieve descriptors that are larger than 64 KB. The header section is 10 bytes, so PageNumber is set to 0 for this request. We also don't support >64KB extended properties, so verify that the low byte is 0 and use the high byte for the interface number. Fixes: 37a3a53 ("usb: gadget: OS Feature Descriptors support") Cc: stable <[email protected]> Signed-off-by: Peter Korsgaard <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 24729b3 commit ec6ce70

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

drivers/usb/gadget/composite.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2112,7 +2112,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
21122112
buf[5] = 0x01;
21132113
switch (ctrl->bRequestType & USB_RECIP_MASK) {
21142114
case USB_RECIP_DEVICE:
2115-
if (w_index != 0x4 || (w_value >> 8))
2115+
if (w_index != 0x4 || (w_value & 0xff))
21162116
break;
21172117
buf[6] = w_index;
21182118
/* Number of ext compat interfaces */
@@ -2128,9 +2128,9 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
21282128
}
21292129
break;
21302130
case USB_RECIP_INTERFACE:
2131-
if (w_index != 0x5 || (w_value >> 8))
2131+
if (w_index != 0x5 || (w_value & 0xff))
21322132
break;
2133-
interface = w_value & 0xFF;
2133+
interface = w_value >> 8;
21342134
if (interface >= MAX_CONFIG_INTERFACES ||
21352135
!os_desc_cfg->interface[interface])
21362136
break;

0 commit comments

Comments
 (0)