ata: libata-eh: Remove ata_do_eh()
The only reason for ata_do_eh() to exist is that the two caller sites, ata_std_error_handler() and ata_sff_error_handler() may pass it a NULL hardreset operation so that the built-in (generic) hardreset operation for a driver is ignored if the adapter SCR access is not available. However, ata_std_error_handler() and ata_sff_error_handler() modifications of the hardreset port operation can easily be combined as they are mutually exclusive. That is, a driver using sata_std_hardreset() as its hardreset operation cannot use sata_sff_hardreset() and vice-versa. With this observation, ata_do_eh() can be removed and its code moved to ata_std_error_handler(). The condition used to ignore the built-in hardreset port operation is modified to be the one that was used in ata_sff_error_handler(). This requires defining a stub for the function sata_sff_hardreset() to avoid compilation errors when CONFIG_ATA_SFF is not enabled. Furthermore, instead of modifying the local hardreset operation definition, set the ATA_LFLAG_NO_HRST link flag to prevent the use of built-in hardreset methods for ports without a valid scr_read function. This flag is checked in ata_eh_reset() and if set, the hardreset method is ignored. This change simplifies ata_sff_error_handler() as this function now only needs to call ata_std_error_handler(). No functional changes. Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Niklas Cassel <cassel@kernel.org> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Link: https://lore.kernel.org/r/20250716020315.235457-2-dlemoal@kernel.org Signed-off-by: Niklas Cassel <cassel@kernel.org>
This commit is contained in:
parent
148fbaf571
commit
df6f9a918e
|
|
@ -4066,45 +4066,11 @@ void ata_eh_finish(struct ata_port *ap)
|
|||
ap->nr_active_links = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_do_eh - do standard error handling
|
||||
* @ap: host port to handle error for
|
||||
*
|
||||
* @prereset: prereset method (can be NULL)
|
||||
* @softreset: softreset method (can be NULL)
|
||||
* @hardreset: hardreset method (can be NULL)
|
||||
* @postreset: postreset method (can be NULL)
|
||||
*
|
||||
* Perform standard error handling sequence.
|
||||
*
|
||||
* LOCKING:
|
||||
* Kernel thread context (may sleep).
|
||||
*/
|
||||
void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
|
||||
ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
|
||||
ata_postreset_fn_t postreset)
|
||||
{
|
||||
struct ata_device *dev;
|
||||
int rc;
|
||||
|
||||
ata_eh_autopsy(ap);
|
||||
ata_eh_report(ap);
|
||||
|
||||
rc = ata_eh_recover(ap, prereset, softreset, hardreset, postreset,
|
||||
NULL);
|
||||
if (rc) {
|
||||
ata_for_each_dev(dev, &ap->link, ALL)
|
||||
ata_dev_disable(dev);
|
||||
}
|
||||
|
||||
ata_eh_finish(ap);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_std_error_handler - standard error handler
|
||||
* @ap: host port to handle error for
|
||||
*
|
||||
* Standard error handler
|
||||
* Perform standard error handling sequence.
|
||||
*
|
||||
* LOCKING:
|
||||
* Kernel thread context (may sleep).
|
||||
|
|
@ -4112,13 +4078,27 @@ void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
|
|||
void ata_std_error_handler(struct ata_port *ap)
|
||||
{
|
||||
struct ata_port_operations *ops = ap->ops;
|
||||
ata_reset_fn_t hardreset = ops->hardreset;
|
||||
struct ata_link *link = &ap->link;
|
||||
int rc;
|
||||
|
||||
/* ignore built-in hardreset if SCR access is not available */
|
||||
if (hardreset == sata_std_hardreset && !sata_scr_valid(&ap->link))
|
||||
hardreset = NULL;
|
||||
/* Ignore built-in hardresets if SCR access is not available */
|
||||
if ((ops->hardreset == sata_std_hardreset ||
|
||||
ops->hardreset == sata_sff_hardreset) && !sata_scr_valid(link))
|
||||
link->flags |= ATA_LFLAG_NO_HRST;
|
||||
|
||||
ata_do_eh(ap, ops->prereset, ops->softreset, hardreset, ops->postreset);
|
||||
ata_eh_autopsy(ap);
|
||||
ata_eh_report(ap);
|
||||
|
||||
rc = ata_eh_recover(ap, ops->prereset, ops->softreset,
|
||||
ops->hardreset, ops->postreset, NULL);
|
||||
if (rc) {
|
||||
struct ata_device *dev;
|
||||
|
||||
ata_for_each_dev(dev, link, ALL)
|
||||
ata_dev_disable(dev);
|
||||
}
|
||||
|
||||
ata_eh_finish(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_std_error_handler);
|
||||
|
||||
|
|
|
|||
|
|
@ -2054,8 +2054,6 @@ EXPORT_SYMBOL_GPL(ata_sff_drain_fifo);
|
|||
*/
|
||||
void ata_sff_error_handler(struct ata_port *ap)
|
||||
{
|
||||
ata_reset_fn_t softreset = ap->ops->softreset;
|
||||
ata_reset_fn_t hardreset = ap->ops->hardreset;
|
||||
struct ata_queued_cmd *qc;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -2077,13 +2075,7 @@ void ata_sff_error_handler(struct ata_port *ap)
|
|||
|
||||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
|
||||
/* ignore built-in hardresets if SCR access is not available */
|
||||
if ((hardreset == sata_std_hardreset ||
|
||||
hardreset == sata_sff_hardreset) && !sata_scr_valid(&ap->link))
|
||||
hardreset = NULL;
|
||||
|
||||
ata_do_eh(ap, ap->ops->prereset, softreset, hardreset,
|
||||
ap->ops->postreset);
|
||||
ata_std_error_handler(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sff_error_handler);
|
||||
|
||||
|
|
|
|||
|
|
@ -1412,9 +1412,6 @@ extern void ata_eh_thaw_port(struct ata_port *ap);
|
|||
extern void ata_eh_qc_complete(struct ata_queued_cmd *qc);
|
||||
extern void ata_eh_qc_retry(struct ata_queued_cmd *qc);
|
||||
|
||||
extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
|
||||
ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
|
||||
ata_postreset_fn_t postreset);
|
||||
extern void ata_std_error_handler(struct ata_port *ap);
|
||||
extern void ata_std_sched_eh(struct ata_port *ap);
|
||||
extern void ata_std_end_eh(struct ata_port *ap);
|
||||
|
|
@ -2152,6 +2149,12 @@ static inline u8 ata_wait_idle(struct ata_port *ap)
|
|||
|
||||
return status;
|
||||
}
|
||||
#else /* CONFIG_ATA_SFF */
|
||||
static inline int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
|
||||
unsigned long deadline)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif /* CONFIG_ATA_SFF */
|
||||
|
||||
#endif /* __LINUX_LIBATA_H__ */
|
||||
|
|
|
|||
Loading…
Reference in New Issue