* [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
@ 2026-04-02 2:14 Tao Xue
2026-04-02 2:45 ` Alan Stern
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Tao Xue @ 2026-04-02 2:14 UTC (permalink / raw)
To: gregkh; +Cc: linux-usb, linux-kernel, caiyadong, Tao Xue, stable
As specified in Section 4.14.2 of the xHCI Specification, the xHC
reserves bandwidth for periodic endpoints according to bInterval and
wBytesPerInterval (Max ESIT Payload).
Some peripherals report an invalid wBytesPerInterval in their device
descriptor, which is either 0 or smaller than the actual data length
transmitted. This issue is observed on ASIX AX88179 series USB 3.0
Ethernet adapters.
These errors may lead to unexpected behavior on certain USB host
controllers, causing USB peripherals to malfunction.
To address the issue, return max(wBytesPerInterval, max_payload) when
calculating bandwidth reservation.
Fixes: 9238f25d5d32 ("USB: xhci: properly set endpoint context fields for periodic eps.")
Cc: <stable@kernel.org>
Signed-off-by: Tao Xue <xuetao09@huawei.com>
---
drivers/usb/core/usb.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index e9a10a33534c..8f2e05a5a015 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -1125,6 +1125,8 @@ EXPORT_SYMBOL_GPL(usb_free_noncoherent);
u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
const struct usb_host_endpoint *ep)
{
+ u32 max_payload;
+
if (!usb_endpoint_xfer_isoc(&ep->desc) &&
!usb_endpoint_xfer_int(&ep->desc))
return 0;
@@ -1135,7 +1137,12 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
fallthrough;
case USB_SPEED_SUPER:
- return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
+ max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst + 1);
+ if (usb_endpoint_xfer_isoc(&ep->desc))
+ return max_t(u32, max_payload * USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
+ ep->ss_ep_comp.wBytesPerInterval);
+ else
+ return max_t(u32, max_payload, 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);
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 2:14 [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval Tao Xue
@ 2026-04-02 2:45 ` Alan Stern
2026-04-02 3:51 ` Greg KH
2026-04-02 9:44 ` Michal Pecio
2 siblings, 0 replies; 14+ messages in thread
From: Alan Stern @ 2026-04-02 2:45 UTC (permalink / raw)
To: Tao Xue; +Cc: gregkh, linux-usb, linux-kernel, caiyadong, stable
On Thu, Apr 02, 2026 at 10:14:00AM +0800, Tao Xue wrote:
> As specified in Section 4.14.2 of the xHCI Specification, the xHC
> reserves bandwidth for periodic endpoints according to bInterval and
> wBytesPerInterval (Max ESIT Payload).
>
> Some peripherals report an invalid wBytesPerInterval in their device
> descriptor, which is either 0 or smaller than the actual data length
> transmitted. This issue is observed on ASIX AX88179 series USB 3.0
> Ethernet adapters.
Do we log these invalid values when we parse the endpoint and their
companion descriptors? We should -- and we can fix up any errors then,
just once.
Alan Stern
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 2:14 [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval Tao Xue
2026-04-02 2:45 ` Alan Stern
@ 2026-04-02 3:51 ` Greg KH
2026-04-02 6:59 ` Xuetao (kirin)
2026-04-02 9:44 ` Michal Pecio
2 siblings, 1 reply; 14+ messages in thread
From: Greg KH @ 2026-04-02 3:51 UTC (permalink / raw)
To: Tao Xue; +Cc: linux-usb, linux-kernel, caiyadong, stable
On Thu, Apr 02, 2026 at 10:14:00AM +0800, Tao Xue wrote:
> As specified in Section 4.14.2 of the xHCI Specification, the xHC
> reserves bandwidth for periodic endpoints according to bInterval and
> wBytesPerInterval (Max ESIT Payload).
>
> Some peripherals report an invalid wBytesPerInterval in their device
> descriptor, which is either 0 or smaller than the actual data length
> transmitted. This issue is observed on ASIX AX88179 series USB 3.0
> Ethernet adapters.
>
> These errors may lead to unexpected behavior on certain USB host
> controllers, causing USB peripherals to malfunction.
>
> To address the issue, return max(wBytesPerInterval, max_payload) when
> calculating bandwidth reservation.
>
> Fixes: 9238f25d5d32 ("USB: xhci: properly set endpoint context fields for periodic eps.")
> Cc: <stable@kernel.org>
> Signed-off-by: Tao Xue <xuetao09@huawei.com>
> ---
> drivers/usb/core/usb.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
> index e9a10a33534c..8f2e05a5a015 100644
> --- a/drivers/usb/core/usb.c
> +++ b/drivers/usb/core/usb.c
> @@ -1125,6 +1125,8 @@ EXPORT_SYMBOL_GPL(usb_free_noncoherent);
> u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> const struct usb_host_endpoint *ep)
> {
> + u32 max_payload;
> +
> if (!usb_endpoint_xfer_isoc(&ep->desc) &&
> !usb_endpoint_xfer_int(&ep->desc))
> return 0;
> @@ -1135,7 +1137,12 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
> fallthrough;
> case USB_SPEED_SUPER:
> - return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
> + max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst + 1);
> + if (usb_endpoint_xfer_isoc(&ep->desc))
> + return max_t(u32, max_payload * USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
> + ep->ss_ep_comp.wBytesPerInterval);
> + else
> + return max_t(u32, max_payload, ep->ss_ep_comp.wBytesPerInterval);
You dropped the conversion from le16 to cpu? Why?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 3:51 ` Greg KH
@ 2026-04-02 6:59 ` Xuetao (kirin)
2026-04-02 7:10 ` Greg KH
2026-04-02 13:56 ` Alan Stern
0 siblings, 2 replies; 14+ messages in thread
From: Xuetao (kirin) @ 2026-04-02 6:59 UTC (permalink / raw)
To: Greg KH; +Cc: linux-usb, linux-kernel, caiyadong, stable, stern
在 2026/4/2 11:51, Greg KH 写道:
> On Thu, Apr 02, 2026 at 10:14:00AM +0800, Tao Xue wrote:
>> As specified in Section 4.14.2 of the xHCI Specification, the xHC
>> reserves bandwidth for periodic endpoints according to bInterval and
>> wBytesPerInterval (Max ESIT Payload).
>>
>> Some peripherals report an invalid wBytesPerInterval in their device
>> descriptor, which is either 0 or smaller than the actual data length
>> transmitted. This issue is observed on ASIX AX88179 series USB 3.0
>> Ethernet adapters.
>>
>> These errors may lead to unexpected behavior on certain USB host
>> controllers, causing USB peripherals to malfunction.
>>
>> To address the issue, return max(wBytesPerInterval, max_payload) when
>> calculating bandwidth reservation.
>>
>> Fixes: 9238f25d5d32 ("USB: xhci: properly set endpoint context fields for periodic eps.")
>> Cc: <stable@kernel.org>
>> Signed-off-by: Tao Xue <xuetao09@huawei.com>
>> ---
>> drivers/usb/core/usb.c | 9 ++++++++-
>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
>> index e9a10a33534c..8f2e05a5a015 100644
>> --- a/drivers/usb/core/usb.c
>> +++ b/drivers/usb/core/usb.c
>> @@ -1125,6 +1125,8 @@ EXPORT_SYMBOL_GPL(usb_free_noncoherent);
>> u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
>> const struct usb_host_endpoint *ep)
>> {
>> + u32 max_payload;
>> +
>> if (!usb_endpoint_xfer_isoc(&ep->desc) &&
>> !usb_endpoint_xfer_int(&ep->desc))
>> return 0;
>> @@ -1135,7 +1137,12 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
>> return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
>> fallthrough;
>> case USB_SPEED_SUPER:
>> - return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
>> + max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst + 1);
>> + if (usb_endpoint_xfer_isoc(&ep->desc))
>> + return max_t(u32, max_payload * USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
>> + ep->ss_ep_comp.wBytesPerInterval);
>> + else
>> + return max_t(u32, max_payload, ep->ss_ep_comp.wBytesPerInterval);
>
> You dropped the conversion from le16 to cpu? Why?
>
> thanks,
>
> greg k-h
Hi Greg,
Thank you for the review.
1、You're right, that was an oversight. I should keep the le16_to_cpu().
Here's the corrected version:
max_payload = usb_endpoint_maxp(&ep->desc) *
(ep->ss_ep_comp.bMaxBurst + 1);
if (usb_endpoint_xfer_isoc(&ep->desc))
return max_t(u32, max_payload *
USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval));
else
return max_t(u32, max_payload,
le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval));
2、Following Alan's suggestion in another email, should I check whether
wBytesPerInterval is a valid value and handle it in the
usb_parse_ss_endpoint_companion() ?
However, when parsing the device descriptor, we do not know whether the
actual data length transmitted by the peripheral is greater than
wBytesPerInterval.
Therefore, would it be sufficient to only add a check for whether
wBytesPerInterval is 0 in the existing flow, and if it is 0, set
wBytesPerInterval to cpu_to_le16(max_tx) by default?
For example, modify it in the following way:
if (le16_to_cpu(desc->wBytesPerInterval) > max_tx ||
le16_to_cpu(desc->wBytesPerInterval) == 0) {
dev_notice(ddev, "%s endpoint with wBytesPerInterval of %d in "
"config %d interface %d altsetting %d ep %d: "
"setting to %d\n",
usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int",
le16_to_cpu(desc->wBytesPerInterval),
cfgno, inum, asnum, ep->desc.bEndpointAddress,
max_tx);
ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx);
}
Could you please give me some advice? Thanks.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 6:59 ` Xuetao (kirin)
@ 2026-04-02 7:10 ` Greg KH
2026-04-02 8:26 ` Xuetao (kirin)
2026-04-02 13:56 ` Alan Stern
1 sibling, 1 reply; 14+ messages in thread
From: Greg KH @ 2026-04-02 7:10 UTC (permalink / raw)
To: Xuetao (kirin); +Cc: linux-usb, linux-kernel, caiyadong, stable, stern
On Thu, Apr 02, 2026 at 02:59:35PM +0800, Xuetao (kirin) wrote:
>
>
> 在 2026/4/2 11:51, Greg KH 写道:
> > On Thu, Apr 02, 2026 at 10:14:00AM +0800, Tao Xue wrote:
> > > As specified in Section 4.14.2 of the xHCI Specification, the xHC
> > > reserves bandwidth for periodic endpoints according to bInterval and
> > > wBytesPerInterval (Max ESIT Payload).
> > >
> > > Some peripherals report an invalid wBytesPerInterval in their device
> > > descriptor, which is either 0 or smaller than the actual data length
> > > transmitted. This issue is observed on ASIX AX88179 series USB 3.0
> > > Ethernet adapters.
> > >
> > > These errors may lead to unexpected behavior on certain USB host
> > > controllers, causing USB peripherals to malfunction.
> > >
> > > To address the issue, return max(wBytesPerInterval, max_payload) when
> > > calculating bandwidth reservation.
> > >
> > > Fixes: 9238f25d5d32 ("USB: xhci: properly set endpoint context fields for periodic eps.")
> > > Cc: <stable@kernel.org>
> > > Signed-off-by: Tao Xue <xuetao09@huawei.com>
> > > ---
> > > drivers/usb/core/usb.c | 9 ++++++++-
> > > 1 file changed, 8 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
> > > index e9a10a33534c..8f2e05a5a015 100644
> > > --- a/drivers/usb/core/usb.c
> > > +++ b/drivers/usb/core/usb.c
> > > @@ -1125,6 +1125,8 @@ EXPORT_SYMBOL_GPL(usb_free_noncoherent);
> > > u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> > > const struct usb_host_endpoint *ep)
> > > {
> > > + u32 max_payload;
> > > +
> > > if (!usb_endpoint_xfer_isoc(&ep->desc) &&
> > > !usb_endpoint_xfer_int(&ep->desc))
> > > return 0;
> > > @@ -1135,7 +1137,12 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> > > return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
> > > fallthrough;
> > > case USB_SPEED_SUPER:
> > > - return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
> > > + max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst + 1);
> > > + if (usb_endpoint_xfer_isoc(&ep->desc))
> > > + return max_t(u32, max_payload * USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
> > > + ep->ss_ep_comp.wBytesPerInterval);
> > > + else
> > > + return max_t(u32, max_payload, ep->ss_ep_comp.wBytesPerInterval);
> >
> > You dropped the conversion from le16 to cpu? Why?
> >
> > thanks,
> >
> > greg k-h
>
> Hi Greg,
>
> Thank you for the review.
>
> 1、You're right, that was an oversight. I should keep the le16_to_cpu().
> Here's the corrected version:
>
> max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst +
> 1);
> if (usb_endpoint_xfer_isoc(&ep->desc))
> return max_t(u32, max_payload *
> USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
> le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval));
> else
> return max_t(u32, max_payload,
> le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval));
That's hard to follow as it is line-wrapped, just fix it up for your
next version and I'll be glad to review it then.
> 2、Following Alan's suggestion in another email, should I check whether
> wBytesPerInterval is a valid value and handle it in the
> usb_parse_ss_endpoint_companion() ?
>
> However, when parsing the device descriptor, we do not know whether the
> actual data length transmitted by the peripheral is greater than
> wBytesPerInterval.
>
> Therefore, would it be sufficient to only add a check for whether
> wBytesPerInterval is 0 in the existing flow, and if it is 0, set
> wBytesPerInterval to cpu_to_le16(max_tx) by default?
No, don't override a value given by a device. Mark the descriptor as
invalid and fail attaching to the device.
> For example, modify it in the following way:
>
> if (le16_to_cpu(desc->wBytesPerInterval) > max_tx ||
> le16_to_cpu(desc->wBytesPerInterval) == 0) {
> dev_notice(ddev, "%s endpoint with wBytesPerInterval of %d in "
> "config %d interface %d altsetting %d ep %d: "
> "setting to %d\n",
> usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int",
> le16_to_cpu(desc->wBytesPerInterval),
> cfgno, inum, asnum, ep->desc.bEndpointAddress,
> max_tx);
> ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx);
> }
There's nothing a user can do with this type of error, and yet the
kernel is supposed to fix it up? We should just fail it and tell the
user then, like we do for other broken descriptors.
Did you find this issue with a real device, or is this just due to
fuzzing invalid descriptor values?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 7:10 ` Greg KH
@ 2026-04-02 8:26 ` Xuetao (kirin)
0 siblings, 0 replies; 14+ messages in thread
From: Xuetao (kirin) @ 2026-04-02 8:26 UTC (permalink / raw)
To: Greg KH; +Cc: linux-usb, linux-kernel, caiyadong, stable, stern
在 2026/4/2 15:10, Greg KH 写道:
> On Thu, Apr 02, 2026 at 02:59:35PM +0800, Xuetao (kirin) wrote:
>>
>>
>> 在 2026/4/2 11:51, Greg KH 写道:
>>> On Thu, Apr 02, 2026 at 10:14:00AM +0800, Tao Xue wrote:
>>>> As specified in Section 4.14.2 of the xHCI Specification, the xHC
>>>> reserves bandwidth for periodic endpoints according to bInterval and
>>>> wBytesPerInterval (Max ESIT Payload).
>>>>
>>>> Some peripherals report an invalid wBytesPerInterval in their device
>>>> descriptor, which is either 0 or smaller than the actual data length
>>>> transmitted. This issue is observed on ASIX AX88179 series USB 3.0
>>>> Ethernet adapters.
>>>>
>>>> These errors may lead to unexpected behavior on certain USB host
>>>> controllers, causing USB peripherals to malfunction.
>>>>
>>>> To address the issue, return max(wBytesPerInterval, max_payload) when
>>>> calculating bandwidth reservation.
>>>>
>>>> Fixes: 9238f25d5d32 ("USB: xhci: properly set endpoint context fields for periodic eps.")
>>>> Cc: <stable@kernel.org>
>>>> Signed-off-by: Tao Xue <xuetao09@huawei.com>
>>>> ---
>>>> drivers/usb/core/usb.c | 9 ++++++++-
>>>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
>>>> index e9a10a33534c..8f2e05a5a015 100644
>>>> --- a/drivers/usb/core/usb.c
>>>> +++ b/drivers/usb/core/usb.c
>>>> @@ -1125,6 +1125,8 @@ EXPORT_SYMBOL_GPL(usb_free_noncoherent);
>>>> u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
>>>> const struct usb_host_endpoint *ep)
>>>> {
>>>> + u32 max_payload;
>>>> +
>>>> if (!usb_endpoint_xfer_isoc(&ep->desc) &&
>>>> !usb_endpoint_xfer_int(&ep->desc))
>>>> return 0;
>>>> @@ -1135,7 +1137,12 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
>>>> return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
>>>> fallthrough;
>>>> case USB_SPEED_SUPER:
>>>> - return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
>>>> + max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst + 1);
>>>> + if (usb_endpoint_xfer_isoc(&ep->desc))
>>>> + return max_t(u32, max_payload * USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
>>>> + ep->ss_ep_comp.wBytesPerInterval);
>>>> + else
>>>> + return max_t(u32, max_payload, ep->ss_ep_comp.wBytesPerInterval);
>>>
>>> You dropped the conversion from le16 to cpu? Why?
>>>
>>> thanks,
>>>
>>> greg k-h
>>
>> Hi Greg,
>>
>> Thank you for the review.
>>
>> 1、You're right, that was an oversight. I should keep the le16_to_cpu().
>> Here's the corrected version:
>>
>> max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst +
>> 1);
>> if (usb_endpoint_xfer_isoc(&ep->desc))
>> return max_t(u32, max_payload *
>> USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
>> le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval));
>> else
>> return max_t(u32, max_payload,
>> le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval));
>
> That's hard to follow as it is line-wrapped, just fix it up for your
> next version and I'll be glad to review it then.
>
Thank you for the review.I will submit a new patch later.
>> 2、Following Alan's suggestion in another email, should I check whether
>> wBytesPerInterval is a valid value and handle it in the
>> usb_parse_ss_endpoint_companion() ?
>>
>> However, when parsing the device descriptor, we do not know whether the
>> actual data length transmitted by the peripheral is greater than
>> wBytesPerInterval.
>>
>> Therefore, would it be sufficient to only add a check for whether
>> wBytesPerInterval is 0 in the existing flow, and if it is 0, set
>> wBytesPerInterval to cpu_to_le16(max_tx) by default?
>
> No, don't override a value given by a device. Mark the descriptor as
> invalid and fail attaching to the device.
>
>> For example, modify it in the following way:
>>
>> if (le16_to_cpu(desc->wBytesPerInterval) > max_tx ||
>> le16_to_cpu(desc->wBytesPerInterval) == 0) {
>> dev_notice(ddev, "%s endpoint with wBytesPerInterval of %d in "
>> "config %d interface %d altsetting %d ep %d: "
>> "setting to %d\n",
>> usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int",
>> le16_to_cpu(desc->wBytesPerInterval),
>> cfgno, inum, asnum, ep->desc.bEndpointAddress,
>> max_tx);
>> ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx);
>> }
>
> There's nothing a user can do with this type of error, and yet the
> kernel is supposed to fix it up? We should just fail it and tell the
> user then, like we do for other broken descriptors.
>
> Did you find this issue with a real device, or is this just due to
> fuzzing invalid descriptor values?
>
> thanks,
>
> greg k-h
This is not a fuzzing issue.I have encountered this issue on several USB
3.0 docks (with built-in USB Ethernet adapters), such as UGREEN,
thinkplus, and Baseus. They all use the ASIX AX88179 USB 3.0 Gigabit
Ethernet Adapter (VID:0x0B95, PID: 0x1790). I am seeing two scenarios:
int ep:
Scenario 1:
wMaxPacketSize = 16
bMaxBurst = 0
wBytesPerInterval = 8
tx_data_len = 8/16
Scenario 2:
wMaxPacketSize = 16
bMaxBurst = 0
wBytesPerInterval = 0
tx_data_len = 8/16
These devices work perfectly on the dwc3 controller, but they
consistently fail on another USB host controller. When I temporarily
change wBytesPerInterval to 16, the problem is resolved.
From the comparison results, different controllers behave differently
when encountering invalid wBytesPerInterval values in the device
descriptor.The dwc3 controller is tolerant of this error.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 2:14 [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval Tao Xue
2026-04-02 2:45 ` Alan Stern
2026-04-02 3:51 ` Greg KH
@ 2026-04-02 9:44 ` Michal Pecio
2026-04-02 11:55 ` Xuetao (kirin)
2 siblings, 1 reply; 14+ messages in thread
From: Michal Pecio @ 2026-04-02 9:44 UTC (permalink / raw)
To: Tao Xue; +Cc: gregkh, linux-usb, linux-kernel, caiyadong, stable
On Thu, 2 Apr 2026 10:14:00 +0800, Tao Xue wrote:
> As specified in Section 4.14.2 of the xHCI Specification, the xHC
> reserves bandwidth for periodic endpoints according to bInterval and
> wBytesPerInterval (Max ESIT Payload).
For SuperSpeed endpoints, yes.
This follows from USB3 spec 9.6.7.
> Some peripherals report an invalid wBytesPerInterval in their device
> descriptor, which is either 0 or smaller than the actual data length
> transmitted. This issue is observed on ASIX AX88179 series USB 3.0
> Ethernet adapters.
Damn, it really does.
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 11
bMaxBurst 0
wBytesPerInterval 0
Any other examples besides AX88179?
> These errors may lead to unexpected behavior on certain USB host
> controllers, causing USB peripherals to malfunction.
Out of curiosity, Bandwidth Overrun Error or something worse?
It's an oversight that these URBs aren't rejected with EMSGSIZE in the
first place. IIRC zero-length interrupt transfers are allowed by USB
specs and a zero-payload endpoint is probably legal per xHCI, but then
submitting non-empty URBs to it is not.
> To address the issue, return max(wBytesPerInterval, max_payload) when
> calculating bandwidth reservation.
>
> Fixes: 9238f25d5d32 ("USB: xhci: properly set endpoint context fields for periodic eps.")
> Cc: <stable@kernel.org>
> Signed-off-by: Tao Xue <xuetao09@huawei.com>
> ---
> drivers/usb/core/usb.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
> index e9a10a33534c..8f2e05a5a015 100644
> --- a/drivers/usb/core/usb.c
> +++ b/drivers/usb/core/usb.c
> @@ -1125,6 +1125,8 @@ EXPORT_SYMBOL_GPL(usb_free_noncoherent);
> u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> const struct usb_host_endpoint *ep)
> {
> + u32 max_payload;
> +
> if (!usb_endpoint_xfer_isoc(&ep->desc) &&
> !usb_endpoint_xfer_int(&ep->desc))
> return 0;
> @@ -1135,7 +1137,12 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
> return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
> fallthrough;
> case USB_SPEED_SUPER:
> - return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
> + max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst + 1);
> + if (usb_endpoint_xfer_isoc(&ep->desc))
> + return max_t(u32, max_payload * USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
> + ep->ss_ep_comp.wBytesPerInterval);
> + else
> + return max_t(u32, max_payload, ep->ss_ep_comp.wBytesPerInterval);
Obviously a kludge is necessary here to make these abominable devices
work reliably with xHCI, but OTOH exceeding wBytesPerInterval violates
USB3 9.6.7 and it's unclear if all devices would be happy.
There are devices which define such odd isochronous alt settings with
apparent intent to allow fine-grained bandwidth reservation:
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 1
bMaxBurst 0
wBytesPerInterval 512
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 1
bMaxBurst 0
wBytesPerInterval 1024
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 1
bMaxBurst 1 # 2 packets per interval
wBytesPerInterval 1536
Isochronous drivers use this function to size their URBs or select the
right altsetting for given bandwidth. UVC has obeyed wBytesPerInterval
since forever with no apparent issues and UAC has recently been patched
to work like that too with no issues so far AFAIK.
Maybe start with something specific to the known bogus hardware, i.e.
interrupt endpoint with one packet and zero payload? In such case
it's high chance that the device actually meant it to be wMaxPacket.
> default:
> if (usb_endpoint_is_hs_isoc_double(udev, ep))
> return le32_to_cpu(ep->eusb2_isoc_ep_comp.dwBytesPerInterval);
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 9:44 ` Michal Pecio
@ 2026-04-02 11:55 ` Xuetao (kirin)
2026-04-03 7:16 ` Michal Pecio
0 siblings, 1 reply; 14+ messages in thread
From: Xuetao (kirin) @ 2026-04-02 11:55 UTC (permalink / raw)
To: Michal Pecio; +Cc: gregkh, linux-usb, linux-kernel, caiyadong, stable
在 2026/4/2 17:44, Michal Pecio 写道:
> On Thu, 2 Apr 2026 10:14:00 +0800, Tao Xue wrote:
>> As specified in Section 4.14.2 of the xHCI Specification, the xHC
>> reserves bandwidth for periodic endpoints according to bInterval and
>> wBytesPerInterval (Max ESIT Payload).
>
> For SuperSpeed endpoints, yes.
> This follows from USB3 spec 9.6.7.
>
>> Some peripherals report an invalid wBytesPerInterval in their device
>> descriptor, which is either 0 or smaller than the actual data length
>> transmitted. This issue is observed on ASIX AX88179 series USB 3.0
>> Ethernet adapters.
>
> Damn, it really does.
>
> Endpoint Descriptor:
> bLength 7
> bDescriptorType 5
> bEndpointAddress 0x81 EP 1 IN
> bmAttributes 3
> Transfer Type Interrupt
> Synch Type None
> Usage Type Data
> wMaxPacketSize 0x0008 1x 8 bytes
> bInterval 11
> bMaxBurst 0
> wBytesPerInterval 0
>
> Any other examples besides AX88179?
We tested 18 different USB 3.0 docks, but they only contained two
different types of USB 3.0 Ethernet devices based on VID/PID.
The dwc3 controller works fine with all of the devices mentioned above.
The other USB host controller works fine with all 12 Realtek devices,
but fails with all 6 ASIX devices.
1. Realtek USB 10/100/1000 LAN (12 devices)
All 12 devices share the same VID/PID and descriptor values.
VID = 0x0BDA, PID = 0x8153
wMaxPacketSize = 0x10
bMaxBurst = 0
wBytesPerInterval = 0x8
2. ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter (6 devices)
All 6 devices share the same VID/PID.
VID = 0x0B95, PID = 0x1790
(a) 4 devices:
wMaxPacketSize = 0x10
bMaxBurst = 0
wBytesPerInterval = 0x0
(b) 2 devices:
wMaxPacketSize = 0x10
bMaxBurst = 0
wBytesPerInterval = 0x8
We also tested 3 different USB 3.0 camera devices. On all of these
devices, the wBytesPerInterval of all SuperSpeed isochronous endpoints
is equal to Mult * wMaxPacketSize * (bMaxBurst + 1).
>
>> These errors may lead to unexpected behavior on certain USB host
>> controllers, causing USB peripherals to malfunction.
>
> Out of curiosity, Bandwidth Overrun Error or something worse?
>
This host controller reports a Babble error.
> It's an oversight that these URBs aren't rejected with EMSGSIZE in the
> first place. IIRC zero-length interrupt transfers are allowed by USB
> specs and a zero-payload endpoint is probably legal per xHCI, but then
> submitting non-empty URBs to it is not.
>
>> To address the issue, return max(wBytesPerInterval, max_payload) when
>> calculating bandwidth reservation.
>>
>> Fixes: 9238f25d5d32 ("USB: xhci: properly set endpoint context fields for periodic eps.")
>> Cc: <stable@kernel.org>
>> Signed-off-by: Tao Xue <xuetao09@huawei.com>
>> ---
>> drivers/usb/core/usb.c | 9 ++++++++-
>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
>> index e9a10a33534c..8f2e05a5a015 100644
>> --- a/drivers/usb/core/usb.c
>> +++ b/drivers/usb/core/usb.c
>> @@ -1125,6 +1125,8 @@ EXPORT_SYMBOL_GPL(usb_free_noncoherent);
>> u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
>> const struct usb_host_endpoint *ep)
>> {
>> + u32 max_payload;
>> +
>> if (!usb_endpoint_xfer_isoc(&ep->desc) &&
>> !usb_endpoint_xfer_int(&ep->desc))
>> return 0;
>> @@ -1135,7 +1137,12 @@ u32 usb_endpoint_max_periodic_payload(struct usb_device *udev,
>> return le32_to_cpu(ep->ssp_isoc_ep_comp.dwBytesPerInterval);
>> fallthrough;
>> case USB_SPEED_SUPER:
>> - return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
>> + max_payload = usb_endpoint_maxp(&ep->desc) * (ep->ss_ep_comp.bMaxBurst + 1);
>> + if (usb_endpoint_xfer_isoc(&ep->desc))
>> + return max_t(u32, max_payload * USB_SS_MULT(ep->ss_ep_comp.bmAttributes),
>> + ep->ss_ep_comp.wBytesPerInterval);
>> + else
>> + return max_t(u32, max_payload, ep->ss_ep_comp.wBytesPerInterval);
>
> Obviously a kludge is necessary here to make these abominable devices
> work reliably with xHCI, but OTOH exceeding wBytesPerInterval violates
> USB3 9.6.7 and it's unclear if all devices would be happy.
>
> There are devices which define such odd isochronous alt settings with
> apparent intent to allow fine-grained bandwidth reservation:
>
> wMaxPacketSize 0x0400 1x 1024 bytes
> bInterval 1
> bMaxBurst 0
> wBytesPerInterval 512
>
> wMaxPacketSize 0x0400 1x 1024 bytes
> bInterval 1
> bMaxBurst 0
> wBytesPerInterval 1024
>
> wMaxPacketSize 0x0400 1x 1024 bytes
> bInterval 1
> bMaxBurst 1 # 2 packets per interval
> wBytesPerInterval 1536
>
> Isochronous drivers use this function to size their URBs or select the
> right altsetting for given bandwidth. UVC has obeyed wBytesPerInterval
> since forever with no apparent issues and UAC has recently been patched
> to work like that too with no issues so far AFAIK.
>
> Maybe start with something specific to the known bogus hardware, i.e.
> interrupt endpoint with one packet and zero payload? In such case
> it's high chance that the device actually meant it to be wMaxPacket.
>
>> default:
>> if (usb_endpoint_is_hs_isoc_double(udev, ep))
>> return le32_to_cpu(ep->eusb2_isoc_ep_comp.dwBytesPerInterval);
>> --
>> 2.17.1
>>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 6:59 ` Xuetao (kirin)
2026-04-02 7:10 ` Greg KH
@ 2026-04-02 13:56 ` Alan Stern
2026-04-02 14:09 ` Greg KH
2026-04-02 20:17 ` Michal Pecio
1 sibling, 2 replies; 14+ messages in thread
From: Alan Stern @ 2026-04-02 13:56 UTC (permalink / raw)
To: Xuetao (kirin); +Cc: Greg KH, linux-usb, linux-kernel, caiyadong, stable
On Thu, Apr 02, 2026 at 02:59:35PM +0800, Xuetao (kirin) wrote:
> 2、Following Alan's suggestion in another email, should I check whether
> wBytesPerInterval is a valid value and handle it in the
> usb_parse_ss_endpoint_companion() ?
Yes, IMO.
> However, when parsing the device descriptor, we do not know whether the
> actual data length transmitted by the peripheral is greater than
> wBytesPerInterval.
Note: wBytesPerInterval is in the endpoint descriptor, not the device
descriptor.
> Therefore, would it be sufficient to only add a check for whether
> wBytesPerInterval is 0 in the existing flow, and if it is 0, set
> wBytesPerInterval to cpu_to_le16(max_tx) by default?
>
> For example, modify it in the following way:
>
> if (le16_to_cpu(desc->wBytesPerInterval) > max_tx ||
> le16_to_cpu(desc->wBytesPerInterval) == 0) {
> dev_notice(ddev, "%s endpoint with wBytesPerInterval of %d in "
> "config %d interface %d altsetting %d ep %d: "
> "setting to %d\n",
> usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int",
> le16_to_cpu(desc->wBytesPerInterval),
> cfgno, inum, asnum, ep->desc.bEndpointAddress,
> max_tx);
> ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx);
> }
>
> Could you please give me some advice? Thanks.
Try it and see if it fixes the problems you see with the network
adapters.
I saw the Greg said not to change the descriptors and just fail the
device, but we already make this sort of change to correct other errors
so there doesn't seem to be any reason not to do it here as well.
Especially if it allows people to use devices that otherwise would not
work.
Alan Stern
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 13:56 ` Alan Stern
@ 2026-04-02 14:09 ` Greg KH
2026-04-02 15:03 ` Michal Pecio
2026-04-03 1:20 ` Xuetao (kirin)
2026-04-02 20:17 ` Michal Pecio
1 sibling, 2 replies; 14+ messages in thread
From: Greg KH @ 2026-04-02 14:09 UTC (permalink / raw)
To: Alan Stern; +Cc: Xuetao (kirin), linux-usb, linux-kernel, caiyadong, stable
On Thu, Apr 02, 2026 at 09:56:51AM -0400, Alan Stern wrote:
> On Thu, Apr 02, 2026 at 02:59:35PM +0800, Xuetao (kirin) wrote:
> > 2、Following Alan's suggestion in another email, should I check whether
> > wBytesPerInterval is a valid value and handle it in the
> > usb_parse_ss_endpoint_companion() ?
>
> Yes, IMO.
>
> > However, when parsing the device descriptor, we do not know whether the
> > actual data length transmitted by the peripheral is greater than
> > wBytesPerInterval.
>
> Note: wBytesPerInterval is in the endpoint descriptor, not the device
> descriptor.
>
> > Therefore, would it be sufficient to only add a check for whether
> > wBytesPerInterval is 0 in the existing flow, and if it is 0, set
> > wBytesPerInterval to cpu_to_le16(max_tx) by default?
> >
> > For example, modify it in the following way:
> >
> > if (le16_to_cpu(desc->wBytesPerInterval) > max_tx ||
> > le16_to_cpu(desc->wBytesPerInterval) == 0) {
> > dev_notice(ddev, "%s endpoint with wBytesPerInterval of %d in "
> > "config %d interface %d altsetting %d ep %d: "
> > "setting to %d\n",
> > usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int",
> > le16_to_cpu(desc->wBytesPerInterval),
> > cfgno, inum, asnum, ep->desc.bEndpointAddress,
> > max_tx);
> > ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx);
> > }
> >
> > Could you please give me some advice? Thanks.
>
> Try it and see if it fixes the problems you see with the network
> adapters.
>
> I saw the Greg said not to change the descriptors and just fail the
> device, but we already make this sort of change to correct other errors
> so there doesn't seem to be any reason not to do it here as well.
> Especially if it allows people to use devices that otherwise would not
> work.
I didn't realize this was on "real" devices, sorry. I thought this was
only a fuzzing thing. So yes, fix up the broken descriptor after
warning about it is the correct thing to do.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 14:09 ` Greg KH
@ 2026-04-02 15:03 ` Michal Pecio
2026-04-03 1:20 ` Xuetao (kirin)
1 sibling, 0 replies; 14+ messages in thread
From: Michal Pecio @ 2026-04-02 15:03 UTC (permalink / raw)
To: Greg KH
Cc: Alan Stern, Xuetao (kirin), linux-usb, linux-kernel, caiyadong,
stable
On Thu, 2 Apr 2026 16:09:51 +0200, Greg KH wrote:
> I didn't realize this was on "real" devices, sorry. I thought this
> was only a fuzzing thing. So yes, fix up the broken descriptor after
> warning about it is the correct thing to do.
Such descriptors are not illegal per USB3 spec and they are seen in the
wild, at least on isochronous endpoints, and they were correct so far.
What's broken is that some particular device specifies less than its
driver actually submits (and presumably needs to submit for it to work).
Regards,
Michal
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 13:56 ` Alan Stern
2026-04-02 14:09 ` Greg KH
@ 2026-04-02 20:17 ` Michal Pecio
1 sibling, 0 replies; 14+ messages in thread
From: Michal Pecio @ 2026-04-02 20:17 UTC (permalink / raw)
To: Alan Stern
Cc: Xuetao (kirin), Greg KH, linux-usb, linux-kernel, caiyadong,
stable
On Thu, 2 Apr 2026 09:56:51 -0400, Alan Stern wrote:
> On Thu, Apr 02, 2026 at 02:59:35PM +0800, Xuetao (kirin) wrote:
> > 2、Following Alan's suggestion in another email, should I check
> > whether wBytesPerInterval is a valid value and handle it in the
> > usb_parse_ss_endpoint_companion() ?
>
> Yes, IMO.
Not sure, this could backfire if it turns out that these workarounds
will need to become more elaborate and account for wBytesPerInterval.
These descriptors aren't blatantly invalid. USB3 9.6.7 doesn't require
that wBytesPerInterval == wMaxPacketSize * bMaxBurst * Mult.
Being greater would be blatantly invalid, but this is already being
sanitized by the descriptor parser.
> > However, when parsing the device descriptor, we do not know whether
> > the actual data length transmitted by the peripheral is greater than
> > wBytesPerInterval.
Indeed. Device is allowed (actually: required) not to send more data
than its wBytesPerInterval on IN endpoints.
UVC driver uses this field to pick isochronous altsetting capable of
transmitting a particular payload each interval. If we overestimate,
there is risk that the device will deliver on its promise and truncate
instead of violating USB3 spec. We should rather pick a larger alt.
OTOH, when a device lies and sends more than specified, this happens.
Some HCs ignore the problem (and may overcommit bandwidth if we enable
million such endpoints), others get pedantic and return Babble Error
(my mistake, Bandwidth Overrun is specific to isochronous).
I think this patch is relatively safe for interrupt, because drivers
generally don't look at endpoint descriptors and submit URBs of class
specific size. Case in point, everything works when you override xHCI
allocation. It also works on HCs ignoring it.
Beind the pedant I am, I would restrict this to bMaxBurst==0 because
that's the known problem case and IDK off-hand what devices might use
bursting interrupt endpoints and what gotchas await there.
Maybe add a comment that it's a questionable, spec-violating hack.
Regards,
Michal
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 14:09 ` Greg KH
2026-04-02 15:03 ` Michal Pecio
@ 2026-04-03 1:20 ` Xuetao (kirin)
1 sibling, 0 replies; 14+ messages in thread
From: Xuetao (kirin) @ 2026-04-03 1:20 UTC (permalink / raw)
To: Greg KH, Alan Stern; +Cc: linux-usb, linux-kernel, caiyadong, stable
在 2026/4/2 22:09, Greg KH 写道:
> On Thu, Apr 02, 2026 at 09:56:51AM -0400, Alan Stern wrote:
>> On Thu, Apr 02, 2026 at 02:59:35PM +0800, Xuetao (kirin) wrote:
>>> 2、Following Alan's suggestion in another email, should I check whether
>>> wBytesPerInterval is a valid value and handle it in the
>>> usb_parse_ss_endpoint_companion() ?
>>
>> Yes, IMO.
>>
>>> However, when parsing the device descriptor, we do not know whether the
>>> actual data length transmitted by the peripheral is greater than
>>> wBytesPerInterval.
>>
>> Note: wBytesPerInterval is in the endpoint descriptor, not the device
>> descriptor.
>>
Thank you for your review. I will correct the description in the
subsequent patch.
>>> Therefore, would it be sufficient to only add a check for whether
>>> wBytesPerInterval is 0 in the existing flow, and if it is 0, set
>>> wBytesPerInterval to cpu_to_le16(max_tx) by default?
>>>
>>> For example, modify it in the following way:
>>>
>>> if (le16_to_cpu(desc->wBytesPerInterval) > max_tx ||
>>> le16_to_cpu(desc->wBytesPerInterval) == 0) {
>>> dev_notice(ddev, "%s endpoint with wBytesPerInterval of %d in "
>>> "config %d interface %d altsetting %d ep %d: "
>>> "setting to %d\n",
>>> usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int",
>>> le16_to_cpu(desc->wBytesPerInterval),
>>> cfgno, inum, asnum, ep->desc.bEndpointAddress,
>>> max_tx);
>>> ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx);
>>> }
>>>
>>> Could you please give me some advice? Thanks.
>>
>> Try it and see if it fixes the problems you see with the network
>> adapters.
>>
Okay, I will verify the effectiveness of this modification and provide
feedback on the results.
I guess that for the scenario where wBytesPerInterval is 0, it should be
solvable. However, for the scenario where wBytesPerInterval is 8 but the
peripheral sends a data length greater than 8 (e.g., 16), there might be
an issue. I will test both of the above scenarios.
>> I saw the Greg said not to change the descriptors and just fail the
>> device, but we already make this sort of change to correct other errors
>> so there doesn't seem to be any reason not to do it here as well.
>> Especially if it allows people to use devices that otherwise would not
>> work.
>
> I didn't realize this was on "real" devices, sorry. I thought this was
> only a fuzzing thing. So yes, fix up the broken descriptor after
> warning about it is the correct thing to do.
>
> thanks,
>
> greg k-h
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval
2026-04-02 11:55 ` Xuetao (kirin)
@ 2026-04-03 7:16 ` Michal Pecio
0 siblings, 0 replies; 14+ messages in thread
From: Michal Pecio @ 2026-04-03 7:16 UTC (permalink / raw)
To: Xuetao (kirin); +Cc: gregkh, linux-usb, linux-kernel, caiyadong, stable
On Thu, 2 Apr 2026 19:55:16 +0800, Xuetao (kirin) wrote:
> > Any other examples besides AX88179?
>
> We tested 18 different USB 3.0 docks, but they only contained two
> different types of USB 3.0 Ethernet devices based on VID/PID.
> The dwc3 controller works fine with all of the devices mentioned
> above. The other USB host controller works fine with all 12 Realtek
> devices, but fails with all 6 ASIX devices.
>
> 1. Realtek USB 10/100/1000 LAN (12 devices)
> All 12 devices share the same VID/PID and descriptor values.
>
> VID = 0x0BDA, PID = 0x8153
> wMaxPacketSize = 0x10
> bMaxBurst = 0
> wBytesPerInterval = 0x8
My RTL8153 has this endpoint for its default proprietary configuration:
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0002 1x 2 bytes
bInterval 8
bMaxBurst 0
wBytesPerInterval 2
which should be problem-free, and this for its CDC configuration:
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 8
bMaxBurst 0
wBytesPerInterval 8
The CDC configuration needs to be enabled with a patch, I'm not sure
if there is any other way. It will then use the r8153_ecm driver.
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -9641,6 +9641,7 @@ static int rtl_fw_init(struct r8152 *tp)
static u8 __rtl_get_hw_ver(struct usb_device *udev)
{
+ return 0;
u32 ocp_data = 0;
__le32 *tmp;
u8 version;
> 2. ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter (6 devices)
> All 6 devices share the same VID/PID.
>
> VID = 0x0B95, PID = 0x1790
> (a) 4 devices:
> wMaxPacketSize = 0x10
> bMaxBurst = 0
> wBytesPerInterval = 0x0
This looks like my AX88179 and it's obviously broken.
> (b) 2 devices:
> wMaxPacketSize = 0x10
> bMaxBurst = 0
> wBytesPerInterval = 0x8
But this is odd. When I use mine, I see that the driver submits 8 byte
URBs and they complete successfully with 8 bytes received, no babble.
ffff888100981b40 3364969734 S Ii:2:010:1 -115:1024 8 <
ffff888100981b40 3365097706 C Ii:2:010:1 0:1024 8 = a1000800 79490000
So I think this should work even with bandwidth reservation set to 8.
Can you check what happens here, before and after your patch?
Regards,
Michal
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-04-03 7:16 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-02 2:14 [PATCH] usb: core: Fix bandwidth for devices with invalid wBytesPerInterval Tao Xue
2026-04-02 2:45 ` Alan Stern
2026-04-02 3:51 ` Greg KH
2026-04-02 6:59 ` Xuetao (kirin)
2026-04-02 7:10 ` Greg KH
2026-04-02 8:26 ` Xuetao (kirin)
2026-04-02 13:56 ` Alan Stern
2026-04-02 14:09 ` Greg KH
2026-04-02 15:03 ` Michal Pecio
2026-04-03 1:20 ` Xuetao (kirin)
2026-04-02 20:17 ` Michal Pecio
2026-04-02 9:44 ` Michal Pecio
2026-04-02 11:55 ` Xuetao (kirin)
2026-04-03 7:16 ` Michal Pecio
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox