* [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support
@ 2025-08-20 14:38 Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 1/9] usb: core: Use le16_to_cpu() to read __le16 value in usb_parse_endpoint() Sakari Ailus
` (9 more replies)
0 siblings, 10 replies; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
Hi all,
This series enables support for eUSB2 Double Isochronous IN Bandwidth UVC
devices specified in 'USB 2.0 Double Isochronous IN Bandwidth' ECN. In
short, it adds support for new integrated USB2 webcams that can send twice
the data compared to conventional USB2 webcams.
These devices are identified by the device descriptor bcdUSB 0x0220 value.
They have an additional eUSB2 Isochronous Endpoint Companion Descriptor,
and a zero max packet size in regular isoc endpoint descriptor. Support
for parsing that new descriptor was added in commit
c749f058b437 ("USB: core: Add eUSB2 descriptor and parsing in USB core")
This series adds support to UVC, USB core, and xHCI to identify eUSB2
double isoc devices, and allow and set proper max packet, iso frame desc
sizes, bytes per interval, and other values in URBs and xHCI endpoint
contexts needed to support the double data rates for eUSB2 double isoc
devices.
v1 can be found here
<URL:https://lore.kernel.org/linux-usb/20250616093730.2569328-2-mathias.nyman@linux.intel.com/>.
v2 can be found here
<URL:https://lore.kernel.org/linux-usb/20250711083413.1552423-1-sakari.ailus@linux.intel.com/>.
v3 can be found here
<URL:https://lore.kernel.org/linux-usb/20250807055355.1257029-1-sakari.ailus@linux.intel.com/>.
v4 can be found here
<URL:https://lore.kernel.org/linux-usb/20250812132445.3185026-1-sakari.ailus@linux.intel.com/>.
since v4:
- New patch: use le16_to_cpu() to access endpoint descriptor's
wMaxPacketSize field, which is an __le16. This isn't a bugfix as the
value was compared to 0.
- New patch: add USB device speed check for eUSB2 isochronous endpoint
companion parsing. The check is then removed from sites checking the
existence of the companion (through companion's bDescriptorType field,
which is non-zero for valid descriptors).
- New patch: do not parse eUSB2 isoc double BW companion descriptor on
interrupt or OUT endpoints. It is not supposed to be found there,
according to the ECN.
- Rename usb_endpoint_max_isoc_bpi() as
usb_endpoint_max_periodic_payload() and move it right after
usb_maxpacket().
- Fixed @ep reference in kernel-doc documentation for
usb_endpoint_max_periodic_payload().
- In usb_endpoint_max_periodic_payload(), call struct usb_device pointer
argument "udev" instead of "dev", to align with naming elsewhere.
- Add support for interrupt endpoints in
usb_endpoint_max_periodic_payload(); eUSB2 double isoc BW is still
limited to isochronous endpoints though.
- In usb_endpoint_max_periodic_payload(), remove the separate case for
USB_SPEED_HIGH as the check is already done in parsing the eUSB isoc
double BW companion, which is checked for.
- New patch: use usb_endpoint_max_periodic_payload() in xHCI driver,
replacing xhci_get_max_esit_payload().
- Check non-zero bDescriptorType field of ep->eusb2_isoc_ep_comp instead
of dwBytesPerInterval value exceeding 3072, where
xhci_eusb2_is_isoc_bw_double() was used. This aligns the checks of eUSB2
isochronous double bandwidth support for an endpoint.
- New patch: introduce usb_endpoint_is_hs_isoc_double() to figure out
whether an endpoint uses isochronous double bandwidth and use the
function in the xHCI driver and the usb core.
xhci_eusb2_is_isoc_bw_double() is dropped, as well as the
MAX_ISOC_XFER_SIZE_HS macro. usb_endpoint_is_hs_isoc_double() also
includes check for bcdUSB == 0x220, to anticipate adding support for
eUSB2V2.
- Merge condition for checking eUSB2 isoc double bw support for
xHCI/endpoint in xhci_get_endpoint_mult().
- Improve comment regarding maximum packet size bits 12:11 in
xhci_get_endpoint_max_burst().
- Aligned subject prefixes with the recent patches to the same files.
since v3:
- Use spaces in aligning macro body for HCC2_EUSB2_DIC() (1st patch).
- Move usb_endpoint_max_isoc_bpi() to drivers/usb/core/usb.c (3rd patch).
since v2:
- Use ep->eusb2_isoc_ep_comp.bDescriptorType to determined whether the
eUSB2 isochronous endpoint companion descriptor exists.
- Clean up eUSB2 double isoc bw maxp calculation.
- Drop le16_to_cpu(udev->descriptor.bcdUSB) == 0x220 check from
xhci_eusb2_is_isoc_bw_double() -- it's redundant as
ep->eusb2_isoc_ep_comp.dwBytesPerInterval will be zero otherwise.
- Add kernel-doc documentation for usb_endpoint_max_isoc_bpi().
- Check the endpoint has IN direction in usb_endpoint_max_isoc_bpi() and
usb_submit_urb() as a condition for eUSB2 isoc double bw.
since v1:
- Introduce uvc_endpoint_max_isoc_bpi() to obtain maximum bytes per
interval value for an endpoint, in a new patch (3rd). This code has been
slightly reworked from the instance in the UVC driver, including support
for SuperSpeedPlus Isochronous Endpoint Companion.
- Use usb_endpoint_max_isoc_bpi() in the UVC driver instead of open-coding
eUSB2 support there, also drop now-redundant uvc_endpoint_max_bpi().
- Use u32 for maximum bpi and related information in the UVC driver -- the
value could be larger than a 16-bit type can hold.
- Assume max in usb_submit_urb() is a natural number as
usb_endpoint_maxp() returns only natural numbers (2nd patch).
Rai, Amardeep (3):
usb: core: Add a function to get USB version independent periodic
payload
usb: xhci: Add host support for eUSB2 double isochronous bandwidth
devices
usb: core: support eUSB2 double bandwidth large isoc URB frames
Sakari Ailus (5):
usb: core: Use le16_to_cpu() to read __le16 value in
usb_parse_endpoint()
usb: core: Parse eUSB2 companion descriptors for high speed devices
only
usb: core: eUSB2 companion descriptor is for isoc IN endpoints only
usb: xhci: Use usb_endpoint_max_periodic_payload()
usb: core: Introduce usb_endpoint_is_hs_isoc_double()
Tao Q Tao (1):
media: uvcvideo: eUSB2 double isochronous bandwidth support
drivers/media/usb/uvc/uvc_driver.c | 4 +-
drivers/media/usb/uvc/uvc_video.c | 24 ++-------
drivers/media/usb/uvc/uvcvideo.h | 4 +-
drivers/usb/core/config.c | 4 +-
drivers/usb/core/urb.c | 14 +++--
drivers/usb/core/usb.c | 50 ++++++++++++++++++
drivers/usb/host/xhci-caps.h | 2 +
drivers/usb/host/xhci-mem.c | 85 ++++++++++++++----------------
drivers/usb/host/xhci-ring.c | 6 +--
drivers/usb/host/xhci.c | 16 +++++-
drivers/usb/host/xhci.h | 2 +
include/linux/usb.h | 6 +++
12 files changed, 137 insertions(+), 80 deletions(-)
--
2.47.2
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v5 1/9] usb: core: Use le16_to_cpu() to read __le16 value in usb_parse_endpoint()
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-26 12:50 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 2/9] usb: core: Parse eUSB2 companion descriptors for high speed devices only Sakari Ailus
` (8 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
wMaxPacketSize field in struct usb_endpoint_descriptor is an __le16, use
le16_to_cpu() to read it.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/usb/core/config.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index 42468bbeffd2..cda595b4014f 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -507,7 +507,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,
}
/* Parse a possible eUSB2 periodic endpoint companion descriptor */
- if (bcdUSB == 0x0220 && d->wMaxPacketSize == 0 &&
+ if (bcdUSB == 0x0220 && !le16_to_cpu(d->wMaxPacketSize) &&
(usb_endpoint_xfer_isoc(d) || usb_endpoint_xfer_int(d)))
usb_parse_eusb2_isoc_endpoint_companion(ddev, cfgno, inum, asnum,
endpoint, buffer, size);
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 2/9] usb: core: Parse eUSB2 companion descriptors for high speed devices only
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 1/9] usb: core: Use le16_to_cpu() to read __le16 value in usb_parse_endpoint() Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-26 12:50 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 3/9] usb: core: eUSB2 companion descriptor is for isoc IN endpoints only Sakari Ailus
` (7 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
Check that a device is a high-speed one before proceeding to parse the
eUSB2 isochronous endpoint companion descriptors.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/usb/core/config.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index cda595b4014f..29fcbd6de482 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -507,7 +507,8 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,
}
/* Parse a possible eUSB2 periodic endpoint companion descriptor */
- if (bcdUSB == 0x0220 && !le16_to_cpu(d->wMaxPacketSize) &&
+ if (udev->speed == USB_SPEED_HIGH && bcdUSB == 0x0220 &&
+ !le16_to_cpu(d->wMaxPacketSize) &&
(usb_endpoint_xfer_isoc(d) || usb_endpoint_xfer_int(d)))
usb_parse_eusb2_isoc_endpoint_companion(ddev, cfgno, inum, asnum,
endpoint, buffer, size);
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 3/9] usb: core: eUSB2 companion descriptor is for isoc IN endpoints only
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 1/9] usb: core: Use le16_to_cpu() to read __le16 value in usb_parse_endpoint() Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 2/9] usb: core: Parse eUSB2 companion descriptors for high speed devices only Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-26 12:52 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 4/9] usb: core: Add a function to get USB version independent periodic payload Sakari Ailus
` (6 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
The eUSB2 isochronous double bandwidth endpoint descriptor is allowed for
the isochronous IN endpoints, according to the ECN. Do not parse these
descriptors if they are found in interrupt or OUT endpoints.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/usb/core/config.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index 29fcbd6de482..baf5bc844b6f 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -508,8 +508,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,
/* Parse a possible eUSB2 periodic endpoint companion descriptor */
if (udev->speed == USB_SPEED_HIGH && bcdUSB == 0x0220 &&
- !le16_to_cpu(d->wMaxPacketSize) &&
- (usb_endpoint_xfer_isoc(d) || usb_endpoint_xfer_int(d)))
+ !le16_to_cpu(d->wMaxPacketSize) && usb_endpoint_is_isoc_in(d))
usb_parse_eusb2_isoc_endpoint_companion(ddev, cfgno, inum, asnum,
endpoint, buffer, size);
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 4/9] usb: core: Add a function to get USB version independent periodic payload
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
` (2 preceding siblings ...)
2025-08-20 14:38 ` [PATCH v5 3/9] usb: core: eUSB2 companion descriptor is for isoc IN endpoints only Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 5/9] usb: xhci: Use usb_endpoint_max_periodic_payload() Sakari Ailus
` (5 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
From: "Rai, Amardeep" <amardeep.rai@intel.com>
Add usb_endpoint_max_periodic_payload() to obtain maximum payload bytes in
a service interval for isochronous and interrupt endpoints in a USB
version independent way.
Signed-off-by: Rai, Amardeep <amardeep.rai@intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Co-developed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Hans de Goede <hansg@kernel.org>
---
drivers/usb/core/usb.c | 29 +++++++++++++++++++++++++++++
include/linux/usb.h | 3 +++
2 files changed, 32 insertions(+)
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index fca7735fc660..ca9ff6ad8e73 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -1110,6 +1110,35 @@ void usb_free_noncoherent(struct usb_device *dev, size_t size,
}
EXPORT_SYMBOL_GPL(usb_free_noncoherent);
+/**
+ * usb_endpoint_max_periodic_payload - Get maximum payload bytes per service
+ * interval
+ * @udev: The USB device
+ * @ep: The endpoint
+ *
+ * Returns: the maximum number of bytes isochronous or interrupt endpoint @ep
+ * can transfer during a service interval, or 0 for other endpoints.
+ */
+u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
+ const struct usb_host_endpoint *ep)
+{
+ if (!usb_endpoint_xfer_isoc(&ep->desc) &&
+ !usb_endpoint_xfer_int(&ep->desc))
+ return 0;
+
+ switch (udev->speed) {
+ case USB_SPEED_SUPER_PLUS:
+ if (USB_SS_SSP_ISOC_COMP(ep->ss_ep_comp.bmAttributes))
+ return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
+ fallthrough;
+ case USB_SPEED_SUPER:
+ return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
+ default:
+ return usb_endpoint_maxp(&ep->desc) * usb_endpoint_maxp_mult(&ep->desc);
+ }
+}
+EXPORT_SYMBOL_GPL(usb_endpoint_max_periodic_payload);
+
/*
* Notifications of device and interface registration
*/
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 9d662c6abb4d..e9cf2786d8bd 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -2039,6 +2039,9 @@ static inline u16 usb_maxpacket(struct usb_device *udev, int pipe)
return usb_endpoint_maxp(&ep->desc);
}
+u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
+ const struct usb_host_endpoint *ep);
+
/* translate USB error codes to codes user space understands */
static inline int usb_translate_errors(int error_code)
{
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 5/9] usb: xhci: Use usb_endpoint_max_periodic_payload()
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
` (3 preceding siblings ...)
2025-08-20 14:38 ` [PATCH v5 4/9] usb: core: Add a function to get USB version independent periodic payload Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-21 8:22 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 6/9] usb: core: Introduce usb_endpoint_is_hs_isoc_double() Sakari Ailus
` (4 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
Use the newly added usb_endpoint_max_periodic_payload() to obtain the
maximum number of bytes to transfer during a service interval for
isochronous and interrupt endpoints. This will replace the xhci-specific
xhci_get_max_esit_payload() which is removed as redundant.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/usb/host/xhci-mem.c | 32 +-------------------------------
1 file changed, 1 insertion(+), 31 deletions(-)
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 07289333a1e8..d2c04811191f 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -1378,36 +1378,6 @@ static u32 xhci_get_endpoint_type(struct usb_host_endpoint *ep)
return 0;
}
-/* Return the maximum endpoint service interval time (ESIT) payload.
- * Basically, this is the maxpacket size, multiplied by the burst size
- * and mult size.
- */
-static u32 xhci_get_max_esit_payload(struct usb_device *udev,
- struct usb_host_endpoint *ep)
-{
- int max_burst;
- int max_packet;
-
- /* Only applies for interrupt or isochronous endpoints */
- if (usb_endpoint_xfer_control(&ep->desc) ||
- usb_endpoint_xfer_bulk(&ep->desc))
- return 0;
-
- /* SuperSpeedPlus Isoc ep sending over 48k per esit */
- if ((udev->speed >= USB_SPEED_SUPER_PLUS) &&
- USB_SS_SSP_ISOC_COMP(ep->ss_ep_comp.bmAttributes))
- return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
-
- /* SuperSpeed or SuperSpeedPlus Isoc ep with less than 48k per esit */
- if (udev->speed >= USB_SPEED_SUPER)
- return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
-
- max_packet = usb_endpoint_maxp(&ep->desc);
- max_burst = usb_endpoint_maxp_mult(&ep->desc);
- /* A 0 in max burst means 1 transfer per ESIT */
- return max_packet * max_burst;
-}
-
/* Set up an endpoint with one ring segment. Do not allocate stream rings.
* Drivers will have to call usb_alloc_streams() to do that.
*/
@@ -1445,7 +1415,7 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
* have no clue on scatter gather list entry size. For Isoc and Int,
* set it to max available. See xHCI 1.1 spec 4.14.1.1 for details.
*/
- max_esit_payload = xhci_get_max_esit_payload(udev, ep);
+ max_esit_payload = usb_endpoint_max_periodic_payload(udev, ep);
interval = xhci_get_endpoint_interval(udev, ep);
/* Periodic endpoint bInterval limit quirk */
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 6/9] usb: core: Introduce usb_endpoint_is_hs_isoc_double()
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
` (4 preceding siblings ...)
2025-08-20 14:38 ` [PATCH v5 5/9] usb: xhci: Use usb_endpoint_max_periodic_payload() Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-26 12:53 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 7/9] usb: xhci: Add host support for eUSB2 double isochronous bandwidth devices Sakari Ailus
` (3 subsequent siblings)
9 siblings, 1 reply; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
Introduce usb_endpoint_is_hs_isoc_double() tell whether an endpoint
conforms to USB 2.0 Isochronous Double IN Bandwidth ECN.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/usb/core/usb.c | 19 +++++++++++++++++++
include/linux/usb.h | 3 +++
2 files changed, 22 insertions(+)
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index ca9ff6ad8e73..939dc4aafb89 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -1139,6 +1139,25 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
}
EXPORT_SYMBOL_GPL(usb_endpoint_max_periodic_payload);
+/**
+ * usb_endpoint_is_hs_isoc_double - Tell whether an endpoint uses USB 2
+ * Isochronous Double IN Bandwidth
+ * @udev: The USB device
+ * @ep: The endpoint
+ *
+ * Returns: true if an endpoint @ep conforms to USB 2 Isochronous Double IN
+ * Bandwidth ECN, false otherwise.
+ */
+bool usb_endpoint_is_hs_isoc_double(struct usb_device *udev,
+ const struct usb_host_endpoint *ep)
+{
+ return ep->eusb2_isoc_ep_comp.bDescriptorType &&
+ le16_to_cpu(udev->descriptor.bcdUSB) == 0x220 &&
+ usb_endpoint_is_isoc_in(&ep->desc) &&
+ !le16_to_cpu(ep->desc.wMaxPacketSize);
+}
+EXPORT_SYMBOL_GPL(usb_endpoint_is_hs_isoc_double);
+
/*
* Notifications of device and interface registration
*/
diff --git a/include/linux/usb.h b/include/linux/usb.h
index e9cf2786d8bd..70ef00c42d22 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -2042,6 +2042,9 @@ static inline u16 usb_maxpacket(struct usb_device *udev, int pipe)
u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
const struct usb_host_endpoint *ep);
+bool usb_endpoint_is_hs_isoc_double(struct usb_device *udev,
+ const struct usb_host_endpoint *ep);
+
/* translate USB error codes to codes user space understands */
static inline int usb_translate_errors(int error_code)
{
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 7/9] usb: xhci: Add host support for eUSB2 double isochronous bandwidth devices
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
` (5 preceding siblings ...)
2025-08-20 14:38 ` [PATCH v5 6/9] usb: core: Introduce usb_endpoint_is_hs_isoc_double() Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 8/9] usb: core: support eUSB2 double bandwidth large isoc URB frames Sakari Ailus
` (2 subsequent siblings)
9 siblings, 0 replies; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
From: "Rai, Amardeep" <amardeep.rai@intel.com>
Detect eUSB2 double isoc bw capable hosts and devices, and set the proper
xhci endpoint context values such as 'Mult', 'Max Burst Size', and 'Max
ESIT Payload' to enable the double isochronous bandwidth endpoints.
Intel xHC uses the endpoint context 'Mult' field for eUSB2 isoc
endpoints even if hosts supporting Large ESIT Payload Capability should
normally ignore the mult field.
Signed-off-by: Rai, Amardeep <amardeep.rai@intel.com>
Co-developed-by: Kannappan R <r.kannappan@intel.com>
Signed-off-by: Kannappan R <r.kannappan@intel.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Co-developed-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Co-developed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/usb/host/xhci-caps.h | 2 ++
drivers/usb/host/xhci-mem.c | 53 +++++++++++++++++++++++++++---------
drivers/usb/host/xhci-ring.c | 6 ++--
drivers/usb/host/xhci.c | 16 ++++++++++-
drivers/usb/host/xhci.h | 2 ++
5 files changed, 62 insertions(+), 17 deletions(-)
diff --git a/drivers/usb/host/xhci-caps.h b/drivers/usb/host/xhci-caps.h
index 4b8ff4815644..89bc83e4f1eb 100644
--- a/drivers/usb/host/xhci-caps.h
+++ b/drivers/usb/host/xhci-caps.h
@@ -89,3 +89,5 @@
#define HCC2_GSC(p) ((p) & (1 << 8))
/* true: HC support Virtualization Based Trusted I/O Capability */
#define HCC2_VTC(p) ((p) & (1 << 9))
+/* true: HC support Double BW on a eUSB2 HS ISOC EP */
+#define HCC2_EUSB2_DIC(p) ((p) & (1 << 11))
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index d2c04811191f..78ddcc6761ac 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -1330,18 +1330,33 @@ static unsigned int xhci_get_endpoint_interval(struct usb_device *udev,
return interval;
}
-/* The "Mult" field in the endpoint context is only set for SuperSpeed isoc eps.
+/*
+ * xHCs without LEC use the "Mult" field in the endpoint context for SuperSpeed
+ * isoc eps, and High speed isoc eps that support bandwidth doubling. Standard
* High speed endpoint descriptors can define "the number of additional
* transaction opportunities per microframe", but that goes in the Max Burst
* endpoint context field.
*/
-static u32 xhci_get_endpoint_mult(struct usb_device *udev,
- struct usb_host_endpoint *ep)
+static u32 xhci_get_endpoint_mult(struct xhci_hcd *xhci,
+ struct usb_device *udev,
+ struct usb_host_endpoint *ep)
{
- if (udev->speed < USB_SPEED_SUPER ||
- !usb_endpoint_xfer_isoc(&ep->desc))
- return 0;
- return ep->ss_ep_comp.bmAttributes;
+ bool lec;
+
+ /* xHCI 1.1 with LEC set does not use mult field, except intel eUSB2 */
+ lec = xhci->hci_version > 0x100 && HCC2_LEC(xhci->hcc_params2);
+
+ /* eUSB2 double isoc bw devices are the only USB2 devices using mult */
+ if (usb_endpoint_is_hs_isoc_double(udev, ep) &&
+ (!lec || xhci->quirks & XHCI_INTEL_HOST))
+ return 1;
+
+ /* SuperSpeed isoc transfers on hosts without LEC uses mult field */
+ if (udev->speed >= USB_SPEED_SUPER &&
+ usb_endpoint_xfer_isoc(&ep->desc) && !lec)
+ return ep->ss_ep_comp.bmAttributes;
+
+ return 0;
}
static u32 xhci_get_endpoint_max_burst(struct usb_device *udev,
@@ -1353,8 +1368,16 @@ static u32 xhci_get_endpoint_max_burst(struct usb_device *udev,
if (udev->speed == USB_SPEED_HIGH &&
(usb_endpoint_xfer_isoc(&ep->desc) ||
- usb_endpoint_xfer_int(&ep->desc)))
+ usb_endpoint_xfer_int(&ep->desc))) {
+ /*
+ * USB 2 Isochronous Double IN Bandwidth ECN uses fixed burst
+ * size and max packets bits 12:11 are invalid.
+ */
+ if (usb_endpoint_is_hs_isoc_double(udev, ep))
+ return 2;
+
return usb_endpoint_maxp_mult(&ep->desc) - 1;
+ }
return 0;
}
@@ -1409,6 +1432,13 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
ring_type = usb_endpoint_type(&ep->desc);
+ /* Ensure host supports double isoc bandwidth for eUSB2 devices */
+ if (usb_endpoint_is_hs_isoc_double(udev, ep) &&
+ !HCC2_EUSB2_DIC(xhci->hcc_params2)) {
+ dev_dbg(&udev->dev, "Double Isoc Bandwidth not supported by xhci\n");
+ return -EINVAL;
+ }
+
/*
* Get values to fill the endpoint context, mostly from ep descriptor.
* The average TRB buffer lengt for bulk endpoints is unclear as we
@@ -1432,8 +1462,8 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
}
}
- mult = xhci_get_endpoint_mult(udev, ep);
- max_packet = usb_endpoint_maxp(&ep->desc);
+ mult = xhci_get_endpoint_mult(xhci, udev, ep);
+ max_packet = xhci_usb_endpoint_maxp(udev, ep);
max_burst = xhci_get_endpoint_max_burst(udev, ep);
avg_trb_len = max_esit_payload;
@@ -1454,9 +1484,6 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
/* xHCI 1.0 and 1.1 indicates that ctrl ep avg TRB Length should be 8 */
if (usb_endpoint_xfer_control(&ep->desc) && xhci->hci_version >= 0x100)
avg_trb_len = 8;
- /* xhci 1.1 with LEC support doesn't use mult field, use RsvdZ */
- if ((xhci->hci_version > 0x100) && HCC2_LEC(xhci->hcc_params2))
- mult = 0;
/* Set up the endpoint ring */
virt_dev->eps[ep_index].new_ring =
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index ecd757d482c5..ed2fa2c15535 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -3545,7 +3545,7 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred,
if ((xhci->quirks & XHCI_MTK_HOST) && (xhci->hci_version < 0x100))
trb_buff_len = 0;
- maxp = usb_endpoint_maxp(&urb->ep->desc);
+ maxp = xhci_usb_endpoint_maxp(urb->dev, urb->ep);
total_packet_count = DIV_ROUND_UP(td_total_len, maxp);
/* Queueing functions don't count the current TRB into transferred */
@@ -3562,7 +3562,7 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len,
u32 new_buff_len;
size_t len;
- max_pkt = usb_endpoint_maxp(&urb->ep->desc);
+ max_pkt = xhci_usb_endpoint_maxp(urb->dev, urb->ep);
unalign = (enqd_len + *trb_buff_len) % max_pkt;
/* we got lucky, last normal TRB data on segment is packet aligned */
@@ -4133,7 +4133,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
addr = start_addr + urb->iso_frame_desc[i].offset;
td_len = urb->iso_frame_desc[i].length;
td_remain_len = td_len;
- max_pkt = usb_endpoint_maxp(&urb->ep->desc);
+ max_pkt = xhci_usb_endpoint_maxp(urb->dev, urb->ep);
total_pkt_count = DIV_ROUND_UP(td_len, max_pkt);
/* A zero-length transfer still involves at least one packet. */
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 47151ca527bf..e193d4dc414c 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -1334,7 +1334,7 @@ static bool xhci_urb_temp_buffer_required(struct usb_hcd *hcd,
struct scatterlist *tail_sg;
tail_sg = urb->sg;
- max_pkt = usb_endpoint_maxp(&urb->ep->desc);
+ max_pkt = xhci_usb_endpoint_maxp(urb->dev, urb->ep);
if (!urb->num_sgs)
return ret;
@@ -2922,6 +2922,20 @@ int xhci_stop_endpoint_sync(struct xhci_hcd *xhci, struct xhci_virt_ep *ep, int
}
EXPORT_SYMBOL_GPL(xhci_stop_endpoint_sync);
+/*
+ * xhci_usb_endpoint_maxp - get endpoint max packet size
+ * @host_ep: USB host endpoint to be checked
+ *
+ * Returns max packet from the correct descriptor
+ */
+int xhci_usb_endpoint_maxp(struct usb_device *udev,
+ struct usb_host_endpoint *host_ep)
+{
+ if (usb_endpoint_is_hs_isoc_double(udev, host_ep))
+ return le16_to_cpu(host_ep->eusb2_isoc_ep_comp.wMaxPacketSize);
+ return usb_endpoint_maxp(&host_ep->desc);
+}
+
/* Issue a configure endpoint command or evaluate context command
* and wait for it to finish.
*/
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index a20f4e7cd43a..2721f700c022 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1957,6 +1957,8 @@ void xhci_update_erst_dequeue(struct xhci_hcd *xhci,
struct xhci_interrupter *ir,
bool clear_ehb);
void xhci_add_interrupter(struct xhci_hcd *xhci, unsigned int intr_num);
+int xhci_usb_endpoint_maxp(struct usb_device *udev,
+ struct usb_host_endpoint *host_ep);
/* xHCI roothub code */
void xhci_set_link_state(struct xhci_hcd *xhci, struct xhci_port *port,
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 8/9] usb: core: support eUSB2 double bandwidth large isoc URB frames
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
` (6 preceding siblings ...)
2025-08-20 14:38 ` [PATCH v5 7/9] usb: xhci: Add host support for eUSB2 double isochronous bandwidth devices Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 9/9] media: uvcvideo: eUSB2 double isochronous bandwidth support Sakari Ailus
2025-08-26 13:28 ` [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Mathias Nyman
9 siblings, 0 replies; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
From: "Rai, Amardeep" <amardeep.rai@intel.com>
eUSB2 double isochronous in bandwidth devices support up to 6 transactions
per microframe, and thus doubles the total bytes possible to receive per
microframe.
Support larger URB isoc frame sizes for eUSB2 double isoc in endpoints.
Also usb_endpoint_maxp() returns a natural number so there's no need to
assume it could be < 0.
Signed-off-by: Rai, Amardeep <amardeep.rai@intel.com>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Co-developed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
---
drivers/usb/core/urb.c | 14 ++++++++++----
drivers/usb/core/usb.c | 2 ++
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index 7a76d5a62db1..ff8df16cca35 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -372,6 +372,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
struct usb_host_endpoint *ep;
int is_out;
unsigned int allowed;
+ bool is_eusb2_isoch_double;
if (!urb || !urb->complete)
return -EINVAL;
@@ -434,7 +435,8 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
return -ENODEV;
max = usb_endpoint_maxp(&ep->desc);
- if (max <= 0) {
+ is_eusb2_isoch_double = usb_endpoint_is_hs_isoc_double(dev, ep);
+ if (!max && !is_eusb2_isoch_double) {
dev_dbg(&dev->dev,
"bogus endpoint ep%d%s in %s (bad maxpacket %d)\n",
usb_endpoint_num(&ep->desc), is_out ? "out" : "in",
@@ -467,9 +469,13 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
max = le32_to_cpu(isoc_ep_comp->dwBytesPerInterval);
}
- /* "high bandwidth" mode, 1-3 packets/uframe? */
- if (dev->speed == USB_SPEED_HIGH)
- max *= usb_endpoint_maxp_mult(&ep->desc);
+ /* High speed, 1-3 packets/uframe, max 6 for eUSB2 double bw */
+ if (dev->speed == USB_SPEED_HIGH) {
+ if (is_eusb2_isoch_double)
+ max = le32_to_cpu(ep->eusb2_isoc_ep_comp.dwBytesPerInterval);
+ else
+ max *= usb_endpoint_maxp_mult(&ep->desc);
+ }
if (urb->number_of_packets <= 0)
return -EINVAL;
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 939dc4aafb89..b88b6271cb30 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -1134,6 +1134,8 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
case USB_SPEED_SUPER:
return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
default:
+ if (usb_endpoint_is_hs_isoc_double(udev, ep))
+ return le32_to_cpu(ep->eusb2_isoc_ep_comp.dwBytesPerInterval);
return usb_endpoint_maxp(&ep->desc) * usb_endpoint_maxp_mult(&ep->desc);
}
}
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v5 9/9] media: uvcvideo: eUSB2 double isochronous bandwidth support
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
` (7 preceding siblings ...)
2025-08-20 14:38 ` [PATCH v5 8/9] usb: core: support eUSB2 double bandwidth large isoc URB frames Sakari Ailus
@ 2025-08-20 14:38 ` Sakari Ailus
2025-08-20 15:21 ` Ricardo Ribalda
2025-08-26 13:28 ` [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Mathias Nyman
9 siblings, 1 reply; 18+ messages in thread
From: Sakari Ailus @ 2025-08-20 14:38 UTC (permalink / raw)
To: linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Mathias Nyman, Alan Stern,
Michał Pecio
From: Tao Q Tao <tao.q.tao@intel.com>
Use usb_endpoint_max_esit_payload() from the USB framework to find the
maximum bytes per interval for the endpoint. Consequently this adds eUSB2
isochronous mode and SuperSpeedPlus Isochronous Endpoint Companion support
where larger payloads within a service interval are possible.
Co-developed-by: Amardeep Rai <amardeep.rai@intel.com>
Signed-off-by: Amardeep Rai <amardeep.rai@intel.com>
Signed-off-by: Tao Q Tao <tao.q.tao@intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Co-developed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
drivers/media/usb/uvc/uvc_driver.c | 4 ++--
drivers/media/usb/uvc/uvc_video.c | 24 +++---------------------
drivers/media/usb/uvc/uvcvideo.h | 4 +---
3 files changed, 6 insertions(+), 26 deletions(-)
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index 775bede0d93d..d06ca79ae2d9 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -539,7 +539,7 @@ static int uvc_parse_streaming(struct uvc_device *dev,
unsigned int nformats = 0, nframes = 0, nintervals = 0;
unsigned int size, i, n, p;
u32 *interval;
- u16 psize;
+ u32 psize;
int ret = -EINVAL;
if (intf->cur_altsetting->desc.bInterfaceSubClass
@@ -775,7 +775,7 @@ static int uvc_parse_streaming(struct uvc_device *dev,
streaming->header.bEndpointAddress);
if (ep == NULL)
continue;
- psize = uvc_endpoint_max_bpi(dev->udev, ep);
+ psize = usb_endpoint_max_periodic_payload(dev->udev, ep);
if (psize > streaming->maxpsize)
streaming->maxpsize = psize;
}
diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
index a5013a7fbca4..1a0cc937de9b 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -1869,24 +1869,6 @@ static void uvc_video_stop_transfer(struct uvc_streaming *stream,
uvc_free_urb_buffers(stream);
}
-/*
- * Compute the maximum number of bytes per interval for an endpoint.
- */
-u16 uvc_endpoint_max_bpi(struct usb_device *dev, struct usb_host_endpoint *ep)
-{
- u16 psize;
-
- switch (dev->speed) {
- case USB_SPEED_SUPER:
- case USB_SPEED_SUPER_PLUS:
- return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
- default:
- psize = usb_endpoint_maxp(&ep->desc);
- psize *= usb_endpoint_maxp_mult(&ep->desc);
- return psize;
- }
-}
-
/*
* Initialize isochronous URBs and allocate transfer buffers. The packet size
* is given by the endpoint.
@@ -1897,10 +1879,10 @@ static int uvc_init_video_isoc(struct uvc_streaming *stream,
struct urb *urb;
struct uvc_urb *uvc_urb;
unsigned int npackets, i;
- u16 psize;
+ u32 psize;
u32 size;
- psize = uvc_endpoint_max_bpi(stream->dev->udev, ep);
+ psize = usb_endpoint_max_periodic_payload(stream->dev->udev, ep);
size = stream->ctrl.dwMaxVideoFrameSize;
npackets = uvc_alloc_urb_buffers(stream, size, psize, gfp_flags);
@@ -2043,7 +2025,7 @@ static int uvc_video_start_transfer(struct uvc_streaming *stream,
continue;
/* Check if the bandwidth is high enough. */
- psize = uvc_endpoint_max_bpi(stream->dev->udev, ep);
+ psize = usb_endpoint_max_periodic_payload(stream->dev->udev, ep);
if (psize >= bandwidth && psize < best_psize) {
altsetting = alts->desc.bAlternateSetting;
best_psize = psize;
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
index 757254fc4fe9..ac19ca721f29 100644
--- a/drivers/media/usb/uvc/uvcvideo.h
+++ b/drivers/media/usb/uvc/uvcvideo.h
@@ -456,7 +456,7 @@ struct uvc_streaming {
struct usb_interface *intf;
int intfnum;
- u16 maxpsize;
+ u32 maxpsize;
struct uvc_streaming_header header;
enum v4l2_buf_type type;
@@ -798,8 +798,6 @@ void uvc_ctrl_cleanup_fh(struct uvc_fh *handle);
/* Utility functions */
struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts,
u8 epaddr);
-u16 uvc_endpoint_max_bpi(struct usb_device *dev, struct usb_host_endpoint *ep);
-
/* Quirks support */
void uvc_video_decode_isight(struct uvc_urb *uvc_urb,
struct uvc_buffer *buf,
--
2.47.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v5 9/9] media: uvcvideo: eUSB2 double isochronous bandwidth support
2025-08-20 14:38 ` [PATCH v5 9/9] media: uvcvideo: eUSB2 double isochronous bandwidth support Sakari Ailus
@ 2025-08-20 15:21 ` Ricardo Ribalda
2025-08-21 9:51 ` Sakari Ailus
0 siblings, 1 reply; 18+ messages in thread
From: Ricardo Ribalda @ 2025-08-20 15:21 UTC (permalink / raw)
To: Sakari Ailus
Cc: linux-usb, linux-media, gregkh, laurent.pinchart, hdegoede,
Thinh.Nguyen, Amardeep Rai, Kannappan R, Mathias Nyman,
Alan Stern, Michał Pecio
Hi Sakari
I believe you have missed my previous email.
https://lore.kernel.org/linux-media/CANiDSCsocBBQRPRFAbAovkzauThgN8Qd1u8kjJ_af-83Nd4wvw@mail.gmail.com/
re-posting here
On Wed, 20 Aug 2025 at 16:39, Sakari Ailus <sakari.ailus@linux.intel.com> wrote:
>
> From: Tao Q Tao <tao.q.tao@intel.com>
>
> Use usb_endpoint_max_esit_payload() from the USB framework to find the
> maximum bytes per interval for the endpoint. Consequently this adds eUSB2
> isochronous mode and SuperSpeedPlus Isochronous Endpoint Companion support
> where larger payloads within a service interval are possible.
>
>
Reviewed-by: Ricardo Ribalda <ribalda@chromium.org>
Co-developed-by: Amardeep Rai <amardeep.rai@intel.com>
> Signed-off-by: Amardeep Rai <amardeep.rai@intel.com>
> Signed-off-by: Tao Q Tao <tao.q.tao@intel.com>
> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
> Co-developed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
nit: I believe the last tag should be: Signed-off-by:
> ---
> drivers/media/usb/uvc/uvc_driver.c | 4 ++--
> drivers/media/usb/uvc/uvc_video.c | 24 +++---------------------
> drivers/media/usb/uvc/uvcvideo.h | 4 +---
> 3 files changed, 6 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> index 775bede0d93d..d06ca79ae2d9 100644
> --- a/drivers/media/usb/uvc/uvc_driver.c
> +++ b/drivers/media/usb/uvc/uvc_driver.c
> @@ -539,7 +539,7 @@ static int uvc_parse_streaming(struct uvc_device *dev,
> unsigned int nformats = 0, nframes = 0, nintervals = 0;
> unsigned int size, i, n, p;
> u32 *interval;
> - u16 psize;
> + u32 psize;
> int ret = -EINVAL;
>
> if (intf->cur_altsetting->desc.bInterfaceSubClass
> @@ -775,7 +775,7 @@ static int uvc_parse_streaming(struct uvc_device *dev,
> streaming->header.bEndpointAddress);
> if (ep == NULL)
> continue;
> - psize = uvc_endpoint_max_bpi(dev->udev, ep);
> + psize = usb_endpoint_max_periodic_payload(dev->udev, ep);
> if (psize > streaming->maxpsize)
> streaming->maxpsize = psize;
> }
> diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
> index a5013a7fbca4..1a0cc937de9b 100644
> --- a/drivers/media/usb/uvc/uvc_video.c
> +++ b/drivers/media/usb/uvc/uvc_video.c
> @@ -1869,24 +1869,6 @@ static void uvc_video_stop_transfer(struct uvc_streaming *stream,
> uvc_free_urb_buffers(stream);
> }
>
> -/*
> - * Compute the maximum number of bytes per interval for an endpoint.
> - */
> -u16 uvc_endpoint_max_bpi(struct usb_device *dev, struct usb_host_endpoint *ep)
> -{
> - u16 psize;
> -
> - switch (dev->speed) {
> - case USB_SPEED_SUPER:
> - case USB_SPEED_SUPER_PLUS:
> - return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
> - default:
> - psize = usb_endpoint_maxp(&ep->desc);
> - psize *= usb_endpoint_maxp_mult(&ep->desc);
> - return psize;
> - }
> -}
> -
> /*
> * Initialize isochronous URBs and allocate transfer buffers. The packet size
> * is given by the endpoint.
> @@ -1897,10 +1879,10 @@ static int uvc_init_video_isoc(struct uvc_streaming *stream,
> struct urb *urb;
> struct uvc_urb *uvc_urb;
> unsigned int npackets, i;
> - u16 psize;
> + u32 psize;
> u32 size;
>
> - psize = uvc_endpoint_max_bpi(stream->dev->udev, ep);
> + psize = usb_endpoint_max_periodic_payload(stream->dev->udev, ep);
> size = stream->ctrl.dwMaxVideoFrameSize;
>
> npackets = uvc_alloc_urb_buffers(stream, size, psize, gfp_flags);
> @@ -2043,7 +2025,7 @@ static int uvc_video_start_transfer(struct uvc_streaming *stream,
> continue;
>
> /* Check if the bandwidth is high enough. */
> - psize = uvc_endpoint_max_bpi(stream->dev->udev, ep);
> + psize = usb_endpoint_max_periodic_payload(stream->dev->udev, ep);
> if (psize >= bandwidth && psize < best_psize) {
> altsetting = alts->desc.bAlternateSetting;
> best_psize = psize;
> diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
> index 757254fc4fe9..ac19ca721f29 100644
> --- a/drivers/media/usb/uvc/uvcvideo.h
> +++ b/drivers/media/usb/uvc/uvcvideo.h
> @@ -456,7 +456,7 @@ struct uvc_streaming {
>
> struct usb_interface *intf;
> int intfnum;
> - u16 maxpsize;
> + u32 maxpsize;
>
> struct uvc_streaming_header header;
> enum v4l2_buf_type type;
> @@ -798,8 +798,6 @@ void uvc_ctrl_cleanup_fh(struct uvc_fh *handle);
> /* Utility functions */
> struct usb_host_endpoint *uvc_find_endpoint(struct usb_host_interface *alts,
> u8 epaddr);
> -u16 uvc_endpoint_max_bpi(struct usb_device *dev, struct usb_host_endpoint *ep);
> -
> /* Quirks support */
> void uvc_video_decode_isight(struct uvc_urb *uvc_urb,
> struct uvc_buffer *buf,
> --
> 2.47.2
>
>
--
Ricardo Ribalda
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v5 5/9] usb: xhci: Use usb_endpoint_max_periodic_payload()
2025-08-20 14:38 ` [PATCH v5 5/9] usb: xhci: Use usb_endpoint_max_periodic_payload() Sakari Ailus
@ 2025-08-21 8:22 ` Mathias Nyman
0 siblings, 0 replies; 18+ messages in thread
From: Mathias Nyman @ 2025-08-21 8:22 UTC (permalink / raw)
To: Sakari Ailus, linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Alan Stern, Michał Pecio
On 20.8.2025 17.38, Sakari Ailus wrote:
> Use the newly added usb_endpoint_max_periodic_payload() to obtain the
> maximum number of bytes to transfer during a service interval for
> isochronous and interrupt endpoints. This will replace the xhci-specific
> xhci_get_max_esit_payload() which is removed as redundant.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: Mathias Nyman <mathias.nyman@linux.intel.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v5 9/9] media: uvcvideo: eUSB2 double isochronous bandwidth support
2025-08-20 15:21 ` Ricardo Ribalda
@ 2025-08-21 9:51 ` Sakari Ailus
0 siblings, 0 replies; 18+ messages in thread
From: Sakari Ailus @ 2025-08-21 9:51 UTC (permalink / raw)
To: Ricardo Ribalda
Cc: linux-usb, linux-media, gregkh, laurent.pinchart, hdegoede,
Thinh.Nguyen, Amardeep Rai, Kannappan R, Mathias Nyman,
Alan Stern, Michał Pecio
Hi Ricardo,
On Wed, Aug 20, 2025 at 05:21:50PM +0200, Ricardo Ribalda wrote:
> Hi Sakari
>
> I believe you have missed my previous email.
>
> https://lore.kernel.org/linux-media/CANiDSCsocBBQRPRFAbAovkzauThgN8Qd1u8kjJ_af-83Nd4wvw@mail.gmail.com/
>
> re-posting here
>
> On Wed, 20 Aug 2025 at 16:39, Sakari Ailus <sakari.ailus@linux.intel.com> wrote:
> >
> > From: Tao Q Tao <tao.q.tao@intel.com>
> >
> > Use usb_endpoint_max_esit_payload() from the USB framework to find the
> > maximum bytes per interval for the endpoint. Consequently this adds eUSB2
> > isochronous mode and SuperSpeedPlus Isochronous Endpoint Companion support
> > where larger payloads within a service interval are possible.
> >
> >
>
> Reviewed-by: Ricardo Ribalda <ribalda@chromium.org>
Thank you.
>
> Co-developed-by: Amardeep Rai <amardeep.rai@intel.com>
> > Signed-off-by: Amardeep Rai <amardeep.rai@intel.com>
> > Signed-off-by: Tao Q Tao <tao.q.tao@intel.com>
> > Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
> > Co-developed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
> nit: I believe the last tag should be: Signed-off-by:
Laurent has reviewed the patch, please see
<20250807131555.GB13647@pendragon.ideasonboard.com>.
--
Regards,
Sakari Ailus
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v5 1/9] usb: core: Use le16_to_cpu() to read __le16 value in usb_parse_endpoint()
2025-08-20 14:38 ` [PATCH v5 1/9] usb: core: Use le16_to_cpu() to read __le16 value in usb_parse_endpoint() Sakari Ailus
@ 2025-08-26 12:50 ` Mathias Nyman
0 siblings, 0 replies; 18+ messages in thread
From: Mathias Nyman @ 2025-08-26 12:50 UTC (permalink / raw)
To: Sakari Ailus, linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Alan Stern, Michał Pecio
On 20.8.2025 17.38, Sakari Ailus wrote:
> wMaxPacketSize field in struct usb_endpoint_descriptor is an __le16, use
> le16_to_cpu() to read it.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
> drivers/usb/core/config.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
> index 42468bbeffd2..cda595b4014f 100644
> --- a/drivers/usb/core/config.c
> +++ b/drivers/usb/core/config.c
> @@ -507,7 +507,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,
> }
>
> /* Parse a possible eUSB2 periodic endpoint companion descriptor */
> - if (bcdUSB == 0x0220 && d->wMaxPacketSize == 0 &&
> + if (bcdUSB == 0x0220 && !le16_to_cpu(d->wMaxPacketSize) &&
> (usb_endpoint_xfer_isoc(d) || usb_endpoint_xfer_int(d)))
> usb_parse_eusb2_isoc_endpoint_companion(ddev, cfgno, inum, asnum,
> endpoint, buffer, size);
Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v5 2/9] usb: core: Parse eUSB2 companion descriptors for high speed devices only
2025-08-20 14:38 ` [PATCH v5 2/9] usb: core: Parse eUSB2 companion descriptors for high speed devices only Sakari Ailus
@ 2025-08-26 12:50 ` Mathias Nyman
0 siblings, 0 replies; 18+ messages in thread
From: Mathias Nyman @ 2025-08-26 12:50 UTC (permalink / raw)
To: Sakari Ailus, linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Alan Stern, Michał Pecio
On 20.8.2025 17.38, Sakari Ailus wrote:
> Check that a device is a high-speed one before proceeding to parse the
> eUSB2 isochronous endpoint companion descriptors.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
> drivers/usb/core/config.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
> index cda595b4014f..29fcbd6de482 100644
> --- a/drivers/usb/core/config.c
> +++ b/drivers/usb/core/config.c
> @@ -507,7 +507,8 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,
> }
>
> /* Parse a possible eUSB2 periodic endpoint companion descriptor */
> - if (bcdUSB == 0x0220 && !le16_to_cpu(d->wMaxPacketSize) &&
> + if (udev->speed == USB_SPEED_HIGH && bcdUSB == 0x0220 &&
> + !le16_to_cpu(d->wMaxPacketSize) &&
> (usb_endpoint_xfer_isoc(d) || usb_endpoint_xfer_int(d)))
> usb_parse_eusb2_isoc_endpoint_companion(ddev, cfgno, inum, asnum,
> endpoint, buffer, size);
Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v5 3/9] usb: core: eUSB2 companion descriptor is for isoc IN endpoints only
2025-08-20 14:38 ` [PATCH v5 3/9] usb: core: eUSB2 companion descriptor is for isoc IN endpoints only Sakari Ailus
@ 2025-08-26 12:52 ` Mathias Nyman
0 siblings, 0 replies; 18+ messages in thread
From: Mathias Nyman @ 2025-08-26 12:52 UTC (permalink / raw)
To: Sakari Ailus, linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Alan Stern, Michał Pecio
On 20.8.2025 17.38, Sakari Ailus wrote:
> The eUSB2 isochronous double bandwidth endpoint descriptor is allowed for
> the isochronous IN endpoints, according to the ECN. Do not parse these
> descriptors if they are found in interrupt or OUT endpoints.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
> drivers/usb/core/config.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
> index 29fcbd6de482..baf5bc844b6f 100644
> --- a/drivers/usb/core/config.c
> +++ b/drivers/usb/core/config.c
> @@ -508,8 +508,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,
>
> /* Parse a possible eUSB2 periodic endpoint companion descriptor */
> if (udev->speed == USB_SPEED_HIGH && bcdUSB == 0x0220 &&
> - !le16_to_cpu(d->wMaxPacketSize) &&
> - (usb_endpoint_xfer_isoc(d) || usb_endpoint_xfer_int(d)))
> + !le16_to_cpu(d->wMaxPacketSize) && usb_endpoint_is_isoc_in(d))
> usb_parse_eusb2_isoc_endpoint_companion(ddev, cfgno, inum, asnum,
> endpoint, buffer, size);
>
Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v5 6/9] usb: core: Introduce usb_endpoint_is_hs_isoc_double()
2025-08-20 14:38 ` [PATCH v5 6/9] usb: core: Introduce usb_endpoint_is_hs_isoc_double() Sakari Ailus
@ 2025-08-26 12:53 ` Mathias Nyman
0 siblings, 0 replies; 18+ messages in thread
From: Mathias Nyman @ 2025-08-26 12:53 UTC (permalink / raw)
To: Sakari Ailus, linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Alan Stern, Michał Pecio
On 20.8.2025 17.38, Sakari Ailus wrote:
> Introduce usb_endpoint_is_hs_isoc_double() tell whether an endpoint
> conforms to USB 2.0 Isochronous Double IN Bandwidth ECN.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
> drivers/usb/core/usb.c | 19 +++++++++++++++++++
> include/linux/usb.h | 3 +++
> 2 files changed, 22 insertions(+)
>
> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
> index ca9ff6ad8e73..939dc4aafb89 100644
> --- a/drivers/usb/core/usb.c
> +++ b/drivers/usb/core/usb.c
> @@ -1139,6 +1139,25 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> }
> EXPORT_SYMBOL_GPL(usb_endpoint_max_periodic_payload);
>
> +/**
> + * usb_endpoint_is_hs_isoc_double - Tell whether an endpoint uses USB 2
> + * Isochronous Double IN Bandwidth
> + * @udev: The USB device
> + * @ep: The endpoint
> + *
> + * Returns: true if an endpoint @ep conforms to USB 2 Isochronous Double IN
> + * Bandwidth ECN, false otherwise.
> + */
> +bool usb_endpoint_is_hs_isoc_double(struct usb_device *udev,
> + const struct usb_host_endpoint *ep)
> +{
> + return ep->eusb2_isoc_ep_comp.bDescriptorType &&
> + le16_to_cpu(udev->descriptor.bcdUSB) == 0x220 &&
> + usb_endpoint_is_isoc_in(&ep->desc) &&
> + !le16_to_cpu(ep->desc.wMaxPacketSize);
> +}
> +EXPORT_SYMBOL_GPL(usb_endpoint_is_hs_isoc_double);
> +
> /*
> * Notifications of device and interface registration
> */
> diff --git a/include/linux/usb.h b/include/linux/usb.h
> index e9cf2786d8bd..70ef00c42d22 100644
> --- a/include/linux/usb.h
> +++ b/include/linux/usb.h
> @@ -2042,6 +2042,9 @@ static inline u16 usb_maxpacket(struct usb_device *udev, int pipe)
> u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> const struct usb_host_endpoint *ep);
>
> +bool usb_endpoint_is_hs_isoc_double(struct usb_device *udev,
> + const struct usb_host_endpoint *ep);
> +
> /* translate USB error codes to codes user space understands */
> static inline int usb_translate_errors(int error_code)
> {
Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
` (8 preceding siblings ...)
2025-08-20 14:38 ` [PATCH v5 9/9] media: uvcvideo: eUSB2 double isochronous bandwidth support Sakari Ailus
@ 2025-08-26 13:28 ` Mathias Nyman
9 siblings, 0 replies; 18+ messages in thread
From: Mathias Nyman @ 2025-08-26 13:28 UTC (permalink / raw)
To: Sakari Ailus, linux-usb
Cc: linux-media, gregkh, laurent.pinchart, hdegoede, Thinh.Nguyen,
Amardeep Rai, Kannappan R, Alan Stern, Michał Pecio
On 20.8.2025 17.38, Sakari Ailus wrote:
> Hi all,
>
> This series enables support for eUSB2 Double Isochronous IN Bandwidth UVC
> devices specified in 'USB 2.0 Double Isochronous IN Bandwidth' ECN. In
> short, it adds support for new integrated USB2 webcams that can send twice
> the data compared to conventional USB2 webcams.
>
> These devices are identified by the device descriptor bcdUSB 0x0220 value.
> They have an additional eUSB2 Isochronous Endpoint Companion Descriptor,
> and a zero max packet size in regular isoc endpoint descriptor. Support
> for parsing that new descriptor was added in commit
>
> c749f058b437 ("USB: core: Add eUSB2 descriptor and parsing in USB core")
>
> This series adds support to UVC, USB core, and xHCI to identify eUSB2
> double isoc devices, and allow and set proper max packet, iso frame desc
> sizes, bytes per interval, and other values in URBs and xHCI endpoint
> contexts needed to support the double data rates for eUSB2 double isoc
> devices.
>
Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
The v5 of this series looks good to me, and could from my perspective be
picked directly to usb-next
Thanks
Mathias
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2025-08-26 13:28 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-20 14:38 [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 1/9] usb: core: Use le16_to_cpu() to read __le16 value in usb_parse_endpoint() Sakari Ailus
2025-08-26 12:50 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 2/9] usb: core: Parse eUSB2 companion descriptors for high speed devices only Sakari Ailus
2025-08-26 12:50 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 3/9] usb: core: eUSB2 companion descriptor is for isoc IN endpoints only Sakari Ailus
2025-08-26 12:52 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 4/9] usb: core: Add a function to get USB version independent periodic payload Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 5/9] usb: xhci: Use usb_endpoint_max_periodic_payload() Sakari Ailus
2025-08-21 8:22 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 6/9] usb: core: Introduce usb_endpoint_is_hs_isoc_double() Sakari Ailus
2025-08-26 12:53 ` Mathias Nyman
2025-08-20 14:38 ` [PATCH v5 7/9] usb: xhci: Add host support for eUSB2 double isochronous bandwidth devices Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 8/9] usb: core: support eUSB2 double bandwidth large isoc URB frames Sakari Ailus
2025-08-20 14:38 ` [PATCH v5 9/9] media: uvcvideo: eUSB2 double isochronous bandwidth support Sakari Ailus
2025-08-20 15:21 ` Ricardo Ribalda
2025-08-21 9:51 ` Sakari Ailus
2025-08-26 13:28 ` [PATCH v5 0/9] eUSB2 Double Isochronous IN Bandwidth support Mathias Nyman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).