Annotation of XNU/iokit/IOKit/scsi/IOSCSIController_Reference.h, revision 1.1.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 IOSCSIController_Reference.h
                     26: 
                     27: This header defines the IOSCSIController class.
                     28: 
                     29: IOSCSIController provides the superclass for SCSI host
                     30: adapter drivers. 
                     31: 
                     32: Drivers are instantiated based on their 'personality' entry matching
                     33: their adapter's OpenFirmware device tree entry. When a match occurs,
                     34: the driver's class is instantiated. Since the driver is written as a
                     35: subclass of IOSCSIController, an instance of the SCSI Family is automatically
                     36: instantiated.
                     37: */
                     38: 
                     39: 
                     40: /*!
                     41: @typedef SCSIControllerInfo
                     42: Parameter structure passed for configure() function.
                     43: @field initiatorId
                     44: The SCSI address of your host adapter. Usually 7 (decimal).
                     45: @field maxTargetsSupported
                     46: The number of targets you controller supports. Typically 8 or 16.
                     47: @field maxLunsSupported
                     48: The number of logical units per target your controller supports.
                     49: Typically 8.
                     50: @field minTransferPeriodpS
                     51: The minimum synchronous data transfer period in picoseconds your
                     52: controller supports.
                     53: @field maxTransferOffset
                     54: The maximum synchronous data offset your controller supports in bytes.
                     55: @field maxTransferWidth
                     56: The maximum data SCSI bus width your controller supports in bytes. Must
                     57: be a power of 2.
                     58: @field maxCommandsPerController
                     59: The maximum number of outstanding commands your controller supports
                     60: across all targets and luns. Set to 0 if there is no controller limit in
                     61: this category.
                     62: @field maxCommandsPerTarget
                     63: The maximum number of outstanding commands your controller supports on a
                     64: given target. Set to 0 if there is no controller limit in this category.
                     65: @field maxCommandsPerLun
                     66: The maximum number of outstanding commands your controller supports on a
                     67: given lun. Set to 0 if there is no controller limit in this category.
                     68: @field tagAllocationMethod
                     69: Controls whether tags are allocated on a per Lun, per Target or per
                     70: Controller basis. See enum SCSITagAllocation.
                     71: @field maxTags
                     72: The maximum number of tags allocated to each Lun, Target or Controller
                     73: depending on the tagAllocationMethod setting.
                     74: @field targetPrivateDataSize
                     75: IOSCSIController will optionally allocate per-target storage for your
                     76: driver based on the setting of this field. The amount of storage needed
                     77: is specified in bytes.
                     78: @field lunPrivateDataSize
                     79: IOSCSIController will optionally allocate per-lun storage for your
                     80: driver based on the setting of this field. The amount of storage needed
                     81: is specified in bytes.
                     82: @field commandPrivateDataSize
                     83: IOSCSIController will optionally allocate per-command storage for your
                     84: driver based on the setting of this field. The amount of storage needed
                     85: is specified in bytes.
                     86: 
                     87: Note: The amount of per-command storage allowed is under review. We
                     88: anticipate that typical SCSI controllers will need not more than 1024
                     89: bytes per command.
                     90: @field disableCancelCommands
                     91: Subclasses of IOSCSIController which do their own management of
                     92: aborts/resets can set this field to true to avoid receiving
                     93: cancelCommand() requests.
                     94: */
                     95: typedef struct SCSIControllerInfo {
                     96:     UInt32      initiatorId;
                     97: 
                     98:     UInt32     maxTargetsSupported;
                     99:     UInt32     maxLunsSupported;
                    100: 
                    101:     UInt32     minTransferPeriodpS;
                    102:     UInt32     maxTransferOffset;
                    103:     UInt32     maxTransferWidth; 
                    104:  
                    105:     UInt32     maxCommandsPerController;
                    106:     UInt32     maxCommandsPerTarget;
                    107:     UInt32     maxCommandsPerLun;
                    108: 
                    109:     UInt32     tagAllocationMethod;
                    110:     UInt32     maxTags;
                    111: 
                    112:     UInt32     targetPrivateDataSize;
                    113:     UInt32     lunPrivateDataSize;
                    114:     UInt32     commandPrivateDataSize;
                    115: 
                    116:     bool       disableCancelCommands;
                    117: 
                    118:     UInt32     reserved[64];
                    119: 
                    120: } SCSIControllerInfo;
                    121: 
                    122: 
                    123: /*!
                    124: @enum SCSITagAllocation
                    125: @discussion
                    126: This enum defines how SCSI tags are allocated.
                    127: @constant kTagAllocationNone
                    128: This controller does not support tag queuing.
                    129: @constant kTagAllocationPerLun
                    130: Each SCSI Lun has its own private tag pool containing
                    131: (maxTags) SCSI tags.
                    132: @constant kTagAllocationPerTarget
                    133: Each SCSI Target has its own private tag pool contain
                    134: (maxTags) SCSI tags. Luns connected to this target
                    135: allocate tags from this pool.
                    136: @constant kTagAllocationPerController
                    137: The controller has a global tag pool containing (maxTags)
                    138: SCSI tags. This pool is shared by all Luns connected to
                    139: this controller.
                    140: */ 
                    141: enum {
                    142:     kTagAllocationNone                 = 0,
                    143:     kTagAllocationPerLun,
                    144:     kTagAllocationPerTarget,    
                    145:     kTagAllocationPerController,
                    146: };
                    147: 
                    148: 
                    149: /*!
                    150: @class IOSCSIController : public IOService
                    151: @abstract 
                    152: Superclass for SCSI host adapter drivers
                    153: @discussion 
                    154: The IOSCSIController class provides a number of services to simplify
                    155: writing a driver for your host adapter.
                    156: 
                    157: Specifically, the class provides the following features:
                    158: 
                    159: 1. Complete request scheduling semantics.
                    160: 
                    161: The IOSCSIController class manages request queues on behalf of its
                    162: subclasses. It tracks all requests submitted to its subclasses,
                    163: including managing timeouts, aborts and request cancellations.
                    164: 
                    165: 2. Request Sense scheduling
                    166: 
                    167: Subclasses of IOSCSIController do not need to implement
                    168: auto-request-sense functionality. Your driver can use the default
                    169: handling in the super class.
                    170: 
                    171: 3. Storage management.
                    172: 
                    173: The IOSCSIController subclass provides per-request private storage areas
                    174: for your subclass.
                    175: 
                    176: 4. Resource management.
                    177: 
                    178: The IOSCSIController subclass will manage the number of outstanding
                    179: commands submitted to your subclass on a per-controller and per-lun
                    180: basis.
                    181: */
                    182: @class IOSCSIController : public IOService
                    183: {
                    184: public:
                    185:  
                    186:      
                    187: /*!
                    188: @function configure
                    189: @abstract 
                    190: Driver configuration/initialization request.
                    191: @discussion 
                    192: The configure() member function is the first call your subclass will
                    193: receive. You should provide the information requested in the
                    194: SCSIControllerInfo structure and enable your hardware for operation.
                    195: If your driver initialized successfully, you should return true, otherwise,
                    196: your driver should return false.
                    197: @param provider
                    198: Pointer to an object (usually IOPCIDevice) which represents the bus of
                    199: your device is attached to . Typically your driver will use functions
                    200: supplied by this object to access PCI space on your hardware. See
                    201: IOPCIDevice for a description of PCI services.
                    202: @param controllerInfo
                    203: Pointer to a SCSIControllerInfo structure. Your driver should provide
                    204: the information requested in this structure prior to returning from
                    205: the configure() call.
                    206: */
                    207: bool configure( IOService *provider, SCSIControllerInfo *controllerInfo );
                    208: 
                    209: 
                    210: /*!
                    211: @function executeCommand
                    212: @abstract
                    213: Execute a IOSCSICommand.
                    214: @discussion
                    215: The executeCommand() function is called for all 'routine' I/O requests
                    216: including abort requests. The driver is passed a pointer to an 
                    217: IOSCSICommand object. The driver obtains information about the I/O
                    218: request by using function calls provided by the IOSCSICommand
                    219: class.
                    220: @param scsiCommand
                    221: Pointer to a IOSCSICommand. See IOSCSICommand for more information.
                    222: */
                    223: void executeCommand( IOSCSICommand *scsiCommand );
                    224: 
                    225: 
                    226: /*!
                    227: @function cancelCommand
                    228: @abstract
                    229: Cancels a IOSCSICommand previously submitted to the driver.
                    230: @discussion
                    231: The cancelCommand() function is called to inform your subclass to force
                    232: completion of a SCSI command.
                    233: 
                    234: Your subclass should call the getOriginalCmd() to determine the command
                    235: to complete.
                    236: 
                    237: After calling complete() on the original command, you should complete
                    238: the IOSCSICommand passed to the cancelCommand() function
                    239: 
                    240: Note: When a cancelCommand is issued, your subclass may presume that any
                    241: activity to remove an active command from the SCSI Target, i.e. (abort
                    242: tag/abort) has already occurred.
                    243: @param scsiCommand
                    244: Pointer to a IOSCSICommand. See IOSCSICommand for more information.
                    245: */
                    246: void cancelCommand( IOSCSICommand *scsiCommand );
                    247:  
                    248:  
                    249: /*!
                    250: @function resetCommand
                    251: @abstract
                    252: Request the driver issue a SCSI Bus reset.
                    253: @discussion
                    254: The resetCommand() function indicates you should do a SCSI Bus Reset.
                    255: After issuing the reset you should complete to IOSCSICommand passed.
                    256: 
                    257: Note: After you report the IOSCSICommand Reset complete, you will
                    258: receive cancelCommand() requests for all outstanding commands.
                    259: @param scsiCommand
                    260: Pointer to a IOSCSICommand. See IOSCSICommand for more information.
                    261: */
                    262: void resetCommand( IOSCSICommand *scsiCommand );    
                    263: 
                    264: 
                    265: /*!
                    266: @function resetOccurred
                    267: @abstract
                    268: Inform the IOSCSIController class of an unsolicited SCSI Bus reset.
                    269: @discussion 
                    270: Your subclass should call this function if
                    271: you detect a target initiated bus reset, or need to do an unplanned SCSI
                    272: Bus Reset as part of adapter error recovery.
                    273: 
                    274: Note: After you call the resetOccurred() function, you will receive
                    275: cancelCommand() requests for all outstanding IOSCSICommand(s).
                    276: */
                    277: void resetOccurred();
                    278: 
                    279: /*!
                    280: @function rescheduleCommand
                    281: @abstract
                    282: Return a IOSCSICommand for rescheduling.
                    283: @discussion
                    284: If your subclass function cannot start processing an otherwise
                    285: acceptable IOSCSICommand due to resource constraints, i.e. MailBox full,
                    286: lost SCSI Bus arbitration, you may have the IOSCSICommand rescheduled by
                    287: calling rescheduleCommand(). A IOSCSICommand passed to this function
                    288: should be treated as 'complete', i.e. you should make no further
                    289: accesses to it.
                    290: 
                    291: Note: If you cannot process further commands, you should call the
                    292: disableCommands() function to prevent receiving additional commands
                    293: until you are ready to accept them.
                    294: @param scsiCommand
                    295: Pointer to IOSCSICommand your driver needs to reschedule.
                    296: */
                    297: void rescheduleCommand( IOSCSICommand *scsiCommand );
                    298: 
                    299: 
                    300: /*!
                    301: @function disableCommands
                    302: @abstract
                    303: Suspend sending I/O commands to your driver.
                    304: @discussion
                    305: In cases where your executeCommand() member function cannot accept
                    306: commands, you may disable further calls by invoking disableCommands().
                    307: Use enableCommands() to resume receiving commands.
                    308: 
                    309: Note: The resetCommand() and cancelCommands() entry points are not
                    310: affected by the use of this function.
                    311: 
                    312: Note: The default timeout for disableCommands() is 5s. If this timeout
                    313: is exceeded the IOSCSIController class will call your driver's 
                    314: disableTimeoutOccurred() function. The default action of this function
                    315: is to issue a SCSI Bus Reset by calling your driver's resetCommand()
                    316: function.
                    317: @param timeoutmS
                    318: Your driver may override the default timeout 
                    319: by specifying a timeout value in milliseconds.
                    320: */
                    321: void disableCommands( UInt32 timeoutmS );
                    322: 
                    323: 
                    324: /*!
                    325: @function enableCommands
                    326: @abstract
                    327: Resume sending I/O commands to your driver.
                    328: @discussion
                    329: Resumes sending I/O commands to your driver that were previously suspended
                    330: by calling disableCommands().
                    331: */
                    332: void enableCommands();
                    333: 
                    334: /*!
                    335: @function disableTimeoutOccurred
                    336: @abstract
                    337: Indicates your driver has suspended commands too long.
                    338: @discussion
                    339: The IOSCSIController superclass will timeout disableCommand() requests
                    340: to preclude the possibility of a hung SCSI bus. If a timeout occurs,
                    341: then disableTimeoutOccurred() will be called. The default action of this
                    342: routine is to do a SCSI Bus Reset by calling resetCommand(). Your
                    343: subclass may choose to modify the default behavior of this routine to do
                    344: additional adapter specific error recovery.
                    345: */
                    346: void disableTimeoutOccurred();
                    347: 
                    348: 
                    349: /*!
                    350: @function findCommandWithNexus
                    351: @abstract
                    352: Locate an active IOSCSICommand using target/lun/tag values.
                    353: @discussion
                    354: Your subclass can use this function to search for an active
                    355: IOSCSICommand by providing the target/lun/tag values for the command. In
                    356: the case of a non-tagged command the second parameter must either be
                    357: omitted or set to -1.
                    358: 
                    359: An unsuccessful search will return 0.
                    360: @param targetLun
                    361: Structure of type SCSITargetLun, initialized to the target/lun value you
                    362: wish to search for.
                    363: @param tagValue
                    364: Optional tag value you wish to search for. 
                    365: */
                    366: IOSCSICommand *findCommandWithNexus( SCSITargetLun targetLun, UInt32 tagValue = (UInt32) -1 );
                    367: 
                    368: /*!
                    369: @function allocateTarget
                    370: @abstract
                    371: Notifies driver of allocation of per-Target resources.
                    372: @discussion
                    373: Your driver will be called at its allocateTarget() function when a target is about
                    374: to be probed. The your driver should initialize its per-target data at this time.
                    375: If the subclass wishes to prevent probing of this target, it should return false
                    376: as the result of this function call.
                    377: 
                    378: This is an optional function. Your driver is not required to implement it.
                    379: @param targetLun
                    380: SCSITargetLun structure containing the SCSI Id of the target that is about to be
                    381: allocated.
                    382: */
                    383: bool allocateTarget( SCSITargetLun targetLun );
                    384: 
                    385: 
                    386: /*!
                    387: @function deallocateTarget
                    388: @abstract
                    389: Notifies driver that target resources will be deallocated.
                    390: @discussion
                    391: Your driver will be called at its deallocateTarget() function when a target is about
                    392: deallocated. The your driver must insure that there will be no further access to
                    393: the per-target data allocated to this target.
                    394: 
                    395: This is an optional function. Your driver is not required to implement it.
                    396: @param targetLun
                    397: SCSITargetLun structure containing the SCSI Id of the target that is about to be
                    398: deallocated.
                    399: */
                    400: bool deallocateTarget( SCSITargetLun targetLun );
                    401: 
                    402: 
                    403: /*!
                    404: @function allocateLun
                    405: @abstract
                    406: Notifies driver of allocation of per-Lun resources.
                    407: @discussion
                    408: Your driver will be called at its allocateLun() function when a Lun is about
                    409: to be probed. The your driver should initialize its per-lun data at this time.
                    410: If the subclass wishes to prevent probing of this lun, it should return false
                    411: as the result of this function call.
                    412: 
                    413: This is an optional function. Your driver is not required to implement it.
                    414: @param targetLun
                    415: SCSITargetLun structure containing the SCSI Id of the target/lun that is about to be
                    416: allocated.
                    417: */
                    418: bool allocateLun( SCSITargetLun targetLun );
                    419: 
                    420: 
                    421: /*!
                    422: @function deallocateLun
                    423: @abstract
                    424: Notifies driver of deallocation of per-Lun resources.
                    425: @discussion
                    426: Your driver will be called at its deallocateLun() function when a Lun is about
                    427: deallocated. The your driver must insure that there will be no further access to
                    428: the per-lun data allocated to this lun.
                    429: 
                    430: This is an optional function. Your driver is not required to implement it.
                    431: @param targetLun
                    432: SCSITargetLun structure containing the SCSI Id of the target/lun that is about to be
                    433: deallocated.
                    434: */
                    435: bool allocateLun( SCSITargetLun targetLun );
                    436: 
                    437: 
                    438: /*!
                    439: @function getTargetData
                    440: @abstract
                    441: Obtains a pointer to per-Target data allocated by IOSCSIController.
                    442: @discussion
                    443: This function returns a pointer to per-Target workarea allocated for 
                    444: your driver's use. The size of this area must be specified in the 
                    445: during the configure() function. See struct SCSIControllerInfo, 
                    446: field targetDataSize.
                    447: @param targetLun
                    448: SCSITargetLun structure containing the SCSI Id of the target who's
                    449: workarea you are requesting a pointer to. 
                    450: */
                    451: void *getTargetData( SCSITargetLun targetLun );
                    452: 
                    453: 
                    454: /*!
                    455: @function getLunData
                    456: @abstract
                    457: Obtains a pointer to per-Lun data allocated by IOSCSIController.
                    458: @discussion
                    459: This function returns a pointer to per-Lun workarea allocated for 
                    460: your driver's use. The size of this area must be specified  
                    461: during the configure() function. See struct SCSIControllerInfo, 
                    462: field lunDataSize.
                    463: */
                    464: void *getLunData( SCSITargetLun targetLun );
                    465: 
                    466: 
                    467: /*!
                    468: @function getWorkLoop
                    469: @abstract
                    470: Returns the IOWorkLoop object that services your driver.
                    471: */
                    472: IOWorkloop *getWorkLoop();
                    473: 
                    474: 
                    475: }

unix.superglobalmegacorp.com

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