release 6.16.3 (preliminary)
This commit is contained in:
57
debian/patches/patchset-pf/steady/0052-ata-libata-scsi-Fix-CDL-control.patch
vendored
Normal file
57
debian/patches/patchset-pf/steady/0052-ata-libata-scsi-Fix-CDL-control.patch
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
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");
|
Reference in New Issue
Block a user