diff options
Diffstat (limited to 'include/linux/ata.h')
| -rw-r--r-- | include/linux/ata.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index 312a2c0c64e6..c494e1c0531e 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -97,6 +97,9 @@ enum { | |||
| 97 | ATA_DRQ = (1 << 3), /* data request i/o */ | 97 | ATA_DRQ = (1 << 3), /* data request i/o */ |
| 98 | ATA_ERR = (1 << 0), /* have an error */ | 98 | ATA_ERR = (1 << 0), /* have an error */ |
| 99 | ATA_SRST = (1 << 2), /* software reset */ | 99 | ATA_SRST = (1 << 2), /* software reset */ |
| 100 | ATA_ICRC = (1 << 7), /* interface CRC error */ | ||
| 101 | ATA_UNC = (1 << 6), /* uncorrectable media error */ | ||
| 102 | ATA_IDNF = (1 << 4), /* ID not found */ | ||
| 100 | ATA_ABORTED = (1 << 2), /* command aborted */ | 103 | ATA_ABORTED = (1 << 2), /* command aborted */ |
| 101 | 104 | ||
| 102 | /* ATA command block registers */ | 105 | /* ATA command block registers */ |
| @@ -130,6 +133,8 @@ enum { | |||
| 130 | ATA_CMD_WRITE = 0xCA, | 133 | ATA_CMD_WRITE = 0xCA, |
| 131 | ATA_CMD_WRITE_EXT = 0x35, | 134 | ATA_CMD_WRITE_EXT = 0x35, |
| 132 | ATA_CMD_WRITE_FUA_EXT = 0x3D, | 135 | ATA_CMD_WRITE_FUA_EXT = 0x3D, |
| 136 | ATA_CMD_FPDMA_READ = 0x60, | ||
| 137 | ATA_CMD_FPDMA_WRITE = 0x61, | ||
| 133 | ATA_CMD_PIO_READ = 0x20, | 138 | ATA_CMD_PIO_READ = 0x20, |
| 134 | ATA_CMD_PIO_READ_EXT = 0x24, | 139 | ATA_CMD_PIO_READ_EXT = 0x24, |
| 135 | ATA_CMD_PIO_WRITE = 0x30, | 140 | ATA_CMD_PIO_WRITE = 0x30, |
| @@ -148,6 +153,10 @@ enum { | |||
| 148 | ATA_CMD_INIT_DEV_PARAMS = 0x91, | 153 | ATA_CMD_INIT_DEV_PARAMS = 0x91, |
| 149 | ATA_CMD_READ_NATIVE_MAX = 0xF8, | 154 | ATA_CMD_READ_NATIVE_MAX = 0xF8, |
| 150 | ATA_CMD_READ_NATIVE_MAX_EXT = 0x27, | 155 | ATA_CMD_READ_NATIVE_MAX_EXT = 0x27, |
| 156 | ATA_CMD_READ_LOG_EXT = 0x2f, | ||
| 157 | |||
| 158 | /* READ_LOG_EXT pages */ | ||
| 159 | ATA_LOG_SATA_NCQ = 0x10, | ||
| 151 | 160 | ||
| 152 | /* SETFEATURES stuff */ | 161 | /* SETFEATURES stuff */ |
| 153 | SETFEATURES_XFER = 0x03, | 162 | SETFEATURES_XFER = 0x03, |
| @@ -192,6 +201,16 @@ enum { | |||
| 192 | SCR_ACTIVE = 3, | 201 | SCR_ACTIVE = 3, |
| 193 | SCR_NOTIFICATION = 4, | 202 | SCR_NOTIFICATION = 4, |
| 194 | 203 | ||
| 204 | /* SError bits */ | ||
| 205 | SERR_DATA_RECOVERED = (1 << 0), /* recovered data error */ | ||
| 206 | SERR_COMM_RECOVERED = (1 << 1), /* recovered comm failure */ | ||
| 207 | SERR_DATA = (1 << 8), /* unrecovered data error */ | ||
| 208 | SERR_PERSISTENT = (1 << 9), /* persistent data/comm error */ | ||
| 209 | SERR_PROTOCOL = (1 << 10), /* protocol violation */ | ||
| 210 | SERR_INTERNAL = (1 << 11), /* host internal error */ | ||
| 211 | SERR_PHYRDY_CHG = (1 << 16), /* PHY RDY changed */ | ||
| 212 | SERR_DEV_XCHG = (1 << 26), /* device exchanged */ | ||
| 213 | |||
| 195 | /* struct ata_taskfile flags */ | 214 | /* struct ata_taskfile flags */ |
| 196 | ATA_TFLAG_LBA48 = (1 << 0), /* enable 48-bit LBA and "HOB" */ | 215 | ATA_TFLAG_LBA48 = (1 << 0), /* enable 48-bit LBA and "HOB" */ |
| 197 | ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */ | 216 | ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */ |
| @@ -199,6 +218,7 @@ enum { | |||
| 199 | ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */ | 218 | ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */ |
| 200 | ATA_TFLAG_LBA = (1 << 4), /* enable LBA */ | 219 | ATA_TFLAG_LBA = (1 << 4), /* enable LBA */ |
| 201 | ATA_TFLAG_FUA = (1 << 5), /* enable FUA */ | 220 | ATA_TFLAG_FUA = (1 << 5), /* enable FUA */ |
| 221 | ATA_TFLAG_POLLING = (1 << 6), /* set nIEN to 1 and use polling */ | ||
| 202 | }; | 222 | }; |
| 203 | 223 | ||
| 204 | enum ata_tf_protocols { | 224 | enum ata_tf_protocols { |
| @@ -207,6 +227,7 @@ enum ata_tf_protocols { | |||
| 207 | ATA_PROT_NODATA, /* no data */ | 227 | ATA_PROT_NODATA, /* no data */ |
| 208 | ATA_PROT_PIO, /* PIO single sector */ | 228 | ATA_PROT_PIO, /* PIO single sector */ |
| 209 | ATA_PROT_DMA, /* DMA */ | 229 | ATA_PROT_DMA, /* DMA */ |
| 230 | ATA_PROT_NCQ, /* NCQ */ | ||
| 210 | ATA_PROT_ATAPI, /* packet command, PIO data xfer*/ | 231 | ATA_PROT_ATAPI, /* packet command, PIO data xfer*/ |
| 211 | ATA_PROT_ATAPI_NODATA, /* packet command, no data */ | 232 | ATA_PROT_ATAPI_NODATA, /* packet command, no data */ |
| 212 | ATA_PROT_ATAPI_DMA, /* packet command with special DMA sauce */ | 233 | ATA_PROT_ATAPI_DMA, /* packet command with special DMA sauce */ |
| @@ -262,6 +283,8 @@ struct ata_taskfile { | |||
| 262 | #define ata_id_has_pm(id) ((id)[82] & (1 << 3)) | 283 | #define ata_id_has_pm(id) ((id)[82] & (1 << 3)) |
| 263 | #define ata_id_has_lba(id) ((id)[49] & (1 << 9)) | 284 | #define ata_id_has_lba(id) ((id)[49] & (1 << 9)) |
| 264 | #define ata_id_has_dma(id) ((id)[49] & (1 << 8)) | 285 | #define ata_id_has_dma(id) ((id)[49] & (1 << 8)) |
| 286 | #define ata_id_has_ncq(id) ((id)[76] & (1 << 8)) | ||
| 287 | #define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1) | ||
| 265 | #define ata_id_removeable(id) ((id)[0] & (1 << 7)) | 288 | #define ata_id_removeable(id) ((id)[0] & (1 << 7)) |
| 266 | #define ata_id_has_dword_io(id) ((id)[50] & (1 << 0)) | 289 | #define ata_id_has_dword_io(id) ((id)[50] & (1 << 0)) |
| 267 | #define ata_id_u32(id,n) \ | 290 | #define ata_id_u32(id,n) \ |
| @@ -272,6 +295,8 @@ struct ata_taskfile { | |||
| 272 | ((u64) (id)[(n) + 1] << 16) | \ | 295 | ((u64) (id)[(n) + 1] << 16) | \ |
| 273 | ((u64) (id)[(n) + 0]) ) | 296 | ((u64) (id)[(n) + 0]) ) |
| 274 | 297 | ||
| 298 | #define ata_id_cdb_intr(id) (((id)[0] & 0x60) == 0x20) | ||
| 299 | |||
| 275 | static inline unsigned int ata_id_major_version(const u16 *id) | 300 | static inline unsigned int ata_id_major_version(const u16 *id) |
| 276 | { | 301 | { |
| 277 | unsigned int mver; | 302 | unsigned int mver; |
| @@ -311,6 +336,15 @@ static inline int is_atapi_taskfile(const struct ata_taskfile *tf) | |||
| 311 | (tf->protocol == ATA_PROT_ATAPI_DMA); | 336 | (tf->protocol == ATA_PROT_ATAPI_DMA); |
| 312 | } | 337 | } |
| 313 | 338 | ||
| 339 | static inline int is_multi_taskfile(struct ata_taskfile *tf) | ||
| 340 | { | ||
| 341 | return (tf->command == ATA_CMD_READ_MULTI) || | ||
| 342 | (tf->command == ATA_CMD_WRITE_MULTI) || | ||
| 343 | (tf->command == ATA_CMD_READ_MULTI_EXT) || | ||
| 344 | (tf->command == ATA_CMD_WRITE_MULTI_EXT) || | ||
| 345 | (tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT); | ||
| 346 | } | ||
| 347 | |||
| 314 | static inline int ata_ok(u8 status) | 348 | static inline int ata_ok(u8 status) |
| 315 | { | 349 | { |
| 316 | return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR)) | 350 | return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR)) |
