[U-Boot] mpc5121 - EHCI problems with some (but not all) USB hubs
Damien Dusha
d.dusha at gmail.com
Fri Sep 25 06:00:23 CEST 2009
Hi Michael,
On Fri, Sep 25, 2009 at 9:19 AM, Damien Dusha <d.dusha at gmail.com> wrote:
> On Fri, Sep 25, 2009 at 2:04 AM, Michael Trimarchi
> <trimarchi at gandalf.sssup.it> wrote:
>> Damien Dusha wrote:
>>>
>>> Dear All,
>>>
>>> I am attempting to integrate the USB on the Freescale mpc5121
>>> processor on the mpc5121ads board from Silicon Turnkey for upgrades of
>>> kernel, u-boot etc.
>>>
>>> I have succeeded in integrating Francesco Rendine 's EHCI patch for
>>> the MPC5121 (see
>>> http://lists.denx.de/pipermail/u-boot/2009-June/055021.html ) and I
>>> have the general functionality of upgrading from a USB stick working
>>> straight from the USB, or through some (but not all) USB hubs.
>>>
>>> However, I am having problem using the driver with some (but not all)
>>> USB hubs. I have some USB hubs that work "out of the box", but I
>>> have other hubs that cause booting u-boot to hang after attempting to
>>> initialise the USB. The ones that do work, and the ones that fail all
>>> fail in the same place the great majority of the time (they succeed
>>> very occasionally).
>>>
>>> I have traced the hang to the following lines in
>>> drivers/usb/host/ehci-hcd.c:
>>>
>>> /* Wait for TDs to be processed. */
>>> ts = get_timer(0);
>>> vtd = td;
>>> do {
>>> /* Invalidate dcache */
>>> ehci_invalidate_dcache(&qh_list);
>>> token = hc32_to_cpu(vtd->qt_token);
>>> if (!(token & 0x80))
>>> break;
>>>
>>> /* This was my own line I added to check. The
>>> get_timer(ts) always returns 0 and never exits the loop */
>>> debug("get_timer: %d, CONFIG_SYS_HZ: %d\n",
>>> get_timer(ts), CONFIG_SYS_HZ);
>>> } while (get_timer(ts) < CONFIG_SYS_HZ);
>>>
>>
>> I think that the git_timer is not proprer implemented here and so
>> what happen if you go out the busy loop and return an error to the
>> message?
>> Can you try on another hardware with u-boot?
Today we've done a little more testing and indeed, the timer wasn't
ticking as expected. In this case, the fix was quite simple - I was
doing my auto-update routunes (which initialises the USB) in the
board-specific misc_init_r(void) function (which a couple of others
boards did), which, after studying lib_ppc/board.c is called _before_
interrupt_init(). Hence, interrupts were not enabled and therefore
the timer never ticked.
As a result, I've moved the auto-update routines to a
last_stage_init(void) function, which does it as the last thing before
getting into the main loop. It's interesting that configuring USB
doesn't bring it up somewhere in that init sequence of board_init_r,
but that's another question for another day.
While this solves the "hanging" issue previously reported, it does not
yet solve the hub bring-up problem. that I have previously reported
although I now have some new information from testing.
* If I cascade the "working" hubs, it will recognise the USB drive
and update as expected.\
* If I connect one of the USB 1.1 hubs (which are 4-port USB-Serial
devices) through a "working" hub, it will sometimes recognise the USB
stick, sometimes not, and sometimes appear to hang (or at least until
my patience runs out and I reset the board), and seems to be order
dependant (i.e. which ports on the "working" hub they are connected
to), though I am still gathering evidence on that point.
* If I connect more than one of the 4-port USB-Serial converters
(USB 1.1 hubs), through a "working" hub, I have only seen a hang
and/or failed recognitions.
* If I connect the "broken" USB high-speed hub anywhere in the
system, I get the following error messages:
USB: Register 10011 NbrPorts 1
USB EHCI 1.00
scanning bus for devices...
USB device not accepting new address (error=20)
4 USB Device(s) found
or
Entering "do_auto_update"
USB: Register 10011 NbrPorts 1
USB EHCI 1.00
scanning bus for devices... 3 USB Device(s) found
0 Storage Device(s) found
or, in one instance, it actually performs an upgrade:
USB: Register 10011 NbrPorts 1
USB EHCI 1.00
scanning bus for devices... 4 USB Device(s) found
1 Storage Device(s) found
Interface: USB
Device 0: Vendor: LEXAR Rev: 1100 Prod: JD FIREFLY
Type: Removable Hard Disk
Capacity: 960.0 MB = 0.9 GB (1966080 x 512)
Partition 1: Filesystem: FAT16 "NO NAME "
reading pre.img
.
In short, it's not at all reliable and I have some anecdotal evidence
it has to do with the ordering of the ports, though I will try to
gather more evidence to effect over the next little while.
I hope this information can help.
-- Damien
More information about the U-Boot
mailing list