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

Commit 5958e302 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

libata: move PMP SCR access failure during reset to ata_eh_reset()



If PMP fan-out reset fails and SCR isn't accessible, PMP should be
reset.  This used to be tested by sata_pmp_std_hardreset() and
communicated to EH by -ERESTART.  However, this logic is generic and
doesn't really have much to do with specific hardreset implementation.

This patch moves SCR access failure detection logic to ata_eh_reset()
where it belongs.  As this makes sata_pmp_std_hardreset() identical to
sata_std_hardreset(), the function is killed and replaced with the
standard method.

Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
parent ac371987
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ const struct ata_port_operations sata_pmp_port_ops = {
	.inherits		= &sata_port_ops,

	.pmp_prereset		= ata_std_prereset,
	.pmp_hardreset		= sata_pmp_std_hardreset,
	.pmp_hardreset		= sata_std_hardreset,
	.pmp_postreset		= ata_std_postreset,
	.error_handler		= sata_pmp_error_handler,
};
@@ -6307,7 +6307,6 @@ EXPORT_SYMBOL_GPL(ata_pci_device_resume);
#endif /* CONFIG_PCI */

EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch);
EXPORT_SYMBOL_GPL(sata_pmp_std_hardreset);
EXPORT_SYMBOL_GPL(sata_pmp_error_handler);

EXPORT_SYMBOL_GPL(__ata_ehi_push_desc);
+5 −0
Original line number Diff line number Diff line
@@ -2276,6 +2276,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
	return rc;

 fail:
	/* if SCR isn't accessible on a fan-out port, PMP needs to be reset */
	if (!ata_is_host_link(link) &&
	    sata_scr_read(link, SCR_STATUS, &sstatus))
		rc = -ERESTART;

	if (rc == -ERESTART || try >= max_tries)
		goto out;

+0 −35
Original line number Diff line number Diff line
@@ -175,41 +175,6 @@ int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val)
	return 0;
}

/**
 *	sata_pmp_std_hardreset - standard hardreset method for PMP link
 *	@link: link to be reset
 *	@class: resulting class of attached device
 *	@deadline: deadline jiffies for the operation
 *
 *	Hardreset PMP port @link.  Note that this function doesn't
 *	wait for BSY clearance.  There simply isn't a generic way to
 *	wait the event.  Instead, this function return -EAGAIN thus
 *	telling libata-EH to followup with softreset.
 *
 *	LOCKING:
 *	Kernel thread context (may sleep)
 *
 *	RETURNS:
 *	0 on success, -errno otherwise.
 */
int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class,
			   unsigned long deadline)
{
	u32 tmp;
	int rc;

	DPRINTK("ENTER\n");

	rc = sata_std_hardreset(link, class, deadline);

	/* if SCR isn't accessible, we need to reset the PMP */
	if (rc && rc != -EAGAIN && sata_scr_read(link, SCR_STATUS, &tmp))
		rc = -ERESTART;

	DPRINTK("EXIT, rc=%d\n", rc);
	return rc;
}

/**
 *	sata_pmp_read_gscr - read GSCR block of SATA PMP
 *	@dev: PMP device
+1 −1
Original line number Diff line number Diff line
@@ -944,7 +944,7 @@ static int sil24_pmp_hardreset(struct ata_link *link, unsigned int *class,
		return rc;
	}

	return sata_pmp_std_hardreset(link, class, deadline);
	return sata_std_hardreset(link, class, deadline);
}

static void sil24_freeze(struct ata_port *ap)
+0 −2
Original line number Diff line number Diff line
@@ -1025,8 +1025,6 @@ static inline int ata_acpi_cbl_80wire(struct ata_port *ap,
 * PMP - drivers/ata/libata-pmp.c
 */
extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc);
extern int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class,
				  unsigned long deadline);
extern void sata_pmp_error_handler(struct ata_port *ap);

/*