diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2006-08-10 13:52:12 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-08-14 14:04:37 -0400 |
commit | b352e57dc3bb5033996adaa67c2f69b795eddd39 (patch) | |
tree | 2bfec75e331452c84a591b6fad1e1407b22a1922 /include/linux/ata.h | |
parent | cea0d336e7e139becc9432499e0ba8234ffbed5f (diff) |
[PATCH] libata: Add CompactFlash support
The CFA world has some additional rules and drive modes we need to support for
newer expansion cards and on embedded boxes
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'include/linux/ata.h')
-rw-r--r-- | include/linux/ata.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index 8d708a3d505b..991b858acc30 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -170,12 +170,16 @@ enum { | |||
170 | XFER_UDMA_2 = 0x42, | 170 | XFER_UDMA_2 = 0x42, |
171 | XFER_UDMA_1 = 0x41, | 171 | XFER_UDMA_1 = 0x41, |
172 | 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 */ | ||
173 | XFER_MW_DMA_2 = 0x22, | 175 | XFER_MW_DMA_2 = 0x22, |
174 | XFER_MW_DMA_1 = 0x21, | 176 | XFER_MW_DMA_1 = 0x21, |
175 | XFER_MW_DMA_0 = 0x20, | 177 | XFER_MW_DMA_0 = 0x20, |
176 | XFER_SW_DMA_2 = 0x12, | 178 | XFER_SW_DMA_2 = 0x12, |
177 | XFER_SW_DMA_1 = 0x11, | 179 | XFER_SW_DMA_1 = 0x11, |
178 | 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 */ | ||
179 | XFER_PIO_4 = 0x0C, | 183 | XFER_PIO_4 = 0x0C, |
180 | XFER_PIO_3 = 0x0B, | 184 | XFER_PIO_3 = 0x0B, |
181 | XFER_PIO_2 = 0x0A, | 185 | XFER_PIO_2 = 0x0A, |
@@ -274,7 +278,6 @@ struct ata_taskfile { | |||
274 | }; | 278 | }; |
275 | 279 | ||
276 | #define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0) | 280 | #define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0) |
277 | #define ata_id_is_cfa(id) ((id)[0] == 0x848A) | ||
278 | #define ata_id_is_sata(id) ((id)[93] == 0) | 281 | #define ata_id_is_sata(id) ((id)[93] == 0) |
279 | #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6)) | 282 | #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6)) |
280 | #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5)) | 283 | #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5)) |
@@ -306,6 +309,9 @@ static inline unsigned int ata_id_major_version(const u16 *id) | |||
306 | { | 309 | { |
307 | unsigned int mver; | 310 | unsigned int mver; |
308 | 311 | ||
312 | if (id[ATA_ID_MAJOR_VER] == 0xFFFF) | ||
313 | return 0; | ||
314 | |||
309 | for (mver = 14; mver >= 1; mver--) | 315 | for (mver = 14; mver >= 1; mver--) |
310 | if (id[ATA_ID_MAJOR_VER] & (1 << mver)) | 316 | if (id[ATA_ID_MAJOR_VER] & (1 << mver)) |
311 | break; | 317 | break; |
@@ -324,6 +330,18 @@ static inline int ata_id_current_chs_valid(const u16 *id) | |||
324 | id[56]; /* sectors in current translation */ | 330 | id[56]; /* sectors in current translation */ |
325 | } | 331 | } |
326 | 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 | |||
327 | static inline int atapi_cdb_len(const u16 *dev_id) | 345 | static inline int atapi_cdb_len(const u16 *dev_id) |
328 | { | 346 | { |
329 | u16 tmp = dev_id[0] & 0x3; | 347 | u16 tmp = dev_id[0] & 0x3; |