linux-mips
[Top] [All Lists]

Re: ALCHEMY: AU1200 USB Host Controller (OHCI/EHCI)

To: Jordan Crouse <jordan.crouse@amd.com>
Subject: Re: ALCHEMY: AU1200 USB Host Controller (OHCI/EHCI)
From: Matej Kupljen <matej.kupljen@ultra.si>
Date: Wed, 04 Jan 2006 13:12:06 +0100
Cc: linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net, matthias.lenk@amd.com
In-reply-to: <20060103155447.GI15770@cosmic.amd.com>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20051208210042.GB17458@cosmic.amd.com> <1136298329.6765.22.camel@localhost.localdomain> <20060103155447.GI15770@cosmic.amd.com>
Sender: linux-mips-bounce@linux-mips.org
Hi

(After some confusion about kernel version, I think I found the
problem, sorry about that).

I used binutils 2.15 and 2.16.1, but did not work.

The code in the ehci-hcd.c looks like this:
----------------------------------------------------------------------------
        ehci->periodic_size = DEFAULT_I_TDPS;
        if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
                return retval;

        /* controllers may cache some of the periodic schedule ... */
        hcc_params = readl(&ehci->caps->hcc_params);
        if (HCC_ISOC_CACHE(hcc_params))         // full frame cache
                ehci->i_thresh = 8;
        else                                    // N microframes cached
                ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
----------------------------------------------------------------------------

The problem is *AFTER* the call to ehci_mem_init, where a read from
ehci->caps->hcc_params is attempted, but caps is NULL.

This can be seen by this assembly code form Insight:
----------------------------------------------------------------------------
0x80350758      jal     0x802a3f40 <memset>
0x8035075c      sll     a2,a2,0x2
0x80350760      lw      v1,0(s0)
0x80350764      lw      a2,8(v1)

s0 points to ehci
at offset 0 from ehci is caps
and at offset 8 from caps is hcc_params
----------------------------------------------------------------------------

Where should the caps be initialized?
The only place, where it is set in drivers/usb/ is in
drivers/usb/host/ehci-pci.c:
----------------------------------------------------------------------------
/* called during probe() after chip reset completes */
static int ehci_pci_setup(struct usb_hcd *hcd)
{
        struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
        struct pci_dev          *pdev =
to_pci_dev(hcd->self.controller);
        u32                     temp;
        int                     retval;

        ehci->caps = hcd->regs;
----------------------------------------------------------------------------
But the ehci-pci.c is not included in the compilation, because at the
end of ehci-hcd.c we find:
----------------------------------------------------------------------------
#if defined(CONFIG_SOC_AU1X00)
#include "ehci-au1xxx.c"
#elif defined(CONFIG_PCI)
#include "ehci-pci.c"
#else
#error "missing bus glue for ehci-hcd"
#endif
----------------------------------------------------------------------------

What should be done?
I hope this helps.

BR,
Matej


<Prev in Thread] Current Thread [Next in Thread>