diff options
Diffstat (limited to 'include/linux/ata.h')
| -rw-r--r-- | include/linux/ata.h | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index 3671af869696..d89441907024 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -40,6 +40,8 @@ enum { | |||
| 40 | ATA_MAX_DEVICES = 2, /* per bus/port */ | 40 | ATA_MAX_DEVICES = 2, /* per bus/port */ |
| 41 | ATA_MAX_PRD = 256, /* we could make these 256/256 */ | 41 | ATA_MAX_PRD = 256, /* we could make these 256/256 */ |
| 42 | ATA_SECT_SIZE = 512, | 42 | ATA_SECT_SIZE = 512, |
| 43 | ATA_MAX_SECTORS = 256, | ||
| 44 | ATA_MAX_SECTORS_LBA48 = 65535,/* TODO: 65536? */ | ||
| 43 | 45 | ||
| 44 | ATA_ID_WORDS = 256, | 46 | ATA_ID_WORDS = 256, |
| 45 | ATA_ID_SERNO_OFS = 10, | 47 | ATA_ID_SERNO_OFS = 10, |
| @@ -168,12 +170,16 @@ enum { | |||
| 168 | XFER_UDMA_2 = 0x42, | 170 | XFER_UDMA_2 = 0x42, |
| 169 | XFER_UDMA_1 = 0x41, | 171 | XFER_UDMA_1 = 0x41, |
| 170 | XFER_UDMA_0 = 0x40, | 172 | XFER_UDMA_0 = 0x40, |
| 173 | XFER_MW_DMA_4 = 0x24, /* CFA only */ | ||
| 174 | XFER_MW_DMA_3 = 0x23, /* CFA only */ | ||
| 171 | XFER_MW_DMA_2 = 0x22, | 175 | XFER_MW_DMA_2 = 0x22, |
| 172 | XFER_MW_DMA_1 = 0x21, | 176 | XFER_MW_DMA_1 = 0x21, |
| 173 | XFER_MW_DMA_0 = 0x20, | 177 | XFER_MW_DMA_0 = 0x20, |
| 174 | XFER_SW_DMA_2 = 0x12, | 178 | XFER_SW_DMA_2 = 0x12, |
| 175 | XFER_SW_DMA_1 = 0x11, | 179 | XFER_SW_DMA_1 = 0x11, |
| 176 | XFER_SW_DMA_0 = 0x10, | 180 | XFER_SW_DMA_0 = 0x10, |
| 181 | XFER_PIO_6 = 0x0E, /* CFA only */ | ||
| 182 | XFER_PIO_5 = 0x0D, /* CFA only */ | ||
| 177 | XFER_PIO_4 = 0x0C, | 183 | XFER_PIO_4 = 0x0C, |
| 178 | XFER_PIO_3 = 0x0B, | 184 | XFER_PIO_3 = 0x0B, |
| 179 | XFER_PIO_2 = 0x0A, | 185 | XFER_PIO_2 = 0x0A, |
| @@ -272,7 +278,6 @@ struct ata_taskfile { | |||
| 272 | }; | 278 | }; |
| 273 | 279 | ||
| 274 | #define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0) | 280 | #define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0) |
| 275 | #define ata_id_is_cfa(id) ((id)[0] == 0x848A) | ||
| 276 | #define ata_id_is_sata(id) ((id)[93] == 0) | 281 | #define ata_id_is_sata(id) ((id)[93] == 0) |
| 277 | #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6)) | 282 | #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6)) |
| 278 | #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5)) | 283 | #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5)) |
| @@ -304,6 +309,9 @@ static inline unsigned int ata_id_major_version(const u16 *id) | |||
| 304 | { | 309 | { |
| 305 | unsigned int mver; | 310 | unsigned int mver; |
| 306 | 311 | ||
| 312 | if (id[ATA_ID_MAJOR_VER] == 0xFFFF) | ||
| 313 | return 0; | ||
| 314 | |||
| 307 | for (mver = 14; mver >= 1; mver--) | 315 | for (mver = 14; mver >= 1; mver--) |
| 308 | if (id[ATA_ID_MAJOR_VER] & (1 << mver)) | 316 | if (id[ATA_ID_MAJOR_VER] & (1 << mver)) |
| 309 | break; | 317 | break; |
| @@ -312,8 +320,8 @@ static inline unsigned int ata_id_major_version(const u16 *id) | |||
| 312 | 320 | ||
| 313 | static inline int ata_id_current_chs_valid(const u16 *id) | 321 | static inline int ata_id_current_chs_valid(const u16 *id) |
| 314 | { | 322 | { |
| 315 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command | 323 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command |
| 316 | has not been issued to the device then the values of | 324 | has not been issued to the device then the values of |
| 317 | id[54] to id[56] are vendor specific. */ | 325 | id[54] to id[56] are vendor specific. */ |
| 318 | return (id[53] & 0x01) && /* Current translation valid */ | 326 | return (id[53] & 0x01) && /* Current translation valid */ |
| 319 | id[54] && /* cylinders in current translation */ | 327 | id[54] && /* cylinders in current translation */ |
| @@ -322,6 +330,18 @@ static inline int ata_id_current_chs_valid(const u16 *id) | |||
| 322 | id[56]; /* sectors in current translation */ | 330 | id[56]; /* sectors in current translation */ |
| 323 | } | 331 | } |
| 324 | 332 | ||
| 333 | static inline int ata_id_is_cfa(const u16 *id) | ||
| 334 | { | ||
| 335 | u16 v = id[0]; | ||
| 336 | if (v == 0x848A) /* Standard CF */ | ||
| 337 | return 1; | ||
| 338 | /* Could be CF hiding as standard ATA */ | ||
| 339 | if (ata_id_major_version(id) >= 3 && id[82] != 0xFFFF && | ||
| 340 | (id[82] & ( 1 << 2))) | ||
| 341 | return 1; | ||
| 342 | return 0; | ||
| 343 | } | ||
| 344 | |||
| 325 | static inline int atapi_cdb_len(const u16 *dev_id) | 345 | static inline int atapi_cdb_len(const u16 *dev_id) |
| 326 | { | 346 | { |
| 327 | u16 tmp = dev_id[0] & 0x3; | 347 | u16 tmp = dev_id[0] & 0x3; |
