Annotation of XNU/iokit/IOKit/storage/IOHDDriveNub.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:  * 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.