Annotation of XNU/iokit/IOKit/storage/IOHDDriveNub.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:  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved. 
                     24:  *
                     25:  * IOHDDriveNub.h
                     26:  *
                     27:  * This class is the protocol for generic hard disk functionality, independent of
                     28:  * the physical connection protocol (e.g. SCSI, ATA, USB).
                     29:  *
                     30:  * A subclass implements relay methods that translate our requests into
                     31:  * calls to a protocol- and device-specific provider.
                     32:  */
                     33: 
                     34: /*!    @language embedded-c++ */
                     35: 
                     36: #ifndef        _IOHDDRIVENUB_H
                     37: #define        _IOHDDRIVENUB_H
                     38: 
                     39: #include <IOKit/IOTypes.h>
                     40: #include <IOKit/IOService.h>
                     41: #include "IOHDTypes.h"
                     42: 
                     43: /*!
                     44:  * @defined kDeviceTypeProperty
                     45:  * The name of the property tested for nub type matching by the generic hard
                     46:  * disk driver. This define is used by both IOHDDrive and IOHDDriveNub.
                     47:  * @defined kDeviceTypeHardDisk
                     48:  * A character string used for nub matching.
                     49:  */
                     50: /* Property used for matching, so the generic driver gets the nub it wants. */
                     51: #define        kDeviceTypeProperty     "device-type"
                     52: #define        kDeviceTypeHardDisk     "Hard Disk"
                     53: 
                     54: class IOMemoryDescriptor;
                     55: 
                     56: /*!
                     57:  * @class
                     58:  * IOHDDriveNub : public IOService
                     59:  * @abstract
                     60:  * "Impedance-matcher" class to connect Generic device driver to Transport Driver.
                     61:  * @discussion
                     62:  * The IOHDDriveNub class exports the generic hard disk protocol,
                     63:  * forwarding all requests to its provider (the Transport Driver).
                     64:  * Though the nub does no actual processing of requests, it is necessary
                     65:  * in a C++ environment. The Transport Driver can be of any type, as
                     66:  * long as it inherits from IOService. Because Transport Drivers needn't
                     67:  * derive from a type known to IOHDDrive, it isn't possible for IOHDDrive
                     68:  * to include the appropriate header file to allow direct communication
                     69:  * with the Transport Driver. Thus we achieve polymorphism by having
                     70:  * the Transport Driver instantiate a subclass of IOHDDriveNub.
                     71:  * A typical implementation for a concrete subclass of IOHDDriveNub
                     72:  * (e.g. IOSCSIHDDriveNub) simply relays all methods to its provider
                     73:  * (the Transport Driver).
                     74:  * 
                     75:  * All pure-virtual functions must be implemented by the Transport Driver, which
                     76:  * is responsible for instantiating the Nub.
                     77:  */
                     78: 
                     79: class IOHDDriveNub : public IOService {
                     80: 
                     81:     OSDeclareAbstractStructors(IOHDDriveNub)
                     82:     
                     83: public:
                     84: 
                     85:     /* Overrides from IORegistryEntry */
                     86: 
                     87:     /*!
                     88:      * @function init
                     89:      * @discussion
                     90:      * This function is overridden so that IOHDDriveNub can set a
                     91:      * property, used by IOHDDrive for matching. Since the concrete subclass of
                     92:      * IOHDDriveNub can be of any class type, the property is used for matching.
                     93:      * 
                     94:      * This function is usually not overridden by developers.
                     95:      */    
                     96:     virtual bool       init(OSDictionary * properties);
                     97: 
                     98:     /* --- A subclass must implement the the following methods: --- */
                     99: 
                    100:     /*!
                    101:      * @function doAsyncReadWrite
                    102:      * @abstract
                    103:      * Start an asynchronous read or write operation.
                    104:      * @param buffer
                    105:      * An IOMemoryDescriptor describing the data-transfer buffer. The data direction
                    106:      * is contained in the IOMemoryDescriptor. Responsiblity for releasing the descriptor
                    107:      * rests with the caller.
                    108:      * @param block
                    109:      * The starting block number of the data transfer.
                    110:      * @param nblks
                    111:      * The integral number of blocks to be transferred.
                    112:      * @param action
                    113:      * The C function called upon completion of the data transfer.
                    114:      * @param target
                    115:      * The C++ class "this" pointer, passed as an argument to "action."
                    116:      * @param param
                    117:      * This value is passed as an argument to "action." It is not validated or modified.
                    118:      */
                    119: 
                    120:     virtual IOReturn   doAsyncReadWrite(IOMemoryDescriptor *buffer,
                    121:                                             UInt32 block,UInt32 nblks,
                    122:                                             gdCompletionFunction action,
                    123:                                             IOService *target,void *param)     = 0;
                    124: 
                    125:     /*!
                    126:      * @function doSyncReadWrite
                    127:      * @abstract
                    128:      * Perform a synchronous read or write operation.
                    129:      * @param buffer
                    130:      * An IOMemoryDescriptor describing the data-transfer buffer. The data direction
                    131:      * is contained in the IOMemoryDescriptor. Responsiblity for releasing the descriptor
                    132:      * rests with the caller.
                    133:      * @param block
                    134:      * The starting block number of the data transfer.
                    135:      * @param nblks
                    136:      * The integral number of blocks to be transferred.
                    137:      */    
                    138:     virtual IOReturn   doSyncReadWrite(IOMemoryDescriptor *buffer,
                    139:                                      UInt32 block,UInt32 nblks)                        = 0;
                    140: 
                    141:     /*!
                    142:      * @function doEjectMedia
                    143:      * @abstract
                    144:      * Eject the media.
                    145:      */
                    146:     virtual IOReturn   doEjectMedia(void)                                      = 0;
                    147: 
                    148:     /*!
                    149:      * @function doFormatMedia
                    150:      * @abstract
                    151:      * Format the media to the specified byte capacity.
                    152:      * @discussion
                    153:      * The specified byte capacity must be one supported by the device.
                    154:      * Supported capacities can be obtained by calling doGetFormatCapacities.
                    155:      * @param byteCapacity
                    156:      * The byte capacity to which the device is to be formatted, if possible.
                    157:      */
                    158:     virtual IOReturn   doFormatMedia(UInt64 byteCapacity)                      = 0;
                    159: 
                    160:     /*!
                    161:      * @function doGetFormatCapacities
                    162:      * @abstract
                    163:      * Return the allowable formatting byte capacities.
                    164:      * @discussion
                    165:      * This function returns the supported byte capacities for the device.
                    166:      * @param capacities
                    167:      * Pointer for returning the list of capacities.
                    168:      * @param capacitiesMaxCount
                    169:      * The number of capacity values returned in "capacities."
                    170:      */
                    171:     virtual UInt32     doGetFormatCapacities(UInt64 * capacities,
                    172:                                             UInt32   capacitiesMaxCount) const = 0;
                    173:     
                    174:     /*!
                    175:      * @function doLockUnlockMedia
                    176:      * @abstract
                    177:      * Lock or unlock the (removable) media in the drive.
                    178:      * @discussion
                    179:      * This method should only be called if the media is known to be removable.
                    180:      * @param doLock
                    181:      * True to lock the media, False to unlock.
                    182:      */
                    183:     virtual IOReturn   doLockUnlockMedia(bool doLock)                          = 0;
                    184: 
                    185:     /*!
                    186:      * @function doSynchronizeCache
                    187:      * @abstract
                    188:      * Force data blocks in the drive's buffer to be flushed to the media.
                    189:      * @discussion
                    190:      * This method should only be called if the media is writable.
                    191:      */
                    192:     virtual IOReturn   doSynchronizeCache(void)                                = 0;
                    193: 
                    194:     /*!
                    195:      * @function executeCdb
                    196:      * @abstract
                    197:      * Issue the client's cdb as a pass-through.
                    198:      * @discussion
                    199:      * This method is provided to allow developers to issue arbitrary commands
                    200:      * to the device (via the Transport Driver). Expected uses would include vendor-specific
                    201:      * commands to effect password-protection, or for other vendor features.
                    202:      * 
                    203:      * This method may not be supported by all Transport Drivers. For example, ATA devices
                    204:      * do not have a CDB concept; those Transport Drivers will return kIOReturnUnsupported.
                    205:      * @param params
                    206:      * See IOHDTypes.h for the layout of this data structure.
                    207:      */
                    208:     virtual IOReturn   executeCdb(struct cdbParams *params)                    = 0;
                    209:     
                    210:     /*!
                    211:      * @function getVendorString
                    212:      * @abstract
                    213:      * Return Vendor Name string for the device.
                    214:      * @result
                    215:      * A pointer to a static character string.
                    216:      */
                    217:     virtual char *     getVendorString(void)                                   = 0;
                    218:     
                    219:     /*!
                    220:      * @function getProductString
                    221:      * @abstract
                    222:      * Return Product Name string for the device.
                    223:      * @result
                    224:      * A pointer to a static character string.
                    225:      */
                    226:     virtual char *     getProductString(void)                                  = 0;
                    227:     
                    228:     /*!
                    229:      * @function getRevisionString
                    230:      * @abstract
                    231:      * Return Product Revision string for the device.
                    232:      * @result
                    233:      * A pointer to a static character string.
                    234:      */
                    235:     virtual char *     getRevisionString(void)                                 = 0;
                    236:     
                    237:     /*!
                    238:      * @function getAdditionalDeviceInfoString
                    239:      * @abstract
                    240:      * Return additional informational string for the device.
                    241:      * @result
                    242:      * A pointer to a static character string.
                    243:      */
                    244:     virtual char *     getAdditionalDeviceInfoString(void)                     = 0;
                    245: 
                    246:     /*!
                    247:      * @function reportBlockSize
                    248:      * @abstract
                    249:      * Report the block size for the device, in bytes.
                    250:      * @param blockSize
                    251:      * Pointer to returned block size value.
                    252:      */    
                    253:     virtual IOReturn   reportBlockSize(UInt64 *blockSize)                      = 0;
                    254: 
                    255:     /*!
                    256:      * @function reportEjectability
                    257:      * @abstract
                    258:      * Report if the media is ejectable under software control.
                    259:      * @discussion
                    260:      * This method should only be called if the media is known to be removable.
                    261:      * @param isEjectable
                    262:      * Pointer to returned result. True indicates the media is ejectable, False indicates
                    263:      * the media cannot be ejected under software control.
                    264:      */
                    265:     virtual IOReturn   reportEjectability(bool *isEjectable)                   = 0;
                    266: 
                    267:     /*!
                    268:      * @function reportLockability
                    269:      * @abstract
                    270:      * Report if the media is lockable under software control.
                    271:      * @discussion
                    272:      * This method should only be called if the media is known to be removable.
                    273:      * @param isLockable
                    274:      * Pointer to returned result. True indicates the media can be locked in place; False
                    275:      * indicates the media cannot be locked by software.
                    276:      */
                    277:     virtual IOReturn   reportLockability(bool *isLockable)                     = 0;
                    278: 
                    279:     /*!
                    280:      * @function reportMaxReadTransfer
                    281:      * @abstract
                    282:      * Report the maximum allowed byte transfer for read operations.
                    283:      * @discussion
                    284:      * Some devices impose a maximum data transfer size. Because this limit
                    285:      * may be determined by the size of a block-count field in a command, the limit may
                    286:      * depend on the block size of the transfer.
                    287:      * @param blockSize
                    288:      * The block size desired for the transfer.
                    289:      * @param max
                    290:      * Pointer to returned result.
                    291:      */
                    292:     virtual IOReturn   reportMaxReadTransfer (UInt64 blockSize,UInt64 *max)    = 0;
                    293: 
                    294:     /*!
                    295:      * @function reportMaxWriteTransfer
                    296:      * @abstract
                    297:      * Report the maximum allowed byte transfer for write operations.
                    298:      * @discussion
                    299:      * Some devices impose a maximum data transfer size. Because this limit
                    300:      * may be determined by the size of a block-count field in a command, the limit may
                    301:      * depend on the block size of the transfer.
                    302:      * @param blockSize
                    303:      * The block size desired for the transfer.
                    304:      * @param max
                    305:      * Pointer to returned result.
                    306:      */
                    307:     virtual IOReturn   reportMaxWriteTransfer(UInt64 blockSize,UInt64 *max)    = 0;
                    308:     
                    309:     /*!
                    310:      * @function reportMaxValidBlock
                    311:      * @abstract
                    312:      * Report the highest valid block for the device.
                    313:      * @param maxBlock
                    314:      * Pointer to returned result
                    315:      */    
                    316:     virtual IOReturn   reportMaxValidBlock(UInt64 *maxBlock)                   = 0;
                    317: 
                    318:     /*!
                    319:      * @function reportMediaState
                    320:      * @abstract
                    321:      * Report the device's media state.
                    322:      * @discussion
                    323:      * This method reports whether we have media in the drive or not, and
                    324:      * whether the state has changed from the previously reported state.
                    325:      * 
                    326:      * A result of kIOReturnSuccess is always returned if the test for media is successful,
                    327:      * regardless of media presence. The mediaPresent result should be used to determine
                    328:      * whether media is present or not. A return other than kIOReturnSuccess indicates that
                    329:      * the Transport Driver was unable to interrogate the device. In this error case, the
                    330:      * outputs mediaState and changedState will *not* be stored.
                    331:      * @param mediaPresent Pointer to returned media state. True indicates media is present
                    332:      * in the device; False indicates no media is present.
                    333:      * @param changedState Pointer to returned result. True indicates a change of state since
                    334:      * prior calls, False indicates that the state has not changed.
                    335:      */
                    336:     virtual IOReturn   reportMediaState(bool *mediaPresent,bool *changedState) = 0;
                    337:     
                    338:     /*!
                    339:      * @function reportPollRequirements
                    340:      * @abstract
                    341:      * Report if it's necessary to poll for media insertion, and if polling is expensive.
                    342:      * @discussion
                    343:      * This method reports whether the device must be polled to detect media
                    344:      * insertion, and whether a poll is expensive to perform.
                    345:      * 
                    346:      * The term "expensive" typically implies a device that must be spun-up to detect media,
                    347:      * as on a PC floppy. Most devices can detect media inexpensively.
                    348:      * @param pollRequired
                    349:      * Pointer to returned result. True indicates that polling is required; False indicates
                    350:      * that polling is not required to detect media.
                    351:      * @param pollIsExpensive
                    352:      * Pointer to returned result. True indicates that the polling operation is expensive;
                    353:      * False indicates that the polling operation is cheap.
                    354:      */
                    355:     virtual IOReturn   reportPollRequirements(bool *pollRequired,
                    356:                                             bool *pollIsExpensive)             = 0;
                    357:     
                    358:     /*!
                    359:      * @function reportRemovability
                    360:      * @abstract
                    361:      * Report whether the media is removable or not.
                    362:      * @discussion
                    363:      * This method reports whether the media is removable, but it does not
                    364:      * provide detailed information regarding software eject or lock/unlock capability.
                    365:      * @param isRemovable
                    366:      * Pointer to returned result. True indicates that the media is removable; False
                    367:      * indicates the media is not removable.
                    368:      */
                    369:     virtual IOReturn   reportRemovability(bool *isRemovable)                   = 0;
                    370:     
                    371:     /*!
                    372:      * @function reportWriteProtection
                    373:      * @abstract
                    374:      * Report whether the media is write-protected or not.
                    375:      * @param isWriteProtected
                    376:      * Pointer to returned result. True indicates that the media is write-protected (it
                    377:      * cannot be written); False indicates that the media is not write-protected (it
                    378:      * is permissible to write).
                    379:      */
                    380:     virtual IOReturn   reportWriteProtection(bool *isWriteProtected)           = 0;
                    381: };
                    382: #endif

unix.superglobalmegacorp.com

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