| From 58768b0563916ddcb73d8ed26ede664915f8df31 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 |
| |
| From: Igor Pylypiv <ipylypiv@google.com> |
| |
| commit 58768b0563916ddcb73d8ed26ede664915f8df31 upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.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 |
| @@ -3782,21 +3782,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"); |