* [PATCH 0/3] libata-eh cleanups
@ 2025-07-07 10:59 Damien Le Moal
2025-07-07 10:59 ` [PATCH 1/3] ata: libata-eh: Make ata_eh_followup_srst_needed() return a bool Damien Le Moal
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Damien Le Moal @ 2025-07-07 10:59 UTC (permalink / raw)
To: linux-ide, Niklas Cassel
3 patches to cleanup libata-eh code and its documentation.
No functional changes are introduced.
Damien Le Moal (3):
ata: libata-eh: Make ata_eh_followup_srst_needed() return a bool
ata: libata-eh: Remove ata_do_eh()
Documentation: driver-api: Update libata error handler information
Documentation/driver-api/libata.rst | 21 ++++++-----
drivers/ata/libata-eh.c | 56 ++++++++++-------------------
drivers/ata/libata-sff.c | 10 +-----
include/linux/libata.h | 3 --
4 files changed, 31 insertions(+), 59 deletions(-)
--
2.50.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/3] ata: libata-eh: Make ata_eh_followup_srst_needed() return a bool
2025-07-07 10:59 [PATCH 0/3] libata-eh cleanups Damien Le Moal
@ 2025-07-07 10:59 ` Damien Le Moal
2025-07-07 10:59 ` [PATCH 2/3] ata: libata-eh: Remove ata_do_eh() Damien Le Moal
2025-07-07 10:59 ` [PATCH 3/3] Documentation: driver-api: Update libata error handler information Damien Le Moal
2 siblings, 0 replies; 5+ messages in thread
From: Damien Le Moal @ 2025-07-07 10:59 UTC (permalink / raw)
To: linux-ide, Niklas Cassel
ata_eh_followup_srst_needed() returns an integer used as a boolean. So
change this function to return that type.
No functional changes.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/ata/libata-eh.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 42aafb1ddb5a..436536112043 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2781,15 +2781,15 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
return reset(link, classes, deadline);
}
-static int ata_eh_followup_srst_needed(struct ata_link *link, int rc)
+static bool ata_eh_followup_srst_needed(struct ata_link *link, int rc)
{
if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link))
- return 0;
+ return false;
if (rc == -EAGAIN)
- return 1;
+ return true;
if (sata_pmp_supported(link->ap) && ata_is_host_link(link))
- return 1;
- return 0;
+ return true;
+ return false;
}
int ata_eh_reset(struct ata_link *link, int classify,
--
2.50.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/3] ata: libata-eh: Remove ata_do_eh()
2025-07-07 10:59 [PATCH 0/3] libata-eh cleanups Damien Le Moal
2025-07-07 10:59 ` [PATCH 1/3] ata: libata-eh: Make ata_eh_followup_srst_needed() return a bool Damien Le Moal
@ 2025-07-07 10:59 ` Damien Le Moal
2025-07-08 4:31 ` kernel test robot
2025-07-07 10:59 ` [PATCH 3/3] Documentation: driver-api: Update libata error handler information Damien Le Moal
2 siblings, 1 reply; 5+ messages in thread
From: Damien Le Moal @ 2025-07-07 10:59 UTC (permalink / raw)
To: linux-ide, Niklas Cassel
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 to 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() with the hardreset operation change of
ata_sff_error_handler(). With this, ata_sff_error_handler() is
simplified and only need to call ata_std_error_handler().
No functional changes.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/ata/libata-eh.c | 46 ++++++++++++----------------------------
drivers/ata/libata-sff.c | 10 +--------
include/linux/libata.h | 3 ---
3 files changed, 14 insertions(+), 45 deletions(-)
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 436536112043..68581adc6f87 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -4067,59 +4067,39 @@ void ata_eh_finish(struct ata_port *ap)
}
/**
- * ata_do_eh - do standard error handling
+ * ata_std_error_handler - standard error handler
* @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)
+void ata_std_error_handler(struct ata_port *ap)
{
- struct ata_device *dev;
+ struct ata_port_operations *ops = ap->ops;
+ ata_reset_fn_t hardreset = ops->hardreset;
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;
+
ata_eh_autopsy(ap);
ata_eh_report(ap);
- rc = ata_eh_recover(ap, prereset, softreset, hardreset, postreset,
- NULL);
+ rc = ata_eh_recover(ap, ops->prereset, ops->softreset,
+ hardreset, ops->postreset, NULL);
if (rc) {
+ struct ata_device *dev;
+
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
- *
- * LOCKING:
- * Kernel thread context (may sleep).
- */
-void ata_std_error_handler(struct ata_port *ap)
-{
- struct ata_port_operations *ops = ap->ops;
- ata_reset_fn_t hardreset = ops->hardreset;
-
- /* ignore built-in hardreset if SCR access is not available */
- if (hardreset == sata_std_hardreset && !sata_scr_valid(&ap->link))
- hardreset = NULL;
-
- ata_do_eh(ap, ops->prereset, ops->softreset, hardreset, ops->postreset);
-}
EXPORT_SYMBOL_GPL(ata_std_error_handler);
#ifdef CONFIG_PM
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 5a46c066abc3..e61f00779e40 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -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);
diff --git a/include/linux/libata.h b/include/linux/libata.h
index d092747be588..4a7f308fa4e5 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -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);
--
2.50.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/3] Documentation: driver-api: Update libata error handler information
2025-07-07 10:59 [PATCH 0/3] libata-eh cleanups Damien Le Moal
2025-07-07 10:59 ` [PATCH 1/3] ata: libata-eh: Make ata_eh_followup_srst_needed() return a bool Damien Le Moal
2025-07-07 10:59 ` [PATCH 2/3] ata: libata-eh: Remove ata_do_eh() Damien Le Moal
@ 2025-07-07 10:59 ` Damien Le Moal
2 siblings, 0 replies; 5+ messages in thread
From: Damien Le Moal @ 2025-07-07 10:59 UTC (permalink / raw)
To: linux-ide, Niklas Cassel
Update ``->error_handler()`` section of the libata documentation file
Documentation/driver-api/libata.rst to remove the reference to the
function ata_do_eh() as that function was removed. The reference to the
function ata_bmdma_drive_eh() is also removed as that function does not
exist at all. And while at it, cleanup the description of the various
port reset operations using a bullet list.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
Documentation/driver-api/libata.rst | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/Documentation/driver-api/libata.rst b/Documentation/driver-api/libata.rst
index 5da27a749246..e160ef2e0791 100644
--- a/Documentation/driver-api/libata.rst
+++ b/Documentation/driver-api/libata.rst
@@ -283,18 +283,21 @@ interrupts, start DMA engine, etc.
``->error_handler()`` is a driver's hook into probe, hotplug, and recovery
and other exceptional conditions. The primary responsibility of an
-implementation is to call :c:func:`ata_do_eh` or :c:func:`ata_bmdma_drive_eh`
-with a set of EH hooks as arguments:
+implementation is to call :c:func:`ata_std_error_handler`.
-'prereset' hook (may be NULL) is called during an EH reset, before any
-other actions are taken.
+:c:func:`ata_std_error_handler` will call the various port reset operations as
+needed.
-'postreset' hook (may be NULL) is called after the EH reset is
-performed. Based on existing conditions, severity of the problem, and
-hardware capabilities,
+* The 'prereset' operation (may be NULL) is called during an EH reset, before
+ any other action is taken.
-Either 'softreset' (may be NULL) or 'hardreset' (may be NULL) will be
-called to perform the low-level EH reset.
+* The 'postreset' hook (may be NULL) is called after the EH reset is performed.
+ Based on existing conditions, severity of the problem, and hardware
+ capabilities,
+
+* Either the 'softreset' operation (may be NULL) or the 'hardreset' operation
+ (may be NULL) will be called to perform the low-level EH reset. If both
+ operations are defined, 'hardreset' is preferred and used.
::
--
2.50.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/3] ata: libata-eh: Remove ata_do_eh()
2025-07-07 10:59 ` [PATCH 2/3] ata: libata-eh: Remove ata_do_eh() Damien Le Moal
@ 2025-07-08 4:31 ` kernel test robot
0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2025-07-08 4:31 UTC (permalink / raw)
To: Damien Le Moal, linux-ide, Niklas Cassel; +Cc: oe-kbuild-all
Hi Damien,
kernel test robot noticed the following build errors:
[auto build test ERROR on linus/master]
[also build test ERROR on v6.16-rc5 next-20250704]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Damien-Le-Moal/ata-libata-eh-Make-ata_eh_followup_srst_needed-return-a-bool/20250707-190306
base: linus/master
patch link: https://lore.kernel.org/r/20250707105931.548315-3-dlemoal%40kernel.org
patch subject: [PATCH 2/3] ata: libata-eh: Remove ata_do_eh()
config: csky-randconfig-001-20250708 (https://download.01.org/0day-ci/archive/20250708/202507081215.hXgFd0Tv-lkp@intel.com/config)
compiler: csky-linux-gcc (GCC) 13.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250708/202507081215.hXgFd0Tv-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507081215.hXgFd0Tv-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/ata/libata-eh.c: In function 'ata_std_error_handler':
>> drivers/ata/libata-eh.c:4056:27: error: 'sata_sff_hardreset' undeclared (first use in this function); did you mean 'sata_std_hardreset'?
4056 | hardreset == sata_sff_hardreset) && !sata_scr_valid(&ap->link))
| ^~~~~~~~~~~~~~~~~~
| sata_std_hardreset
drivers/ata/libata-eh.c:4056:27: note: each undeclared identifier is reported only once for each function it appears in
vim +4056 drivers/ata/libata-eh.c
4038
4039 /**
4040 * ata_std_error_handler - standard error handler
4041 * @ap: host port to handle error for
4042 *
4043 * Perform standard error handling sequence.
4044 *
4045 * LOCKING:
4046 * Kernel thread context (may sleep).
4047 */
4048 void ata_std_error_handler(struct ata_port *ap)
4049 {
4050 struct ata_port_operations *ops = ap->ops;
4051 ata_reset_fn_t hardreset = ops->hardreset;
4052 int rc;
4053
4054 /* Ignore built-in hardresets if SCR access is not available */
4055 if ((hardreset == sata_std_hardreset ||
> 4056 hardreset == sata_sff_hardreset) && !sata_scr_valid(&ap->link))
4057 hardreset = NULL;
4058
4059 ata_eh_autopsy(ap);
4060 ata_eh_report(ap);
4061
4062 rc = ata_eh_recover(ap, ops->prereset, ops->softreset,
4063 hardreset, ops->postreset, NULL);
4064 if (rc) {
4065 struct ata_device *dev;
4066
4067 ata_for_each_dev(dev, &ap->link, ALL)
4068 ata_dev_disable(dev);
4069 }
4070
4071 ata_eh_finish(ap);
4072 }
4073 EXPORT_SYMBOL_GPL(ata_std_error_handler);
4074
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-07-08 4:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-07 10:59 [PATCH 0/3] libata-eh cleanups Damien Le Moal
2025-07-07 10:59 ` [PATCH 1/3] ata: libata-eh: Make ata_eh_followup_srst_needed() return a bool Damien Le Moal
2025-07-07 10:59 ` [PATCH 2/3] ata: libata-eh: Remove ata_do_eh() Damien Le Moal
2025-07-08 4:31 ` kernel test robot
2025-07-07 10:59 ` [PATCH 3/3] Documentation: driver-api: Update libata error handler information Damien Le Moal
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.