Re: [BUG REPORT] usb: dwc3: Timeouts with USB 2.0 LPM active

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

 



Hi,

(before anything, thanks for actually following the steps for bug
reporting. Much, much appreciated)

Sebastian von Ohr <vonohr@xxxxxxxxxxx> writes:

> I'm running an Intel Apollo Lake SoM (Celeron N3350E) which I want to use as 
> a USB gadget with the functionFS gadget driver. I have created two bulk 
> endpoints for sending and receiving data. The hardware and cabling is only USB 
> 2.0 capable. In one test case the receive side of the SoM is slowed down 
> deliberately (200ms sleep between reads) while the host PC tries to send as 
> fast as possible. This setup leads to send timeouts on every second 
> transmission on the host PC.
>
> I believe this is an issue with the USB 2.0 LPM feature, more specifically 
> hardware LPM done by the host USB controller. I have tested different USB 

It's like the host is trying to go down to lower LPM states every 100ms:

     irq/13-dwc3-236     [000] d..1    71.363262: dwc3_event: event (00000401): WakeUp [U0]
     irq/13-dwc3-236     [000] d..1    71.363315: dwc3_event: event (00000401): WakeUp [U0]
     irq/13-dwc3-236     [000] d..1    71.363423: dwc3_event: event (00006084): ep1out: Transfer In Progress [0] (SIm)

> descriptors and the issue is gone when removing the USB_LPM_SUPPORT flag from 
> the USB 2.0 extension descriptor (actually removing only USB_BESL_SUPPORT seems 
> to suffice). Also the issue occurs only on some newer PCs and adding a hub 

it could be that LPM is disabled on older xHCI revisions. Mathias,
anything you can add here?

> (doesn't matter if 2.0 or 3.0 capable) makes the issue go away. I can 
> reproduce this issue with a Windows 10 (1909) host running an Intel B360 
> chipset. I use libusb v1.0.24 with the WinUSB driver on the host side to send 
> data on the bulk endpoint.

could you share a dump of your descriptors? It could be that the wake-up
latencies are incorrect which tricks the host into trying to go down to
lower LPM states too frequently.

> See the attached dwc3 trace and registers. It was created using the current 
> 5.12.1 kernel version. It shows multiple WakeUp [U0] events in short succession 
> but never any event showing different link states than U0. The host is doing 8 
> transmissions of 16 bytes to the device, but the device only receives 4 of 
> these transmissions. The first transmissions always succeeds while the next one 
> will timeout on the host. I believe this is because the device is currently not 
> ready to receive new data. But instead of sending the data when the delay on 
> the receive side is over the request never finishes and times out after 1 
> second (or even longer when I increase the timeout value).
>
> Is the USB 2.0 LPM extension even supposed to work with the dwc3 controller? I 

yes, it should be supported :-)

> can work around this issue currently by downgrading the device to USB 2.0 only 
> (setting bcdUSB to 0x0200). But I believe USB 3.0 capable device must support 
> LPM, so this issue might come up again when having USB 3.0 capable hardware.

correct, LPM is mandatory for USB3.0+. From the traces, we don't see any
errors, though. Everything looks fine.

Mathias, I have an old memory from my time at Intel when we discussed
this very fact. I can't remember what was the conclusion, but is there
anything the peripheral can do to tell the host to *not* enter U1/U2 so
frequently? If my memory doesn't fail me, I don't think there is
anything at all for the peripheral to do, right? Other than not
supporting U1/U2, which means STALLing the relevat SetFeature
requests. Do you know if that would still be a certifiable solution?

cheers

-- 
balbi

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux