From: Luca Lauro via B4 Relay <devnull+famlauro93l.gmail.com@kernel.org>
To: Sascha Hauer <s.hauer@pengutronix.de>,
"open list:BAREBOX" <barebox@lists.infradead.org>
Cc: Luca Lauro <famlauro93l@gmail.com>
Subject: [PATCH v3 14/15] ata: ahci: add shutdown helpers for AHCI controllers
Date: Sun, 02 Aug 2026 15:16:30 +0200 [thread overview]
Message-ID: <20260802-rn102-rn104-series-v3-14-f7685a279fb5@gmail.com> (raw)
In-Reply-To: <20260802-rn102-rn104-series-v3-0-f7685a279fb5@gmail.com>
From: Luca Lauro <famlauro93l@gmail.com>
Introduce helper functions to stop the DMA engine and FIS receive engine
before shutdown. These helpers mirror the libata shutdown sequence and
ensure that no AHCI activity is in progress when the system powers off.
Signed-off-by: Luca Lauro <famlauro93l@gmail.com>
---
drivers/ata/ahci.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index a9a3f43f21..e9e73069c1 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -21,6 +21,7 @@
#include <linux/sizes.h>
#include <linux/pci.h>
#include <clock.h>
+#include <poweroff.h>
#include "ahci.h"
@@ -683,6 +684,65 @@ static int ahci_probe(struct device *dev)
return ret;
}
+/* -------------------------------- */
+/* AHCI shutdown helpers */
+/* -------------------------------- */
+
+/* Stop DMA engine (clear START, wait LIST_ON=0) */
+static int ahci_stop_engine(struct ahci_port *port)
+{
+ u32 cmd;
+
+ cmd = ahci_port_read(port, PORT_CMD);
+
+ /* Already stopped? */
+ if (!(cmd & (PORT_CMD_START | PORT_CMD_LIST_ON)))
+ return 0;
+
+ /* Clear START */
+ cmd &= ~PORT_CMD_START;
+ ahci_port_write_f(port, PORT_CMD, cmd);
+
+ /* Wait for LIST_ON to clear */
+ return wait_on_timeout(500 * MSECOND,
+ !(ahci_port_read(port, PORT_CMD) & PORT_CMD_LIST_ON));
+}
+
+/* Stop FIS receive engine (clear FIS_RX, wait FIS_ON=0) */
+static int ahci_stop_fis_rx(struct ahci_port *port)
+{
+ u32 cmd;
+
+ cmd = ahci_port_read(port, PORT_CMD);
+ cmd &= ~PORT_CMD_FIS_RX;
+ ahci_port_write_f(port, PORT_CMD, cmd);
+
+ /* Wait for FIS_ON to clear */
+ return wait_on_timeout(1000 * MSECOND,
+ !(ahci_port_read(port, PORT_CMD) & PORT_CMD_FIS_ON));
+}
+
+/* Stop all ports (libata_pci_shutdown_one equivalent) */
+static void __maybe_unused ahci_shutdown_host(struct ahci_device *ahci)
+{
+ int i, n_ports;
+
+ n_ports = max_t(int, ahci->n_ports, fls(ahci->port_map));
+
+ for (i = 0; i < n_ports; i++) {
+ struct ahci_port *port = &ahci->ports[i];
+
+ if (!(ahci->port_map & (1 << i)))
+ continue;
+
+ /* Stop DMA engine */
+ ahci_stop_engine(port);
+
+ /* Stop FIS receive engine */
+ ahci_stop_fis_rx(port);
+ }
+}
+
/* Issue FLUSH EXT + STANDBY IMMEDIATE */
static void ahci_port_shutdown(struct ahci_port *port)
{
--
2.47.3
next prev parent reply other threads:[~2026-08-02 13:17 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-02 13:16 [PATCH v3 00/15] ARM: mvebu: add Netgear RN102/RN104 support and related drivers Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 01/15] ARM: mvebu: add Netgear RN102 support Luca Lauro via B4 Relay
2026-08-03 12:53 ` Sascha Hauer
2026-08-03 13:43 ` Marco Felsch
2026-08-02 13:16 ` [PATCH v3 02/15] ARM: mvebu: enable RN102 in mvebu_defconfig Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 03/15] ARM: mvebu: improve Netgear RN104 support Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 04/15] ARM: mvebu: rename PUTC_LL to MVEBU_PUTC_LL Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 05/15] drivers: fan: add fan subsystem, core API and G76x fan controller driver Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 06/15] commands: add fan control command Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 07/15] usb: ehci: add Marvell EHCI host controller driver Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 08/15] usb: ehci: initialize periodic_queue_dma Luca Lauro via B4 Relay
2026-08-03 21:27 ` Sascha Hauer
2026-08-02 13:16 ` [PATCH v3 09/15] ata: ahci: add PCI AHCI and Marvell 9170 controller support Luca Lauro via B4 Relay
2026-08-03 21:33 ` Sascha Hauer
2026-08-02 13:16 ` [PATCH v3 10/15] ata: ahci: fix zero-length DMA handling Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 11/15] ata: ahci: add helper for ATA commands without data Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 12/15] ata: ahci: improve AHCI port bring-up sequence Luca Lauro via B4 Relay
2026-08-02 13:16 ` [PATCH v3 13/15] ata: ahci: add FLUSH EXT and STANDBY IMMEDIATE support during shutdown Luca Lauro via B4 Relay
2026-08-03 21:52 ` Sascha Hauer
2026-08-02 13:16 ` Luca Lauro via B4 Relay [this message]
2026-08-03 21:55 ` [PATCH v3 14/15] ata: ahci: add shutdown helpers for AHCI controllers Sascha Hauer
2026-08-02 13:16 ` [PATCH v3 15/15] ata: ahci: cleanup legacy code and remove unused paths Luca Lauro via B4 Relay
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=20260802-rn102-rn104-series-v3-14-f7685a279fb5@gmail.com \
--to=devnull+famlauro93l.gmail.com@kernel.org \
--cc=barebox@lists.infradead.org \
--cc=famlauro93l@gmail.com \
--cc=s.hauer@pengutronix.de \
/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