[U-Boot] DWC2 driver issues

Dinh Nguyen
2015-02-19T22:21:43Z

On Thu, 19 Feb 2015, Marek Vasut wrote:

+cc: John Youn

John took over the maintainership of the DWC2 driver in linux as Paul
Zimmerman is no longer at Synopsys.
> On Monday, February 16, 2015 at 07:28:45 PM, Stephen Warren wrote:
> > Marek,
>
> Hello Stephen,
>
> > Following on from my Google+ post about DWC2/RPi USB host controller
> > issues in U-Boot.
> >
> > There are 3 issues I've identified so far:
>
> so far :)
>
> > 1)
> >
> > On an RPi with the DWC2 controller connected directly to a single
> > external USB connector (i.e model A, A+), a LS (and perhaps FS) device
> > pluged directly into the board doesn't work due to the small max packet
> > size limit.
> >
> > Your patch 9b1161af8c51 "usb: dwc2: Add support for multi-packet control
> > xfers" in u-boot-usb.git topic/dwc2 addresses this issue for control
> > transfers at least. With your patch, I can now enumerate a USB kbd on a
> > model A+. That's a great improvement; thanks for the quick response with
> > a patch.
>
> Jeroen was complaining about the same thing, so I cooked this preliminary
> patch. I'm CCing him. Glad it helped, but I think the patch needs further
> work.
>
> > However, when I enable CONFIG_USB_KEYBOARD, I see errors when the USB
> >
> > keyboard input driver initializes:
> > > starting USB...
> > > USB0: Core Release: 2.80a
> > > scanning bus 0 for devices... 3 USB Device(s) found
> > >
> > > scanning usb for storage devices... 0 Storage Device(s) found
> > > scanning usb for ethernet devices... 0 Ethernet Device(s) found
> > >
> > > dev = 0df92ac0 pipe = 0x40408380 buf = 0db4a780 size = 8 int = 10
> > > Failed to get keyboard state from device 413c:2010
> >
> > I haven't investigated this further yet.
>
> Wow, this error is new, I have not seen this one on SoCFPGA.
>
> > 2)
> >
> > On any RPi with a HS USB hub connected between the DWC2 controller and
> > an LS/FS device (e.g. model A/A+ with external hub, model B/B+ with
> > on-board hub), LS/FS devices don't work since the driver needs to issue
> > USB "split transactions".
>
> Yep. CCing Hans, the USB Guru.
>
> > This involves communicating with the
> > Transaction Translator in the USB hub nearest to the LS/FS device.
> > Namely, performing each transaction first with DWC2_HCSPLT_SPLTENA, then
> > repeating (perhaps polling until we get the final response?) it with
> > DWC2_HCSPLT_COMPSPLT to pick up the response.
> >
> > Reference:
> >
> > http://www.usbmadesimple.co.uk/ums_7.htm#split_trans
> >
> > http://am.renesas.com/applications/key_technology/connectivity/usb/about_us
> > b/usb2_0/usb2_8/index.jsp
> >
> > To fully cover both (1) and (2) for all types of transfer, I think we
> > should create a couple functions to do the low-level handling of USB
> > transfers:
> >
> > a) Perform a large transfer by splitting it up into smaller
> > transactions, each as large as the max packet size. This is what your
> > patch does, but perhaps it'd be better as a separate function so the
> > logic can be shared with transfer types other than control; I assume
> > this size-based splitting is relevant everywhere?
>
> Yes, and in case you look closely, the functions for doing control and
> bulk transfers are almost identical in their "core" mechanics.
>
> > b) Perform an individual transfer on the wire. This will optionally
> > perform split transactions when necessary. I'm sure this will be needed
> > by all transaction types.
>
> Yes.
>
> > Existing code that invokes USB transfers will call (a) once. (a) will
> > call (b) as many times as needed to break up the packet into small
> > chunks. (b) will either send the transaction to the HW (HS devices or
> > directly attached LS/FS devices), or perform the split transaction
> > handling (remotely attached LS/FS devices).
> >
> > Does that sound like a reasonable approach?
> >
> > I can start looking into getting split transactions going; I just
> > couldn't motivate myself last Friday night.
>
> Do you plan to do this on the USB stack level or USB controller driver
> level please ?
>
> > 3)
> >
> > On the RPI 2, even directly attached HS devices (i.e. the on-board USB
> > hub, Ethernet) don't work correctly. I haven't tracked down the cause
> > yet, since I got side-tracked on the two issues above, initially
> > thinking they might have the same/similar root-cause. However, I don't
> > think this issue is related, since the RPi2 on-board devices don't fall
> > into either of the categories above.
>
> Do you get some kind of an error message ?
>
> > In theory, the HW should work the same since both the BCM2835/2836 have
> > the same rev of the DWC2 controller. The only difference is the CPUs and
> > perhaps some bus logic. I vaguely wonder about memory barrier or timing
> > issues, but who knows yet.
>
> Which controller version is that, 2.80a in both ? I recall SoCFPGA has 2.93,
> just for reference. I also recall there was some bug in the DWC2 lower than
> 2.90 (?), I don't remember the exact details, but this should be documented
> in the DWC2 driver source code.
>

Yes, SoCFPGA has v2.93.

BR,
Dinh