aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/ata.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/ata.h')
-rw-r--r--include/linux/ata.h155
1 files changed, 109 insertions, 46 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h
index 1c622e2b0504..1ce19c1ef0e9 100644
--- a/include/linux/ata.h
+++ b/include/linux/ata.h
@@ -46,18 +46,48 @@ enum {
46 ATA_MAX_SECTORS_TAPE = 65535, 46 ATA_MAX_SECTORS_TAPE = 65535,
47 47
48 ATA_ID_WORDS = 256, 48 ATA_ID_WORDS = 256,
49 ATA_ID_CONFIG = 0,
50 ATA_ID_CYLS = 1,
51 ATA_ID_HEADS = 3,
52 ATA_ID_SECTORS = 6,
49 ATA_ID_SERNO = 10, 53 ATA_ID_SERNO = 10,
54 ATA_ID_BUF_SIZE = 21,
50 ATA_ID_FW_REV = 23, 55 ATA_ID_FW_REV = 23,
51 ATA_ID_PROD = 27, 56 ATA_ID_PROD = 27,
57 ATA_ID_MAX_MULTSECT = 47,
58 ATA_ID_DWORD_IO = 48,
59 ATA_ID_CAPABILITY = 49,
52 ATA_ID_OLD_PIO_MODES = 51, 60 ATA_ID_OLD_PIO_MODES = 51,
61 ATA_ID_OLD_DMA_MODES = 52,
53 ATA_ID_FIELD_VALID = 53, 62 ATA_ID_FIELD_VALID = 53,
63 ATA_ID_CUR_CYLS = 54,
64 ATA_ID_CUR_HEADS = 55,
65 ATA_ID_CUR_SECTORS = 56,
66 ATA_ID_MULTSECT = 59,
67 ATA_ID_LBA_CAPACITY = 60,
68 ATA_ID_SWDMA_MODES = 62,
54 ATA_ID_MWDMA_MODES = 63, 69 ATA_ID_MWDMA_MODES = 63,
55 ATA_ID_PIO_MODES = 64, 70 ATA_ID_PIO_MODES = 64,
56 ATA_ID_EIDE_DMA_MIN = 65, 71 ATA_ID_EIDE_DMA_MIN = 65,
72 ATA_ID_EIDE_DMA_TIME = 66,
57 ATA_ID_EIDE_PIO = 67, 73 ATA_ID_EIDE_PIO = 67,
58 ATA_ID_EIDE_PIO_IORDY = 68, 74 ATA_ID_EIDE_PIO_IORDY = 68,
59 ATA_ID_UDMA_MODES = 88, 75 ATA_ID_QUEUE_DEPTH = 75,
60 ATA_ID_MAJOR_VER = 80, 76 ATA_ID_MAJOR_VER = 80,
77 ATA_ID_COMMAND_SET_1 = 82,
78 ATA_ID_COMMAND_SET_2 = 83,
79 ATA_ID_CFSSE = 84,
80 ATA_ID_CFS_ENABLE_1 = 85,
81 ATA_ID_CFS_ENABLE_2 = 86,
82 ATA_ID_CSF_DEFAULT = 87,
83 ATA_ID_UDMA_MODES = 88,
84 ATA_ID_HW_CONFIG = 93,
85 ATA_ID_SPG = 98,
86 ATA_ID_LBA_CAPACITY_2 = 100,
87 ATA_ID_LAST_LUN = 126,
88 ATA_ID_DLF = 128,
89 ATA_ID_CSFO = 129,
90 ATA_ID_CFA_POWER = 160,
61 ATA_ID_PIO4 = (1 << 1), 91 ATA_ID_PIO4 = (1 << 1),
62 92
63 ATA_ID_SERNO_LEN = 20, 93 ATA_ID_SERNO_LEN = 20,
@@ -123,13 +153,26 @@ enum {
123 ATA_BUSY = (1 << 7), /* BSY status bit */ 153 ATA_BUSY = (1 << 7), /* BSY status bit */
124 ATA_DRDY = (1 << 6), /* device ready */ 154 ATA_DRDY = (1 << 6), /* device ready */
125 ATA_DF = (1 << 5), /* device fault */ 155 ATA_DF = (1 << 5), /* device fault */
156 ATA_DSC = (1 << 4), /* drive seek complete */
126 ATA_DRQ = (1 << 3), /* data request i/o */ 157 ATA_DRQ = (1 << 3), /* data request i/o */
158 ATA_CORR = (1 << 2), /* corrected data error */
159 ATA_IDX = (1 << 1), /* index */
127 ATA_ERR = (1 << 0), /* have an error */ 160 ATA_ERR = (1 << 0), /* have an error */
128 ATA_SRST = (1 << 2), /* software reset */ 161 ATA_SRST = (1 << 2), /* software reset */
129 ATA_ICRC = (1 << 7), /* interface CRC error */ 162 ATA_ICRC = (1 << 7), /* interface CRC error */
163 ATA_BBK = ATA_ICRC, /* pre-EIDE: block marked bad */
130 ATA_UNC = (1 << 6), /* uncorrectable media error */ 164 ATA_UNC = (1 << 6), /* uncorrectable media error */
165 ATA_MC = (1 << 5), /* media changed */
131 ATA_IDNF = (1 << 4), /* ID not found */ 166 ATA_IDNF = (1 << 4), /* ID not found */
167 ATA_MCR = (1 << 3), /* media change requested */
132 ATA_ABORTED = (1 << 2), /* command aborted */ 168 ATA_ABORTED = (1 << 2), /* command aborted */
169 ATA_TRK0NF = (1 << 1), /* track 0 not found */
170 ATA_AMNF = (1 << 0), /* address mark not found */
171 ATAPI_LFS = 0xF0, /* last failed sense */
172 ATAPI_EOM = ATA_TRK0NF, /* end of media */
173 ATAPI_ILI = ATA_AMNF, /* illegal length indication */
174 ATAPI_IO = (1 << 1),
175 ATAPI_COD = (1 << 0),
133 176
134 /* ATA command block registers */ 177 /* ATA command block registers */
135 ATA_REG_DATA = 0x00, 178 ATA_REG_DATA = 0x00,
@@ -192,6 +235,13 @@ enum {
192 ATA_CMD_PMP_WRITE = 0xE8, 235 ATA_CMD_PMP_WRITE = 0xE8,
193 ATA_CMD_CONF_OVERLAY = 0xB1, 236 ATA_CMD_CONF_OVERLAY = 0xB1,
194 ATA_CMD_SEC_FREEZE_LOCK = 0xF5, 237 ATA_CMD_SEC_FREEZE_LOCK = 0xF5,
238 ATA_CMD_SMART = 0xB0,
239 ATA_CMD_MEDIA_LOCK = 0xDE,
240 ATA_CMD_MEDIA_UNLOCK = 0xDF,
241 /* marked obsolete in the ATA/ATAPI-7 spec */
242 ATA_CMD_RESTORE = 0x10,
243 /* EXABYTE specific */
244 ATA_EXABYTE_ENABLE_NEST = 0xF0,
195 245
196 /* READ_LOG_EXT pages */ 246 /* READ_LOG_EXT pages */
197 ATA_LOG_SATA_NCQ = 0x10, 247 ATA_LOG_SATA_NCQ = 0x10,
@@ -232,6 +282,10 @@ enum {
232 SETFEATURES_WC_ON = 0x02, /* Enable write cache */ 282 SETFEATURES_WC_ON = 0x02, /* Enable write cache */
233 SETFEATURES_WC_OFF = 0x82, /* Disable write cache */ 283 SETFEATURES_WC_OFF = 0x82, /* Disable write cache */
234 284
285 /* Enable/Disable Automatic Acoustic Management */
286 SETFEATURES_AAM_ON = 0x42,
287 SETFEATURES_AAM_OFF = 0xC2,
288
235 SETFEATURES_SPINUP = 0x07, /* Spin-up drive */ 289 SETFEATURES_SPINUP = 0x07, /* Spin-up drive */
236 290
237 SETFEATURES_SATA_ENABLE = 0x10, /* Enable use of SATA feature */ 291 SETFEATURES_SATA_ENABLE = 0x10, /* Enable use of SATA feature */
@@ -254,6 +308,15 @@ enum {
254 ATA_DCO_IDENTIFY = 0xC2, 308 ATA_DCO_IDENTIFY = 0xC2,
255 ATA_DCO_SET = 0xC3, 309 ATA_DCO_SET = 0xC3,
256 310
311 /* feature values for SMART */
312 ATA_SMART_ENABLE = 0xD8,
313 ATA_SMART_READ_VALUES = 0xD0,
314 ATA_SMART_READ_THRESHOLDS = 0xD1,
315
316 /* password used in LBA Mid / LBA High for executing SMART commands */
317 ATA_SMART_LBAM_PASS = 0x4F,
318 ATA_SMART_LBAH_PASS = 0xC2,
319
257 /* ATAPI stuff */ 320 /* ATAPI stuff */
258 ATAPI_PKT_DMA = (1 << 0), 321 ATAPI_PKT_DMA = (1 << 0),
259 ATAPI_DMADIR = (1 << 2), /* ATAPI data dir: 322 ATAPI_DMADIR = (1 << 2), /* ATAPI data dir:
@@ -438,17 +501,17 @@ static inline int ata_is_data(u8 prot)
438/* 501/*
439 * id tests 502 * id tests
440 */ 503 */
441#define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0) 504#define ata_id_is_ata(id) (((id)[ATA_ID_CONFIG] & (1 << 15)) == 0)
442#define ata_id_has_lba(id) ((id)[49] & (1 << 9)) 505#define ata_id_has_lba(id) ((id)[ATA_ID_CAPABILITY] & (1 << 9))
443#define ata_id_has_dma(id) ((id)[49] & (1 << 8)) 506#define ata_id_has_dma(id) ((id)[ATA_ID_CAPABILITY] & (1 << 8))
444#define ata_id_has_ncq(id) ((id)[76] & (1 << 8)) 507#define ata_id_has_ncq(id) ((id)[76] & (1 << 8))
445#define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1) 508#define ata_id_queue_depth(id) (((id)[ATA_ID_QUEUE_DEPTH] & 0x1f) + 1)
446#define ata_id_removeable(id) ((id)[0] & (1 << 7)) 509#define ata_id_removeable(id) ((id)[ATA_ID_CONFIG] & (1 << 7))
447#define ata_id_has_atapi_AN(id) \ 510#define ata_id_has_atapi_AN(id) \
448 ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \ 511 ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \
449 ((id)[78] & (1 << 5)) ) 512 ((id)[78] & (1 << 5)) )
450#define ata_id_iordy_disable(id) ((id)[49] & (1 << 10)) 513#define ata_id_iordy_disable(id) ((id)[ATA_ID_CAPABILITY] & (1 << 10))
451#define ata_id_has_iordy(id) ((id)[49] & (1 << 11)) 514#define ata_id_has_iordy(id) ((id)[ATA_ID_CAPABILITY] & (1 << 11))
452#define ata_id_u32(id,n) \ 515#define ata_id_u32(id,n) \
453 (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)])) 516 (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
454#define ata_id_u64(id,n) \ 517#define ata_id_u64(id,n) \
@@ -457,7 +520,7 @@ static inline int ata_is_data(u8 prot)
457 ((u64) (id)[(n) + 1] << 16) | \ 520 ((u64) (id)[(n) + 1] << 16) | \
458 ((u64) (id)[(n) + 0]) ) 521 ((u64) (id)[(n) + 0]) )
459 522
460#define ata_id_cdb_intr(id) (((id)[0] & 0x60) == 0x20) 523#define ata_id_cdb_intr(id) (((id)[ATA_ID_CONFIG] & 0x60) == 0x20)
461 524
462static inline bool ata_id_has_hipm(const u16 *id) 525static inline bool ata_id_has_hipm(const u16 *id)
463{ 526{
@@ -482,75 +545,75 @@ static inline bool ata_id_has_dipm(const u16 *id)
482 545
483static inline int ata_id_has_fua(const u16 *id) 546static inline int ata_id_has_fua(const u16 *id)
484{ 547{
485 if ((id[84] & 0xC000) != 0x4000) 548 if ((id[ATA_ID_CFSSE] & 0xC000) != 0x4000)
486 return 0; 549 return 0;
487 return id[84] & (1 << 6); 550 return id[ATA_ID_CFSSE] & (1 << 6);
488} 551}
489 552
490static inline int ata_id_has_flush(const u16 *id) 553static inline int ata_id_has_flush(const u16 *id)
491{ 554{
492 if ((id[83] & 0xC000) != 0x4000) 555 if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
493 return 0; 556 return 0;
494 return id[83] & (1 << 12); 557 return id[ATA_ID_COMMAND_SET_2] & (1 << 12);
495} 558}
496 559
497static inline int ata_id_has_flush_ext(const u16 *id) 560static inline int ata_id_has_flush_ext(const u16 *id)
498{ 561{
499 if ((id[83] & 0xC000) != 0x4000) 562 if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
500 return 0; 563 return 0;
501 return id[83] & (1 << 13); 564 return id[ATA_ID_COMMAND_SET_2] & (1 << 13);
502} 565}
503 566
504static inline int ata_id_has_lba48(const u16 *id) 567static inline int ata_id_has_lba48(const u16 *id)
505{ 568{
506 if ((id[83] & 0xC000) != 0x4000) 569 if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
507 return 0; 570 return 0;
508 if (!ata_id_u64(id, 100)) 571 if (!ata_id_u64(id, ATA_ID_LBA_CAPACITY_2))
509 return 0; 572 return 0;
510 return id[83] & (1 << 10); 573 return id[ATA_ID_COMMAND_SET_2] & (1 << 10);
511} 574}
512 575
513static inline int ata_id_hpa_enabled(const u16 *id) 576static inline int ata_id_hpa_enabled(const u16 *id)
514{ 577{
515 /* Yes children, word 83 valid bits cover word 82 data */ 578 /* Yes children, word 83 valid bits cover word 82 data */
516 if ((id[83] & 0xC000) != 0x4000) 579 if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
517 return 0; 580 return 0;
518 /* And 87 covers 85-87 */ 581 /* And 87 covers 85-87 */
519 if ((id[87] & 0xC000) != 0x4000) 582 if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
520 return 0; 583 return 0;
521 /* Check command sets enabled as well as supported */ 584 /* Check command sets enabled as well as supported */
522 if ((id[85] & ( 1 << 10)) == 0) 585 if ((id[ATA_ID_CFS_ENABLE_1] & (1 << 10)) == 0)
523 return 0; 586 return 0;
524 return id[82] & (1 << 10); 587 return id[ATA_ID_COMMAND_SET_1] & (1 << 10);
525} 588}
526 589
527static inline int ata_id_has_wcache(const u16 *id) 590static inline int ata_id_has_wcache(const u16 *id)
528{ 591{
529 /* Yes children, word 83 valid bits cover word 82 data */ 592 /* Yes children, word 83 valid bits cover word 82 data */
530 if ((id[83] & 0xC000) != 0x4000) 593 if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
531 return 0; 594 return 0;
532 return id[82] & (1 << 5); 595 return id[ATA_ID_COMMAND_SET_1] & (1 << 5);
533} 596}
534 597
535static inline int ata_id_has_pm(const u16 *id) 598static inline int ata_id_has_pm(const u16 *id)
536{ 599{
537 if ((id[83] & 0xC000) != 0x4000) 600 if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000)
538 return 0; 601 return 0;
539 return id[82] & (1 << 3); 602 return id[ATA_ID_COMMAND_SET_1] & (1 << 3);
540} 603}
541 604
542static inline int ata_id_rahead_enabled(const u16 *id) 605static inline int ata_id_rahead_enabled(const u16 *id)
543{ 606{
544 if ((id[87] & 0xC000) != 0x4000) 607 if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
545 return 0; 608 return 0;
546 return id[85] & (1 << 6); 609 return id[ATA_ID_CFS_ENABLE_1] & (1 << 6);
547} 610}
548 611
549static inline int ata_id_wcache_enabled(const u16 *id) 612static inline int ata_id_wcache_enabled(const u16 *id)
550{ 613{
551 if ((id[87] & 0xC000) != 0x4000) 614 if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000)
552 return 0; 615 return 0;
553 return id[85] & (1 << 5); 616 return id[ATA_ID_CFS_ENABLE_1] & (1 << 5);
554} 617}
555 618
556/** 619/**
@@ -581,7 +644,7 @@ static inline unsigned int ata_id_major_version(const u16 *id)
581 644
582static inline int ata_id_is_sata(const u16 *id) 645static inline int ata_id_is_sata(const u16 *id)
583{ 646{
584 return ata_id_major_version(id) >= 5 && id[93] == 0; 647 return ata_id_major_version(id) >= 5 && id[ATA_ID_HW_CONFIG] == 0;
585} 648}
586 649
587static inline int ata_id_has_tpm(const u16 *id) 650static inline int ata_id_has_tpm(const u16 *id)
@@ -599,7 +662,7 @@ static inline int ata_id_has_dword_io(const u16 *id)
599 /* ATA 8 reuses this flag for "trusted" computing */ 662 /* ATA 8 reuses this flag for "trusted" computing */
600 if (ata_id_major_version(id) > 7) 663 if (ata_id_major_version(id) > 7)
601 return 0; 664 return 0;
602 if (id[48] & (1 << 0)) 665 if (id[ATA_ID_DWORD_IO] & (1 << 0))
603 return 1; 666 return 1;
604 return 0; 667 return 0;
605} 668}
@@ -608,22 +671,22 @@ static inline int ata_id_current_chs_valid(const u16 *id)
608{ 671{
609 /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command 672 /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
610 has not been issued to the device then the values of 673 has not been issued to the device then the values of
611 id[54] to id[56] are vendor specific. */ 674 id[ATA_ID_CUR_CYLS] to id[ATA_ID_CUR_SECTORS] are vendor specific. */
612 return (id[53] & 0x01) && /* Current translation valid */ 675 return (id[ATA_ID_FIELD_VALID] & 1) && /* Current translation valid */
613 id[54] && /* cylinders in current translation */ 676 id[ATA_ID_CUR_CYLS] && /* cylinders in current translation */
614 id[55] && /* heads in current translation */ 677 id[ATA_ID_CUR_HEADS] && /* heads in current translation */
615 id[55] <= 16 && 678 id[ATA_ID_CUR_HEADS] <= 16 &&
616 id[56]; /* sectors in current translation */ 679 id[ATA_ID_CUR_SECTORS]; /* sectors in current translation */
617} 680}
618 681
619static inline int ata_id_is_cfa(const u16 *id) 682static inline int ata_id_is_cfa(const u16 *id)
620{ 683{
621 u16 v = id[0]; 684 if (id[ATA_ID_CONFIG] == 0x848A) /* Standard CF */
622 if (v == 0x848A) /* Standard CF */
623 return 1; 685 return 1;
624 /* Could be CF hiding as standard ATA */ 686 /* Could be CF hiding as standard ATA */
625 if (ata_id_major_version(id) >= 3 && id[82] != 0xFFFF && 687 if (ata_id_major_version(id) >= 3 &&
626 (id[82] & ( 1 << 2))) 688 id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
689 (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
627 return 1; 690 return 1;
628 return 0; 691 return 0;
629} 692}
@@ -632,21 +695,21 @@ static inline int ata_drive_40wire(const u16 *dev_id)
632{ 695{
633 if (ata_id_is_sata(dev_id)) 696 if (ata_id_is_sata(dev_id))
634 return 0; /* SATA */ 697 return 0; /* SATA */
635 if ((dev_id[93] & 0xE000) == 0x6000) 698 if ((dev_id[ATA_ID_HW_CONFIG] & 0xE000) == 0x6000)
636 return 0; /* 80 wire */ 699 return 0; /* 80 wire */
637 return 1; 700 return 1;
638} 701}
639 702
640static inline int ata_drive_40wire_relaxed(const u16 *dev_id) 703static inline int ata_drive_40wire_relaxed(const u16 *dev_id)
641{ 704{
642 if ((dev_id[93] & 0x2000) == 0x2000) 705 if ((dev_id[ATA_ID_HW_CONFIG] & 0x2000) == 0x2000)
643 return 0; /* 80 wire */ 706 return 0; /* 80 wire */
644 return 1; 707 return 1;
645} 708}
646 709
647static inline int atapi_cdb_len(const u16 *dev_id) 710static inline int atapi_cdb_len(const u16 *dev_id)
648{ 711{
649 u16 tmp = dev_id[0] & 0x3; 712 u16 tmp = dev_id[ATA_ID_CONFIG] & 0x3;
650 switch (tmp) { 713 switch (tmp) {
651 case 0: return 12; 714 case 0: return 12;
652 case 1: return 16; 715 case 1: return 16;
@@ -656,7 +719,7 @@ static inline int atapi_cdb_len(const u16 *dev_id)
656 719
657static inline int atapi_command_packet_set(const u16 *dev_id) 720static inline int atapi_command_packet_set(const u16 *dev_id)
658{ 721{
659 return (dev_id[0] >> 8) & 0x1f; 722 return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f;
660} 723}
661 724
662static inline int atapi_id_dmadir(const u16 *dev_id) 725static inline int atapi_id_dmadir(const u16 *dev_id)