public inbox for linux-usb@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
@ 2025-12-07  0:00 Johannes Brüderl
  2025-12-07  0:15 ` Greg KH
  2025-12-07  0:37 ` [PATCH] " Michal Pecio
  0 siblings, 2 replies; 19+ messages in thread
From: Johannes Brüderl @ 2025-12-07  0:00 UTC (permalink / raw)
  To: linux-usb; +Cc: gregkh, Johannes Brüderl

Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
for devices that cannot handle it.

Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
the BOS descriptor is requested at SuperSpeed Plus (10Gbps).

Link: https://bugzilla.kernel.org/show_bug.cgi?id=220027
Signed-off-by: Johannes Brüderl <johannes.bruederl@gmail.com>
---
Before (device hangs at SuperSpeed Plus, then re-enumerates at lower speed
with different product ID 009c):

[    3.284990] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
[    8.574542] usb 2-2: unable to get BOS descriptor or descriptor too short
[    8.600018] usb 2-2: unable to read config index 0 descriptor/start: -71
[    8.600027] usb 2-2: can't read configurations, error -71
[    8.998412] usb 2-2: Device not responding to setup address.
[    9.215157] usb 2-2: Device not responding to setup address.
[    9.422737] usb 2-2: device not accepting address 3, error -71
[   10.990897] usb 2-2: new SuperSpeed USB device number 5 using xhci_hcd
[   11.065869] usb 2-2: LPM exit latency is zeroed, disabling LPM.
[   11.152244] usb 2-2: New USB device found, idVendor=0fd9, idProduct=009c

After (device enumerates correctly at SuperSpeed Plus):

[    3.297159] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
[    3.354248] usb 2-2: skipping BOS descriptor
[    3.432917] usb 2-2: New USB device found, idVendor=0fd9, idProduct=009b
[    3.432927] usb 2-2: Product: Elgato 4K X

 drivers/usb/core/config.c  | 5 +++++
 drivers/usb/core/quirks.c  | 3 +++
 include/linux/usb/quirks.h | 3 +++
 3 files changed, 11 insertions(+)

diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index baf5bc844b6f..8fa3a486d038 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -1040,6 +1040,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)
 	__u8 cap_type;
 	int ret;

+	if (dev->quirks & USB_QUIRK_NO_BOS) {
+		dev_dbg(ddev, "skipping BOS descriptor\n");
+		return 0;
+	}
+
 	bos = kzalloc(sizeof(*bos), GFP_KERNEL);
 	if (!bos)
 		return -ENOMEM;
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index 47f589c4104a..69ec914e5f45 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -581,6 +581,9 @@ static const struct usb_device_id usb_quirk_list[] = {
 	/* INTEL VALUE SSD */
 	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },

+	/* Elgato 4K X - BOS descriptor fetch hangs at SuperSpeed Plus */
+	{ USB_DEVICE(0x0fd9, 0x009b), .driver_info = USB_QUIRK_NO_BOS },
+
 	{ }  /* terminating entry must be last */
 };

diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
index 59409c1fc3de..2f7bd2fdc616 100644
--- a/include/linux/usb/quirks.h
+++ b/include/linux/usb/quirks.h
@@ -75,4 +75,7 @@
 /* short SET_ADDRESS request timeout */
 #define USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT	BIT(16)

+/* skip BOS descriptor request */
+#define USB_QUIRK_NO_BOS			BIT(17)
+
 #endif /* __LINUX_USB_QUIRKS_H */
--
2.52.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  0:00 [PATCH] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor Johannes Brüderl
@ 2025-12-07  0:15 ` Greg KH
  2025-12-07  1:20   ` [PATCH v2] " Johannes Brüderl
  2025-12-07  0:37 ` [PATCH] " Michal Pecio
  1 sibling, 1 reply; 19+ messages in thread
From: Greg KH @ 2025-12-07  0:15 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: linux-usb

On Sun, Dec 07, 2025 at 01:00:07AM +0100, Johannes Brüderl wrote:
> Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
> for devices that cannot handle it.
> 
> Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
> the BOS descriptor is requested at SuperSpeed Plus (10Gbps).
> 
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=220027
> Signed-off-by: Johannes Brüderl <johannes.bruederl@gmail.com>
> ---
> Before (device hangs at SuperSpeed Plus, then re-enumerates at lower speed
> with different product ID 009c):
> 
> [    3.284990] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
> [    8.574542] usb 2-2: unable to get BOS descriptor or descriptor too short
> [    8.600018] usb 2-2: unable to read config index 0 descriptor/start: -71
> [    8.600027] usb 2-2: can't read configurations, error -71
> [    8.998412] usb 2-2: Device not responding to setup address.
> [    9.215157] usb 2-2: Device not responding to setup address.
> [    9.422737] usb 2-2: device not accepting address 3, error -71
> [   10.990897] usb 2-2: new SuperSpeed USB device number 5 using xhci_hcd
> [   11.065869] usb 2-2: LPM exit latency is zeroed, disabling LPM.
> [   11.152244] usb 2-2: New USB device found, idVendor=0fd9, idProduct=009c
> 
> After (device enumerates correctly at SuperSpeed Plus):
> 
> [    3.297159] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
> [    3.354248] usb 2-2: skipping BOS descriptor

This feels like a USB spec violation :(

> [    3.432917] usb 2-2: New USB device found, idVendor=0fd9, idProduct=009b
> [    3.432927] usb 2-2: Product: Elgato 4K X
> 
>  drivers/usb/core/config.c  | 5 +++++
>  drivers/usb/core/quirks.c  | 3 +++
>  include/linux/usb/quirks.h | 3 +++
>  3 files changed, 11 insertions(+)
> 
> diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
> index baf5bc844b6f..8fa3a486d038 100644
> --- a/drivers/usb/core/config.c
> +++ b/drivers/usb/core/config.c
> @@ -1040,6 +1040,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)
>  	__u8 cap_type;
>  	int ret;
> 
> +	if (dev->quirks & USB_QUIRK_NO_BOS) {
> +		dev_dbg(ddev, "skipping BOS descriptor\n");
> +		return 0;
> +	}

What is the downside of claiming to successfully reading the BOS
descriptor, yet not having done that at all?  Can we tear down the
device properly?  Show the information correctly through userspace
tools?  Shouldn't we return something like -ENOMSG instead?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  0:00 [PATCH] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor Johannes Brüderl
  2025-12-07  0:15 ` Greg KH
@ 2025-12-07  0:37 ` Michal Pecio
  2025-12-07  0:59   ` Greg KH
  1 sibling, 1 reply; 19+ messages in thread
From: Michal Pecio @ 2025-12-07  0:37 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: linux-usb, gregkh

On Sun,  7 Dec 2025 01:00:07 +0100, Johannes Brüderl wrote:
> Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
> for devices that cannot handle it.
> 
> Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
> the BOS descriptor is requested at SuperSpeed Plus (10Gbps).
> 
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=220027
> Signed-off-by: Johannes Brüderl <johannes.bruederl@gmail.com>

IIRC what we found in this bug is that the device will happily respond
to BOS descriptor requests issued by lsusb after it's enumerated.

So it appears that (only when running at 10G, wtf) the device expects
something to happen before it is able to produce this descriptor. And
apparently Linux is doing things in different order than certain other
operating system supported by the vendor.

But the reporter simply applied a patch similar to yours and lost
interest in debugging any further.

And unfortunately WinPCAP fails to capture most of enumeration process,
so I don't know how that other software is doing it.

Regards,
Michal

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  0:37 ` [PATCH] " Michal Pecio
@ 2025-12-07  0:59   ` Greg KH
  0 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2025-12-07  0:59 UTC (permalink / raw)
  To: Michal Pecio; +Cc: Johannes Brüderl, linux-usb

On Sun, Dec 07, 2025 at 01:37:34AM +0100, Michal Pecio wrote:
> On Sun,  7 Dec 2025 01:00:07 +0100, Johannes Brüderl wrote:
> > Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
> > for devices that cannot handle it.
> > 
> > Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
> > the BOS descriptor is requested at SuperSpeed Plus (10Gbps).
> > 
> > Link: https://bugzilla.kernel.org/show_bug.cgi?id=220027
> > Signed-off-by: Johannes Brüderl <johannes.bruederl@gmail.com>
> 
> IIRC what we found in this bug is that the device will happily respond
> to BOS descriptor requests issued by lsusb after it's enumerated.

That's very odd.

> So it appears that (only when running at 10G, wtf) the device expects
> something to happen before it is able to produce this descriptor. And
> apparently Linux is doing things in different order than certain other
> operating system supported by the vendor.

Any ideas what "order" is not the same here?  Should we just not be
reading the BOS descriptor at early enumeration and just wait until
someone actually wants it?

> But the reporter simply applied a patch similar to yours and lost
> interest in debugging any further.

Understood, but I'd like to get to the root of this if possible so that
we don't end up just adding a bunch of devices to this quirk because we
are doing something "odd" that normal USB-IF testing isn't catching.
That feels like a bad overall decision to make.

> And unfortunately WinPCAP fails to capture most of enumeration process,
> so I don't know how that other software is doing it.

usbmon with windows in a virtual machine might catch this?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  0:15 ` Greg KH
@ 2025-12-07  1:20   ` Johannes Brüderl
  2025-12-07  6:19     ` Lars Melin
  2025-12-07  7:40     ` [PATCH v2] " Michal Pecio
  0 siblings, 2 replies; 19+ messages in thread
From: Johannes Brüderl @ 2025-12-07  1:20 UTC (permalink / raw)
  To: linux-usb; +Cc: gregkh, Johannes Brüderl

Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
for devices that cannot handle it.

Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
the BOS descriptor is requested at SuperSpeed Plus (10Gbps).

Link: https://bugzilla.kernel.org/show_bug.cgi?id=220027
Signed-off-by: Johannes Brüderl <johannes.bruederl@gmail.com>
---
v2: Return -ENOMSG instead of 0 to properly indicate no BOS data.

Tested unbind/rebind via /sys/bus/usb/drivers/usb/unbind - works correctly.
Userspace tools (lsusb) handle missing BOS gracefully (no BOS section shown).

Before (device hangs at SuperSpeed Plus, then re-enumerates at lower speed
with different product ID 009c):

[    3.284990] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
[    8.574542] usb 2-2: unable to get BOS descriptor or descriptor too short
[    8.600018] usb 2-2: unable to read config index 0 descriptor/start: -71
[    8.600027] usb 2-2: can't read configurations, error -71
[    8.998412] usb 2-2: Device not responding to setup address.
[    9.215157] usb 2-2: Device not responding to setup address.
[    9.422737] usb 2-2: device not accepting address 3, error -71
[   10.990897] usb 2-2: new SuperSpeed USB device number 5 using xhci_hcd
[   11.065869] usb 2-2: LPM exit latency is zeroed, disabling LPM.
[   11.152244] usb 2-2: New USB device found, idVendor=0fd9, idProduct=009c

After (device enumerates correctly at SuperSpeed Plus):

[    3.297159] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
[    3.354248] usb 2-2: skipping BOS descriptor
[    3.432917] usb 2-2: New USB device found, idVendor=0fd9, idProduct=009b
[    3.432927] usb 2-2: Product: Elgato 4K X

lsusb -t output:
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/4p, 10000M
    |__ Port 002: Dev 003, If 0, Class=Video, Driver=uvcvideo, 10000M

 drivers/usb/core/config.c  | 5 +++++
 drivers/usb/core/quirks.c  | 3 +++
 include/linux/usb/quirks.h | 3 +++
 3 files changed, 11 insertions(+)

diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index baf5bc844b6f..2bb1ceb9d621 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -1040,6 +1040,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)
 	__u8 cap_type;
 	int ret;

+	if (dev->quirks & USB_QUIRK_NO_BOS) {
+		dev_dbg(ddev, "skipping BOS descriptor\n");
+		return -ENOMSG;
+	}
+
 	bos = kzalloc(sizeof(*bos), GFP_KERNEL);
 	if (!bos)
 		return -ENOMEM;
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index 47f589c4104a..69ec914e5f45 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -581,6 +581,9 @@ static const struct usb_device_id usb_quirk_list[] = {
 	/* INTEL VALUE SSD */
 	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },

+	/* Elgato 4K X - BOS descriptor fetch hangs at SuperSpeed Plus */
+	{ USB_DEVICE(0x0fd9, 0x009b), .driver_info = USB_QUIRK_NO_BOS },
+
 	{ }  /* terminating entry must be last */
 };

diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
index 59409c1fc3de..2f7bd2fdc616 100644
--- a/include/linux/usb/quirks.h
+++ b/include/linux/usb/quirks.h
@@ -75,4 +75,7 @@
 /* short SET_ADDRESS request timeout */
 #define USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT	BIT(16)

+/* skip BOS descriptor request */
+#define USB_QUIRK_NO_BOS			BIT(17)
+
 #endif /* __LINUX_USB_QUIRKS_H */
--
2.52.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  1:20   ` [PATCH v2] " Johannes Brüderl
@ 2025-12-07  6:19     ` Lars Melin
  2025-12-07  9:02       ` [PATCH v3 1/1] " Johannes Brüderl
  2025-12-07  7:40     ` [PATCH v2] " Michal Pecio
  1 sibling, 1 reply; 19+ messages in thread
From: Lars Melin @ 2025-12-07  6:19 UTC (permalink / raw)
  To: Johannes Brüderl, linux-usb; +Cc: gregkh

On 2025-12-07 08:20, Johannes Brüderl wrote:
> Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
> for devices that cannot handle it.
> 
> Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
> the BOS descriptor is requested at SuperSpeed Plus (10Gbps).

// snip

>   	/* INTEL VALUE SSD */
>   	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
> 
> +	/* Elgato 4K X - BOS descriptor fetch hangs at SuperSpeed Plus */
> +	{ USB_DEVICE(0x0fd9, 0x009b), .driver_info = USB_QUIRK_NO_BOS },
> +
>   	{ }  /* terminating entry must be last */

Hi Johannes,
it looks like the list was sorted in vid:pid ascending order before you 
added your entry


Lars

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  1:20   ` [PATCH v2] " Johannes Brüderl
  2025-12-07  6:19     ` Lars Melin
@ 2025-12-07  7:40     ` Michal Pecio
  2025-12-07  9:22       ` Johannes Brüderl
  1 sibling, 1 reply; 19+ messages in thread
From: Michal Pecio @ 2025-12-07  7:40 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: linux-usb, gregkh

On Sun,  7 Dec 2025 02:20:59 +0100, Johannes Brüderl wrote:
> v2: Return -ENOMSG instead of 0 to properly indicate no BOS data.

Probably good idea.
 
> Tested unbind/rebind via /sys/bus/usb/drivers/usb/unbind - works
> correctly. Userspace tools (lsusb) handle missing BOS gracefully
> (no BOS section shown).

I thought that lsusb never shows BOS, unless you run it as root, and
then it issues control requests to the device to fetch it directly?

And the other user tried it and reported that it worked just fine.
Do you see the same behavior on yours?

> Before (device hangs at SuperSpeed Plus, then re-enumerates at lower speed
> with different product ID 009c):
> 
> [    3.284990] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
> [    8.574542] usb 2-2: unable to get BOS descriptor or descriptor too short
> [    8.600018] usb 2-2: unable to read config index 0 descriptor/start: -71
> [    8.600027] usb 2-2: can't read configurations, error -71
> [    8.998412] usb 2-2: Device not responding to setup address.
> [    9.215157] usb 2-2: Device not responding to setup address.
> [    9.422737] usb 2-2: device not accepting address 3, error -71
> [   10.990897] usb 2-2: new SuperSpeed USB device number 5 using xhci_hcd
> [   11.065869] usb 2-2: LPM exit latency is zeroed, disabling LPM.

I wonder if this means that the BOS descriptor returned during
SuperSpeed enumeration is bogus?

What BOS shows up if you run 'lsusb -v' as root after the device
completes enumeratation at SuperSpeed?

^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v3 1/1] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  6:19     ` Lars Melin
@ 2025-12-07  9:02       ` Johannes Brüderl
  2026-01-07 16:06         ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Johannes Brüderl @ 2025-12-07  9:02 UTC (permalink / raw)
  To: linux-usb; +Cc: gregkh, larsm17, Johannes Brüderl

Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
for devices that cannot handle it.

Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
the BOS descriptor is requested at SuperSpeed Plus (10Gbps).

Link: https://bugzilla.kernel.org/show_bug.cgi?id=220027
Signed-off-by: Johannes Brüderl <johannes.bruederl@gmail.com>
---
Hi Lars,
you are right, good catch! This should be correctly sorted now.

v3: Move quirk entry to correct position in sorted VID:PID order.
v2: Return -ENOMSG instead of 0 to properly indicate no BOS data.

BR,
Johannes

 drivers/usb/core/config.c  | 5 +++++
 drivers/usb/core/quirks.c  | 3 +++
 include/linux/usb/quirks.h | 3 +++
 3 files changed, 11 insertions(+)

diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index baf5bc844b6f..2bb1ceb9d621 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -1040,6 +1040,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)
 	__u8 cap_type;
 	int ret;
 
+	if (dev->quirks & USB_QUIRK_NO_BOS) {
+		dev_dbg(ddev, "skipping BOS descriptor\n");
+		return -ENOMSG;
+	}
+
 	bos = kzalloc(sizeof(*bos), GFP_KERNEL);
 	if (!bos)
 		return -ENOMEM;
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index 47f589c4104a..c4d85089d19b 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -450,6 +450,9 @@ static const struct usb_device_id usb_quirk_list[] = {
 	{ USB_DEVICE(0x0c45, 0x7056), .driver_info =
 			USB_QUIRK_IGNORE_REMOTE_WAKEUP },
 
+	/* Elgato 4K X - BOS descriptor fetch hangs at SuperSpeed Plus */
+	{ USB_DEVICE(0x0fd9, 0x009b), .driver_info = USB_QUIRK_NO_BOS },
+
 	/* Sony Xperia XZ1 Compact (lilac) smartphone in fastboot mode */
 	{ USB_DEVICE(0x0fce, 0x0dde), .driver_info = USB_QUIRK_NO_LPM },
 
diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
index 59409c1fc3de..2f7bd2fdc616 100644
--- a/include/linux/usb/quirks.h
+++ b/include/linux/usb/quirks.h
@@ -75,4 +75,7 @@
 /* short SET_ADDRESS request timeout */
 #define USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT	BIT(16)
 
+/* skip BOS descriptor request */
+#define USB_QUIRK_NO_BOS			BIT(17)
+
 #endif /* __LINUX_USB_QUIRKS_H */
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  7:40     ` [PATCH v2] " Michal Pecio
@ 2025-12-07  9:22       ` Johannes Brüderl
  2025-12-07  9:45         ` Michal Pecio
  0 siblings, 1 reply; 19+ messages in thread
From: Johannes Brüderl @ 2025-12-07  9:22 UTC (permalink / raw)
  To: Michal Pecio; +Cc: linux-usb, gregkh

On Sun, Dec 7, 2025 at 8:40 AM Michal Pecio <michal.pecio@gmail.com> wrote:
>
> On Sun,  7 Dec 2025 02:20:59 +0100, Johannes Brüderl wrote:
> > v2: Return -ENOMSG instead of 0 to properly indicate no BOS data.
>
> Probably good idea.
>
> > Tested unbind/rebind via /sys/bus/usb/drivers/usb/unbind - works
> > correctly. Userspace tools (lsusb) handle missing BOS gracefully
> > (no BOS section shown).
>
> I thought that lsusb never shows BOS, unless you run it as root, and
> then it issues control requests to the device to fetch it directly?
>
> And the other user tried it and reported that it worked just fine.
> Do you see the same behavior on yours?
>
> > Before (device hangs at SuperSpeed Plus, then re-enumerates at lower speed
> > with different product ID 009c):
> >
> > [    3.284990] usb 2-2: new SuperSpeed Plus Gen 2x1 USB device number 2 using xhci_hcd
> > [    8.574542] usb 2-2: unable to get BOS descriptor or descriptor too short
> > [    8.600018] usb 2-2: unable to read config index 0 descriptor/start: -71
> > [    8.600027] usb 2-2: can't read configurations, error -71
> > [    8.998412] usb 2-2: Device not responding to setup address.
> > [    9.215157] usb 2-2: Device not responding to setup address.
> > [    9.422737] usb 2-2: device not accepting address 3, error -71
> > [   10.990897] usb 2-2: new SuperSpeed USB device number 5 using xhci_hcd
> > [   11.065869] usb 2-2: LPM exit latency is zeroed, disabling LPM.
>
> I wonder if this means that the BOS descriptor returned during
> SuperSpeed enumeration is bogus?
>
> What BOS shows up if you run 'lsusb -v' as root after the device
> completes enumeratation at SuperSpeed?

Hi Michal,
thanks, I forgot to use root previously when running lsusb -v.

Here's the BOS Descriptor section when running w/ root.
This is without this patch, so it "reconnected" with SuperSpeed (5Gbps).

Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength       0x0016
  bNumDeviceCaps          2
  USB 2.0 Extension Device Capability:
    bLength                 7
    bDescriptorType        16
    bDevCapabilityType      2
    bmAttributes   0x00000000
      (Missing must-be-set LPM bit!)
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x00
    wSpeedsSupported   0x000e
      Device can operate at Full Speed (12Mbps)
      Device can operate at High Speed (480Mbps)
      Device can operate at SuperSpeed (5Gbps)
    bFunctionalitySupport   3
      Lowest fully-functional device speed is SuperSpeed (5Gbps)
    bU1DevExitLat           0 micro seconds
    bU2DevExitLat           0 micro seconds

(Missing must-be-set LPM bit!) seems to be weird? As it looks like
just nulled data.
The device seems to generally show problematic behavior when it comes
to the BOS, both on SuperSpeed Plus and SuperSpeed.

BR,
Johannes

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  9:22       ` Johannes Brüderl
@ 2025-12-07  9:45         ` Michal Pecio
  2025-12-07 10:47           ` Johannes Brüderl
  0 siblings, 1 reply; 19+ messages in thread
From: Michal Pecio @ 2025-12-07  9:45 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: linux-usb, gregkh

On Sun, 7 Dec 2025 10:22:41 +0100, Johannes Brüderl wrote:
> Here's the BOS Descriptor section when running w/ root.
> This is without this patch, so it "reconnected" with SuperSpeed (5Gbps).
> 
> Binary Object Store Descriptor:
>   bLength                 5
>   bDescriptorType        15
>   wTotalLength       0x0016
>   bNumDeviceCaps          2
>   USB 2.0 Extension Device Capability:
>     bLength                 7
>     bDescriptorType        16
>     bDevCapabilityType      2
>     bmAttributes   0x00000000
>       (Missing must-be-set LPM bit!)
>   SuperSpeed USB Device Capability:
>     bLength                10
>     bDescriptorType        16
>     bDevCapabilityType      3
>     bmAttributes         0x00
>     wSpeedsSupported   0x000e
>       Device can operate at Full Speed (12Mbps)
>       Device can operate at High Speed (480Mbps)
>       Device can operate at SuperSpeed (5Gbps)
>     bFunctionalitySupport   3
>       Lowest fully-functional device speed is SuperSpeed (5Gbps)
>     bU1DevExitLat           0 micro seconds
>     bU2DevExitLat           0 micro seconds
> 
> (Missing must-be-set LPM bit!) seems to be weird? As it looks like
> just nulled data.

OK, so it's broken during enumeration and after enumeration.

But that's the "fallback" case after hanging during SS+ enumeration,
which we would like to prevent from happening. What about 5gbps ports,
does it work correctly at SS or still report zero LPM?

And running at SS+ with the patch applied, does the device produce
sensible BOS descriptor? The previous one did.

What if you extend the patch to also apply at SS? It won't fix LPM
during enumeration, but would it fix the descriptor seen by lsusb?

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  9:45         ` Michal Pecio
@ 2025-12-07 10:47           ` Johannes Brüderl
  2025-12-07 11:00             ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Johannes Brüderl @ 2025-12-07 10:47 UTC (permalink / raw)
  To: Michal Pecio; +Cc: linux-usb, gregkh

On Sun, Dec 7, 2025 at 10:45 AM Michal Pecio <michal.pecio@gmail.com> wrote:
>
> On Sun, 7 Dec 2025 10:22:41 +0100, Johannes Brüderl wrote:
> > Here's the BOS Descriptor section when running w/ root.
> > This is without this patch, so it "reconnected" with SuperSpeed (5Gbps).
> >
> > Binary Object Store Descriptor:
> >   bLength                 5
> >   bDescriptorType        15
> >   wTotalLength       0x0016
> >   bNumDeviceCaps          2
> >   USB 2.0 Extension Device Capability:
> >     bLength                 7
> >     bDescriptorType        16
> >     bDevCapabilityType      2
> >     bmAttributes   0x00000000
> >       (Missing must-be-set LPM bit!)
> >   SuperSpeed USB Device Capability:
> >     bLength                10
> >     bDescriptorType        16
> >     bDevCapabilityType      3
> >     bmAttributes         0x00
> >     wSpeedsSupported   0x000e
> >       Device can operate at Full Speed (12Mbps)
> >       Device can operate at High Speed (480Mbps)
> >       Device can operate at SuperSpeed (5Gbps)
> >     bFunctionalitySupport   3
> >       Lowest fully-functional device speed is SuperSpeed (5Gbps)
> >     bU1DevExitLat           0 micro seconds
> >     bU2DevExitLat           0 micro seconds
> >
> > (Missing must-be-set LPM bit!) seems to be weird? As it looks like
> > just nulled data.
>
> OK, so it's broken during enumeration and after enumeration.
>
> But that's the "fallback" case after hanging during SS+ enumeration,
> which we would like to prevent from happening. What about 5gbps ports,
> does it work correctly at SS or still report zero LPM?
>
> And running at SS+ with the patch applied, does the device produce
> sensible BOS descriptor? The previous one did.
>
> What if you extend the patch to also apply at SS? It won't fix LPM
> during enumeration, but would it fix the descriptor seen by lsusb?

Hello Michal,

very good questions.. the result was surprising to me.

1) How does it do on 5GBps port?

Without patch:

[ 1522.177297] usb 6-1: new SuperSpeed USB device number 4 using xhci_hcd
[ 1527.440481] usb 6-1: unable to get BOS descriptor or descriptor too short
[ 1527.465514] usb 6-1: unable to read config index 0 descriptor/start: -71
[ 1527.465520] usb 6-1: can't read configurations, error -71
[ 1527.648035] usb 6-1: new SuperSpeed USB device number 5 using xhci_hcd
[ 1527.839295] usb 6-1: LPM exit latency is zeroed, disabling LPM.

Looks like the BOS descriptor cannot be read either.

Any, very interesting:

Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength       0x0016
  bNumDeviceCaps          2
  USB 2.0 Extension Device Capability:
    bLength                 7
    bDescriptorType        16
    bDevCapabilityType      2
    bmAttributes   0x00000000
      (Missing must-be-set LPM bit!)
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x00
    wSpeedsSupported   0x000e
      Device can operate at Full Speed (12Mbps)
      Device can operate at High Speed (480Mbps)
      Device can operate at SuperSpeed (5Gbps)
    bFunctionalitySupport   3
      Lowest fully-functional device speed is SuperSpeed (5Gbps)
    bU1DevExitLat           0 micro seconds
    bU2DevExitLat           0 micro seconds

Very interesting - even reading it "manually" via lsusb - seems to
fail, even at SS.

2) Does it produce a sensible BOS descriptor post-patch at SS+ ? It
looks like it.
Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength       0x002a
  bNumDeviceCaps          3
  USB 2.0 Extension Device Capability:
    bLength                 7
    bDescriptorType        16
    bDevCapabilityType      2
    bmAttributes   0x0000f41e
      BESL Link Power Management (LPM) Supported
      Baseline BESL value    400 us
      Deep BESL value      10000 us
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x00
    wSpeedsSupported   0x000e
      Device can operate at Full Speed (12Mbps)
      Device can operate at High Speed (480Mbps)
      Device can operate at SuperSpeed (5Gbps)
    bFunctionalitySupport   1
      Lowest fully-functional device speed is Full Speed (12Mbps)
    bU1DevExitLat          10 micro seconds
    bU2DevExitLat        2047 micro seconds
  SuperSpeedPlus USB Device Capability:
    bLength                20
    bDescriptorType        16
    bDevCapabilityType     10
    bmAttributes         0x00000001
      Sublink Speed Attribute count 2
      Sublink Speed ID count 1
    wFunctionalitySupport   0x1100
      Min functional Speed Attribute ID: 0
      Min functional RX lanes: 1
      Min functional TX lanes: 1
    bmSublinkSpeedAttr[0]   0x000a4030
      Speed Attribute ID: 0 10Gb/s Symmetric RX SuperSpeedPlus
    bmSublinkSpeedAttr[1]   0x000a40b0
      Speed Attribute ID: 0 10Gb/s Symmetric TX SuperSpeedPlus

3) What if I apply the patch to SS as well?

Connect:
[    3.293251] usb 6-1: new SuperSpeed USB device number 2 using xhci_hcd
[    3.349030] usb 6-1: skipping BOS descriptor
[    3.429817] usb 6-1: New USB device found, idVendor=0fd9,
idProduct=009c, bcdDevice= 0.02
[    3.429825] usb 6-1: New USB device strings: Mfr=6, Product=7, SerialNumber=3
[    3.429828] usb 6-1: Product: Elgato 4K X
[    3.429830] usb 6-1: Manufacturer: Elgato
[    3.429833] usb 6-1: SerialNumber: A7SNB517214G5K
[    9.019651] usb 6-1: 3:2: failed to get current value for ch 0 (-22)
[    9.028103] usb 6-1: Found UVC 1.00 device Elgato 4K X (0fd9:009c)

sudo lsusb -v -d 0fd9:009c
Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength       0x0016
  bNumDeviceCaps          2
  USB 2.0 Extension Device Capability:
    bLength                 7
    bDescriptorType        16
    bDevCapabilityType      2
    bmAttributes   0x00000000
      (Missing must-be-set LPM bit!)
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x00
    wSpeedsSupported   0x000e
      Device can operate at Full Speed (12Mbps)
      Device can operate at High Speed (480Mbps)
      Device can operate at SuperSpeed (5Gbps)
    bFunctionalitySupport   3
      Lowest fully-functional device speed is SuperSpeed (5Gbps)
    bU1DevExitLat           0 micro seconds
    bU2DevExitLat           0 micro seconds

Again (Missing must-be-set LPM bit!).

So.. if i summarize it correctly: on SS, BOS fetch seems to fail
immediately when connecting, but also "later" when I use lsusb.
But, on SS+, if i skip BOS fetch on connect, it works when done later...

For what it's worth: I've recorded a few hours of Gameplay with the
patch, and rebooted a couple times, it seems to do the trick.

BR,
Johannes

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07 10:47           ` Johannes Brüderl
@ 2025-12-07 11:00             ` Greg KH
  2025-12-07 21:12               ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Greg KH @ 2025-12-07 11:00 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: Michal Pecio, linux-usb

On Sun, Dec 07, 2025 at 11:47:34AM +0100, Johannes Brüderl wrote:
> On Sun, Dec 7, 2025 at 10:45 AM Michal Pecio <michal.pecio@gmail.com> wrote:
> >
> > On Sun, 7 Dec 2025 10:22:41 +0100, Johannes Brüderl wrote:
> > > Here's the BOS Descriptor section when running w/ root.
> > > This is without this patch, so it "reconnected" with SuperSpeed (5Gbps).
> > >
> > > Binary Object Store Descriptor:
> > >   bLength                 5
> > >   bDescriptorType        15
> > >   wTotalLength       0x0016
> > >   bNumDeviceCaps          2
> > >   USB 2.0 Extension Device Capability:
> > >     bLength                 7
> > >     bDescriptorType        16
> > >     bDevCapabilityType      2
> > >     bmAttributes   0x00000000
> > >       (Missing must-be-set LPM bit!)
> > >   SuperSpeed USB Device Capability:
> > >     bLength                10
> > >     bDescriptorType        16
> > >     bDevCapabilityType      3
> > >     bmAttributes         0x00
> > >     wSpeedsSupported   0x000e
> > >       Device can operate at Full Speed (12Mbps)
> > >       Device can operate at High Speed (480Mbps)
> > >       Device can operate at SuperSpeed (5Gbps)
> > >     bFunctionalitySupport   3
> > >       Lowest fully-functional device speed is SuperSpeed (5Gbps)
> > >     bU1DevExitLat           0 micro seconds
> > >     bU2DevExitLat           0 micro seconds
> > >
> > > (Missing must-be-set LPM bit!) seems to be weird? As it looks like
> > > just nulled data.
> >
> > OK, so it's broken during enumeration and after enumeration.
> >
> > But that's the "fallback" case after hanging during SS+ enumeration,
> > which we would like to prevent from happening. What about 5gbps ports,
> > does it work correctly at SS or still report zero LPM?
> >
> > And running at SS+ with the patch applied, does the device produce
> > sensible BOS descriptor? The previous one did.
> >
> > What if you extend the patch to also apply at SS? It won't fix LPM
> > during enumeration, but would it fix the descriptor seen by lsusb?
> 
> Hello Michal,
> 
> very good questions.. the result was surprising to me.
> 
> 1) How does it do on 5GBps port?
> 
> Without patch:
> 
> [ 1522.177297] usb 6-1: new SuperSpeed USB device number 4 using xhci_hcd
> [ 1527.440481] usb 6-1: unable to get BOS descriptor or descriptor too short
> [ 1527.465514] usb 6-1: unable to read config index 0 descriptor/start: -71
> [ 1527.465520] usb 6-1: can't read configurations, error -71
> [ 1527.648035] usb 6-1: new SuperSpeed USB device number 5 using xhci_hcd
> [ 1527.839295] usb 6-1: LPM exit latency is zeroed, disabling LPM.
> 
> Looks like the BOS descriptor cannot be read either.
> 
> Any, very interesting:
> 
> Binary Object Store Descriptor:
>   bLength                 5
>   bDescriptorType        15
>   wTotalLength       0x0016
>   bNumDeviceCaps          2
>   USB 2.0 Extension Device Capability:
>     bLength                 7
>     bDescriptorType        16
>     bDevCapabilityType      2
>     bmAttributes   0x00000000
>       (Missing must-be-set LPM bit!)
>   SuperSpeed USB Device Capability:
>     bLength                10
>     bDescriptorType        16
>     bDevCapabilityType      3
>     bmAttributes         0x00
>     wSpeedsSupported   0x000e
>       Device can operate at Full Speed (12Mbps)
>       Device can operate at High Speed (480Mbps)
>       Device can operate at SuperSpeed (5Gbps)
>     bFunctionalitySupport   3
>       Lowest fully-functional device speed is SuperSpeed (5Gbps)
>     bU1DevExitLat           0 micro seconds
>     bU2DevExitLat           0 micro seconds
> 
> Very interesting - even reading it "manually" via lsusb - seems to
> fail, even at SS.
> 
> 2) Does it produce a sensible BOS descriptor post-patch at SS+ ? It
> looks like it.
> Binary Object Store Descriptor:
>   bLength                 5
>   bDescriptorType        15
>   wTotalLength       0x002a
>   bNumDeviceCaps          3
>   USB 2.0 Extension Device Capability:
>     bLength                 7
>     bDescriptorType        16
>     bDevCapabilityType      2
>     bmAttributes   0x0000f41e
>       BESL Link Power Management (LPM) Supported
>       Baseline BESL value    400 us
>       Deep BESL value      10000 us
>   SuperSpeed USB Device Capability:
>     bLength                10
>     bDescriptorType        16
>     bDevCapabilityType      3
>     bmAttributes         0x00
>     wSpeedsSupported   0x000e
>       Device can operate at Full Speed (12Mbps)
>       Device can operate at High Speed (480Mbps)
>       Device can operate at SuperSpeed (5Gbps)
>     bFunctionalitySupport   1
>       Lowest fully-functional device speed is Full Speed (12Mbps)
>     bU1DevExitLat          10 micro seconds
>     bU2DevExitLat        2047 micro seconds
>   SuperSpeedPlus USB Device Capability:
>     bLength                20
>     bDescriptorType        16
>     bDevCapabilityType     10
>     bmAttributes         0x00000001
>       Sublink Speed Attribute count 2
>       Sublink Speed ID count 1
>     wFunctionalitySupport   0x1100
>       Min functional Speed Attribute ID: 0
>       Min functional RX lanes: 1
>       Min functional TX lanes: 1
>     bmSublinkSpeedAttr[0]   0x000a4030
>       Speed Attribute ID: 0 10Gb/s Symmetric RX SuperSpeedPlus
>     bmSublinkSpeedAttr[1]   0x000a40b0
>       Speed Attribute ID: 0 10Gb/s Symmetric TX SuperSpeedPlus
> 
> 3) What if I apply the patch to SS as well?
> 
> Connect:
> [    3.293251] usb 6-1: new SuperSpeed USB device number 2 using xhci_hcd
> [    3.349030] usb 6-1: skipping BOS descriptor
> [    3.429817] usb 6-1: New USB device found, idVendor=0fd9,
> idProduct=009c, bcdDevice= 0.02
> [    3.429825] usb 6-1: New USB device strings: Mfr=6, Product=7, SerialNumber=3
> [    3.429828] usb 6-1: Product: Elgato 4K X
> [    3.429830] usb 6-1: Manufacturer: Elgato
> [    3.429833] usb 6-1: SerialNumber: A7SNB517214G5K
> [    9.019651] usb 6-1: 3:2: failed to get current value for ch 0 (-22)
> [    9.028103] usb 6-1: Found UVC 1.00 device Elgato 4K X (0fd9:009c)
> 
> sudo lsusb -v -d 0fd9:009c
> Binary Object Store Descriptor:
>   bLength                 5
>   bDescriptorType        15
>   wTotalLength       0x0016
>   bNumDeviceCaps          2
>   USB 2.0 Extension Device Capability:
>     bLength                 7
>     bDescriptorType        16
>     bDevCapabilityType      2
>     bmAttributes   0x00000000
>       (Missing must-be-set LPM bit!)
>   SuperSpeed USB Device Capability:
>     bLength                10
>     bDescriptorType        16
>     bDevCapabilityType      3
>     bmAttributes         0x00
>     wSpeedsSupported   0x000e
>       Device can operate at Full Speed (12Mbps)
>       Device can operate at High Speed (480Mbps)
>       Device can operate at SuperSpeed (5Gbps)
>     bFunctionalitySupport   3
>       Lowest fully-functional device speed is SuperSpeed (5Gbps)
>     bU1DevExitLat           0 micro seconds
>     bU2DevExitLat           0 micro seconds
> 
> Again (Missing must-be-set LPM bit!).
> 
> So.. if i summarize it correctly: on SS, BOS fetch seems to fail
> immediately when connecting, but also "later" when I use lsusb.
> But, on SS+, if i skip BOS fetch on connect, it works when done later...
> 
> For what it's worth: I've recorded a few hours of Gameplay with the
> patch, and rebooted a couple times, it seems to do the trick.

This is really odd.  I just picked one of these devices up and will try
this out next week when I get a chance to connect it to a system that
isn't just my laptop (I don't think my laptop's usb ports are that fast,
but I could be wrong, will try it out later this week...)

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07 11:00             ` Greg KH
@ 2025-12-07 21:12               ` Greg KH
  2025-12-07 22:06                 ` Michal Pecio
  2025-12-08  8:58                 ` Oliver Neukum
  0 siblings, 2 replies; 19+ messages in thread
From: Greg KH @ 2025-12-07 21:12 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: Michal Pecio, linux-usb

On Sun, Dec 07, 2025 at 08:00:53PM +0900, Greg KH wrote:
> On Sun, Dec 07, 2025 at 11:47:34AM +0100, Johannes Brüderl wrote:
> > On Sun, Dec 7, 2025 at 10:45 AM Michal Pecio <michal.pecio@gmail.com> wrote:
> > >
> > > On Sun, 7 Dec 2025 10:22:41 +0100, Johannes Brüderl wrote:
> > > > Here's the BOS Descriptor section when running w/ root.
> > > > This is without this patch, so it "reconnected" with SuperSpeed (5Gbps).
> > > >
> > > > Binary Object Store Descriptor:
> > > >   bLength                 5
> > > >   bDescriptorType        15
> > > >   wTotalLength       0x0016
> > > >   bNumDeviceCaps          2
> > > >   USB 2.0 Extension Device Capability:
> > > >     bLength                 7
> > > >     bDescriptorType        16
> > > >     bDevCapabilityType      2
> > > >     bmAttributes   0x00000000
> > > >       (Missing must-be-set LPM bit!)
> > > >   SuperSpeed USB Device Capability:
> > > >     bLength                10
> > > >     bDescriptorType        16
> > > >     bDevCapabilityType      3
> > > >     bmAttributes         0x00
> > > >     wSpeedsSupported   0x000e
> > > >       Device can operate at Full Speed (12Mbps)
> > > >       Device can operate at High Speed (480Mbps)
> > > >       Device can operate at SuperSpeed (5Gbps)
> > > >     bFunctionalitySupport   3
> > > >       Lowest fully-functional device speed is SuperSpeed (5Gbps)
> > > >     bU1DevExitLat           0 micro seconds
> > > >     bU2DevExitLat           0 micro seconds
> > > >
> > > > (Missing must-be-set LPM bit!) seems to be weird? As it looks like
> > > > just nulled data.
> > >
> > > OK, so it's broken during enumeration and after enumeration.
> > >
> > > But that's the "fallback" case after hanging during SS+ enumeration,
> > > which we would like to prevent from happening. What about 5gbps ports,
> > > does it work correctly at SS or still report zero LPM?
> > >
> > > And running at SS+ with the patch applied, does the device produce
> > > sensible BOS descriptor? The previous one did.
> > >
> > > What if you extend the patch to also apply at SS? It won't fix LPM
> > > during enumeration, but would it fix the descriptor seen by lsusb?
> > 
> > Hello Michal,
> > 
> > very good questions.. the result was surprising to me.
> > 
> > 1) How does it do on 5GBps port?
> > 
> > Without patch:
> > 
> > [ 1522.177297] usb 6-1: new SuperSpeed USB device number 4 using xhci_hcd
> > [ 1527.440481] usb 6-1: unable to get BOS descriptor or descriptor too short
> > [ 1527.465514] usb 6-1: unable to read config index 0 descriptor/start: -71
> > [ 1527.465520] usb 6-1: can't read configurations, error -71
> > [ 1527.648035] usb 6-1: new SuperSpeed USB device number 5 using xhci_hcd
> > [ 1527.839295] usb 6-1: LPM exit latency is zeroed, disabling LPM.
> > 
> > Looks like the BOS descriptor cannot be read either.
> > 
> > Any, very interesting:
> > 
> > Binary Object Store Descriptor:
> >   bLength                 5
> >   bDescriptorType        15
> >   wTotalLength       0x0016
> >   bNumDeviceCaps          2
> >   USB 2.0 Extension Device Capability:
> >     bLength                 7
> >     bDescriptorType        16
> >     bDevCapabilityType      2
> >     bmAttributes   0x00000000
> >       (Missing must-be-set LPM bit!)
> >   SuperSpeed USB Device Capability:
> >     bLength                10
> >     bDescriptorType        16
> >     bDevCapabilityType      3
> >     bmAttributes         0x00
> >     wSpeedsSupported   0x000e
> >       Device can operate at Full Speed (12Mbps)
> >       Device can operate at High Speed (480Mbps)
> >       Device can operate at SuperSpeed (5Gbps)
> >     bFunctionalitySupport   3
> >       Lowest fully-functional device speed is SuperSpeed (5Gbps)
> >     bU1DevExitLat           0 micro seconds
> >     bU2DevExitLat           0 micro seconds
> > 
> > Very interesting - even reading it "manually" via lsusb - seems to
> > fail, even at SS.
> > 
> > 2) Does it produce a sensible BOS descriptor post-patch at SS+ ? It
> > looks like it.
> > Binary Object Store Descriptor:
> >   bLength                 5
> >   bDescriptorType        15
> >   wTotalLength       0x002a
> >   bNumDeviceCaps          3
> >   USB 2.0 Extension Device Capability:
> >     bLength                 7
> >     bDescriptorType        16
> >     bDevCapabilityType      2
> >     bmAttributes   0x0000f41e
> >       BESL Link Power Management (LPM) Supported
> >       Baseline BESL value    400 us
> >       Deep BESL value      10000 us
> >   SuperSpeed USB Device Capability:
> >     bLength                10
> >     bDescriptorType        16
> >     bDevCapabilityType      3
> >     bmAttributes         0x00
> >     wSpeedsSupported   0x000e
> >       Device can operate at Full Speed (12Mbps)
> >       Device can operate at High Speed (480Mbps)
> >       Device can operate at SuperSpeed (5Gbps)
> >     bFunctionalitySupport   1
> >       Lowest fully-functional device speed is Full Speed (12Mbps)
> >     bU1DevExitLat          10 micro seconds
> >     bU2DevExitLat        2047 micro seconds
> >   SuperSpeedPlus USB Device Capability:
> >     bLength                20
> >     bDescriptorType        16
> >     bDevCapabilityType     10
> >     bmAttributes         0x00000001
> >       Sublink Speed Attribute count 2
> >       Sublink Speed ID count 1
> >     wFunctionalitySupport   0x1100
> >       Min functional Speed Attribute ID: 0
> >       Min functional RX lanes: 1
> >       Min functional TX lanes: 1
> >     bmSublinkSpeedAttr[0]   0x000a4030
> >       Speed Attribute ID: 0 10Gb/s Symmetric RX SuperSpeedPlus
> >     bmSublinkSpeedAttr[1]   0x000a40b0
> >       Speed Attribute ID: 0 10Gb/s Symmetric TX SuperSpeedPlus
> > 
> > 3) What if I apply the patch to SS as well?
> > 
> > Connect:
> > [    3.293251] usb 6-1: new SuperSpeed USB device number 2 using xhci_hcd
> > [    3.349030] usb 6-1: skipping BOS descriptor
> > [    3.429817] usb 6-1: New USB device found, idVendor=0fd9,
> > idProduct=009c, bcdDevice= 0.02
> > [    3.429825] usb 6-1: New USB device strings: Mfr=6, Product=7, SerialNumber=3
> > [    3.429828] usb 6-1: Product: Elgato 4K X
> > [    3.429830] usb 6-1: Manufacturer: Elgato
> > [    3.429833] usb 6-1: SerialNumber: A7SNB517214G5K
> > [    9.019651] usb 6-1: 3:2: failed to get current value for ch 0 (-22)
> > [    9.028103] usb 6-1: Found UVC 1.00 device Elgato 4K X (0fd9:009c)
> > 
> > sudo lsusb -v -d 0fd9:009c
> > Binary Object Store Descriptor:
> >   bLength                 5
> >   bDescriptorType        15
> >   wTotalLength       0x0016
> >   bNumDeviceCaps          2
> >   USB 2.0 Extension Device Capability:
> >     bLength                 7
> >     bDescriptorType        16
> >     bDevCapabilityType      2
> >     bmAttributes   0x00000000
> >       (Missing must-be-set LPM bit!)
> >   SuperSpeed USB Device Capability:
> >     bLength                10
> >     bDescriptorType        16
> >     bDevCapabilityType      3
> >     bmAttributes         0x00
> >     wSpeedsSupported   0x000e
> >       Device can operate at Full Speed (12Mbps)
> >       Device can operate at High Speed (480Mbps)
> >       Device can operate at SuperSpeed (5Gbps)
> >     bFunctionalitySupport   3
> >       Lowest fully-functional device speed is SuperSpeed (5Gbps)
> >     bU1DevExitLat           0 micro seconds
> >     bU2DevExitLat           0 micro seconds
> > 
> > Again (Missing must-be-set LPM bit!).
> > 
> > So.. if i summarize it correctly: on SS, BOS fetch seems to fail
> > immediately when connecting, but also "later" when I use lsusb.
> > But, on SS+, if i skip BOS fetch on connect, it works when done later...
> > 
> > For what it's worth: I've recorded a few hours of Gameplay with the
> > patch, and rebooted a couple times, it seems to do the trick.
> 
> This is really odd.  I just picked one of these devices up and will try
> this out next week when I get a chance to connect it to a system that
> isn't just my laptop (I don't think my laptop's usb ports are that fast,
> but I could be wrong, will try it out later this week...)

Ok, I can duplicate this here.  Maybe we just don't ask for the BOS
descriptor if no one needs/asks for it.  I can play with that later and
see if that helps as I'm sure this isn't going to be the only device
that can't handle the BOS descriptor if Windows isn't querying for it,
so we don't want to make a huge quirk table if we don't have to.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07 21:12               ` Greg KH
@ 2025-12-07 22:06                 ` Michal Pecio
  2025-12-08  8:58                 ` Oliver Neukum
  1 sibling, 0 replies; 19+ messages in thread
From: Michal Pecio @ 2025-12-07 22:06 UTC (permalink / raw)
  To: Greg KH; +Cc: Johannes Brüderl, linux-usb

On Mon, 8 Dec 2025 06:12:15 +0900, Greg KH wrote:
> I'm sure this isn't going to be the only device that can't handle the
> BOS descriptor if Windows isn't querying for it

I speculated in bugzilla that maybe Windows isn't asking for it, but I
doubt it now because BOS is required for LPM. More likely it was simply
WinPCAP failing to capture those queries when I tried.

lsusb works, so something "fixes" this device - maybe just waiting long
enough, maybe using different wLength, mabye getting config descriptors
before BOS or setting configuration first, I don't know.

Windows in a VM may show you how to do it ;)

Regards,
Michal

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07 21:12               ` Greg KH
  2025-12-07 22:06                 ` Michal Pecio
@ 2025-12-08  8:58                 ` Oliver Neukum
  2025-12-08 20:46                   ` Greg KH
  1 sibling, 1 reply; 19+ messages in thread
From: Oliver Neukum @ 2025-12-08  8:58 UTC (permalink / raw)
  To: Greg KH, Johannes Brüderl; +Cc: Michal Pecio, linux-usb

On 07.12.25 22:12, Greg KH wrote:
  
> Ok, I can duplicate this here.  Maybe we just don't ask for the BOS
> descriptor if no one needs/asks for it.  I can play with that later and
> see if that helps as I'm sure this isn't going to be the only device
> that can't handle the BOS descriptor if Windows isn't querying for it,
> so we don't want to make a huge quirk table if we don't have to.

1. That means we'd let lsusb crash devices. Not a good idea.
2. It is, unfortunately, possible that firmware authors simply
script a detection sequence. That means devices would crash
if you request a descriptor at a time when Windows would not
request it, not just in general.
I am afraid I need to point you at the horrible example
of HID_ALWAYS_POLL

	Regards
		Oliver


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-08  8:58                 ` Oliver Neukum
@ 2025-12-08 20:46                   ` Greg KH
  2025-12-28 12:54                     ` Johannes Brüderl
  0 siblings, 1 reply; 19+ messages in thread
From: Greg KH @ 2025-12-08 20:46 UTC (permalink / raw)
  To: Oliver Neukum; +Cc: Johannes Brüderl, Michal Pecio, linux-usb

On Mon, Dec 08, 2025 at 09:58:55AM +0100, Oliver Neukum wrote:
> On 07.12.25 22:12, Greg KH wrote:
> > Ok, I can duplicate this here.  Maybe we just don't ask for the BOS
> > descriptor if no one needs/asks for it.  I can play with that later and
> > see if that helps as I'm sure this isn't going to be the only device
> > that can't handle the BOS descriptor if Windows isn't querying for it,
> > so we don't want to make a huge quirk table if we don't have to.
> 
> 1. That means we'd let lsusb crash devices. Not a good idea.

I don't think that it will crash.  hopefully not, as just reading a
descriptor after enumerated shouldn't cause that.  I'll test it out...

> 2. It is, unfortunately, possible that firmware authors simply
> script a detection sequence. That means devices would crash
> if you request a descriptor at a time when Windows would not
> request it, not just in general.
> I am afraid I need to point you at the horrible example
> of HID_ALWAYS_POLL

That is horrible, hopefully we don't have to do that here :(

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-08 20:46                   ` Greg KH
@ 2025-12-28 12:54                     ` Johannes Brüderl
  2025-12-28 13:18                       ` Greg KH
  0 siblings, 1 reply; 19+ messages in thread
From: Johannes Brüderl @ 2025-12-28 12:54 UTC (permalink / raw)
  To: Greg KH; +Cc: Oliver Neukum, Michal Pecio, linux-usb

On Mon, Dec 8, 2025 at 9:46 PM Greg KH <gregkh@linuxfoundation.org> wrote:
>
> On Mon, Dec 08, 2025 at 09:58:55AM +0100, Oliver Neukum wrote:
> > On 07.12.25 22:12, Greg KH wrote:
> > > Ok, I can duplicate this here.  Maybe we just don't ask for the BOS
> > > descriptor if no one needs/asks for it.  I can play with that later and
> > > see if that helps as I'm sure this isn't going to be the only device
> > > that can't handle the BOS descriptor if Windows isn't querying for it,
> > > so we don't want to make a huge quirk table if we don't have to.
> >
> > 1. That means we'd let lsusb crash devices. Not a good idea.
>
> I don't think that it will crash.  hopefully not, as just reading a
> descriptor after enumerated shouldn't cause that.  I'll test it out...
>
> > 2. It is, unfortunately, possible that firmware authors simply
> > script a detection sequence. That means devices would crash
> > if you request a descriptor at a time when Windows would not
> > request it, not just in general.
> > I am afraid I need to point you at the horrible example
> > of HID_ALWAYS_POLL
>
> That is horrible, hopefully we don't have to do that here :(
>
> thanks,
>
> greg k-h

Hello Greg,
I apologize for the "blunt bump" of this topic.
Are you (still) open to considering the quirk ?

A small number of users have started using the Patch, and it seems to
solve a real problem.. (ref:
https://www.reddit.com/r/elgato/comments/1lw1e0v/comment/ntrdjpb/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button)

Given that the options for 4k60fps recording are very limited for
Linux these days - I suggest it might be worth it. AFAIK, there's no
good other option in terms of hardware as of December 2025.
I understand it's a special quirk for just this device, which is not pretty..

(Note: i've submitted a v3 patch that addressed the feedback).

Thanks and Best Regards,
Johannes

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-28 12:54                     ` Johannes Brüderl
@ 2025-12-28 13:18                       ` Greg KH
  0 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2025-12-28 13:18 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: Oliver Neukum, Michal Pecio, linux-usb

On Sun, Dec 28, 2025 at 01:54:34PM +0100, Johannes Brüderl wrote:
> On Mon, Dec 8, 2025 at 9:46 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> >
> > On Mon, Dec 08, 2025 at 09:58:55AM +0100, Oliver Neukum wrote:
> > > On 07.12.25 22:12, Greg KH wrote:
> > > > Ok, I can duplicate this here.  Maybe we just don't ask for the BOS
> > > > descriptor if no one needs/asks for it.  I can play with that later and
> > > > see if that helps as I'm sure this isn't going to be the only device
> > > > that can't handle the BOS descriptor if Windows isn't querying for it,
> > > > so we don't want to make a huge quirk table if we don't have to.
> > >
> > > 1. That means we'd let lsusb crash devices. Not a good idea.
> >
> > I don't think that it will crash.  hopefully not, as just reading a
> > descriptor after enumerated shouldn't cause that.  I'll test it out...
> >
> > > 2. It is, unfortunately, possible that firmware authors simply
> > > script a detection sequence. That means devices would crash
> > > if you request a descriptor at a time when Windows would not
> > > request it, not just in general.
> > > I am afraid I need to point you at the horrible example
> > > of HID_ALWAYS_POLL
> >
> > That is horrible, hopefully we don't have to do that here :(
> >
> > thanks,
> >
> > greg k-h
> 
> Hello Greg,
> I apologize for the "blunt bump" of this topic.
> Are you (still) open to considering the quirk ?
> 
> A small number of users have started using the Patch, and it seems to
> solve a real problem.. (ref:
> https://www.reddit.com/r/elgato/comments/1lw1e0v/comment/ntrdjpb/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button)
> 
> Given that the options for 4k60fps recording are very limited for
> Linux these days - I suggest it might be worth it. AFAIK, there's no
> good other option in terms of hardware as of December 2025.
> I understand it's a special quirk for just this device, which is not pretty..
> 
> (Note: i've submitted a v3 patch that addressed the feedback).

Sorry, I haven't had a chance to dig into this due to travel and the
holidays.  Give me a few days to catch up...

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v3 1/1] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor
  2025-12-07  9:02       ` [PATCH v3 1/1] " Johannes Brüderl
@ 2026-01-07 16:06         ` Greg KH
  0 siblings, 0 replies; 19+ messages in thread
From: Greg KH @ 2026-01-07 16:06 UTC (permalink / raw)
  To: Johannes Brüderl; +Cc: linux-usb, larsm17

On Sun, Dec 07, 2025 at 10:02:20AM +0100, Johannes Brüderl wrote:
> Add USB_QUIRK_NO_BOS quirk flag to skip requesting the BOS descriptor
> for devices that cannot handle it.
> 
> Add Elgato 4K X (0fd9:009b) to the quirk table. This device hangs when
> the BOS descriptor is requested at SuperSpeed Plus (10Gbps).
> 
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=220027
> Signed-off-by: Johannes Brüderl <johannes.bruederl@gmail.com>
> ---
> Hi Lars,
> you are right, good catch! This should be correctly sorted now.
> 
> v3: Move quirk entry to correct position in sorted VID:PID order.
> v2: Return -ENOMSG instead of 0 to properly indicate no BOS data.

Ok, in playing with this some more, I think this is the best thing for
now.  I'll go queue this up now.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2026-01-07 16:06 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-07  0:00 [PATCH] usb: core: add USB_QUIRK_NO_BOS for devices that hang on BOS descriptor Johannes Brüderl
2025-12-07  0:15 ` Greg KH
2025-12-07  1:20   ` [PATCH v2] " Johannes Brüderl
2025-12-07  6:19     ` Lars Melin
2025-12-07  9:02       ` [PATCH v3 1/1] " Johannes Brüderl
2026-01-07 16:06         ` Greg KH
2025-12-07  7:40     ` [PATCH v2] " Michal Pecio
2025-12-07  9:22       ` Johannes Brüderl
2025-12-07  9:45         ` Michal Pecio
2025-12-07 10:47           ` Johannes Brüderl
2025-12-07 11:00             ` Greg KH
2025-12-07 21:12               ` Greg KH
2025-12-07 22:06                 ` Michal Pecio
2025-12-08  8:58                 ` Oliver Neukum
2025-12-08 20:46                   ` Greg KH
2025-12-28 12:54                     ` Johannes Brüderl
2025-12-28 13:18                       ` Greg KH
2025-12-07  0:37 ` [PATCH] " Michal Pecio
2025-12-07  0:59   ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox