Re: [PATCH] usb: gadget: f_midi: Fixing wMaxPacketSize exceeded issue during MIDI bind retries

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/18/2024 9:21 PM, Alan Stern wrote:
> On Wed, Dec 18, 2024 at 03:51:50PM +0530, Selvarasu Ganesan wrote:
>> The issue arises during the second time the "f_midi_bind" function is
>> called. The problem lies in the fact that the size of
>> "bulk_in_desc.wMaxPacketSize" is set to 1024 during the first call,
>> which exceeds the hardware capability of the dwc3 TX/RX FIFO
>> (ep->maxpacket_limit = 512).
> Is this gadget supposed to be able to run at SuperSpeed?  I thought the
> dwc3 controller supported SuperSpeed operation.
>
> The USB-3 spec requires that all SuperSpeed bulk endpoints must have a
> wMaxPacketSize of 1024 (see Table 9-24 on p.9-25 of the USB-3.1
> specification).
>
> Alan Stern
>
Hi Alan,

No, In our platform, the DWC3 controller supports up to HighSpeed. While 
DWC3 is capable of SuperSpeed operation, it is not necessary to operate 
at the same speed. Moreover, even in our SoC, the DWC3 IP is limited to 
supporting only USB 2.0 mode (HighSpeed) at the hardware design level.

As previously mentioned, there is no need to set the wMaxPacketSize 
based on the current speed support before claiming the endpoint (before 
calling usb_ep_autoconfig), as usb_ep_autoconfig treats endpoint 
descriptors as if they were full-speed by default.

For reference, let's see the usb_ep_autoconfig code where the 
wMaxPacketSize is set to 64 bytes if the ep->maxpacket_limit is greater 
than 64. As i mentioned earlier in our specific failure scenarios, the 
code does not reach this point because the wMaxPacketSize is greater 
than the ep->maxpacket_limit.

struct usb_ep *usb_ep_autoconfig()
{
…
…
…
         /* report (variable) full speed bulk maxpacket */
         if (type == USB_ENDPOINT_XFER_BULK) {
                 int size = ep->maxpacket_limit;

                 if (size > 64)
                         size = 64;
                 desc->wMaxPacketSize = cpu_to_le16(size);
         }

         return ep;

}


Thanks,
Selva





[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux