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

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
...@@ -91,7 +91,7 @@ const struct ata_port_operations sata_pmp_port_ops = { ...@@ -91,7 +91,7 @@ const struct ata_port_operations sata_pmp_port_ops = {
.inherits = &sata_port_ops, .inherits = &sata_port_ops,
.pmp_prereset = ata_std_prereset, .pmp_prereset = ata_std_prereset,
.pmp_hardreset = sata_pmp_std_hardreset, .pmp_hardreset = sata_std_hardreset,
.pmp_postreset = ata_std_postreset, .pmp_postreset = ata_std_postreset,
.error_handler = sata_pmp_error_handler, .error_handler = sata_pmp_error_handler,
}; };
...@@ -6307,7 +6307,6 @@ EXPORT_SYMBOL_GPL(ata_pci_device_resume); ...@@ -6307,7 +6307,6 @@ EXPORT_SYMBOL_GPL(ata_pci_device_resume);
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */
EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch); 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(sata_pmp_error_handler);
EXPORT_SYMBOL_GPL(__ata_ehi_push_desc); EXPORT_SYMBOL_GPL(__ata_ehi_push_desc);
......
...@@ -2276,6 +2276,11 @@ int ata_eh_reset(struct ata_link *link, int classify, ...@@ -2276,6 +2276,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
return rc; return rc;
fail: 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) if (rc == -ERESTART || try >= max_tries)
goto out; goto out;
......
...@@ -175,41 +175,6 @@ int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val) ...@@ -175,41 +175,6 @@ int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val)
return 0; 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 * sata_pmp_read_gscr - read GSCR block of SATA PMP
* @dev: PMP device * @dev: PMP device
......
...@@ -944,7 +944,7 @@ static int sil24_pmp_hardreset(struct ata_link *link, unsigned int *class, ...@@ -944,7 +944,7 @@ static int sil24_pmp_hardreset(struct ata_link *link, unsigned int *class,
return rc; 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) static void sil24_freeze(struct ata_port *ap)
......
...@@ -1025,8 +1025,6 @@ static inline int ata_acpi_cbl_80wire(struct ata_port *ap, ...@@ -1025,8 +1025,6 @@ static inline int ata_acpi_cbl_80wire(struct ata_port *ap,
* PMP - drivers/ata/libata-pmp.c * PMP - drivers/ata/libata-pmp.c
*/ */
extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc); 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); extern void sata_pmp_error_handler(struct ata_port *ap);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment