ata: libata: move NCQ related ATA_DFLAGs
authorNiklas Cassel <niklas.cassel@wdc.com>
Thu, 29 Dec 2022 17:00:01 +0000 (18:00 +0100)
committerDamien Le Moal <damien.lemoal@opensource.wdc.com>
Wed, 4 Jan 2023 04:39:38 +0000 (13:39 +0900)
ata_dev_configure() starts off by clearing all flags in ATA_DFLAG_CFG_MASK:
dev->flags &= ~ATA_DFLAG_CFG_MASK;

ata_dev_configure() then calls ata_dev_config_lba() which calls
ata_dev_config_ncq().

ata_dev_config_ncq() will set the correct ATA_DFLAGs depending on what is
actually supported.

Since these flags are set by ata_dev_configure(), they should be in
ATA_DFLAG_CFG_MASK and not in ATA_DFLAG_INIT_MASK.

ATA_DFLAG_NCQ_PRIO_ENABLED is set via sysfs, is should therefore not be in
ATA_DFLAG_CFG_MASK. It also cannot be in ATA_DFLAG_INIT_MASK, because
ata_eh_schedule_probe() calls ata_dev_init(), which will clear all flags in
ATA_DFLAG_INIT_MASK.

This means that ATA_DFLAG_NCQ_PRIO_ENABLED (the value the user sets via
sysfs) would get silently cleared if ata_eh_schedule_probe() is called.
While that should only happen in certain circumstances, it still doesn't
seem right that it can get silently cleared.

(ata_dev_config_ncq_prio() will still clear the ATA_DFLAG_NCQ_PRIO_ENABLED
flag if ATA_DFLAG_NCQ_PRIO is suddenly no longer supported after a
revalidation.)

Because of this, move ATA_DFLAG_NCQ_PRIO_ENABLED to be outside of both
ATA_DFLAG_CFG_MASK and ATA_DFLAG_INIT_MASK.

Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
include/linux/libata.h

index f54e02d..3b7f5d9 100644 (file)
@@ -91,22 +91,21 @@ enum {
        ATA_DFLAG_AN            = (1 << 7), /* AN configured */
        ATA_DFLAG_TRUSTED       = (1 << 8), /* device supports trusted send/recv */
        ATA_DFLAG_DMADIR        = (1 << 10), /* device requires DMADIR */
-       ATA_DFLAG_CFG_MASK      = (1 << 12) - 1,
+       ATA_DFLAG_NCQ_SEND_RECV = (1 << 11), /* device supports NCQ SEND and RECV */
+       ATA_DFLAG_NCQ_PRIO      = (1 << 12), /* device supports NCQ priority */
+       ATA_DFLAG_CFG_MASK      = (1 << 13) - 1,
 
-       ATA_DFLAG_PIO           = (1 << 12), /* device limited to PIO mode */
-       ATA_DFLAG_NCQ_OFF       = (1 << 13), /* device limited to non-NCQ mode */
+       ATA_DFLAG_PIO           = (1 << 13), /* device limited to PIO mode */
+       ATA_DFLAG_NCQ_OFF       = (1 << 14), /* device limited to non-NCQ mode */
        ATA_DFLAG_SLEEPING      = (1 << 15), /* device is sleeping */
        ATA_DFLAG_DUBIOUS_XFER  = (1 << 16), /* data transfer not verified */
        ATA_DFLAG_NO_UNLOAD     = (1 << 17), /* device doesn't support unload */
        ATA_DFLAG_UNLOCK_HPA    = (1 << 18), /* unlock HPA */
-       ATA_DFLAG_NCQ_SEND_RECV = (1 << 19), /* device supports NCQ SEND and RECV */
-       ATA_DFLAG_NCQ_PRIO      = (1 << 20), /* device supports NCQ priority */
-       ATA_DFLAG_NCQ_PRIO_ENABLED = (1 << 21), /* Priority cmds sent to dev */
-       ATA_DFLAG_INIT_MASK     = (1 << 24) - 1,
+       ATA_DFLAG_INIT_MASK     = (1 << 19) - 1,
 
+       ATA_DFLAG_NCQ_PRIO_ENABLED = (1 << 19), /* Priority cmds sent to dev */
        ATA_DFLAG_DETACH        = (1 << 24),
        ATA_DFLAG_DETACHED      = (1 << 25),
-
        ATA_DFLAG_DA            = (1 << 26), /* device supports Device Attention */
        ATA_DFLAG_DEVSLP        = (1 << 27), /* device supports Device Sleep */
        ATA_DFLAG_ACPI_DISABLED = (1 << 28), /* ACPI for the device is disabled */