--- /dev/null
+From 18676c6aab0863618eb35443e7b8615eea3535a9 Mon Sep 17 00:00:00 2001
+From: Igor Pylypiv <ipylypiv@google.com>
+Date: Tue, 2 Jul 2024 02:47:34 +0000
+Subject: ata: libata-core: Set ATA_QCFLAG_RTF_FILLED in fill_result_tf()
+
+From: Igor Pylypiv <ipylypiv@google.com>
+
+commit 18676c6aab0863618eb35443e7b8615eea3535a9 upstream.
+
+ATA_QCFLAG_RTF_FILLED is not specific to ahci and can be used generally
+to check if qc->result_tf contains valid data.
+
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
+Reviewed-by: Niklas Cassel <cassel@kernel.org>
+Signed-off-by: Igor Pylypiv <ipylypiv@google.com>
+Link: https://lore.kernel.org/r/20240702024735.1152293-7-ipylypiv@google.com
+Signed-off-by: Niklas Cassel <cassel@kernel.org>
+Cc: Christian Kühnke <christian@kuehnke.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/ata/libahci.c | 12 ++----------
+ drivers/ata/libata-core.c | 8 ++++++++
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+--- a/drivers/ata/libahci.c
++++ b/drivers/ata/libahci.c
+@@ -2082,13 +2082,6 @@ static void ahci_qc_fill_rtf(struct ata_
+ struct ahci_port_priv *pp = qc->ap->private_data;
+ u8 *rx_fis = pp->rx_fis;
+
+- /*
+- * rtf may already be filled (e.g. for successful NCQ commands).
+- * If that is the case, we have nothing to do.
+- */
+- if (qc->flags & ATA_QCFLAG_RTF_FILLED)
+- return;
+-
+ if (pp->fbs_enabled)
+ rx_fis += qc->dev->link->pmp * AHCI_RX_FIS_SZ;
+
+@@ -2102,7 +2095,6 @@ static void ahci_qc_fill_rtf(struct ata_
+ !(qc->flags & ATA_QCFLAG_EH)) {
+ ata_tf_from_fis(rx_fis + RX_FIS_PIO_SETUP, &qc->result_tf);
+ qc->result_tf.status = (rx_fis + RX_FIS_PIO_SETUP)[15];
+- qc->flags |= ATA_QCFLAG_RTF_FILLED;
+ return;
+ }
+
+@@ -2125,12 +2117,10 @@ static void ahci_qc_fill_rtf(struct ata_
+ */
+ qc->result_tf.status = fis[2];
+ qc->result_tf.error = fis[3];
+- qc->flags |= ATA_QCFLAG_RTF_FILLED;
+ return;
+ }
+
+ ata_tf_from_fis(rx_fis + RX_FIS_D2H_REG, &qc->result_tf);
+- qc->flags |= ATA_QCFLAG_RTF_FILLED;
+ }
+
+ static void ahci_qc_ncq_fill_rtf(struct ata_port *ap, u64 done_mask)
+@@ -2165,6 +2155,7 @@ static void ahci_qc_ncq_fill_rtf(struct
+ if (qc && ata_is_ncq(qc->tf.protocol)) {
+ qc->result_tf.status = status;
+ qc->result_tf.error = error;
++ qc->result_tf.flags = qc->tf.flags;
+ qc->flags |= ATA_QCFLAG_RTF_FILLED;
+ }
+ done_mask &= ~(1ULL << tag);
+@@ -2189,6 +2180,7 @@ static void ahci_qc_ncq_fill_rtf(struct
+ fis += RX_FIS_SDB;
+ qc->result_tf.status = fis[2];
+ qc->result_tf.error = fis[3];
++ qc->result_tf.flags = qc->tf.flags;
+ qc->flags |= ATA_QCFLAG_RTF_FILLED;
+ }
+ done_mask &= ~(1ULL << tag);
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -4792,8 +4792,16 @@ static void fill_result_tf(struct ata_qu
+ {
+ struct ata_port *ap = qc->ap;
+
++ /*
++ * rtf may already be filled (e.g. for successful NCQ commands).
++ * If that is the case, we have nothing to do.
++ */
++ if (qc->flags & ATA_QCFLAG_RTF_FILLED)
++ return;
++
+ qc->result_tf.flags = qc->tf.flags;
+ ap->ops->qc_fill_rtf(qc);
++ qc->flags |= ATA_QCFLAG_RTF_FILLED;
+ }
+
+ static void ata_verify_xfer(struct ata_queued_cmd *qc)