Skip to content

Commit 17e897a

Browse files
committed
ata: libata-scsi: Improve CDL control
With ATA devices supporting the CDL feature, using CDL requires that the feature be enabled with a SET FEATURES command. This command is issued as the translated command for the MODE SELECT command issued by scsi_cdl_enable() when the user enables CDL through the device cdl_enable sysfs attribute. Currently, ata_mselect_control_ata_feature() always translates a MODE SELECT command for the ATA features subpage of the control mode page to a SET FEATURES command to enable or disable CDL based on the cdl_ctrl field. However, there is no need to issue the SET FEATURES command if: 1) The MODE SELECT command requests disabling CDL and CDL is already disabled. 2) The MODE SELECT command requests enabling CDL and CDL is already enabled. Fix ata_mselect_control_ata_feature() to issue the SET FEATURES command only when necessary. Since enabling CDL also implies a reset of the CDL statistics log page, avoiding useless CDL enable operations also avoids clearing the CDL statistics log. Also add debug messages to clearly signal when CDL is being enabled or disabled using a SET FEATURES command. Fixes: df60f9c ("scsi: ata: libata: Add ATA feature control sub-page translation") Cc: stable@vger.kernel.org Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Niklas Cassel <cassel@kernel.org> Reviewed-by: Igor Pylypiv <ipylypiv@google.com>
1 parent 88474ad commit 17e897a

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

drivers/ata/libata-scsi.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3908,17 +3908,27 @@ static int ata_mselect_control_ata_feature(struct ata_queued_cmd *qc,
39083908
/* Check cdl_ctrl */
39093909
switch (buf[0] & 0x03) {
39103910
case 0:
3911-
/* Disable CDL */
3911+
/* Disable CDL if it is enabled */
3912+
if (!(dev->flags & ATA_DFLAG_CDL_ENABLED))
3913+
return 0;
3914+
ata_dev_dbg(dev, "Disabling CDL\n");
39123915
cdl_action = 0;
39133916
dev->flags &= ~ATA_DFLAG_CDL_ENABLED;
39143917
break;
39153918
case 0x02:
3916-
/* Enable CDL T2A/T2B: NCQ priority must be disabled */
3919+
/*
3920+
* Enable CDL if not already enabled. Since this is mutually
3921+
* exclusive with NCQ priority, allow this only if NCQ priority
3922+
* is disabled.
3923+
*/
3924+
if (dev->flags & ATA_DFLAG_CDL_ENABLED)
3925+
return 0;
39173926
if (dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED) {
39183927
ata_dev_err(dev,
39193928
"NCQ priority must be disabled to enable CDL\n");
39203929
return -EINVAL;
39213930
}
3931+
ata_dev_dbg(dev, "Enabling CDL\n");
39223932
cdl_action = 1;
39233933
dev->flags |= ATA_DFLAG_CDL_ENABLED;
39243934
break;

0 commit comments

Comments
 (0)