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/*! 24 @header IOFireWireSBP2Target 25 Contains the class definition for IOFireWireSBP2Target. 26*/ 27 28#ifndef _IOKIT_IOFIREWIRESBP2TARGET_H 29#define _IOKIT_IOFIREWIRESBP2TARGET_H 30 31#include <IOKit/firewire/IOFireWireUnit.h> 32#include <IOKit/IOService.h> 33 34enum 35{ 36 kIOFWSBP2FailsOnAckBusy = (1 << 0), 37 kIOFWSBP2FailsOnBusResetsDuringIO = (1 << 1), 38 kIOFWSBP2DontUsePTPacketLimit = (1 << 2) 39}; 40 41/*! 42 @class IOFireWireSBP2Target 43 @abstract Serves as bridge between IOFireWireUnit and IOFireWireLUN. 44 @discussion Matches against IOFireWireUnits supporting the SBP2 protocol. Creates IOFireWireSBP2LUN nubs for matching. Most drivers will match against an IOFireWireSBP2LUN, but matching against an IOFireWireSBP2Target is also supported. This can be useful in cases where a single driver wishes to 45 control all LUNs on a device. Support for this technique is minimal, however, and the driver will be 46 required to discover it's LUNs through the registry. 47*/ 48 49class IOFireWireSBP2Target : public IOService 50{ 51 OSDeclareDefaultStructors(IOFireWireSBP2Target); 52 53protected: 54 55 ///////////////////////////////////////// 56 // rom keys 57 58 enum 59 { 60 kCmdSpecIDKey = 0x38, 61 kCmdSetKey = 0x39, 62 kSoftwareRevKey = 0x3b, 63 kFirmwareRevKey = 0x3c, 64 kLUNKey = 0x14, 65 kLUNDirectoryKey = 0xd4, 66 kManagementAgentOffsetKey = 0x54, 67 kUnitCharacteristicsKey = 0x3A, 68 kRevisionKey = 0x21, 69 kFastStartKey = 0x3E 70 }; 71 72 typedef struct 73 { 74 UInt32 cmdSpecID; 75 UInt32 cmdSet; 76 UInt32 vendorID; 77 UInt32 softwareRev; 78 UInt32 firmwareRev; 79 UInt32 lun; 80 UInt32 devType; 81 UInt32 unitCharacteristics; 82 UInt32 managementOffset; 83 UInt32 revision; 84 bool fastStartSupported; 85 UInt32 fastStart; 86 } LUNInfo; 87 88 // reserved for future use 89 struct ExpansionData 90 { 91 bool fStarted; 92 OSArray * fPendingMgtAgentCommands ; 93 UInt32 fNumberPendingMgtAgentOrbs; 94 UInt32 fNumLUNs; 95 }; 96 ExpansionData * fExpansionData; 97 98 ///////////////////////////////////////// 99 // private fields 100 101 bool fOpenFromTarget; 102 UInt32 fOpenFromLUNCount; 103 IOFireWireUnit * fProviderUnit; 104 UInt32 fFlags; 105 106 IOFireWireController * fControl; 107 108 UInt32 fIOCriticalSectionCount; 109 110 ///////////////////////////////////////// 111 // private internals 112 113 virtual void free( void ); 114 virtual IOReturn message( UInt32 type, 115 IOService * provider, 116 void * argument = 0); 117 118 virtual void scanForLUNs( void ); 119 IOReturn createLUN( LUNInfo * info ); 120 121public: 122 123 ///////////////////////////////////////// 124 // public methods 125 126 /*! @function handleOpen 127 @abstract Overrideable method to control the open / close behaviour of an IOService. 128 @discussion See IOService for discussion. 129 @param forClient Designates the client of the provider requesting the open. 130 @param options Options for the open, may be interpreted by the implementor of handleOpen. 131 @result Return true if the open was successful, false otherwise. */ 132 133 virtual bool handleOpen( IOService * forClient, IOOptionBits options, void * arg ); 134 135 /*! 136 @function handleClose 137 @abstract Overrideable method to control the open / close behaviour of an IOService. 138 @discussion See IOService for discussion. 139 @param forClient Designates the client of the provider requesting the close. 140 @param options Options for the close, may be interpreted by the implementor of handleOpen. 141 */ 142 143 virtual void handleClose( IOService * forClient, IOOptionBits options ); 144 145 /*! 146 @function handleIsOpen 147 @abstract Overrideable method to control the open / close behaviour of an IOService. 148 @discussion See IOService for discussion. 149 @param forClient If non-zero, isOpen returns the open state for that client. If zero is passed, isOpen returns the open state for all clients. 150 @result Returns true if the specific, or any, client has the IOService open. 151 */ 152 153 virtual bool handleIsOpen( const IOService * forClient ) const; 154 155 /*! 156 @function start 157 @abstract During an IOService instantiation, the start method is called when the IOService has been selected to run on the provider. 158 @discussion See IOService for discussion. 159 @result Return true if the start was successful, false otherwise (which will cause the instance to be detached and usually freed). 160 */ 161 162 virtual bool start( IOService *provider ); 163 164 /*! 165 @function stop 166 @abstract During an IOService termination, the stop method is called in its clients before they are detached & it is destroyed. 167 @discussion See IOService for discussion. 168 */ 169 170 virtual void stop( IOService *provider ); 171 172 /*! 173 @function getFireWireUnit 174 @abstract Returns an IOFireWireUnit object. 175 @discussion An IOFireWireUnit is the provider of an IOFireWireSBP2Target. In order to use the base FireWire services 176 you will need a reference to the unit. This method returns that reference. 177 @result Returns a pointer to an IOFireWireUnit. 178 */ 179 180 virtual IOFireWireUnit * getFireWireUnit( void ); 181 182 /*! 183 @function matchPropertyTable 184 @abstract Implements SBP2 specific matching. 185 @discussion See IOService for discussion. 186 @param table The dictionary of properties to be matched against. 187 @result Returns false if the family considers the matching dictionary does not match in properties it understands, true otherwise. 188 */ 189 190 virtual bool matchPropertyTable( OSDictionary * table ); 191 192 virtual void setTargetFlags( UInt32 flags ); 193 virtual UInt32 getTargetFlags( void ); 194 195protected: 196 virtual void configurePhysicalFilter( void ); 197 198public: 199 virtual void clearTargetFlags( UInt32 flags ); 200 virtual IOReturn beginIOCriticalSection( void ); 201 virtual void endIOCriticalSection( void ); 202 203 virtual bool finalize( IOOptionBits options ); 204 205 IOReturn synchMgmtAgentAccess( IOFWCommand * mgmtOrbCommand ); 206 void completeMgmtAgentAccess( ); 207 void clearMgmtAgentAccess( ); 208 void cancelMgmtAgentAccess( IOFWCommand * mgmtOrbCommand ); 209 210protected: 211 212 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 0); 213 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 1); 214 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 2); 215 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 3); 216 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 4); 217 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 5); 218 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 6); 219 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 7); 220 OSMetaClassDeclareReservedUnused(IOFireWireSBP2Target, 8); 221 222}; 223 224#endif 225