Annotation of XNU/iokit/IOKit/scsi/IOSCSICommand_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 IOSCSICommand_Reference.h 
        !            26: 
        !            27: This header defines the IOSCSICommand class.
        !            28: 
        !            29: This class encapsulates a SCSI Command. The client driver allocates a
        !            30: command using IOSCSIDevice::allocCommand() and initializes it using
        !            31: functions of this class. The client can then submit the command to
        !            32: the SCSI stack by invoking the execute() function.
        !            33: */
        !            34: 
        !            35: 
        !            36: /*!
        !            37: @enum SCSICDBFlags
        !            38: Defines values for the cdbFlags field in the SCSICDBInfo structure.
        !            39: @constant kCDBFNoDisconnect
        !            40: Set by the IOSCSIDevice client to indicate the target may not disconnect
        !            41: during the execution of this IOSCSICommand.
        !            42: @constant kCDBFlagsDisableParity
        !            43: Set by the IOSCSIController class to tell the host adapter driver to disable
        !            44: parity checking during the execution of this CDB.
        !            45: @constant kCDBFlagsNoDisconnect
        !            46: Set by the IOSCSIController class to tell the host adapter driver that the 
        !            47: target may not disconnect during the execution of this IOSCSICommand.
        !            48: @constant kCDBFlagsNegotiateSDTR
        !            49: Set by the IOSCSIController class to tell the host adapter driver that it
        !            50: should initiate synchronous data transfer negotiation during this IOSCSICommand.
        !            51: @constant kCDBFlagsNegotiateWDTR
        !            52: Set by the IOSCSIController class to tell the host adapter driver that it
        !            53: should initiate wide data transfer negotiation during this IOSCSICommand.
        !            54: */
        !            55: enum SCSICDBFlags {
        !            56:     kCDBFNoDisconnect                  = 0x00000001,
        !            57: 
        !            58: /*
        !            59:  *  Note: These flags are for IOSCSIController subclasses only
        !            60:  */
        !            61:     kCDBFlagsDisableParity      = 0x08000000,
        !            62:     kCDBFlagsNoDisconnect       = 0x10000000,
        !            63:     kCDBFlagsNegotiateSDTR             = 0x20000000,
        !            64:     kCDBFlagsNegotiateWDTR             = 0x40000000,
        !            65: };
        !            66: 
        !            67: 
        !            68: /*!
        !            69: @enum SCSIAdapterStatus
        !            70: Defines the values of the adapterStatus field of the SCSIResults structure.
        !            71: @constant kSCSIAdapterStatusSuccess
        !            72: Request completed with no adapter reported errors.
        !            73: @constant kSCSIAdapterStatusMsgReject
        !            74: Adapter received a msg reject from the target device.
        !            75: @constant kSCSIAdapterStatusParityError
        !            76: Adapter detected, or target reported a parity error during the
        !            77: IOSCSICommand.
        !            78: */
        !            79: enum SCSIAdapterStatus {
        !            80:     kSCSIAdapterStatusSuccess   = 0,
        !            81:     kSCSIAdapterStatusMsgReject,
        !            82:     kSCSIAdapterStatusParityError,
        !            83: };
        !            84: 
        !            85: 
        !            86: /*!
        !            87: @typedef SCSICDBInfo
        !            88: @discussion
        !            89: Fields specified here are set by IOSCSIDevice client, while others
        !            90: are set by the IOSCSIController class for use by the host adapter
        !            91: driver. The client should zero all fields of the structure prior
        !            92: to use.
        !            93: @field cdbFlags
        !            94: See enum SCSICDBFlags for flag definitions.
        !            95: @field cdbTagMsg 
        !            96: This field should be set to zero by the IOSCSIDevice client. If the
        !            97: SCSI device supports tag queuing then the IOSCSIController class
        !            98: will set this field to select simple (unordered) tags. 
        !            99: @field cdbTag
        !           100: This field is set by the IOSCSIController class to tell the host 
        !           101: adapter driver the SCSI tag value to assign to this IOSCSICommand.
        !           102: @field cdbLength
        !           103: Set by the IOSCSIDevice client to the length of the Command Descriptor
        !           104: Block (CDB).
        !           105: @field cdb
        !           106: Set by the IOSCSIDevice client to command descriptor block the client
        !           107: wishes the target to execute.
        !           108: */
        !           109: typedef struct SCSICDBInfo {
        !           110: 
        !           111:     UInt32             cdbFlags;
        !           112: 
        !           113:     UInt32             cdbTagMsg;
        !           114:     UInt32             cdbTag;
        !           115: 
        !           116:     UInt32             cdbAbortMsg;
        !           117: 
        !           118:     UInt32             cdbLength;
        !           119:     UInt8              cdb[16];
        !           120:     
        !           121:     UInt32      reserved[16];
        !           122: } SCSICDBInfo;
        !           123: 
        !           124: 
        !           125: /*!
        !           126: @typedef SCSIResults
        !           127: @field returnCode
        !           128: The overall return code for the command. See iokit/iokit/IOReturn.h.
        !           129: This value is also returned as the getResults() return value.
        !           130: 
        !           131: Note: The exact subset of return codes a SCSI command will return is
        !           132: currently under review.
        !           133: @field bytesTransferred
        !           134: The total number of bytes transferred to/from the target device.
        !           135: @field adapterStatus
        !           136: This field provides additional adapter reported error information. The SCSI
        !           137: Family uses this information to determine whether the target rejected a
        !           138: negotiation attempt (either/or) wide or synchronous.
        !           139: @field scsiStatus
        !           140: The SCSI Status byte returned from the target device.
        !           141: @field requestSenseDone
        !           142: A boolean indicating whether sense data was obtained from the target
        !           143: device.
        !           144: @field requestSenseLength
        !           145: The number of sense data bytes returned from the target device.
        !           146: */
        !           147: typedef struct SCSIResults {
        !           148:     IOReturn           returnCode;
        !           149:        
        !           150:        UInt32              bytesTransferred;
        !           151: 
        !           152:     UInt32          adapterStatus;     
        !           153:        UInt8               scsiStatus;
        !           154:        
        !           155:        bool                requestSenseDone;
        !           156:        UInt32              requestSenseLength;
        !           157: } SCSIResults;
        !           158: 
        !           159: 
        !           160: /*!
        !           161: @enum SCSIQueueType
        !           162: Each IOSCSIDevice has two queues, a normal Q and a bypass Q. The treatment of the
        !           163: queues is essentially identical except that the bypass Q is given preference whenever
        !           164: it has commands available. 
        !           165: 
        !           166: Usually, the client will use the normal Q for regular I/O commands and the bypass Q
        !           167: to send error recovery commands to the device.
        !           168: @constant kQTypeNormalQ
        !           169: Indicates command applies to the normal IOSCSIDevice queue.
        !           170: @constant kQTypeBypassQ
        !           171: Indicates command applies to the bypass IOSCSIDevice queue.
        !           172: */
        !           173: enum SCSIQueueType {
        !           174:     kQTypeNormalQ              = 0,
        !           175:     kQTypeBypassQ              = 1,
        !           176: };
        !           177: 
        !           178: 
        !           179: /*!
        !           180: @enum SCSIQueuePosition
        !           181: Indicates whether a IOSCSICommand should be added to the head or tail
        !           182: of the queue selected.
        !           183: @constant kQPositionTail
        !           184: Queue request at the tail (end) of the selected queue.
        !           185: @constant kQPositionHead
        !           186: Queue request at the head (front) of the selected queue.
        !           187: */
        !           188: enum SCSIQueuePosition {
        !           189:     kQPositionTail             = 0,
        !           190:     kQPositionHead             = 1,
        !           191: };
        !           192: 
        !           193: 
        !           194: /*!
        !           195: @struct SCSITargetLun
        !           196: @field target
        !           197: The SCSI Id for the SCSI device being selected.
        !           198: @field lun
        !           199: The SCSI Lun for the SCSI device being selected.
        !           200: */ 
        !           201: typedef struct SCSITargetLun {
        !           202:     UInt8      target;
        !           203:     UInt8      lun;
        !           204:     UInt8      reserved[2];
        !           205: } SCSITargetLun;
        !           206: 
        !           207: /*!
        !           208: @class IOSCSICommand : public IOCDBCommand
        !           209: @abstract 
        !           210: Class that describes a SCSI device (target/lun pair).
        !           211: @discussion 
        !           212: This class encapsulates a SCSI Command. The client driver allocates a
        !           213: command using IOSCSIDevice::allocCommand() and initializes it using
        !           214: functions of this class. The client can then submit the command to
        !           215: the SCSI stack by invoking the execute() function.
        !           216: */
        !           217: class IOSCSICommand : public IOCDBCommand
        !           218: {
        !           219: public:
        !           220: 
        !           221: 
        !           222: /*!
        !           223: @function setPointers
        !           224: @abstract
        !           225: Sets the data buffer component of a SCSI Command.
        !           226: @discussion
        !           227: The client provides an IOMemoryDescriptor object to corresponding
        !           228: to the client's data or request sense buffer, the maximum data transfer count
        !           229: and data transfer direction.
        !           230: @param desc
        !           231: Pointer to a IOMemoryDescriptor describing the client's I/O buffer.
        !           232: @param transferCount
        !           233: Maximum data transfer count in bytes.
        !           234: @param isWrite
        !           235: Data transfer direction. (Defined with respect to the device, i.e. isWrite = true
        !           236: indicates the host is writing to the device.
        !           237: @param isSense
        !           238: If isSense is set to true, the IOSCSICommand's data buffer information is set. Otherwise,
        !           239: the IOSCSICommand's request sense buffer information is set
        !           240: */
        !           241: void setPointers( IOMemoryDescriptor *desc, UInt32 transferCount, bool isWrite, bool isSense=false );
        !           242: 
        !           243: 
        !           244: /*!
        !           245: @function getPointers
        !           246: @abstract
        !           247: Gets the data buffer component of a SCSI Command.
        !           248: @discussion
        !           249: The client provides a set of pointers to fields to receive the IOSCSICommand's
        !           250: data/request sense buffer pointers.
        !           251: @param desc
        !           252: Pointer to a field (IOMemoryDescriptor *) to receive the IOSCSICommand's IOMemoryDescriptor pointer.
        !           253: @param transferCount
        !           254: Pointer to a field (UInt32) to receive the IOSCSICommand's maximum transfer count.
        !           255: @param isWrite 
        !           256: Pointer to a field (bool) to receive the IOSCSICommand's transfer direction.
        !           257: @param isSense
        !           258: If isSense is set to true, the IOSCSICommand's data buffer information is returned. Otherwise,
        !           259: the IOSCSICommand's request sense buffer information is returned.
        !           260: */
        !           261: void getPointers( IOMemoryDescriptor **desc, UInt32 *transferCount, bool *isWrite, bool isSense = false );
        !           262: 
        !           263: /*!
        !           264: @function setTimeout
        !           265: @abstract
        !           266: Sets the timeout for the command in milliseconds.
        !           267: @discussion
        !           268: The IOSCSIController class will abort a command which does not
        !           269: complete with in the time interval specified. The client should
        !           270: set the timeout parameter to zero if they want to suppress
        !           271: timing.
        !           272: @param timeout
        !           273: Command timeout in milliseconds.
        !           274: */
        !           275: void setTimeout( UInt32 timeoutmS );           
        !           276: 
        !           277: /*!
        !           278: @function getTimeout
        !           279: @abstract
        !           280: Gets the timeout for the command in milliseconds.
        !           281: @discussion
        !           282: This function returns the command timeout previously set by setTimeout().
        !           283: @param timeout
        !           284: Command timeout in milliseconds.
        !           285: */
        !           286: UInt32                 getTimeout();
        !           287: 
        !           288: 
        !           289: /*!
        !           290: @function setCallback
        !           291: @abstract
        !           292: Sets the callback routine to be invoked when the SCSI Command completes.
        !           293: @param target
        !           294: Pointer to the object to be passed to the callback routine. This would usually
        !           295: be the client's (this) pointer.
        !           296: @param callback
        !           297: Pointer to the client's function to process the completed command
        !           298: @param refcon
        !           299: Pointer to the information required by the client's callback routine to process
        !           300: the completed command.
        !           301: */
        !           302: void setCallback( void *target = 0, CallbackFn callback = 0, void *refcon = 0 );
        !           303: 
        !           304: 
        !           305: /*!
        !           306: @function getClientData
        !           307: @abstract
        !           308: Returns a pointer to the SCSI Command's client data area.
        !           309: @discussion
        !           310: The client may allocate storage in the SCSI Command for its own use.
        !           311: See IOSCSIDevice::allocateCmd().
        !           312: */
        !           313: void           *getClientData();
        !           314: 
        !           315: /*
        !           316: @function getCommandData
        !           317: @abstract
        !           318: Returns a pointer to the SCSI Command's controller data area
        !           319: @discussion
        !           320: This area is allocated for use by the IOSCSIController subclass (host adapter
        !           321: driver). The client should not normally access this area.
        !           322: */
        !           323: void           *getCommandData();
        !           324: 
        !           325: 
        !           326: /*!
        !           327: @function setCDB
        !           328: @abstract
        !           329: Sets the CDB component of a SCSI Command. 
        !           330: @param scsiCDB
        !           331: Pointer to a SCSICDBInfo structure.
        !           332: */
        !           333: void setCDB( SCSICDBInfo *scsiCmd );
        !           334: 
        !           335: 
        !           336: /*!
        !           337: @function getCDB
        !           338: @abstract
        !           339: Gets the CDB component of a SCSI Command. 
        !           340: @param scsiCDB
        !           341: Pointer to a SCSICDBInfo structure to receive the SCSI Command's cdb information.
        !           342: */
        !           343: void getCDB( SCSICDBInfo *scsiCmd );
        !           344: 
        !           345: 
        !           346: /*!
        !           347: @function getResults
        !           348: @abstract
        !           349: Gets results from a completed SCSI Command.
        !           350: @discussion
        !           351: The getResults() function returns the value of the returnCode field of the command results. If
        !           352: the client is only interested in a pass/fail indication for the command, the client 
        !           353: can pass (SCSIResult *)0 as a parameter.
        !           354: @param results
        !           355: Pointer to a SCSIResults structure to receive the SCSI Commands completion information.
        !           356: */
        !           357: IOReturn getResults( SCSIResults *results );
        !           358: 
        !           359: /*!
        !           360: @function setResults
        !           361: @abstract
        !           362: Sets the results component of a SCSI Command.
        !           363: @discussion
        !           364: The setResults() function is used by the IOSCSIController subclass (host
        !           365: adapter driver) return results for a SCSI Command about to be completed.
        !           366: @param scsiResults Pointer to a SCSIResults structure containing
        !           367: completion information for the SCSI Command.
        !           368: 
        !           369: Completion information is copied into the command, so the caller may
        !           370: release the SCSIResults structure provided when this function returns.
        !           371: */
        !           372: void setResults( SCSIResults *results );
        !           373: 
        !           374: 
        !           375: /*!
        !           376: @function getDevice
        !           377: @abstract 
        !           378: Returns the IOSCSIDevice this command is targeted to.
        !           379: @param deviceType
        !           380: The caller should use value kIOSCSIDeviceType.
        !           381: @discussion
        !           382: In some cases a IOSCSICommand is not associated with a specific target/lun. This
        !           383: would be the case for a SCSI Bus Reset. In this case getDevice() returns 0.
        !           384: */
        !           385: IOSCSIDevice *getDevice( IOSCSIDevice *deviceType );
        !           386: 
        !           387: 
        !           388: /*!
        !           389: @function getTargetLun
        !           390: @abstract 
        !           391: Returns the target/lun for the IOSCSIDevice this command is associated with.
        !           392: @param targetLun
        !           393: Pointer to a SCSITargetLun structure to receive the target/lun information.
        !           394: */
        !           395: void getTargetLun( SCSITargetLun *targetLun );
        !           396: 
        !           397: 
        !           398: /*!
        !           399: @function execute
        !           400: @abstract 
        !           401: Submits a SCSI command to be executed.
        !           402: @discussion
        !           403: Once the execute() function is called, the client should not
        !           404: invoke any further functions on the SCSI Command with the
        !           405: exception of abort().
        !           406: 
        !           407: The execute() function optionally returns sets a unique sequence
        !           408: number token for the command. If the client intends to use the abort()
        !           409: method they must retain this sequence number token.
        !           410: @param sequenceNumber
        !           411: Pointer to field (UInt32) to receive the sequence number assigned to the SCSI
        !           412: Command.
        !           413: */
        !           414: bool execute( UInt32 *sequenceNumber = 0 );
        !           415: 
        !           416: /*!
        !           417: @function abort
        !           418: @abstract
        !           419: Aborts an executing SCSI Command.
        !           420: @discussion
        !           421: The client may invoke the abort() method to force the completion of an
        !           422: executing SCSI Command. The client must pass the sequence number
        !           423: provided when the execute() function was invoked.
        !           424: 
        !           425: Note: The abort function provides no status on whether or not a
        !           426: command has been successfully aborted. The client should wait for the
        !           427: command to actually complete to determine whether the abort completed
        !           428: successfully.
        !           429: @param sequenceNumber
        !           430: The client must pass the sequence number assigned to the command when
        !           431: the client called the execute() function.
        !           432: */
        !           433: void abort( UInt32 sequenceNumber );
        !           434: 
        !           435: /*!
        !           436: @function complete
        !           437: @abstract
        !           438: Indicates the IOSCSIController subclass (host adapter driver) has completed a SCSI command.
        !           439: @discussion
        !           440: Once the complete() function is called, the controller
        !           441: subclass should make no further accesses to the IOSCSICommand
        !           442: being completed.
        !           443: 
        !           444: A IOSCSIDevice client would not normally call this function.
        !           445: */
        !           446: void complete();
        !           447: 
        !           448: 
        !           449: /*!
        !           450: @function getSequenceNumber
        !           451: @abstract
        !           452: Returns the sequence number assigned to an executing command.
        !           453: @discussion
        !           454: The caller should check the sequence number for 0. This indicates that
        !           455: the command has completed or has not been processed to the point where
        !           456: a sequence number has been assigned.
        !           457: */
        !           458: UInt32 getSequenceNumber();
        !           459: 
        !           460: 
        !           461: /*!
        !           462: @function setQueueInfo
        !           463: @abstract
        !           464: Sets queuing information for the SCSI Command.
        !           465: @discussion
        !           466: Each IOSCSIDevice has two queues, a normal Q and a bypass Q. The treatment of the
        !           467: queues is esentially identical except that the bypass Q is given preference whenever
        !           468: it has commands available. 
        !           469: 
        !           470: Usually, the client will use the normal Q for regular I/O commands and the bypass Q
        !           471: to send error recovery commands to the device.
        !           472: @param queueType
        !           473: Set to kQTypeNormalQ or kQTypeBypassQ to indicate which IOSCSIDevice queue the 
        !           474: SCSI Command should be routed to.
        !           475: @param queuePosition
        !           476: Set to kQPositionTail or kQPositionHead to indicate whether the SCSI Command should
        !           477: be added to the head to tail for the selected IOSCSIDevice queue.
        !           478: */
        !           479: void setQueueInfo(  UInt32 queueType = kQTypeNormalQ, UInt32 queuePosition = kQPositionTail );
        !           480: 
        !           481: 
        !           482: /*!
        !           483: @function getQueueInfo
        !           484: @abstract
        !           485: Gets queuing information for the SCSI Command.
        !           486: @param queueType
        !           487: Pointer to a field (UInt32) to receive the queue type previously set for this SCSI Command.
        !           488: @param queuePosition
        !           489: Pointer to a field (UInt32) to receive the queue position previously set for this SCSI Command.
        !           490: */
        !           491: void getQueueInfo(  UInt32 *queueType, UInt32 *queuePosition = 0 );
        !           492: 
        !           493: 
        !           494: /*!
        !           495: @function getCmdType
        !           496: @abstract
        !           497: Obtains the underlying 'intent' of a SCSI Command.
        !           498: @discussion
        !           499: This function provides information on the intent of a SCSI
        !           500: Command. For example, since Aborts, Request Sense and normal Execute commands are
        !           501: all sent to the executeCommand() function, invoking getCmdType()
        !           502: will indicate whether a Request Sense, Abort or Normal I/O request is
        !           503: being processed.
        !           504: 
        !           505: It this information is not normally meaningful to IOSCSIDevice clients.
        !           506: */
        !           507: UInt32         getCmdType();
        !           508: 
        !           509: 
        !           510: /*!
        !           511: @function getOriginalCmd
        !           512: @abstract
        !           513: Obtains a 'related' SCSI Command.
        !           514: @discussion
        !           515: In cases where a SCSI command is related to a previous command, this
        !           516: function will return the original command. For example, if a
        !           517: Request Sense command  (CmdType = kSCSICommandReqSense)is processed,
        !           518: then this function can be used to obtain the original command that
        !           519: caused the check condition. If an Abort command (CmdType =
        !           520: kSCSICommandAbort) then this function can be used to obtain the original
        !           521: command the abort was issued against.
        !           522: 
        !           523: 
        !           524: It this information is not normally meaningful to IOSCSIDevice clients.
        !           525: */
        !           526: IOSCSICommand  *getOriginalCmd();    
        !           527: 
        !           528: };

unix.superglobalmegacorp.com

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