#ifndef IDE_INTERNAL_H #define IDE_INTERNAL_H #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_UNISTD_H # include #endif struct ide_device; typedef void EndTransferFunc(struct ide_device *); struct ide_device { int bus_status; int bus_unit; int is_cdrom, is_cf; FILE *file; off_t filesize; int blocksize; int cylinders, heads, sectors; int drive_serial; char drive_serial_str[21]; /* ide regs */ uint8_t feature; uint8_t error; uint32_t nsector; uint8_t sector; uint8_t lcyl; uint8_t hcyl; /* other part of tf for lba48 support */ uint8_t hob_feature; uint8_t hob_nsector; uint8_t hob_sector; uint8_t hob_lcyl; uint8_t hob_hcyl; uint8_t select; uint8_t status; /* set for lba48 access */ uint8_t lba48; int64_t nb_sectors; int mult_sectors; int req_nb_sectors; EndTransferFunc *end_transfer_func; uint8_t *data_ptr, *data_end, *io_buffer; int io_buffer_size; /* CF-ATA extended error */ uint8_t ext_error; /* CF-ATA metadata storage */ uint32_t mdata_size; uint8_t *mdata_storage; int media_changed; /* 8-bit mode (ATA-1 devices and CF devices) */ int cycle; int do_8bit; uint16_t data; uint16_t upperhalf[8]; }; /* Bits of HD_STATUS */ #define ERR_STAT 0x01 #define INDEX_STAT 0x02 #define ECC_STAT 0x04 /* Corrected error */ #define DRQ_STAT 0x08 #define SEEK_STAT 0x10 #define SRV_STAT 0x10 #define WRERR_STAT 0x20 #define READY_STAT 0x40 #define BUSY_STAT 0x80 /* Bits for HD_ERROR */ #define MARK_ERR 0x01 /* Bad address mark */ #define TRK0_ERR 0x02 /* couldn't find track 0 */ #define ABRT_ERR 0x04 /* Command aborted */ #define MCR_ERR 0x08 /* media change request */ #define ID_ERR 0x10 /* ID field not found */ #define MC_ERR 0x20 /* media changed */ #define ECC_ERR 0x40 /* Uncorrectable ECC error */ #define BBD_ERR 0x80 /* pre-EIDE meaning: block marked bad */ #define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */ /* Bits of HD_NSECTOR */ #define CD 0x01 #define IO 0x02 #define REL 0x04 #define TAG_MASK 0xf8 #define IDE_CMD_RESET 0x04 #define IDE_CMD_DISABLE_IRQ 0x02 /* ATA/ATAPI COMMANDS: (M) Mandatory (O) Optional */ #define WIN_NOP 0x00 /* (O) ATA1 nop */ #if 0 #define 0x01 /* Reserved */ #define 0x02 /* Reserved */ #endif #define CFA_REQ_EXT_ERROR_CODE 0x03 /* (O) ATA4 cfa request ext. error code */ #if 0 #define 0x04 /* Reserved */ #define 0x05 /* Reserved */ #define 0x06 /* Reserved */ #define 0x07 /* Reserved */ #endif #define WIN_SRST 0x08 #define WIN_DEVICE_RESET 0x08 /* (M) ATA4 device reset */ #if 0 #define 0x09 /* Reserved */ #define 0x0a /* Reserved */ #define 0x0b /* Reserved */ #define 0x0c /* Reserved */ #define 0x0d /* Reserved */ #define 0x0e /* Reserved */ #define 0x0f /* Reserved */ #endif #define WIN_RECAL 0x10 /* (M) ATA1 recalibrate */ #if 0 #define 0x11 /* Reserved */ #define 0x12 /* Reserved */ #define 0x13 /* Reserved */ #define 0x14 /* Reserved */ #define 0x15 /* Reserved */ #define 0x16 /* Reserved */ #define 0x17 /* Reserved */ #define 0x18 /* Reserved */ #define 0x19 /* Reserved */ #define 0x1a /* Reserved */ #define 0x1b /* Reserved */ #define 0x1c /* Reserved */ #define 0x1d /* Reserved */ #define 0x1e /* Reserved */ #define 0x1f /* Reserved */ #endif #define WIN_READ 0x20 /* (M) ATA1 read sector(s) w/ retry */ #define WIN_READ_ONCE 0x21 /* (M) ATA1 read sector(s) w/o retry */ #define WIN_READ_LONG 0x22 /* (M) ATA1 read long w/ retry */ #define WIN_READ_LONG_ONCE 0x23 /* (M) ATA1 read long w/o retry */ #define WIN_READ_EXT 0x24 /* (O) ATA6, LBA48 */ #define WIN_READDMA_EXT 0x25 /* (O) ATA6, LBA48 */ #define WIN_READDMA_QUEUED_EXT 0x26 /* (O) ATA6, LBA48 */ #define WIN_READ_NATIVE_MAX_EXT 0x27 /* (O) ATA6, LBA48 */ #if 0 #define 0x28 /* Reserved */ #endif #define WIN_MULTREAD_EXT 0x29 /* (O) ATA6, LBA48 */ #if 0 #define 0x2a /* Reserved */ #define 0x2b /* Reserved */ #define 0x2c /* Reserved */ #define 0x2d /* Reserved */ #define 0x2e /* Reserved */ #endif #define WIN_READ_LOG_EXT 0x2f /* (O) ATA6 read log ext */ #define WIN_WRITE 0x30 /* (M) ATA1 write sector(s) w/ retry */ #define WIN_WRITE_ONCE 0x31 /* (M) ATA1 write sector(s) w/o retry */ #define WIN_WRITE_LONG 0x32 /* (M) ATA1 write long w/ retry */ #define WIN_WRITE_LONG_ONCE 0x33 /* (M) ATA1 write long w/o retry */ #define WIN_WRITE_EXT 0x34 /* (O) ATA6, LBA48 */ #define WIN_WRITEDMA_EXT 0x35 /* (O) ATA6, LBA48 */ #define WIN_WRITEDMA_QUEUED_EXT 0x36 /* (O) ATA6, LBA48 */ #define WIN_SET_MAX_EXT 0x37 /* (O) ATA6, LBA48 */ #define CFA_WRITE_SECT_WO_ERASE 0x38 /* (O) ATA4 cfa write sectors w/o erase */ #define WIN_MULTWRITE_EXT 0x39 /* (O) ATA6, LBA48 */ #if 0 #define 0x3a /* Reserved */ #define 0x3b /* Reserved */ #endif #define WIN_WRITE_VERIFY 0x3c /* (O) ATA1 write verify, obsolete ATA4 */ #if 0 #define 0x3d /* Reserved */ #define 0x3e /* Reserved */ #define 0x3f /* Reserved */ #endif #define WIN_VERIFY 0x40 /* (M) ATA1 verify sector(s) w/ retry */ #define WIN_VERIFY_ONCE 0x41 /* (M) ATA1 verify sector(s) w/o retry */ #define WIN_VERIFY_EXT 0x42 /* (O) ATA6, LBA48 */ #if 0 #define 0x43 /* Reserved */ #define 0x44 /* Reserved */ #define 0x45 /* Reserved */ #define 0x46 /* Reserved */ #define 0x47 /* Reserved */ #define 0x48 /* Reserved */ #define 0x49 /* Reserved */ #define 0x4a /* Reserved */ #define 0x4b /* Reserved */ #define 0x4c /* Reserved */ #define 0x4d /* Reserved */ #define 0x4e /* Reserved */ #define 0x4f /* Reserved */ #endif #define WIN_FORMAT 0x50 /* (M) ATA1 format track */ #if 0 #define 0x51 /* Reserved */ #define 0x52 /* Reserved */ #define 0x53 /* Reserved */ #define 0x54 /* Reserved */ #define 0x55 /* Reserved */ #define 0x56 /* Reserved */ #define 0x57 /* Reserved */ #define 0x58 /* Reserved */ #define 0x59 /* Reserved */ #define 0x5a /* Reserved */ #define 0x5b /* Reserved */ #define 0x5c /* Reserved */ #define 0x5d /* Reserved */ #define 0x5e /* Reserved */ #define 0x5f /* Reserved */ #endif #define WIN_INIT 0x60 /* xxxx */ #if 0 #define 0x61 /* Reserved */ #define 0x62 /* Reserved */ #define 0x63 /* Reserved */ #define 0x64 /* Reserved */ #define 0x65 /* Reserved */ #define 0x66 /* Reserved */ #define 0x67 /* Reserved */ #define 0x68 /* Reserved */ #define 0x69 /* Reserved */ #define 0x6a /* Reserved */ #define 0x6b /* Reserved */ #define 0x6c /* Reserved */ #define 0x6d /* Reserved */ #define 0x6e /* Reserved */ #define 0x6f /* Reserved */ #endif #define WIN_SEEK 0x70 /* (M) ATA1 seek */ #if 0 #define 0x71 /* Reserved */ #define 0x72 /* Reserved */ #define 0x73 /* Reserved */ #define 0x74 /* Reserved */ #define 0x75 /* Reserved */ #define 0x76 /* Reserved */ #define 0x77 /* Reserved */ #define 0x78 /* Reserved */ #define 0x79 /* Reserved */ #define 0x7a /* Reserved */ #define 0x7b /* Reserved */ #define 0x7c /* Reserved */ #define 0x7d /* Reserved */ #define 0x7e /* Reserved */ #define 0x7f /* Reserved */ #define 0x80 /* Reserved (Vendor) */ #define 0x81 /* Reserved (Vendor) */ #define 0x82 /* Reserved (Vendor) */ #define 0x83 /* Reserved (Vendor) */ #define 0x84 /* Reserved (Vendor) */ #define 0x85 /* Reserved (Vendor) */ #define 0x86 /* Reserved (Vendor) */ #endif #define CFA_TRANSLATE_SECTOR 0x87 /* (O) ATA4 cfa translate sector */ #if 0 #define 0x88 /* Reserved (Vendor) */ #define 0x89 /* Reserved (Vendor) */ #define 0x8a /* Reserved (Vendor) */ #define 0x8b /* Reserved (Vendor) */ #define 0x8c /* Reserved (Vendor) */ #define 0x8d /* Reserved (Vendor) */ #define 0x8e /* Reserved (Vendor) */ #define 0x8f /* Reserved (Vendor) */ #endif #define WIN_DIAGNOSE 0x90 /* (M) ATA1 execute drive diagnostic */ #define WIN_SPECIFY 0x91 /* (M) ATA1 initialize drive parameters */ #define WIN_DOWNLOAD_MICROCODE 0x92 /* (O) ATA2 download microcode */ #if 0 #define 0x93 /* Reserved */ #endif #define WIN_STANDBYNOW2 0x94 /* (O) ATA1 standby immediate */ #define CFA_IDLEIMMEDIATE 0x95 /* (O) ATA1 idle immediate */ #define WIN_STANDBY2 0x96 /* (O) ATA1 standby */ #define WIN_SETIDLE2 0x97 /* (O) ATA1 idle */ #define WIN_CHECKPOWERMODE2 0x98 /* (O) ATA1 check power mode */ #define WIN_SLEEPNOW2 0x99 /* (O) ATA1 sleep */ #if 0 #define 0x9a /* Reserved (Vendor) */ #define 0x9b /* Reserved */ #define 0x9c /* Reserved */ #define 0x9d /* Reserved */ #define 0x9e /* Reserved */ #define 0x9f /* Reserved */ #endif #define WIN_PACKETCMD 0xa0 /* (O) ATA4 packet command */ #define WIN_PIDENTIFY 0xa1 /* (O) ATA4 identify packet device */ #define WIN_QUEUED_SERVICE 0xa2 /* (O) ATA4 service */ #if 0 #define 0xa3 /* Reserved */ #define 0xa4 /* Reserved */ #define 0xa5 /* Reserved */ #define 0xa6 /* Reserved */ #define 0xa7 /* Reserved */ #define 0xa8 /* Reserved */ #define 0xa9 /* Reserved */ #define 0xaa /* Reserved */ #define 0xab /* Reserved */ #define 0xac /* Reserved */ #define 0xad /* Reserved */ #define 0xae /* Reserved */ #define 0xaf /* Reserved */ #endif #define WIN_SMART 0xB0 /* (O) ATA3 smart */ #if 0 #define 0xb1 /* Reserved */ #define 0xb2 /* Reserved */ #define 0xb3 /* Reserved */ #define 0xb4 /* Reserved */ #define 0xb5 /* Reserved */ #define 0xb6 /* Reserved */ #define 0xb7 /* Reserved */ #endif #define CFA_ACCESS_METADATA_STORAGE 0xb8 #if 0 #define 0xb9 /* Reserved (CFA) */ #define 0xba /* Reserved (CFA) */ #define 0xbb /* Reserved (CFA) */ #define 0xbc /* Reserved (CFA) */ #define 0xbd /* Reserved (CFA) */ #define 0xbe /* Reserved (CFA) */ #define 0xbf /* Reserved (CFA) */ #endif #define CFA_ERASE_SECTORS 0xc0 /* (O) ATA4 erase sectors */ #if 0 #define 0xc1 /* Reserved (Vendor) */ #define 0xc2 /* Reserved (Vendor) */ #define 0xc3 /* Reserved (Vendor) */ #endif #define WIN_MULTREAD 0xc4 /* (M) ATA3 (O) ATA1 read multiple */ #define WIN_MULTWRITE 0xc5 /* (M) ATA3 (O) ATA1 write multiple */ #define WIN_SETMULT 0xc6 /* (M) ATA3 (O) ATA1 set multiple mode */ #define WIN_READDMA_QUEUED 0xc7 /* (O) ATA4 read DMA queued */ #define WIN_READDMA 0xc8 /* (M) ATA3 (O) ATA1 read DMA w/ retry */ #define WIN_READDMA_ONCE 0xc9 /* (M) ATA3 (O) ATA1 read DMA w/o retry */ #define WIN_WRITEDMA 0xca /* (M) ATA3 (O) ATA1 write DMA w/ retry */ #define WIN_WRITEDMA_ONCE 0xcb /* (M) ATA3 (O) ATA1 write DMA w/o retry */ #define WIN_WRITEDMA_QUEUED 0xcc /* (O) ATA4 write DMA queued */ #define CFA_WRITE_MULTI_WO_ERASE 0xcd /* (O) ATA4 cfa write multiple w/o erase */ #if 0 #define 0xce /* Reserved */ #define 0xcf /* Reserved */ #define 0xd0 /* Reserved */ #define 0xd1 /* Reserved */ #define 0xd2 /* Reserved */ #define 0xd3 /* Reserved */ #define 0xd4 /* Reserved */ #define 0xd5 /* Reserved */ #define 0xd6 /* Reserved */ #define 0xd7 /* Reserved */ #define 0xd8 /* Reserved */ #define 0xd9 /* Reserved */ #endif #define WIN_GETMEDIASTATUS 0xda /* (O) ATA4 get media status */ #define WIN_ACKMEDIACHANGE 0xdb /* (O) ATA1 ack media chg, removed ATA3 */ #define WIN_POSTBOOT 0xdc /* (O) ATA1 post-boot, removed ATA3 */ #define WIN_PREBOOT 0xdd /* (O) ATA1 pre-boot, removed ATA3 */ #define WIN_DOORLOCK 0xde /* (O) ATA1 door lock */ #define WIN_DOORUNLOCK 0xdf /* (O) ATA1 door unlock */ #define WIN_STANDBYNOW1 0xe0 /* (O) ATA1 standby immediate */ #define WIN_IDLEIMMEDIATE 0xe1 /* (O) ATA1 idle immediate */ #define WIN_STANDBY 0xe2 /* (O) ATA1 standby */ #define WIN_SETIDLE1 0xe3 /* (O) ATA1 idle */ #define WIN_READ_BUFFER 0xe4 /* (O) ATA1 read buffer */ #define WIN_CHECKPOWERMODE1 0xe5 /* (O) ATA1 check power mode */ #define WIN_SLEEPNOW1 0xe6 /* (O) ATA1 sleep */ #define WIN_FLUSH_CACHE 0xe7 /* (M) ATA5, (O) ATA4 flush cache */ #define WIN_WRITE_BUFFER 0xe8 /* (O) ATA1 write buffer */ #define WIN_WRITE_SAME 0xe9 /* (O) ATA1 write same, removed ATA3 */ #define WIN_FLUSH_CACHE_EXT 0xea /* (O) ATA6, LBA48 */ #if 0 #define 0xeb /* Reserved */ #endif #define WIN_IDENTIFY 0xec /* (M) ATA2 ((O) ATA1) identify drive */ #define WIN_MEDIAEJECT 0xed /* (O) ATA2 media eject */ #define WIN_IDENTIFY_DMA 0xee /* (O) ATA3 identify device DMA */ #define WIN_SETFEATURES 0xef /* (M) ATA4, (O) ATA1 set features */ #define EXABYTE_ENABLE_NEST 0xf0 /* */ #define IBM_SENSE_CONDITION 0xf0 /* measure disk temperature */ #define WIN_SECURITY_SET_PASS 0xf1 /* (O) ATA3 security set password */ #define WIN_SECURITY_UNLOCK 0xf2 /* (O) ATA3 security unlock */ #define WIN_SECURITY_ERASE_PREPARE 0xf3 /* (O) ATA3 security erase prepare */ #define WIN_SECURITY_ERASE_UNIT 0xf4 /* (O) ATA3 security erase unit */ #define WIN_SECURITY_FREEZE_LOCK 0xf5 /* (O) ATA3 security freeze lock */ #define CFA_WEAR_LEVEL 0xf5 #define WIN_SECURITY_DISABLE 0xf6 /* (O) ATA3 security disable password */ #if 0 #define 0xf7 /* Reserved (Vendor) */ #endif #define WIN_READ_NATIVE_MAX 0xf8 /* (O) ATA4 read native max address */ #define WIN_SET_MAX 0xf9 /* (O) ATA4 set max address */ #if 0 #define 0xfa /* Reserved (Vendor) */ #endif #define DISABLE_SEAGATE 0xfb #if 0 #define 0xfc /* Reserved (Vendor) */ #define 0xfd /* Reserved (Vendor) */ #define 0xfe /* Reserved (Vendor) */ #define 0xff /* Reserved (Vendor) */ #endif #define MAX_MULT_SECTORS 16 #define ASC_ILLEGAL_OPCODE 0x20 #define ASC_LOGICAL_BLOCK_OOR 0x21 #define ASC_INV_FIELD_IN_CMD_PACKET 0x24 #define ASC_MEDIUM_MAY_HAVE_CHANGED 0x28 #define ASC_INCOMPATIBLE_FORMAT 0x30 #define ASC_MEDIUM_NOT_PRESENT 0x3a #define ASC_SAVING_PARAMETERS_NOT_SUPPORTED 0x39 #define ASC_MEDIA_REMOVAL_PREVENTED 0x53 #define CFA_NO_ERROR 0x00 #define CFA_MISC_ERROR 0x09 #define CFA_INVALID_COMMAND 0x20 #define CFA_INVALID_ADDRESS 0x21 #define CFA_ADDRESS_OVERFLOW 0x2f #define SENSE_NONE 0 #define SENSE_NOT_READY 2 #define SENSE_ILLEGAL_REQUEST 5 #define SENSE_UNIT_ATTENTION 6 /* Self Monitoring And Reporting Technology */ #define SMART_READ_DATA 0xd0 /* ATA3 read attribute values */ #define SMART_READ_THRESH 0xd1 /* ATA3 read attr. threshold, ATA4 obsolete */ #define SMART_ATTR_AUTOSAVE 0xd2 /* ATA3 attribute autosave */ #define SMART_SAVE_ATTR 0xd3 /* ATA3 save attribute values */ #define SMART_EXECUTE_OFFLINE 0xd4 /* ATA4 execute offline immediate */ #define SMART_READ_LOG 0xd5 /* ATA5 */ #define SMART_WRITE_LOG 0xd6 /* ATA5 */ /*#define unknown 0xd7 // ATA4 obsolete */ #define SMART_ENABLE 0xd8 /* ATA3 enable operations */ #define SMART_DISABLE 0xd9 /* ATA3 disable operations */ #define SMART_STATUS 0xda /* ATA3 return status */ /*#define unknown 0xdb // ATA4 obsolete */ /* Execute Device Diagnostic ATA1 (device 0) (device 1 OR 0x80) */ #define DDIAG_NO_ERROR 0x01 #define DDIAG_FORMAT_ERROR 0x02 #define DDIAG_BUFFER_ERROR 0x03 #define DDIAG_ECC_ERROR 0x04 #define DDIAG_MPU_ERROR 0x05 /* After ATA1, any value other than 0x01 or 0x81 should be considered Vendor */ /* Identify Drive Information ATA1 */ /* General Configuration Bit-significant Information: */ #define GCBI_ATAPI_DEVICE 0x8000 /* ATA3 */ #define GCBI_FORMAT_SPEED_TOLERANCE_GAP_REQ 0x4000 /* ATA1, obsolete ATA2 */ #define GCBI_TRACK_OFFSET_OPTION_AVAILABLE 0x2000 /* ATA1, obsolete ATA2 */ #define GCBI_DATA_STROBE_OFFSET_AVAILABLE 0x1000 /* ATA1, obsolete ATA2 */ #define GCBI_ROTATIONAL_SPEED_TOL_OVER_HALF 0x0800 /* ATA1, obsolete ATA2 */ #define GCBI_DISK_TRANSFER_RATE_OVER_10MBS 0x0400 /* ATA1, obsolete ATA2 */ #define GCBI_DISK_TRANSFER_RATE_OVER_5MBS 0x0200 /* ATA1, obsolete ATA2 */ #define GCBI_DISK_TRANSFER_RATE_UNDER_5MBS 0x0100 /* ATA1, obsolete ATA2 */ #define GCBI_REMOVABLE_CARTRIDGE_DRIVE 0x0080 /* ATA1 */ #define GCBI_FIXED_DRIVE 0x0040 /* ATA1 */ #define GCBI_SPINDLE_MOTOR_CONTROL 0x0020 /* ATA1, obsolete ATA2 */ #define GCBI_HEAD_SWITCH_TIME_OVER_15USEC 0x0010 /* ATA1, obsolete ATA2 */ #define GCBI_NOT_MFM_ENCODED 0x0008 /* ATA1, obsolete ATA2 */ #define GCBI_SOFT_SECTORED 0x0004 /* ATA1, obsolete ATA2 */ #define GCBI_HARD_SECTORED 0x0002 /* ATA1, obsolete ATA2 */ /*#define 0x0001 // reserved */ /* ATAPI General Configuration Bit-significant Information: */ #define GCBI_HAS_PACKET_FEAT_SET 0x8000 /* ATA4, ATAPI4 */ #define GCBI_NO_PACKET_FEAT_SET 0x4000 /* ATA4, ATAPI4 */ #define GCBI_DIRECT_ACCESS_DEVICE 0x0000 /* ATA4, ATAPI4 */ #define GCBI_SEQUENTIAL_ACCESS_DEVICE 0x0100 /* ATA4, ATAPI4 */ #define GCBI_PRINTER_DEVICE 0x0200 /* ATA4, ATAPI4 */ #define GCBI_PROCESSOR_DEVICE 0x0300 /* ATA4, ATAPI4 */ #define GCBI_WRITE_ONCE_DEVICE 0x0400 /* ATA4, ATAPI4 */ #define GCBI_CDROM_DEVICE 0x0500 /* ATA4, ATAPI4 */ #define GCBI_SCANNER_DEVICE 0x0600 /* ATA4, ATAPI4 */ #define GCBI_OPTICAL_MEMORY_DEVICE 0x0700 /* ATA4, ATAPI4 */ #define GCBI_MEDIUM_CHANGER_DEVICE 0x0800 /* ATA4, ATAPI4 */ #define GCBI_COMMUNICATIONS_DEVICE 0x0900 /* ATA4, ATAPI4 */ #define GCBI_ARRAY_CONTROLLER_DEVICE 0x0c00 /* ATA4, ATAPI4 */ #define GCBI_ENCLOSURE_SERVICES_DEVICE 0x0d00 /* ATA5, ATAPI5 */ #define GCBI_REDUCED_BLOCK_COMMAND_DEVICE 0x0e00 /* ATA5, ATAPI5 */ #define GCBI_OPTICAL_CARD_RW_DEVICE 0x0f00 /* ATA5, ATAPI5 */ #define GCBI_UNKNOWN_DEVICE 0x1f00 /* ATA4, ATAPI4 */ #define GCBI_HAS_REMOVABLE_MEDIA 0x0080 /* ATA4, ATAPI4 */ #define GCBI_50US_TILL_DRQ 0x0400 /* ATA4, ATAPI4 */ #define GCBI_10MS_TILL_INTRQ_DRQ 0x0200 /* ATA4, ATAPI4 */ #define GCBI_3MS_TILL_DRQ 0x0000 /* ATA4, ATAPI4 */ #define GCBI_16BYTE_PACKETS 0x0001 /* ATA4, ATAPI4 */ #define GCBI_12BYTE_PACKETS 0x0000 /* ATA4, ATAPI4 */ /* Capabilities */ #define CAP_INTERLEAVED_DMA_SUPPORTED 0x8000 /* ATA4, ATAPI4 */ #define CAP_COMMAND_QUEUING_SUPPORTED 0x4000 /* ATA4, ATAPI4 */ #define CAP_STDBY_TIMER_SUPPORTED 0x2000 /* ATA2 */ #define CAP_OVERLAP_OPERATION_SUPPORTED 0x2000 /* ATA4, ATAPI4 */ #define CAP_ATA_SOFT_RESET_REQUIRED 0x1000 /* ATA , obsolete ATAPI4 */ #define CAP_IORDY_SUPPORTED 0x0800 /* ATA2 */ #define CAP_IORDY_CAN_BE_DISABLED 0x0400 /* ATA3 */ #define CAP_LBA_SUPPORTED 0x0200 /* ATA1, obsolete ATA3 */ #define CAP_DMA_SUPPORTED 0x0100 /* ATA1, obsolete ATA3 */ /* ATA4, LBA and DMA should be set */ /* Features */ #define FEAT_ENABLE_8BIT_DATA_TRANSFERS 0x01 /* ATA1, obsolete ATA3 */ /* retired ATA4 */ /* CFA ATA5 */ #define FEAT_ENABLE_WRITE_CACHE 0x02 /* ATA1 / Vendor */ #define FEAT_SET_TRANSFER_MODE 0x03 /* ATA1 */ #define FEAT_ENABLE_AUTO_DEFECT_REASSIGN 0x04 /* ATA3, obsolete ATA4 */ #define FEAT_ENABLE_ADVANCED_PM 0x05 /* ATA4 */ #define FEAT_ENABLE_POWER_UP_IN_STANDBY 0x06 /* ATA5 */ #define FEAT_POWER_UP_IN_STANDBY_SPIN_UP 0x07 /* ATA5 */ #define FEAT_ENABLE_CFA_POWER_MODE_1 0x0a /* ATA5 */ #define FEAT_DISABLE_MEDIA_STATUS_NOTIFY 0x31 /* ATA4 */ #define FEAT_DISABLE_RETRIES 0x33 /* ATA1, obsolete ATA4 */ #define FEAT_ENABLE_AUTO_ACOUSTIC_MNGMNT 0x42 /* ATA6 */ #define FEAT_VENDOR_ECC_ON_RW_LONG 0x44 /* ATA1, obsolete ATA4 */ #define FEAT_SET_CACHE_SEGMENTS 0x54 /* ATA1, obsolete ATA4 */ #define FEAT_DISABLE_READ_LOOKAHEAD 0x55 /* ATA1 */ #define FEAT_ENABLE_RELEASE_INTERRUPT 0x5d /* ATA4 */ #define FEAT_ENABLE_SERVICE_INTERRUPT 0x5e /* ATA4 */ #define FEAT_DISABLE_REVERTING_TO_DEFAULTS 0x66 /* ATA1 */ #define FEAT_DISABLE_ECC 0x77 /* ATA1, obsolete ATA4 */ #define FEAT_DISABLE_8BIT_DATA_TRANSFERS 0x81 /* ATA1, obsolete ATA3 */ /* retired ATA4 */ /* CFA ATA5 */ #define FEAT_DISABLE_WRITE_CACHE 0x82 /* ATA1 */ #define FEAT_DISABLE_AUTO_DEFECT_REASSIGN 0x84 /* ATA3, obsolete ATA4 */ #define FEAT_DISABLE_ADVANCED_PM 0x85 /* ATA4 */ #define FEAT_DISABLE_POWER_UP_IN_STANDBY 0x86 /* ATA5 */ #define FEAT_ENABLE_ECC 0x88 /* ATA1, obsolete ATA4 */ #define FEAT_DISABLE_CFA_POWER_MODE_1 0x8a /* ATA5 */ #define FEAT_ENABLE_MEDIA_STATUS_NOTIFY 0x95 /* ATA4 */ #define FEAT_ENABLE_RETRIES 0x99 /* ATA1, obsolete ATA4 */ #define FEAT_SET_MAXIMUM_AVG_CURRENT 0x9a /* ATA3, obsolete ATA4 */ #define FEAT_ENABLE_READ_LOOKAHEAD 0xaa /* ATA1 */ #define FEAT_SET_MAXIMUM_PREFETCH 0xab /* ATA1, obsolete ATA4 */ #define FEAT_4BYTE_ECC_ON_RW_LONG 0xbb /* ATA1, obsolete ATA4 */ #define FEAT_DISABLE_AUTO_ACOUSTIC_MNGMNT 0xc2 /* ATA6 */ #define FEAT_ENABLE_REVERTING_TO_DEFAULTS 0xcc /* ATA1 */ #define FEAT_DISABLE_RELEASE_INTERRUPT 0xdd /* ATA4 */ #define FEAT_DISABLE_SERVICE_INTERRUPT 0xde /* ATA4 */ /* 0xf0-0xff reserved for CFA */ /* Transfer Modes */ #define MODE_BLOCK_TRANSFER 0x00 /* ATA1 */ #define MODE_PIO 0x00 /* ATA2 */ #define MODE_PIO_NO_IORDY 0x01 /* ATA2 */ #define MODE_PIO_FLOW_CONTROL 0x08 /* ATA2 (+0..7) */ #define MODE_SINGLE_WORD_DMA 0x10 /* ATA1 (+0..3) */ /* ATA2 (+0..7) */ /* ATA3 removed */ #define MODE_MULTIWORD_DMA 0x20 /* ATA1 */ /* ATA2 (+0..7) */ #define MODE_ULTRA_DMA 0x40 /* ATA4 (+0..7) */ /* 0x80 reserved */ /* Advanced Power Management Levels */ #define APML_MAXIMUM_PERFORMANC 0xfe /* ATA4 */ #define APML_INTERMEDIATE_WITHOUT_STDBY 0x81 /* ATA4 0x81-0xfd */ #define APML_MINIMUM_POWER_WITHOUT_STDBY 0x80 /* ATA4 */ #define APML_INTERMEDIATE_WITH_STDBY 0x82 /* ATA4 0x81-0x7f */ #define APML_MINIMUM_POWER_WITH_STDBY 0x01 /* ATA4 */ /* Valid Fields */ #define FIELDS_VALID_54_58 0x01 /* ATA1 */ #define FIELDS_VALID_64_70 0x02 /* ATA2 */ #define FIELDS_VALID_88 0x04 /* ATA4 */ /* Version Numbers (index is bit number! (i.e. 1<