58 lines
2.2 KiB
Diff
58 lines
2.2 KiB
Diff
From a9cbad46c051cf4467ba13638eddc86f96354c66 Mon Sep 17 00:00:00 2001
|
|
From: Igor Pylypiv <ipylypiv@google.com>
|
|
Date: Wed, 13 Aug 2025 19:22:56 -0700
|
|
Subject: ata: libata-scsi: Fix CDL control
|
|
|
|
Delete extra checks for the ATA_DFLAG_CDL_ENABLED flag that prevent
|
|
SET FEATURES command from being issued to a drive when NCQ commands
|
|
are active.
|
|
|
|
ata_mselect_control_ata_feature() sets / clears the ATA_DFLAG_CDL_ENABLED
|
|
flag during the translation of MODE SELECT to SET FEATURES. If SET FEATURES
|
|
gets deferred due to outstanding NCQ commands, the original MODE SELECT
|
|
command will be re-queued. When the re-queued MODE SELECT goes through
|
|
the ata_mselect_control_ata_feature() translation again, SET FEATURES
|
|
will not be issued because ATA_DFLAG_CDL_ENABLED has been already set or
|
|
cleared by the initial translation of MODE SELECT.
|
|
|
|
The ATA_DFLAG_CDL_ENABLED checks in ata_mselect_control_ata_feature()
|
|
are safe to remove because scsi_cdl_enable() implements a similar logic
|
|
that avoids enabling CDL if it has been enabled already.
|
|
|
|
Fixes: 17e897a45675 ("ata: libata-scsi: Improve CDL control")
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Igor Pylypiv <ipylypiv@google.com>
|
|
Reviewed-by: Niklas Cassel <cassel@kernel.org>
|
|
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
|
|
---
|
|
drivers/ata/libata-scsi.c | 11 +++--------
|
|
1 file changed, 3 insertions(+), 8 deletions(-)
|
|
|
|
--- a/drivers/ata/libata-scsi.c
|
|
+++ b/drivers/ata/libata-scsi.c
|
|
@@ -3905,21 +3905,16 @@ static int ata_mselect_control_ata_featu
|
|
/* Check cdl_ctrl */
|
|
switch (buf[0] & 0x03) {
|
|
case 0:
|
|
- /* Disable CDL if it is enabled */
|
|
- if (!(dev->flags & ATA_DFLAG_CDL_ENABLED))
|
|
- return 0;
|
|
+ /* Disable CDL */
|
|
ata_dev_dbg(dev, "Disabling CDL\n");
|
|
cdl_action = 0;
|
|
dev->flags &= ~ATA_DFLAG_CDL_ENABLED;
|
|
break;
|
|
case 0x02:
|
|
/*
|
|
- * Enable CDL if not already enabled. Since this is mutually
|
|
- * exclusive with NCQ priority, allow this only if NCQ priority
|
|
- * is disabled.
|
|
+ * Enable CDL. Since CDL is mutually exclusive with NCQ
|
|
+ * priority, allow this only if NCQ priority is disabled.
|
|
*/
|
|
- if (dev->flags & ATA_DFLAG_CDL_ENABLED)
|
|
- return 0;
|
|
if (dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED) {
|
|
ata_dev_err(dev,
|
|
"NCQ priority must be disabled to enable CDL\n");
|