Commit de90cd71 authored by Shane Huang's avatar Shane Huang Committed by Jeff Garzik

libata: check SATA_SETTINGS log with HW Feature Ctrl

NCQ capability was used to check availability of SATA Settings page
from Identify Device Data Log, which contains DevSlp timing variables.
It does not work on some HDDs and leads to error messages.
IDENTIFY word 78 bit 5(Hardware Feature Control) should be used.

Quoting SATA spec 3.1:
If Hardware Feature Control is supported, then:
a) IDENTIFY DEVICE data word 78 bit 5 (see 13.2.1.18) shall be
set to one;
b) the SET FEATURES Select Hardware Feature Control subcommand
shall be supported (see 13.3.8);
c) page 08h of the Identify Device Data log (see 13.7.7) shall
be supported;

This patch is not tested on SATA HDD with DevSlp supported.
Reported-by: default avatarBorislav Petkov <bp@amd64.org>
Signed-off-by: default avatarShane Huang <shane.huang@amd.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 0d0cdb02
...@@ -2330,9 +2330,8 @@ int ata_dev_configure(struct ata_device *dev) ...@@ -2330,9 +2330,8 @@ int ata_dev_configure(struct ata_device *dev)
/* Obtain SATA Settings page from Identify Device Data Log, /* Obtain SATA Settings page from Identify Device Data Log,
* which contains DevSlp timing variables etc. * which contains DevSlp timing variables etc.
* Exclude old devices with ata_id_has_ncq()
*/ */
if (ata_id_has_ncq(dev->id)) { if (ata_id_has_hw_feature_ctrl(dev->id)) {
err_mask = ata_read_log_page(dev, err_mask = ata_read_log_page(dev,
ATA_LOG_SATA_ID_DEV_DATA, ATA_LOG_SATA_ID_DEV_DATA,
ATA_LOG_SATA_SETTINGS, ATA_LOG_SATA_SETTINGS,
......
...@@ -593,6 +593,7 @@ static inline int ata_is_data(u8 prot) ...@@ -593,6 +593,7 @@ static inline int ata_is_data(u8 prot)
#define ata_id_cdb_intr(id) (((id)[ATA_ID_CONFIG] & 0x60) == 0x20) #define ata_id_cdb_intr(id) (((id)[ATA_ID_CONFIG] & 0x60) == 0x20)
#define ata_id_has_da(id) ((id)[ATA_ID_SATA_CAPABILITY_2] & (1 << 4)) #define ata_id_has_da(id) ((id)[ATA_ID_SATA_CAPABILITY_2] & (1 << 4))
#define ata_id_has_devslp(id) ((id)[ATA_ID_FEATURE_SUPP] & (1 << 8)) #define ata_id_has_devslp(id) ((id)[ATA_ID_FEATURE_SUPP] & (1 << 8))
#define ata_id_has_hw_feature_ctrl(id) ((id)[ATA_ID_FEATURE_SUPP] & (1 << 5))
static inline bool ata_id_has_hipm(const u16 *id) static inline bool ata_id_has_hipm(const u16 *id)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment