diff mbox series

Revert "usb: gadget: composite: fix OS descriptors w_value

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

Commit Message

Vrastil, Michal Sept. 4, 2024, 3:01 p.m. UTC
This reverts commit ec6ce7075ef879b91a8710829016005dc8170f17.

Fix install of WinUSB dsriver using OS descriptors.
Without the fix the drivers is 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.

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

Comments

Greg Kroah-Hartman Sept. 4, 2024, 5:18 p.m. UTC | #1
On Wed, Sep 04, 2024 at 03:01:39PM +0000, Vrastil, Michal wrote:
> This reverts commit ec6ce7075ef879b91a8710829016005dc8170f17.
> 
> Fix install of WinUSB dsriver using OS descriptors.
> Without the fix the drivers is 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.
> 
> Fixes: ec6ce70 ("usb: gadget: composite: fix OS descriptors w_value logic")
> Signed-off-by: Michal Vrastil <michal.vrastil@hidglobal.com>
> ---
>  drivers/usb/gadget/composite.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)

Hi,

This is the friendly patch-bot of Greg Kroah-Hartman.  You have sent him
a patch that has triggered this response.  He used to manually respond
to these common problems, but in order to save his sanity (he kept
writing the same thing over and over, yet to different people), I was
created.  Hopefully you will not take offence and will fix the problem
in your patch and resubmit it so that it can be accepted into the Linux
kernel tree.

You are receiving this message because of the following common error(s)
as indicated below:

- You have marked a patch with a "Fixes:" tag for a commit that is in an
  older released kernel, yet you do not have a cc: stable line in the
  signed-off-by area at all, which means that the patch will not be
  applied to any older kernel releases.  To properly fix this, please
  follow the documented rules in the
  Documentation/process/stable-kernel-rules.rst file for how to resolve
  this.

If you wish to discuss this problem further, or you have questions about
how to resolve this issue, please feel free to respond to this email and
Greg will reply once he has dug out from the pending patches received
from other developers.

thanks,

greg k-h's patch email bot
Sergey Shtylyov Sept. 4, 2024, 5:31 p.m. UTC | #2
On 9/4/24 6:01 PM, Vrastil, Michal wrote:

> This reverts commit ec6ce7075ef879b91a8710829016005dc8170f17.
> 
> Fix install of WinUSB dsriver using OS descriptors.

   Installation. And driver. :-)

> Without the fix the drivers is 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.
> 
> Fixes: ec6ce70 ("usb: gadget: composite: fix OS descriptors w_value logic")

   12 hex digits should be specified here...

> Signed-off-by: Michal Vrastil <michal.vrastil@hidglobal.com>
[...]

MBR, Sergey
Peter Korsgaard Sept. 4, 2024, 6:19 p.m. UTC | #3
>>>>> "Vrastil," == Vrastil, Michal <michal.vrastil@hidglobal.com> writes:

 > This reverts commit ec6ce7075ef879b91a8710829016005dc8170f17.
 > Fix install of WinUSB dsriver using OS descriptors.
 > Without the fix the drivers is 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.

Hmm, very odd. How are you testing this on the host side? Could it be
that you are running into the WinUSB bug described here:

https://github.com/pbatard/libwdi/wiki/WCID-Devices#defining-a-device-interface-guid-or-other-device-specific-properties

IMPORTANT NOTE 1: There is a bug/limitation in WinUSB that will force
the wIndex of any Interface Request to the interface num ber. This means
that, if you are using WinUSB to verify the content of your Extended
Properties Feature Descriptor, you won't be able to retrieve it (unless
it is only defined for interface #5).  If you use WinUSB on Windows to
validate your descriptors, our advice then is to have your device
firmware answer both Device and Interface requests when the Extended
Properties Feature Descriptor is queried, so that you can use a Device
Request rather than an Interface Request to validate that your
descriptor is set properly.

For reference, the latest xusb sample application from libusb has a -w
switch that will force the wIndex = 0x0005 to use the Device mode.


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

 > 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;
 > -- 

 > 2.43.0
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;