Skip to content

Commit

Permalink
ata: fix ata_id_sense_reporting_enabled() and ata_id_has_sense_report…
Browse files Browse the repository at this point in the history
…ing()

[ Upstream commit 690aa8c ]

ACS-5 section
7.13.6.41 Words 85..87, 120: Commands and feature sets supported or enabled
states that:

If bit 15 of word 86 is set to one, bit 14 of word 119 is set to one,
and bit 15 of word 119 is cleared to zero, then word 119 is valid.

If bit 15 of word 86 is set to one, bit 14 of word 120 is set to one,
and bit 15 of word 120 is cleared to zero, then word 120 is valid.

(This text also exists in really old ACS standards, e.g. ACS-3.)

Currently, ata_id_sense_reporting_enabled() and
ata_id_has_sense_reporting() both check bit 15 of word 86,
but neither of them check that bit 14 of word 119 is set to one,
or that bit 15 of word 119 is cleared to zero.

Additionally, make ata_id_sense_reporting_enabled() return false
if !ata_id_has_sense_reporting(), similar to how e.g.
ata_id_flush_ext_enabled() returns false if !ata_id_has_flush_ext().

Fixes: e87fd28 ("libata: Implement support for sense data reporting")
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
floatious authored and gregkh committed Oct 21, 2022
1 parent 0ed8bf9 commit 62e7db6
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions include/linux/ata.h
Original file line number Diff line number Diff line change
Expand Up @@ -771,16 +771,21 @@ static inline bool ata_id_has_read_log_dma_ext(const u16 *id)

static inline bool ata_id_has_sense_reporting(const u16 *id)
{
if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
if (!(id[ATA_ID_CFS_ENABLE_2] & BIT(15)))
return false;
if ((id[ATA_ID_COMMAND_SET_3] & (BIT(15) | BIT(14))) != BIT(14))
return false;
return id[ATA_ID_COMMAND_SET_3] & (1 << 6);
return id[ATA_ID_COMMAND_SET_3] & BIT(6);
}

static inline bool ata_id_sense_reporting_enabled(const u16 *id)
{
if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15)))
if (!ata_id_has_sense_reporting(id))
return false;
/* ata_id_has_sense_reporting() == true, word 86 must have bit 15 set */
if ((id[ATA_ID_COMMAND_SET_4] & (BIT(15) | BIT(14))) != BIT(14))
return false;
return id[ATA_ID_COMMAND_SET_4] & (1 << 6);
return id[ATA_ID_COMMAND_SET_4] & BIT(6);
}

/**
Expand Down

0 comments on commit 62e7db6

Please sign in to comment.