Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 422c9daa authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

libata-pmp-prep: add @new_class to ata_dev_revalidate()



Consider newly found class code while revalidating.  PMP resetting
always results in valid class code and issuing PMP commands to
ATA/ATAPI device isn't very attractive.  Add @new_class to
ata_dev_revalidate() and check class code for revalidation.

Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent e0a71752
Loading
Loading
Loading
Loading
+13 −2
Original line number Original line Diff line number Diff line
@@ -2846,7 +2846,7 @@ static int ata_dev_set_mode(struct ata_device *dev)
	}
	}


	ehc->i.flags |= ATA_EHI_POST_SETMODE;
	ehc->i.flags |= ATA_EHI_POST_SETMODE;
	rc = ata_dev_revalidate(dev, 0);
	rc = ata_dev_revalidate(dev, ATA_DEV_UNKNOWN, 0);
	ehc->i.flags &= ~ATA_EHI_POST_SETMODE;
	ehc->i.flags &= ~ATA_EHI_POST_SETMODE;
	if (rc)
	if (rc)
		return rc;
		return rc;
@@ -3750,6 +3750,7 @@ int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags)
/**
/**
 *	ata_dev_revalidate - Revalidate ATA device
 *	ata_dev_revalidate - Revalidate ATA device
 *	@dev: device to revalidate
 *	@dev: device to revalidate
 *	@new_class: new class code
 *	@readid_flags: read ID flags
 *	@readid_flags: read ID flags
 *
 *
 *	Re-read IDENTIFY page, make sure @dev is still attached to the
 *	Re-read IDENTIFY page, make sure @dev is still attached to the
@@ -3761,7 +3762,8 @@ int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags)
 *	RETURNS:
 *	RETURNS:
 *	0 on success, negative errno otherwise
 *	0 on success, negative errno otherwise
 */
 */
int ata_dev_revalidate(struct ata_device *dev, unsigned int readid_flags)
int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
		       unsigned int readid_flags)
{
{
	u64 n_sectors = dev->n_sectors;
	u64 n_sectors = dev->n_sectors;
	int rc;
	int rc;
@@ -3769,6 +3771,15 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int readid_flags)
	if (!ata_dev_enabled(dev))
	if (!ata_dev_enabled(dev))
		return -ENODEV;
		return -ENODEV;


	/* fail early if !ATA && !ATAPI to avoid issuing [P]IDENTIFY to PMP */
	if (ata_class_enabled(new_class) &&
	    new_class != ATA_DEV_ATA && new_class != ATA_DEV_ATAPI) {
		ata_dev_printk(dev, KERN_INFO, "class mismatch %u != %u\n",
			       dev->class, new_class);
		rc = -ENODEV;
		goto fail;
	}

	/* re-read ID */
	/* re-read ID */
	rc = ata_dev_reread_id(dev, readid_flags);
	rc = ata_dev_reread_id(dev, readid_flags);
	if (rc)
	if (rc)
+2 −1
Original line number Original line Diff line number Diff line
@@ -2104,7 +2104,8 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
			}
			}


			ata_eh_about_to_do(link, dev, ATA_EH_REVALIDATE);
			ata_eh_about_to_do(link, dev, ATA_EH_REVALIDATE);
			rc = ata_dev_revalidate(dev, readid_flags);
			rc = ata_dev_revalidate(dev, ehc->classes[dev->devno],
						readid_flags);
			if (rc)
			if (rc)
				goto err;
				goto err;


+2 −1
Original line number Original line Diff line number Diff line
@@ -78,7 +78,8 @@ extern unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd);
extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
			   unsigned int flags, u16 *id);
			   unsigned int flags, u16 *id);
extern int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags);
extern int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags);
extern int ata_dev_revalidate(struct ata_device *dev, unsigned int readid_flags);
extern int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
			      unsigned int readid_flags);
extern int ata_dev_configure(struct ata_device *dev);
extern int ata_dev_configure(struct ata_device *dev);
extern int sata_down_spd_limit(struct ata_link *link);
extern int sata_down_spd_limit(struct ata_link *link);
extern int sata_set_spd_needed(struct ata_link *link);
extern int sata_set_spd_needed(struct ata_link *link);