diff options
author | Marc Carino <marc.ceeeee@gmail.com> | 2013-08-25 02:22:50 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-08-25 09:39:12 -0400 |
commit | ed36911c747c18525691c0aa0fbe6b918c8eac19 (patch) | |
tree | fd8c376b691932deed756040bca9fbeda9054bef /include | |
parent | 40fb59e75ad197a1c4ca2fbccef85432d8d103f8 (diff) |
libata: Add support for SEND/RECEIVE FPDMA QUEUED
Add support for the following ATA opcodes, which are present
in SATA 3.1 and T13 ATA ACS-3:
SEND FPDMA QUEUED
RECEIVE FPDMA QUEUED
Signed-off-by: Marc Carino <marc.ceeeee@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/ata.h | 21 | ||||
-rw-r--r-- | include/linux/libata.h | 4 |
2 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index f63fb1afc5cc..bf4c69ca76df 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -239,6 +239,8 @@ enum { | |||
239 | ATA_CMD_WRITE_QUEUED_FUA_EXT = 0x3E, | 239 | ATA_CMD_WRITE_QUEUED_FUA_EXT = 0x3E, |
240 | ATA_CMD_FPDMA_READ = 0x60, | 240 | ATA_CMD_FPDMA_READ = 0x60, |
241 | ATA_CMD_FPDMA_WRITE = 0x61, | 241 | ATA_CMD_FPDMA_WRITE = 0x61, |
242 | ATA_CMD_FPDMA_SEND = 0x64, | ||
243 | ATA_CMD_FPDMA_RECV = 0x65, | ||
242 | ATA_CMD_PIO_READ = 0x20, | 244 | ATA_CMD_PIO_READ = 0x20, |
243 | ATA_CMD_PIO_READ_EXT = 0x24, | 245 | ATA_CMD_PIO_READ_EXT = 0x24, |
244 | ATA_CMD_PIO_WRITE = 0x30, | 246 | ATA_CMD_PIO_WRITE = 0x30, |
@@ -293,8 +295,13 @@ enum { | |||
293 | /* marked obsolete in the ATA/ATAPI-7 spec */ | 295 | /* marked obsolete in the ATA/ATAPI-7 spec */ |
294 | ATA_CMD_RESTORE = 0x10, | 296 | ATA_CMD_RESTORE = 0x10, |
295 | 297 | ||
298 | /* Subcmds for ATA_CMD_FPDMA_SEND */ | ||
299 | ATA_SUBCMD_FPDMA_SEND_DSM = 0x00, | ||
300 | ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 0x02, | ||
301 | |||
296 | /* READ_LOG_EXT pages */ | 302 | /* READ_LOG_EXT pages */ |
297 | ATA_LOG_SATA_NCQ = 0x10, | 303 | ATA_LOG_SATA_NCQ = 0x10, |
304 | ATA_LOG_NCQ_SEND_RECV = 0x13, | ||
298 | ATA_LOG_SATA_ID_DEV_DATA = 0x30, | 305 | ATA_LOG_SATA_ID_DEV_DATA = 0x30, |
299 | ATA_LOG_SATA_SETTINGS = 0x08, | 306 | ATA_LOG_SATA_SETTINGS = 0x08, |
300 | ATA_LOG_DEVSLP_OFFSET = 0x30, | 307 | ATA_LOG_DEVSLP_OFFSET = 0x30, |
@@ -305,6 +312,15 @@ enum { | |||
305 | ATA_LOG_DEVSLP_VALID = 0x07, | 312 | ATA_LOG_DEVSLP_VALID = 0x07, |
306 | ATA_LOG_DEVSLP_VALID_MASK = 0x80, | 313 | ATA_LOG_DEVSLP_VALID_MASK = 0x80, |
307 | 314 | ||
315 | /* NCQ send and receive log */ | ||
316 | ATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET = 0x00, | ||
317 | ATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM = (1 << 0), | ||
318 | ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET = 0x04, | ||
319 | ATA_LOG_NCQ_SEND_RECV_DSM_TRIM = (1 << 0), | ||
320 | ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET = 0x08, | ||
321 | ATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET = 0x0C, | ||
322 | ATA_LOG_NCQ_SEND_RECV_SIZE = 0x10, | ||
323 | |||
308 | /* READ/WRITE LONG (obsolete) */ | 324 | /* READ/WRITE LONG (obsolete) */ |
309 | ATA_CMD_READ_LONG = 0x22, | 325 | ATA_CMD_READ_LONG = 0x22, |
310 | ATA_CMD_READ_LONG_ONCE = 0x23, | 326 | ATA_CMD_READ_LONG_ONCE = 0x23, |
@@ -772,6 +788,11 @@ static inline int ata_id_rotation_rate(const u16 *id) | |||
772 | return val; | 788 | return val; |
773 | } | 789 | } |
774 | 790 | ||
791 | static inline bool ata_id_has_ncq_send_and_recv(const u16 *id) | ||
792 | { | ||
793 | return id[ATA_ID_SATA_CAPABILITY_2] & BIT(6); | ||
794 | } | ||
795 | |||
775 | static inline bool ata_id_has_trim(const u16 *id) | 796 | static inline bool ata_id_has_trim(const u16 *id) |
776 | { | 797 | { |
777 | if (ata_id_major_version(id) >= 7 && | 798 | if (ata_id_major_version(id) >= 7 && |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 578f98c3ff57..a988c2d7d0e8 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -172,6 +172,7 @@ enum { | |||
172 | ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */ | 172 | ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */ |
173 | ATA_DFLAG_NO_UNLOAD = (1 << 17), /* device doesn't support unload */ | 173 | ATA_DFLAG_NO_UNLOAD = (1 << 17), /* device doesn't support unload */ |
174 | ATA_DFLAG_UNLOCK_HPA = (1 << 18), /* unlock HPA */ | 174 | ATA_DFLAG_UNLOCK_HPA = (1 << 18), /* unlock HPA */ |
175 | ATA_DFLAG_NCQ_SEND_RECV = (1 << 19), /* device supports NCQ SEND and RECV */ | ||
175 | ATA_DFLAG_INIT_MASK = (1 << 24) - 1, | 176 | ATA_DFLAG_INIT_MASK = (1 << 24) - 1, |
176 | 177 | ||
177 | ATA_DFLAG_DETACH = (1 << 24), | 178 | ATA_DFLAG_DETACH = (1 << 24), |
@@ -704,6 +705,9 @@ struct ata_device { | |||
704 | /* DEVSLP Timing Variables from Identify Device Data Log */ | 705 | /* DEVSLP Timing Variables from Identify Device Data Log */ |
705 | u8 devslp_timing[ATA_LOG_DEVSLP_SIZE]; | 706 | u8 devslp_timing[ATA_LOG_DEVSLP_SIZE]; |
706 | 707 | ||
708 | /* NCQ send and receive log subcommand support */ | ||
709 | u8 ncq_send_recv_cmds[ATA_LOG_NCQ_SEND_RECV_SIZE]; | ||
710 | |||
707 | /* error history */ | 711 | /* error history */ |
708 | int spdn_cnt; | 712 | int spdn_cnt; |
709 | /* ering is CLEAR_END, read comment above CLEAR_END */ | 713 | /* ering is CLEAR_END, read comment above CLEAR_END */ |