diff mbox series

usb: gadget: composite: fix OS descriptors w_value logic

Message ID AS8PR05MB848522189AE458978C5F231490932@AS8PR05MB8485.eurprd05.prod.outlook.com (mailing list archive)
State New
Headers show
Series usb: gadget: composite: fix OS descriptors w_value logic | expand

Commit Message

Vrastil, Michal Sept. 3, 2024, 11:14 a.m. UTC
From 118f8c8b72d633c0daa65e564e48cbf4964977ab Mon Sep 17 00:00:00 2001
From: Michal Vrastil <michal.vrastil@hidglobal.com>
Date: Tue, 3 Sep 2024 10:55:15 +0200
Subject: [PATCH] Revert "usb: gadget: composite: fix OS descriptors w_value
logic"

This reverts commit ec6ce7075ef879b91a8710829016005dc8170f17.

Fix install of WinUSB dsriver using OS descriptors. Without the fix the drivers are not installed correctly
and the property 'DeviceInterfaceGUID' is missing on host side.

The original change was based on assumption that the interface number is in the high byte of wValue but it is in the low byte, instead.
Unfortunately, the fix is based on MS documentation which is also wrong.

The actual USB request for OS descriptors (using USB analyzer) looks like:

Offset  0   1   2   3   4   5   6   7
0x000   C1  A1  02  00  05  00  0A  00

C1: bmRequestType (device to host, vendor, interface)
A1: nas magic number
0002: wValue (2: nas interface)
0005: wIndex (5: get extended property i.e. nas interface GUID)
008E: wLength (142)

The fix was tested on Windows 10 and Windows 11.

Signed-off-by: Michal Vrastil <michal.vrastil@hidglobal.com>
---
drivers/usb/gadget/composite.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Greg KH Sept. 3, 2024, 11:23 a.m. UTC | #1
On Tue, Sep 03, 2024 at 11:14:39AM +0000, Vrastil, Michal wrote:
> >From 118f8c8b72d633c0daa65e564e48cbf4964977ab Mon Sep 17 00:00:00 2001
> From: Michal Vrastil <michal.vrastil@hidglobal.com>
> Date: Tue, 3 Sep 2024 10:55:15 +0200
> Subject: [PATCH] Revert "usb: gadget: composite: fix OS descriptors w_value
> logic"

This looks odd, did you mean to put the whole commit in the mail?

Also, all tabs are gone, meaning you probably did a cut/paste thing,
please read the kernel documentation for how to use 'git send-email' to
make this simpler?

> 
> This reverts commit ec6ce7075ef879b91a8710829016005dc8170f17.
> 
> Fix install of WinUSB dsriver using OS descriptors. Without the fix the drivers are not installed correctly
> and the property 'DeviceInterfaceGUID' is missing on host side.
> 
> The original change was based on assumption that the interface number is in the high byte of wValue but it is in the low byte, instead.
> Unfortunately, the fix is based on MS documentation which is also wrong.

Please wrap your changelog text at 72 columns like your editor tried to
get you to do :)
> 
> The actual USB request for OS descriptors (using USB analyzer) looks like:
> 
> Offset  0   1   2   3   4   5   6   7
> 0x000   C1  A1  02  00  05  00  0A  00
> 
> C1: bmRequestType (device to host, vendor, interface)
> A1: nas magic number
> 0002: wValue (2: nas interface)
> 0005: wIndex (5: get extended property i.e. nas interface GUID)
> 008E: wLength (142)
> 
> The fix was tested on Windows 10 and Windows 11.
> 
> Signed-off-by: Michal Vrastil <michal.vrastil@hidglobal.com>

What commit id does this fix?

thanks,

greg k-h
diff mbox series

Patch

diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 17ae3b394469..a3106b179562 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -1925,7 +1925,7 @@  composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                                               buf[5] = 0x01;
                                               switch (ctrl->bRequestType & USB_RECIP_MASK) {
                                               case USB_RECIP_DEVICE:
-                                                              if (w_index != 0x4 || (w_value & 0xff))
+                                                             if (w_index != 0x4 || (w_value >> 8))
                                                                               break;
                                                               buf[6] = w_index;
                                                               /* Number of ext compat interfaces */
@@ -1941,9 +1941,9 @@  composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                                                               }
                                                               break;
                                               case USB_RECIP_INTERFACE:
-                                                              if (w_index != 0x5 || (w_value & 0xff))
+                                                             if (w_index != 0x5 || (w_value >> 8))
                                                                               break;
-                                                              interface = w_value >> 8;
+                                                             interface = w_value & 0xFF;
                                                               if (interface >= MAX_CONFIG_INTERFACES ||
                                                                   !os_desc_cfg->interface[interface])
                                                                               break;