diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/ata.h | 46 | ||||
| -rw-r--r-- | include/linux/libata.h | 65 |
2 files changed, 82 insertions, 29 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index fe6e681a9d74..0c4929fa34d3 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -89,6 +89,7 @@ enum { | |||
| 89 | ATA_ID_SPG = 98, | 89 | ATA_ID_SPG = 98, |
| 90 | ATA_ID_LBA_CAPACITY_2 = 100, | 90 | ATA_ID_LBA_CAPACITY_2 = 100, |
| 91 | ATA_ID_SECTOR_SIZE = 106, | 91 | ATA_ID_SECTOR_SIZE = 106, |
| 92 | ATA_ID_LOGICAL_SECTOR_SIZE = 117, /* and 118 */ | ||
| 92 | ATA_ID_LAST_LUN = 126, | 93 | ATA_ID_LAST_LUN = 126, |
| 93 | ATA_ID_DLF = 128, | 94 | ATA_ID_DLF = 128, |
| 94 | ATA_ID_CSFO = 129, | 95 | ATA_ID_CSFO = 129, |
| @@ -640,16 +641,49 @@ static inline int ata_id_flush_ext_enabled(const u16 *id) | |||
| 640 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; | 641 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; |
| 641 | } | 642 | } |
| 642 | 643 | ||
| 643 | static inline int ata_id_has_large_logical_sectors(const u16 *id) | 644 | static inline u32 ata_id_logical_sector_size(const u16 *id) |
| 644 | { | 645 | { |
| 645 | if ((id[ATA_ID_SECTOR_SIZE] & 0xc000) != 0x4000) | 646 | /* T13/1699-D Revision 6a, Sep 6, 2008. Page 128. |
| 646 | return 0; | 647 | * IDENTIFY DEVICE data, word 117-118. |
| 647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); | 648 | * 0xd000 ignores bit 13 (logical:physical > 1) |
| 649 | */ | ||
| 650 | if ((id[ATA_ID_SECTOR_SIZE] & 0xd000) == 0x5000) | ||
| 651 | return (((id[ATA_ID_LOGICAL_SECTOR_SIZE+1] << 16) | ||
| 652 | + id[ATA_ID_LOGICAL_SECTOR_SIZE]) * sizeof(u16)) ; | ||
| 653 | return ATA_SECT_SIZE; | ||
| 654 | } | ||
| 655 | |||
| 656 | static inline u8 ata_id_log2_per_physical_sector(const u16 *id) | ||
| 657 | { | ||
| 658 | /* T13/1699-D Revision 6a, Sep 6, 2008. Page 128. | ||
| 659 | * IDENTIFY DEVICE data, word 106. | ||
| 660 | * 0xe000 ignores bit 12 (logical sector > 512 bytes) | ||
| 661 | */ | ||
| 662 | if ((id[ATA_ID_SECTOR_SIZE] & 0xe000) == 0x6000) | ||
| 663 | return (id[ATA_ID_SECTOR_SIZE] & 0xf); | ||
| 664 | return 0; | ||
| 648 | } | 665 | } |
| 649 | 666 | ||
| 650 | static inline u16 ata_id_logical_per_physical_sectors(const u16 *id) | 667 | /* Offset of logical sectors relative to physical sectors. |
| 668 | * | ||
| 669 | * If device has more than one logical sector per physical sector | ||
| 670 | * (aka 512 byte emulation), vendors might offset the "sector 0" address | ||
| 671 | * so sector 63 is "naturally aligned" - e.g. FAT partition table. | ||
| 672 | * This avoids Read/Mod/Write penalties when using FAT partition table | ||
| 673 | * and updating "well aligned" (FS perspective) physical sectors on every | ||
| 674 | * transaction. | ||
| 675 | */ | ||
| 676 | static inline u16 ata_id_logical_sector_offset(const u16 *id, | ||
| 677 | u8 log2_per_phys) | ||
| 651 | { | 678 | { |
| 652 | return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf); | 679 | u16 word_209 = id[209]; |
| 680 | |||
| 681 | if ((log2_per_phys > 1) && (word_209 & 0xc000) == 0x4000) { | ||
| 682 | u16 first = word_209 & 0x3fff; | ||
| 683 | if (first > 0) | ||
| 684 | return (1 << log2_per_phys) - first; | ||
| 685 | } | ||
| 686 | return 0; | ||
| 653 | } | 687 | } |
| 654 | 688 | ||
| 655 | static inline int ata_id_has_lba48(const u16 *id) | 689 | static inline int ata_id_has_lba48(const u16 *id) |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 45fb2967b66d..15b77b8dc7e1 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <scsi/scsi_host.h> | 37 | #include <scsi/scsi_host.h> |
| 38 | #include <linux/acpi.h> | 38 | #include <linux/acpi.h> |
| 39 | #include <linux/cdrom.h> | 39 | #include <linux/cdrom.h> |
| 40 | #include <linux/sched.h> | ||
| 40 | 41 | ||
| 41 | /* | 42 | /* |
| 42 | * Define if arch has non-standard setup. This is a _PCI_ standard | 43 | * Define if arch has non-standard setup. This is a _PCI_ standard |
| @@ -172,6 +173,7 @@ enum { | |||
| 172 | ATA_LFLAG_NO_RETRY = (1 << 5), /* don't retry this link */ | 173 | ATA_LFLAG_NO_RETRY = (1 << 5), /* don't retry this link */ |
| 173 | ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */ | 174 | ATA_LFLAG_DISABLED = (1 << 6), /* link is disabled */ |
| 174 | ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */ | 175 | ATA_LFLAG_SW_ACTIVITY = (1 << 7), /* keep activity stats */ |
| 176 | ATA_LFLAG_NO_LPM = (1 << 8), /* disable LPM on this link */ | ||
| 175 | 177 | ||
| 176 | /* struct ata_port flags */ | 178 | /* struct ata_port flags */ |
| 177 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ | 179 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ |
| @@ -196,7 +198,7 @@ enum { | |||
| 196 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ | 198 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ |
| 197 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ | 199 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ |
| 198 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ | 200 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ |
| 199 | ATA_FLAG_IPM = (1 << 20), /* driver can handle IPM */ | 201 | ATA_FLAG_LPM = (1 << 20), /* driver can handle LPM */ |
| 200 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure | 202 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure |
| 201 | * management */ | 203 | * management */ |
| 202 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity | 204 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity |
| @@ -324,12 +326,11 @@ enum { | |||
| 324 | ATA_EH_HARDRESET = (1 << 2), /* meaningful only in ->prereset */ | 326 | ATA_EH_HARDRESET = (1 << 2), /* meaningful only in ->prereset */ |
| 325 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 327 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, |
| 326 | ATA_EH_ENABLE_LINK = (1 << 3), | 328 | ATA_EH_ENABLE_LINK = (1 << 3), |
| 327 | ATA_EH_LPM = (1 << 4), /* link power management action */ | ||
| 328 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ | 329 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ |
| 329 | 330 | ||
| 330 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, | 331 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, |
| 331 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | | 332 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | |
| 332 | ATA_EH_ENABLE_LINK | ATA_EH_LPM, | 333 | ATA_EH_ENABLE_LINK, |
| 333 | 334 | ||
| 334 | /* ata_eh_info->flags */ | 335 | /* ata_eh_info->flags */ |
| 335 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 336 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ |
| @@ -341,7 +342,7 @@ enum { | |||
| 341 | ATA_EHI_DID_HARDRESET = (1 << 17), /* already soft-reset this port */ | 342 | ATA_EHI_DID_HARDRESET = (1 << 17), /* already soft-reset this port */ |
| 342 | ATA_EHI_PRINTINFO = (1 << 18), /* print configuration info */ | 343 | ATA_EHI_PRINTINFO = (1 << 18), /* print configuration info */ |
| 343 | ATA_EHI_SETMODE = (1 << 19), /* configure transfer mode */ | 344 | ATA_EHI_SETMODE = (1 << 19), /* configure transfer mode */ |
| 344 | ATA_EHI_POST_SETMODE = (1 << 20), /* revaildating after setmode */ | 345 | ATA_EHI_POST_SETMODE = (1 << 20), /* revalidating after setmode */ |
| 345 | 346 | ||
| 346 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, | 347 | ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET, |
| 347 | 348 | ||
| @@ -377,7 +378,6 @@ enum { | |||
| 377 | ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ | 378 | ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ |
| 378 | ATA_HORKAGE_DISABLE = (1 << 5), /* Disable it */ | 379 | ATA_HORKAGE_DISABLE = (1 << 5), /* Disable it */ |
| 379 | ATA_HORKAGE_HPA_SIZE = (1 << 6), /* native size off by one */ | 380 | ATA_HORKAGE_HPA_SIZE = (1 << 6), /* native size off by one */ |
| 380 | ATA_HORKAGE_IPM = (1 << 7), /* Link PM problems */ | ||
| 381 | ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */ | 381 | ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */ |
| 382 | ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */ | 382 | ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */ |
| 383 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ | 383 | ATA_HORKAGE_BRIDGE_OK = (1 << 10), /* no bridge limits */ |
| @@ -464,6 +464,22 @@ enum ata_completion_errors { | |||
| 464 | AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */ | 464 | AC_ERR_NCQ = (1 << 10), /* marker for offending NCQ qc */ |
| 465 | }; | 465 | }; |
| 466 | 466 | ||
| 467 | /* | ||
| 468 | * Link power management policy: If you alter this, you also need to | ||
| 469 | * alter libata-scsi.c (for the ascii descriptions) | ||
| 470 | */ | ||
| 471 | enum ata_lpm_policy { | ||
| 472 | ATA_LPM_UNKNOWN, | ||
| 473 | ATA_LPM_MAX_POWER, | ||
| 474 | ATA_LPM_MED_POWER, | ||
| 475 | ATA_LPM_MIN_POWER, | ||
| 476 | }; | ||
| 477 | |||
| 478 | enum ata_lpm_hints { | ||
| 479 | ATA_LPM_EMPTY = (1 << 0), /* port empty/probing */ | ||
| 480 | ATA_LPM_HIPM = (1 << 1), /* may use HIPM */ | ||
| 481 | }; | ||
| 482 | |||
| 467 | /* forward declarations */ | 483 | /* forward declarations */ |
| 468 | struct scsi_device; | 484 | struct scsi_device; |
| 469 | struct ata_port_operations; | 485 | struct ata_port_operations; |
| @@ -478,16 +494,6 @@ typedef int (*ata_reset_fn_t)(struct ata_link *link, unsigned int *classes, | |||
| 478 | unsigned long deadline); | 494 | unsigned long deadline); |
| 479 | typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes); | 495 | typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes); |
| 480 | 496 | ||
| 481 | /* | ||
| 482 | * host pm policy: If you alter this, you also need to alter libata-scsi.c | ||
| 483 | * (for the ascii descriptions) | ||
| 484 | */ | ||
| 485 | enum link_pm { | ||
| 486 | NOT_AVAILABLE, | ||
| 487 | MIN_POWER, | ||
| 488 | MAX_PERFORMANCE, | ||
| 489 | MEDIUM_POWER, | ||
| 490 | }; | ||
| 491 | extern struct device_attribute dev_attr_link_power_management_policy; | 497 | extern struct device_attribute dev_attr_link_power_management_policy; |
| 492 | extern struct device_attribute dev_attr_unload_heads; | 498 | extern struct device_attribute dev_attr_unload_heads; |
| 493 | extern struct device_attribute dev_attr_em_message_type; | 499 | extern struct device_attribute dev_attr_em_message_type; |
| @@ -530,6 +536,10 @@ struct ata_host { | |||
| 530 | void *private_data; | 536 | void *private_data; |
| 531 | struct ata_port_operations *ops; | 537 | struct ata_port_operations *ops; |
| 532 | unsigned long flags; | 538 | unsigned long flags; |
| 539 | |||
| 540 | struct mutex eh_mutex; | ||
| 541 | struct task_struct *eh_owner; | ||
| 542 | |||
| 533 | #ifdef CONFIG_ATA_ACPI | 543 | #ifdef CONFIG_ATA_ACPI |
| 534 | acpi_handle acpi_handle; | 544 | acpi_handle acpi_handle; |
| 535 | #endif | 545 | #endif |
| @@ -560,13 +570,13 @@ struct ata_queued_cmd { | |||
| 560 | unsigned int extrabytes; | 570 | unsigned int extrabytes; |
| 561 | unsigned int curbytes; | 571 | unsigned int curbytes; |
| 562 | 572 | ||
| 563 | struct scatterlist *cursg; | ||
| 564 | unsigned int cursg_ofs; | ||
| 565 | |||
| 566 | struct scatterlist sgent; | 573 | struct scatterlist sgent; |
| 567 | 574 | ||
| 568 | struct scatterlist *sg; | 575 | struct scatterlist *sg; |
| 569 | 576 | ||
| 577 | struct scatterlist *cursg; | ||
| 578 | unsigned int cursg_ofs; | ||
| 579 | |||
| 570 | unsigned int err_mask; | 580 | unsigned int err_mask; |
| 571 | struct ata_taskfile result_tf; | 581 | struct ata_taskfile result_tf; |
| 572 | ata_qc_cb_t complete_fn; | 582 | ata_qc_cb_t complete_fn; |
| @@ -604,6 +614,7 @@ struct ata_device { | |||
| 604 | union acpi_object *gtf_cache; | 614 | union acpi_object *gtf_cache; |
| 605 | unsigned int gtf_filter; | 615 | unsigned int gtf_filter; |
| 606 | #endif | 616 | #endif |
| 617 | struct device tdev; | ||
| 607 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ | 618 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ |
| 608 | u64 n_sectors; /* size of device, if ATA */ | 619 | u64 n_sectors; /* size of device, if ATA */ |
| 609 | u64 n_native_sectors; /* native size, if ATA */ | 620 | u64 n_native_sectors; /* native size, if ATA */ |
| @@ -690,6 +701,7 @@ struct ata_link { | |||
| 690 | struct ata_port *ap; | 701 | struct ata_port *ap; |
| 691 | int pmp; /* port multiplier port # */ | 702 | int pmp; /* port multiplier port # */ |
| 692 | 703 | ||
| 704 | struct device tdev; | ||
| 693 | unsigned int active_tag; /* active tag on this link */ | 705 | unsigned int active_tag; /* active tag on this link */ |
| 694 | u32 sactive; /* active NCQ commands */ | 706 | u32 sactive; /* active NCQ commands */ |
| 695 | 707 | ||
| @@ -699,6 +711,7 @@ struct ata_link { | |||
| 699 | unsigned int hw_sata_spd_limit; | 711 | unsigned int hw_sata_spd_limit; |
| 700 | unsigned int sata_spd_limit; | 712 | unsigned int sata_spd_limit; |
| 701 | unsigned int sata_spd; /* current SATA PHY speed */ | 713 | unsigned int sata_spd; /* current SATA PHY speed */ |
| 714 | enum ata_lpm_policy lpm_policy; | ||
| 702 | 715 | ||
| 703 | /* record runtime error info, protected by host_set lock */ | 716 | /* record runtime error info, protected by host_set lock */ |
| 704 | struct ata_eh_info eh_info; | 717 | struct ata_eh_info eh_info; |
| @@ -707,6 +720,8 @@ struct ata_link { | |||
| 707 | 720 | ||
| 708 | struct ata_device device[ATA_MAX_DEVICES]; | 721 | struct ata_device device[ATA_MAX_DEVICES]; |
| 709 | }; | 722 | }; |
| 723 | #define ATA_LINK_CLEAR_BEGIN offsetof(struct ata_link, active_tag) | ||
| 724 | #define ATA_LINK_CLEAR_END offsetof(struct ata_link, device[0]) | ||
| 710 | 725 | ||
| 711 | struct ata_port { | 726 | struct ata_port { |
| 712 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ | 727 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ |
| @@ -752,6 +767,7 @@ struct ata_port { | |||
| 752 | struct ata_port_stats stats; | 767 | struct ata_port_stats stats; |
| 753 | struct ata_host *host; | 768 | struct ata_host *host; |
| 754 | struct device *dev; | 769 | struct device *dev; |
| 770 | struct device tdev; | ||
| 755 | 771 | ||
| 756 | struct mutex scsi_scan_mutex; | 772 | struct mutex scsi_scan_mutex; |
| 757 | struct delayed_work hotplug_task; | 773 | struct delayed_work hotplug_task; |
| @@ -767,7 +783,7 @@ struct ata_port { | |||
| 767 | 783 | ||
| 768 | pm_message_t pm_mesg; | 784 | pm_message_t pm_mesg; |
| 769 | int *pm_result; | 785 | int *pm_result; |
| 770 | enum link_pm pm_policy; | 786 | enum ata_lpm_policy target_lpm_policy; |
| 771 | 787 | ||
| 772 | struct timer_list fastdrain_timer; | 788 | struct timer_list fastdrain_timer; |
| 773 | unsigned long fastdrain_cnt; | 789 | unsigned long fastdrain_cnt; |
| @@ -833,8 +849,8 @@ struct ata_port_operations { | |||
| 833 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); | 849 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); |
| 834 | void (*pmp_attach)(struct ata_port *ap); | 850 | void (*pmp_attach)(struct ata_port *ap); |
| 835 | void (*pmp_detach)(struct ata_port *ap); | 851 | void (*pmp_detach)(struct ata_port *ap); |
| 836 | int (*enable_pm)(struct ata_port *ap, enum link_pm policy); | 852 | int (*set_lpm)(struct ata_link *link, enum ata_lpm_policy policy, |
| 837 | void (*disable_pm)(struct ata_port *ap); | 853 | unsigned hints); |
| 838 | 854 | ||
| 839 | /* | 855 | /* |
| 840 | * Start, stop, suspend and resume | 856 | * Start, stop, suspend and resume |
| @@ -946,6 +962,8 @@ extern int sata_link_debounce(struct ata_link *link, | |||
| 946 | const unsigned long *params, unsigned long deadline); | 962 | const unsigned long *params, unsigned long deadline); |
| 947 | extern int sata_link_resume(struct ata_link *link, const unsigned long *params, | 963 | extern int sata_link_resume(struct ata_link *link, const unsigned long *params, |
| 948 | unsigned long deadline); | 964 | unsigned long deadline); |
| 965 | extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, | ||
| 966 | bool spm_wakeup); | ||
| 949 | extern int sata_link_hardreset(struct ata_link *link, | 967 | extern int sata_link_hardreset(struct ata_link *link, |
| 950 | const unsigned long *timing, unsigned long deadline, | 968 | const unsigned long *timing, unsigned long deadline, |
| 951 | bool *online, int (*check_ready)(struct ata_link *)); | 969 | bool *online, int (*check_ready)(struct ata_link *)); |
| @@ -991,8 +1009,9 @@ extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); | |||
| 991 | extern void ata_host_resume(struct ata_host *host); | 1009 | extern void ata_host_resume(struct ata_host *host); |
| 992 | #endif | 1010 | #endif |
| 993 | extern int ata_ratelimit(void); | 1011 | extern int ata_ratelimit(void); |
| 994 | extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val, | 1012 | extern void ata_msleep(struct ata_port *ap, unsigned int msecs); |
| 995 | unsigned long interval, unsigned long timeout); | 1013 | extern u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask, |
| 1014 | u32 val, unsigned long interval, unsigned long timeout); | ||
| 996 | extern int atapi_cmd_type(u8 opcode); | 1015 | extern int atapi_cmd_type(u8 opcode); |
| 997 | extern void ata_tf_to_fis(const struct ata_taskfile *tf, | 1016 | extern void ata_tf_to_fis(const struct ata_taskfile *tf, |
| 998 | u8 pmp, int is_cmd, u8 *fis); | 1017 | u8 pmp, int is_cmd, u8 *fis); |
