|
|
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: * IOATAController.h ! 25: * ! 26: * Methods in this header list the methods an ATA controller driver must implement. ! 27: */ ! 28: #include <IOKit/IOWorkLoop.h> ! 29: #include <IOKit/IOCommandQueue.h> ! 30: #include <IOKit/IOInterruptEventSource.h> ! 31: ! 32: ! 33: class IOATACommand; ! 34: ! 35: class IOATAController : public IOService ! 36: { ! 37: OSDeclareAbstractStructors(IOATAController) ! 38: ! 39: friend class IOATACommand; ! 40: friend class IOATADevice; ! 41: ! 42: /*------------------Methods the controller subclass must implement-----------------------*/ ! 43: protected: ! 44: /* ! 45: * Initialize controller hardware. ! 46: * ! 47: * Note: The controller driver's configure() method will be called prior to any other ! 48: * methods. If the controller driver returns successfully from this method it ! 49: * should be ready to accept any other method call listed. ! 50: */ ! 51: virtual bool configure( IOService *provider, UInt32 *controllerDataSize ) = 0; ! 52: ! 53: /* ! 54: * Setup device queues. ! 55: * ! 56: * Note: The controller driver should subclass and respond to provideQueueHandler(). ! 57: * The super class implementation returns NULL. ! 58: * ! 59: * If the controller driver implementation manages its own queues, it ! 60: * should subclass createWorkLoop() and return true with *workLoop = NULL. ! 61: */ ! 62: virtual IOCommandQueueAction provideQueueHandler( IOATADevice *ataDev ); ! 63: ! 64: virtual bool createWorkLoop( IOWorkLoop **workLoop ); ! 65: virtual IOCommandQueue *createDeviceQueue( IOATADevice *ataDev ); ! 66: ! 67: virtual void enableDeviceQueue( IOATADevice *ataDev = NULL ); ! 68: virtual void disableDeviceQueue( IOATADevice *ataDev = NULL ); ! 69: ! 70: /* ! 71: * Methods information about driver/hardware capabilities ! 72: */ ! 73: virtual bool provideProtocols( ATAProtocol *protocolsSupported ) = 0; ! 74: virtual bool provideTimings( UInt32 *numTimings, ATATiming *timingsSupported ) = 0; ! 75: ! 76: /* ! 77: * Methods to set timing for individual devices ! 78: */ ! 79: virtual bool calculateTiming( UInt32 deviceNum, ATATiming *timing ) = 0; ! 80: virtual bool selectTiming( UInt32 deviceNum, ATATimingProtocol timingProtocol ) = 0; ! 81: ! 82: /* ! 83: * Method to perform an ATA Bus Reset ! 84: */ ! 85: virtual bool resetBus(); ! 86: virtual void resetBusRequest(); ! 87: ! 88: /* ! 89: * Methods to execute and abort an ATACommand ! 90: */ ! 91: virtual bool executeCommand( IOATACommand *cmd ) = 0; ! 92: virtual bool abortCommand( IOATACommand *cmd ) = 0; ! 93: ! 94: /* ! 95: * ATAPI specific ! 96: */ ! 97: IOATACommand *makeRequestSense( IOATACommand *origCmd ); ! 98: bool completeRequestSense( IOATACommand *origCmd, IOATACommand *reqSenseCmd ); ! 99: ! 100: /* ! 101: * ! 102: */ ! 103: virtual void enableControllerInterrupts(); ! 104: virtual void disableControllerInterrupts(); ! 105: ! 106: ! 107: /*------------------Methods private to the IOATAController class----------------------*/ ! 108: public: ! 109: bool matchNubWithPropertyTable( IOService *nub, OSDictionary *table ); ! 110: virtual void free(); ! 111: ! 112: // Implement IOService::getWorkLoop() ! 113: virtual IOWorkLoop *getWorkLoop() const; ! 114: ! 115: private: ! 116: bool start( IOService *provider ); ! 117: ! 118: bool scanATABus(); ! 119: ! 120: bool probeController(); ! 121: bool createResetWorker(); ! 122: bool createDeviceNubs(); ! 123: bool probeDeviceNubs(); ! 124: bool registerDeviceNubs(); ! 125: ! 126: void purgeDeviceQueue( IOATADevice *device ); ! 127: void purgeCommand( void *p0, void *p1, void *p2, void *p3 ); ! 128: ! 129: void resetWorker( void *, void *, void *, void * ); ! 130: ! 131: void changeDeviceQueue( IOATADevice *ataDev, bool fEnable ); ! 132: ! 133: IOATACommand *allocCommand( UInt32 clientDataSize = 0 ); ! 134: void completeCommand( IOATACommand *cmd ); ! 135: void releaseCommand(); ! 136: ! 137: private: ! 138: UInt32 controllerDataSize; ! 139: ! 140: struct ! 141: { ! 142: IOATADevice *device; ! 143: IOService *client; ! 144: } deviceInfo[2]; ! 145: ! 146: IOWorkLoop *workLoop; ! 147: IOWorkLoop *resetWorkLoop; ! 148: IOCommandQueue *resetCommandQ; ! 149: ! 150: IOATACommand *utilCmd; ! 151: ! 152: }; ! 153:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.