From: Niklas Cassel <cassel@kernel.org>
To: Damien Le Moal <dlemoal@kernel.org>
Cc: linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org,
"Martin K . Petersen" <martin.petersen@oracle.com>,
John Garry <john.g.garry@oracle.com>,
Jason Yan <yanaijie@huawei.com>
Subject: Re: [PATCH v3 2/3] ata: libata-eh: Simplify reset operation management
Date: Fri, 11 Jul 2025 11:06:31 +0200 [thread overview]
Message-ID: <aHDUF4QsNICSSyBC@ryzen> (raw)
In-Reply-To: <20250711083544.231706-3-dlemoal@kernel.org>
Hello Damien,
Thank you for doing this, I think it is a nice cleanup :)
On Fri, Jul 11, 2025 at 05:35:43PM +0900, Damien Le Moal wrote:
> Introduce struct ata_reset_operations do aggregate in a single structure
s/do/to/
> the definitions of the 4 reset methods (prereset, softreset, hardreset
> and postreset) for a port. This new structure is used in struct ata_port
> to define the reset methods for a regular port (reset field) and for a
> port-multiplier port (pmp_reset field). A pointer to either of these
> fields replaces the 4 reset method arguments passed to ata_eh_recover()
> and ata_eh_reset().
>
> ata_std_error_handler() is modified to use the ATA_LFLAG_NO_HRST link
> flag to prevents the use of built-in hardreset methods for ports without
> a valid scr. This flag is checked in ata_eh_reset() and if set, the
> hardreset method is ignored.
>
> The definition of the reset methods for all drivers is changed to use
> the reset and pmp_reset fields in struct ata_port_operations.
>
> A large number of files is modifed, but no functional changes are
> introduced.
>
> Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Suggested-by: Niklas Cassel <cassel@kernel.org>
> ---
> drivers/ata/ahci.c | 6 +--
> drivers/ata/ahci_da850.c | 6 +--
> drivers/ata/ahci_dm816.c | 2 +-
> drivers/ata/ahci_imx.c | 13 ++++---
> drivers/ata/ahci_qoriq.c | 4 +-
> drivers/ata/ahci_xgene.c | 8 ++--
> drivers/ata/ata_piix.c | 4 +-
> drivers/ata/libahci.c | 10 ++---
> drivers/ata/libata-core.c | 4 +-
> drivers/ata/libata-eh.c | 49 ++++++++++++-------------
> drivers/ata/libata-pmp.c | 26 +++++--------
> drivers/ata/libata-sata.c | 2 +-
> drivers/ata/libata-sff.c | 8 ++--
> drivers/ata/libata.h | 8 ++--
> drivers/ata/pata_acpi.c | 2 +-
> drivers/ata/pata_ali.c | 10 ++---
> drivers/ata/pata_amd.c | 4 +-
> drivers/ata/pata_artop.c | 4 +-
> drivers/ata/pata_atiixp.c | 2 +-
> drivers/ata/pata_efar.c | 2 +-
> drivers/ata/pata_ep93xx.c | 4 +-
> drivers/ata/pata_hpt366.c | 2 +-
> drivers/ata/pata_hpt37x.c | 4 +-
> drivers/ata/pata_hpt3x2n.c | 2 +-
> drivers/ata/pata_icside.c | 2 +-
> drivers/ata/pata_it8213.c | 2 +-
> drivers/ata/pata_jmicron.c | 2 +-
> drivers/ata/pata_marvell.c | 2 +-
> drivers/ata/pata_mpiix.c | 2 +-
> drivers/ata/pata_ns87410.c | 2 +-
> drivers/ata/pata_octeon_cf.c | 2 +-
> drivers/ata/pata_oldpiix.c | 2 +-
> drivers/ata/pata_opti.c | 2 +-
> drivers/ata/pata_optidma.c | 2 +-
> drivers/ata/pata_parport/pata_parport.c | 3 +-
> drivers/ata/pata_pdc2027x.c | 2 +-
> drivers/ata/pata_rdc.c | 2 +-
> drivers/ata/pata_sis.c | 2 +-
> drivers/ata/pata_sl82c105.c | 2 +-
> drivers/ata/pata_triflex.c | 2 +-
> drivers/ata/pata_via.c | 2 +-
> drivers/ata/pdc_adma.c | 2 +-
> drivers/ata/sata_dwc_460ex.c | 2 +-
> drivers/ata/sata_fsl.c | 6 +--
> drivers/ata/sata_highbank.c | 2 +-
> drivers/ata/sata_inic162x.c | 2 +-
> drivers/ata/sata_mv.c | 10 ++---
> drivers/ata/sata_nv.c | 2 +-
> drivers/ata/sata_promise.c | 4 +-
> drivers/ata/sata_qstor.c | 4 +-
> drivers/ata/sata_rcar.c | 2 +-
> drivers/ata/sata_sil24.c | 8 ++--
> drivers/ata/sata_svw.c | 4 +-
> drivers/ata/sata_sx4.c | 2 +-
> drivers/ata/sata_uli.c | 2 +-
> drivers/ata/sata_via.c | 4 +-
> drivers/scsi/libsas/sas_ata.c | 4 +-
> include/linux/libata.h | 17 +++++----
> 58 files changed, 143 insertions(+), 155 deletions(-)
>
> diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
> index 5558e9f7b85d..e1c24bbacf64 100644
> --- a/drivers/ata/ahci.c
> +++ b/drivers/ata/ahci.c
> @@ -110,17 +110,17 @@ static const struct scsi_host_template ahci_sht = {
>
> static struct ata_port_operations ahci_vt8251_ops = {
> .inherits = &ahci_ops,
> - .hardreset = ahci_vt8251_hardreset,
> + .reset.hardreset = ahci_vt8251_hardreset,
> };
>
> static struct ata_port_operations ahci_p5wdh_ops = {
> .inherits = &ahci_ops,
> - .hardreset = ahci_p5wdh_hardreset,
> + .reset.hardreset = ahci_p5wdh_hardreset,
> };
>
> static struct ata_port_operations ahci_avn_ops = {
> .inherits = &ahci_ops,
> - .hardreset = ahci_avn_hardreset,
> + .reset.hardreset = ahci_avn_hardreset,
> };
>
> static const struct ata_port_info ahci_port_info[] = {
> diff --git a/drivers/ata/ahci_da850.c b/drivers/ata/ahci_da850.c
> index ca0924dc5bd2..f97566c420f8 100644
> --- a/drivers/ata/ahci_da850.c
> +++ b/drivers/ata/ahci_da850.c
> @@ -137,13 +137,13 @@ static int ahci_da850_hardreset(struct ata_link *link,
>
> static struct ata_port_operations ahci_da850_port_ops = {
> .inherits = &ahci_platform_ops,
> - .softreset = ahci_da850_softreset,
> + .reset.softreset = ahci_da850_softreset,
> /*
> * No need to override .pmp_softreset - it's only used for actual
> * PMP-enabled ports.
> */
> - .hardreset = ahci_da850_hardreset,
> - .pmp_hardreset = ahci_da850_hardreset,
> + .reset.hardreset = ahci_da850_hardreset,
> + .pmp_reset.hardreset = ahci_da850_hardreset,
> };
>
> static const struct ata_port_info ahci_da850_port_info = {
> diff --git a/drivers/ata/ahci_dm816.c b/drivers/ata/ahci_dm816.c
> index b08547b877a1..93faed2cfeb6 100644
> --- a/drivers/ata/ahci_dm816.c
> +++ b/drivers/ata/ahci_dm816.c
> @@ -124,7 +124,7 @@ static int ahci_dm816_softreset(struct ata_link *link,
>
> static struct ata_port_operations ahci_dm816_port_ops = {
> .inherits = &ahci_platform_ops,
> - .softreset = ahci_dm816_softreset,
> + .reset.softreset = ahci_dm816_softreset,
> };
>
> static const struct ata_port_info ahci_dm816_port_info = {
> diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c
> index f01f08048f97..86aedd5923ac 100644
> --- a/drivers/ata/ahci_imx.c
> +++ b/drivers/ata/ahci_imx.c
> @@ -642,18 +642,19 @@ static int ahci_imx_softreset(struct ata_link *link, unsigned int *class,
> int ret;
>
> if (imxpriv->type == AHCI_IMX53)
> - ret = ahci_pmp_retry_srst_ops.softreset(link, class, deadline);
> + ret = ahci_pmp_retry_srst_ops.reset.softreset(link, class,
> + deadline);
> else
> - ret = ahci_ops.softreset(link, class, deadline);
> + ret = ahci_ops.reset.softreset(link, class, deadline);
>
> return ret;
> }
>
> static struct ata_port_operations ahci_imx_ops = {
> - .inherits = &ahci_ops,
> - .host_stop = ahci_imx_host_stop,
> - .error_handler = ahci_imx_error_handler,
> - .softreset = ahci_imx_softreset,
> + .inherits = &ahci_ops,
> + .host_stop = ahci_imx_host_stop,
> + .error_handler = ahci_imx_error_handler,
> + .reset.softreset = ahci_imx_softreset,
> };
>
> static const struct ata_port_info ahci_imx_port_info = {
> diff --git a/drivers/ata/ahci_qoriq.c b/drivers/ata/ahci_qoriq.c
> index 30e39885b64e..0dec1a17e5b1 100644
> --- a/drivers/ata/ahci_qoriq.c
> +++ b/drivers/ata/ahci_qoriq.c
> @@ -146,8 +146,8 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
> }
>
> static struct ata_port_operations ahci_qoriq_ops = {
> - .inherits = &ahci_ops,
> - .hardreset = ahci_qoriq_hardreset,
> + .inherits = &ahci_ops,
> + .reset.hardreset = ahci_qoriq_hardreset,
> };
>
> static const struct ata_port_info ahci_qoriq_port_info = {
> diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c
> index dfbd8c53abcb..5d5a51a77f5d 100644
> --- a/drivers/ata/ahci_xgene.c
> +++ b/drivers/ata/ahci_xgene.c
> @@ -613,11 +613,11 @@ static irqreturn_t xgene_ahci_irq_intr(int irq, void *dev_instance)
> static struct ata_port_operations xgene_ahci_v1_ops = {
> .inherits = &ahci_ops,
> .host_stop = xgene_ahci_host_stop,
> - .hardreset = xgene_ahci_hardreset,
> + .reset.hardreset = xgene_ahci_hardreset,
> + .reset.softreset = xgene_ahci_softreset,
> + .pmp_reset.softreset = xgene_ahci_pmp_softreset,
> .read_id = xgene_ahci_read_id,
> .qc_issue = xgene_ahci_qc_issue,
> - .softreset = xgene_ahci_softreset,
> - .pmp_softreset = xgene_ahci_pmp_softreset
> };
>
> static const struct ata_port_info xgene_ahci_v1_port_info = {
> @@ -630,7 +630,7 @@ static const struct ata_port_info xgene_ahci_v1_port_info = {
> static struct ata_port_operations xgene_ahci_v2_ops = {
> .inherits = &ahci_ops,
> .host_stop = xgene_ahci_host_stop,
> - .hardreset = xgene_ahci_hardreset,
> + .reset.hardreset = xgene_ahci_hardreset,
> .read_id = xgene_ahci_read_id,
> };
>
> diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
> index d441246fa357..229429ba5027 100644
> --- a/drivers/ata/ata_piix.c
> +++ b/drivers/ata/ata_piix.c
> @@ -1074,7 +1074,7 @@ static struct ata_port_operations piix_pata_ops = {
> .cable_detect = ata_cable_40wire,
> .set_piomode = piix_set_piomode,
> .set_dmamode = piix_set_dmamode,
> - .prereset = piix_pata_prereset,
> + .reset.prereset = piix_pata_prereset,
> };
>
> static struct ata_port_operations piix_vmw_ops = {
> @@ -1102,7 +1102,7 @@ static const struct scsi_host_template piix_sidpr_sht = {
>
> static struct ata_port_operations piix_sidpr_sata_ops = {
> .inherits = &piix_sata_ops,
> - .hardreset = sata_std_hardreset,
> + .reset.hardreset = sata_std_hardreset,
> .scr_read = piix_sidpr_scr_read,
> .scr_write = piix_sidpr_scr_write,
> .set_lpm = piix_sidpr_set_lpm,
> diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
> index 4e9c82f36df1..b335fb7e5cb4 100644
> --- a/drivers/ata/libahci.c
> +++ b/drivers/ata/libahci.c
> @@ -162,10 +162,10 @@ struct ata_port_operations ahci_ops = {
>
> .freeze = ahci_freeze,
> .thaw = ahci_thaw,
> - .softreset = ahci_softreset,
> - .hardreset = ahci_hardreset,
> - .postreset = ahci_postreset,
> - .pmp_softreset = ahci_softreset,
> + .reset.softreset = ahci_softreset,
> + .reset.hardreset = ahci_hardreset,
> + .reset.postreset = ahci_postreset,
> + .pmp_reset.softreset = ahci_softreset,
> .error_handler = ahci_error_handler,
> .post_internal_cmd = ahci_post_internal_cmd,
> .dev_config = ahci_dev_config,
> @@ -192,7 +192,7 @@ EXPORT_SYMBOL_GPL(ahci_ops);
>
> struct ata_port_operations ahci_pmp_retry_srst_ops = {
> .inherits = &ahci_ops,
> - .softreset = ahci_pmp_retry_softreset,
> + .reset.softreset = ahci_pmp_retry_softreset,
> };
> EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops);
>
> diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
> index bbf1318a2b9a..97d9f0488cc1 100644
> --- a/drivers/ata/libata-core.c
> +++ b/drivers/ata/libata-core.c
> @@ -65,8 +65,8 @@
> #include "libata-transport.h"
>
> const struct ata_port_operations ata_base_port_ops = {
> - .prereset = ata_std_prereset,
> - .postreset = ata_std_postreset,
> + .reset.prereset = ata_std_prereset,
> + .reset.postreset = ata_std_postreset,
> .error_handler = ata_std_error_handler,
> .sched_eh = ata_std_sched_eh,
> .end_eh = ata_std_end_eh,
> diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
> index 68581adc6f87..c746ef5e7086 100644
> --- a/drivers/ata/libata-eh.c
> +++ b/drivers/ata/libata-eh.c
> @@ -2793,13 +2793,13 @@ static bool ata_eh_followup_srst_needed(struct ata_link *link, int rc)
> }
>
> int ata_eh_reset(struct ata_link *link, int classify,
> - ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
> - ata_reset_fn_t hardreset, ata_postreset_fn_t postreset)
> + struct ata_reset_operations *reset_ops)
> {
> struct ata_port *ap = link->ap;
> struct ata_link *slave = ap->slave_link;
> struct ata_eh_context *ehc = &link->eh_context;
> struct ata_eh_context *sehc = slave ? &slave->eh_context : NULL;
> + ata_reset_fn_t reset, softreset, hardreset;
Wouldn't it be easier to just do:
ata_reset_fn_t hardreset = reset_ops->hardreset;
ata_reset_fn_t softrereset = reset_ops->softreset;
ata_reset_fn_t prereset = reset_ops->prereset;
ata_reset_fn_t postreset = reset_ops->postreset;
Here, then rest of the function could be kept as is, no other changes needed.
> unsigned int *classes = ehc->classes;
> unsigned int lflags = link->flags;
> int verbose = !(ehc->i.flags & ATA_EHI_QUIET);
> @@ -2807,7 +2807,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
> struct ata_link *failed_link;
> struct ata_device *dev;
> unsigned long deadline, now;
> - ata_reset_fn_t reset;
> unsigned long flags;
> u32 sstatus;
> int nr_unknown, rc;
> @@ -2821,8 +2820,12 @@ int ata_eh_reset(struct ata_link *link, int classify,
> max_tries = 1;
> if (link->flags & ATA_LFLAG_NO_HRST)
> hardreset = NULL;
> + else
> + hardreset = reset_ops->hardreset;
> if (link->flags & ATA_LFLAG_NO_SRST)
> softreset = NULL;
> + else
> + softreset = reset_ops->softreset;
>
> /* make sure each reset attempt is at least COOL_DOWN apart */
> if (ehc->i.flags & ATA_EHI_DID_RESET) {
> @@ -2871,7 +2874,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
> ehc->i.action |= ATA_EH_SOFTRESET;
> }
>
> - if (prereset) {
> + if (reset_ops->prereset) {
> unsigned long deadline = ata_deadline(jiffies,
> ATA_EH_PRERESET_TIMEOUT);
>
> @@ -2880,7 +2883,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
> sehc->i.action |= ehc->i.action;
> }
>
> - rc = prereset(link, deadline);
> + rc = reset_ops->prereset(link, deadline);
>
> /* If present, do prereset on slave link too. Reset
> * is skipped iff both master and slave links report
> @@ -2889,7 +2892,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
> if (slave && (rc == 0 || rc == -ENOENT)) {
> int tmp;
>
> - tmp = prereset(slave, deadline);
> + tmp = reset_ops->prereset(slave, deadline);
> if (tmp != -ENOENT)
> rc = tmp;
>
> @@ -3053,11 +3056,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
> * reset and here. This race is mediated by cross checking
> * link onlineness and classification result later.
> */
> - if (postreset) {
> - postreset(link, classes);
> + if (reset_ops->postreset) {
> + reset_ops->postreset(link, classes);
> trace_ata_link_postreset(link, classes, rc);
> if (slave) {
> - postreset(slave, classes);
> + reset_ops->postreset(slave, classes);
> trace_ata_slave_postreset(slave, classes, rc);
> }
> }
> @@ -3756,10 +3759,7 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
> /**
> * ata_eh_recover - recover host port after error
> * @ap: host port to recover
> - * @prereset: prereset method (can be NULL)
> - * @softreset: softreset method (can be NULL)
> - * @hardreset: hardreset method (can be NULL)
> - * @postreset: postreset method (can be NULL)
> + * @reset_ops: The set of reset operations to use
> * @r_failed_link: out parameter for failed link
> *
> * This is the alpha and omega, eum and yang, heart and soul of
> @@ -3775,9 +3775,7 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
> * RETURNS:
> * 0 on success, -errno on failure.
> */
> -int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
> - ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
> - ata_postreset_fn_t postreset,
> +int ata_eh_recover(struct ata_port *ap, struct ata_reset_operations *reset_ops,
> struct ata_link **r_failed_link)
> {
> struct ata_link *link;
> @@ -3845,8 +3843,7 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
> if (!(ehc->i.action & ATA_EH_RESET))
> continue;
>
> - rc = ata_eh_reset(link, ata_link_nr_vacant(link),
> - prereset, softreset, hardreset, postreset);
> + rc = ata_eh_reset(link, ata_link_nr_vacant(link), reset_ops);
> if (rc) {
> ata_link_err(link, "reset failed, giving up\n");
> goto out;
> @@ -4077,24 +4074,24 @@ void ata_eh_finish(struct ata_port *ap)
> */
> 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_reset_operations *reset_ops = &ap->ops->reset;
> + struct ata_link *link = &ap->link;
> int rc;
>
> /* 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;
> + if (!sata_scr_valid(link) &&
> + (reset_ops->hardreset == sata_std_hardreset ||
> + reset_ops->hardreset == sata_sff_hardreset))
> + link->flags |= ATA_LFLAG_NO_HRST;
I think it is cleaner to set ATA_LFLAG_NO_HRST already in patch 1.
Since this change is not really related to the logical change done
by this patch IMO.
>
> ata_eh_autopsy(ap);
> ata_eh_report(ap);
>
> - rc = ata_eh_recover(ap, ops->prereset, ops->softreset,
> - hardreset, ops->postreset, NULL);
> + rc = ata_eh_recover(ap, reset_ops, NULL);
> if (rc) {
> struct ata_device *dev;
>
> - ata_for_each_dev(dev, &ap->link, ALL)
> + ata_for_each_dev(dev, link, ALL)
> ata_dev_disable(dev);
> }
>
> diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
> index d5d189328ae6..57023324a56f 100644
> --- a/drivers/ata/libata-pmp.c
> +++ b/drivers/ata/libata-pmp.c
> @@ -15,9 +15,9 @@
>
> const struct ata_port_operations sata_pmp_port_ops = {
> .inherits = &sata_port_ops,
> - .pmp_prereset = ata_std_prereset,
> - .pmp_hardreset = sata_std_hardreset,
> - .pmp_postreset = ata_std_postreset,
> + .pmp_reset.prereset = ata_std_prereset,
> + .pmp_reset.hardreset = sata_std_hardreset,
> + .pmp_reset.postreset = ata_std_postreset,
> .error_handler = sata_pmp_error_handler,
> };
>
> @@ -727,10 +727,7 @@ static int sata_pmp_revalidate_quick(struct ata_device *dev)
> /**
> * sata_pmp_eh_recover_pmp - recover PMP
> * @ap: ATA port PMP is attached to
> - * @prereset: prereset method (can be NULL)
> - * @softreset: softreset method
> - * @hardreset: hardreset method
> - * @postreset: postreset method (can be NULL)
> + * @reset_ops: The set of reset operations to use
> *
> * Recover PMP attached to @ap. Recovery procedure is somewhat
> * similar to that of ata_eh_recover() except that reset should
> @@ -744,8 +741,7 @@ static int sata_pmp_revalidate_quick(struct ata_device *dev)
> * 0 on success, -errno on failure.
> */
> static int sata_pmp_eh_recover_pmp(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_reset_operations *reset_ops)
> {
> struct ata_link *link = &ap->link;
> struct ata_eh_context *ehc = &link->eh_context;
> @@ -767,8 +763,7 @@ static int sata_pmp_eh_recover_pmp(struct ata_port *ap,
> struct ata_link *tlink;
>
> /* reset */
> - rc = ata_eh_reset(link, 0, prereset, softreset, hardreset,
> - postreset);
> + rc = ata_eh_reset(link, 0, reset_ops);
> if (rc) {
> ata_link_err(link, "failed to reset PMP, giving up\n");
> goto fail;
> @@ -932,8 +927,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
> retry:
> /* PMP attached? */
> if (!sata_pmp_attached(ap)) {
> - rc = ata_eh_recover(ap, ops->prereset, ops->softreset,
> - ops->hardreset, ops->postreset, NULL);
> + rc = ata_eh_recover(ap, &ops->reset, NULL);
> if (rc) {
> ata_for_each_dev(dev, &ap->link, ALL)
> ata_dev_disable(dev);
> @@ -951,8 +945,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
> }
>
> /* recover pmp */
> - rc = sata_pmp_eh_recover_pmp(ap, ops->prereset, ops->softreset,
> - ops->hardreset, ops->postreset);
> + rc = sata_pmp_eh_recover_pmp(ap, &ops->reset);
> if (rc)
> goto pmp_fail;
>
> @@ -978,8 +971,7 @@ static int sata_pmp_eh_recover(struct ata_port *ap)
> goto pmp_fail;
>
> /* recover links */
> - rc = ata_eh_recover(ap, ops->pmp_prereset, ops->pmp_softreset,
> - ops->pmp_hardreset, ops->pmp_postreset, &link);
> + rc = ata_eh_recover(ap, &ops->pmp_reset, &link);
> if (rc)
> goto link_fail;
>
> diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
> index 47169c469f43..4734465d3b1e 100644
> --- a/drivers/ata/libata-sata.c
> +++ b/drivers/ata/libata-sata.c
> @@ -1704,6 +1704,6 @@ const struct ata_port_operations sata_port_ops = {
> .inherits = &ata_base_port_ops,
>
> .qc_defer = ata_std_qc_defer,
> - .hardreset = sata_std_hardreset,
> + .reset.hardreset = sata_std_hardreset,
> };
> EXPORT_SYMBOL_GPL(sata_port_ops);
> diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
> index e61f00779e40..7fc407255eb4 100644
> --- a/drivers/ata/libata-sff.c
> +++ b/drivers/ata/libata-sff.c
> @@ -31,10 +31,10 @@ const struct ata_port_operations ata_sff_port_ops = {
>
> .freeze = ata_sff_freeze,
> .thaw = ata_sff_thaw,
> - .prereset = ata_sff_prereset,
> - .softreset = ata_sff_softreset,
> - .hardreset = sata_sff_hardreset,
> - .postreset = ata_sff_postreset,
> + .reset.prereset = ata_sff_prereset,
> + .reset.softreset = ata_sff_softreset,
> + .reset.hardreset = sata_sff_hardreset,
> + .reset.postreset = ata_sff_postreset,
> .error_handler = ata_sff_error_handler,
>
> .sff_dev_select = ata_sff_dev_select,
> diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
> index ca44fb792aeb..e5b977a8d3e1 100644
> --- a/drivers/ata/libata.h
> +++ b/drivers/ata/libata.h
> @@ -180,11 +180,9 @@ extern void ata_eh_autopsy(struct ata_port *ap);
> const char *ata_get_cmd_name(u8 command);
> extern void ata_eh_report(struct ata_port *ap);
> extern int ata_eh_reset(struct ata_link *link, int classify,
> - ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
> - ata_reset_fn_t hardreset, ata_postreset_fn_t postreset);
> -extern int ata_eh_recover(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_reset_operations *reset_ops);
> +extern int ata_eh_recover(struct ata_port *ap,
> + struct ata_reset_operations *reset_ops,
> struct ata_link **r_failed_disk);
> extern void ata_eh_finish(struct ata_port *ap);
> extern int ata_ering_map(struct ata_ering *ering,
> diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c
> index ab38871b5e00..23fff10af2ac 100644
> --- a/drivers/ata/pata_acpi.c
> +++ b/drivers/ata/pata_acpi.c
> @@ -216,7 +216,7 @@ static struct ata_port_operations pacpi_ops = {
> .mode_filter = pacpi_mode_filter,
> .set_piomode = pacpi_set_piomode,
> .set_dmamode = pacpi_set_dmamode,
> - .prereset = pacpi_pre_reset,
> + .reset.prereset = pacpi_pre_reset,
> .port_start = pacpi_port_start,
> };
>
> diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c
> index bb790edd6036..9d5cb9c34c52 100644
> --- a/drivers/ata/pata_ali.c
> +++ b/drivers/ata/pata_ali.c
> @@ -392,11 +392,11 @@ static struct ata_port_operations ali_20_port_ops = {
> * Port operations for DMA capable ALi with cable detect
> */
> static struct ata_port_operations ali_c2_port_ops = {
> - .inherits = &ali_dma_base_ops,
> - .check_atapi_dma = ali_check_atapi_dma,
> - .cable_detect = ali_c2_cable_detect,
> - .dev_config = ali_lock_sectors,
> - .postreset = ali_c2_c3_postreset,
> + .inherits = &ali_dma_base_ops,
> + .check_atapi_dma = ali_check_atapi_dma,
> + .cable_detect = ali_c2_cable_detect,
> + .dev_config = ali_lock_sectors,
> + .reset.postreset = ali_c2_c3_postreset,
> };
>
> /*
> diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
> index 5b02b89748b7..a2fecadc927d 100644
> --- a/drivers/ata/pata_amd.c
> +++ b/drivers/ata/pata_amd.c
> @@ -394,7 +394,7 @@ static const struct scsi_host_template amd_sht = {
>
> static const struct ata_port_operations amd_base_port_ops = {
> .inherits = &ata_bmdma32_port_ops,
> - .prereset = amd_pre_reset,
> + .reset.prereset = amd_pre_reset,
> };
>
> static struct ata_port_operations amd33_port_ops = {
> @@ -429,7 +429,7 @@ static const struct ata_port_operations nv_base_port_ops = {
> .inherits = &ata_bmdma_port_ops,
> .cable_detect = ata_cable_ignore,
> .mode_filter = nv_mode_filter,
> - .prereset = nv_pre_reset,
> + .reset.prereset = nv_pre_reset,
> .host_stop = nv_host_stop,
> };
>
> diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c
> index 40544282f455..6160414172a3 100644
> --- a/drivers/ata/pata_artop.c
> +++ b/drivers/ata/pata_artop.c
> @@ -301,7 +301,7 @@ static struct ata_port_operations artop6210_ops = {
> .cable_detect = ata_cable_40wire,
> .set_piomode = artop6210_set_piomode,
> .set_dmamode = artop6210_set_dmamode,
> - .prereset = artop62x0_pre_reset,
> + .reset.prereset = artop62x0_pre_reset,
> .qc_defer = artop6210_qc_defer,
> };
>
> @@ -310,7 +310,7 @@ static struct ata_port_operations artop6260_ops = {
> .cable_detect = artop6260_cable_detect,
> .set_piomode = artop6260_set_piomode,
> .set_dmamode = artop6260_set_dmamode,
> - .prereset = artop62x0_pre_reset,
> + .reset.prereset = artop62x0_pre_reset,
> };
>
> static void atp8xx_fixup(struct pci_dev *pdev)
> diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c
> index 8c5cc803aab3..4c612f9543f6 100644
> --- a/drivers/ata/pata_atiixp.c
> +++ b/drivers/ata/pata_atiixp.c
> @@ -264,7 +264,7 @@ static struct ata_port_operations atiixp_port_ops = {
> .bmdma_start = atiixp_bmdma_start,
> .bmdma_stop = atiixp_bmdma_stop,
>
> - .prereset = atiixp_prereset,
> + .reset.prereset = atiixp_prereset,
> .cable_detect = atiixp_cable_detect,
> .set_piomode = atiixp_set_piomode,
> .set_dmamode = atiixp_set_dmamode,
> diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c
> index 2e6eccf2902f..6fe49b303fee 100644
> --- a/drivers/ata/pata_efar.c
> +++ b/drivers/ata/pata_efar.c
> @@ -243,7 +243,7 @@ static struct ata_port_operations efar_ops = {
> .cable_detect = efar_cable_detect,
> .set_piomode = efar_set_piomode,
> .set_dmamode = efar_set_dmamode,
> - .prereset = efar_pre_reset,
> + .reset.prereset = efar_pre_reset,
> };
>
>
> diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c
> index e8cda988feb5..b2b9e0058333 100644
> --- a/drivers/ata/pata_ep93xx.c
> +++ b/drivers/ata/pata_ep93xx.c
> @@ -879,8 +879,8 @@ static const struct scsi_host_template ep93xx_pata_sht = {
> static struct ata_port_operations ep93xx_pata_port_ops = {
> .inherits = &ata_bmdma_port_ops,
>
> - .softreset = ep93xx_pata_softreset,
> - .hardreset = ATA_OP_NULL,
> + .reset.softreset = ep93xx_pata_softreset,
> + .reset.hardreset = ATA_OP_NULL,
>
> .sff_dev_select = ep93xx_pata_dev_select,
> .sff_set_devctl = ep93xx_pata_set_devctl,
> diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c
> index 5280e9960025..b96e8bd2a3f8 100644
> --- a/drivers/ata/pata_hpt366.c
> +++ b/drivers/ata/pata_hpt366.c
> @@ -322,7 +322,7 @@ static const struct scsi_host_template hpt36x_sht = {
>
> static struct ata_port_operations hpt366_port_ops = {
> .inherits = &ata_bmdma_port_ops,
> - .prereset = hpt366_prereset,
> + .reset.prereset = hpt366_prereset,
> .cable_detect = hpt36x_cable_detect,
> .mode_filter = hpt366_filter,
> .set_piomode = hpt366_set_piomode,
> diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
> index 4af22b819416..07e3a984cbb1 100644
> --- a/drivers/ata/pata_hpt37x.c
> +++ b/drivers/ata/pata_hpt37x.c
> @@ -543,7 +543,7 @@ static struct ata_port_operations hpt370_port_ops = {
> .cable_detect = hpt37x_cable_detect,
> .set_piomode = hpt37x_set_piomode,
> .set_dmamode = hpt37x_set_dmamode,
> - .prereset = hpt37x_pre_reset,
> + .reset.prereset = hpt37x_pre_reset,
> };
>
> /*
> @@ -567,7 +567,7 @@ static struct ata_port_operations hpt302_port_ops = {
> .cable_detect = hpt37x_cable_detect,
> .set_piomode = hpt37x_set_piomode,
> .set_dmamode = hpt37x_set_dmamode,
> - .prereset = hpt37x_pre_reset,
> + .reset.prereset = hpt37x_pre_reset,
> };
>
> /*
> diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c
> index 5b1ecccf3c83..2cc57fcf2c46 100644
> --- a/drivers/ata/pata_hpt3x2n.c
> +++ b/drivers/ata/pata_hpt3x2n.c
> @@ -356,7 +356,7 @@ static struct ata_port_operations hpt3xxn_port_ops = {
> .cable_detect = hpt3x2n_cable_detect,
> .set_piomode = hpt3x2n_set_piomode,
> .set_dmamode = hpt3x2n_set_dmamode,
> - .prereset = hpt3x2n_pre_reset,
> + .reset.prereset = hpt3x2n_pre_reset,
> };
>
> /*
> diff --git a/drivers/ata/pata_icside.c b/drivers/ata/pata_icside.c
> index 61d8760f09d9..70f056e47e6b 100644
> --- a/drivers/ata/pata_icside.c
> +++ b/drivers/ata/pata_icside.c
> @@ -336,7 +336,7 @@ static struct ata_port_operations pata_icside_port_ops = {
>
> .cable_detect = ata_cable_40wire,
> .set_dmamode = pata_icside_set_dmamode,
> - .postreset = pata_icside_postreset,
> + .reset.postreset = pata_icside_postreset,
>
> .port_start = ATA_OP_NULL, /* don't need PRD table */
> };
> diff --git a/drivers/ata/pata_it8213.c b/drivers/ata/pata_it8213.c
> index 9cbe2132ce59..a6f2cfc1602e 100644
> --- a/drivers/ata/pata_it8213.c
> +++ b/drivers/ata/pata_it8213.c
> @@ -238,7 +238,7 @@ static struct ata_port_operations it8213_ops = {
> .cable_detect = it8213_cable_detect,
> .set_piomode = it8213_set_piomode,
> .set_dmamode = it8213_set_dmamode,
> - .prereset = it8213_pre_reset,
> + .reset.prereset = it8213_pre_reset,
> };
>
>
> diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c
> index f51fb8219762..b885f33e8980 100644
> --- a/drivers/ata/pata_jmicron.c
> +++ b/drivers/ata/pata_jmicron.c
> @@ -113,7 +113,7 @@ static const struct scsi_host_template jmicron_sht = {
>
> static struct ata_port_operations jmicron_ops = {
> .inherits = &ata_bmdma_port_ops,
> - .prereset = jmicron_pre_reset,
> + .reset.prereset = jmicron_pre_reset,
> };
>
>
> diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c
> index 8119caaad605..deab67328388 100644
> --- a/drivers/ata/pata_marvell.c
> +++ b/drivers/ata/pata_marvell.c
> @@ -99,7 +99,7 @@ static const struct scsi_host_template marvell_sht = {
> static struct ata_port_operations marvell_ops = {
> .inherits = &ata_bmdma_port_ops,
> .cable_detect = marvell_cable_detect,
> - .prereset = marvell_pre_reset,
> + .reset.prereset = marvell_pre_reset,
> };
>
>
> diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c
> index 69e4baf27d72..ce310ae7c93a 100644
> --- a/drivers/ata/pata_mpiix.c
> +++ b/drivers/ata/pata_mpiix.c
> @@ -145,7 +145,7 @@ static struct ata_port_operations mpiix_port_ops = {
> .qc_issue = mpiix_qc_issue,
> .cable_detect = ata_cable_40wire,
> .set_piomode = mpiix_set_piomode,
> - .prereset = mpiix_pre_reset,
> + .reset.prereset = mpiix_pre_reset,
> .sff_data_xfer = ata_sff_data_xfer32,
> };
>
> diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c
> index 44cc24d21d5f..bdb55c1a3280 100644
> --- a/drivers/ata/pata_ns87410.c
> +++ b/drivers/ata/pata_ns87410.c
> @@ -123,7 +123,7 @@ static struct ata_port_operations ns87410_port_ops = {
> .qc_issue = ns87410_qc_issue,
> .cable_detect = ata_cable_40wire,
> .set_piomode = ns87410_set_piomode,
> - .prereset = ns87410_pre_reset,
> + .reset.prereset = ns87410_pre_reset,
> };
>
> static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id)
> diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c
> index 2d32125c16fd..df42ebe98db7 100644
> --- a/drivers/ata/pata_octeon_cf.c
> +++ b/drivers/ata/pata_octeon_cf.c
> @@ -941,7 +941,7 @@ static int octeon_cf_probe(struct platform_device *pdev)
> /* 16 bit but not True IDE */
> base = cs0 + 0x800;
> octeon_cf_ops.sff_data_xfer = octeon_cf_data_xfer16;
> - octeon_cf_ops.softreset = octeon_cf_softreset16;
> + octeon_cf_ops.reset.softreset = octeon_cf_softreset16;
> octeon_cf_ops.sff_check_status = octeon_cf_check_status16;
> octeon_cf_ops.sff_tf_read = octeon_cf_tf_read16;
> octeon_cf_ops.sff_tf_load = octeon_cf_tf_load16;
> diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c
> index 3d01b7000e41..81a7f3eb5654 100644
> --- a/drivers/ata/pata_oldpiix.c
> +++ b/drivers/ata/pata_oldpiix.c
> @@ -214,7 +214,7 @@ static struct ata_port_operations oldpiix_pata_ops = {
> .cable_detect = ata_cable_40wire,
> .set_piomode = oldpiix_set_piomode,
> .set_dmamode = oldpiix_set_dmamode,
> - .prereset = oldpiix_pre_reset,
> + .reset.prereset = oldpiix_pre_reset,
> };
>
>
> diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c
> index 3d23f57eb128..3db1b95d1404 100644
> --- a/drivers/ata/pata_opti.c
> +++ b/drivers/ata/pata_opti.c
> @@ -156,7 +156,7 @@ static struct ata_port_operations opti_port_ops = {
> .inherits = &ata_sff_port_ops,
> .cable_detect = ata_cable_40wire,
> .set_piomode = opti_set_piomode,
> - .prereset = opti_pre_reset,
> + .reset.prereset = opti_pre_reset,
> };
>
> static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id)
> diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c
> index cc876dc7a9d8..b42dba5f4e05 100644
> --- a/drivers/ata/pata_optidma.c
> +++ b/drivers/ata/pata_optidma.c
> @@ -346,7 +346,7 @@ static struct ata_port_operations optidma_port_ops = {
> .set_piomode = optidma_set_pio_mode,
> .set_dmamode = optidma_set_dma_mode,
> .set_mode = optidma_set_mode,
> - .prereset = optidma_pre_reset,
> + .reset.prereset = optidma_pre_reset,
> };
>
> static struct ata_port_operations optiplus_port_ops = {
> diff --git a/drivers/ata/pata_parport/pata_parport.c b/drivers/ata/pata_parport/pata_parport.c
> index 93ebf566b54e..8de63d889a68 100644
> --- a/drivers/ata/pata_parport/pata_parport.c
> +++ b/drivers/ata/pata_parport/pata_parport.c
> @@ -321,8 +321,7 @@ static void pata_parport_drain_fifo(struct ata_queued_cmd *qc)
> static struct ata_port_operations pata_parport_port_ops = {
> .inherits = &ata_sff_port_ops,
>
> - .softreset = pata_parport_softreset,
> - .hardreset = NULL,
> + .reset.softreset = pata_parport_softreset,
>
> .sff_dev_select = pata_parport_dev_select,
> .sff_set_devctl = pata_parport_set_devctl,
> diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c
> index a4ee3b92c9aa..d792ce6d97bf 100644
> --- a/drivers/ata/pata_pdc2027x.c
> +++ b/drivers/ata/pata_pdc2027x.c
> @@ -130,7 +130,7 @@ static struct ata_port_operations pdc2027x_pata100_ops = {
> .inherits = &ata_bmdma_port_ops,
> .check_atapi_dma = pdc2027x_check_atapi_dma,
> .cable_detect = pdc2027x_cable_detect,
> - .prereset = pdc2027x_prereset,
> + .reset.prereset = pdc2027x_prereset,
> };
>
> static struct ata_port_operations pdc2027x_pata133_ops = {
> diff --git a/drivers/ata/pata_rdc.c b/drivers/ata/pata_rdc.c
> index 09792aac7f9d..e8e8c72a647e 100644
> --- a/drivers/ata/pata_rdc.c
> +++ b/drivers/ata/pata_rdc.c
> @@ -276,7 +276,7 @@ static struct ata_port_operations rdc_pata_ops = {
> .cable_detect = rdc_pata_cable_detect,
> .set_piomode = rdc_set_piomode,
> .set_dmamode = rdc_set_dmamode,
> - .prereset = rdc_pata_prereset,
> + .reset.prereset = rdc_pata_prereset,
> };
>
> static const struct ata_port_info rdc_port_info = {
> diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c
> index 31de06b66221..2b751e393771 100644
> --- a/drivers/ata/pata_sis.c
> +++ b/drivers/ata/pata_sis.c
> @@ -552,7 +552,7 @@ static struct ata_port_operations sis_133_for_sata_ops = {
>
> static struct ata_port_operations sis_base_ops = {
> .inherits = &ata_bmdma_port_ops,
> - .prereset = sis_pre_reset,
> + .reset.prereset = sis_pre_reset,
> };
>
> static struct ata_port_operations sis_133_ops = {
> diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c
> index 93882e976ede..2d24c6b3e9d9 100644
> --- a/drivers/ata/pata_sl82c105.c
> +++ b/drivers/ata/pata_sl82c105.c
> @@ -248,7 +248,7 @@ static struct ata_port_operations sl82c105_port_ops = {
> .bmdma_stop = sl82c105_bmdma_stop,
> .cable_detect = ata_cable_40wire,
> .set_piomode = sl82c105_set_piomode,
> - .prereset = sl82c105_pre_reset,
> + .reset.prereset = sl82c105_pre_reset,
> .sff_irq_check = sl82c105_sff_irq_check,
> };
>
> diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c
> index 26d448a869e2..596e86a031b3 100644
> --- a/drivers/ata/pata_triflex.c
> +++ b/drivers/ata/pata_triflex.c
> @@ -170,7 +170,7 @@ static struct ata_port_operations triflex_port_ops = {
> .bmdma_stop = triflex_bmdma_stop,
> .cable_detect = ata_cable_40wire,
> .set_piomode = triflex_set_piomode,
> - .prereset = triflex_prereset,
> + .reset.prereset = triflex_prereset,
> };
>
> static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id)
> diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
> index bb80e7800dcb..a8c9cf685b4b 100644
> --- a/drivers/ata/pata_via.c
> +++ b/drivers/ata/pata_via.c
> @@ -451,7 +451,7 @@ static struct ata_port_operations via_port_ops = {
> .cable_detect = via_cable_detect,
> .set_piomode = via_set_piomode,
> .set_dmamode = via_set_dmamode,
> - .prereset = via_pre_reset,
> + .reset.prereset = via_pre_reset,
> .sff_tf_load = via_tf_load,
> .port_start = via_port_start,
> .mode_filter = via_mode_filter,
> diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
> index 8e6b2599f0d5..17a5a59861c3 100644
> --- a/drivers/ata/pdc_adma.c
> +++ b/drivers/ata/pdc_adma.c
> @@ -140,7 +140,7 @@ static struct ata_port_operations adma_ata_ops = {
>
> .freeze = adma_freeze,
> .thaw = adma_thaw,
> - .prereset = adma_prereset,
> + .reset.prereset = adma_prereset,
>
> .port_start = adma_port_start,
> .port_stop = adma_port_stop,
> diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c
> index 6e1dd0d9c035..7a4f59202156 100644
> --- a/drivers/ata/sata_dwc_460ex.c
> +++ b/drivers/ata/sata_dwc_460ex.c
> @@ -1097,7 +1097,7 @@ static struct ata_port_operations sata_dwc_ops = {
> .inherits = &ata_sff_port_ops,
>
> .error_handler = sata_dwc_error_handler,
> - .hardreset = sata_dwc_hardreset,
> + .reset.hardreset = sata_dwc_hardreset,
>
> .qc_issue = sata_dwc_qc_issue,
>
> diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
> index 87e91a937a44..84da8d6ef28e 100644
> --- a/drivers/ata/sata_fsl.c
> +++ b/drivers/ata/sata_fsl.c
> @@ -1395,9 +1395,9 @@ static struct ata_port_operations sata_fsl_ops = {
>
> .freeze = sata_fsl_freeze,
> .thaw = sata_fsl_thaw,
> - .softreset = sata_fsl_softreset,
> - .hardreset = sata_fsl_hardreset,
> - .pmp_softreset = sata_fsl_softreset,
> + .reset.softreset = sata_fsl_softreset,
> + .reset.hardreset = sata_fsl_hardreset,
> + .pmp_reset.softreset = sata_fsl_softreset,
> .error_handler = sata_fsl_error_handler,
> .post_internal_cmd = sata_fsl_post_internal_cmd,
>
> diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
> index c8c817c51230..3421039f4bae 100644
> --- a/drivers/ata/sata_highbank.c
> +++ b/drivers/ata/sata_highbank.c
> @@ -428,7 +428,7 @@ static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
>
> static struct ata_port_operations ahci_highbank_ops = {
> .inherits = &ahci_ops,
> - .hardreset = ahci_highbank_hardreset,
> + .reset.hardreset = ahci_highbank_hardreset,
> .transmit_led_message = ecx_transmit_led_message,
> };
>
> diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
> index db9c255dc9f2..46a8c20daf18 100644
> --- a/drivers/ata/sata_inic162x.c
> +++ b/drivers/ata/sata_inic162x.c
> @@ -730,7 +730,7 @@ static struct ata_port_operations inic_port_ops = {
>
> .freeze = inic_freeze,
> .thaw = inic_thaw,
> - .hardreset = inic_hardreset,
> + .reset.hardreset = inic_hardreset,
> .error_handler = inic_error_handler,
> .post_internal_cmd = inic_post_internal_cmd,
>
> diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
> index bcbf96867f89..ffb396f61731 100644
> --- a/drivers/ata/sata_mv.c
> +++ b/drivers/ata/sata_mv.c
> @@ -687,7 +687,7 @@ static struct ata_port_operations mv5_ops = {
>
> .freeze = mv_eh_freeze,
> .thaw = mv_eh_thaw,
> - .hardreset = mv_hardreset,
> + .reset.hardreset = mv_hardreset,
>
> .scr_read = mv5_scr_read,
> .scr_write = mv5_scr_write,
> @@ -709,10 +709,10 @@ static struct ata_port_operations mv6_ops = {
>
> .freeze = mv_eh_freeze,
> .thaw = mv_eh_thaw,
> - .hardreset = mv_hardreset,
> - .softreset = mv_softreset,
> - .pmp_hardreset = mv_pmp_hardreset,
> - .pmp_softreset = mv_softreset,
> + .reset.hardreset = mv_hardreset,
> + .reset.softreset = mv_softreset,
> + .pmp_reset.hardreset = mv_pmp_hardreset,
> + .pmp_reset.softreset = mv_softreset,
> .error_handler = mv_pmp_error_handler,
>
> .scr_read = mv_scr_read,
> diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
> index f36e2915ccf1..841e7de2bba6 100644
> --- a/drivers/ata/sata_nv.c
> +++ b/drivers/ata/sata_nv.c
> @@ -462,7 +462,7 @@ static struct ata_port_operations nv_generic_ops = {
> .lost_interrupt = ATA_OP_NULL,
> .scr_read = nv_scr_read,
> .scr_write = nv_scr_write,
> - .hardreset = nv_hardreset,
> + .reset.hardreset = nv_hardreset,
> };
>
> static struct ata_port_operations nv_nf2_ops = {
> diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
> index 2df1a070b25a..2a005aede123 100644
> --- a/drivers/ata/sata_promise.c
> +++ b/drivers/ata/sata_promise.c
> @@ -188,7 +188,7 @@ static struct ata_port_operations pdc_sata_ops = {
> .scr_read = pdc_sata_scr_read,
> .scr_write = pdc_sata_scr_write,
> .port_start = pdc_sata_port_start,
> - .hardreset = pdc_sata_hardreset,
> + .reset.hardreset = pdc_sata_hardreset,
> };
>
> /* First-generation chips need a more restrictive ->check_atapi_dma op,
> @@ -206,7 +206,7 @@ static struct ata_port_operations pdc_pata_ops = {
> .freeze = pdc_freeze,
> .thaw = pdc_thaw,
> .port_start = pdc_common_port_start,
> - .softreset = pdc_pata_softreset,
> + .reset.softreset = pdc_pata_softreset,
> };
>
> static const struct ata_port_info pdc_port_info[] = {
> diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c
> index 8a6286159044..cfb9b5b61cd7 100644
> --- a/drivers/ata/sata_qstor.c
> +++ b/drivers/ata/sata_qstor.c
> @@ -123,8 +123,8 @@ static struct ata_port_operations qs_ata_ops = {
>
> .freeze = qs_freeze,
> .thaw = qs_thaw,
> - .prereset = qs_prereset,
> - .softreset = ATA_OP_NULL,
> + .reset.prereset = qs_prereset,
> + .reset.softreset = ATA_OP_NULL,
> .error_handler = qs_error_handler,
> .lost_interrupt = ATA_OP_NULL,
>
> diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c
> index 22820a02d740..487eadd4073f 100644
> --- a/drivers/ata/sata_rcar.c
> +++ b/drivers/ata/sata_rcar.c
> @@ -624,7 +624,7 @@ static struct ata_port_operations sata_rcar_port_ops = {
>
> .freeze = sata_rcar_freeze,
> .thaw = sata_rcar_thaw,
> - .softreset = sata_rcar_softreset,
> + .reset.softreset = sata_rcar_softreset,
>
> .scr_read = sata_rcar_scr_read,
> .scr_write = sata_rcar_scr_write,
> diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
> index 87f4cde6a686..d642ece9f07a 100644
> --- a/drivers/ata/sata_sil24.c
> +++ b/drivers/ata/sata_sil24.c
> @@ -393,10 +393,10 @@ static struct ata_port_operations sil24_ops = {
>
> .freeze = sil24_freeze,
> .thaw = sil24_thaw,
> - .softreset = sil24_softreset,
> - .hardreset = sil24_hardreset,
> - .pmp_softreset = sil24_softreset,
> - .pmp_hardreset = sil24_pmp_hardreset,
> + .reset.softreset = sil24_softreset,
> + .reset.hardreset = sil24_hardreset,
> + .pmp_reset.softreset = sil24_softreset,
> + .pmp_reset.hardreset = sil24_pmp_hardreset,
> .error_handler = sil24_error_handler,
> .post_internal_cmd = sil24_post_internal_cmd,
> .dev_config = sil24_dev_config,
> diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c
> index 598a872f6a08..c5d6aa36c9c3 100644
> --- a/drivers/ata/sata_svw.c
> +++ b/drivers/ata/sata_svw.c
> @@ -340,8 +340,8 @@ static const struct scsi_host_template k2_sata_sht = {
>
> static struct ata_port_operations k2_sata_ops = {
> .inherits = &ata_bmdma_port_ops,
> - .softreset = k2_sata_softreset,
> - .hardreset = k2_sata_hardreset,
> + .reset.softreset = k2_sata_softreset,
> + .reset.hardreset = k2_sata_hardreset,
> .sff_tf_load = k2_sata_tf_load,
> .sff_tf_read = k2_sata_tf_read,
> .sff_check_status = k2_stat_check_status,
> diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
> index f7f5131af937..0986ebd1eb4e 100644
> --- a/drivers/ata/sata_sx4.c
> +++ b/drivers/ata/sata_sx4.c
> @@ -241,7 +241,7 @@ static struct ata_port_operations pdc_20621_ops = {
>
> .freeze = pdc_freeze,
> .thaw = pdc_thaw,
> - .softreset = pdc_softreset,
> + .reset.softreset = pdc_softreset,
> .error_handler = pdc_error_handler,
> .lost_interrupt = ATA_OP_NULL,
> .post_internal_cmd = pdc_post_internal_cmd,
> diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c
> index 52894ff49dcb..44985796cc47 100644
> --- a/drivers/ata/sata_uli.c
> +++ b/drivers/ata/sata_uli.c
> @@ -67,7 +67,7 @@ static struct ata_port_operations uli_ops = {
> .inherits = &ata_bmdma_port_ops,
> .scr_read = uli_scr_read,
> .scr_write = uli_scr_write,
> - .hardreset = ATA_OP_NULL,
> + .reset.hardreset = ATA_OP_NULL,
> };
>
> static const struct ata_port_info uli_port_info = {
> diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
> index 4ecd8f33b082..68e9003ec2d4 100644
> --- a/drivers/ata/sata_via.c
> +++ b/drivers/ata/sata_via.c
> @@ -120,7 +120,7 @@ static struct ata_port_operations svia_base_ops = {
> static struct ata_port_operations vt6420_sata_ops = {
> .inherits = &svia_base_ops,
> .freeze = svia_noop_freeze,
> - .prereset = vt6420_prereset,
> + .reset.prereset = vt6420_prereset,
> .bmdma_start = vt6420_bmdma_start,
> };
>
> @@ -140,7 +140,7 @@ static struct ata_port_operations vt6421_sata_ops = {
>
> static struct ata_port_operations vt8251_ops = {
> .inherits = &svia_base_ops,
> - .hardreset = sata_std_hardreset,
> + .reset.hardreset = sata_std_hardreset,
> .scr_read = vt8251_scr_read,
> .scr_write = vt8251_scr_write,
> };
> diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
> index 7b4e7a61965a..adb9e7a94785 100644
> --- a/drivers/scsi/libsas/sas_ata.c
> +++ b/drivers/scsi/libsas/sas_ata.c
> @@ -559,8 +559,8 @@ static int sas_ata_prereset(struct ata_link *link, unsigned long deadline)
> }
>
> static struct ata_port_operations sas_sata_ops = {
> - .prereset = sas_ata_prereset,
> - .hardreset = sas_ata_hard_reset,
> + .reset.prereset = sas_ata_prereset,
> + .reset.hardreset = sas_ata_hard_reset,
> .error_handler = ata_std_error_handler,
> .post_internal_cmd = sas_ata_post_internal,
> .qc_defer = ata_std_qc_defer,
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index cf0b3fff3198..912ace523880 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
> @@ -944,6 +944,13 @@ struct ata_port {
> */
> #define ATA_OP_NULL (void *)(unsigned long)(-ENOENT)
>
> +struct ata_reset_operations {
> + ata_prereset_fn_t prereset;
> + ata_reset_fn_t softreset;
> + ata_reset_fn_t hardreset;
> + ata_postreset_fn_t postreset;
> +};
> +
> struct ata_port_operations {
> /*
> * Command execution
> @@ -970,14 +977,8 @@ struct ata_port_operations {
>
> void (*freeze)(struct ata_port *ap);
> void (*thaw)(struct ata_port *ap);
> - ata_prereset_fn_t prereset;
> - ata_reset_fn_t softreset;
> - ata_reset_fn_t hardreset;
> - ata_postreset_fn_t postreset;
> - ata_prereset_fn_t pmp_prereset;
> - ata_reset_fn_t pmp_softreset;
> - ata_reset_fn_t pmp_hardreset;
> - ata_postreset_fn_t pmp_postreset;
> + struct ata_reset_operations reset;
> + struct ata_reset_operations pmp_reset;
> void (*error_handler)(struct ata_port *ap);
> void (*lost_interrupt)(struct ata_port *ap);
> void (*post_internal_cmd)(struct ata_queued_cmd *qc);
> --
> 2.50.1
>
next prev parent reply other threads:[~2025-07-11 9:06 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-11 8:35 [PATCH v3 0/3] libata-eh cleanups Damien Le Moal
2025-07-11 8:35 ` [PATCH v3 1/3] ata: libata-eh: Remove ata_do_eh() Damien Le Moal
2025-07-15 14:50 ` Hannes Reinecke
2025-07-11 8:35 ` [PATCH v3 2/3] ata: libata-eh: Simplify reset operation management Damien Le Moal
2025-07-11 9:06 ` Niklas Cassel [this message]
2025-07-11 10:45 ` John Garry
2025-07-15 14:54 ` Hannes Reinecke
2025-07-11 8:35 ` [PATCH v3 3/3] Documentation: driver-api: Update libata error handler information Damien Le Moal
2025-07-11 9:07 ` Niklas Cassel
2025-07-15 14:54 ` Hannes Reinecke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aHDUF4QsNICSSyBC@ryzen \
--to=cassel@kernel.org \
--cc=dlemoal@kernel.org \
--cc=john.g.garry@oracle.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=yanaijie@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).