HI !

While browsing Apple new "Darwin" kernel source, I found some interesting
things about USB host controller erratas along with workarounds for some
of those bugs.
Here are some bits extracted from various Darwin source file.

Note that the source of Darwin is under the Apple licence. So just in
case, I copy there legal stuff now before the source bits...

 * The contents of this file constitute Original Code as defined in and
 * are subject to the Apple Public Source License Version 1.1 (the
 * "License").  You may not use this file except in compliance with the
 * License.  Please obtain a copy of the License at
 * http://www.apple.com/publicsource and read it before using this file.

Well, now the interesting stuffs. First, they define some "errata bits"
that are extracted from a table:

/*
 * Errata
 * These indicate the anomolies of the various chips sets.  Test
 * for these in errataBits.
 */
enum {
    // turn off UHCI test mode
    kErrataCMDDisableTestMode           = (1 << 0),
    // Don't cross page boundaries in a single transfer
    kErrataOnlySinglePageTransfers      = (1 << 1),
    // UIM will retry out transfers with buffer underrun errors
    kErrataRetryBufferUnderruns         = (1 << 2),
    // UIM will insert delay buffer between HS and LS transfers
    kErrataLSHSOpti                     = (1 << 3),
    // Always set the NOCP bit in rhDescriptorA register
    kErrataDisableOvercurrent           = (1 << 4),
    // Don't allow port suspend at the root hub
    kErrataLucentSuspendResume          = (1 << 5)
};
/* errataBits */

/*
    This table contains the list of errata that are necessary for known
problems with particular devices.
    The format is vendorID, product ID, lowest revisionID needing errata,
highest rev needing errata, errataBits.
    The result of all matches is ORed together, so more than one entry
may match.
    Typically for a given errata a list of revisions that this applies to
is supplied.
*/

struct ErrataListEntryStruct {
    UInt16                              vendID;
    UInt16                              deviceID;
    UInt16                              revisionLo;
    UInt16                              revisionHi;
    UInt32                              errata;
};


/*
 This table contains the list of errata that are necessary for known
 problems with particular silicon.  The format is vendorID, revisionID,
 lowest revisionID needing errata, highest rev needing errata, errataBits.
 The result of all matches is ORed together, so more than one entry may
 match.  Typically for a given errata a list of chips revisions that
 this applies to is supplied.
 */
static ErrataListEntry  errataList[] = {
    // CMD 670
    {0x1095, 0x670, 0, 0xffff,  kErrataCMDDisableTestMode |
                                kErrataOnlySinglePageTransfers |
                                kErrataRetryBufferUnderruns},
    // Opti 1045
    {0x1045, 0xc861, 0, 0xffff, kErrataLSHSOpti},
};

Then, they have bits of code here or there to work around those bugs. For
the LSHSOpti bug, for example, at controller init, they add dummy EDs to
almost all lists and start processing a kind of "dummy" transfer loop. 

If one if you want to look at this in more details, go to
publicsource.apple.com and see how you can get access to the source (the
kernel can be obtained via CVS if you register first, which is a simple
operation).


Ben.






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to