Annotation of XNU/iokit/IOKit/storage/IODrive.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:  * @header IODrive
                     25:  * @abstract
                     26:  * This header contains the IODrive class definition.
                     27:  */
                     28: 
                     29: #ifndef _IODRIVE_H
                     30: #define _IODRIVE_H
                     31: 
                     32: /*!
                     33:  * @defined kIODriveStatistics
                     34:  * @abstract
                     35:  * kIODriveStatistics is a property of IODrive objects.  It is an OSDictionary.
                     36:  * @discussion
                     37:  * The kIODirectionStatistics property contains a table of statistics describing
                     38:  * drive operations.  All the different statistics are grouped under this table.
                     39:  */
                     40:  
                     41: #define kIODriveStatistics "Statistics"
                     42: 
                     43: /*!
                     44:  * @defined kIODriveStatisticsBytesRead
                     45:  * @abstract
                     46:  * kIODriveStatisticsBytesRead is one of the statistic entries listed
                     47:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                     48:  * @discussion
                     49:  * The kIODriveStatisticsBytesRead property describes the number of
                     50:  * bytes read since the drive object was instantiated.
                     51:  */
                     52: 
                     53: #define kIODriveStatisticsBytesRead "Bytes (Read)"
                     54: 
                     55: /*!
                     56:  * @defined kIODriveStatisticsBytesWritten
                     57:  * @abstract
                     58:  * kIODriveStatisticsBytesWritten is one of the statistic entries listed
                     59:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                     60:  * @discussion
                     61:  * The kIODriveStatisticsBytesWritten property describes the number of
                     62:  * bytes written since the drive object was instantiated.
                     63:  */
                     64: 
                     65: #define kIODriveStatisticsBytesWritten "Bytes (Write)"
                     66: 
                     67: /*!
                     68:  * @defined kIODriveStatisticsReadErrors
                     69:  * @abstract
                     70:  * kIODriveStatisticsReadErrors is one of the statistic entries listed
                     71:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                     72:  * @discussion
                     73:  * The kIODriveStatisticsReadErrors property describes the number of
                     74:  * read errors encountered since the drive object was instantiated.
                     75:  */
                     76: 
                     77: #define kIODriveStatisticsReadErrors "Errors (Read)"
                     78: 
                     79: /*!
                     80:  * @defined kIODriveStatisticsWriteErrors
                     81:  * @abstract
                     82:  * kIODriveStatisticsWriteErrors is one of the statistic entries listed
                     83:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                     84:  * @discussion
                     85:  * The kIODriveStatisticsWriteErrors property describes the number of
                     86:  * write errors encountered since the drive object was instantiated.
                     87:  */
                     88: 
                     89: #define kIODriveStatisticsWriteErrors "Errors (Write)"
                     90: 
                     91: /*!
                     92:  * @defined kIODriveStatisticsLatentReadTime
                     93:  * @abstract
                     94:  * kIODriveStatisticsLatentReadTime is one of the statistic entries listed
                     95:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                     96:  * @discussion
                     97:  * The kIODriveStatisticsLatentReadTime property describes the number of
                     98:  * nanoseconds of latency during reads since the drive object was instantiated.
                     99:  */
                    100: 
                    101: #define kIODriveStatisticsLatentReadTime "Latency Time (Read)"
                    102: 
                    103: /*!
                    104:  * @defined kIODriveStatisticsLatentWriteTime
                    105:  * @abstract
                    106:  * kIODriveStatisticsLatentWriteTime is one of the statistic entries listed
                    107:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                    108:  * @discussion
                    109:  * The kIODriveStatisticsLatentWriteTime property describes the number of
                    110:  * nanoseconds of latency during writes since the drive object was instantiated.
                    111:  */
                    112: 
                    113: #define kIODriveStatisticsLatentWriteTime "Latency Time (Write)"
                    114: 
                    115: /*!
                    116:  * @defined kIODriveStatisticsReads
                    117:  * @abstract
                    118:  * kIODriveStatisticsReads is one of the statistic entries listed
                    119:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                    120:  * @discussion
                    121:  * The kIODriveStatisticsReads property describes the number of
                    122:  * read operations processed since the drive object was instantiated.
                    123:  */
                    124: 
                    125: #define kIODriveStatisticsReads "Operations (Read)"
                    126: 
                    127: /*!
                    128:  * @defined kIODriveStatisticsWrites
                    129:  * @abstract
                    130:  * kIODriveStatisticsWrites is one of the statistic entries listed
                    131:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                    132:  * @discussion
                    133:  * The kIODriveStatisticsWrites property describes the number of
                    134:  * write operations processed since the drive object was instantiated.
                    135:  */
                    136: 
                    137: #define kIODriveStatisticsWrites "Operations (Write)"
                    138: 
                    139: /*!
                    140:  * @defined kIODriveStatisticsReadRetries
                    141:  * @abstract
                    142:  * kIODriveStatisticsReadRetries is one of the statistic entries listed
                    143:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                    144:  * @discussion
                    145:  * The kIODriveStatisticsReadRetries property describes the number of
                    146:  * read retries required since the drive object was instantiated.
                    147:  */
                    148: 
                    149: #define kIODriveStatisticsReadRetries "Retries (Read)"
                    150: 
                    151: /*!
                    152:  * @defined kIODriveStatisticsWriteRetries
                    153:  * @abstract
                    154:  * kIODriveStatisticsWriteRetries is one of the statistic entries listed
                    155:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                    156:  * @discussion
                    157:  * The kIODriveStatisticsWriteRetries property describes the number of
                    158:  * write retries required since the drive object was instantiated.
                    159:  */
                    160: 
                    161: #define kIODriveStatisticsWriteRetries "Retries (Write)"
                    162: 
                    163: /*!
                    164:  * @defined kIODriveStatisticsTotalReadTime
                    165:  * @abstract
                    166:  * kIODriveStatisticsTotalReadTime is one of the statistic entries listed
                    167:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                    168:  * @discussion
                    169:  * The kIODriveStatisticsTotalReadTime property describes the number of
                    170:  * nanoseconds spent performing reads since the drive object was instantiated.
                    171:  */
                    172: 
                    173: #define kIODriveStatisticsTotalReadTime "Total Time (Read)"
                    174: 
                    175: /*!
                    176:  * @defined kIODriveStatisticsTotalWriteTime
                    177:  * @abstract
                    178:  * kIODriveStatisticsTotalWriteTime is one of the statistic entries listed
                    179:  * under the kIODriveStatistics property of IODrive objects.  It is an OSNumber.
                    180:  * @discussion
                    181:  * The kIODriveStatisticsTotalWriteTime property describes the number of
                    182:  * nanoseconds spent performing writes since the drive object was instantiated.
                    183:  */
                    184: 
                    185: #define kIODriveStatisticsTotalWriteTime "Total Time (Write)"
                    186: 
                    187: /*
                    188:  * Kernel
                    189:  */
                    190: 
                    191: #if defined(KERNEL) && defined(__cplusplus)
                    192: 
                    193: #include <IOKit/storage/IOStorage.h>
                    194: 
                    195: /*!
                    196:  * @class IODrive
                    197:  * @abstract
                    198:  * The IODrive class is the common base class for all disk drive objects.
                    199:  * @discussion
                    200:  * The IODrive class is the common base class for all disk drive objects.  It
                    201:  * extends the IOStorage class by implementing the appropriate open and close
                    202:  * semantics for drive objects, deblocking for unaligned transfers, automatic
                    203:  * polling for removable media, statistics gathering and reporting functions,
                    204:  * and declaring the abstract APIs for media formatting, ejection and locking
                    205:  * (removal prevention).
                    206:  *
                    207:  * There are more specific subclasses of IODrive which further implement the
                    208:  * general semantics of hard disk drives (IOHDDrive), CD drives (IOCDDrive),
                    209:  * and so on.
                    210:  */
                    211: 
                    212: class IODrive : public IOStorage
                    213: {
                    214:     OSDeclareAbstractStructors(IODrive);
                    215: 
                    216: public:
                    217: 
                    218:     /*!
                    219:      * @enum Statistics
                    220:      * @discussion
                    221:      * Indices for the different statistics that getStatistics() can report.
                    222:      * @constant kStatisticsReads
                    223:      * Number of read operations thus far.
                    224:      * @constant kStatisticsSingleBlockReads
                    225:      * Number of read operations for a single block thus far.
                    226:      * @constant kStatisticsBytesRead
                    227:      * Number of bytes read thus far.
                    228:      * @constant kStatisticsTotalReadTime
                    229:      * Nanoseconds spent performing reads thus far.
                    230:      * @constant kStatisticsLatentReadTime
                    231:      * Nanoseconds of latency during reads thus far.
                    232:      * @constant kStatisticsReadRetries
                    233:      * Number of read retries thus far.
                    234:      * @constant kStatisticsReadErrors
                    235:      * Number of read errors thus far.
                    236:      * @constant kStatisticsWrites
                    237:      * Number of write operations thus far.
                    238:      * @constant kStatisticsSingleBlockWrites
                    239:      * Number of write operations for a single block thus far.
                    240:      * @constant kStatisticsBytesWritten
                    241:      * Number of bytes written thus far.
                    242:      * @constant kStatisticsTotalWriteTime
                    243:      * Nanoseconds spent performing writes thus far.
                    244:      * @constant kStatisticsLatentWriteTime
                    245:      * Nanoseconds of latency during writes thus far.
                    246:      * @constant kStatisticsWriteRetries
                    247:      * Number of write retries thus far.
                    248:      * @constant kStatisticsWriteErrors
                    249:      * Number of write errors thus far.
                    250:      */
                    251: 
                    252:     enum Statistics
                    253:     {
                    254:         kStatisticsReads,
                    255:         kStatisticsSingleBlockReads,
                    256:         kStatisticsBytesRead,
                    257:         kStatisticsTotalReadTime,
                    258:         kStatisticsLatentReadTime,
                    259:         kStatisticsReadRetries,
                    260:         kStatisticsReadErrors,
                    261: 
                    262:         kStatisticsWrites,
                    263:         kStatisticsSingleBlockWrites,
                    264:         kStatisticsBytesWritten,
                    265:         kStatisticsTotalWriteTime,
                    266:         kStatisticsLatentWriteTime,
                    267:         kStatisticsWriteRetries,
                    268:         kStatisticsWriteErrors
                    269:     };
                    270: 
                    271:     static const UInt32 kStatisticsCount = kStatisticsWriteErrors + 1;
                    272: 
                    273:     /*!
                    274:      * @enum IOMediaState
                    275:      * @discussion
                    276:      * The different states that getMediaState() can report.
                    277:      * @constant kMediaOffline
                    278:      * Media is not available.
                    279:      * @constant kMediaOnline
                    280:      * Media is available and ready for operations.
                    281:      * @constant kMediaBusy
                    282:      * Media is available, but not ready for operations.
                    283:      */
                    284: 
                    285:     enum IOMediaState
                    286:     {
                    287:         kMediaOffline,
                    288:         kMediaOnline,
                    289:         kMediaBusy
                    290:     };
                    291: 
                    292: protected:
                    293: 
                    294:     OSSet *         _openClients;
                    295:     OSNumber *      _statistics[kStatisticsCount];
                    296: 
                    297:     /*
                    298:      * Free all of this object's outstanding resources.
                    299:      *
                    300:      * This method's implementation is not typically overidden.
                    301:      */
                    302: 
                    303:     void free();
                    304: 
                    305:     /*!
                    306:      * @function handleOpen
                    307:      * @discussion
                    308:      * The handleOpen method grants or denies permission to access this object
                    309:      * to an interested client.  The argument is an IOStorageAccess value that
                    310:      * specifies the level of access desired -- reader or reader-writer.
                    311:      *
                    312:      * This method can be invoked to upgrade or downgrade the access level for
                    313:      * an existing client as well.  The previous access level will prevail for
                    314:      * upgrades that fail, of course.   A downgrade should never fail.  If the
                    315:      * new access level should be the same as the old for a given client, this
                    316:      * method will do nothing and return success.  In all cases, one, singular
                    317:      * close-per-client is expected for all opens-per-client received.
                    318:      *
                    319:      * This implementation replaces the IOService definition of handleIsOpen().
                    320:      * @param client
                    321:      * Client requesting the open.
                    322:      * @param options
                    323:      * Options for the open.  Set to zero.
                    324:      * @param access
                    325:      * Access level for the open.  Set to kAccessReader or kAccessReaderWriter.
                    326:      * @result
                    327:      * Returns true if the open was successful, false otherwise.
                    328:      */
                    329: 
                    330:     virtual bool handleOpen(IOService *  client,
                    331:                             IOOptionBits options,
                    332:                             void *       access);
                    333: 
                    334:     /*!
                    335:      * @function handleIsOpen
                    336:      * @discussion
                    337:      * The handleIsOpen method determines whether the specified client, or any
                    338:      * client if none is specificed, presently has an open on this object.
                    339:      *
                    340:      * This implementation replaces the IOService definition of handleIsOpen().
                    341:      * @param client
                    342:      * Client to check the open state of.  Set to zero to check the open state
                    343:      * of all clients.
                    344:      * @result
                    345:      * Returns true if the client was (or clients were) open, false otherwise.
                    346:      */
                    347: 
                    348:     virtual bool handleIsOpen(const IOService * client) const;
                    349: 
                    350:     /*!
                    351:      * @function handleClose
                    352:      * @discussion
                    353:      * The handleClose method closes the client's access to this object.
                    354:      *
                    355:      * This implementation replaces the IOService definition of handleIsOpen().
                    356:      * @param client
                    357:      * Client requesting the close.
                    358:      * @param options
                    359:      * Options for the close.  Set to zero.
                    360:      */
                    361: 
                    362:     virtual void handleClose(IOService * client, IOOptionBits options);
                    363: 
                    364:     /*!
                    365:      * @function addToBytesTransferred
                    366:      * @discussion
                    367:      * Update the total number of bytes transferred, the total transfer time,
                    368:      * and the total latency time for this drive -- used for statistics.
                    369:      *
                    370:      * This method's implementation is not typically overidden.
                    371:      * @param bytesTransferred
                    372:      * Number of bytes transferred in this operation.
                    373:      * @param totalTime
                    374:      * Nanoseconds spent performing this operation.
                    375:      * @param latentTime
                    376:      * Nanoseconds of latency during this operation.
                    377:      * @param isWrite
                    378:      * Indicates whether this operation was a write, otherwise is was a read.
                    379:      */
                    380: 
                    381:     virtual void addToBytesTransferred(UInt64 bytesTransferred,
                    382:                                        UInt64 totalTime,
                    383:                                        UInt64 latentTime,
                    384:                                        bool   isWrite);
                    385: 
                    386:     /*!
                    387:      * @function incrementErrors
                    388:      * @discussion
                    389:      * Update the total error count -- used for statistics.
                    390:      *
                    391:      * This method's implementation is not typically overidden.
                    392:      * @param isWrite
                    393:      * Indicates whether this operation was a write, otherwise is was a read.
                    394:      */
                    395: 
                    396:     virtual void incrementErrors(bool isWrite);
                    397: 
                    398:     /*!
                    399:      * @function incrementRetries
                    400:      * @discussion
                    401:      * Update the total retry count -- used for statistics.
                    402:      *
                    403:      * This method's implementation is not typically overidden.
                    404:      * @param isWrite
                    405:      * Indicates whether this operation was a write, otherwise is was a read.
                    406:      */
                    407: 
                    408:     virtual void incrementRetries(bool isWrite);
                    409: 
                    410:     /*!
                    411:      * @function deblockRequest
                    412:      * @discussion
                    413:      * The deblockRequest method checks to see if the incoming request rests
                    414:      * on the media's block boundaries, and if not, deblocks it.  Deblocking
                    415:      * involves breaking up the request into sub-requests that rest on block
                    416:      * boundaries, and performing the appropriate unaligned byte copies from
                    417:      * the scratch buffer into into the client's request buffer.
                    418:      *
                    419:      * This method is part of a sequence of methods that are called for each
                    420:      * read or write request.  The first is deblockRequest, which aligns the
                    421:      * request at the media's block boundaries; the second is prepareRequest,
                    422:      * which prepares the memory involved in the transfer;  and the third is 
                    423:      * executeRequest, which implements the actual transfer from the drive.
                    424:      *
                    425:      * This method's implementation is not typically overidden.
                    426:      * @param byteStart
                    427:      * Starting byte offset for the data transfer.
                    428:      * @param buffer
                    429:      * Buffer for the data transfer.  The size of the buffer implies the size of
                    430:      * the data transfer.
                    431:      * @param completion
                    432:      * Completion routine to call once the data transfer is complete.
                    433:      */
                    434: 
                    435:     virtual void deblockRequest(UInt64               byteStart,
                    436:                                 IOMemoryDescriptor * buffer,
                    437:                                 IOStorageCompletion  completion);
                    438: 
                    439:     /*!
                    440:      * @function prepareRequest
                    441:      * @discussion
                    442:      * The prepareRequest method prepares the memory involved in the transfer.
                    443:      * The memory will be wired down, physically mapped, and broken up based
                    444:      * on the controller's and drive's constraints.
                    445:      *
                    446:      * This method is part of a sequence of methods that are called for each
                    447:      * read or write request.  The first is deblockRequest, which aligns the
                    448:      * request at the media's block boundaries; the second is prepareRequest,
                    449:      * which prepares the buffer involved in the transfer;  and the third is 
                    450:      * executeRequest, which implements the actual transfer from the drive.
                    451:      *
                    452:      * This method's implementation is not typically overidden.
                    453:      * @param byteStart
                    454:      * Starting byte offset for the data transfer.
                    455:      * @param buffer
                    456:      * Buffer for the data transfer.  The size of the buffer implies the size of
                    457:      * the data transfer.
                    458:      * @param completion
                    459:      * Completion routine to call once the data transfer is complete.
                    460:      */
                    461: 
                    462:     virtual void prepareRequest(UInt64               byteStart,
                    463:                                 IOMemoryDescriptor * buffer,
                    464:                                 IOStorageCompletion  completion);
                    465: 
                    466:     /*!
                    467:      * @function executeRequest
                    468:      * @discussion
                    469:      * Execute the specified storage request.  The request is guaranteed to
                    470:      * be block-aligned, and to have a memory buffer that is wired, mapped,
                    471:      * and is constrained according to the controller's and drive's limits.
                    472:      *
                    473:      * This method is part of a sequence of methods that are called for each
                    474:      * read or write request.  The first is deblockRequest, which aligns the
                    475:      * request at the media's block boundaries; the second is prepareRequest,
                    476:      * which prepares the buffer involved in the transfer;  and the third is 
                    477:      * executeRequest, which implements the actual transfer from the drive.
                    478:      *
                    479:      * When implementing this abstract method, it is important to remember
                    480:      * that the buffer must be retained while the asynchronous operation is
                    481:      * being processed, as per regular I/O Kit object-passing semantics.
                    482:      * @param byteStart
                    483:      * Starting byte offset for the data transfer.
                    484:      * @param buffer
                    485:      * Buffer for the data transfer.  The size of the buffer implies the size of
                    486:      * the data transfer.
                    487:      * @param completion
                    488:      * Completion routine to call once the data transfer is complete.
                    489:      */
                    490: 
                    491:     virtual void executeRequest(UInt64               byteStart,
                    492:                                 IOMemoryDescriptor * buffer,
                    493:                                 IOStorageCompletion  completion) = 0;
                    494: 
                    495:     /*!
                    496:      * @function handleStart
                    497:      * @discussion
                    498:      * Prepare the drive for operation.
                    499:      *
                    500:      * This is where a media object needs to be created for fixed media, and
                    501:      * optionally for removable media.  For removable media, the poller will
                    502:      * issue handlePoll() once a second, so the creation of the media object
                    503:      * could be delayed until then if you wish.
                    504:      *
                    505:      * Note that this method is called from the superclass' start() routine;
                    506:      * if this method returns successfully,  it should be prepared to accept
                    507:      * any of IODrive's abstract methods.
                    508:      * @param provider
                    509:      * This object's provider.
                    510:      * @result
                    511:      * Returns true on success, false otherwise.
                    512:      */
                    513: 
                    514:     virtual bool handleStart(IOService * provider) = 0;
                    515: 
                    516:     /*!
                    517:      * @function handleStop
                    518:      * @discussion
                    519:      * Stop the drive.
                    520:      *
                    521:      * This is where the driver should clean up its state in preparation for
                    522:      * removal from the system.
                    523:      *
                    524:      * Note that this method is called from the superclass' stop() routine.
                    525:      * @param provider
                    526:      * This object's provider.
                    527:      */
                    528: 
                    529:     virtual void handleStop(IOService * provider) = 0;
                    530: 
                    531:     /*!
                    532:      * @function getMediaBlockSize
                    533:      * @discussion
                    534:      * Ask the drive about the media's actual block size.
                    535:      * @result
                    536:      * Natural block size, in bytes.
                    537:      */
                    538: 
                    539:     virtual inline UInt64 getMediaBlockSize() const = 0;
                    540: 
                    541: public:
                    542: 
                    543: ///m:2333367:workaround:commented:start
                    544: //  IOStorage::open;
                    545: //  IOStorage::close;
                    546: //  IOStorage::read;
                    547: //  IOStorage::write;
                    548: ///m:2333367:workaround:commented:stop
                    549: 
                    550:     /*
                    551:      * Initialize this object's minimal state.
                    552:      *
                    553:      * This method's implementation is not typically overidden.
                    554:      */
                    555: 
                    556:     virtual bool init(OSDictionary * properties = 0);
                    557: 
                    558:     /*
                    559:      * This method is called once we have been attached to the provider object.
                    560:      *
                    561:      * This method's implementation is not typically overidden.
                    562:      */
                    563: 
                    564:     virtual bool start(IOService * provider);
                    565: 
                    566:     /*
                    567:      * This method is called before we are detached from the provider object.
                    568:      *
                    569:      * This method's implementation is not typically overidden.
                    570:      */
                    571: 
                    572:     virtual void stop(IOService * provider);
                    573: 
                    574:     /*!
                    575:      * @function read
                    576:      * @discussion
                    577:      * The read method is the receiving end for all read requests from the
                    578:      * storage framework, that is, the child storage objects of this drive.
                    579:      *
                    580:      * This method kicks off a sequence of methods which are called for each
                    581:      * read or write request.  The first is deblockRequest, which aligns the
                    582:      * request at the media's block boundaries; the second is prepareRequest,
                    583:      * which prepares the buffer involved in the transfer;  and the third is 
                    584:      * executeRequest, which implements the actual transfer from the drive.
                    585:      *
                    586:      * This method's implementation is not typically overidden.
                    587:      * @param client
                    588:      * Client requesting the read.
                    589:      * @param byteStart
                    590:      * Starting byte offset for the data transfer.
                    591:      * @param buffer
                    592:      * Buffer for the data transfer.  The size of the buffer implies the size of
                    593:      * the data transfer.
                    594:      * @param completion
                    595:      * Completion routine to call once the data transfer is complete.
                    596:      */
                    597: 
                    598:     virtual void read(IOService *          client,
                    599:                       UInt64               byteStart,
                    600:                       IOMemoryDescriptor * buffer,
                    601:                       IOStorageCompletion  completion);
                    602: 
                    603:     /*!
                    604:      * @function write
                    605:      * @discussion
                    606:      * The write method is the receiving end for all write requests from the
                    607:      * storage framework, that is, the child storage objects of this drive.
                    608:      *
                    609:      * This method kicks off a sequence of methods which are called for each
                    610:      * read or write request.  The first is deblockRequest, which aligns the
                    611:      * request at the media's block boundaries; the second is prepareRequest,
                    612:      * which prepares the buffer involved in the transfer;  and the third is 
                    613:      * executeRequest, which implements the actual transfer from the drive.
                    614:      *
                    615:      * This method's implementation is not typically overidden.
                    616:      * @param client
                    617:      * Client requesting the write.
                    618:      * @param byteStart
                    619:      * Starting byte offset for the data transfer.
                    620:      * @param buffer
                    621:      * Buffer for the data transfer.  The size of the buffer implies the size of
                    622:      * the data transfer.
                    623:      * @param completion
                    624:      * Completion routine to call once the data transfer is complete.
                    625:      */
                    626: 
                    627:     virtual void write(IOService *          client,
                    628:                        UInt64               byteStart,
                    629:                        IOMemoryDescriptor * buffer,
                    630:                        IOStorageCompletion  completion);
                    631: 
                    632:     /*!
                    633:      * @function ejectMedia
                    634:      * @discussion
                    635:      * Eject the media from the drive. The drive object is responsible for
                    636:      * tearing down the child storage objects it created before proceeding
                    637:      * with the eject.  If the teardown fails, an error should be returned.
                    638:      * @result
                    639:      * An IOReturn code.
                    640:      */
                    641: 
                    642:     virtual IOReturn ejectMedia() = 0;
                    643: 
                    644:     /*!
                    645:      * @function formatMedia
                    646:      * @discussion
                    647:      * Format the media in the drive with the specified byte capacity.    The
                    648:      * drive object is responsible for tearing down the child storage objects
                    649:      * and recreating them, if applicable.
                    650:      * @param byteCapacity
                    651:      * Number of bytes to format media to.
                    652:      * @result
                    653:      * An IOReturn code.
                    654:      */
                    655: 
                    656:     virtual IOReturn formatMedia(UInt64 byteCapacity) = 0;
                    657: 
                    658:     /*!
                    659:      * @function lockMedia
                    660:      * @discussion
                    661:      * Lock or unlock the ejectable media in the drive, that is, prevent
                    662:      * it from manual ejection or allow its manual ejection.
                    663:      * @param lock
                    664:      * Pass true to lock the media, otherwise pass false to unlock the media.
                    665:      * @result
                    666:      * An IOReturn code.
                    667:      */
                    668: 
                    669:     virtual IOReturn lockMedia(bool lock) = 0;
                    670: 
                    671:     /*!
                    672:      * @function pollMedia
                    673:      * @discussion
                    674:      * Poll for the presence of media in the drive.  The drive object is
                    675:      * responsible for tearing down the child storage objects it created
                    676:      * should the media have been removed since the last poll, and vice-
                    677:      * versa,   creating the child storage objects should new media have
                    678:      * arrived since the last poll.
                    679:      * @result
                    680:      * An IOReturn code.
                    681:      */
                    682: 
                    683:     virtual IOReturn pollMedia() = 0;
                    684: 
                    685:     /*!
                    686:      * @function isMediaEjectable
                    687:      * @discussion
                    688:      * Ask the drive whether it contains ejectable media.
                    689:      * @result
                    690:      * Returns true if the media is ejectable, false otherwise.
                    691:      */
                    692: 
                    693:     virtual bool isMediaEjectable() const = 0;
                    694: 
                    695:     /*!
                    696:      * @function isMediaPollExpensive
                    697:      * @discussion
                    698:      * Ask the drive whether it a pollMedia would be an expensive operation,
                    699:      * that is, one that requires the drive to spin up or delay for a while.
                    700:      * @result
                    701:      * Returns true if polling the media is expensive, false otherwise.
                    702:      */
                    703: 
                    704:     virtual bool isMediaPollExpensive() const = 0;
                    705: 
                    706:     /*!
                    707:      * @function isMediaPollRequired
                    708:      * @discussion
                    709:      * Ask the drive whether it requires polling, which is typically required
                    710:      * for drives with ejectable media without the ability to asynchronously
                    711:      * detect the arrival or departure of the media.
                    712:      * @result
                    713:      * Returns true if polling the media is required, false otherwise.
                    714:      */
                    715: 
                    716:     virtual bool isMediaPollRequired() const = 0;
                    717: 
                    718:     /*!
                    719:      * @function getMediaState
                    720:      * @discussion
                    721:      * Ask the drive about the media's current state.
                    722:      * @result
                    723:      * An IOMediaState value.
                    724:      */
                    725: 
                    726:     virtual IOMediaState getMediaState() const = 0;
                    727: 
                    728:     /*!
                    729:      * @function getFormatCapacities
                    730:      * @discussion
                    731:      * Ask the drive to report the feasible formatting capacities for the
                    732:      * inserted media (in bytes).  This routine fills the caller's buffer,
                    733:      * up to the maximum count specified if the real number of capacities
                    734:      * would overflow the buffer.   The return value indicates the actual
                    735:      * number of capacities copied to the buffer.
                    736:      *
                    737:      * If the capacities buffer is not supplied or if the maximum count is
                    738:      * zero, the routine returns the proposed count of capacities instead.
                    739:      * @param capacities
                    740:      * Buffer that will receive the UInt64 capacity values.
                    741:      * @param capacitiesMaxCount
                    742:      * Maximum number of capacity values that can be held in the buffer.
                    743:      * @result
                    744:      * Actual number of capacity values copied to the buffer, or if no buffer
                    745:      * is given, the total number of capacity values available.
                    746:      */
                    747: 
                    748:     virtual UInt32 getFormatCapacities(UInt64 * capacities,
                    749:                                        UInt32   capacitiesMaxCount) const = 0;
                    750: 
                    751:     /*!
                    752:      * @function getStatistics
                    753:      * @discussion
                    754:      * Ask the drive to report its operating statistics.  The statistics are
                    755:      * described by the IODrive::Statistics indices.  This routine fills the
                    756:      * caller's buffer, up to the maximum count specified if the real number
                    757:      * of statistics would overflow the buffer.   The return value indicates
                    758:      * the actual number of statistics copied to the buffer.
                    759:      *
                    760:      * If the statistics buffer is not supplied or if the maximum count is
                    761:      * zero, the routine returns the proposed count of statistics instead.
                    762:      * @param statistics
                    763:      * Buffer that will receive the UInt64 statistic values.
                    764:      * @param statisticsMaxCount
                    765:      * Maximum number of statistic values that can be held in the buffer.
                    766:      * @result
                    767:      * Actual number of statistic values copied to the buffer, or if no buffer
                    768:      * is given, the total number of statistic values available.
                    769:      */
                    770: 
                    771:     virtual UInt32 getStatistics(UInt64 * statistics,
                    772:                                  UInt32   statisticsMaxCount) const;
                    773: 
                    774:     /*!
                    775:      * @function getStatistic
                    776:      * @discussion
                    777:      * Ask the drive to report one of its operating statistics.
                    778:      * @param statistic
                    779:      * Statistic index (an IODrive::Statistics index).
                    780:      * @result
                    781:      * Statistic value.
                    782:      */
                    783: 
                    784:     virtual UInt64 getStatistic(Statistics statistic) const;
                    785: 
                    786: protected:
                    787: 
                    788:     /*
                    789:      * Definitions for the default deblocker implementation.
                    790:      */
                    791: 
                    792:     enum DeblockerPhase
                    793:     {
                    794:         kPhaseBegin,
                    795:         kPhaseStart,
                    796:         kPhaseMiddle,
                    797:         kPhaseFinal,
                    798:         kPhaseDone,
                    799: 
                    800:         kPhaseBeginRMW,
                    801:         kPhaseStartRM,
                    802:         kPhaseStartW,
                    803:         kPhaseMiddleW,
                    804:         kPhaseFinalRM,
                    805:         kPhaseFinalW
                    806:     };
                    807: 
                    808:     struct DeblockerContext
                    809:     {
                    810:         struct
                    811:         {
                    812:             UInt64               byteStart;
                    813:             IOMemoryDescriptor * buffer;
                    814:             IOStorageCompletion  completion;
                    815:         } subrequest;
                    816: 
                    817:         UInt64               offsetStart;
                    818:         UInt64               bytesStart;
                    819:         UInt64               bytesMiddle;
                    820:         UInt64               bytesFinal;
                    821: 
                    822:         IOMemoryDescriptor * blockBuffer;
                    823:         UInt8 *              blockBufferPtr;
                    824: 
                    825:         IOMemoryDescriptor * middleBuffer;
                    826: 
                    827:         UInt64               bytesTransferred;
                    828: 
                    829:         struct
                    830:         {
                    831:             UInt64               byteStart;
                    832:             IOMemoryDescriptor * buffer;
                    833:             IOStorageCompletion  completion;
                    834:         } originalRequest;
                    835: 
                    836:         DeblockerPhase       phase;
                    837:     };
                    838: 
                    839:     IOLock * _deblockerLockForRMWs;
                    840: 
                    841:     /*
                    842:      * Allocate a deblocker context structure.  It comes preinitialized with
                    843:      * a block-sized scratch buffer and an associated memory descriptor, but
                    844:      * is otherwise uninitialized.
                    845:      */
                    846: 
                    847:     DeblockerContext * deblockerContextAllocate();
                    848: 
                    849:     /*
                    850:      * Deallocate a deblocker context structure.  The block-sized scratch
                    851:      * buffer and memory descriptor is automatically deallocated as well.
                    852:      */
                    853: 
                    854:     void deblockerContextFree(DeblockerContext * deblockContext);
                    855: 
                    856:     /*
                    857:      * This is the completion routine for the aligned deblocker subrequests.
                    858:      * It performs work on the just-completed phase, if any, transitions to
                    859:      * the next phase, then builds and issues a transfer for the next phase.
                    860:      */
                    861: 
                    862:     static void deblockerCompletion(void *   target,
                    863:                                     void *   parameter,
                    864:                                     IOReturn status,
                    865:                                     UInt64   actualByteCount);
                    866: 
                    867:     /*
                    868:      * Schedule the poller mechanism.
                    869:      */
                    870: 
                    871:     void schedulePoller();
                    872: 
                    873:     /*
                    874:      * Unschedule the poller mechanism.
                    875:      */
                    876: 
                    877:     void unschedulePoller();
                    878: 
                    879:     /*
                    880:      * This method is the timeout handler for the poller mechanism.  It polls
                    881:      * for media and reschedules another timeout if the drive is still closed.
                    882:      */
                    883: 
                    884:     static void poller(void *, void *);
                    885: };
                    886: 
                    887: #endif /* defined(KERNEL) && defined(__cplusplus) */
                    888: 
                    889: #endif /* !_IODRIVE_H */

unix.superglobalmegacorp.com

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