mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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: Tejun Heo <htejun@gmail.com>
This commit is contained in:
parent
ac371987a8
commit
5958e3025f
5 changed files with 7 additions and 40 deletions
|
@ -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);
|
||||||
#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,
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
* 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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue