aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2006-08-10 13:52:12 -0400
committerJeff Garzik <jeff@garzik.org>2006-08-14 14:04:37 -0400
commitb352e57dc3bb5033996adaa67c2f69b795eddd39 (patch)
tree2bfec75e331452c84a591b6fad1e1407b22a1922 /include/linux
parentcea0d336e7e139becc9432499e0ba8234ffbed5f (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')
-rw-r--r--include/linux/ata.h20
-rw-r--r--include/linux/libata.h4
2 files changed, 21 insertions, 3 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
333static 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
327static inline int atapi_cdb_len(const u16 *dev_id) 345static 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;
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 060da736b3a8..806682603ac5 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -225,8 +225,8 @@ enum {
225 /* encoding various smaller bitmaps into a single 225 /* encoding various smaller bitmaps into a single
226 * unsigned int bitmap 226 * unsigned int bitmap
227 */ 227 */
228 ATA_BITS_PIO = 5, 228 ATA_BITS_PIO = 7,
229 ATA_BITS_MWDMA = 3, 229 ATA_BITS_MWDMA = 5,
230 ATA_BITS_UDMA = 8, 230 ATA_BITS_UDMA = 8,
231 231
232 ATA_SHIFT_PIO = 0, 232 ATA_SHIFT_PIO = 0,