Annotation of XNU/iokit/IOKit/scsi/IOSCSIDevice_Reference.h, revision 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: 
        !            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: }

unix.superglobalmegacorp.com

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