|
|
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: * IOFWIsochPort is an abstract object that represents hardware on the bus ! 26: * (locally or remotely) that sends or receives isochronous packets. ! 27: * Local ports are implemented by the local device driver, ! 28: * Remote ports are implemented by the driver for the remote device. ! 29: * ! 30: * HISTORY ! 31: * ! 32: */ ! 33: #include <IOKit/firewire/IOFWIsochPort.h> ! 34: #include <IOKit/firewire/IOFWLocalIsochPort.h> ! 35: #include <IOKit/firewire/IOFWDCLProgram.h> ! 36: #include <IOKit/firewire/IOFWCommand.h> ! 37: ! 38: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 39: // Commands to control isoch bus hardware ! 40: ! 41: class IOFWAllocIsoHWCommand : public IOFWBusCommand ! 42: { ! 43: OSDeclareDefaultStructors(IOFWAllocIsoHWCommand) ! 44: ! 45: protected: ! 46: IODCLProgram * fProgram; ! 47: IOFWSpeed fSpeed; ! 48: UInt32 fChan; ! 49: ! 50: public: ! 51: virtual IOReturn execute(); ! 52: virtual bool init(IODCLProgram *program, IOFireWireController *control, ! 53: IOFWSpeed speed, UInt32 chan, ! 54: FWBusCallback completion=NULL, void *refcon=NULL); ! 55: }; ! 56: ! 57: OSDefineMetaClassAndStructors(IOFWAllocIsoHWCommand, IOFWBusCommand) ! 58: ! 59: bool IOFWAllocIsoHWCommand::init(IODCLProgram *program, ! 60: IOFireWireController *control, ! 61: IOFWSpeed speed, UInt32 chan, ! 62: FWBusCallback completion, void *refcon) ! 63: { ! 64: if(!IOFWBusCommand::initWithController(control, completion, refcon)) ! 65: return false; ! 66: fProgram = program; ! 67: fSpeed = speed; ! 68: fChan = chan; ! 69: return true; ! 70: } ! 71: ! 72: IOReturn IOFWAllocIsoHWCommand::execute() ! 73: { ! 74: return complete(fProgram->allocateHW(fSpeed, fChan)); ! 75: } ! 76: ! 77: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 78: ! 79: class IOFWReleaseIsoHWCommand : public IOFWBusCommand ! 80: { ! 81: OSDeclareDefaultStructors(IOFWReleaseIsoHWCommand) ! 82: ! 83: protected: ! 84: IODCLProgram * fProgram; ! 85: ! 86: public: ! 87: virtual IOReturn execute(); ! 88: virtual bool init(IODCLProgram *program, IOFireWireController *control, ! 89: FWBusCallback completion=NULL, void *refcon=NULL); ! 90: }; ! 91: ! 92: OSDefineMetaClassAndStructors(IOFWReleaseIsoHWCommand, IOFWBusCommand) ! 93: ! 94: bool IOFWReleaseIsoHWCommand::init(IODCLProgram *program, ! 95: IOFireWireController *control, ! 96: FWBusCallback completion, void *refcon) ! 97: { ! 98: if(!IOFWBusCommand::initWithController(control, completion, refcon)) ! 99: return false; ! 100: fProgram = program; ! 101: return true; ! 102: } ! 103: ! 104: IOReturn IOFWReleaseIsoHWCommand::execute() ! 105: { ! 106: return complete(fProgram->releaseHW()); ! 107: } ! 108: ! 109: ! 110: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 111: ! 112: class IOFWStartIsoHWCommand : public IOFWBusCommand ! 113: { ! 114: OSDeclareDefaultStructors(IOFWStartIsoHWCommand) ! 115: ! 116: protected: ! 117: IODCLProgram * fProgram; ! 118: ! 119: public: ! 120: virtual IOReturn execute(); ! 121: virtual bool init(IODCLProgram *program, IOFireWireController *control, ! 122: FWBusCallback completion=NULL, void *refcon=NULL); ! 123: }; ! 124: ! 125: OSDefineMetaClassAndStructors(IOFWStartIsoHWCommand, IOFWBusCommand) ! 126: ! 127: bool IOFWStartIsoHWCommand::init(IODCLProgram *program, ! 128: IOFireWireController *control, ! 129: FWBusCallback completion, void *refcon) ! 130: { ! 131: if(!IOFWBusCommand::initWithController(control, completion, refcon)) ! 132: return false; ! 133: fProgram = program; ! 134: return true; ! 135: } ! 136: ! 137: IOReturn IOFWStartIsoHWCommand::execute() ! 138: { ! 139: return complete(fProgram->start()); ! 140: } ! 141: ! 142: ! 143: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 144: class IOFWStopIsoHWCommand : public IOFWBusCommand ! 145: { ! 146: OSDeclareDefaultStructors(IOFWStopIsoHWCommand) ! 147: ! 148: protected: ! 149: IODCLProgram * fProgram; ! 150: ! 151: public: ! 152: virtual IOReturn execute(); ! 153: virtual bool init(IODCLProgram *program, IOFireWireController *control, ! 154: FWBusCallback completion=NULL, void *refcon=NULL); ! 155: }; ! 156: ! 157: OSDefineMetaClassAndStructors(IOFWStopIsoHWCommand, IOFWBusCommand) ! 158: ! 159: bool IOFWStopIsoHWCommand::init(IODCLProgram *program, ! 160: IOFireWireController *control, ! 161: FWBusCallback completion, void *refcon) ! 162: { ! 163: if(!IOFWBusCommand::initWithController(control, completion, refcon)) ! 164: return false; ! 165: fProgram = program; ! 166: return true; ! 167: } ! 168: ! 169: IOReturn IOFWStopIsoHWCommand::execute() ! 170: { ! 171: fProgram->stop(); ! 172: return complete(kIOReturnSuccess); ! 173: } ! 174: ! 175: ! 176: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 177: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 178: OSDefineMetaClass( IOFWIsochPort, OSObject ) ! 179: OSDefineAbstractStructors(IOFWIsochPort, OSObject) ! 180: ! 181: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ ! 182: OSDefineMetaClassAndStructors(IOFWLocalIsochPort, IOFWIsochPort) ! 183: ! 184: bool IOFWLocalIsochPort::init(IODCLProgram *program, IOFireWireController *control) ! 185: { ! 186: if(!IOFWIsochPort::init()) ! 187: return false; ! 188: fProgram = program; // belongs to us. ! 189: fControl = control; ! 190: return true; ! 191: } ! 192: ! 193: void IOFWLocalIsochPort::free() ! 194: { ! 195: if(fProgram) ! 196: fProgram->release(); ! 197: IOFWIsochPort::free(); ! 198: } ! 199: ! 200: // Return maximum speed and channels supported ! 201: // (bit n set = chan n supported) ! 202: IOReturn IOFWLocalIsochPort::getSupported(IOFWSpeed &maxSpeed, UInt64 &chanSupported) ! 203: { ! 204: maxSpeed = kFWSpeedMaximum; ! 205: chanSupported = ~(UInt64)0; ! 206: return kIOReturnSuccess; ! 207: } ! 208: ! 209: /* ! 210: * Allocate hardware resources for port, via workloop ! 211: * Then compile program, not on workloop. ! 212: */ ! 213: IOReturn IOFWLocalIsochPort::allocatePort(IOFWSpeed speed, UInt32 chan) ! 214: { ! 215: IOReturn res; ! 216: IOFWAllocIsoHWCommand *allocHW; ! 217: ! 218: allocHW = new IOFWAllocIsoHWCommand(); ! 219: if(NULL == allocHW) ! 220: return kIOReturnNoMemory; ! 221: if(!allocHW->init(fProgram, fControl, speed, chan)) { ! 222: allocHW->release(); ! 223: return kIOReturnNoMemory; ! 224: } ! 225: allocHW->submit(); ! 226: ! 227: res = allocHW->fStatus; ! 228: allocHW->release(); ! 229: ! 230: if(kIOReturnSuccess != res) ! 231: return res; ! 232: return fProgram->compile(speed, chan); // Not on workloop ! 233: } ! 234: ! 235: IOReturn IOFWLocalIsochPort::releasePort() ! 236: { ! 237: IOFWReleaseIsoHWCommand *releaseHW; ! 238: IOReturn res; ! 239: ! 240: releaseHW = new IOFWReleaseIsoHWCommand(); ! 241: if(NULL == releaseHW) ! 242: return kIOReturnNoMemory; ! 243: if(!releaseHW->init(fProgram, fControl)) { ! 244: releaseHW->release(); ! 245: return kIOReturnNoMemory; ! 246: } ! 247: releaseHW->submit(); ! 248: ! 249: res = releaseHW->fStatus; ! 250: releaseHW->release(); ! 251: return res; ! 252: } ! 253: ! 254: IOReturn IOFWLocalIsochPort::start() ! 255: { ! 256: IOFWStartIsoHWCommand *startHW; ! 257: IOReturn res; ! 258: ! 259: startHW = new IOFWStartIsoHWCommand(); ! 260: if(NULL == startHW) ! 261: return kIOReturnNoMemory; ! 262: if(!startHW->init(fProgram, fControl)) { ! 263: startHW->release(); ! 264: return kIOReturnNoMemory; ! 265: } ! 266: startHW->submit(); ! 267: ! 268: res = startHW->fStatus; ! 269: startHW->release(); ! 270: return res; ! 271: } ! 272: ! 273: IOReturn IOFWLocalIsochPort::stop() ! 274: { ! 275: IOFWStopIsoHWCommand *stopHW; ! 276: IOReturn res; ! 277: ! 278: stopHW = new IOFWStopIsoHWCommand(); ! 279: if(NULL == stopHW) ! 280: return kIOReturnNoMemory; ! 281: if(!stopHW->init(fProgram, fControl)) { ! 282: stopHW->release(); ! 283: return kIOReturnNoMemory; ! 284: } ! 285: stopHW->submit(); ! 286: ! 287: res = stopHW->fStatus; ! 288: stopHW->release(); ! 289: return res; ! 290: } ! 291: ! 292:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.