Re: dwc3 gadget and USB3

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

 



On Fri, Mar 10, 2023, Joakim Tjernlund wrote:
> On Thu, 2023-03-09 at 21:09 +0000, Thinh Nguyen wrote:
> > On Thu, Mar 09, 2023, Joakim Tjernlund wrote:
> > > On Thu, 2023-03-09 at 19:56 +0000, Thinh Nguyen wrote:
> > > > On Thu, Mar 09, 2023, Joakim Tjernlund wrote:
> > > > > On Thu, 2023-03-09 at 17:32 +0100, Joakim Tjernlund wrote:
> > > > > > On Wed, 2023-03-08 at 22:26 +0100, Joakim Tjernlund wrote:
> > > > > > > On Wed, 2023-03-08 at 19:58 +0100, gregkh@xxxxxxxxxxxxxxxxxxx wrote:
> > > > > > > > On Wed, Mar 08, 2023 at 06:12:51PM +0000, Joakim Tjernlund wrote:
> > > > > > > > > On Wed, 2023-03-08 at 18:25 +0100, Greg KH wrote:
> > > > > > > > > > On Wed, Mar 08, 2023 at 05:10:17PM +0000, Joakim Tjernlund wrote:
> > > > > > > > > > > we are using fsl-ls1043a-rdb based design but with a ls1023a SOC and
> > > > > > > > > > > use USB0 in gadget mode running either NCM or RNDIS ethernet on top.
> > > > > > > > > > > 
> > > > > > > > > > > When we connect the gadget to a PC(Linux of Windows) over an USB2 hub,
> > > > > > > > > > > networking(NCM or RNDIS) works well.
> > > > > > > > > > > 
> > > > > > > > > > > However, when we connect the gadget directly to the PC/laptop which uses USB3
> > > > > > > > > > > we see something odd:
> > > > > > > > > > >   Ping from PC to gadget works.
> > > > > > > > > > >   Ping from gadget to laptop does not. However if we also ping from PC at the same time we
> > > > > > > > > > >   see gadget to PC start working.
> > > > > > > > > > > Seems like ping from the PC tiggers the gadget to see incoming pkgs somehow.
> > > > > > > > > > > 
> > > > > > > > > > > Any idea what might be wrong or how to debug this?
> > > > > > > > > > > Kernel 5.15.87
> > > > > > > > > > 
> > > > > > > > > > 5.15.y is very old, does this also happen on 6.2?
> > > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > I just tried 6.1.15 and the problem remains, I hope that is close enough ?
> > > > > > > > 
> > > > > > > > It's good enough :)
> > > > > > > > 
> > > > > > > > Have any logs at all that show any problems?
> > > > > > > > 
> > > > > > > No, don't know where to start. There are no errors logged.
> > > > > > > 
> > > > > > > >   Also, you might want to
> > > > > > > >  cc:  the dwc3 maintainer...
> > > > > > > 
> > > > > > > I thought I did but that look like old info, added Thinh Nguyen now, thanks
> > > > > > > 
> > > > > > >  Jocke
> > > > > > > 
> > > > > > > > 
> > > > > > > >  thanks,
> > > > > > > > 
> > > > > > > >  greg k-hj
> > > > > > > 
> > > > > > 
> > > > > > Found and USBC Dock and connected that between gadget an PC and this also works well.
> > > > > > Seems like a hub, regardless of USB2/USB3, make the usb network function in both directions.
> > > > > > 
> > > > > > Found out something interesting, on PC:
> > > > > > cd /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/power  # Where my gadget is connected
> > > > > > echo 0 > usb2_hardware_lpm
> > > > > > 
> > > > > > Now ping works normally.
> > > > > > 
> > > > > > So LPM does not seem to work properly on gadget. Can I disable LPM somehow
> > > > > > on gadget side? 
> > > > > > 
> > > > 
> > > > There's no option in gadget configfs to allow you to do that at the
> > > > moment. You can disable LPM in dwc3 controller in the devicetree with
> > > > "snps,dis_enblslpm_quirk" instead.
> > > 
> > > Yes, I found that. Thanks.
> > 
> > Also note that LPM is for device operating in usb2 speed. If it's usb3
> > speeds, then you need to disable U3 suspend.

Actually, you can't disable U3. The device has to obey the host if it
requests for U3 entry.

> 
> ATM I have:
> 	snps,dis_enblslpm_quirk;
> 	snps,dis_u2_susphy_quirk;
> 	snps,dis_u3_susphy_quirk;
> 	snps,usb2-gadget-lpm-disable;
> 
> That fixes it, I have no need for any LPM/suspend

Note that adding these 2 won't help if the host send U3 request.
	snps,dis_u2_susphy_quirk;
	snps,dis_u3_susphy_quirk;

That's just disabling the phy from going into lower power state. You
need to prevent the host from autosuspending and put the device in U3.

For usb2 speed, you only need "snps,usb2-gadget-lpm-disable".


> 
> > 
> > > 
> > > > 
> > > > If the host puts the gadget in suspend, the gadget won't be able to
> > > > communicate with the host until the host wakes the gadget up and starts
> > > > talking to the gadget again. The gadget may be able to signal the host
> > > > to wakeup via remote wakeup. Did you check if the device is in suspend?
> > > > If it's in suspend, is the gadget enabled with remote wakeup? Did the
> > > > NCM driver sent a remote wakeup signal to the host? I didn't verify, but
> > > > I suspect the NCM gadget driver isn't configured/implemented with remote
> > > > wakeup.
> > > 
> > > Then maybe NCM/RNDIS should inform/disable LPM in the device driver?
> > > One cannot have half an impl. of this feature.
> > 
> > Most drivers don't fully support every feature. They are implemented as
> > needed. I'm not familiar with NCM/RNDIS driver. Perhaps you can ping its
> > maintainer to see its current status to see if it needs to be updated.
> > Unless there's a quirk from the host/device, we shouldn't have to
> > disable LPM.
> > 
> Right but isn't LPM something else? One can read in Documentation/ABI/testing/sysfs-bus-usb:
> What:		/sys/bus/usb/devices/.../power/usb2_hardware_lpm
> Date:		September 2011
> Contact:	Andiry Xu <andiry.xu@xxxxxxx>
> Description:
> 		If CONFIG_PM is set and a USB 2.0 lpm-capable device is plugged
> 		in to a xHCI host which support link PM, it will perform a LPM
> 		test; if the test is passed and host supports USB2 hardware LPM
> 		(xHCI 1.0 feature), USB2 hardware LPM will be enabled for the
> 		device and the USB device directory will contain a file named
> 		power/usb2_hardware_lpm.  The file holds a string value (enable
> 		or disable) indicating whether or not USB2 hardware LPM is
> 		enabled for the device. Developer can write y/Y/1 or n/N/0 to
> 		the file to enable/disable the feature.
> 
> What:		/sys/bus/usb/devices/.../power/usb3_hardware_lpm_u1
> 		/sys/bus/usb/devices/.../power/usb3_hardware_lpm_u2
> Date:		November 2015
> Contact:	Kevin Strasser <kevin.strasser@xxxxxxxxxxxxxxx>
> 		Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
> Description:
> 		If CONFIG_PM is set and a USB 3.0 lpm-capable device is plugged
> 		in to a xHCI host which supports link PM, it will check if U1
> 		and U2 exit latencies have been set in the BOS descriptor; if
> 		the check is passed and the host supports USB3 hardware LPM,
> 		USB3 hardware LPM will be enabled for the device and the USB
> 		device directory will contain two files named
> 		power/usb3_hardware_lpm_u1 and power/usb3_hardware_lpm_u2. These
> 		files hold a string value (enable or disable) indicating whether
> 		or not USB3 hardware LPM U1 or U2 is enabled for the device.
> 
> This seems to indicate that LPM is on device driver/controller level rather than
> on higher levels like RNDIS/NCM ?

The controller will handle the LPM. However, the UDC driver will a get
notification from the controller if it goes in to suspend (L2). It will
in turn invoke the suspend/resume gadget driver's callback from the
RNDIS/NCM driver's ops. So, the RNDIS/NCM can keep track of whether the
gadget is in suspend to initiate remote wakeup.

> 
> 
> While I remember, I tried to create both a NCM and a ttyACM on top of my dwc3 gadget
> but then I got som bind error when activating the UDC. Is that expected ?
> I figured both could live on the same device and would just mux the two protocols.
> 

I'm not clear what you meant here. The gadget driver and the UDC driver
should be separated and abstracted from each other.

Also, please note that all this talking points are based on the
assumption that the issue is due to the host putting the device in
suspend base on your experiment. We didn't review the logs.

IMO, the best option should be to prevent suspend from the host side as
it looks like your device may operate in usb3 speed also?

BR,
Thinh




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

  Powered by Linux