1/* 2 * Copyright (c) 1998-2008 Apple 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 * 25 * IOATABusCommand.h 26 * 27 */ 28 29#ifndef _IOATABUSCOMMAND_H 30#define _IOATABUSCOMMAND_H 31 32#include <IOKit/IOTypes.h> 33#include "IOATATypes.h" 34#include "IOATACommand.h" 35 36 37class IOSyncer; 38 39 40/*! 41 42@class IOATABusCommand 43 44@discussion ATA Device (disk) drivers should use the superclass, IOATACommand 45and may not derive or use any subclass of IOATACommand. 46 47IOATABusCommand is the subclass of IOATACommand used by 48IOATAControllers. Controller classes may override this class to 49provide additional fields as their needs dictate or may use this 50as a concrete class if it is sufficient. 51 52IOATAControllers are always paired with specific IOATADevices 53and each specific subclass of IOATADevice is in turn the factory method 54for IOATACommands for use by disk drivers. 55 56In this manner, mass-storage device drivers (disk drivers, clients of 57ATA bus controllers) see only the generalized interface of IOATADevice 58and the generalized interface of IOATACommand. This provides isolation 59from specific bus details for disk drivers and offers flexibility to 60controllers to add per-command fields and state variables for their own 61internal use. 62 63*/ 64 65class IOATABusCommand : public IOATACommand { 66 67 OSDeclareDefaultStructors( IOATABusCommand ); 68 69 public: 70 71 // data items for use by IOATAController 72 73 /*! @var queueChain queue header for use by IOATAController. */ 74 queue_chain_t queueChain; 75 76 /*! @var state state-semaphore for use by IOATAController */ 77 UInt32 state; 78 79 /*! @var syncer IOSyncer for use by IOATAController */ 80 IOSyncer* syncer; 81 82 83 84 /*!@function allocateCmd 85 @abstract factory method to create an instance of this class used by subclasses of IOATADevice 86 */ 87 static IOATABusCommand* allocateCmd(void); 88 89 /*!@function zeroCommand 90 @abstract set to blank state, call prior to re-use of this object 91 */ 92 virtual void zeroCommand(void); 93 94 /*!@function getOpcode 95 @abstract return the command opcode 96 */ 97 virtual ataOpcode getOpcode( void ); 98 99 /*!@function getFlags 100 @abstract return the flags for this command. 101 */ 102 virtual ataFlags getFlags ( void ); 103 104 /*!@function getRegMask 105 @abstract get the register mask for desired regs 106 */ 107 virtual ataRegMask getRegMask( void ); 108 109 /*!@function getUnit 110 @abstract return the unit id (0 master, 1 slave) 111 */ 112 virtual ataUnitID getUnit( void ); 113 114 /*!@function getTimeoutMS 115 @abstract return the timeout value for this command 116 */ 117 virtual UInt32 getTimeoutMS (void ); 118 119 /*!@function setResult 120 @abstract set the result code 121 */ 122 virtual void setResult( IOReturn ); 123 124 /*!@function getCallbackPtr 125 @abstract return the callback pointer 126 */ 127 virtual IOATACompletionFunction* getCallbackPtr (void ); 128 129 130 /*!@function executeCallback 131 @abstract call the completion callback function 132 */ 133 virtual void executeCallback(void); 134 135 /*!@function getTaskFilePtr 136 @abstract return the taskfile structure pointer. 137 */ 138 virtual ataTaskFile* getTaskFilePtr(void); 139 140 /*!@function getPacketSize 141 @abstract return the size of atapi packet if any. 142 */ 143 virtual UInt16 getPacketSize(void); 144 145 /*!@function getPacketData 146 @abstract return pointer to the array of packet data. 147 */ 148 virtual UInt16* getPacketData(void); 149 150 /*!@function getTransferChunkSize 151 @abstract number of bytes between interrupts. 152 */ 153 virtual IOByteCount getTransferChunkSize(void); 154 155 /*!@function setActualTransfer 156 @abstract set the byte count of bytes actually transferred. 157 */ 158 virtual void setActualTransfer ( IOByteCount bytesTransferred ); 159 160 /*!@function getBuffer 161 @abstract get pointer to the memory descriptor for this transaction 162 */ 163 virtual IOMemoryDescriptor* getBuffer ( void); 164 165 /*!@function getPosition 166 @abstract the position within the memory buffer for the transaction. 167 */ 168 virtual IOByteCount getPosition (void); 169 170 /*!@function getByteCount 171 @abstract return the byte count for this transaction to transfer. 172 */ 173 virtual IOByteCount getByteCount (void); 174 175 /*!@function setCommandInUse 176 @abstract mark the command as being in progress. 177 */ 178 virtual void setCommandInUse( bool inUse = true); 179 180 181 protected: 182 183 // 184 /*!@function init 185 @abstract Zeroes all data, returns false if allocation fails. protected. 186 */ 187 virtual bool init(); 188 189/*! @struct ExpansionData 190 @discussion This structure will be used to expand the capablilties of the IOWorkLoop in the future. 191 */ 192 struct ExpansionData { }; 193 194/*! @var reserved 195 Reserved for future use. (Internal use only) */ 196 ExpansionData *reserved; 197 198private: 199 OSMetaClassDeclareReservedUnused(IOATABusCommand, 0); 200 OSMetaClassDeclareReservedUnused(IOATABusCommand, 1); 201 OSMetaClassDeclareReservedUnused(IOATABusCommand, 2); 202 OSMetaClassDeclareReservedUnused(IOATABusCommand, 3); 203 OSMetaClassDeclareReservedUnused(IOATABusCommand, 4); 204 OSMetaClassDeclareReservedUnused(IOATABusCommand, 5); 205 OSMetaClassDeclareReservedUnused(IOATABusCommand, 6); 206 OSMetaClassDeclareReservedUnused(IOATABusCommand, 7); 207 OSMetaClassDeclareReservedUnused(IOATABusCommand, 8); 208 OSMetaClassDeclareReservedUnused(IOATABusCommand, 9); 209 OSMetaClassDeclareReservedUnused(IOATABusCommand, 10); 210 OSMetaClassDeclareReservedUnused(IOATABusCommand, 11); 211 OSMetaClassDeclareReservedUnused(IOATABusCommand, 12); 212 OSMetaClassDeclareReservedUnused(IOATABusCommand, 13); 213 OSMetaClassDeclareReservedUnused(IOATABusCommand, 14); 214 OSMetaClassDeclareReservedUnused(IOATABusCommand, 15); 215 OSMetaClassDeclareReservedUnused(IOATABusCommand, 16); 216 OSMetaClassDeclareReservedUnused(IOATABusCommand, 17); 217 OSMetaClassDeclareReservedUnused(IOATABusCommand, 18); 218 OSMetaClassDeclareReservedUnused(IOATABusCommand, 19); 219 OSMetaClassDeclareReservedUnused(IOATABusCommand, 20); 220}; 221 222#include <IOKit/IODMACommand.h> 223 224class IOATABusCommand64 : public IOATABusCommand 225{ 226 227 OSDeclareDefaultStructors( IOATABusCommand64 ); 228 229 public: 230 231 // new features 232 static IOATABusCommand64* allocateCmd32(void); 233 virtual IODMACommand* GetDMACommand( void ); 234 235 236 237 // overrides for IODMACommand setup 238 virtual void zeroCommand(void); 239 virtual void setBuffer ( IOMemoryDescriptor* inDesc); 240 virtual void setCommandInUse( bool inUse = true); 241 virtual void executeCallback(void); 242 243 244 protected: 245 IODMACommand* _dmaCmd; 246 virtual bool init(); 247 virtual void free(); 248}; 249 250#endif /*_IOATABUSCOMMAND_H*/ 251