libata: READ LOG DMA EXT support can be in either page 119 or 120
authorMartin K. Petersen <martin.petersen@oracle.com>
Tue, 5 May 2015 01:54:20 +0000 (21:54 -0400)
committerTejun Heo <tj@kernel.org>
Tue, 5 May 2015 13:30:19 +0000 (09:30 -0400)
Support for the READ/WRITE LOG DMA EXT commands can be signaled either
in page 119 or page 120. We should check both pages.

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Tejun Heo <tj@kernel.org>
include/linux/ata.h

index b666b773e1118bb28171554d7e1846144f07d050..fed36418dd1c2fe8c1c084278080f2ff23169725 100644 (file)
@@ -704,9 +704,19 @@ static inline bool ata_id_wcache_enabled(const u16 *id)
 
 static inline bool ata_id_has_read_log_dma_ext(const u16 *id)
 {
+       /* Word 86 must have bit 15 set */
        if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
                return false;
-       return id[ATA_ID_COMMAND_SET_3] & (1 << 3);
+
+       /* READ LOG DMA EXT support can be signaled either from word 119
+        * or from word 120. The format is the same for both words: Bit
+        * 15 must be cleared, bit 14 set and bit 3 set.
+        */
+       if ((id[ATA_ID_COMMAND_SET_3] & 0xC008) == 0x4008 ||
+           (id[ATA_ID_COMMAND_SET_4] & 0xC008) == 0x4008)
+               return true;
+
+       return false;
 }
 
 static inline bool ata_id_has_sense_reporting(const u16 *id)