Annotation of kernel/bsd/dev/ppc/drvUSBCMD/OHCIRootHub.c, revision 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:           OHCIRootHub.c
        !            27: 
        !            28:        Contains:       xxx put contents here xxx
        !            29: 
        !            30:        Version:        xxx put version here xxx
        !            31: 
        !            32:        Copyright:      � 1998 by Apple Computer, Inc., all rights reserved.
        !            33: 
        !            34:        File Ownership:
        !            35: 
        !            36:                DRI:                            xxx put dri here xxx
        !            37: 
        !            38:                Other Contact:          xxx put other contact here xxx
        !            39: 
        !            40:                Technology:                     xxx put technology here xxx
        !            41: 
        !            42:        Writers:
        !            43: 
        !            44:                (TC)    Tom Clark
        !            45:                (BT)    Barry Twycross
        !            46: 
        !            47:        Change History (most recent first):
        !            48: 
        !            49:          <USB8>         8/12/98        BT              Move root hub into UIM again
        !            50:          <USB7>         7/10/98        TC              Back out previous rev.
        !            51:          <USB6>         6/30/98        BT              Move Root hub sim into UIM
        !            52:          <USB5>         6/11/98        BT              Fix hub descriptor so it knows about overcurrent and power mode
        !            53:          <USB4>         4/23/98        BT              Add reset portsuspend change
        !            54:          <USB3>         4/16/98        BT              Channge to new headers
        !            55:          <USB2>         4/15/98        BT              Add over current change reset
        !            56:                 <1>     3/19/98        BT              first checked in
        !            57: */
        !            58: #include "USB.h"
        !            59: #include "driverservices.h"
        !            60: 
        !            61: #include "OHCIUIM.h"
        !            62: #include "OHCIRootHub.h"
        !            63: #include "pci.h"
        !            64: 
        !            65: OHCIUIMDataPtr                         pOHCIUIMData;
        !            66: 
        !            67: void IOSync(void);
        !            68: UInt32 EndianSwap32Bit(UInt32 x);
        !            69: static void parameterNotUsed(UInt32 notUsed)
        !            70: {
        !            71:        notUsed = 0;
        !            72: }
        !            73: 
        !            74: ////////////////////////////////////////////////////////////////////////////////
        !            75: //
        !            76: // OHCIUIMGetRootHubDescriptor
        !            77: //
        !            78: //   This proc returns the root hub descriptor fields.
        !            79: //   
        !            80: 
        !            81: OSStatus OHCIGetRootDescriptor(
        !            82:        uslBusRef                                       bus,    /* which hub */
        !            83:        uslRootHubDescriptorPtr         descr)
        !            84: {
        !            85:        OHCIRegistersPtr                        pOHCIRegisters;
        !            86:        UInt32                                          hcRhDescriptorA;
        !            87:        UInt32                                          hcRhDescriptorB;
        !            88:        UInt32                                          powerSwitching,
        !            89:                                                                gangedSwitching,
        !            90:                                                                compoundDevice,
        !            91:                                                                overCurrent,
        !            92:                                                                globalOverCurrent,
        !            93:                                                                deviceRemovable,
        !            94:                                                                gangedPower;
        !            95:        OSStatus                                        status = noErr;
        !            96: 
        !            97:        parameterNotUsed(bus);
        !            98:        
        !            99:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           100:        // Read hcRhDescriptorA registers.
        !           101:        hcRhDescriptorA = EndianSwap32Bit (pOHCIRegisters->hcRhDescriptorA);
        !           102:        hcRhDescriptorB = EndianSwap32Bit (pOHCIRegisters->hcRhDescriptorB);
        !           103: 
        !           104: 
        !           105:        // Copy data from hcRhDescriptorA masking out reserved bit fields.
        !           106:        // The hcRhDescriptorA register is the 32 bit byte swap of nbrPorts,
        !           107:        // hubCharacteristics, and pwrOn2PwrGood.
        !           108:        // could have problem with porting and overwriting of other bytes.
        !           109:        hcRhDescriptorA &= kOHCINumPortsMask;
        !           110:        descr->numPorts = hcRhDescriptorA;
        !           111: 
        !           112: 
        !           113:        //Now get NPS Field, Power Switching
        !           114:        hcRhDescriptorA = EndianSwap32Bit (pOHCIRegisters->hcRhDescriptorA);
        !           115:        powerSwitching = (hcRhDescriptorA & kOHCIPowerSwitchingMask) >> kOHCIPowerSwitchingOffset;
        !           116:        descr->powerSwitching =  !((Boolean) powerSwitching);
        !           117: 
        !           118:        //Now Get Ganged Switching
        !           119:        gangedSwitching = (hcRhDescriptorA & kOHCIGangedSwitchingMask) >> kOHCIGangedSwitchingOffset;
        !           120:        descr->gangedSwitching =  !(Boolean) gangedSwitching;
        !           121: 
        !           122: /*
        !           123:        UInt32* myPointer;
        !           124: 
        !           125:        myPointer = (UInt32 *) &(descr->gangedSwitching);
        !           126: 
        !           127:        *myPointer =  (Boolean) gangedSwitching;
        !           128: */
        !           129: 
        !           130: 
        !           131: 
        !           132:        //Is it a Compound device?
        !           133:        compoundDevice = (hcRhDescriptorA & kOHCICompoundDeviceMask) >> kOHCICompoundDeviceOffset;
        !           134:        descr->compoundDevice =  (Boolean) compoundDevice;
        !           135:        
        !           136:        //Does it allow overcurrent
        !           137:        overCurrent = (hcRhDescriptorA & kOHCIOverCurrentMask) >> kOHCIOverCurrentOffset;
        !           138:        descr->overCurrent =  !(Boolean) overCurrent;
        !           139:        
        !           140:        //Does it allow Global Over Current?
        !           141:        globalOverCurrent = (hcRhDescriptorA & kOHCIGlobalOverCurrentMask) >> kOHCIGlobalOverCurrentOffset;
        !           142:        descr->globalOverCurrent =  !(Boolean) globalOverCurrent;
        !           143:        
        !           144:        //Find the device removable and ganged power flags and put into stuffed byte form
        !           145:        deviceRemovable = (hcRhDescriptorB & kOHCIDeviceRemovableMask) >> kOHCIDeviceRemovableOffset;
        !           146:        descr->portFlags[0] =  (UInt8) deviceRemovable;
        !           147:        gangedPower = (hcRhDescriptorB & kOHCIGangedPowerMask) >> kOHCIGangedPowerOffset;
        !           148:        descr->portFlags[1] =  (UInt8) gangedPower;
        !           149: 
        !           150: 
        !           151:        return (status);
        !           152: }
        !           153: 
        !           154: OSStatus OHCIGetInterruptStatus(
        !           155:        uslBusRef                                       bus,
        !           156:        UInt32                                          *status)
        !           157: {
        !           158:        OHCIRegistersPtr                        pOHCIRegisters;
        !           159: 
        !           160: parameterNotUsed(bus);
        !           161: 
        !           162:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           163:        *status = EndianSwap32Bit (pOHCIRegisters->hcInterruptStatus);
        !           164:        return(noErr);
        !           165: }
        !           166: 
        !           167: 
        !           168: OSStatus OHCIClearInterruptStatus(
        !           169:        uslBusRef                                       bus,
        !           170:        UInt32                                          status)
        !           171: {
        !           172:        OHCIRegistersPtr                        pOHCIRegisters;
        !           173: 
        !           174: parameterNotUsed(bus);
        !           175: 
        !           176:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           177:        pOHCIRegisters->hcInterruptStatus = EndianSwap32Bit (status);
        !           178:        return(noErr);
        !           179:        
        !           180: }
        !           181: 
        !           182: OSStatus OHCIGetRhStatus(
        !           183:        uslBusRef                                       bus,
        !           184:        UInt32                                          *status)
        !           185: {
        !           186:        OHCIRegistersPtr                        pOHCIRegisters;
        !           187: 
        !           188: parameterNotUsed(bus);
        !           189: 
        !           190:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           191:        *status = EndianSwap32Bit (pOHCIRegisters->hcRhStatus);
        !           192:        return(noErr);
        !           193:        
        !           194: }
        !           195: 
        !           196: 
        !           197: OSStatus OHCIRootHubGetPortStatus(
        !           198:        uslBusRef                                       bus,
        !           199:        short                                           port,
        !           200:        uslRootHubPortStatusPtr         portStatus)
        !           201: {
        !           202:        UInt32                                          portFlags;
        !           203:        UInt32                                          hcRhPortStatus;
        !           204:        OSStatus                                        status = noErr;
        !           205:        
        !           206:        parameterNotUsed(bus);
        !           207: 
        !           208:        //adjust port number for array use
        !           209:        port--;
        !           210: 
        !           211:        hcRhPortStatus = EndianSwap32Bit (pOHCIUIMData->pOHCIRegisters->hcRhPortStatus[port]);
        !           212: //zzz
        !           213: //     sprintf (debugStr, "OHCIUIMportstatus = %lx", hcRhPortStatus);
        !           214: //     DebugStr ((ConstStr255Param) c2pstr (debugStr));
        !           215: //zzz
        !           216:        portFlags = hcRhPortStatus & kOHCIPortFlagsMask;
        !           217:        portStatus->portFlags = (UInt16) portFlags;
        !           218:        portFlags = hcRhPortStatus >> kOHCIportChangeFlagsOffset;
        !           219:        portStatus->portChangeFlags = (UInt16) portFlags;
        !           220:        return (status);
        !           221: 
        !           222: }
        !           223: 
        !           224: OSStatus OHCIResetRootHub (
        !           225:                uslBusRef               bus)
        !           226: {
        !           227:        UInt32                          rootHubDescriptorA, savedControl;
        !           228:        OSStatus                        status = noErr;
        !           229:        OHCIRegistersPtr        pOHCIRegisters;
        !           230:        UInt16                          numDownstreamPorts;
        !           231:        UInt16                          powerOnToGoodTime;
        !           232: 
        !           233: parameterNotUsed(bus);
        !           234: 
        !           235:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           236: 
        !           237:        rootHubDescriptorA = EndianSwap32Bit(pOHCIRegisters->hcRhDescriptorA);
        !           238:        
        !           239:        numDownstreamPorts = rootHubDescriptorA & kOHCIHcRhDescriptorA_NDP;
        !           240:        powerOnToGoodTime = 2 * ((rootHubDescriptorA & kOHCIHcRhDescriptorA_POTPGT) >> kOHCIHcRhDescriptorA_POTPGTPhase);
        !           241:        // should we wait for this time here?  How about if the ports aren't powered on already?
        !           242: kprintf("POTPGT val=%d\n",powerOnToGoodTime);  
        !           243:        DelayForHardware(DurationToAbsolute(powerOnToGoodTime*durationMillisecond));
        !           244:        // put USB into USB bus-reset state
        !           245:        savedControl = EndianSwap32Bit(pOHCIRegisters->hcControl) & ~(kOHCIHcControl_HCFS);
        !           246:        pOHCIRegisters->hcControl = EndianSwap32Bit (pOHCIRegisters->hcControl) & ~(kOHCIHcControl_HCFS);
        !           247: 
        !           248:        DelayForHardware(DurationToAbsolute(10*durationMillisecond));
        !           249:        
        !           250:        // then go to the operational state
        !           251:        pOHCIRegisters->hcControl = EndianSwapImm32Bit((kOHCIFunctionalState_Operational << kOHCIHcControl_HCFSPhase) | savedControl) ;
        !           252: 
        !           253:        DelayForHardware(DurationToAbsolute(10*durationMillisecond));  // spec requires devices be ready within 10mS
        !           254: 
        !           255: 
        !           256:        ResetRootHubSimulation();
        !           257:        
        !           258:        return (status);
        !           259: }
        !           260: 
        !           261: 
        !           262: OSStatus OHCIRootHubPower(
        !           263:                uslBusRef               bus,
        !           264:                Boolean                 on)
        !           265: {
        !           266:        UInt32                                  value;
        !           267:        OSStatus                                status = noErr;
        !           268:        OHCIRegistersPtr                pOHCIRegisters;
        !           269: 
        !           270: parameterNotUsed(bus);
        !           271: 
        !           272:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           273: 
        !           274:        value = 0;
        !           275:        if(on)
        !           276:        {
        !           277:                value |= kOHCIBit16;/* power on to all ganged ports */
        !           278:        }
        !           279:        else
        !           280:        {
        !           281:                value |= kOHCIBit0;     /* turn global power off */
        !           282:        }
        !           283: //     value |= kOHCIBit15;/* remote wakeup enable */
        !           284: //     value |= kOHCIBit17;/* clear over current change indicator */
        !           285: //     value |= kOHCIBit31;/* remote wakeup disabled */
        !           286: 
        !           287:        pOHCIRegisters->hcRhStatus              = EndianSwap32Bit (value);
        !           288: 
        !           289:        return (status);
        !           290: 
        !           291: }
        !           292: 
        !           293: OSStatus OHCIRootHubResetChangeConnection(
        !           294:        uslBusRef               bus,
        !           295:        short                   port)
        !           296: {
        !           297:        UInt32 value;
        !           298:        OSStatus                                        status = noErr;
        !           299:        OHCIRegistersPtr                        pOHCIRegisters;
        !           300: 
        !           301: parameterNotUsed(bus);
        !           302: 
        !           303:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           304:        value = 0;
        !           305:        value |= kOHCIBit16;/* clear status change */
        !           306: 
        !           307:        pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           308: 
        !           309:        return (status);
        !           310: }
        !           311: 
        !           312: 
        !           313: OSStatus OHCIRootHubResetResetChange(
        !           314:        uslBusRef               bus,
        !           315:        short                   port)
        !           316: {
        !           317:        UInt32 value;
        !           318:        OSStatus                                        status = noErr;
        !           319:        OHCIRegistersPtr                        pOHCIRegisters;
        !           320: 
        !           321: parameterNotUsed(bus);
        !           322: 
        !           323: 
        !           324:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           325:        value = 0;
        !           326:        value |= kOHCIBit20;/* clear reset status change */
        !           327: 
        !           328:        pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           329: 
        !           330:        return (status);
        !           331: }
        !           332: 
        !           333: OSStatus OHCIRootHubResetSuspendChange(
        !           334:        uslBusRef               bus,
        !           335:        short                   port)
        !           336: {
        !           337:        UInt32 value;
        !           338:        OSStatus                                        status = noErr;
        !           339:        OHCIRegistersPtr                        pOHCIRegisters;
        !           340: 
        !           341: parameterNotUsed(bus);
        !           342: 
        !           343: 
        !           344:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           345:        value = 0;
        !           346:        value |= kOHCIBit18;/* clear suspend status change */
        !           347: 
        !           348:        pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           349: 
        !           350:        return (status);
        !           351: }
        !           352: 
        !           353: OSStatus OHCIRootHubResetEnableChange(
        !           354:        uslBusRef               bus,
        !           355:        short                   port)
        !           356: {
        !           357:        UInt32 value;
        !           358:        OSStatus                                        status = noErr;
        !           359:        OHCIRegistersPtr                        pOHCIRegisters;
        !           360: 
        !           361: parameterNotUsed(bus);
        !           362: 
        !           363: 
        !           364:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           365:        value = 0;
        !           366:        value |= kOHCIBit17;/* clear enable status change */
        !           367: 
        !           368:        pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           369: 
        !           370:        return (status);
        !           371: }
        !           372: 
        !           373: 
        !           374: OSStatus OHCIRootHubResetOverCurrentChange(
        !           375:        uslBusRef               bus,
        !           376:        short                   port)
        !           377: {
        !           378:        UInt32 value;
        !           379:        OSStatus                                        status = noErr;
        !           380:        OHCIRegistersPtr                        pOHCIRegisters;
        !           381: 
        !           382: parameterNotUsed(bus);
        !           383: 
        !           384: 
        !           385:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           386:        value = 0;
        !           387:        value |= kOHCIBit19;/* clear over current status change */
        !           388: 
        !           389:        pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           390: 
        !           391:        return (status);
        !           392: }
        !           393: 
        !           394: 
        !           395: OSStatus OHCIRootHubResetPort (
        !           396:        uslBusRef               bus,
        !           397:        short                   port)
        !           398: {
        !           399:        OHCIRegistersPtr                        pOHCIRegisters;
        !           400:        OSStatus                                        status = noErr;
        !           401: 
        !           402: parameterNotUsed(bus);
        !           403: 
        !           404:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           405: 
        !           406:        //sets Bit 8 in port root hub register
        !           407:        pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (kOHCIBit4);
        !           408:         IOSync();
        !           409:        return (status);
        !           410: 
        !           411: }
        !           412: 
        !           413: OSStatus OHCIRootHubPortEnable(
        !           414:                uslBusRef               bus,
        !           415:                short                   port,
        !           416:                Boolean                 on)
        !           417: {
        !           418:        UInt32 value;
        !           419:        OSStatus                                        status = noErr;
        !           420:        OHCIRegistersPtr                        pOHCIRegisters;
        !           421:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           422: 
        !           423: parameterNotUsed(bus);
        !           424: 
        !           425:        value = 0;
        !           426:        if(on)
        !           427:        {
        !           428:                value |= kOHCIBit1;/* enable port */
        !           429:        }
        !           430:        else
        !           431:        {
        !           432:                value |= kOHCIBit0;     /* disable port */
        !           433:        }
        !           434: 
        !           435:        pOHCIUIMData->pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           436:        IOSync();
        !           437: 
        !           438:        return (status);
        !           439: }
        !           440: 
        !           441: OSStatus OHCIRootHubPortSuspend(
        !           442:                uslBusRef               bus,
        !           443:                short                   port,
        !           444:                Boolean                 on)
        !           445: {
        !           446:        UInt32 value;
        !           447:        OSStatus                                        status = noErr;
        !           448:        OHCIRegistersPtr                        pOHCIRegisters;
        !           449: 
        !           450: parameterNotUsed(bus);
        !           451: 
        !           452:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           453: 
        !           454:        value = 0;
        !           455:        if(on)
        !           456:        {
        !           457:                value |= kOHCIBit2;/* suspend port */
        !           458:        }
        !           459:        else
        !           460:        {
        !           461:                value |= kOHCIBit3;     /* resume port */
        !           462:        }
        !           463: 
        !           464:        pOHCIUIMData->pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           465: 
        !           466:        return (status);
        !           467: }
        !           468: 
        !           469: OSStatus OHCIRootHubPortPower(
        !           470:        uslBusRef                                               bus,
        !           471:        short                                                   port,
        !           472:        Boolean                                                 on)
        !           473:        {
        !           474:        UInt32                                                  value= 0;
        !           475:        OSStatus                                                status = noErr;
        !           476:        OHCIRegistersPtr                                pOHCIRegisters;
        !           477: 
        !           478: parameterNotUsed(bus);
        !           479: 
        !           480:        pOHCIRegisters = pOHCIUIMData->pOHCIRegisters;
        !           481: 
        !           482:        if(on)
        !           483:        {
        !           484:                value |= kOHCIBit8;/* enable port power */
        !           485:        }
        !           486:        else
        !           487:        {
        !           488:                value |= kOHCIBit9;     /* disable port power */
        !           489:        }
        !           490: 
        !           491:        pOHCIUIMData->pOHCIRegisters->hcRhPortStatus[port-1] = EndianSwap32Bit (value);
        !           492: 
        !           493:        return (status);
        !           494: }
        !           495: 
        !           496: 

unix.superglobalmegacorp.com

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