On Fri, Sep 25, 2009 at 2:04 AM, Michael Trimarchi <trimar...@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?
Yesterday, we tried the following: /* Add long delay before entering the loop */ udelay(10000); /* Wait for TDs to be processed. */ /* Remove the loop and exit immediately. Do not wait for timer */ // 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; // debug("get_timer: %d, CONFIG_SYS_HZ: %d\n", get_timer(ts), CONFIG_SYS_HZ); //} while (get_timer(ts) < CONFIG_SYS_HZ); With the following result: * If only "working" hubs and a USB stick is attached, it will do our auto upgrade sequence as normal. * If a "broken" hub is present, U-Boot will report that the devices are found, but will not actually read a USB stick attached to the hub. It will not read a stick, even if the stick is attached to a "working" hub, and the "broken" hub is cascaded off the working hub. Unfortunately, I have no other EHCI hardware available - only a 5200LITE and a AVR32 dev board in the back of the cupboard somewhere. -- Damien. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot