Annotation of kernel/bsd/dev/ppc/drvUSBCMD/OHCIUIM.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /*
                     26:        File:           OHCIUIM.h
                     27: 
                     28:        Contains:       Header file for OHCIUIM.c
                     29: 
                     30:        Version:        xxx put version here xxx
                     31: 
                     32:        Written by:     Guillermo Gallegos
                     33: 
                     34:        Copyright:      � 1997-1998 by Apple Computer, Inc., all rights reserved.
                     35: 
                     36:        File Ownership:
                     37: 
                     38:                DRI:                            xxx put dri here xxx
                     39: 
                     40:                Other Contact:          xxx put other contact here xxx
                     41: 
                     42:                Technology:                     xxx put technology here xxx
                     43: 
                     44:        Writers:
                     45: 
                     46:                (TC)    Tom Clark
                     47:                (DRF)   Dave Falkenburg
                     48:                (BG)    Bill Galcher
                     49:                (DF)    David Ferguson
                     50:                (DKF)   David Ferguson
                     51:                (GG)    Guillermo Gallegos
                     52:                (CJK)   Craig Keithley
                     53:                (BT)    Barry Twycross
                     54: 
                     55:        Change History (most recent first):
                     56: 
                     57:         <USB41>          9/9/98        BT              Fix size of refcon in Isoc transfers
                     58:         <USB40>          9/3/98        GG              Add Isochronous Suppurt for Create, Abort, Delete endpoint and
                     59:                                                                        create transfers.
                     60:         <USB39>         8/12/98        BT              Move root hub back into UIM again.
                     61:         <USB38>          8/7/98        GG              Fixed Opti data corruption problem.
                     62:         <USB37>         7/10/98        TC              Back out <USB35>
                     63:         <USB36>         6/30/98        BT              Tidy up
                     64:         <USB35>         6/30/98        BT              Move Root hub sim into UIM
                     65:         <USB34>         6/14/98        DF              Add more Volatile keywords to the globals
                     66:         <USB33>          6/4/98        DRF             In UIMInitialize & UIMFinalize, add a Ptr to facilitate
                     67:                                                                        handing-off global state when performing replacement.
                     68:         <USB32>          6/3/98        GG              Added kOHCIFrameOverflowBit for frame overflows.
                     69:         <USB31>          6/2/98        GG              Add interfaces for UIMFrameCount, IsochEndpointCreate, and
                     70:                                                                        IsochTransfer.
                     71:         <USB30>          6/2/98        DRF             Added params to UIMInitialize & UIMFinalize for replacement.
                     72:         <USB29>         5/18/98        BG              Remove comma from final entry in enums so that they compile with
                     73:                                                                        no complaints from MrC.
                     74:         <USB28>         5/15/98        DF              keep last pointer to the various descriptor free lists
                     75:         <USB27>         5/14/98        GG              Added some constants to support Buffer Underrun Errata fix.
                     76:         <USB26>         5/14/98        DF              Add retryBufferUnderrun errata
                     77:         <USB25>         5/12/98        BT              fix spare comma
                     78:         <USB24>          5/5/98        GG              Change Buffersize from short to unsigned long in
                     79:                                                                        uimBulkTransfer.
                     80:         <USB23>          5/2/98        DF              Add volatile keyboard for variables updated by the interrupt
                     81:                                                                        handler, also added stuff for erratas
                     82:         <USB22>         4/29/98        BT              Move common errors to USBpriv
                     83:         <USB21>         4/24/98        GG              Added support for bulk transfers greater than 4k.  Added fix to
                     84:                                                                        support to clear an endpoint stall.
                     85:         <USB20>          4/9/98        BT              Use USB.h
                     86:                <19>      4/8/98        GG              Added Abort and Delete APIs.
                     87:                <18>      4/7/98        GG              Added Abort and delete apis.
                     88:                <17>     3/19/98        BT              Split UIM into UIM and root hub parts
                     89:                <16>     3/18/98        BT              Add reset enable change to root hub.
                     90:                <15>     3/18/98        GG              Added some constants
                     91:                <14>     3/11/98        BT              More int transaction simualtion
                     92:                <13>     2/25/98        GG              Added kOHCIUIMUiniqueNoDir.
                     93:                <12>     2/23/98        GG              Moved interrupt structure, changed OHCIData struct to hold array
                     94:                                                                        of InterruptHeads.
                     95:                <11>     2/20/98        GG              Added Interrupt Transfer Support.
                     96:                <10>     2/19/98        GG              Added Endpoint Creation Functionality.
                     97:          <USB9>         2/17/98        DKF             Add HW Interrupt related definitions and globals
                     98:                 <8>     2/12/98        GG              Added Rom in Ram Memory management support.
                     99:                 <7>      2/2/98        BT              Add bulk stuff
                    100:                 <6>     1/26/98        BT              Hack in clear enpoint stall
                    101:                 <5>    12/22/97        CJK             Add include of UIMSupport.h
                    102:                 <4>    12/19/97        BT              Temp hack, Make it a shared lib
                    103:                 <4>    30/11/97        BT              Various mods to get USL preveiw running
                    104:                <2*>    11/20/97        GG              Add callback parameter to bulk and control creators.
                    105:                 <2>    11/20/97        GG              Filled in contains field. Initial check in has minimal support
                    106:                                                                        for Root Hub, Control and Bulk transfers.
                    107:                 <1>    11/20/97        GG              first checked in
                    108: 
                    109: */
                    110: 
                    111: /* IMPORTANT NOTES:
                    112:    The generic UIM structures and typedefs needed by the Family Expert
                    113:    have been moved to the UIMSupport.h file in the Neptune:Interfaces
                    114:    folder.  Any UIM typedefs or structs that are not OHCI specific
                    115:    should be kept there, so that the family expert, etc., can have
                    116:    access to them without needing to be hardware saavy.  
                    117:    
                    118:    While that's the goal, the current reality is that some roothub
                    119:    support is performed in the USL, with special roothub dispatch
                    120:    entries needed for root hub functions.  So until the roothub
                    121:    simulation is implement in the UIM, you will find a small amount
                    122:    of USL & OHCI related items in UIMSupport.  These non-generic
                    123:    UIM thangs will need to be removed when roothub simulation
                    124:    moves from the USL to the UIM.
                    125: */
                    126: 
                    127: #ifndef __OHCIUIM__
                    128: #define __OHCIUIM__
                    129: 
                    130: #ifndef __TYPES__
                    131: //#include "types.h"
                    132: #endif
                    133: #ifndef __INTERRUPTS__
                    134: //#include "interrupts.h"
                    135: #endif
                    136: 
                    137: #include "USBpriv.h"
                    138: 
                    139: #ifdef __cplusplus
                    140: extern "C" {
                    141: #endif
                    142: 
                    143: #if PRAGMA_IMPORT_SUPPORTED
                    144: #pragma import on
                    145: #endif
                    146: 
                    147: #if PRAGMA_ALIGN_SUPPORTED
                    148: #pragma options align=power
                    149: #endif
                    150: 
                    151: /*zzz*/
                    152: /* Isn't this PCI standard stuff?  Shouldn't it be in some regular include */
                    153: /* file like PCI.h? */
                    154: //#include <PCI.h>
                    155: 
                    156: #define bit0                   0x00000001
                    157: #define bit1                   0x00000002
                    158: #define bit2                   0x00000004
                    159: #define bit3                   0x00000008
                    160: #define bit4                   0x00000010
                    161: #define bit5                   0x00000020
                    162: #define bit6                   0x00000040
                    163: #define bit7                   0x00000080
                    164: #define bit8                   0x00000100
                    165: #define bit9                   0x00000200
                    166: #define bit10                  0x00000400
                    167: #define bit11                  0x00000800
                    168: #define bit12                  0x00001000
                    169: #define bit13                  0x00002000
                    170: #define bit14                  0x00004000
                    171: #define bit15                  0x00008000
                    172: #define bit16                  0x00010000
                    173: #define bit17                  0x00020000
                    174: #define bit18                  0x00040000
                    175: #define bit19                  0x00080000
                    176: #define bit20                  0x00100000
                    177: #define bit21                  0x00200000
                    178: #define bit22                  0x00400000
                    179: #define bit23                  0x00800000
                    180: #define bit24                  0x01000000
                    181: #define bit25                  0x02000000
                    182: #define bit26                  0x04000000
                    183: #define bit27                  0x08000000
                    184: #define bit28                  0x10000000
                    185: #define bit29                  0x20000000
                    186: #define bit30                  0x40000000
                    187: #define bit31                  0x80000000
                    188: 
                    189: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
                    190: * * * * * *
                    191:  * Configuration Registers
                    192:  *
                    193:  */
                    194: enum {
                    195:        kConfigStart            = 0x00,
                    196:        cwVendorID                      = 0x00,                 /* 0x1000                                                                       */
                    197:        cwDeviceID                      = 0x02,                 /* 0x0003                                                                       */
                    198:        cwCommand                       = 0x04,
                    199:        cwStatus                        = 0x06,
                    200:        clClassCodeAndRevID     = 0x08,
                    201:        clHeaderAndLatency      = 0x0C,
                    202:        clBaseAddressZero       = 0x10,                 /* I/O Base address                                                     */
                    203:        clBaseAddressOne        = 0x14,                 /* Memory Base address                                          */
                    204:        clExpansionRomAddr      = 0x30,
                    205:        clLatGntIntPinLine      = 0x3C,                 /* Max_Lat, Max_Gnt, Int. Pin, Int. Line        */
                    206:        kConfigEnd                      = 0x40
                    207: };
                    208: 
                    209: /*
                    210:  * 0x04 cwCommand                                      Command Register (read/write)
                    211:  */
                    212: enum {
                    213:        cwCommandSERREnable                     = bit8,
                    214:        cwCommandEnableParityError      = bit6,
                    215:        cwCommandEnableBusMaster        = bit2,         /* Set this on initialization                   */
                    216:        cwCommandEnableMemorySpace      = bit1,         /* Respond at Base Address One if set   */
                    217:        cwCommandEnableIOSpace          = bit0          /* Respond at Base Address Zero if set  */
                    218: };
                    219: /*
                    220:  * 0x06 cwStatus                                       Status Register (read/write)
                    221:  */
                    222: enum {
                    223:        cwStatusDetectedParityError     = bit15,        /* Detected from slave                                  */
                    224:        cwStatusSignaledSystemError = bit14,    /* Device asserts SERR/ signal                  */
                    225:        cwStatusMasterAbort                     = bit13,        /* Master sets when transaction aborts  */
                    226:        cwStatusReceivedTargetAbort     = bit12,        /* Master sets when target-abort                */
                    227:        cwStatusDEVSELTimingMask        = (bit10 | bit9),       /* DEVSEL timing encoding R/O   */
                    228:         cwStatusDEVSELFastTiming       = 0,
                    229:         cwStatusDEVSELMediumTiming     = bit9,
                    230:         cwStatusDEVSELSlowTiming       = bit10,
                    231:        cwStatusDataParityReported      = bit8
                    232: };
                    233: 
                    234: /*zzz*/
                    235: 
                    236: 
                    237: ////////////////////////////////////////////////////////////////////////////////
                    238: //
                    239: // Useful macro defs.
                    240: //
                    241: 
                    242: #define EndianSwapImm32Bit(data32)                                     \
                    243: (                                                                                                      \
                    244:        (((UInt32) data32) >> 24)                               |               \
                    245:        ((((UInt32) data32) >> 8) & 0xFF00)             |               \
                    246:        ((((UInt32) data32) << 8) & 0xFF0000)   |               \
                    247:        (((UInt32) data32) << 24)                                               \
                    248: )
                    249: 
                    250: ////////////////////////////////////////////////////////////////////////////////
                    251: //
                    252: // OHCI type defs.
                    253: //
                    254: 
                    255: typedef volatile struct OHCIRegistersStruct
                    256:                                                                OHCIRegisters,
                    257:                                                                *OHCIRegistersPtr;
                    258: 
                    259: typedef struct OHCIIntHeadStruct
                    260:                                                                OHCIIntHead,
                    261:                                                                *OHCIIntHeadPtr;
                    262: 
                    263: typedef struct OHCIEndpointDescriptorStruct
                    264:                                                                OHCIEndpointDescriptor,
                    265:                                                                *OHCIEndpointDescriptorPtr;
                    266: 
                    267: typedef struct OHCIGeneralTransferDescriptorStruct
                    268:                                                                OHCIGeneralTransferDescriptor,
                    269:                                                                *OHCIGeneralTransferDescriptorPtr;
                    270: 
                    271: typedef struct OHCIIsochTransferDescriptorStruct
                    272:                                                                OHCIIsochTransferDescriptor,
                    273:                                                                *OHCIIsochTransferDescriptorPtr;
                    274: 
                    275: typedef struct OHCIUIMDataStruct
                    276:                                                                OHCIUIMData, *OHCIUIMDataPtr;
                    277:                                                                
                    278: typedef struct OHCIPhysicalLogicalStruct
                    279:                                                                OHCIPhysicalLogical,
                    280:                                                                *OHCIPhysicalLogicalPtr;
                    281: 
                    282: typedef struct ErrataListEntryStruct 
                    283:                                                                ErrataListEntry, 
                    284:                                                                *ErrataListEntryPtr;
                    285:                                                                
                    286: ////////////////////////////////////////////////////////////////////////////////
                    287: //
                    288: // OHCI type defs.
                    289: // (moved to UIMSupport.h so that the Expert can use them as well.)
                    290: 
                    291: ////////////////////////////////////////////////////////////////////////////////
                    292: //
                    293: // OHCI register file.
                    294: //
                    295: 
                    296: enum
                    297: {
                    298:        kOHCIBit0                                       = (1 << 0),
                    299:        kOHCIBit1                                       = (1 << 1),
                    300:        kOHCIBit2                                       = (1 << 2),
                    301:        kOHCIBit3                                       = (1 << 3),
                    302:        kOHCIBit4                                       = (1 << 4),
                    303:        kOHCIBit5                                       = (1 << 5),
                    304:        kOHCIBit6                                       = (1 << 6),
                    305:        kOHCIBit7                                       = (1 << 7),
                    306:        kOHCIBit8                                       = (1 << 8),
                    307:        kOHCIBit9                                       = (1 << 9),
                    308:        kOHCIBit10                                      = (1 << 10),
                    309:        kOHCIBit11                                      = (1 << 11),
                    310:        kOHCIBit12                                      = (1 << 12),
                    311:        kOHCIBit13                                      = (1 << 13),
                    312:        kOHCIBit14                                      = (1 << 14),
                    313:        kOHCIBit15                                      = (1 << 15),
                    314:        kOHCIBit16                                      = (1 << 16),
                    315:        kOHCIBit17                                      = (1 << 17),
                    316:        kOHCIBit18                                      = (1 << 18),
                    317:        kOHCIBit19                                      = (1 << 19),
                    318:        kOHCIBit20                                      = (1 << 20),
                    319:        kOHCIBit21                                      = (1 << 21),
                    320:        kOHCIBit22                                      = (1 << 22),
                    321:        kOHCIBit23                                      = (1 << 23),
                    322:        kOHCIBit24                                      = (1 << 24),
                    323:        kOHCIBit25                                      = (1 << 25),
                    324:        kOHCIBit26                                      = (1 << 26),
                    325:        kOHCIBit27                                      = (1 << 27),
                    326:        kOHCIBit28                                      = (1 << 28),
                    327:        kOHCIBit29                                      = (1 << 29),
                    328:        kOHCIBit30                                      = (1 << 30),
                    329:        kOHCIBit31                                      = (1 << 31)
                    330: };
                    331: 
                    332: #define OHCIBitRange(start, end)                                       \
                    333: (                                                                                                      \
                    334:        ((((UInt32) 0xFFFFFFFF) << (31 - (end))) >>             \
                    335:         ((31 - (end)) + (start))) <<                                   \
                    336:        (start)                                                                                 \
                    337: )
                    338: 
                    339: #define OHCIBitRangePhase(start, end)                          \
                    340:        (start)
                    341: 
                    342: 
                    343: // OHCI register file.
                    344: 
                    345: struct OHCIRegistersStruct
                    346: {
                    347:        // Control and status group.
                    348:        volatile UInt32                         hcRevision;
                    349:        volatile UInt32                         hcControl;
                    350:        volatile UInt32                         hcCommandStatus;
                    351:        volatile UInt32                         hcInterruptStatus;
                    352:        volatile UInt32                         hcInterruptEnable;
                    353:        volatile UInt32                         hcInterruptDisable;
                    354: 
                    355:        // Memory pointer group.
                    356:        volatile UInt32                         hcHCCA;
                    357:        volatile UInt32                         hcPeriodCurrentED;
                    358:        volatile UInt32                         hcControlHeadED;
                    359:        volatile UInt32                         hcControlCurrentED;
                    360:        volatile UInt32                         hcBulkHeadED;
                    361:        volatile UInt32                         hcBulkCurrentED;
                    362:        volatile UInt32                         hcDoneHead;
                    363: 
                    364:        // Frame counter group.
                    365:        volatile UInt32                         hcFmInterval;
                    366:        volatile UInt32                         hcFmRemaining;
                    367:        volatile UInt32                         hcFmNumber;
                    368:        volatile UInt32                         hcPeriodicStart;
                    369:        volatile UInt32                         hcLSThreshold;
                    370: 
                    371:        // Root hub group.
                    372:        volatile UInt32                         hcRhDescriptorA;
                    373:        volatile UInt32                         hcRhDescriptorB;
                    374:        volatile UInt32                         hcRhStatus;
                    375:        volatile UInt32                         hcRhPortStatus[1];
                    376: };
                    377: 
                    378: // hcControl register defs.
                    379: enum
                    380: {
                    381:        kOHCIHcControl_CBSR                     = OHCIBitRange (0, 1),
                    382:        kOHCIHcControl_CBSRPhase        = OHCIBitRangePhase (0, 1),
                    383:        kOHCIHcControl_PLE                      = kOHCIBit2,
                    384:        kOHCIHcControl_IE                       = kOHCIBit3,
                    385:        kOHCIHcControl_CLE                      = kOHCIBit4,
                    386:        kOHCIHcControl_BLE                      = kOHCIBit5,
                    387:        kOHCIHcControl_HCFS                     = OHCIBitRange (6, 7),
                    388:        kOHCIHcControl_HCFSPhase        = OHCIBitRangePhase (6, 7),
                    389:        kOHCIHcControl_IR                       = kOHCIBit8,
                    390:        kOHCIHcControl_RWC                      = kOHCIBit9,
                    391:        kOHCIHcControl_RWE                      = kOHCIBit10,
                    392: 
                    393:        kOHCIHcControl_Reserved         = OHCIBitRange (11, 31),
                    394: 
                    395:        kOHCIFunctionalState_Reset                      = 0,
                    396:        kOHCIFunctionalState_Resume                     = 1,
                    397:        kOHCIFunctionalState_Operational        = 2,
                    398:        kOHCIFunctionalState_Suspend            = 3
                    399: };
                    400: 
                    401: // hcCommandStatus register defs.
                    402: enum
                    403: {
                    404:        kOHCIHcCommandStatus_HCR                = kOHCIBit0,
                    405:        kOHCIHcCommandStatus_CLF                = kOHCIBit1,
                    406:        kOHCIHcCommandStatus_BLF                = kOHCIBit2,
                    407:        kOHCIHcCommandStatus_OCR                = kOHCIBit3,
                    408:        kOHCIHcCommandStatus_SOC                = OHCIBitRange (16, 17),
                    409:        kOHCIHcCommandStatus_SOCPhase   = OHCIBitRangePhase (16, 17),
                    410: 
                    411:        kOHCIHcCommandStatus_Reserved   = OHCIBitRange (4, 15) | OHCIBitRange (18, 31)
                    412: };
                    413: 
                    414: // hcInterrupt register defs.
                    415: enum
                    416: {
                    417:        kOHCIHcInterrupt_SO                             = kOHCIBit0,
                    418:        kOHCIHcInterrupt_WDH                    = kOHCIBit1,
                    419:        kOHCIHcInterrupt_SF                             = kOHCIBit2,
                    420:        kOHCIHcInterrupt_RD                             = kOHCIBit3,
                    421:        kOHCIHcInterrupt_UE                             = kOHCIBit4,
                    422:        kOHCIHcInterrupt_FNO                    = kOHCIBit5,
                    423:        kOHCIHcInterrupt_RHSC                   = kOHCIBit6,
                    424:        kOHCIHcInterrupt_OC                             = kOHCIBit30,
                    425:        kOHCIHcInterrupt_MIE                    = kOHCIBit31
                    426: };
                    427: 
                    428: // this is what I would like it to be
                    429: //#define kOHCIDefaultInterrupts               (kOHCIHcInterrupt_SO | kOHCIHcInterrupt_WDH | kOHCIHcInterrupt_UE | kOHCIHcInterrupt_FNO | kOHCIHcInterrupt_RHSC)
                    430: #define kOHCIDefaultInterrupts         (kOHCIHcInterrupt_WDH | kOHCIHcInterrupt_UE | kOHCIHcInterrupt_FNO)
                    431:        
                    432: 
                    433: // hcFmInterval register defs.
                    434: enum
                    435: {
                    436:        kOHCIHcFmInterval_FI                    = OHCIBitRange (0, 13),
                    437:        kOHCIHcFmInterval_FIPhase               = OHCIBitRangePhase (0, 13),
                    438:        kOHCIHcFmInterval_FSMPS                 = OHCIBitRange (16, 30),
                    439:        kOHCIHcFmInterval_FSMPSPhase    = OHCIBitRangePhase (16, 30),
                    440:        kOHCIHcFmInterval_FIT                   = kOHCIBit31,
                    441: 
                    442:        kOHCIHcFmInterval_Reserved              = OHCIBitRange (14, 15)
                    443: };
                    444: 
                    445: // hcRhDescriptorA register defs.
                    446: enum
                    447: {
                    448:        kOHCIHcRhDescriptorA_NDP                        = OHCIBitRange (0, 7),
                    449:        kOHCIHcRhDescriptorA_NDPPhase           = OHCIBitRangePhase (0, 7),
                    450:        kOHCIHcRhDescriptorA_PSM                        = kOHCIBit8,
                    451:        kOHCIHcRhDescriptorA_NPS                        = kOHCIBit9,
                    452:        kOHCIHcRhDescriptorA_DT                         = kOHCIBit10,
                    453:        kOHCIHcRhDescriptorA_OCPM                       = kOHCIBit11,
                    454:        kOHCIHcRhDescriptorA_NOCP                       = kOHCIBit12,
                    455:        kOHCIHcRhDescriptorA_POTPGT                     = OHCIBitRange (24, 31),
                    456:        kOHCIHcRhDescriptorA_POTPGTPhase        = OHCIBitRangePhase (24, 31),
                    457: 
                    458:        kOHCIHcRhDescriptorA_Reserved           = OHCIBitRange (13,23)
                    459: };
                    460: 
                    461: // Root hub sttaus reg
                    462: 
                    463: // Barry, not moved to OHCIRootHub.h
                    464: 
                    465: 
                    466: // Port status reg 
                    467: 
                    468: // Barry, not moved to OHCIRootHub.h
                    469: 
                    470: 
                    471: 
                    472: // Config space defs.
                    473: enum
                    474: {
                    475:        kOHCIConfigRegBaseAddressRegisterNumber = 0x10
                    476: };
                    477: 
                    478: 
                    479: enum
                    480: {
                    481:        kOHCIEDControl_FA                       = OHCIBitRange (0,  6),
                    482:        kOHCIEDControl_FAPhase          = OHCIBitRangePhase (0, 6),
                    483:        kOHCIEDControl_EN                       = OHCIBitRange (7, 10),
                    484:        kOHCIEDControl_ENPhase          = OHCIBitRangePhase (7, 10),
                    485:        kOHCIEDControl_D                        = OHCIBitRange (11, 12),
                    486:        kOHCIEDControl_DPhase           = OHCIBitRangePhase (11, 12),
                    487:        kOHCIEDControl_S                        = OHCIBitRange (13, 13),
                    488:        kOHCIEDControl_SPhase           = OHCIBitRangePhase (13, 13),
                    489:        kOHCIEDControl_K                        = kOHCIBit14,
                    490:        kOHCIEDControl_F                        = OHCIBitRange (15, 15),
                    491:        kOHCIEDControl_FPhase           = OHCIBitRangePhase (15, 15),
                    492:        kOHCIEDControl_MPS                      = OHCIBitRange (16, 26),
                    493:        kOHCIEDControl_MPSPhase         = OHCIBitRangePhase (16, 26),
                    494: 
                    495:        kOHCITailPointer_tailP          = OHCIBitRange (4, 31),
                    496:        kOHCITailPointer_tailPPhase     = OHCIBitRangePhase (4, 31),
                    497: 
                    498:        kOHCIHeadPointer_H                      = kOHCIBit0,
                    499:        kOHCIHeadPointer_C                      = kOHCIBit1,
                    500:        kOHCIHeadPointer_headP          = OHCIBitRange (4, 31),
                    501:        kOHCIHeadPointer_headPPhase     = OHCIBitRangePhase (4, 31),
                    502: 
                    503:        kOHCINextEndpointDescriptor_nextED              = OHCIBitRange (4, 31),
                    504:        kOHCINextEndpointDescriptor_nextEDPhase = OHCIBitRangePhase (4, 31),
                    505: 
                    506:        kOHCIEDDirectionTD                      = 0,
                    507:        kOHCIEDDirectionOut                     = 1,
                    508:        kOHCIEDDirectionIn                      = 2,
                    509: 
                    510:        kOHCIEDSpeedFull                        = 0,
                    511:        kOHCIEDSpeedLow                         = 1,
                    512: 
                    513:        kOHCIEDFormatGeneralTD          = 0,
                    514:        kOHCIEDFormatIsochronousTD      = 1
                    515: };
                    516: 
                    517: // General Transfer Descriptor
                    518: enum
                    519: {
                    520:        kOHCIGTDControl_R                       = kOHCIBit18,
                    521:        kOHCIGTDControl_DP                      = OHCIBitRange (19, 20),
                    522:        kOHCIGTDControl_DPPhase         = OHCIBitRangePhase (19, 20),
                    523:        kOHCIGTDControl_DI                      = OHCIBitRange (21, 23),
                    524:        kOHCIGTDControl_DIPhase         = OHCIBitRangePhase (21, 23),
                    525:        kOHCIGTDControl_T                       = OHCIBitRange (24, 25),
                    526:        kOHCIGTDControl_TPhase          = OHCIBitRangePhase (24, 25),
                    527:        kOHCIGTDControl_EC                      = OHCIBitRange (26, 27),
                    528:        kOHCIGTDControl_ECPhase         = OHCIBitRangePhase (26, 27),
                    529:        kOHCIGTDControl_CC                      = OHCIBitRange (28, 31),
                    530:        kOHCIGTDControl_CCPhase         = OHCIBitRangePhase (28, 31),
                    531: 
                    532:        kOHCIGTDPIDSetup                        = 0,
                    533:        kOHCIGTDPIDOut                          = 1,
                    534:        kOHCIGTDPIDIn                           = 2,
                    535: 
                    536:        kOHCIGTDNoInterrupt                     = 7,
                    537: 
                    538:        kOHCIGTDDataToggleCarry         = 0,
                    539:        kOHCIGTDDataToggle0                     = 2,
                    540:        kOHCIGTDDataToggle1                     = 3,
                    541: 
                    542:        kOHCIGTDConditionNoError                                = 0,
                    543:        kOHCIGTDConditionCRC                                    = 1,
                    544:        kOHCIGTDConditionBitStuffing                    = 2,
                    545:        kOHCIGTDConditionDataToggleMismatch             = 3,
                    546:        kOHCIGTDConditionStall                                  = 4,
                    547:        kOHCIGTDConditionDeviceNotResponding    = 5,
                    548:        kOHCIGTDConditionPIDCheckFailure                = 6,
                    549:        kOHCIGTDConditionUnexpectedPID                  = 7,
                    550:        kOHCIGTDConditionDataOverrun                    = 8,
                    551:        kOHCIGTDConditionDataUnderrun                   = 9,
                    552:        kOHCIGTDConditionBufferOverrun                  = 12,
                    553:        kOHCIGTDConditionBufferUnderrun                 = 13,
                    554:        kOHCIGTDConditionNotAccessed                    = 15
                    555: };
                    556: 
                    557: // Isochronous Transfer Descriptor
                    558: enum
                    559: {
                    560:        kOHCIITDControl_SF                                              = OHCIBitRange (0,15),
                    561:        kOHCIITDControl_SFPhase                                 = OHCIBitRangePhase(0,15),                              
                    562:        kOHCIITDControl_DI                                              = OHCIBitRange (21,23),
                    563:        kOHCIITDControl_DIPhase                                 = OHCIBitRangePhase (21,23),
                    564:        kOHCIITDControl_FC                                              = OHCIBitRange (24,26),
                    565:        kOHCIITDControl_FCPhase                                 = OHCIBitRangePhase (24,26),
                    566:        kOHCIITDControl_CC                                              = OHCIBitRange (28,31),
                    567:        kOHCIITDControl_CCPhase                                 = OHCIBitRangePhase (28,31),
                    568:        kOHCIITDPSW_Size                                                = OHCIBitRange(0,10),
                    569:        kOHCIITDPSW_SizePhase                                   = OHCIBitRangePhase(0,10),
                    570:        kOHCIITDPSW_CC                                                  = OHCIBitRange(12,15),
                    571:        kOHCIITDPSW_CCPhase                                     = OHCIBitRangePhase(12,15),
                    572:        kOHCIITDPSW_CCNA                                                = OHCIBitRange(13,15),
                    573:        kOHCIITDPSW_CCNAPhase                                   = OHCIBitRangePhase(13,15),
                    574:        kOHCIITDOffset_Size                                             = OHCIBitRange(0,10),
                    575:        kOHCIITDOffset_SizePhase                                = OHCIBitRangePhase(0,10),
                    576:        kOHCIITDOffset_PC                                               = OHCIBitRange(12,12),
                    577:        kOHCIITDOffset_PCPhase                                  = OHCIBitRangePhase(12,12),
                    578:        kOHCIITDOffset_CC                                               = OHCIBitRange(13,15),
                    579:        kOHCIITDOffset_CCPhase                                  = OHCIBitRangePhase(13,15),
                    580:        kOHCIITDConditionNoError                                = 0,
                    581:        kOHCIITDConditionCRC                                    = 1,
                    582:        kOHCIITDConditionBitStuffing                    = 2,
                    583:        kOHCIITDConditionDataToggleMismatch             = 3,
                    584:        kOHCIITDConditionStall                                  = 4,
                    585:        kOHCIITDConditionDeviceNotResponding    = 5,
                    586:        kOHCIITDConditionPIDCheckFailure                = 6,
                    587:        kOHCIITDConditionUnExpectedPID                  = 7,
                    588:        kOHCIITDConditionDataOverrun                    = 8,
                    589:        kOHCIITDConditionDataUnderrun                   = 9,
                    590:        kOHCIITDConditionBufferOverrun                  = 12,
                    591:        kOHCIITDConditionBufferUnderrun                 = 13,
                    592:        kOHCIITDConditionNotAccessed                    = 7,
                    593:        kOHCIITDConditionNotAccessedReturn              = 15,
                    594:        kOHCIITDConditionNotCrossPage                   = 0,
                    595:        kOHCIITDConditionCrossPage                              = 1
                    596: };
                    597: 
                    598: 
                    599: 
                    600: // misc definitions -- most of these need to be cleaned up/replaced with better terms defined previously
                    601: 
                    602: enum
                    603: {
                    604: // Barry, note - Root hub defines moved to OHCIRootHub.h
                    605: 
                    606:        kOHCIEndpointNumberOffset               = 7,
                    607:        kOHCIEndpointDirectionOffset    = 11,
                    608:        kOHCIMaxPacketSizeOffset                = 16,
                    609:        kOHCISpeedOffset                                = 13,
                    610:        kOHCIBufferRoundingOffset               = 18,
                    611:        kOHCIDirectionOffset                    = 19,
                    612:        kENOffset                                               = 7,
                    613: 
                    614:        kUniqueNumMask                                  = OHCIBitRange (0, 12),
                    615:        kUniqueNumNoDirMask                             = OHCIBitRange (0, 10),
                    616:        kOHCIHeadPMask                                  = OHCIBitRange (4, 31),
                    617:        kOHCIInterruptSOFMask                   = kOHCIHcInterrupt_SF,
                    618:        kOHCISkipped                                    = kOHCIEDControl_K,
                    619:        kOHCIDelayIntOffset                             = 21,
                    620:        kOHCIMaxPages                                   = 20,                   //arbitrary value for #of pages to use in prepare memory for io
                    621:        kOHCIPageSize                                   = 4096,
                    622:        kOHCIEndpointDirectionMask              = OHCIBitRange (11, 12),
                    623:        kOHCIEDToggleBitMask                    = OHCIBitRange (1, 1),
                    624:        kOHCIGTDClearErrorMask                  = OHCIBitRange (0, 25)
                    625: };
                    626: 
                    627: 
                    628: // errataBits contents
                    629: enum {
                    630:        kErrataCMDDisableTestMode               = kOHCIBit0,            // turn off UHCI test mode
                    631:        kErrataOnlySinglePageTransfers  = kOHCIBit1,            // Don't cross page boundaries in a single transfer
                    632:        kErrataRetryBufferUnderruns             = kOHCIBit2,            // UIM will retry out transfers with buffer underrun errors
                    633:        kErrataLSHSOpti                                 = kOHCIBit3                     // UIM will insert delay buffer between HS and LS transfers
                    634: };
                    635: 
                    636: enum {
                    637:        kOHCIBulkTransferOutType                = 1,
                    638:        kOHCIBulkTransferInType                 = 2,
                    639:        kOHCIControlSetupType                   = 3,
                    640:        kOHCIControlDataType                    = 4,
                    641:        kOHCIControlStatusType                  = 5,
                    642:        kOHCIInterruptInType                    = 6,
                    643:        kOHCIInterruptOutType                   = 7,
                    644:        kOHCIOptiLSBug                                  = 8,
                    645:        kOHCIIsochronousType                    = 9
                    646: };
                    647: 
                    648: enum {
                    649:        kOHCIFrameOffset                                = 16,
                    650:        kOHCIFmNumberMask                               = OHCIBitRange (0, 15),
                    651:        kOHCIFrameOverflowBit                   = kOHCIBit16,
                    652:        kOHCIMaxRetrys                                  = 20
                    653: 
                    654: };
                    655: 
                    656: ////////////////////////////////////////////////////////////////////////////////
                    657: //
                    658: // OHCI UIM data records.
                    659: //
                    660: 
                    661: typedef short RootHubID;
                    662: 
                    663: // Interrupt head struct
                    664: struct OHCIIntHeadStruct
                    665: {
                    666:        OHCIEndpointDescriptorPtr                               pHead;
                    667:        OHCIEndpointDescriptorPtr                               pTail;
                    668:        UInt32                                                                  pHeadPhysical;
                    669:        int                                                                             nodeBandwidth;
                    670: };
                    671: //naga
                    672: typedef int ohciRegEntryID;
                    673: struct OHCIUIMDataStruct
                    674: {
                    675:        RegEntryID                                                                      ohciRegEntryID;                 // Name Registry entry of OHCI.
                    676: //     UIMID                                                                           uimID;                                  // ID for OHCI UIM.
                    677:        RootHubID                                                                       rootHubID;                              // Status of root hub, if 0, not initialized otherwise has virtual ID number
                    678:        UInt32                                                                          errataBits;                             // various bits for chip erratas
                    679: 
                    680:        OHCIRegistersPtr                                                        pOHCIRegisters;                 // Pointer to base address of OHCI registers.
                    681:        Ptr                                                                                     pHCCA,                                  // Pointer to HCCA.
                    682:                                                                                                pHCCAAllocation;                // Pointer to memory allocated for HCCA.
                    683:        OHCIIntHead                                                                     pInterruptHead[63];             // ptr to private list of all interrupts heads                  
                    684:        volatile UInt32                                                         pIsochHead;                             // ptr to Isochtonous list
                    685:        volatile UInt32                                                         pIsochTail;                             // ptr to Isochtonous list
                    686:        volatile UInt32                                                         pBulkHead;                              // ptr to Bulk list
                    687:        volatile UInt32                                                         pControlHead;                   // ptr to Control list
                    688:        volatile UInt32                                                         pBulkTail;                              // ptr to Bulk list
                    689:        volatile UInt32                                                         pControlTail;                   // ptr to Control list
                    690:        volatile OHCIPhysicalLogicalPtr                         pPhysicalLogical;               // ptr to list of memory maps
                    691:        volatile OHCIGeneralTransferDescriptorPtr       pFreeTD;                                // list of availabble Trasfer Descriptors
                    692:        volatile OHCIIsochTransferDescriptorPtr         pFreeITD;                               // list of availabble Trasfer Descriptors
                    693:        volatile OHCIEndpointDescriptorPtr                      pFreeED;                                // list of available Endpoint Descriptors
                    694:        volatile OHCIGeneralTransferDescriptorPtr       pLastFreeTD;                    // last of availabble Trasfer Descriptors
                    695:        volatile OHCIIsochTransferDescriptorPtr         pLastFreeITD;                   // last of availabble Trasfer Descriptors
                    696:        volatile OHCIEndpointDescriptorPtr                      pLastFreeED;                    // last of available Endpoint Descriptors
                    697:        volatile OHCIGeneralTransferDescriptorPtr       pPendingTD;                             // list of non processed Trasfer Descriptors
                    698: 
                    699:        UInt32                                                                          pageSize;                               // OS Logical page size
                    700:        
                    701:        InterruptSetMember                                                      interruptSetMember;
                    702:        void                                                                            *oldInterruptRefCon;
                    703:        InterruptHandler                                                        oldInterruptHandler;
                    704:        InterruptEnabler                                                        interruptEnabler;
                    705:        InterruptDisabler                                                       interruptDisabler;
                    706:        struct  {
                    707:                volatile UInt32                                                 scheduleOverrun;                // updated by the interrupt handler
                    708:                volatile UInt32                                                 unrecoverableError;             // updated by the interrupt handler
                    709:                volatile UInt32                                                 frameNumberOverflow;    // updated by the interrupt handler
                    710:                volatile UInt32                                                 ownershipChange;                // updated by the interrupt handler
                    711:        } errors;
                    712:        volatile UInt64                                                         frameNumber;
                    713:        UInt16                                                                          rootHubFuncAddress;             // Funciotn Address for the root hub
                    714:        int                                                                                     OptiOn;
                    715: 
                    716: };
                    717: 
                    718: struct OHCIEndpointDescriptorStruct
                    719: {
                    720:        UInt32                                          dWord0;                         // control
                    721:        UInt32                                          dWord1;                         // pointer to last TD
                    722:        UInt32                                          dWord2;                         // pointer to first TD
                    723:        UInt32                                          dWord3;                         // Pointer to next ED
                    724:        UInt32                                          pVirtualNext;
                    725:        UInt32                                          pPhysical;
                    726:        UInt32                                          pVirtualTailP;
                    727:        UInt32                                          pVirtualHeadP;
                    728: };
                    729: struct OHCIGeneralTransferDescriptorStruct
                    730: {
                    731:        volatile UInt32                         dWord0;                         // Data controlling transfer.
                    732:        volatile UInt32                         dWord1;                         // Current buffer pointer.
                    733:        volatile UInt32                         dWord2;                         // Pointer to next transfer descriptor.
                    734:        UInt32                                          dWord3;                         // Pointer to end of buffer.
                    735:        CallBackFuncPtr                         CallBack;                       // only used if last TD, other wise its  nil
                    736:        long                                            refcon;                         // 
                    737:        UInt32                                          pPhysical;
                    738:        UInt32                                          pVirtualNext;
                    739:        UInt32                                          pType;
                    740:        UInt32                                          pEndpoint;                      // pointer to TD's Endpoint
                    741:        UInt32                                          bufferSize;                     // used only by control transfers to keep track of data buffers size leftover
                    742:        IOPreparationID                         preparationID;          // used for CheckpointIO
                    743: };
                    744: 
                    745: struct OHCIIsochTransferDescriptorStruct
                    746: {
                    747:        UInt32                                          dWord0;                         // Condition code/FrameCount/DelayInterrrupt/StartingFrame.
                    748:        UInt32                                          dWord1;                         // Buffer Page 0.
                    749:        UInt32                                          dWord2;                         // Pointer to next transfer descriptor.
                    750:        UInt32                                          dWord3;                         // Pointer to end of buffer.
                    751:        UInt16                                          offset[8];
                    752: /*
                    753:        UInt32                                          dWord4;                         // offset1/PSW1 - offset0/PSW0
                    754:        UInt32                                          dWord5;                         // offset3/PSW3 - offset2/PSW2
                    755:        UInt32                                          dWord6;                         // offset5/PSW5 - offset4/PSW4
                    756:        UInt32                                          dWord7;                         // offset7/PSW7 - offset6/PSW6
                    757: */
                    758:        UInt32                                          pType;                          // type of descriptor, must always be in this position
                    759:        IsocCallBackFuncPtr                     handler;                        // callback for Isoch transactions
                    760:        UInt32                                          pPhysical;                      // physical address of ITD
                    761:        UInt32                                          pVirtualNext;           // virtual ptr to next ITD
                    762:        UInt32                                          pIsocFrame;                     // ptr to USLs status and length array
                    763:        UInt32                                          refcon;                         // callback reference
                    764:        UInt32                                          frameNum;                       //      index to pIsocFrame array
                    765:        UInt32                                          reserve2;                       // 
                    766: };
                    767: 
                    768: struct OHCIPhysicalLogicalStruct
                    769: {
                    770:        UInt32                                          LogicalStart;
                    771:        UInt32                                          LogicalEnd;
                    772:        UInt32                                          PhysicalStart;
                    773:        UInt32                                          PhysicalEnd;
                    774:        UInt32                                          type;
                    775:        UInt32                                          pNext;
                    776:        
                    777: };
                    778: 
                    779: struct ErrataListEntryStruct {
                    780:        UInt16                                          vendID;
                    781:        UInt16                                          deviceID;
                    782:        UInt16                                          revisionLo;
                    783:        UInt16                                          revisionHi;
                    784:        UInt32                                          errata;
                    785: };
                    786: 
                    787: 
                    788: //Globals -yuck  (Barry, made more global to share with root hub)
                    789: 
                    790: 
                    791: 
                    792: 
                    793: 
                    794: int OHCIUIMInitialize(unsigned long);
                    795: 
                    796: OSStatus OHCIUIMFinalize(
                    797:        Boolean                                         beingReplaced,
                    798:        Ptr     *                                               savedStatePtr);
                    799: 
                    800: OSStatus OHCIUIMControlEDCreate(
                    801:        UInt8                                           functionNumber,
                    802:        UInt8                                           endpointNumber,
                    803:        UInt16                                          maxPacketSize,
                    804:        UInt8                                           speed);
                    805: 
                    806: OSStatus OHCIUIMControlTransfer(
                    807:        UInt32                                          refcon,
                    808:        CallBackFuncPtr                         handler,
                    809:        UInt32                                          CBP,
                    810:        Boolean                                         bufferRounding,
                    811:        short                                           functionNumber,
                    812:        short                                           endpointNumber,
                    813:        short                                           bufferSize,
                    814:        short                                           direction);
                    815: 
                    816: OSStatus OHCIUIMControlEDDelete(
                    817:        short                                           functionNumber,
                    818:        short                                           endpointNumber);
                    819: 
                    820: OSStatus OHCIUIMClearEndPointStall(
                    821:        short                                           functionNumber,
                    822:        short                                           endpointNumber,
                    823:        short                                           direction);
                    824: 
                    825: OSStatus OHCIUIMBulkEDCreate(
                    826:        UInt8                                           functionAddress,
                    827:        UInt8                                           endpointNumber,
                    828:        UInt8                                           maxPacketSize,
                    829:        UInt8                                           speed);
                    830: 
                    831: OSStatus OHCIUIMBulkTransfer(
                    832:        UInt32                                          refcon,
                    833:        CallBackFuncPtr                         handler,
                    834:        UInt32                                          CBP,
                    835:        Boolean                                         bufferRounding,
                    836:        short                                           functionNumber,
                    837:        short                                           endpointNumber,
                    838:        UInt32                                          bufferSize,
                    839:        short                                           direction);
                    840: 
                    841: OSStatus OHCIUIMBulkEDDelete(
                    842:        short                                           functionNumber,
                    843:        short                                           endpointNumber,
                    844:        short                                           direction);
                    845: 
                    846: OSStatus OHCIUIMInterruptEDCreate(
                    847:        short                                           functionNumber,
                    848:        short                                           endPointNumber,
                    849:        short                                           speed,
                    850:        UInt16                                          maxPacketSize,
                    851:        short                                           pollingRate,
                    852:        UInt32                                          reserveBandwidth);
                    853: 
                    854: OSStatus OHCIUIMInterruptTransfer(
                    855:        short                                           functionNumber,
                    856:        short                                           endpointNumber,
                    857:        UInt32                                          refcon,
                    858:        CallBackFuncPtr                         handler,
                    859:        UInt32                                          CBP,
                    860:        Boolean                                         bufferRounding,
                    861:        short                                           bufferSize);
                    862: 
                    863: OSStatus OHCIProcessDoneQueue(void);
                    864: 
                    865: OSStatus OHCIUIMAbortEndpoint(
                    866:        short                                           functionNumber,
                    867:        short                                           endpointNumber,
                    868:        short                                           direction);
                    869: 
                    870: OSStatus       OHCIUIMEndpointDelete(
                    871:        short                                           functionNumber,
                    872:        short                                           endpointNumber,
                    873:        short                                           direction);
                    874: 
                    875: UInt64 OHCIUIMGetCurrentFrameNumber(void);
                    876: 
                    877: OSStatus OHCIUIMIsochEDCreate(
                    878:        short                                           functionAddress,
                    879:        short                                           endpointNumber,
                    880:        UInt32                                          maxPacketSize,
                    881:        UInt8                                           direction);
                    882:        
                    883: OSStatus OHCIUIMIsochTransfer(
                    884:        short                                           functionAddress,                                                
                    885:        short                                           endpointNumber, 
                    886:        UInt32                                          refcon,
                    887:        UInt8                                           direction,
                    888:        IsocCallBackFuncPtr                     pIsochHandler,                                                  
                    889:        UInt64                                          frameNumberStart,                                                               
                    890:        UInt32                                          pBufferStart,                                                   
                    891:        UInt32                                          frameCount,                                                                     
                    892:        USBIsocFrame                            *pFrames);                                                              
                    893: 
                    894: // BT Root hub internal functions
                    895: 
                    896: OSStatus RootHubFrame(void *p1, void *p2);
                    897: OSStatus RootHubStatusChange(void *p1, void *p2);
                    898: 
                    899: Boolean OHCISetOurAddress(uslBusRef bus, UInt16 addr);
                    900: 
                    901: void OHCISetFrameInterrupt(void);
                    902: OSStatus UIMSimulateRootHubStages(
                    903:        UInt32                                          refcon,
                    904:        CallBackFuncPtr                         handler,
                    905:        UInt32                                          CBP,
                    906:        Boolean                                         bufferRounding,
                    907:        short                                           endpointNumber,
                    908:        short                                           bufferSize,
                    909:        short                                           direction);
                    910: 
                    911: void SimulateRootHubInt(UInt8 endpoint, UInt8 *buf, UInt32 bufLen,
                    912:                                                CallBackFuncPtr handler, UInt32 refCon);
                    913: 
                    914: void OHCIPollRootHubSim(uslBusRef bus);
                    915: 
                    916: void ResetRootHubSimulation(void);
                    917: 
                    918: #if PRAGMA_ALIGN_SUPPORTED
                    919: #pragma options align=reset
                    920: #endif
                    921: 
                    922: #if PRAGMA_IMPORT_SUPPORTED
                    923: #pragma import off
                    924: #endif
                    925: 
                    926: #ifdef __cplusplus
                    927: }
                    928: #endif
                    929: 
                    930: #endif /* __OHCIUIM__ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.