Annotation of XNU/iokit/Families/IOFireWire/IOFireWireNub.cpp, 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: /*
                     23:  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved.
                     24:  *
                     25:  * HISTORY
                     26:  * 21 May 99 wgulland created.
                     27:  *
                     28:  */
                     29: 
                     30: #define DEBUGGING_LEVEL 0      // 1 = low; 2 = high; 3 = extreme
                     31: #define DEBUGLOG kprintf
                     32: #include <IOKit/assert.h>
                     33: 
                     34: #include <IOKit/IOMessage.h>
                     35: #include <IOKit/firewire/IOFireWireNub.h>
                     36: #include <IOKit/firewire/IOFireWireController.h>
                     37: #include "IOFireWireUserClient.h"
                     38: 
                     39: #define super IOService
                     40: 
                     41: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     42: 
                     43: OSDefineMetaClass( IOFireWireNub, IOService )
                     44: OSDefineAbstractStructors(IOFireWireNub, IOService)
                     45: 
                     46: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     47: 
                     48: bool IOFireWireNub::init(OSDictionary * propTable)
                     49: {
                     50:     OSNumber *offset;
                     51:     if( !super::init(propTable))
                     52:         return (false);
                     53: 
                     54:     offset = OSDynamicCast(OSNumber, propTable->getObject("GUID"));
                     55:     if(offset)
                     56:         fUniqueID = offset->unsigned64BitValue();
                     57: 
                     58:     return true;
                     59: }
                     60: 
                     61: IOFWSpeed IOFireWireNub::FWSpeed() const
                     62: {
                     63:     return fControl->FWSpeed(fNodeID);
                     64: }
                     65: 
                     66: // How fast can this node talk to another node?
                     67: IOFWSpeed IOFireWireNub::FWSpeed(const IOFireWireNub *dst) const
                     68: {
                     69:     return fControl->FWSpeed(fNodeID, dst->fNodeID);
                     70: }
                     71: 
                     72: // How big (as a power of two) can packets sent to the node be?
                     73: int IOFireWireNub::maxPackLog(bool forSend) const
                     74: {
                     75:     return fControl->maxPackLog(forSend, fNodeID);
                     76: }
                     77: 
                     78: // How big (as a power of two) can packets sent between nodes be?
                     79: int IOFireWireNub::maxPackLog(bool forSend, const IOFireWireNub *dst) const
                     80: {
                     81:     if(forSend)
                     82:         return fControl->maxPackLog(fNodeID, dst->fNodeID);
                     83:     else
                     84:         return fControl->maxPackLog(dst->fNodeID, fNodeID);
                     85: }
                     86: 
                     87: IOFWReadCommand *IOFireWireNub::createReadCommand(FWAddress devAddress, IOMemoryDescriptor *hostMem,
                     88:                                FWDeviceCallback completion, void *refcon,
                     89:                                bool failOnReset)
                     90: {
                     91:     IOFWReadCommand * cmd;
                     92:     cmd = new IOFWReadCommand;
                     93:     if(cmd) {
                     94:         if(!cmd->initAll(this, devAddress, hostMem, completion, refcon, failOnReset)) {
                     95:             cmd->release();
                     96:             cmd = NULL;
                     97:        }
                     98:     }
                     99:     return cmd;
                    100: }
                    101: 
                    102: IOFWReadQuadCommand *IOFireWireNub::createReadQuadCommand(FWAddress devAddress, UInt32 *quads, int numQuads,
                    103:                                FWDeviceCallback completion, void *refcon,
                    104:                                bool failOnReset)
                    105: {
                    106:     IOFWReadQuadCommand * cmd;
                    107:     cmd = new IOFWReadQuadCommand;
                    108:     if(cmd) {
                    109:         if(!cmd->initAll(fControl, this, devAddress, quads, numQuads, 
                    110:                completion, refcon, failOnReset)) {
                    111:             cmd->release();
                    112:             cmd = NULL;
                    113:        }
                    114:     }
                    115:     return cmd;
                    116: }
                    117: 
                    118: IOFWWriteCommand *IOFireWireNub::createWriteCommand(FWAddress devAddress, IOMemoryDescriptor *hostMem,
                    119:                                FWDeviceCallback completion, void *refcon,
                    120:                                bool failOnReset)
                    121: {
                    122:     IOFWWriteCommand * cmd;
                    123:     cmd = new IOFWWriteCommand;
                    124:     if(cmd) {
                    125:         if(!cmd->initAll(this, devAddress, hostMem, completion, refcon, failOnReset)) {
                    126:             cmd->release();
                    127:             cmd = NULL;
                    128:        }
                    129:     }
                    130:     return cmd;
                    131: }
                    132: 
                    133: IOFWWriteQuadCommand *IOFireWireNub::createWriteQuadCommand(FWAddress devAddress, 
                    134:                                UInt32 *quads, int numQuads,
                    135:                                FWDeviceCallback completion, void *refcon,
                    136:                                bool failOnReset)
                    137: {
                    138:     IOFWWriteQuadCommand * cmd;
                    139:     cmd = new IOFWWriteQuadCommand;
                    140:     if(cmd) {
                    141:         if(!cmd->initAll(fControl, this, devAddress, quads, numQuads,
                    142:                completion, refcon, failOnReset)) {
                    143:             cmd->release();
                    144:             cmd = NULL;
                    145:        }
                    146:     }
                    147:     return cmd;
                    148: }
                    149: 
                    150: IOFWCompareAndSwapCommand *
                    151: IOFireWireNub::createCompareAndSwapCommand(FWAddress devAddress, const UInt32 *cmpVal, const UInt32 *newVal,
                    152:                int size, FWDeviceCallback completion, void *refcon, bool failOnReset)
                    153: {
                    154:     IOFWCompareAndSwapCommand * cmd;
                    155:     cmd = new IOFWCompareAndSwapCommand;
                    156:     if(cmd) {
                    157:         if(!cmd->initAll(this, devAddress, cmpVal, newVal, size, completion, refcon, failOnReset)) {
                    158:             cmd->release();
                    159:             cmd = NULL;
                    160:        }
                    161:     }
                    162:     return cmd;
                    163: }
                    164: 
                    165:     /*
                    166:      * Create local FireWire address spaces for the device to access
                    167:      */
                    168: IOFWPhysicalAddressSpace *IOFireWireNub::createPhysicalAddressSpace(IOMemoryDescriptor *mem)
                    169: {
                    170:     IOFWPhysicalAddressSpace *space;
                    171:     space = new IOFWPhysicalAddressSpace;
                    172:     if(!space)
                    173:         return NULL;
                    174:     if(!space->initWithDesc(mem)) {
                    175:         space->release();
                    176:         space = NULL;
                    177:     }
                    178:     return space;
                    179: }
                    180: 
                    181: IOFWPseudoAddressSpace *IOFireWireNub::createPseudoAddressSpace(FWAddress addr, UInt32 len, 
                    182:                                FWReadCallback reader, FWWriteCallback writer, void *refcon)
                    183: {
                    184:     IOFWPseudoAddressSpace *space;
                    185:     space = new IOFWPseudoAddressSpace;
                    186:     if(!space)
                    187:         return NULL;
                    188:     if(!space->initAll(addr, len, reader, writer, refcon)) {
                    189:         space->release();
                    190:         space = NULL;
                    191:     }
                    192:     return space;
                    193: }
                    194: 
                    195:     /*
                    196:      * Create commands to activate/deactivate local FireWire address spaces
                    197:      */
                    198: IOFWAllocAddressCommand *IOFireWireNub::createAllocAddrCommand(IOFWAddressSpace *space,
                    199:                                FWBusCallback completion, void *refcon)
                    200: {
                    201:     IOFWAllocAddressCommand * cmd;
                    202:     cmd = new IOFWAllocAddressCommand;
                    203:     if(cmd) {
                    204:         if(!cmd->initWithSpace(this, space, completion, refcon)) {
                    205:             cmd->release();
                    206:             cmd = NULL;
                    207:        }
                    208:     }
                    209:     return cmd;
                    210: }
                    211: 
                    212: IOFWDeallocAddressCommand *IOFireWireNub::createDeallocAddrCommand(IOFWAddressSpace *space,
                    213:                                FWBusCallback completion, void *refcon)
                    214: {
                    215:     IOFWDeallocAddressCommand * cmd;
                    216:     cmd = new IOFWDeallocAddressCommand;
                    217:     if(cmd) {
                    218:         if(!cmd->initWithSpace(this, space, completion, refcon)) {
                    219:             cmd->release();
                    220:             cmd = NULL;
                    221:        }
                    222:     }
                    223:     return cmd;
                    224: }
                    225: 
                    226: 
                    227: /*
                    228:  * Create an iterator for the device ROM
                    229:  */
                    230: IOReturn IOFireWireNub::CSRROMCreateIterator (CSRROMEntryIterator *pCSRROMIterator)
                    231: {
                    232:     CSRROMEntryIteratorRecPtr  pIteratorRec;
                    233:     UInt32                     hdrSize;
                    234: 
                    235:     // Allocate memory for iterator record.
                    236:     pIteratorRec = (CSRROMEntryIteratorRecPtr)IOMalloc (sizeof (CSRROMEntryIteratorRec));
                    237:     if (pIteratorRec == NULL)
                    238:         return kIOReturnNoMemory;
                    239: 
                    240:     // Fill in other record fields.
                    241:     // Set relationship to descendants.
                    242:     pIteratorRec->relationship = kIterateDescendants;
                    243:     // Find start of root directory.
                    244:     hdrSize = ((fROM[0] & kCSRBusInfoBlockLength) >> kCSRBusInfoBlockLengthPhase) + 1;
                    245:     pIteratorRec->data = fROM;
                    246:     pIteratorRec->logicalPath[0] = 0;
                    247:     pIteratorRec->physicalPath[0] = hdrSize;
                    248: 
                    249:     pIteratorRec->logicalPath[1] = 0;
                    250:     pIteratorRec->physicalPath[1] = pIteratorRec->physicalPath[0] + 1;
                    251: 
                    252:     pIteratorRec->pathSize = 2;
                    253:     pIteratorRec->reset = true;
                    254: 
                    255:     // Return iterator.
                    256:     *pCSRROMIterator = (CSRROMEntryIterator) pIteratorRec;
                    257: 
                    258:     return (kIOReturnSuccess);
                    259: }
                    260: 
                    261: 
                    262: /**
                    263:  ** IOUserClient methods
                    264:  **/
                    265: 
                    266: IOReturn IOFireWireNub::newUserClient(task_t           owningTask,
                    267:                                       void *           /* security_id */,
                    268:                                       UInt32           type,
                    269:                                       IOUserClient **  handler )
                    270: 
                    271: {
                    272:     IOReturn                   err = kIOReturnSuccess;
                    273:     IOFireWireUserClient *     client;
                    274: 
                    275:     if( type != 11)
                    276:         return( kIOReturnBadArgument);
                    277: 
                    278:     client = IOFireWireUserClient::withTask(owningTask);
                    279: 
                    280:     if( !client || (false == client->attach( this )) ||
                    281:         (false == client->start( this )) ) {
                    282:         if(client) {
                    283:             client->detach( this );
                    284:             client->release();
                    285:         }
                    286:         err = kIOReturnNoMemory;
                    287:     }
                    288: 
                    289:     *handler = client;
                    290:     return( err );
                    291: }
                    292: 
                    293: 

unix.superglobalmegacorp.com

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