Annotation of XNU/iokit/IOKit/firewire/IOFireWireController.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: /*
                     23:  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved.
                     24:  *
                     25:  * HISTORY
                     26:  *
                     27:  */
                     28: 
                     29: 
                     30: #ifndef _IOKIT_IOFIREWIRECONTROLLER_H
                     31: #define _IOKIT_IOFIREWIRECONTROLLER_H
                     32: 
                     33: #include <IOKit/firewire/IOFireWireBus.h>
                     34: #include <IOKit/firewire/IOFWRegs.h>
                     35: #include <IOKit/firewire/IOFireWirePriv.h>
                     36: 
                     37: extern const OSSymbol *gFireWireROM;
                     38: extern const OSSymbol *gFireWireNodeID;
                     39: extern const OSSymbol *gFireWireSelfIDs;
                     40: extern const OSSymbol *gFireWireSpeed;
                     41: extern const OSSymbol *gFireWireUnit_Spec_ID;
                     42: extern const OSSymbol *gFireWireUnit_SW_Version;
                     43: extern const OSSymbol *gFireWireVendor_ID;
                     44: extern const OSSymbol *gFireWire_GUID;
                     45: 
                     46: class OSData;
                     47: class IOWorkLoop;
                     48: class IOTimerEventSource;
                     49: class IOCommandGate;
                     50: class IOMemoryDescriptor;
                     51: class IOFireWireController;
                     52: class IOFWAddressSpace;
                     53: class IOFireWireNub;
                     54: class IOFireWireDevice;
                     55: class IOFWCommand;
                     56: class IOFWAsyncCommand;
                     57: class IODCLProgram;
                     58: struct NodeScan;
                     59: 
                     60: typedef void (*PacketHandler)(void *refCon, IOFireWireController* control, int rcode, UInt8* data, int size);
                     61: 
                     62: struct AsyncPendingTrans {
                     63:     IOFWAsyncCommand * fHandler;
                     64:     int                        fTCode;
                     65:     bool               fInUse;
                     66: };
                     67: 
                     68: // May want to change this, to use two tcodes per request block.
                     69: #define kMaxPendingTransfers kFWAsynchTTotal
                     70: 
                     71: class IOFireWireController : public IOFireWireBus
                     72: {
                     73:     OSDeclareAbstractStructors(IOFireWireController)
                     74: 
                     75: protected:
                     76:     IOWorkLoop *       fWorkLoop;
                     77:     IOTimerEventSource *fTimer;
                     78:     IOCommandGate *    fGate;
                     79:     OSSet *            fLocalAddresses;        // Collection of local adress spaces
                     80:     OSIterator *       fSpaceIterator;         // Iterator over local addr spaces
                     81: 
                     82:     OSSet *            fAllocatedChannels;     // Need to be informed of bus resets
                     83:     OSIterator *       fAllocChannelIterator;  // Iterator over channels
                     84:     IOLock *           fChannelLock;
                     85: 
                     86:     // Bus management variables (although we aren't a FireWire Bus Manager...)
                     87:     AbsoluteTime       fResetTime;             // Time of last reset
                     88:     UInt32             fLocalNodeID;           // ID of the local node.
                     89:     UInt32             fBusGeneration;         // ID of current bus topology.
                     90:     UInt16             fRootNodeID;            // ID of root, ie. highest node id in use.
                     91:     UInt16             fIRMNodeID;             // ID of Isochronous resource manager, or kFWBadNodeID
                     92:     IOFireWireDevice * fIRMDevice;             // NULL if no IRM.
                     93:     IORegistryEntry *  fNodes[kFWMaxNodesPerBus];      // FireWire nodes on this bus
                     94:     UInt32 *           fNodeIDs[kFWMaxNodesPerBus+1];  // Pointer to SelfID list for each node
                     95:                                                        // +1 so we know how many selfIDs the last node has
                     96:     UInt8              fSpeedCodes[(kFWMaxNodesPerBus+1)*kFWMaxNodesPerBus];
                     97:                                                // Max speed between two nodes
                     98:     bool               fInReset;               // True if processing a reset (waiting for selfIDs)
                     99:     int                        fNumROMReads;           // Number of device ROMs we are still reading
                    100:     // SelfIDs
                    101:     int                        fNumSelfIDs;            // Total number of SelfID packets
                    102:     UInt32             fSelfIDs[kMaxSelfIDs*kFWMaxNodesPerBus];
                    103: 
                    104:     // The local device's CSR ROM
                    105:     UInt32             fCSRROMGeneration;      // Generation number of CSR ROM.
                    106:     CSRROMDirectoryData        fCSRROMRootDirectory;   // Local CSR ROM root directory.
                    107:     CSRNodeUniqueID    fUniqueID;              // ID unique to this device.
                    108:     UInt32             fROMHeader[5];          // More or less fixed header and bus info block
                    109:     IOFWAddressSpace * fROMAddrSpace;
                    110: 
                    111:     // Array for outstanding requests (up to 64)
                    112:     AsyncPendingTrans  fTrans[kMaxPendingTransfers];
                    113:     int                        fLastTrans;
                    114:     IOLock *           fTransAllocLock;
                    115: 
                    116:     static IOReturn execCommand(OSObject * obj, void *field0, void *field1,
                    117:                                                 void *field2, void *field3);
                    118:     static void clockTick(OSObject *, IOTimerEventSource *);
                    119:     static void readROMGlue(void *refcon, IOReturn status,
                    120:                        IOFireWireNub *device, IOFWCommand *fwCmd);
                    121:     virtual IOWorkLoop * createWorkLoop();
                    122:     virtual bool startWorkLoop();
                    123: 
                    124:     virtual void processBusReset();
                    125:     virtual void processSelfIDs(UInt32 *IDs, int numIDs, UInt32 *ownIDs, int numOwnIDs);
                    126:     virtual void processRcvPacket(UInt32 *data, int numQuads);
                    127:     virtual void processWriteRequest(UInt16 sourceID, UInt32 tlabel,
                    128:                                UInt32 *hdr, void *buf, int len);
                    129:     virtual void processLockRequest(UInt16 sourceID, UInt32 tlabel,
                    130:                                UInt32 *hdr, void *buf, int len);
                    131: 
                    132:     virtual void pruneDevices();
                    133: 
                    134:     virtual void buildTopology(bool doFWPlane);
                    135: 
                    136:     virtual void readDeviceROM(NodeScan *refCon, IOReturn status);
                    137: 
                    138: // Hack so old OHCI driver will compile
                    139:     virtual IODCLProgram *createDCLProgram(bool talking, DCLCommandStruct *opcodes,
                    140:             UInt32 startEvent, UInt32 startState, UInt32 startMask){return NULL;};
                    141: 
                    142:     virtual IODCLProgram *createDCLProgram(bool talking, DCLCommandStruct *opcodes,
                    143:             DCLTaskInfo *info, UInt32 startEvent, UInt32 startState, UInt32 startMask)
                    144:        {return createDCLProgram(talking, opcodes, startEvent, startState,  startMask); };
                    145: 
                    146:     // Send a PHY packet
                    147:     virtual IOReturn sendPHYPacket(UInt32 quad) = 0;
                    148: 
                    149: public:
                    150: 
                    151:     static const IORegistryPlane * gIOFireWirePlane;
                    152: 
                    153:     // Initialization
                    154:     virtual bool init(OSDictionary * dict);
                    155: 
                    156:     // Implement IOService::getWorkLoop
                    157:     virtual IOWorkLoop *getWorkLoop() const;
                    158: 
                    159:     // Methods called by commands. Not really public.
                    160:     virtual void fireBugMsg(const char *msg) = 0;
                    161:     virtual IOReturn resetBus() = 0;
                    162:     virtual IOReturn asyncRead(UInt16 nodeID, UInt16 addrHi, UInt32 addrLo, 
                    163:                                int speed, int label, int size, IOFWAsyncCommand *cmd) = 0;
                    164:     virtual IOReturn asyncReadQuadResponse(UInt16 nodeID, int speed, 
                    165:                                        int label, int rcode, UInt32 data) = 0;
                    166:     virtual IOReturn asyncReadResponse(UInt16 nodeID, int speed, 
                    167:                                        int label, int rcode, void *data, int len) = 0;
                    168:     virtual IOReturn asyncReadResponse(UInt16 nodeID, int speed,
                    169:                                        int label, int rcode, IOMemoryDescriptor *buf,
                    170:                                       IOByteCount offset, int len) = 0;
                    171: 
                    172:     virtual IOReturn asyncWrite(UInt16 nodeID, UInt16 addrHi, UInt32 addrLo,
                    173:                int speed, int label, IOMemoryDescriptor *buf, IOByteCount offset,
                    174:                int size, IOFWAsyncCommand *cmd) = 0;
                    175:     virtual IOReturn asyncWrite(UInt16 nodeID, UInt16 addrHi, UInt32 addrLo,
                    176:                                 int speed, int label, void *data, int size, IOFWAsyncCommand *cmd) = 0;
                    177:     virtual IOReturn asyncWriteResponse(UInt16 nodeID, int speed, 
                    178:                                        int label, int rcode, UInt16 addrHi) = 0;
                    179: 
                    180:     virtual IOReturn asyncLock(UInt16 nodeID, UInt16 addrHi, UInt32 addrLo, 
                    181:                        int speed, int label, int type, void *data, int size, IOFWAsyncCommand *cmd) = 0;
                    182:     virtual IOReturn asyncLockResponse(UInt16 nodeID, int speed, 
                    183:                                int label, int rcode, int type, void *data, int len) = 0;
                    184: 
                    185:     // Read Cycle time register. safe to call at any time.
                    186:     virtual IOReturn getCycleTime(UInt32 *cycleTime) = 0;
                    187: 
                    188:     virtual IOReturn allocAddress(IOFWAddressSpace *space);
                    189:     virtual void freeAddress(IOFWAddressSpace *space);
                    190:     virtual IOReturn UpdateROM();
                    191: 
                    192:     // Allocate struct for receiving a read response
                    193:     virtual AsyncPendingTrans *allocTrans(bool sleepOK = true);
                    194:     virtual void freeTrans(AsyncPendingTrans *trans);
                    195: 
                    196:     // Really public methods
                    197: 
                    198:     // Methods to manipulate the local CSR ROM
                    199:     virtual IOReturn CSRROMGetRootDirectory(CSRROMEntryID *pCSRROMEntryID);
                    200:     virtual IOReturn CSRROMCreateEntry(CSRROMEntryID parentCSRROMEntryID, CSRROMEntryID *pCSRROMEntryID,
                    201:        UInt32 entryType, UInt32 entryKeyValue, void *entryData, UInt32 entrySize);
                    202: 
                    203:     // Convert a firewire nodeID into the IOFireWireDevice for it
                    204:     virtual IOFireWireDevice * nodeIDtoDevice(UInt16 nodeID);
                    205: 
                    206:     // Add/remove a channel from the list informed of bus resets
                    207:     virtual void addAllocatedChannel(IOFWIsochChannel *channel);
                    208:     virtual void removeAllocatedChannel(IOFWIsochChannel *channel);
                    209: 
                    210:     // Create a device nub
                    211:     virtual IOFireWireDevice *createDeviceNub(OSDictionary *propTable);
                    212: 
                    213:     // Create an Isochronous Channel object
                    214:     virtual IOFWIsochChannel *createIsochChannel(
                    215:        bool doIRM, UInt32 bandwidth, IOFWSpeed prefSpeed,
                    216:        FWIsochChannelForceStopNotificationProc stopProc=NULL,
                    217:        void *stopRefCon=NULL);
                    218: 
                    219:     // Create a local isochronous port to run the given DCL program
                    220:     // if task is 0, the DCL program is for the kernel task,
                    221:     // otherwise all DCL pointers are valid in the specified task.
                    222:     // opcodes is also pointer valid in the specified task.
                    223:     virtual IOFWIsochPort *createLocalIsochPort(bool talking,
                    224:         DCLCommandStruct *opcodes, DCLTaskInfo *info = 0,
                    225:        UInt32 startEvent = 0, UInt32 startState = 0, UInt32 startMask = 0);
                    226: 
                    227:     // Inline accessors for protected member variables
                    228:     IOCommandGate *getGate() const {return fGate;};
                    229:     bool checkGeneration(UInt32 gen) const {return gen == fBusGeneration;};
                    230:     UInt32 getGeneration() const {return fBusGeneration;};
                    231:     UInt16 getIRMNodeID() const {return fIRMNodeID;};
                    232:     IOFireWireDevice * getIRMDevice() const {return fIRMDevice;};
                    233:     const AbsoluteTime * getResetTime() const {return &fResetTime;};
                    234: 
                    235:     IOFWSpeed FWSpeed(UInt16 nodeAddress) const
                    236:        {return (IOFWSpeed)fSpeedCodes[(kFWMaxNodesPerBus+1)*(nodeAddress & 63)+(fLocalNodeID & 63)];};
                    237:     IOFWSpeed FWSpeed(UInt16 nodeA, UInt16 nodeB) const
                    238:       {return (IOFWSpeed)fSpeedCodes[(kFWMaxNodesPerBus+1)*(nodeA & 63)+(nodeB & 63)];};
                    239: 
                    240:     // How big (as a power of two) can packets sent to/received from the node be?
                    241:     virtual int maxPackLog(bool forSend, UInt16 nodeAddress) const;
                    242: 
                    243:     // How big (as a power of two) can packets sent from A to B be?
                    244:     virtual int maxPackLog(UInt16 nodeA, UInt16 nodeB) const;
                    245: };
                    246: 
                    247: #endif /* ! _IOKIT_IOFIREWIRECONTROLLER_H */
                    248: 

unix.superglobalmegacorp.com

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