diff options
Diffstat (limited to 'include/linux/ata.h')
| -rw-r--r-- | include/linux/ata.h | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index 4fb357312b3b..38a6948ce0c2 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -75,6 +75,7 @@ enum { | |||
| 75 | ATA_ID_EIDE_DMA_TIME = 66, | 75 | ATA_ID_EIDE_DMA_TIME = 66, |
| 76 | ATA_ID_EIDE_PIO = 67, | 76 | ATA_ID_EIDE_PIO = 67, |
| 77 | ATA_ID_EIDE_PIO_IORDY = 68, | 77 | ATA_ID_EIDE_PIO_IORDY = 68, |
| 78 | ATA_ID_ADDITIONAL_SUPP = 69, | ||
| 78 | ATA_ID_QUEUE_DEPTH = 75, | 79 | ATA_ID_QUEUE_DEPTH = 75, |
| 79 | ATA_ID_MAJOR_VER = 80, | 80 | ATA_ID_MAJOR_VER = 80, |
| 80 | ATA_ID_COMMAND_SET_1 = 82, | 81 | ATA_ID_COMMAND_SET_1 = 82, |
| @@ -87,6 +88,7 @@ enum { | |||
| 87 | ATA_ID_HW_CONFIG = 93, | 88 | ATA_ID_HW_CONFIG = 93, |
| 88 | ATA_ID_SPG = 98, | 89 | ATA_ID_SPG = 98, |
| 89 | ATA_ID_LBA_CAPACITY_2 = 100, | 90 | ATA_ID_LBA_CAPACITY_2 = 100, |
| 91 | ATA_ID_SECTOR_SIZE = 106, | ||
| 90 | ATA_ID_LAST_LUN = 126, | 92 | ATA_ID_LAST_LUN = 126, |
| 91 | ATA_ID_DLF = 128, | 93 | ATA_ID_DLF = 128, |
| 92 | ATA_ID_CSFO = 129, | 94 | ATA_ID_CSFO = 129, |
| @@ -638,6 +640,18 @@ static inline int ata_id_flush_ext_enabled(const u16 *id) | |||
| 638 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; | 640 | return (id[ATA_ID_CFS_ENABLE_2] & 0x2400) == 0x2400; |
| 639 | } | 641 | } |
| 640 | 642 | ||
| 643 | static inline int ata_id_has_large_logical_sectors(const u16 *id) | ||
| 644 | { | ||
| 645 | if ((id[ATA_ID_SECTOR_SIZE] & 0xc000) != 0x4000) | ||
| 646 | return 0; | ||
| 647 | return id[ATA_ID_SECTOR_SIZE] & (1 << 13); | ||
| 648 | } | ||
| 649 | |||
| 650 | static inline u8 ata_id_logical_per_physical_sectors(const u16 *id) | ||
| 651 | { | ||
| 652 | return id[ATA_ID_SECTOR_SIZE] & 0xf; | ||
| 653 | } | ||
| 654 | |||
| 641 | static inline int ata_id_has_lba48(const u16 *id) | 655 | static inline int ata_id_has_lba48(const u16 *id) |
| 642 | { | 656 | { |
| 643 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) | 657 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
| @@ -803,6 +817,16 @@ static inline int ata_id_has_trim(const u16 *id) | |||
| 803 | return 0; | 817 | return 0; |
| 804 | } | 818 | } |
| 805 | 819 | ||
| 820 | static inline int ata_id_has_zero_after_trim(const u16 *id) | ||
| 821 | { | ||
| 822 | /* DSM supported, deterministic read, and read zero after trim set */ | ||
| 823 | if (ata_id_has_trim(id) && | ||
| 824 | (id[ATA_ID_ADDITIONAL_SUPP] & 0x4020) == 0x4020) | ||
| 825 | return 1; | ||
| 826 | |||
| 827 | return 0; | ||
| 828 | } | ||
| 829 | |||
| 806 | static inline int ata_id_current_chs_valid(const u16 *id) | 830 | static inline int ata_id_current_chs_valid(const u16 *id) |
| 807 | { | 831 | { |
| 808 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command | 832 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command |
| @@ -958,17 +982,17 @@ static inline void ata_id_to_hd_driveid(u16 *id) | |||
| 958 | } | 982 | } |
| 959 | 983 | ||
| 960 | /* | 984 | /* |
| 961 | * Write up to 'max' LBA Range Entries to the buffer that will cover the | 985 | * Write LBA Range Entries to the buffer that will cover the extent from |
| 962 | * extent from sector to sector + count. This is used for TRIM and for | 986 | * sector to sector + count. This is used for TRIM and for ADD LBA(S) |
| 963 | * ADD LBA(S) TO NV CACHE PINNED SET. | 987 | * TO NV CACHE PINNED SET. |
| 964 | */ | 988 | */ |
| 965 | static inline unsigned ata_set_lba_range_entries(void *_buffer, unsigned max, | 989 | static inline unsigned ata_set_lba_range_entries(void *_buffer, |
| 966 | u64 sector, unsigned long count) | 990 | unsigned buf_size, u64 sector, unsigned long count) |
| 967 | { | 991 | { |
| 968 | __le64 *buffer = _buffer; | 992 | __le64 *buffer = _buffer; |
| 969 | unsigned i = 0; | 993 | unsigned i = 0, used_bytes; |
| 970 | 994 | ||
| 971 | while (i < max) { | 995 | while (i < buf_size / 8 ) { /* 6-byte LBA + 2-byte range per entry */ |
| 972 | u64 entry = sector | | 996 | u64 entry = sector | |
| 973 | ((u64)(count > 0xffff ? 0xffff : count) << 48); | 997 | ((u64)(count > 0xffff ? 0xffff : count) << 48); |
| 974 | buffer[i++] = __cpu_to_le64(entry); | 998 | buffer[i++] = __cpu_to_le64(entry); |
| @@ -978,9 +1002,9 @@ static inline unsigned ata_set_lba_range_entries(void *_buffer, unsigned max, | |||
| 978 | sector += 0xffff; | 1002 | sector += 0xffff; |
| 979 | } | 1003 | } |
| 980 | 1004 | ||
| 981 | max = ALIGN(i * 8, 512); | 1005 | used_bytes = ALIGN(i * 8, 512); |
| 982 | memset(buffer + i, 0, max - i * 8); | 1006 | memset(buffer + i, 0, used_bytes - i * 8); |
| 983 | return max; | 1007 | return used_bytes; |
| 984 | } | 1008 | } |
| 985 | 1009 | ||
| 986 | static inline int is_multi_taskfile(struct ata_taskfile *tf) | 1010 | static inline int is_multi_taskfile(struct ata_taskfile *tf) |
