Commit 2ade8eef authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ata fix from Damien Le Moal:
 "A single patch from me, to fix a bug that is causing boot issues in
  the field (reports of problems with Fedora 35).

  The bug affects mostly old-ish drives that have issues with read log
  page command handling"

* tag 'ata-5.17-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata:
  ata: libata-core: Fix ata_dev_config_cpr()
parents 51f7ea91 fda17afc
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -2448,23 +2448,21 @@ static void ata_dev_config_cpr(struct ata_device *dev)
	struct ata_cpr_log *cpr_log = NULL;
	u8 *desc, *buf = NULL;

	if (!ata_identify_page_supported(dev,
				 ATA_LOG_CONCURRENT_POSITIONING_RANGES))
	if (ata_id_major_version(dev->id) < 11 ||
	    !ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES))
		goto out;

	/*
	 * Read IDENTIFY DEVICE data log, page 0x47
	 * (concurrent positioning ranges). We can have at most 255 32B range
	 * descriptors plus a 64B header.
	 * Read the concurrent positioning ranges log (0x47). We can have at
	 * most 255 32B range descriptors plus a 64B header.
	 */
	buf_len = (64 + 255 * 32 + 511) & ~511;
	buf = kzalloc(buf_len, GFP_KERNEL);
	if (!buf)
		goto out;

	err_mask = ata_read_log_page(dev, ATA_LOG_IDENTIFY_DEVICE,
				     ATA_LOG_CONCURRENT_POSITIONING_RANGES,
				     buf, buf_len >> 9);
	err_mask = ata_read_log_page(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES,
				     0, buf, buf_len >> 9);
	if (err_mask)
		goto out;

+1 −1
Original line number Diff line number Diff line
@@ -324,12 +324,12 @@ enum {
	ATA_LOG_NCQ_NON_DATA	= 0x12,
	ATA_LOG_NCQ_SEND_RECV	= 0x13,
	ATA_LOG_IDENTIFY_DEVICE	= 0x30,
	ATA_LOG_CONCURRENT_POSITIONING_RANGES = 0x47,

	/* Identify device log pages: */
	ATA_LOG_SECURITY	  = 0x06,
	ATA_LOG_SATA_SETTINGS	  = 0x08,
	ATA_LOG_ZONED_INFORMATION = 0x09,
	ATA_LOG_CONCURRENT_POSITIONING_RANGES = 0x47,

	/* Identify device SATA settings log:*/
	ATA_LOG_DEVSLP_OFFSET	  = 0x30,