Annotation of XNU/iokit/IOKit/storage/ata/IOATAHDDrive.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:  * IOATAHDDrive.h
        !            26:  *
        !            27:  * HISTORY
        !            28:  * Aug 27, 1999        jliu - Ported from AppleATADrive.
        !            29:  */
        !            30: 
        !            31: #ifndef        _IOATAHDDRIVE_H
        !            32: #define        _IOATAHDDRIVE_H
        !            33: 
        !            34: #include <IOKit/IOTypes.h>
        !            35: #include <IOKit/ata/IOATA.h>
        !            36: #include <IOKit/IOInterruptEventSource.h>
        !            37: #include <IOKit/IOWorkLoop.h>
        !            38: #include <IOKit/IOLocks.h>
        !            39: #include <IOKit/storage/IOHDTypes.h>
        !            40: 
        !            41: class IOSyncer;
        !            42: 
        !            43: // ATA parameters.
        !            44: //
        !            45: #define kIOATASectorSize               512
        !            46: #define kIOATAMaxBlocksPerXfer 256
        !            47: 
        !            48: // ATA commands.
        !            49: //
        !            50: enum {
        !            51:        kIOATACommandReadPIO      = 0x20,
        !            52:        kIOATACommandWritePIO     = 0x30,
        !            53:        kIOATACommandReadDMA      = 0xc8,
        !            54:        kIOATACommandWriteDMA     = 0xca,
        !            55:        kIOATACommandSetFeatures  = 0xef,
        !            56: };
        !            57: 
        !            58: // ==========================================================================
        !            59: // IOATAClientData - This structure is stored on the IOATACommand's
        !            60: // driver private area.
        !            61: // ==========================================================================
        !            62: 
        !            63: struct IOATAClientData {
        !            64:        IOATACommand *          command;    // back pointer to command object.
        !            65:        IOMemoryDescriptor *    buffer;     // memory descriptor.
        !            66:        union {
        !            67:                struct {
        !            68:                        IOService *             target; // completion target.
        !            69:                        gdCompletionFunction    action; // completion action.
        !            70:                        void *                  param;  // completion param.
        !            71:                } async;
        !            72:                IOSyncer *              syncLock;   // lock for synchronous operation.
        !            73:        } completion;
        !            74:        bool                    isSync;     // synchronous command.
        !            75:        SInt32                  maxRetries; // max retry attempts (0 is no retry).
        !            76:        ATAReturnCode           returnCode; // operation return code.
        !            77:        queue_chain_t           link;       // queue linkage.
        !            78: };
        !            79: 
        !            80: // Get driver private data (IOATAClientData) from an IOATACommand object.
        !            81: //
        !            82: #define ATA_CLIENT_DATA(x)     ((IOATAClientData *)(x->getClientData()))
        !            83: 
        !            84: // ==========================================================================
        !            85: // IOATACommandQueue
        !            86: // ==========================================================================
        !            87: 
        !            88: class IOATACommandQueue : public OSObject
        !            89: {
        !            90:     OSDeclareDefaultStructors(IOATACommandQueue)
        !            91: 
        !            92: protected:
        !            93:        queue_head_t    _queue;
        !            94:        IORecursiveLock * _cmdLock;
        !            95:        IOSimpleLock *  _qLock;
        !            96:        bool            _enabled;
        !            97: 
        !            98:        virtual void free();
        !            99:        
        !           100: public:
        !           101:        static IOATACommandQueue * commmandQueue();
        !           102:        virtual bool init();
        !           103:        
        !           104:        void executeCommands();
        !           105:        bool enqueueCommand(IOATACommand * cmd);
        !           106:        void setEnabled(bool enable);
        !           107: };
        !           108: 
        !           109: // ==========================================================================
        !           110: // IOATAHDDrive
        !           111: // ==========================================================================
        !           112: 
        !           113: class IOATAHDDrive : public IOService
        !           114: {
        !           115:     OSDeclareDefaultStructors(IOATAHDDrive)
        !           116: 
        !           117: protected:
        !           118:        IOATADevice *                           _ataDevice;
        !           119:        IOWorkLoop *                            _workloop;
        !           120:        IOInterruptEventSource *        _evSource;
        !           121:        UInt                                            _unit;
        !           122: 
        !           123:        ATATimingProtocol                       _timingProtocol;
        !           124:        ATAProtocol                                     _ataProtocol;
        !           125:        UInt8                                           _ataReadCmd;
        !           126:        UInt8                                           _ataWriteCmd;
        !           127: 
        !           128:        IOATACommandQueue *         _retryQueue;
        !           129: 
        !           130:        char                                            _revision[9];
        !           131:        char                                            _model[41];
        !           132: 
        !           133:        //-----------------------------------------------------------------------
        !           134:        // Default timeout interval for async and sync commands.
        !           135:        
        !           136:     static const UInt ATADefaultTimeout = 30000;               // 30 seconds
        !           137: 
        !           138:        //-----------------------------------------------------------------------
        !           139:        // Default retry count for async and sync commands.
        !           140: 
        !           141:        static const UInt ATADefaultRetries = 4;
        !           142: 
        !           143:        //-----------------------------------------------------------------------
        !           144:        // Release all allocated resource before calling super::free().
        !           145: 
        !           146:        virtual void           free();
        !           147: 
        !           148:        //-----------------------------------------------------------------------
        !           149:        // Set the ATA device timings.
        !           150: 
        !           151:        virtual bool           selectTimingProtocol(ATATimingProtocol protocol = 
        !           152:                                                 ataMaxTimings);
        !           153: 
        !           154:        //-----------------------------------------------------------------------
        !           155:        // Selects the Command protocol to use (e.g. ataProtocolPIO, 
        !           156:        // ataProtocolDMA).
        !           157: 
        !           158:        virtual void           selectCommandProtocol(bool useDMA);
        !           159: 
        !           160:        //-----------------------------------------------------------------------
        !           161:        // Setup an ATATaskFile from the parameters given, and write the taskfile
        !           162:        // to the ATATaskfile structure pointer provided.
        !           163: 
        !           164:        virtual void           setupReadWriteTaskFile(ATATaskfile * taskfile,
        !           165:                                                   ATAProtocol   protocol,
        !           166:                                                   UInt8         command,
        !           167:                                                   UInt32        block,
        !           168:                                                   UInt32        nblks);
        !           169: 
        !           170:        //-----------------------------------------------------------------------
        !           171:        // Allocate and return an IOATACommand that is initialized to perform
        !           172:        // a read/write operation.
        !           173: 
        !           174:        virtual IOATACommand * ataCommandReadWrite(IOMemoryDescriptor * buffer,
        !           175:                                                UInt32               block,
        !           176:                                                UInt32               nblks);
        !           177: 
        !           178:        //-----------------------------------------------------------------------
        !           179:        // Allocate and return a ATA Set Features command.
        !           180: 
        !           181:        virtual IOATACommand * ataCommandSetFeatures(UInt8 features,
        !           182:                                                  UInt8 SectorCount,
        !           183:                                                  UInt8 SectorNumber,
        !           184:                                                  UInt8 CylinderLow,
        !           185:                                                  UInt8 CyclinderHigh);
        !           186: 
        !           187:        //-----------------------------------------------------------------------
        !           188:        // This method is responsible for calling the client's completion routine
        !           189:        // for an async command.
        !           190: 
        !           191:        virtual void           completionCallback(IOService *          target,
        !           192:                                               gdCompletionFunction action,
        !           193:                                               void *               param,
        !           194:                                               UInt32               bytes,
        !           195:                                               IOReturn             status);
        !           196: 
        !           197:        //-----------------------------------------------------------------------
        !           198:        // This routine is called by our provider when a command processing has
        !           199:        // completed.
        !           200: 
        !           201:        virtual void           completionHandler(IOService *     device,
        !           202:                                              IOATACommand *  cmd,
        !           203:                                              void *          refcon);
        !           204: 
        !           205:        //-----------------------------------------------------------------------
        !           206:        // Issue a synchronous ATA command.
        !           207: 
        !           208:        virtual ATAReturnCode  syncExecute(
        !           209:                                IOATACommand * cmd,
        !           210:                                UInt32         timeout = ATADefaultTimeout,
        !           211:                                UInt           retries = ATADefaultRetries);
        !           212: 
        !           213:        //-----------------------------------------------------------------------
        !           214:        // Issue an asynchronous ATA command.
        !           215: 
        !           216:        virtual ATAReturnCode  asyncExecute(
        !           217:                              IOATACommand *       cmd,
        !           218:                              IOService *          target,
        !           219:                              gdCompletionFunction action,
        !           220:                              void *               param,
        !           221:                              UInt32               timeout = ATADefaultTimeout,                                                                             
        !           222:                              UInt                 retries = ATADefaultRetries);
        !           223: 
        !           224:        //-----------------------------------------------------------------------
        !           225:        // Add a command to the retry/sync queue.
        !           226: 
        !           227:        virtual bool           enqueueCommand(IOATACommand * cmd);
        !           228: 
        !           229:        //-----------------------------------------------------------------------
        !           230:        // Dequeues commands from the queue and executes them.
        !           231: 
        !           232:        virtual void           dequeueCommands(IOInterruptEventSource * source,
        !           233:                                            int                      count);
        !           234: 
        !           235:        //-----------------------------------------------------------------------
        !           236:        // Allocate an IOATACommand object.
        !           237: 
        !           238:        virtual IOATACommand * allocateCommand();
        !           239: 
        !           240:        //-----------------------------------------------------------------------
        !           241:        // Inspect the ATA device.
        !           242: 
        !           243:        virtual void           inspectDevice(IOService * provider);
        !           244: 
        !           245:        //-----------------------------------------------------------------------
        !           246:        // Returns an IOATAHDDriveNub instance.
        !           247: 
        !           248:        virtual IOService *    instantiateNub();
        !           249: 
        !           250:        //-----------------------------------------------------------------------
        !           251:        // Calls instantiateNub() then initialize, attach, and register the
        !           252:        // drive nub.
        !           253: 
        !           254:        virtual bool           createNub(IOService * provider);
        !           255: 
        !           256: public:
        !           257:        /*
        !           258:         * Overrides from IOService.
        !           259:         */
        !           260:     virtual bool           init(OSDictionary * properties);
        !           261:        virtual IOService *    probe(IOService * provider, SInt32 * score);
        !           262:     virtual bool           start(IOService * provider);
        !           263: 
        !           264:        //-----------------------------------------------------------------------
        !           265:        // Report the type of ATA device (ATA vs. ATAPI).
        !           266: 
        !           267:        virtual ATADeviceType  reportATADeviceType() const;
        !           268: 
        !           269:        //-----------------------------------------------------------------------
        !           270:        // Handles read/write requests.
        !           271: 
        !           272:        virtual IOReturn       doAsyncReadWrite(IOMemoryDescriptor * buffer,
        !           273:                                             UInt32               block,
        !           274:                                             UInt32               nblks,
        !           275:                                             gdCompletionFunction action,
        !           276:                                             IOService *          target,
        !           277:                                             void *               param);
        !           278: 
        !           279:        //-----------------------------------------------------------------------
        !           280:        // Eject the media in the drive.
        !           281: 
        !           282:        virtual IOReturn       doEjectMedia();
        !           283: 
        !           284:        //-----------------------------------------------------------------------
        !           285:        // Format the media in the drive.
        !           286: 
        !           287:        virtual IOReturn       doFormatMedia(UInt64 byteCapacity);
        !           288: 
        !           289:        //-----------------------------------------------------------------------
        !           290:        // Returns disk capacity in bytes.
        !           291: 
        !           292:        virtual UInt32         doGetFormatCapacities(UInt64 * capacities,
        !           293:                                       UInt32   capacitiesMaxCount) const;
        !           294: 
        !           295:        //-----------------------------------------------------------------------
        !           296:        // Lock the media and prevent a user-initiated eject.
        !           297:        
        !           298:        virtual IOReturn       doLockUnlockMedia(bool doLock);
        !           299: 
        !           300:        //-----------------------------------------------------------------------
        !           301:        // Flush the write-cache to the physical media.
        !           302: 
        !           303:        virtual IOReturn       doSynchronizeCache();
        !           304: 
        !           305:        //-----------------------------------------------------------------------
        !           306:        // Start/stop the drive.
        !           307: 
        !           308:        virtual IOReturn       doStart();
        !           309:        virtual IOReturn       doStop();
        !           310: 
        !           311:        //-----------------------------------------------------------------------
        !           312:        // Return device identification strings
        !           313: 
        !           314:        virtual char *         getAdditionalDeviceInfoString();
        !           315:        virtual char *         getProductString();
        !           316:        virtual char *         getRevisionString();
        !           317:        virtual char *         getVendorString();
        !           318: 
        !           319:        //-----------------------------------------------------------------------
        !           320:        // Report the device block size in bytes.
        !           321: 
        !           322:        virtual IOReturn       reportBlockSize(UInt64 * blockSize);
        !           323: 
        !           324:        //-----------------------------------------------------------------------
        !           325:        // Report whether the media in the ATA device is ejectable.
        !           326: 
        !           327:        virtual IOReturn       reportEjectability(bool * isEjectable);
        !           328: 
        !           329:        //-----------------------------------------------------------------------
        !           330:        // Report whether the media can be locked.
        !           331: 
        !           332:        virtual IOReturn       reportLockability(bool * isLockable);
        !           333: 
        !           334:        //-----------------------------------------------------------------------
        !           335:        // Report the polling requirements for a removable media.
        !           336: 
        !           337:        virtual IOReturn       reportPollRequirements(bool * pollRequired,
        !           338:                                                   bool * pollIsExpensive);
        !           339: 
        !           340:        //-----------------------------------------------------------------------
        !           341:        // Report the max number of bytes transferred for an ATA read command.
        !           342: 
        !           343:        virtual IOReturn       reportMaxReadTransfer(UInt64   blocksize,
        !           344:                                                  UInt64 * max);
        !           345: 
        !           346:        //-----------------------------------------------------------------------
        !           347:        // Report the max number of bytes transferred for an ATA write command.
        !           348: 
        !           349:        virtual IOReturn       reportMaxWriteTransfer(UInt64   blocksize,
        !           350:                                                   UInt64 * max);
        !           351: 
        !           352:        //-----------------------------------------------------------------------
        !           353:        // Returns the maximum addressable sector number.
        !           354: 
        !           355:        virtual IOReturn       reportMaxValidBlock(UInt64 * maxBlock);
        !           356: 
        !           357:        //-----------------------------------------------------------------------
        !           358:        // Report whether the media is currently present, and whether a media
        !           359:        // change has been registered since the last reporting.
        !           360: 
        !           361:        virtual IOReturn       reportMediaState(bool * mediaPresent, 
        !           362:                                             bool * changed);
        !           363:        
        !           364:        //-----------------------------------------------------------------------
        !           365:        // Report whether the media is removable.
        !           366:        
        !           367:        virtual IOReturn       reportRemovability(bool * isRemovable);
        !           368:        
        !           369:        //-----------------------------------------------------------------------
        !           370:        // Report if the media is write-protected.
        !           371: 
        !           372:        virtual IOReturn       reportWriteProtection(bool * isWriteProtected);
        !           373: 
        !           374:        //-----------------------------------------------------------------------
        !           375:        // Handles messages (notifications) from our provider.
        !           376: 
        !           377:        virtual IOReturn       message(UInt32 type, IOService * provider,
        !           378:                                    void * argument);
        !           379: 
        !           380:        //-----------------------------------------------------------------------
        !           381:        // Perform translation from ATAReturnCode to IOReturn codes.
        !           382: 
        !           383:        virtual IOReturn       getIOReturn(ATAResults * result);
        !           384:        virtual IOReturn       getIOReturn(ATAReturnCode code);
        !           385: 
        !           386:        //-----------------------------------------------------------------------
        !           387:        // Returns the device type.
        !           388: 
        !           389:     virtual const char *   getDeviceTypeName();
        !           390: };
        !           391: 
        !           392: #endif /* !_IOATAHDDRIVE_H */

unix.superglobalmegacorp.com

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