#ifndef _LINUX_HDREG_H
#define _LINUX_HDREG_H

#include <linux/types.h>

/*
 * Command Header sizes for IOCTL commands
 */

#define HDIO_DRIVE_CMD_HDR_SIZE                (4 * sizeof(__u8))
#define HDIO_DRIVE_HOB_HDR_SIZE                (8 * sizeof(__u8))
#define HDIO_DRIVE_TASK_HDR_SIZE        (8 * sizeof(__u8))

#define IDE_DRIVE_TASK_NO_DATA                0
#define IDE_DRIVE_TASK_INVALID                -1
#define IDE_DRIVE_TASK_SET_XFER                1
#define IDE_DRIVE_TASK_IN                2
#define IDE_DRIVE_TASK_OUT                3
#define IDE_DRIVE_TASK_RAW_WRITE        4

/*
 * Define standard taskfile in/out register
 */
#define IDE_TASKFILE_STD_IN_FLAGS        0xFE
#define IDE_HOB_STD_IN_FLAGS                0x3C
#define IDE_TASKFILE_STD_OUT_FLAGS        0xFE
#define IDE_HOB_STD_OUT_FLAGS                0x3C

typedef unsigned char task_ioreg_t;
typedef unsigned long sata_ioreg_t;

typedef union ide_reg_valid_s {
        unsigned all                                : 16;
        struct {
                unsigned data                        : 1;
                unsigned error_feature                : 1;
                unsigned sector                        : 1;
                unsigned nsector                : 1;
                unsigned lcyl                        : 1;
                unsigned hcyl                        : 1;
                unsigned select                        : 1;
                unsigned status_command                : 1;

                unsigned data_hob                : 1;
                unsigned error_feature_hob        : 1;
                unsigned sector_hob                : 1;
                unsigned nsector_hob                : 1;
                unsigned lcyl_hob                : 1;
                unsigned hcyl_hob                : 1;
                unsigned select_hob                : 1;
                unsigned control_hob                : 1;
        } b;
} ide_reg_valid_t;

typedef struct ide_task_request_s {
        __u8                io_ports[8];
        __u8                hob_ports[8]; /* bytes 6 and 7 are unused */
        ide_reg_valid_t        out_flags;
        ide_reg_valid_t        in_flags;
        int                data_phase;
        int                req_cmd;
        unsigned long        out_size;
        unsigned long        in_size;
} ide_task_request_t;

typedef struct ide_ioctl_request_s {
        ide_task_request_t        *task_request;
        unsigned char                *out_buffer;
        unsigned char                *in_buffer;
} ide_ioctl_request_t;

struct hd_drive_cmd_hdr {
        __u8 command;
        __u8 sector_number;
        __u8 feature;
        __u8 sector_count;
};

typedef struct hd_drive_task_hdr {
        __u8 data;
        __u8 feature;
        __u8 sector_count;
        __u8 sector_number;
        __u8 low_cylinder;
        __u8 high_cylinder;
        __u8 device_head;
        __u8 command;
} task_struct_t;

typedef struct hd_drive_hob_hdr {
        __u8 data;
        __u8 feature;
        __u8 sector_count;
        __u8 sector_number;
        __u8 low_cylinder;
        __u8 high_cylinder;
        __u8 device_head;
        __u8 control;
} hob_struct_t;

#define TASKFILE_NO_DATA                0x0000

#define TASKFILE_IN                        0x0001
#define TASKFILE_MULTI_IN                0x0002

#define TASKFILE_OUT                        0x0004
#define TASKFILE_MULTI_OUT                0x0008
#define TASKFILE_IN_OUT                        0x0010

#define TASKFILE_IN_DMA                        0x0020
#define TASKFILE_OUT_DMA                0x0040
#define TASKFILE_IN_DMAQ                0x0080
#define TASKFILE_OUT_DMAQ                0x0100

#define TASKFILE_P_IN                        0x0200
#define TASKFILE_P_OUT                        0x0400
#define TASKFILE_P_IN_DMA                0x0800
#define TASKFILE_P_OUT_DMA                0x1000
#define TASKFILE_P_IN_DMAQ                0x2000
#define TASKFILE_P_OUT_DMAQ                0x4000
#define TASKFILE_48                        0x8000
#define TASKFILE_INVALID                0x7fff

/* ATA/ATAPI Commands pre T13 Spec */
#define WIN_NOP                                0x00
/*
 *        0x01->0x02 Reserved
 */
#define CFA_REQ_EXT_ERROR_CODE                0x03 /* CFA Request Extended Error Code */
/*
 *        0x04->0x07 Reserved
 */
#define WIN_SRST                        0x08 /* ATAPI soft reset command */
#define WIN_DEVICE_RESET                0x08
/*
 *        0x09->0x0F Reserved
 */
#define WIN_RECAL                        0x10
#define WIN_RESTORE                        WIN_RECAL
/*
 *        0x10->0x1F Reserved
 */
#define WIN_READ                        0x20 /* 28-Bit */
#define WIN_READ_ONCE                        0x21 /* 28-Bit without retries */
#define WIN_READ_LONG                        0x22 /* 28-Bit */
#define WIN_READ_LONG_ONCE                0x23 /* 28-Bit without retries */
#define WIN_READ_EXT                        0x24 /* 48-Bit */
#define WIN_READDMA_EXT                        0x25 /* 48-Bit */
#define WIN_READDMA_QUEUED_EXT                0x26 /* 48-Bit */
#define WIN_READ_NATIVE_MAX_EXT                0x27 /* 48-Bit */
/*
 *        0x28
 */
#define WIN_MULTREAD_EXT                0x29 /* 48-Bit */
/*
 *        0x2A->0x2F Reserved
 */
#define WIN_WRITE                        0x30 /* 28-Bit */
#define WIN_WRITE_ONCE                        0x31 /* 28-Bit without retries */
#define WIN_WRITE_LONG                        0x32 /* 28-Bit */
#define WIN_WRITE_LONG_ONCE                0x33 /* 28-Bit without retries */
#define WIN_WRITE_EXT                        0x34 /* 48-Bit */
#define WIN_WRITEDMA_EXT                0x35 /* 48-Bit */
#define WIN_WRITEDMA_QUEUED_EXT                0x36 /* 48-Bit */
#define WIN_SET_MAX_EXT                        0x37 /* 48-Bit */
#define CFA_WRITE_SECT_WO_ERASE                0x38 /* CFA Write Sectors without erase */
#define WIN_MULTWRITE_EXT                0x39 /* 48-Bit */
/*
 *        0x3A->0x3B Reserved
 */
#define WIN_WRITE_VERIFY                0x3C /* 28-Bit */
/*
 *        0x3D->0x3F Reserved
 */
#define WIN_VERIFY                        0x40 /* 28-Bit - Read Verify Sectors */
#define WIN_VERIFY_ONCE                        0x41 /* 28-Bit - without retries */
#define WIN_VERIFY_EXT                        0x42 /* 48-Bit */
/*
 *        0x43->0x4F Reserved
 */
#define WIN_FORMAT                        0x50
/*
 *        0x51->0x5F Reserved
 */
#define WIN_INIT                        0x60
/*
 *        0x61->0x5F Reserved
 */
#define WIN_SEEK                        0x70 /* 0x70-0x7F Reserved */

#define CFA_TRANSLATE_SECTOR                0x87 /* CFA Translate Sector */
#define WIN_DIAGNOSE                        0x90
#define WIN_SPECIFY                        0x91 /* set drive geometry translation */
#define WIN_DOWNLOAD_MICROCODE                0x92
#define WIN_STANDBYNOW2                        0x94
#define WIN_STANDBY2                        0x96
#define WIN_SETIDLE2                        0x97
#define WIN_CHECKPOWERMODE2                0x98
#define WIN_SLEEPNOW2                        0x99
/*
 *        0x9A VENDOR
 */
#define WIN_PACKETCMD                        0xA0 /* Send a packet command. */
#define WIN_PIDENTIFY                        0xA1 /* identify ATAPI device        */
#define WIN_QUEUED_SERVICE                0xA2
#define WIN_SMART                        0xB0 /* self-monitoring and reporting */
#define CFA_ERASE_SECTORS                0xC0
#define WIN_MULTREAD                        0xC4 /* read sectors using multiple mode*/
#define WIN_MULTWRITE                        0xC5 /* write sectors using multiple mode */
#define WIN_SETMULT                        0xC6 /* enable/disable multiple mode */
#define WIN_READDMA_QUEUED                0xC7 /* read sectors using Queued DMA transfers */
#define WIN_READDMA                        0xC8 /* read sectors using DMA transfers */
#define WIN_READDMA_ONCE                0xC9 /* 28-Bit - without retries */
#define WIN_WRITEDMA                        0xCA /* write sectors using DMA transfers */
#define WIN_WRITEDMA_ONCE                0xCB /* 28-Bit - without retries */
#define WIN_WRITEDMA_QUEUED                0xCC /* write sectors using Queued DMA transfers */
#define CFA_WRITE_MULTI_WO_ERASE        0xCD /* CFA Write multiple without erase */
#define WIN_GETMEDIASTATUS                0xDA
#define WIN_ACKMEDIACHANGE                0xDB /* ATA-1, ATA-2 vendor */
#define WIN_POSTBOOT                        0xDC
#define WIN_PREBOOT                         0xDD
#define WIN_DOORLOCK                        0xDE /* lock door on removable drives */
#define WIN_DOORUNLOCK                        0xDF /* unlock door on removable drives */
#define WIN_STANDBYNOW1                        0xE0
#define WIN_IDLEIMMEDIATE                0xE1 /* force drive to become "ready" */
#define WIN_STANDBY                        0xE2 /* Set device in Standby Mode */
#define WIN_SETIDLE1                        0xE3
#define WIN_READ_BUFFER                        0xE4 /* force read only 1 sector */
#define WIN_CHECKPOWERMODE1                0xE5
#define WIN_SLEEPNOW1                        0xE6
#define WIN_FLUSH_CACHE                        0xE7
#define WIN_WRITE_BUFFER                0xE8 /* force write only 1 sector */
#define WIN_WRITE_SAME                        0xE9 /* read ata-2 to use */
        /* SET_FEATURES 0x22 or 0xDD */
#define WIN_FLUSH_CACHE_EXT                0xEA /* 48-Bit */
#define WIN_IDENTIFY                        0xEC /* ask drive to identify itself        */
#define WIN_MEDIAEJECT                        0xED
#define WIN_IDENTIFY_DMA                0xEE /* same as WIN_IDENTIFY, but DMA */
#define WIN_SETFEATURES                        0xEF /* set special drive features */
#define EXABYTE_ENABLE_NEST                0xF0
#define WIN_SECURITY_SET_PASS                0xF1
#define WIN_SECURITY_UNLOCK                0xF2
#define WIN_SECURITY_ERASE_PREPARE        0xF3
#define WIN_SECURITY_ERASE_UNIT                0xF4
#define WIN_SECURITY_FREEZE_LOCK        0xF5
#define WIN_SECURITY_DISABLE                0xF6
#define WIN_READ_NATIVE_MAX                0xF8 /* return the native maximum address */
#define WIN_SET_MAX                        0xF9
#define DISABLE_SEAGATE                        0xFB

/* WIN_SMART sub-commands */

#define SMART_READ_VALUES                0xD0
#define SMART_READ_THRESHOLDS                0xD1
#define SMART_AUTOSAVE                        0xD2
#define SMART_SAVE                        0xD3
#define SMART_IMMEDIATE_OFFLINE                0xD4
#define SMART_READ_LOG_SECTOR                0xD5
#define SMART_WRITE_LOG_SECTOR                0xD6
#define SMART_WRITE_THRESHOLDS                0xD7
#define SMART_ENABLE                        0xD8
#define SMART_DISABLE                        0xD9
#define SMART_STATUS                        0xDA
#define SMART_AUTO_OFFLINE                0xDB

/* Password used in TF4 & TF5 executing SMART commands */

#define SMART_LCYL_PASS                        0x4F
#define SMART_HCYL_PASS                        0xC2

/* WIN_SETFEATURES sub-commands */
#define SETFEATURES_EN_8BIT        0x01        /* Enable 8-Bit Transfers */
#define SETFEATURES_EN_WCACHE        0x02        /* Enable write cache */
#define SETFEATURES_DIS_DEFECT        0x04        /* Disable Defect Management */
#define SETFEATURES_EN_APM        0x05        /* Enable advanced power management */
#define SETFEATURES_EN_SAME_R        0x22        /* for a region ATA-1 */
#define SETFEATURES_DIS_MSN        0x31        /* Disable Media Status Notification */
#define SETFEATURES_DIS_RETRY        0x33        /* Disable Retry */
#define SETFEATURES_EN_AAM        0x42        /* Enable Automatic Acoustic Management */
#define SETFEATURES_RW_LONG        0x44        /* Set Length of VS bytes */
#define SETFEATURES_SET_CACHE        0x54        /* Set Cache segments to SC Reg. Val */
#define SETFEATURES_DIS_RLA        0x55        /* Disable read look-ahead feature */
#define SETFEATURES_EN_RI        0x5D        /* Enable release interrupt */
#define SETFEATURES_EN_SI        0x5E        /* Enable SERVICE interrupt */
#define SETFEATURES_DIS_RPOD        0x66        /* Disable reverting to power on defaults */
#define SETFEATURES_DIS_ECC        0x77        /* Disable ECC byte count */
#define SETFEATURES_DIS_8BIT        0x81        /* Disable 8-Bit Transfers */
#define SETFEATURES_DIS_WCACHE        0x82        /* Disable write cache */
#define SETFEATURES_EN_DEFECT        0x84        /* Enable Defect Management */
#define SETFEATURES_DIS_APM        0x85        /* Disable advanced power management */
#define SETFEATURES_EN_ECC        0x88        /* Enable ECC byte count */
#define SETFEATURES_EN_MSN        0x95        /* Enable Media Status Notification */
#define SETFEATURES_EN_RETRY        0x99        /* Enable Retry */
#define SETFEATURES_EN_RLA        0xAA        /* Enable read look-ahead feature */
#define SETFEATURES_PREFETCH        0xAB        /* Sets drive prefetch value */
#define SETFEATURES_EN_REST        0xAC        /* ATA-1 */
#define SETFEATURES_4B_RW_LONG        0xBB        /* Set Length of 4 bytes */
#define SETFEATURES_DIS_AAM        0xC2        /* Disable Automatic Acoustic Management */
#define SETFEATURES_EN_RPOD        0xCC        /* Enable reverting to power on defaults */
#define SETFEATURES_DIS_RI        0xDD        /* Disable release interrupt ATAPI */
#define SETFEATURES_EN_SAME_M        0xDD        /* for a entire device ATA-1 */
#define SETFEATURES_DIS_SI        0xDE        /* Disable SERVICE interrupt ATAPI */

/* WIN_SECURITY sub-commands */

#define SECURITY_SET_PASSWORD                0xBA
#define SECURITY_UNLOCK                        0xBB
#define SECURITY_ERASE_PREPARE                0xBC
#define SECURITY_ERASE_UNIT                0xBD
#define SECURITY_FREEZE_LOCK                0xBE
#define SECURITY_DISABLE_PASSWORD        0xBF

struct hd_geometry {
      unsigned char heads;
      unsigned char sectors;
      unsigned short cylinders;
      unsigned long start;
};

/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x030n/0x031n */
#define HDIO_GETGEO                0x0301        /* get device geometry */
#define HDIO_GET_UNMASKINTR        0x0302        /* get current unmask setting */
#define HDIO_GET_MULTCOUNT        0x0304        /* get current IDE blockmode setting */
#define HDIO_GET_QDMA                0x0305        /* get use-qdma flag */

#define HDIO_SET_XFER                0x0306  /* set transfer rate via proc */

#define HDIO_OBSOLETE_IDENTITY        0x0307        /* OBSOLETE, DO NOT USE: returns 142 bytes */
#define HDIO_GET_KEEPSETTINGS        0x0308        /* get keep-settings-on-reset flag */
#define HDIO_GET_32BIT                0x0309        /* get current io_32bit setting */
#define HDIO_GET_NOWERR                0x030a        /* get ignore-write-error flag */
#define HDIO_GET_DMA                0x030b        /* get use-dma flag */
#define HDIO_GET_NICE                0x030c        /* get nice flags */
#define HDIO_GET_IDENTITY        0x030d        /* get IDE identification info */
#define HDIO_GET_WCACHE                0x030e        /* get write cache mode on|off */
#define HDIO_GET_ACOUSTIC        0x030f        /* get acoustic value */
#define        HDIO_GET_ADDRESS        0x0310        /* */

#define HDIO_GET_BUSSTATE        0x031a        /* get the bus state of the hwif */
#define HDIO_TRISTATE_HWIF        0x031b        /* execute a channel tristate */
#define HDIO_DRIVE_RESET        0x031c        /* execute a device reset */
#define HDIO_DRIVE_TASKFILE        0x031d        /* execute raw taskfile */
#define HDIO_DRIVE_TASK                0x031e        /* execute task and special drive command */
#define HDIO_DRIVE_CMD                0x031f        /* execute a special drive command */
#define HDIO_DRIVE_CMD_AEB        HDIO_DRIVE_TASK

/* hd/ide ctl's that pass (arg) non-ptr values are numbered 0x032n/0x033n */
#define HDIO_SET_MULTCOUNT        0x0321        /* change IDE blockmode */
#define HDIO_SET_UNMASKINTR        0x0322        /* permit other irqs during I/O */
#define HDIO_SET_KEEPSETTINGS        0x0323        /* keep ioctl settings on reset */
#define HDIO_SET_32BIT                0x0324        /* change io_32bit flags */
#define HDIO_SET_NOWERR                0x0325        /* change ignore-write-error flag */
#define HDIO_SET_DMA                0x0326        /* change use-dma flag */
#define HDIO_SET_PIO_MODE        0x0327        /* reconfig interface to new speed */
#define HDIO_SCAN_HWIF                0x0328        /* register and (re)scan interface */
#define HDIO_UNREGISTER_HWIF        0x032a  /* unregister interface */
#define HDIO_SET_NICE                0x0329        /* set nice flags */
#define HDIO_SET_WCACHE                0x032b        /* change write cache enable-disable */
#define HDIO_SET_ACOUSTIC        0x032c        /* change acoustic behavior */
#define HDIO_SET_BUSSTATE        0x032d        /* set the bus state of the hwif */
#define HDIO_SET_QDMA                0x032e        /* change use-qdma flag */
#define HDIO_SET_ADDRESS        0x032f        /* change lba addressing modes */

/* bus states */
enum {
        BUSSTATE_OFF = 0,
        BUSSTATE_ON,
        BUSSTATE_TRISTATE
};

/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x033n/0x033n */
/* 0x330 is reserved - used to be HDIO_GETGEO_BIG */
/* 0x331 is reserved - used to be HDIO_GETGEO_BIG_RAW */
/* 0x338 is reserved - used to be HDIO_SET_IDE_SCSI */
/* 0x339 is reserved - used to be HDIO_SET_SCSI_IDE */

#define __NEW_HD_DRIVE_ID

/*
 * Structure returned by HDIO_GET_IDENTITY, as per ANSI NCITS ATA6 rev.1b spec.
 *
 * If you change something here, please remember to update fix_driveid() in
 * ide/probe.c.
 */
struct hd_driveid {
        unsigned short        config;                /* lots of obsolete bit flags */
        unsigned short        cyls;                /* Obsolete, "physical" cyls */
        unsigned short        reserved2;        /* reserved (word 2) */
        unsigned short        heads;                /* Obsolete, "physical" heads */
        unsigned short        track_bytes;        /* unformatted bytes per track */
        unsigned short        sector_bytes;        /* unformatted bytes per sector */
        unsigned short        sectors;        /* Obsolete, "physical" sectors per track */
        unsigned short        vendor0;        /* vendor unique */
        unsigned short        vendor1;        /* vendor unique */
        unsigned short        vendor2;        /* Retired vendor unique */
        unsigned char        serial_no[20];        /* 0 = not_specified */
        unsigned short        buf_type;        /* Retired */
        unsigned short        buf_size;        /* Retired, 512 byte increments
                                         * 0 = not_specified
                                         */
        unsigned short        ecc_bytes;        /* for r/w long cmds; 0 = not_specified */
        unsigned char        fw_rev[8];        /* 0 = not_specified */
        unsigned char        model[40];        /* 0 = not_specified */
        unsigned char        max_multsect;        /* 0=not_implemented */
        unsigned char        vendor3;        /* vendor unique */
        unsigned short        dword_io;        /* 0=not_implemented; 1=implemented */
        unsigned char        vendor4;        /* vendor unique */
        unsigned char        capability;        /* (upper byte of word 49)
                                         *  3:        IORDYsup
                                         *  2:        IORDYsw
                                         *  1:        LBA
                                         *  0:        DMA
                                         */
        unsigned short        reserved50;        /* reserved (word 50) */
        unsigned char        vendor5;        /* Obsolete, vendor unique */
        unsigned char        tPIO;                /* Obsolete, 0=slow, 1=medium, 2=fast */
        unsigned char        vendor6;        /* Obsolete, vendor unique */
        unsigned char        tDMA;                /* Obsolete, 0=slow, 1=medium, 2=fast */
        unsigned short        field_valid;        /* (word 53)
                                         *  2:        ultra_ok        word  88
                                         *  1:        eide_ok                words 64-70
                                         *  0:        cur_ok                words 54-58
                                         */
        unsigned short        cur_cyls;        /* Obsolete, logical cylinders */
        unsigned short        cur_heads;        /* Obsolete, l heads */
        unsigned short        cur_sectors;        /* Obsolete, l sectors per track */
        unsigned short        cur_capacity0;        /* Obsolete, l total sectors on drive */
        unsigned short        cur_capacity1;        /* Obsolete, (2 words, misaligned int)     */
        unsigned char        multsect;        /* current multiple sector count */
        unsigned char        multsect_valid;        /* when (bit0==1) multsect is ok */
        unsigned int        lba_capacity;        /* Obsolete, total number of sectors */
        unsigned short        dma_1word;        /* Obsolete, single-word dma info */
        unsigned short        dma_mword;        /* multiple-word dma info */
        unsigned short  eide_pio_modes; /* bits 0:mode3 1:mode4 */
        unsigned short  eide_dma_min;        /* min mword dma cycle time (ns) */
        unsigned short  eide_dma_time;        /* recommended mword dma cycle time (ns) */
        unsigned short  eide_pio;       /* min cycle time (ns), no IORDY  */
        unsigned short  eide_pio_iordy; /* min cycle time (ns), with IORDY */
        unsigned short        words69_70[2];        /* reserved words 69-70
                                         * future command overlap and queuing
                                         */
        unsigned short        words71_74[4];        /* reserved words 71-74
                                         * for IDENTIFY PACKET DEVICE command
                                         */
        unsigned short  queue_depth;        /* (word 75)
                                         * 15:5        reserved
                                         *  4:0        Maximum queue depth -1
                                         */
        unsigned short  words76_79[4];        /* reserved words 76-79 */
        unsigned short  major_rev_num;        /* (word 80) */
        unsigned short  minor_rev_num;        /* (word 81) */
        unsigned short  command_set_1;        /* (word 82) supported
                                         * 15:        Obsolete
                                         * 14:        NOP command
                                         * 13:        READ_BUFFER
                                         * 12:        WRITE_BUFFER
                                         * 11:        Obsolete
                                         * 10:        Host Protected Area
                                         *  9:        DEVICE Reset
                                         *  8:        SERVICE Interrupt
                                         *  7:        Release Interrupt
                                         *  6:        look-ahead
                                         *  5:        write cache
                                         *  4:        PACKET Command
                                         *  3:        Power Management Feature Set
                                         *  2:        Removable Feature Set
                                         *  1:        Security Feature Set
                                         *  0:        SMART Feature Set
                                         */
        unsigned short  command_set_2;        /* (word 83)
                                         * 15:        Shall be ZERO
                                         * 14:        Shall be ONE
                                         * 13:        FLUSH CACHE EXT
                                         * 12:        FLUSH CACHE
                                         * 11:        Device Configuration Overlay
                                         * 10:        48-bit Address Feature Set
                                         *  9:        Automatic Acoustic Management
                                         *  8:        SET MAX security
                                         *  7:        reserved 1407DT PARTIES
                                         *  6:        SetF sub-command Power-Up
                                         *  5:        Power-Up in Standby Feature Set
                                         *  4:        Removable Media Notification
                                         *  3:        APM Feature Set
                                         *  2:        CFA Feature Set
                                         *  1:        READ/WRITE DMA QUEUED
                                         *  0:        Download MicroCode
                                         */
        unsigned short  cfsse;                /* (word 84)
                                         * cmd set-feature supported extensions
                                         * 15:        Shall be ZERO
                                         * 14:        Shall be ONE
                                         * 13:6        reserved
                                         *  5:        General Purpose Logging
                                         *  4:        Streaming Feature Set
                                         *  3:        Media Card Pass Through
                                         *  2:        Media Serial Number Valid
                                         *  1:        SMART selt-test supported
                                         *  0:        SMART error logging
                                         */
        unsigned short  cfs_enable_1;        /* (word 85)
                                         * command set-feature enabled
                                         * 15:        Obsolete
                                         * 14:        NOP command
                                         * 13:        READ_BUFFER
                                         * 12:        WRITE_BUFFER
                                         * 11:        Obsolete
                                         * 10:        Host Protected Area
                                         *  9:        DEVICE Reset
                                         *  8:        SERVICE Interrupt
                                         *  7:        Release Interrupt
                                         *  6:        look-ahead
                                         *  5:        write cache
                                         *  4:        PACKET Command
                                         *  3:        Power Management Feature Set
                                         *  2:        Removable Feature Set
                                         *  1:        Security Feature Set
                                         *  0:        SMART Feature Set
                                         */
        unsigned short  cfs_enable_2;        /* (word 86)
                                         * command set-feature enabled
                                         * 15:        Shall be ZERO
                                         * 14:        Shall be ONE
                                         * 13:        FLUSH CACHE EXT
                                         * 12:        FLUSH CACHE
                                         * 11:        Device Configuration Overlay
                                         * 10:        48-bit Address Feature Set
                                         *  9:        Automatic Acoustic Management
                                         *  8:        SET MAX security
                                         *  7:        reserved 1407DT PARTIES
                                         *  6:        SetF sub-command Power-Up
                                         *  5:        Power-Up in Standby Feature Set
                                         *  4:        Removable Media Notification
                                         *  3:        APM Feature Set
                                         *  2:        CFA Feature Set
                                         *  1:        READ/WRITE DMA QUEUED
                                         *  0:        Download MicroCode
                                         */
        unsigned short  csf_default;        /* (word 87)
                                         * command set-feature default
                                         * 15:        Shall be ZERO
                                         * 14:        Shall be ONE
                                         * 13:6        reserved
                                         *  5:        General Purpose Logging enabled
                                         *  4:        Valid CONFIGURE STREAM executed
                                         *  3:        Media Card Pass Through enabled
                                         *  2:        Media Serial Number Valid
                                         *  1:        SMART selt-test supported
                                         *  0:        SMART error logging
                                         */
        unsigned short  dma_ultra;        /* (word 88) */
        unsigned short        trseuc;                /* time required for security erase */
        unsigned short        trsEuc;                /* time required for enhanced erase */
        unsigned short        CurAPMvalues;        /* current APM values */
        unsigned short        mprc;                /* master password revision code */
        unsigned short        hw_config;        /* hardware config (word 93)
                                         * 15:        Shall be ZERO
                                         * 14:        Shall be ONE
                                         * 13:
                                         * 12:
                                         * 11:
                                         * 10:
                                         *  9:
                                         *  8:
                                         *  7:
                                         *  6:
                                         *  5:
                                         *  4:
                                         *  3:
                                         *  2:
                                         *  1:
                                         *  0:        Shall be ONE
                                         */
        unsigned short        acoustic;        /* (word 94)
                                         * 15:8        Vendor's recommended value
                                         *  7:0        current value
                                         */
        unsigned short        msrqs;                /* min stream request size */
        unsigned short        sxfert;                /* stream transfer time */
        unsigned short        sal;                /* stream access latency */
        unsigned int        spg;                /* stream performance granularity */
        unsigned long long lba_capacity_2;/* 48-bit total number of sectors */
        unsigned short        words104_125[22];/* reserved words 104-125 */
        unsigned short        last_lun;        /* (word 126) */
        unsigned short        word127;        /* (word 127) Feature Set
                                         * Removable Media Notification
                                         * 15:2        reserved
                                         *  1:0        00 = not supported
                                         *        01 = supported
                                         *        10 = reserved
                                         *        11 = reserved
                                         */
        unsigned short        dlf;                /* (word 128)
                                         * device lock function
                                         * 15:9        reserved
                                         *  8        security level 1:max 0:high
                                         *  7:6        reserved
                                         *  5        enhanced erase
                                         *  4        expire
                                         *  3        frozen
                                         *  2        locked
                                         *  1        en/disabled
                                         *  0        capability
                                         */
        unsigned short  csfo;                /*  (word 129)
                                         * current set features options
                                         * 15:4        reserved
                                         *  3:        auto reassign
                                         *  2:        reverting
                                         *  1:        read-look-ahead
                                         *  0:        write cache
                                         */
        unsigned short        words130_155[26];/* reserved vendor words 130-155 */
        unsigned short        word156;        /* reserved vendor word 156 */
        unsigned short        words157_159[3];/* reserved vendor words 157-159 */
        unsigned short        cfa_power;        /* (word 160) CFA Power Mode
                                         * 15 word 160 supported
                                         * 14 reserved
                                         * 13
                                         * 12
                                         * 11:0
                                         */
        unsigned short        words161_175[15];/* Reserved for CFA */
        unsigned short        words176_205[30];/* Current Media Serial Number */
        unsigned short        words206_254[49];/* reserved words 206-254 */
        unsigned short        integrity_word;        /* (word 255)
                                         * 15:8 Checksum
                                         *  7:0 Signature
                                         */
};

/*
 * IDE "nice" flags. These are used on a per drive basis to determine
 * when to be nice and give more bandwidth to the other devices which
 * share the same IDE bus.
 */
#define IDE_NICE_DSC_OVERLAP        (0)        /* per the DSC overlap protocol */
#define IDE_NICE_ATAPI_OVERLAP        (1)        /* not supported yet */
#define IDE_NICE_1                (3)        /* when probably won't affect us much */
#define IDE_NICE_0                (2)        /* when sure that it won't affect us */
#define IDE_NICE_2                (4)        /* when we know it's on our expense */

#endif        /* _LINUX_HDREG_H */