|
|
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: ! 24: /*! ! 25: @header IOSCSIDevice_Reference.h ! 26: ! 27: This header defines the IOSCSIDevice class. ! 28: ! 29: The SCSI framework creates instances of this class to ! 30: represent each valid SCSI device (target/lun) detected during ! 31: SCSI bus scanning. When an instance of this class is registered with ! 32: IOKit, the instance will be presented to clients which ! 33: 'match' the IOSCSIDevice class. ! 34: */ ! 35: ! 36: /*! ! 37: @typedef SCSITargetParms ! 38: Parameter structure for get/setTargetParms ! 39: @field transferPeriodpS ! 40: Minimum SCSI synchronous transfer period allowed ! 41: for this target in picoseconds (10E-12). For asynchronous data transfer, ! 42: set this field to 0. ! 43: @field transferOffset ! 44: Maximum SCSI synchronous transfer offset allowed for this target in ! 45: bytes. For asynchronous data transfer, set this field to 0. ! 46: @field transferWidth ! 47: Maximum SCSI bus width in bytes. Note: must be a ! 48: power of 2. ! 49: @field enableTagQueuing ! 50: Setting enableTagQueuing to true enables tag queuing for SCSI Commands ! 51: issued to the target. ! 52: @field disableParity ! 53: Set to (true) to disable parity checking on the ! 54: SCSI bus for this target. ! 55: */ ! 56: typedef struct SCSITargetParms { ! 57: UInt32 transferPeriodpS; ! 58: UInt32 transferOffset; ! 59: UInt32 transferWidth; ! 60: ! 61: bool enableTagQueuing; ! 62: bool disableParity; ! 63: ! 64: UInt32 reserved[16]; ! 65: ! 66: } SCSITargetParms; ! 67: ! 68: ! 69: /*! ! 70: @typedef SCSILunParms ! 71: Parameter structure for get/setLunParms ! 72: @field disableDisconnect ! 73: Setting disableDisconnect to true disables SCSI disconnect for SCSI ! 74: Commands issued to the target/lun pair. ! 75: */ ! 76: typedef struct SCSILunParms { ! 77: bool disableDisconnect; ! 78: ! 79: UInt32 reserved[16]; ! 80: ! 81: } SCSILunParms; ! 82: ! 83: ! 84: /*! ! 85: @enum SCSIClientMessage ! 86: @discussion ! 87: IOSCSIDevice notifies its client of significant 'events' by the IOService::message() ! 88: api. When possible the client is notified of the event prior to any action taken. The ! 89: client is responsible for managing the device queue for the IOSCSIDevice ! 90: via the holdQueue(), releaseQueue(), flushQueue() and notifyIdle() api's. The client is also ! 91: notified at the end of an 'event' by the corresponding message id with or'd with ! 92: kClientMsgDone. ! 93: @constant kClientMsgDeviceAbort ! 94: A client initiated device abort is beginning. ! 95: @constant kClientMsgDeviceReset ! 96: A client initiated device reset is beginning. ! 97: @constant kClientMsgBusReset ! 98: An unsolicited bus reset has occurred. ! 99: @constant kClientMsgDone ! 100: This constant is or'd with one of the above message ids to indicate the ! 101: client should complete processing of the corresponding event. ! 102: */ ! 103: enum SCSIClientMessage { ! 104: kClientMsgDeviceAbort = 0x00005000, ! 105: kClientMsgDeviceReset, ! 106: kClientMsgBusReset, ! 107: ! 108: kClientMsgDone = 0x80000000, ! 109: }; ! 110: ! 111: ! 112: /*! ! 113: @class IOSCSIDevice : public IOCDBDevice ! 114: @abstract ! 115: Class that describes a SCSI device (target/lun pair). ! 116: @discussion ! 117: The IOSCSIDevice class provides basic services ! 118: to initialize and supervise a SCSI device. Once the device is ! 119: initialized, the client will normally use the allocCommand() member ! 120: function to create IOSCSICommand(s) to send SCSI CDBs to the target/lun. ! 121: */ ! 122: class IOSCSIDevice : public IOCDBDevice ! 123: { ! 124: public: ! 125: ! 126: /*! ! 127: @function allocCommand ! 128: @abstract ! 129: Allocates a IOSCSICommand object for this device. ! 130: @discussion ! 131: The client uses the allocCommand() member function to allocate IOSCSICommand(s) ! 132: for a IOSCSIDevice. The client then uses the member functions of ! 133: the IOSCSICommand to initialize it and send it to the device. A completed IOSCSICommand ! 134: may be reused for subsequent I/O requests or returned to the SCSI Family. ! 135: @param scsiDevice ! 136: Always specify kIOSCSIDevice. ! 137: @param clientDataSize ! 138: The client may indicate the size of a per-command data area for its own ! 139: use. ! 140: ! 141: Note: The amount of per-command storage allowed is under review. We ! 142: anticipate that typical SCSI clients will need not more than 1024 bytes ! 143: per command. ! 144: */ ! 145: IOSCSICommand *allocCommand( IOSCSIDevice *scsiDevice, UInt32 clientDataSize = 0 ); ! 146: ! 147: ! 148: /*! ! 149: @function setTargetParms ! 150: @abstract ! 151: Sets SCSI parameters that apply to all luns on a SCSI target device. ! 152: @discussion ! 153: This function will block until we attempt to set the ! 154: requested parameters. It may not be called from the device's workloop context. ! 155: ! 156: The SCSI Family will serialize accesses to the SCSI ! 157: target so as not to disrupt commands in progress prior to processing a ! 158: change of target parameters. ! 159: @param targetParms ! 160: Pointer to structure of type SCSITargetParms. ! 161: */ ! 162: bool setTargetParms( SCSITargetParms *targetParms ); ! 163: ! 164: ! 165: /*! ! 166: @function getTargetParms ! 167: @abstract ! 168: Gets the current target parameters. ! 169: @discussion ! 170: Returns the parameters currently in effect for the SCSI target. ! 171: See setTargetParms(). ! 172: @param targetParms ! 173: Pointer to structure of type SCSITargetParms. ! 174: */ ! 175: void getTargetParms( SCSITargetParms *targetParms ); ! 176: ! 177: ! 178: /*! ! 179: @function setLunParms ! 180: @abstract ! 181: Sets the logical unit parameters for this device. ! 182: @discussion ! 183: This function will block until we attempt to set the ! 184: requested parameters. It may not be called from the device's workloop context. ! 185: ! 186: The SCSI Family will serialize accesses to the SCSI ! 187: target/lun so as not to disrupt commands in progress prior to processing a ! 188: change of lun parameters. ! 189: @param lunParms ! 190: Pointer to structure of type SCSILunParms ! 191: */ ! 192: bool setLunParms( SCSILunParms *lunParms ); ! 193: ! 194: ! 195: /*! ! 196: @function getLunParms ! 197: @abstract ! 198: Gets the current logical unit parameters. ! 199: @discussion ! 200: Returns the parameters currently in effect for the SCSI target/lun. ! 201: @param lunParms ! 202: Pointer to structure of type SCSITargetParms ! 203: */ ! 204: void getLunParms( SCSILunParms *lunParms ); ! 205: ! 206: ! 207: /*! ! 208: @function abort ! 209: @abstract ! 210: Aborts all outstanding requests for the target/lun pair. ! 211: @discussion ! 212: If any I/O requests are currently active for the target/lun, an abort ! 213: command is sent to the device and any active requests are completed. ! 214: ! 215: Prior to abort processing beginning, the client will be notified via: ! 216: ! 217: message( kClientMsgDeviceAbort ); ! 218: ! 219: When abort processing is completed, the client will be notified via: ! 220: ! 221: message( kClientMsgDeviceAbort | kClientMsgDone ); ! 222: ! 223: The client is responsible for managing the pending work queue for ! 224: the device when an abort request occurs. See holdQueue(), flushQueue(), ! 225: notifyIdle() functions. ! 226: */ ! 227: void abort(); ! 228: ! 229: ! 230: /*! ! 231: @function reset ! 232: @abstract ! 233: Resets the SCSI target. ! 234: @discussion ! 235: Since a SCSI target may have multiple logical units (lun(s)) the ! 236: reset() function may affect multiple IOSCSIDevice instances. Processing for ! 237: each lun is similar. ! 238: ! 239: Prior to reset processing beginning, the client will be notified via: ! 240: ! 241: message( kClientMsgDeviceReset ); ! 242: ! 243: When reset processing is completed, the client will be notified via: ! 244: ! 245: message( kClientMsgDeviceReset | kClientMsgDone ); ! 246: ! 247: The client is responsible for managing the pending work queue for ! 248: the device when an abort request occurs. See holdQueue(), flushQueue(), ! 249: notifyIdle() functions. ! 250: */ ! 251: void reset(); ! 252: ! 253: ! 254: /*! ! 255: @function getInquiryData ! 256: @abstract Returns SCSI Inquiry data for the IOSCSIDevice. ! 257: @discussion ! 258: Inquiry data returned is from the results of the last SCSI bus probe. ! 259: @param inquiryBuffer ! 260: Pointer to a buffer to receive the Inquiry data. ! 261: @param inquiryBufSize ! 262: Size of the buffer supplied. ! 263: @param inquiryDataSize ! 264: Pointer to a UInt32 to receive the size of the Inquiry data actually ! 265: returned. ! 266: */ ! 267: void getInquiryData( void *inquiryBuffer, UInt32 inquiryBufSize, UInt32 *inquiryDataSize ); ! 268: ! 269: ! 270: /*! ! 271: @function message ! 272: @abstract ! 273: IOService message function. ! 274: @discussion ! 275: IOSCSIDevice notifies its client of significant 'events' by the IOService::message() ! 276: api. When possible the client is notified of the event prior to any action taken. The ! 277: client is responsible for managing the device queue for the IOSCSIDevice ! 278: via the holdQueue(), releaseQueue(), flushQueue() and notifyIdle() api's. ! 279: ! 280: Any return codes provided by the client are ignored. ! 281: @param message-id ! 282: Message id's for IOSCSIDevice are defined by enum SCSIClientMessage ! 283: @param provider ! 284: Pointer to the IOSCSIDevice reporting the event. ! 285: @param argument ! 286: Unused. ! 287: */ ! 288: IOReturn message( UInt32 type, IOService * provider, void * argument = 0 ); ! 289: ! 290: ! 291: /*! ! 292: @function open ! 293: @abstract ! 294: IOService open function ! 295: @discussion ! 296: A client should open a IOSCSIDevice prior to accessing it. Only one open is allowed ! 297: per device. ! 298: @param client ! 299: Pointer to the IOSCSI device the client is opening. ! 300: @param options ! 301: There are currently no options defined by the SCSI Family. ! 302: @param arg ! 303: Unused. Omit or specify 0. ! 304: */ ! 305: bool open( IOService *client, IOOptionBits options = 0, void *arg = 0 ); ! 306: ! 307: ! 308: /*! ! 309: @function close ! 310: @abstract ! 311: IOService close function ! 312: @discussion ! 313: A client must close a IOSCSIDevice if the client plans no further accesses to it. ! 314: @param client ! 315: Pointer to the IOSCSI device the client is closing. ! 316: @param options ! 317: There are currently no options defined by the SCSI Family. ! 318: */ ! 319: void close( IOService *client, IOOptionBits options = 0 ); ! 320: ! 321: ! 322: /*! ! 323: @function holdQueue ! 324: @abstract ! 325: Suspends sending additional IOSCSICommands to the target/lun. ! 326: @discussion ! 327: holdQueue() may only be called from the IOSCSIDevice workloop. The client ! 328: is guaranteed to be running in this context during a message() notification. ! 329: ! 330: holdQueue() has no effect on commands already passed to the host adapter. One ! 331: or more commands may complete after the queue is held. See notifyIdle() ! 332: @param queueType ! 333: Perform action on the indicated queue. See enum SCSIQueueType in IOSCSICommand. ! 334: */ ! 335: holdQueue( UInt32 queueType ); ! 336: ! 337: ! 338: /*! ! 339: @function flushQueue ! 340: @abstract ! 341: Returns any commands on the IOSCSIDevice's pending work queue. ! 342: @discussion ! 343: flushQueue() may only be called from the IOSCSIDevice workloop. This is ! 344: guaranteed to be the case after a IOSCSICommand completion of after a ! 345: message() notification. ! 346: ! 347: All pending command are completed prior to flushQueue() returning to the caller. ! 348: ! 349: flushQueue() has no effect on commands already passed to the host adapter. One ! 350: or more commands may complete after the queue is flushed. See notifyIdle(). ! 351: @param queueType ! 352: Perform action on the indicated queue. See enum SCSIQueueType in IOSCSICommand. ! 353: @param rc ! 354: The return code of any flushed commands is set to (rc). ! 355: */ ! 356: void flushQueue( UInt32 queueType, IOReturn rc ); ! 357: ! 358: ! 359: /*! ! 360: @function notifyIdle ! 361: @abstract ! 362: Notifies the client when all active commands on a SCSI device have completed. ! 363: @discussion ! 364: notifyIdle() may only be called from the IOSCSIDevice workloop. This is guaranteed ! 365: to be the case after a IOSCSICommand completion of after a message() notification. ! 366: ! 367: Only one notifyIdle() call may be active. Any outstanding notifyIdle() calls may ! 368: be cancelled by calling notifyIdle() with no parameters. ! 369: @param target ! 370: Object to receive the notification. Normally the client's (this) pointer. ! 371: @param callback ! 372: Pointer to a callback routine of type CallbackFn. ! 373: @param refcon ! 374: Pointer to client's private data. ! 375: */ ! 376: void notifyIdle( void *target, Callback callback, void *refcon ); ! 377: ! 378: ! 379: /*! ! 380: @function releaseQueue ! 381: @abstract ! 382: Resumes sending IOSCSICommands to the IOSCSIDevice. ! 383: @discussion ! 384: If the device queue was not held, releaseQueue() has no effect. ! 385: ! 386: releaseQueue() may only be called from the IOSCSIDevice workloop. This is guaranteed ! 387: to be the case after a IOSCSICommand completion of after a message() notification. ! 388: @param queueType ! 389: Perform action on the indicated queue. See enum SCSIQueueType in IOSCSICommand. ! 390: */ ! 391: void releaseQueue( UInt32 queueType ); ! 392: ! 393: ! 394: /*! ! 395: @function getWorkLoop ! 396: @abstract ! 397: Returns the IOWorkLoop object that services this IOSCSIDevice. ! 398: */ ! 399: IOWorkloop *getWorkLoop(); ! 400: ! 401: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.