Annotation of XNU/iokit/Drivers/usb/drvAppleOHCI/OHCI.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: #include <IOKit/IOTypes.h>
                     23: 
                     24: typedef        char *Ptr;
                     25: 
                     26: #define bit0                   0x00000001
                     27: #define bit1                   0x00000002
                     28: #define bit2                   0x00000004
                     29: #define bit3                   0x00000008
                     30: #define bit4                   0x00000010
                     31: #define bit5                   0x00000020
                     32: #define bit6                   0x00000040
                     33: #define bit7                   0x00000080
                     34: #define bit8                   0x00000100
                     35: #define bit9                   0x00000200
                     36: #define bit10                  0x00000400
                     37: #define bit11                  0x00000800
                     38: #define bit12                  0x00001000
                     39: #define bit13                  0x00002000
                     40: #define bit14                  0x00004000
                     41: #define bit15                  0x00008000
                     42: #define bit16                  0x00010000
                     43: #define bit17                  0x00020000
                     44: #define bit18                  0x00040000
                     45: #define bit19                  0x00080000
                     46: #define bit20                  0x00100000
                     47: #define bit21                  0x00200000
                     48: #define bit22                  0x00400000
                     49: #define bit23                  0x00800000
                     50: #define bit24                  0x01000000
                     51: #define bit25                  0x02000000
                     52: #define bit26                  0x04000000
                     53: #define bit27                  0x08000000
                     54: #define bit28                  0x10000000
                     55: #define bit29                  0x20000000
                     56: #define bit30                  0x40000000
                     57: #define bit31                  0x80000000
                     58: 
                     59: 
                     60: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
                     61:  * Configuration Registers
                     62:  *
                     63:  */
                     64: enum {
                     65:         kConfigStart           = 0x00,
                     66:         cwVendorID             = 0x00, /* 0x1000 */
                     67:         cwDeviceID             = 0x02, /* 0x0003 */
                     68:         cwCommand              = 0x04,
                     69:         cwStatus               = 0x06,
                     70:         clClassCodeAndRevID    = 0x08,
                     71:         clHeaderAndLatency     = 0x0C,
                     72:         clBaseAddressZero      = 0x10, /* I/O Base address */
                     73:         clBaseAddressOne       = 0x14, /* Memory Base address */
                     74:         clExpansionRomAddr     = 0x30,
                     75:         clLatGntIntPinLine     = 0x3C, /* Max_Lat, Max_Gnt, Int. Pin, Int. Line */
                     76:         kConfigEnd             = 0x40
                     77: };
                     78: 
                     79: /*
                     80:  * 0x04 cwCommand      Command Register (read/write)
                     81:  */
                     82: enum {
                     83:        cwCommandSERREnable             = bit8,
                     84:        cwCommandEnableParityError      = bit6,
                     85:        cwCommandEnableBusMaster        = bit2, /* Set this on initialization   */
                     86:        cwCommandEnableMemorySpace      = bit1, /* Respond at Base Address One if set   */
                     87:        cwCommandEnableIOSpace          = bit0  /* Respond at Base Address Zero if set  */
                     88: };
                     89: /*
                     90:  * 0x06 cwStatus       Status Register (read/write)
                     91:  */
                     92: enum {
                     93:        cwStatusDetectedParityError     = bit15, /* Detected from slave                 */
                     94:        cwStatusSignaledSystemError     = bit14, /* Device asserts SERR/ signal         */
                     95:        cwStatusMasterAbort             = bit13, /* Master sets when transaction aborts */
                     96:        cwStatusReceivedTargetAbort     = bit12, /* Master sets when target-abort       */
                     97:        cwStatusDEVSELTimingMask        = (bit10 | bit9), /* DEVSEL timing encoding R/O */
                     98:        cwStatusDEVSELFastTiming        = 0,
                     99:        cwStatusDEVSELMediumTiming      = bit9,
                    100:        cwStatusDEVSELSlowTiming        = bit10,
                    101:        cwStatusDataParityReported      = bit8
                    102: };
                    103: 
                    104: 
                    105: ////////////////////////////////////////////////////////////////////////////////
                    106: //
                    107: // OHCI type defs.
                    108: //
                    109: typedef UInt32         PhysicalPtr;
                    110: 
                    111: typedef struct OHCIRegistersStruct
                    112:                     OHCIRegisters,
                    113:                     *OHCIRegistersPtr;
                    114: 
                    115: typedef struct OHCIIntHeadStruct
                    116:                     OHCIIntHead,
                    117:                     *OHCIIntHeadPtr;
                    118: 
                    119: typedef struct OHCIEndpointDescriptorStruct
                    120:                     OHCIEndpointDescriptor,
                    121:                     *OHCIEndpointDescriptorPtr;
                    122: 
                    123: typedef struct OHCIGeneralTransferDescriptorStruct
                    124:                     OHCIGeneralTransferDescriptor,
                    125:                     *OHCIGeneralTransferDescriptorPtr;
                    126: 
                    127: typedef struct OHCIIsochTransferDescriptorStruct
                    128:                     OHCIIsochTransferDescriptor,
                    129:                     *OHCIIsochTransferDescriptorPtr;
                    130: 
                    131: typedef struct OHCIUIMDataStruct
                    132:                     OHCIUIMData,
                    133:                     *OHCIUIMDataPtr;
                    134: 
                    135: typedef struct OHCIPhysicalLogicalStruct
                    136:                     OHCIPhysicalLogical,
                    137:                     *OHCIPhysicalLogicalPtr;
                    138: 
                    139: 
                    140: ////////////////////////////////////////////////////////////////////////////////
                    141: //
                    142: // OHCI register file.
                    143: //
                    144: 
                    145: enum
                    146: {
                    147:         kOHCIBit0                                      = (1 << 0),
                    148:         kOHCIBit1                                      = (1 << 1),
                    149:         kOHCIBit2                                      = (1 << 2),
                    150:         kOHCIBit3                                      = (1 << 3),
                    151:         kOHCIBit4                                      = (1 << 4),
                    152:         kOHCIBit5                                      = (1 << 5),
                    153:         kOHCIBit6                                      = (1 << 6),
                    154:         kOHCIBit7                                      = (1 << 7),
                    155:         kOHCIBit8                                      = (1 << 8),
                    156:         kOHCIBit9                                      = (1 << 9),
                    157:         kOHCIBit10                                     = (1 << 10),
                    158:         kOHCIBit11                                     = (1 << 11),
                    159:         kOHCIBit12                                     = (1 << 12),
                    160:         kOHCIBit13                                     = (1 << 13),
                    161:         kOHCIBit14                                     = (1 << 14),
                    162:         kOHCIBit15                                     = (1 << 15),
                    163:         kOHCIBit16                                     = (1 << 16),
                    164:         kOHCIBit17                                     = (1 << 17),
                    165:         kOHCIBit18                                     = (1 << 18),
                    166:         kOHCIBit19                                     = (1 << 19),
                    167:         kOHCIBit20                                     = (1 << 20),
                    168:         kOHCIBit21                                     = (1 << 21),
                    169:         kOHCIBit22                                     = (1 << 22),
                    170:         kOHCIBit23                                     = (1 << 23),
                    171:         kOHCIBit24                                     = (1 << 24),
                    172:         kOHCIBit25                                     = (1 << 25),
                    173:         kOHCIBit26                                     = (1 << 26),
                    174:         kOHCIBit27                                     = (1 << 27),
                    175:         kOHCIBit28                                     = (1 << 28),
                    176:         kOHCIBit29                                     = (1 << 29),
                    177:         kOHCIBit30                                     = (1 << 30),
                    178:         kOHCIBit31                                     = (1 << 31)
                    179: };
                    180: 
                    181: #define OHCIBitRange(start, end)                               \
                    182: (                                                              \
                    183:         ((((UInt32) 0xFFFFFFFF) << (31 - (end))) >>            \
                    184:          ((31 - (end)) + (start))) <<                          \
                    185:         (start)                                                        \
                    186: )
                    187: 
                    188: #define OHCIBitRangePhase(start, end)                          \
                    189:         (start)
                    190: 
                    191: 
                    192: // OHCI register file.
                    193: 
                    194: struct OHCIRegistersStruct
                    195: {
                    196:         // Control and status group.
                    197:         volatile UInt32                hcRevision;
                    198:         volatile UInt32                hcControl;
                    199:         volatile UInt32                hcCommandStatus;
                    200:         volatile UInt32                hcInterruptStatus;
                    201:         volatile UInt32                hcInterruptEnable;
                    202:         volatile UInt32                hcInterruptDisable;
                    203: 
                    204:         // Memory pointer group.
                    205:         volatile UInt32                hcHCCA;
                    206:         volatile UInt32                hcPeriodCurrentED;
                    207:         volatile UInt32                hcControlHeadED;
                    208:         volatile UInt32                hcControlCurrentED;
                    209:         volatile UInt32                hcBulkHeadED;
                    210:         volatile UInt32                hcBulkCurrentED;
                    211:         volatile UInt32                hcDoneHead;
                    212: 
                    213:         // Frame counter group.
                    214:         volatile UInt32                hcFmInterval;
                    215:         volatile UInt32                hcFmRemaining;
                    216:         volatile UInt32                hcFmNumber;
                    217:         volatile UInt32                hcPeriodicStart;
                    218:         volatile UInt32                hcLSThreshold;
                    219: 
                    220:         // Root hub group.
                    221:         volatile UInt32                hcRhDescriptorA;
                    222:         volatile UInt32                hcRhDescriptorB;
                    223:         volatile UInt32                hcRhStatus;
                    224:         volatile UInt32                hcRhPortStatus[1];
                    225: };
                    226: 
                    227: typedef struct OHCIRegistersStruct *OHCIRegistersPtr;
                    228: 
                    229: // hcControl register defs.
                    230: enum
                    231: {
                    232:         kOHCIHcControl_CBSR            = OHCIBitRange (0, 1),
                    233:         kOHCIHcControl_CBSRPhase       = OHCIBitRangePhase (0, 1),
                    234:         kOHCIHcControl_PLE             = kOHCIBit2,
                    235:         kOHCIHcControl_IE              = kOHCIBit3,
                    236:         kOHCIHcControl_CLE             = kOHCIBit4,
                    237:         kOHCIHcControl_BLE             = kOHCIBit5,
                    238:         kOHCIHcControl_HCFS            = OHCIBitRange (6, 7),
                    239:         kOHCIHcControl_HCFSPhase       = OHCIBitRangePhase (6, 7),
                    240:         kOHCIHcControl_IR              = kOHCIBit8,
                    241:         kOHCIHcControl_RWC             = kOHCIBit9,
                    242:         kOHCIHcControl_RWE             = kOHCIBit10,
                    243: 
                    244:         kOHCIHcControl_Reserved                = OHCIBitRange (11, 31),
                    245: 
                    246:         kOHCIFunctionalState_Reset             = 0,
                    247:         kOHCIFunctionalState_Resume            = 1,
                    248:         kOHCIFunctionalState_Operational       = 2,
                    249:         kOHCIFunctionalState_Suspend           = 3
                    250: };
                    251: 
                    252: // hcCommandStatus register defs.
                    253: enum
                    254: {
                    255:         kOHCIHcCommandStatus_HCR       = kOHCIBit0,
                    256:         kOHCIHcCommandStatus_CLF       = kOHCIBit1,
                    257:         kOHCIHcCommandStatus_BLF       = kOHCIBit2,
                    258:         kOHCIHcCommandStatus_OCR       = kOHCIBit3,
                    259:         kOHCIHcCommandStatus_SOC       = OHCIBitRange (16, 17),
                    260:         kOHCIHcCommandStatus_SOCPhase  = OHCIBitRangePhase (16, 17),
                    261: 
                    262:         kOHCIHcCommandStatus_Reserved  = OHCIBitRange (4, 15) | OHCIBitRange (18, 31)
                    263: };
                    264: 
                    265: // hcInterrupt register defs.
                    266: enum
                    267: {
                    268:         kOHCIHcInterrupt_SO            = kOHCIBit0,
                    269:         kOHCIHcInterrupt_WDH           = kOHCIBit1,
                    270:         kOHCIHcInterrupt_SF            = kOHCIBit2,
                    271:         kOHCIHcInterrupt_RD            = kOHCIBit3,
                    272:         kOHCIHcInterrupt_UE            = kOHCIBit4,
                    273:         kOHCIHcInterrupt_FNO           = kOHCIBit5,
                    274:         kOHCIHcInterrupt_RHSC          = kOHCIBit6,
                    275:         kOHCIHcInterrupt_OC            = kOHCIBit30,
                    276:         kOHCIHcInterrupt_MIE           = kOHCIBit31
                    277: };
                    278: 
                    279: // this is what I would like it to be
                    280: //#define kOHCIDefaultInterrupts               (kOHCIHcInterrupt_SO | kOHCIHcInterrupt_WDH | kOHCIHcInterrupt_UE | kOHCIHcInterrupt_FNO | kOHCIHcInterrupt_RHSC)
                    281: #define kOHCIDefaultInterrupts         (kOHCIHcInterrupt_WDH | kOHCIHcInterrupt_UE | kOHCIHcInterrupt_FNO)
                    282: 
                    283: 
                    284: // hcFmInterval register defs.
                    285: enum
                    286: {
                    287:         kOHCIHcFmInterval_FI           = OHCIBitRange (0, 13),
                    288:         kOHCIHcFmInterval_FIPhase      = OHCIBitRangePhase (0, 13),
                    289:         kOHCIHcFmInterval_FSMPS                = OHCIBitRange (16, 30),
                    290:         kOHCIHcFmInterval_FSMPSPhase   = OHCIBitRangePhase (16, 30),
                    291:         kOHCIHcFmInterval_FIT          = kOHCIBit31,
                    292: 
                    293:         kOHCIHcFmInterval_Reserved     = OHCIBitRange (14, 15)
                    294: };
                    295: 
                    296: enum
                    297: {
                    298:         kOHCIMax_OverHead              = 210   // maximum bit time overhead for a xaction
                    299: };
                    300: 
                    301: 
                    302: // hcRhDescriptorA register defs.
                    303: enum
                    304: {
                    305:     kOHCIHcRhDescriptorA_NDP           = OHCIBitRange (0, 7),
                    306:     kOHCIHcRhDescriptorA_NDPPhase      = OHCIBitRangePhase (0, 7),
                    307:     kOHCIHcRhDescriptorA_PSM           = kOHCIBit8,
                    308:     kOHCIHcRhDescriptorA_NPS           = kOHCIBit9,
                    309:     kOHCIHcRhDescriptorA_DT            = kOHCIBit10,
                    310:     kOHCIHcRhDescriptorA_OCPM          = kOHCIBit11,
                    311:     kOHCIHcRhDescriptorA_NOCP          = kOHCIBit12,
                    312:     kOHCIHcRhDescriptorA_POTPGT                = OHCIBitRange (24, 31),
                    313:     kOHCIHcRhDescriptorA_POTPGTPhase   = OHCIBitRangePhase (24, 31),
                    314: 
                    315:     kOHCIHcRhDescriptorA_Reserved      = OHCIBitRange (13,23)
                    316: };
                    317: 
                    318: 
                    319: // hcRhDescriptorB register defs.
                    320: enum
                    321: {
                    322:     kOHCIHcRhDescriptorB_DR            = OHCIBitRange (0, 15),
                    323:     kOHCIHcRhDescriptorB_DRPhase       = OHCIBitRangePhase (0, 15),
                    324:     kOHCIHcRhDescriptorB_PPCM          = OHCIBitRange (16, 31),
                    325:     kOHCIHcRhDescriptorB_PPCMPhase     = OHCIBitRangePhase (16, 31)
                    326: };
                    327: 
                    328: 
                    329: // Config space defs.
                    330: enum
                    331: {
                    332:     kOHCIConfigRegBaseAddressRegisterNumber    = 0x10
                    333: };
                    334: 
                    335: 
                    336: enum
                    337: {
                    338:     kOHCIEDControl_FA                  = OHCIBitRange (0,  6),
                    339:     kOHCIEDControl_FAPhase             = OHCIBitRangePhase (0, 6),
                    340:     kOHCIEDControl_EN                  = OHCIBitRange (7, 10),
                    341:     kOHCIEDControl_ENPhase             = OHCIBitRangePhase (7, 10),
                    342:     kOHCIEDControl_D                   = OHCIBitRange (11, 12),
                    343:     kOHCIEDControl_DPhase              = OHCIBitRangePhase (11, 12),
                    344:     kOHCIEDControl_S                   = OHCIBitRange (13, 13),
                    345:     kOHCIEDControl_SPhase              = OHCIBitRangePhase (13, 13),
                    346:     kOHCIEDControl_K                   = kOHCIBit14,
                    347:     kOHCIEDControl_F                   = OHCIBitRange (15, 15),
                    348:     kOHCIEDControl_FPhase              = OHCIBitRangePhase (15, 15),
                    349:     kOHCIEDControl_MPS                 = OHCIBitRange (16, 26),
                    350:     kOHCIEDControl_MPSPhase            = OHCIBitRangePhase (16, 26),
                    351: 
                    352:     kOHCITailPointer_tailP             = OHCIBitRange (4, 31),
                    353:     kOHCITailPointer_tailPPhase                = OHCIBitRangePhase (4, 31),
                    354: 
                    355:     kOHCIHeadPointer_H                 = kOHCIBit0,
                    356:     kOHCIHeadPointer_C                 = kOHCIBit1,
                    357:     kOHCIHeadPointer_headP             = OHCIBitRange (4, 31),
                    358:     kOHCIHeadPointer_headPPhase                = OHCIBitRangePhase (4, 31),
                    359: 
                    360:     kOHCINextEndpointDescriptor_nextED         = OHCIBitRange (4, 31),
                    361:     kOHCINextEndpointDescriptor_nextEDPhase    = OHCIBitRangePhase (4, 31),
                    362: 
                    363:     kOHCIEDDirectionTD                 = 0,
                    364:     kOHCIEDDirectionOut                        = 1,
                    365:     kOHCIEDDirectionIn                 = 2,
                    366: 
                    367:     kOHCIEDSpeedFull                   = 0,
                    368:     kOHCIEDSpeedLow                    = 1,
                    369: 
                    370:     kOHCIEDFormatGeneralTD             = 0,
                    371:     kOHCIEDFormatIsochronousTD         = 1
                    372: };
                    373: 
                    374: typedef  UInt8 OHCIEDFormat;   // really only need 1 bit
                    375: 
                    376: // General Transfer Descriptor
                    377: enum
                    378: {
                    379:     kOHCIGTDControl_R                  = kOHCIBit18,
                    380:     kOHCIGTDControl_DP                 = OHCIBitRange (19, 20),
                    381:     kOHCIGTDControl_DPPhase            = OHCIBitRangePhase (19, 20),
                    382:     kOHCIGTDControl_DI                 = OHCIBitRange (21, 23),
                    383:     kOHCIGTDControl_DIPhase            = OHCIBitRangePhase (21, 23),
                    384:     kOHCIGTDControl_T                  = OHCIBitRange (24, 25),
                    385:     kOHCIGTDControl_TPhase             = OHCIBitRangePhase (24, 25),
                    386:     kOHCIGTDControl_EC                 = OHCIBitRange (26, 27),
                    387:     kOHCIGTDControl_ECPhase            = OHCIBitRangePhase (26, 27),
                    388:     kOHCIGTDControl_CC                 = OHCIBitRange (28, 31),
                    389:     kOHCIGTDControl_CCPhase            = OHCIBitRangePhase (28, 31),
                    390: 
                    391:     kOHCIGTDPIDSetup                   = 0,
                    392:     kOHCIGTDPIDOut                     = 1,
                    393:     kOHCIGTDPIDIn                      = 2,
                    394: 
                    395:     kOHCIGTDNoInterrupt                        = 7,
                    396: 
                    397:     kOHCIGTDDataToggleCarry            = 0,
                    398:     kOHCIGTDDataToggle0                        = 2,
                    399:     kOHCIGTDDataToggle1                        = 3,
                    400: 
                    401:     kOHCIGTDConditionNoError           = 0,
                    402:     kOHCIGTDConditionCRC               = 1,
                    403:     kOHCIGTDConditionBitStuffing       = 2,
                    404:     kOHCIGTDConditionDataToggleMismatch        = 3,
                    405:     kOHCIGTDConditionStall             = 4,
                    406:     kOHCIGTDConditionDeviceNotResponding       = 5,
                    407:     kOHCIGTDConditionPIDCheckFailure   = 6,
                    408:     kOHCIGTDConditionUnexpectedPID     = 7,
                    409:     kOHCIGTDConditionDataOverrun       = 8,
                    410:     kOHCIGTDConditionDataUnderrun      = 9,
                    411:     kOHCIGTDConditionBufferOverrun     = 12,
                    412:     kOHCIGTDConditionBufferUnderrun    = 13,
                    413:     kOHCIGTDConditionNotAccessed       = 15
                    414: };
                    415: 
                    416: // Isochronous Transfer Descriptor
                    417: enum
                    418: {
                    419:     kOHCIITDControl_SF                 = OHCIBitRange (0,15),
                    420:     kOHCIITDControl_SFPhase            = OHCIBitRangePhase(0,15),                              
                    421:     kOHCIITDControl_DI                 = OHCIBitRange (21,23),
                    422:     kOHCIITDControl_DIPhase            = OHCIBitRangePhase (21,23),
                    423:     kOHCIITDControl_FC                 = OHCIBitRange (24,26),
                    424:     kOHCIITDControl_FCPhase            = OHCIBitRangePhase (24,26),
                    425:     kOHCIITDControl_CC                 = OHCIBitRange (28,31),
                    426:     kOHCIITDControl_CCPhase            = OHCIBitRangePhase (28,31),
                    427: 
                    428:     // The Offset/PSW words have two slightly different formats depending on whether they have been accessed
                    429:     // by the host controller or not.   They are initialized in Offset format, with 3-bit of condition code (=NOTACCESSED)
                    430:     // if the OHCI controller accesses this frame it fills in the 4-bit condition code, and the PSW size field contains
                    431:     // the number of bytes transferred IN, or 0 for an OUT transaction.
                    432: 
                    433:     // PSW format bit field definitions
                    434:     kOHCIITDPSW_Size                   = OHCIBitRange(0,10),
                    435:     kOHCIITDPSW_SizePhase              = OHCIBitRangePhase(0,10),
                    436:     kOHCIITDPSW_CC                     = OHCIBitRange(12,15),
                    437:     kOHCIITDPSW_CCPhase                = OHCIBitRangePhase(12,15),
                    438:     kOHCIITDPSW_CCNA                   = OHCIBitRange(13,15),
                    439:     kOHCIITDPSW_CCNAPhase              = OHCIBitRangePhase(13,15),
                    440: 
                    441:     // offset format bit field definitions
                    442:     kOHCIITDOffset_Size                        = OHCIBitRange(0,11),
                    443:     kOHCIITDOffset_SizePhase           = OHCIBitRangePhase(0,11),
                    444:     kOHCIITDOffset_PC                  = OHCIBitRange(12,12),
                    445:     kOHCIITDOffset_PCPhase             = OHCIBitRangePhase(12,12),
                    446:     kOHCIITDOffset_CC                  = OHCIBitRange(13,15),
                    447:     kOHCIITDOffset_CCPhase             = OHCIBitRangePhase(13,15),
                    448:     kOHCIITDConditionNoError           = 0,
                    449:     kOHCIITDConditionCRC               = 1,
                    450:     kOHCIITDConditionBitStuffing       = 2,
                    451:     kOHCIITDConditionDataToggleMismatch        = 3,
                    452:     kOHCIITDConditionStall             = 4,
                    453:     kOHCIITDConditionDeviceNotResponding = 5,
                    454:     kOHCIITDConditionPIDCheckFailure   = 6,
                    455:     kOHCIITDConditionUnExpectedPID     = 7,
                    456:     kOHCIITDConditionDataOverrun       = 8,
                    457:     kOHCIITDConditionDataUnderrun      = 9,
                    458:     kOHCIITDConditionBufferOverrun     = 12,
                    459:     kOHCIITDConditionBufferUnderrun    = 13,
                    460:     kOHCIITDOffsetConditionNotAccessed = 7,    // note that this is the "Offset" variant (3-bit) of this condition code
                    461:     kOHCIITDConditionNotAccessedReturn = 15,
                    462:     kOHCIITDConditionNotCrossPage      = 0,
                    463:     kOHCIITDConditionCrossPage         = 1
                    464: };
                    465: 
                    466: 
                    467: 
                    468: // misc definitions -- most of these need to be cleaned up/replaced with better terms defined previously
                    469: 
                    470: enum
                    471: {
                    472:     // Barry, note - Root hub defines moved to OHCIRootHub.h
                    473: 
                    474:     kOHCIEndpointNumberOffset          = 7,
                    475:     kOHCIEndpointDirectionOffset       = 11,
                    476:     kOHCIMaxPacketSizeOffset           = 16,
                    477:     kOHCISpeedOffset                   = 13,
                    478:     kOHCIBufferRoundingOffset          = 18,
                    479:     kOHCIDirectionOffset               = 19,
                    480:     kENOffset                          = 7,
                    481: 
                    482:     kUniqueNumMask                     = OHCIBitRange (0, 12),
                    483:     kUniqueNumNoDirMask                        = OHCIBitRange (0, 10),
                    484:     kOHCIHeadPMask                     = OHCIBitRange (4, 31),
                    485:     kOHCIInterruptSOFMask              = kOHCIHcInterrupt_SF,
                    486:     kOHCISkipped                       = kOHCIEDControl_K,
                    487:     kOHCIDelayIntOffset                        = 21,
                    488:     kOHCIPageSize                      = 4096,
                    489:     kOHCIEndpointDirectionMask         = OHCIBitRange (11, 12),
                    490:     kOHCIEDToggleBitMask               = OHCIBitRange (1, 1),
                    491:     kOHCIGTDClearErrorMask             = OHCIBitRange (0, 25),
                    492:     kHCCAalignment                     = 0x100,        // required alignment for HCCA
                    493:     kHCCAsize                          = 256           // size of HCCA
                    494: };
                    495: 
                    496: 
                    497: enum {
                    498:     kOHCIBulkTransferOutType           = 1,
                    499:     kOHCIBulkTransferInType            = 2,
                    500:     kOHCIControlSetupType              = 3,
                    501:     kOHCIControlDataType               = 4,
                    502:     kOHCIControlStatusType             = 5,
                    503:     kOHCIInterruptInType               = 6,
                    504:     kOHCIInterruptOutType              = 7,
                    505:     kOHCIOptiLSBug                     = 8,
                    506:     kOHCIIsochronousInType             = 9,
                    507:     kOHCIIsochronousOutType            = 10
                    508: };
                    509: 
                    510: enum {
                    511:     kOHCIFrameOffset                   = 16,
                    512:     kOHCIFmNumberMask                  = OHCIBitRange (0, 15),
                    513:     kOHCIFrameOverflowBit              = kOHCIBit16,
                    514:     kOHCIMaxRetrys                     = 20
                    515: 
                    516: };
                    517: 
                    518: ////////////////////////////////////////////////////////////////////////////////
                    519: //
                    520: // OHCI UIM data records.
                    521: //
                    522: 
                    523: //typedef short RootHubID;
                    524: 
                    525: // Interrupt head struct
                    526: struct OHCIIntHeadStruct
                    527: {
                    528:     OHCIEndpointDescriptorPtr          pHead;
                    529:     OHCIEndpointDescriptorPtr          pTail;
                    530:     UInt32                             pHeadPhysical;
                    531:     int                                        nodeBandwidth;
                    532: };
                    533: 
                    534: struct OHCIUIMDataStruct
                    535: {
                    536: //    RegEntryID                               ohciRegEntryID; // Name Registry entry of OHCI.
                    537: //    UIMID                            uimID;          // ID for OHCI UIM.
                    538: //    RootHubID                                rootHubID;      // Status of root hub, if 0, not initialized otherwise has virtual ID number
                    539:     UInt32                             errataBits;     // various bits for chip erratas
                    540:     OHCIRegistersPtr                   pOHCIRegisters; // Pointer to base address of OHCI registers.
                    541:     Ptr                                        pHCCA;          // Pointer to HCCA.
                    542:     OHCIIntHead                                pInterruptHead[63];     // ptr to private list of all interrupts heads                  
                    543:     volatile OHCIEndpointDescriptorPtr pIsochHead;     // ptr to Isochtonous list
                    544:     volatile UInt32                    pIsochTail;     // ptr to Isochtonous list
                    545:     volatile UInt32                    pBulkHead;      // ptr to Bulk list
                    546:     volatile UInt32                    pControlHead;   // ptr to Control list
                    547:     volatile UInt32                    pBulkTail;      // ptr to Bulk list
                    548:     volatile UInt32                    pControlTail;   // ptr to Control list
                    549:     volatile OHCIPhysicalLogicalPtr    pPhysicalLogical;       // ptr to list of memory maps
                    550:     volatile OHCIGeneralTransferDescriptorPtr  pFreeTD;        // list of availabble Trasfer Descriptors
                    551:     volatile OHCIIsochTransferDescriptorPtr    pFreeITD;       // list of availabble Trasfer Descriptors
                    552:     volatile OHCIEndpointDescriptorPtr         pFreeED;        // list of available Endpoint Descriptors
                    553:     volatile OHCIGeneralTransferDescriptorPtr  pLastFreeTD;    // last of availabble Trasfer Descriptors
                    554:     volatile OHCIIsochTransferDescriptorPtr    pLastFreeITD;   // last of availabble Trasfer Descriptors
                    555:     volatile OHCIEndpointDescriptorPtr         pLastFreeED;    // last of available Endpoint Descriptors
                    556:     volatile OHCIGeneralTransferDescriptorPtr  pPendingTD;     // list of non processed Trasfer Descriptors
                    557:     Ptr                                        pDataAllocation;        // ptr to block used for TD, ED, ITD
                    558:     Ptr                                        pPCIAssignedAddresses;  // ptr to PCI assigned addresses
                    559:     UInt32                             pageSize;       // OS Logical page size
                    560:     struct  {
                    561:         volatile UInt32        scheduleOverrun;                // updated by the interrupt handler
                    562:         volatile UInt32        unrecoverableError;             // updated by the interrupt handler
                    563:         volatile UInt32        frameNumberOverflow;            // updated by the interrupt handler
                    564:         volatile UInt32        ownershipChange;                // updated by the interrupt handler
                    565:         } errors;
                    566:     volatile UInt64    frameNumber;
                    567:     UInt16             rootHubFuncAddress;     // Function Address for the root hub
                    568:     int                        OptiOn;
                    569:     UInt32     isochBandwidthAvail;    // amount of available bandwidth for Isochronous transfers
                    570: };
                    571: 
                    572: struct OHCIEndpointDescriptorStruct
                    573: {
                    574:     UInt32                     flags;                  // 0x00 control
                    575:     PhysicalPtr                        tdQueueTailPtr;         // 0x04 pointer to last TD (physical address)
                    576:     PhysicalPtr                        tdQueueHeadPtr;         // 0x08 pointer to first TD (physical)
                    577:     PhysicalPtr                        nextED;                 // 0x0c Pointer to next ED (physical)
                    578:     OHCIEndpointDescriptorPtr  pLogicalNext;           // 0x10
                    579:     PhysicalPtr                        pPhysical;              // 0x14
                    580:     void*                      pLogicalTailP;          // 0x18
                    581:     void*                      pLogicalHeadP;          // 0x1c
                    582: };     // 0x20 length of structure
                    583: 
                    584: struct OHCIGeneralTransferDescriptorStruct
                    585: {
                    586:     volatile UInt32                    flags;                  // 0x00 Data controlling transfer.
                    587:     volatile PhysicalPtr               currentBufferPtr;       // 0x04 Current buffer pointer (physical)
                    588:     volatile PhysicalPtr               nextTD;                 // 0x08 Pointer to next transfer descriptor
                    589:     PhysicalPtr                                bufferEnd;              // 0x0c Pointer to end of buffer (physical)
                    590:     IOUSBCompletion                    completion;     // only used if last TD, other wise its  nil
                    591:     OHCIEndpointDescriptorPtr          pEndpoint;      // pointer to TD's Endpoint
                    592:     UInt32                             pType;          // 0x20 Note this must appear at the same offset (32) in GTD & ITD structs
                    593:     PhysicalPtr                                pPhysical;      // 0x24 Note this must appear at the same offset (36) in GTD & ITD structs
                    594:     OHCIGeneralTransferDescriptorPtr   pLogicalNext;   // 0x28 Note this must appear at the same offset (40) in GTD & ITD structs
                    595:     UInt32                             bufferSize;     // used only by control transfers to keep track of data buffers size leftover
                    596: };
                    597: 
                    598: struct OHCIIsochTransferDescriptorStruct
                    599: {
                    600:     UInt32                             flags;          // 0x00 Condition code/FrameCount/DelayInterrrupt/StartingFrame.
                    601:     PhysicalPtr                                bufferPage0;    // 0x04 Buffer Page 0 (physical)
                    602:     PhysicalPtr                                nextTD;         // 0x08 Pointer to next transfer descriptor (physical)
                    603:     PhysicalPtr                                bufferEnd;      // 0x0c Pointer to end of buffer (physical)
                    604:     UInt16                             offset[8];
                    605:     UInt32                             pType;          // 0x20 Note this must appear at the same offset (32) in GTD & ITD structs
                    606:     UInt32                             pPhysical;      // 0x24 Note this must appear at the same offset (36) in GTD & ITD structs
                    607:     OHCIIsochTransferDescriptorPtr     pLogicalNext;   // 0x28 Note this must appear at the same offset (40) in GTD & ITD structs
                    608:     IOUSBIsocCompletion                completion;     // callback for Isoch transactions
                    609:     IOUSBIsocFrame *                   pIsocFrame;     // ptr to USLs status and length array
                    610:     UInt32                             frameNum;       //      index to pIsocFrame array
                    611: };
                    612: 
                    613: struct OHCIPhysicalLogicalStruct
                    614: {
                    615:     UInt32                             LogicalStart;
                    616:     UInt32                             LogicalEnd;
                    617:     UInt32                             PhysicalStart;
                    618:     UInt32                             PhysicalEnd;
                    619:     UInt32                             type;
                    620:     OHCIPhysicalLogicalStruct *                pNext;
                    621: };
                    622: 
                    623: #define kOHCIPageOffsetMask    ( kOHCIPageSize - 1 )           // mask off just the offset bits (low 12)
                    624: #define kOHCIPageMask          (~(kOHCIPageOffsetMask))        // mask off just the page number (high 20)
                    625: 

unix.superglobalmegacorp.com

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