|
|
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: * IOSCSIHDDrive.h ! 26: * ! 27: * This class implements SCSI hard disk functionality. ! 28: * ! 29: * Subclasses may modify the operations to handle device-specific variations. ! 30: */ ! 31: ! 32: #ifndef _IOSCSIHDDRIVE_H ! 33: #define _IOSCSIHDDRIVE_H ! 34: ! 35: #include <IOKit/IOTypes.h> ! 36: //xxx#include <IOKit/storage/IOStorage.h> ! 37: #include <IOKit/scsi/IOSCSIDeviceInterface.h> ! 38: #include <IOKit/storage/scsi/IOBasicSCSI.h> ! 39: ! 40: /* SCSI operation codes: */ ! 41: ! 42: const UInt8 SOP_FORMAT = 0x04; /* format unit */ ! 43: const UInt8 SOP_STARTSTOP = 0x1b; /* start/stop unit */ ! 44: const UInt8 SOP_PREVALLOW = 0x1e; /* prevent/allow removal */ ! 45: const UInt8 SOP_SYNCCACHE = 0x35; /* synchronize cache */ ! 46: ! 47: struct IOFormatcdb { ! 48: UInt8 opcode; /* 0x12 */ ! 49: UInt8 lunbits; /* lun and control bits */ ! 50: UInt8 vendor; ! 51: UInt8 interleave_msb; ! 52: UInt8 interleave_lsb; ! 53: UInt8 ctlbyte; ! 54: }; ! 55: ! 56: struct IOPrevAllowcdb { ! 57: UInt8 opcode; ! 58: UInt8 lunbits; ! 59: UInt8 reserved1; ! 60: UInt8 reserved2; ! 61: UInt8 prevent; ! 62: UInt8 ctlbyte; ! 63: }; ! 64: ! 65: struct IOStartStopcdb { ! 66: UInt8 opcode; ! 67: UInt8 lunImmed; ! 68: UInt8 reserved1; ! 69: UInt8 reserved2; ! 70: ! 71: /* Control bits: */ ! 72: /* Power Conditions */ ! 73: static const UInt8 P_NOCHANGE = 0x00; /* 0 - no change */ ! 74: static const UInt8 P_ACTIVE = 0x10; /* 1 - change to Active */ ! 75: static const UInt8 P_IDLE = 0x20; /* 2 - change to Idle */ ! 76: static const UInt8 P_STANDBY = 0x30; /* 3 - change to Standby */ ! 77: static const UInt8 P_RESERVED4 = 0x40; /* 4 - reserved */ ! 78: static const UInt8 P_SLEEP = 0x50; /* 5 - change to Sleep */ ! 79: static const UInt8 P_RESERVED6 = 0x60; /* 6 - reserved */ ! 80: static const UInt8 P_LUNCONTROL = 0x70; /* 7 - give pwr ctl to LUN */ ! 81: static const UInt8 P_RESERVED8 = 0x80; /* 8 - reserved */ ! 82: static const UInt8 P_RESERVED9 = 0x90; /* 9 - reserved */ ! 83: static const UInt8 P_TIDLEZERO = 0xa0; /* a - force Idle Cond Timer = 0 */ ! 84: static const UInt8 P_TSTDBYZERO = 0xb0; /* b - force Stby Cond Timer = 0 */ ! 85: ! 86: static const UInt8 C_LOEJ = 0x02; /* load on start/eject on stop */ ! 87: static const UInt8 C_SPINUP = 0x01; ! 88: static const UInt8 C_SPINDOWN = 0x00; ! 89: ! 90: UInt8 controls; ! 91: UInt8 ctlbyte; ! 92: }; ! 93: ! 94: struct IOSyncCachecdb { ! 95: UInt8 opcode; ! 96: UInt8 lunbits; ! 97: UInt8 lba_3; /* msb */ ! 98: UInt8 lba_2; ! 99: UInt8 lba_1; ! 100: UInt8 lba_0; /* lsb */ ! 101: UInt8 reserved; ! 102: UInt8 nblks_msb; ! 103: UInt8 nblks_lsb; ! 104: UInt8 ctlbyte; ! 105: }; ! 106: ! 107: /*! ! 108: * @enum Power States ! 109: * @discussion ! 110: * We define and understand three basic, generic power states. A subclass may change ! 111: * the power management logic, but all power-management routines should be examined ! 112: * if anything is changed. The only routines that deal directly with these values ! 113: * are directly related to power management. All other functions merely ask for and ! 114: * pass along power state values. ! 115: * @constant kAllOff ! 116: * The power state for an all-off condition. ! 117: * @constant kElectronicsOn ! 118: * The power state for the electronics on, but the media off. ! 119: * @constant kAllOn ! 120: * The power state for the electronics and media on. ! 121: * @constant kNumberOfPowerStates ! 122: * The maximum enum value. ! 123: */ ! 124: enum { /* electronics mechanical */ ! 125: kAllOff = 0, /* OFF OFF */ ! 126: kElectronicsOn = 1, /* ON OFF */ ! 127: kAllOn = 2, /* ON ON */ ! 128: ! 129: kNumberOfPowerStates = 3 ! 130: }; ! 131: ! 132: /*! ! 133: * @class ! 134: * IOSCSIHDDrive : public IOBasicSCSI ! 135: * @abstract ! 136: * SCSI Hard Disk driver. ! 137: * @discussion ! 138: * IOSCSIHDDrive derives from IOBasicSCSI and adds all functionality ! 139: * needed to support removable or fixed hard disk drives. ! 140: */ ! 141: ! 142: class IOSCSIHDDrive : public IOBasicSCSI { ! 143: ! 144: OSDeclareDefaultStructors(IOSCSIHDDrive) ! 145: ! 146: public: ! 147: ! 148: /* Overrides from IOService: */ ! 149: ! 150: virtual bool init(OSDictionary * properties); ! 151: ! 152: /*! ! 153: * @function start ! 154: * @abstract ! 155: * Start the driver. ! 156: * @discussion ! 157: * We override IOBasicSCSI::start so we can initialize Power Management, ! 158: * then we call createNub to create an IOSCSIHDDriveNub. ! 159: */ ! 160: virtual bool start(IOService * provider); ! 161: ! 162: /* Overrides from IOBasicSCSI: */ ! 163: ! 164: /*! ! 165: * @function deviceTypeMatches ! 166: * @abstract ! 167: * Determine if device type matches expected type. ! 168: * @discussion ! 169: * We implement this function so we can return a match ! 170: * on the hard disk device type. ! 171: */ ! 172: virtual bool deviceTypeMatches(UInt8 inqBuf[],UInt32 inqLen); ! 173: ! 174: /*! ! 175: * @function constructDeviceProperties ! 176: * @abstract ! 177: * Construct a set of properties about the device. ! 178: * @discussion ! 179: * This function creates a set of properties reflecting information ! 180: * about the device. ! 181: * ! 182: * This function is presently not used. ! 183: * @result ! 184: * A pointer to an OSDictionary containing the properties. The caller ! 185: * is responsible for releasing the OSDictionary. ! 186: */ ! 187: virtual OSDictionary *constructDeviceProperties(void); ! 188: ! 189: /*! ! 190: * @function RWCompletion ! 191: * @abstract ! 192: * Asynchronous read/write completion routine. ! 193: * @discussion ! 194: * We implement this function in this class. It is called from the base ! 195: * class when an IO operation completes. ! 196: */ ! 197: virtual void RWCompletion(struct context *cx); ! 198: ! 199: /* End of IOBasicSCSI overrides */ ! 200: ! 201: /* Additional API added to IOBasicSCSI: */ ! 202: ! 203: /*! ! 204: * @function doAsyncReadWrite ! 205: * @abstract ! 206: * Start an asynchronous read or write operation. ! 207: * @discussion ! 208: * See IOHDDriveNub for details. ! 209: */ ! 210: virtual IOReturn doAsyncReadWrite(IOMemoryDescriptor *buffer, ! 211: UInt32 block,UInt32 nblks, ! 212: gdCompletionFunction action, ! 213: IOService *target,void *param); ! 214: ! 215: /*! ! 216: * @function doSyncReadWrite ! 217: * @abstract ! 218: * Perform a synchronous read or write operation. ! 219: * @discussion ! 220: * See IOHDDriveNub for details. ! 221: */ ! 222: virtual IOReturn doSyncReadWrite(IOMemoryDescriptor *buffer,UInt32 block,UInt32 nblks); ! 223: ! 224: /*! ! 225: * @function doEjectMedia ! 226: * @abstract ! 227: * Eject the media. ! 228: * @discussion ! 229: * See IOHDDriveNub for details. ! 230: */ ! 231: virtual IOReturn doEjectMedia(void); ! 232: ! 233: /*! ! 234: * @function doFormatMedia ! 235: * @abstract ! 236: * Format the media to the specified byte capacity. ! 237: * @discussion ! 238: * The default implementation ignores the byteCapacity parameter. ! 239: * See IOHDDriveNub for details. ! 240: */ ! 241: virtual IOReturn doFormatMedia(UInt64 byteCapacity); ! 242: ! 243: /*! ! 244: * @function doGetFormatCapacities ! 245: * @abstract ! 246: * Return the allowable formatting byte capacities. ! 247: * @discussion ! 248: * The default implementation of this method returns a value of block ! 249: * size * max block, and a capacities count of 1. ! 250: * See IOHDDriveNub for details. ! 251: */ ! 252: virtual UInt32 doGetFormatCapacities(UInt64 * capacities, ! 253: UInt32 capacitiesMaxCount) const; ! 254: ! 255: /*! ! 256: * @function doLockUnlockMedia ! 257: * @abstract ! 258: * Lock or unlock the (removable) media in the drive. ! 259: * @discussion ! 260: * This method issues a standard SCSI Prevent/Allow command to lock ! 261: * or unlock the media in the drive. ! 262: * See IOHDDriveNub for details. ! 263: */ ! 264: virtual IOReturn doLockUnlockMedia(bool doLock); ! 265: ! 266: /*! ! 267: * @function doSynchronizeCache ! 268: * @abstract ! 269: * Force data blocks in the drive's buffer to be flushed to the media. ! 270: * @discussion ! 271: * This method issues a SCSI Synchronize Cache command, to ensure that ! 272: * all blocks in the device cache are written to the media. ! 273: * See IOHDDriveNub for details. ! 274: */ ! 275: virtual IOReturn doSynchronizeCache(void); ! 276: ! 277: /*! ! 278: * @function reportMediaState ! 279: * @abstract ! 280: * Report the device's media state. ! 281: * @discussion ! 282: * This method reports whether media is present or not, and also ! 283: * whether the media state has changed since the last call to ! 284: * reportMediaState. The default implementation issues a SCSI Test ! 285: * Unit Ready command: depending on the result of that command, the ! 286: * following cases are reported: ! 287: * ! 288: * 1. TUR status == good completion: we report media present and return ! 289: * kIOReturnSuccess. ! 290: * ! 291: * 2. TUR status != good completion, but good autosense returned: ! 292: * ! 293: * 2a: sense key says not ready: we report media not present ! 294: * and return kIOReturnSuccess. ! 295: * ! 296: * 2b: sense key is anything else: we report media not present ! 297: * and return kIOReturnIOError. ! 298: * ! 299: * 3. TUR status != good completion, and no autosense data: we do not ! 300: * set mediaPresent or changedState, and we return whatever result ! 301: * came back from the SCSI operation. ! 302: */ ! 303: virtual IOReturn reportMediaState(bool *mediaPresent,bool *changed); ! 304: ! 305: /* --- end of additional API --- */ ! 306: ! 307: protected: ! 308: ! 309: /*! ! 310: * @function createFormatCdb ! 311: * @abstract ! 312: * Create a SCSI CDB for a format operation. ! 313: * @discussion ! 314: * Override this to control the cdb created for a format operation. ! 315: * The default implementation creates a 6-byte format command with ! 316: * no data buffer, disconnect allowed, 8-byte autosense, and a 15-minute timeout. ! 317: * ! 318: * See also: allocateFormatBuffer, deleteFormatBuffer, composeFormatBuffer. ! 319: * @param byteCapacity ! 320: * The requested byte capacity to which the media should be formatted. This value ! 321: * should have been previously validated, otherwise the device may return an error. ! 322: * @param cdb ! 323: * A pointer to the CDB bytes. ! 324: * @param cdbLength ! 325: * The length of the CDB in bytes. ! 326: * @param block ! 327: * The device block to be written. ! 328: * @param nblks ! 329: * The number of blocks to be transferred. ! 330: * @param maxAutoSenseLength ! 331: * The maximum size of the autosense data, in bytes. A value of zero ! 332: * will disable autosense. ! 333: * @param timeoutSeconds ! 334: * The command timeout in seconds. ! 335: * @result ! 336: * The IOSCSICommandOptions returned will be used to issue the command. ! 337: */ ! 338: virtual UInt32 createFormatCdb( ! 339: UInt64 byteCapacity, /* in */ ! 340: UInt8 *cdb, /* in */ ! 341: UInt32 *cdbLength, /* out */ ! 342: UInt8 buf[], /* in */ ! 343: UInt32 bufLen, /* in */ ! 344: UInt32 *maxAutoSenseLength, /* out */ ! 345: UInt32 *timeoutSeconds); /* out */ ! 346: ! 347: ! 348: /*! ! 349: * @function allocateFormatBuffer ! 350: * @abstract ! 351: * Create a data buffer to be used for formatting the media. ! 352: * @discussion ! 353: * If a format buffer is to be used, then "allocateFormatBuffer" and ! 354: * deleteFormatBuffer" must be overridden to manage the buffer. The ! 355: * buffer must be prepared for IO upon return from allocateFormatBuffer. ! 356: * The default implementations of these methods don't allocate a buffer. ! 357: * @param buf ! 358: * A pointer for the returned buffer pointer. ! 359: * @param buflen ! 360: * The desired length of the buffer, in bytes. ! 361: */ ! 362: virtual IOReturn allocateFormatBuffer(UInt8 **buf,UInt32 *buflen); ! 363: ! 364: /*! ! 365: * @function deleteFormatBuffer ! 366: * @abstract ! 367: * Delete the data buffer to be used for formatting the media. ! 368: * @discussion ! 369: * If a format buffer is to be used, then "allocateFormatBuffer" and ! 370: * deleteFormatBuffer" must be overridden to manage the buffer. ! 371: * The default implementation of this method does nothing. ! 372: * @param buf ! 373: * A pointer to the buffer to delete. ! 374: * @param buflen ! 375: * The size of the buffer, in bytes. ! 376: */ ! 377: virtual void deleteFormatBuffer(UInt8 *buf,UInt32 buflen); ! 378: ! 379: /*! ! 380: * @function composeFormatBuffer ! 381: * @abstract ! 382: * Compose the data in the buffer used for the format command. ! 383: * @discussion ! 384: * This method will be called to compose the data in the format buffer. ! 385: * ! 386: * The default implementation of this method does nothing. ! 387: * @param buf ! 388: * A pointer to the format data buffer. ! 389: * @param buflen ! 390: * The size of the format data buffer, in bytes. ! 391: * @result ! 392: * The return value should be the desired values for the "CmpLst" and Defect ! 393: * List Format bits in the CDB. The default implementation returns zero. ! 394: */ ! 395: virtual UInt8 composeFormatBuffer(UInt8 *buf,UInt32 buflen); ! 396: ! 397: /* Override these methods to save and restore the state of the device electronics ! 398: * when power is turned off and on. The defaults do nothing and return kIOReturnSuccess. ! 399: */ ! 400: ! 401: /*! ! 402: * @function restoreElectronicsState ! 403: * @abstract ! 404: * Restore the state of the device electronics when powering-up. ! 405: * @discussion ! 406: * This method is called just after the device transitions from a powered-off state. ! 407: * ! 408: * The default implementation of this method does nothing and returns kIOReturnSuccess. ! 409: */ ! 410: virtual IOReturn restoreElectronicsState(void); ! 411: ! 412: /*! ! 413: * @function saveElectronicsState ! 414: * @abstract ! 415: * Save the state of the device electronics when powering-down. ! 416: * @discussion ! 417: * This method is called just before the device transitions to a powered-off state. ! 418: * ! 419: * The default implementation of this method does nothing and returns kIOReturnSuccess. ! 420: */ ! 421: virtual IOReturn saveElectronicsState(void); ! 422: ! 423: /*! ! 424: * @function initialPowerStateForDomainState ! 425: * @abstract ! 426: * Return the initial power state for the device. ! 427: * @discussion ! 428: * This method is called to obtain the initial power state for the device, ! 429: * by calling getInitialPowerState. ! 430: * @param domainState ! 431: * Power domain state flags. ! 432: * @result ! 433: * The return value must be a valid power state value. ! 434: */ ! 435: virtual unsigned long initialPowerStateForDomainState ( IOPMPowerFlags domainState ); ! 436: ! 437: /*! ! 438: * @function maxCapabilityForDomainState ! 439: * @abstract ! 440: * Return the maximum power level obtainable for the given state. ! 441: * @discussion ! 442: * This method is called to obtain the maximum power level obtainable for the ! 443: * given state. ! 444: * @param domainState ! 445: * Power domain state flags. ! 446: * @result ! 447: * The return value must be a valid power state value. ! 448: */ ! 449: virtual unsigned long maxCapabilityForDomainState ( IOPMPowerFlags domainState ); ! 450: ! 451: /*! ! 452: * @function powerStateForDomainState ! 453: * Return the maximum power level obtainable for the given state. ! 454: * @discussion ! 455: * This method is called to obtain the maximum power level obtainable for the ! 456: * given state. ! 457: * @param domainState ! 458: * Power domain state flags. ! 459: * @result ! 460: * The return value must be a valid power state value. ! 461: */ ! 462: virtual unsigned long powerStateForDomainState ( IOPMPowerFlags domainState ); ! 463: ! 464: /*! ! 465: * @function powerStateDidChangeTo ! 466: * @abstract ! 467: * React to a change in power state. ! 468: * @discussion ! 469: * This method is called when the power state changes. We call restoreElectronicsState ! 470: * if necessary, then call dequeueCommands if we have changed to a state that has power. ! 471: * @param stateOrdinal ! 472: * The power level to which we have changed. ! 473: */ ! 474: virtual IOReturn powerStateDidChangeTo ( unsigned long, unsigned long stateOrdinal, IOService* ); ! 475: ! 476: /*! ! 477: * @function powerStateWillChangeTo ! 478: * @abstract ! 479: * Prepare for a power state change. ! 480: * @discussion ! 481: * This method is called when the power state will change. If we are powering-up from kAllOff, ! 482: * we schedule a call to restoreElectronicsState. If, instead, we are powering-down from an "on" state, ! 483: * we schedule a call to saveElectronicsState. ! 484: * @param stateOrdinal ! 485: * The power level to which we will change. ! 486: */ ! 487: virtual IOReturn powerStateWillChangeTo ( unsigned long, unsigned long stateOrdinal, IOService* ); ! 488: ! 489: /*! ! 490: * @function setPowerState ! 491: * @abstract ! 492: * Set the power state to the specified state. ! 493: * @discussion ! 494: * This method is called to cause a change in power state. We handle changes to and from ! 495: * kAllOn and kElectronicsOn, which are done by spinning up and down the media. ! 496: * @param powerStateOrdinal ! 497: * The power level to which we must change. ! 498: */ ! 499: virtual IOReturn setPowerState ( unsigned long powerStateOrdinal, IOService* ); ! 500: ! 501: /*! ! 502: * @function powerTickle ! 503: * Check for the device power state currently being in the desired state. ! 504: * @discussion ! 505: * This method simply "tickles" ! 506: * the Power Management subsystem to ensure that the device transitions to the desired ! 507: * state if necessary. ! 508: */ ! 509: virtual bool powerTickle(UInt32 desiredState); ! 510: ! 511: /* Override this method to report the initial device power state when its domain is ! 512: * powered up. The default implementation assumes the drive spins up. ! 513: */ ! 514: ! 515: /*! ! 516: * @function getInitialPowerState ! 517: * @abstract ! 518: * Report the initial power state of the device. ! 519: * @discussion ! 520: * The default implementation of this method returns kAllOn, assuming that the ! 521: * drive spindle spins up initially. ! 522: * @result ! 523: * The return value must be a valid power state value. ! 524: */ ! 525: virtual unsigned long getInitialPowerState(void); /* default = kAllOn */ ! 526: ! 527: /* Override these to change power level required to do various commands. */ ! 528: ! 529: /*! ! 530: * @function getEjectPowerState ! 531: * @abstract ! 532: * Return the required device power level to determine eject the media. ! 533: * @discussion ! 534: * The default implementation of this method returns kElectronicsOn. ! 535: * @result ! 536: * The return value must be a valid power state value. ! 537: */ ! 538: virtual UInt32 getEjectPowerState(void); /* default = kElectronicsOn */ ! 539: ! 540: /*! ! 541: * @function getExecuteCDBPowerState ! 542: * @abstract ! 543: * @discussion ! 544: * @param ! 545: * @result ! 546: * The return value must be a valid power state value. ! 547: */ ! 548: virtual UInt32 getExecuteCDBPowerState(void); /* default = kAllOn */ ! 549: ! 550: /*! ! 551: * @function getFormatMediaPowerState ! 552: * @abstract ! 553: * Return the required device power level to execute a client CDB. ! 554: * @discussion ! 555: * The default implementation of this method returns kAllOn. ! 556: * @result ! 557: * The return value must be a valid power state value. ! 558: */ ! 559: virtual UInt32 getFormatMediaPowerState(void); /* default = kAllOn */ ! 560: ! 561: /*! ! 562: * @function getInquiryPowerState ! 563: * @abstract ! 564: * Return the required device power level to execute an Inquiry command. ! 565: * @discussion ! 566: * The default implementation of this method returns kElectronicsOn. ! 567: * @result ! 568: * The return value must be a valid power state value. ! 569: */ ! 570: virtual UInt32 getInquiryPowerState(void); /* default = kElectronicsOn */ ! 571: ! 572: /*! ! 573: * @function getLockUnlockMediaPowerState ! 574: * @abstract ! 575: * Return the required device power level to lock or unlock the media. ! 576: * @discussion ! 577: * The default implementation of this method returns kElectronicsOn. ! 578: * @result ! 579: * The return value must be a valid power state value. ! 580: */ ! 581: virtual UInt32 getLockUnlockMediaPowerState(void); /* default = kElectronicsOn */ ! 582: ! 583: /*! ! 584: * @function getReadCapacityPowerState ! 585: * @abstract ! 586: * Return the required device power level to execute a Read-Capacity command. ! 587: * @discussion ! 588: * The default implementation of this method returns kElectronicsOn. ! 589: * @result ! 590: * The return value must be a valid power state value. ! 591: */ ! 592: virtual UInt32 getReadCapacityPowerState(void); /* default = kElectronicsOn */ ! 593: ! 594: /*! ! 595: * @function getReadWritePowerState ! 596: * @abstract ! 597: * Return the required device power level to execute a Read or Write command. ! 598: * @discussion ! 599: * The default implementation of this method returns kAllOn. ! 600: * @result ! 601: * The return value must be a valid power state value. ! 602: */ ! 603: virtual UInt32 getReadWritePowerState(void); /* default = kAllOn */ ! 604: ! 605: /*! ! 606: * @function getReportWriteProtectionPowerState ! 607: * @abstract ! 608: * Return the required device power level to report media write protection. ! 609: * @discussion ! 610: * The default implementation of this method returns kElectronicsOn. ! 611: * @result ! 612: * The return value must be a valid power state value. ! 613: */ ! 614: virtual UInt32 getReportWriteProtectionPowerState(void); /* default = kElectronicsOn */ ! 615: ! 616: /*! ! 617: * @function getStartPowerState ! 618: * @abstract ! 619: * Return the required device power level to start (spin up) the media. ! 620: * @discussion ! 621: * The default implementation of this method returns kElectronicsOn. ! 622: * @result ! 623: * The return value must be a valid power state value. ! 624: */ ! 625: virtual UInt32 getStartPowerState(void); /* default = kElectronicsOn */ ! 626: ! 627: /*! ! 628: * @function getStopPowerState ! 629: * @abstract ! 630: * Return the required device power level to stop (spin down) the media. ! 631: * @discussion ! 632: * The default implementation of this method returns kAllOn. ! 633: * @result ! 634: * The return value must be a valid power state value. ! 635: */ ! 636: virtual UInt32 getStopPowerState(void); /* default = kAllOn */ ! 637: ! 638: /*! ! 639: * @function getSynchronizeCachePowerState ! 640: * @abstract ! 641: * Return the required device power level to issue a Synchronize-Cache command. ! 642: * @discussion ! 643: * The default implementation of this method returns kAllOn. ! 644: * @result ! 645: * The return value must be a valid power state value. ! 646: */ ! 647: virtual UInt32 getSynchronizeCachePowerState(void); /* default = kAllOn */ ! 648: ! 649: /*! ! 650: * @function getTestUnitReadyPowerState ! 651: * @abstract ! 652: * Return the required device power level to issue a Test Unit Ready command. ! 653: * @discussion ! 654: * The default implementation of this method returns kElectronicsOn. ! 655: * @result ! 656: * The return value must be a valid power state value. ! 657: */ ! 658: virtual UInt32 getTestUnitReadyPowerState(void); /* default = kElectronicsOn */ ! 659: ! 660: /* ! 661: * @group ! 662: * Internally used methods. ! 663: */ ! 664: ! 665: /*! ! 666: * @function createNub ! 667: * @abstract ! 668: * Create, init, attach, and register the device nub. ! 669: * @discussion ! 670: * This method calls instantiateNub, then init, attach, and register. ! 671: * @result ! 672: * A pointer to the nub or NULL if something failed. ! 673: */ ! 674: virtual IOService * createNub(void); ! 675: ! 676: /*! ! 677: * @function getDeviceTypeName ! 678: * @abstract ! 679: * Return a character string for the device type. ! 680: * @discussion ! 681: * The default implementation of this method returns kDeviceTypeHardDisk. ! 682: */ ! 683: virtual const char * getDeviceTypeName(void); ! 684: ! 685: /*! ! 686: * @function instantiateNub ! 687: * @abstract ! 688: * Create the device nub. ! 689: * @discussion ! 690: * A subclass will override this method to change the type of nub created. ! 691: * A CD driver, for example, will instantiate an IOSCSICDDriveNub instead ! 692: * of the default implementation's IOSCSIHDDriveNub. ! 693: */ ! 694: virtual IOService * instantiateNub(void); ! 695: ! 696: /*! ! 697: * @function doStart ! 698: * @abstract ! 699: * Start (spin up) the media. ! 700: * @discussion ! 701: * This method calls doStartStop. ! 702: */ ! 703: virtual IOReturn doStart(void); ! 704: ! 705: /*! ! 706: * @function doStartStop ! 707: * @abstract ! 708: * Perform the actual spin up/down command. ! 709: * @discussion ! 710: * This method issues a SCSI Start Stop Unit command to start or stop ! 711: * the device. Because the powerCondition value is only for use with ! 712: * SCSI-3 devices, the current implementation ignores powerCondition. ! 713: * @param start ! 714: * True to start (spin-up) the media; False to stop (spin-down) the media. ! 715: * @param loadEject ! 716: * True to eject; False to not eject. This parameter is applicable only to a stop ! 717: * operation. ! 718: * @param powerCondition ! 719: * The power condition to which the drive should transition. This is a SCSI-3 ! 720: * capability; it is presently unused. ! 721: */ ! 722: virtual IOReturn doStartStop(bool start,bool loadEject,UInt8 powerCondition); ! 723: ! 724: /*! ! 725: * @function doStop ! 726: * @abstract ! 727: * Stop (spin down) the media. ! 728: * @discussion ! 729: * This method calls doStartStop. ! 730: */ ! 731: virtual IOReturn doStop(void); ! 732: ! 733: /* ! 734: * @endgroup ! 735: */ ! 736: ! 737: /* Device information : */ ! 738: ! 739: /*! ! 740: * @var _mediaPresent ! 741: * True if media is present; False if media is not present. ! 742: */ ! 743: bool _mediaPresent; ! 744: ! 745: /*! ! 746: * @var _startStopDisabled ! 747: * True if the start/stop commands are disabled due to an error. ! 748: */ ! 749: bool _startStopDisabled; ! 750: ! 751: /*! ! 752: * @var _restoreState ! 753: * True if we must restore the device electronics state after a power-up. ! 754: */ ! 755: bool _restoreState; /* true if we must restore after power-up */ }; ! 756: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.