From: Saurav Kashyap <skashyap@marvell.com>
To: <dlemoal@kernel.org>, <cassel@kernel.org>
Cc: <linux-ide@vger.kernel.org>, <skashyap@marvell.com>,
<soochon@google.com>, Manoj Phadtare <mphadtare@marvell.com>
Subject: [PATCH v2] libata-sata: Check SDB_FIS for completion of DMA transfer before completing the commands.
Date: Fri, 15 Mar 2024 11:14:14 +0530 [thread overview]
Message-ID: <20240315054414.27954-1-skashyap@marvell.com> (raw)
This issue is seen on Marvell Controller with device ids 0x9215 and 0x9235.
Its reproduced within a minute with block size of 64K, 100 threads,
100 jobs and 512 iodepth on AMD platform. With decreased work load it
takes 8-9 hrs.
Sequence leading to an issue as per PCIe trace
- PxSact is read with slots 7 and 24 being cleared.
- Host starts processing these commands while data is not in system
memory yet.
- Last pkt of 512B was sent to host.
- SDB.FIS is copied, telling host command slot 24 is done.
Reading SDB.FIS confirms the transfer is complete.
Cc: Soochon Radee <soochon@google.com>
Tested-by: Manoj Phadtare <mphadtare@marvell.com>
Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
---
v1->v2:
Added workload and platform related details in the description.
drivers/ata/libata-sata.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
index 0fb1934875f2..7cdeb0a38c5b 100644
--- a/drivers/ata/libata-sata.c
+++ b/drivers/ata/libata-sata.c
@@ -14,9 +14,11 @@
#include <scsi/scsi_eh.h>
#include <linux/libata.h>
#include <asm/unaligned.h>
+#include <linux/pci.h>
#include "libata.h"
#include "libata-transport.h"
+#include "ahci.h"
/* debounce timing parameters in msecs { interval, duration, timeout } */
const unsigned int sata_deb_timing_normal[] = { 5, 100, 2000 };
@@ -649,6 +651,7 @@ EXPORT_SYMBOL_GPL(sata_link_hardreset);
int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active)
{
u64 done_mask, ap_qc_active = ap->qc_active;
+ struct pci_dev *pdev = to_pci_dev(ap->host->dev);
int nr_done = 0;
/*
@@ -677,7 +680,30 @@ int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active)
unsigned int tag = __ffs64(done_mask);
qc = ata_qc_from_tag(ap, tag);
- if (qc) {
+ if (pdev->vendor == PCI_VENDOR_ID_MARVELL_EXT &&
+ (pdev->device == 0x9215 || pdev->device == 0x9235)) {
+ struct ahci_port_priv *pp = ap->private_data;
+ u8 *rx_fis = pp->rx_fis;
+
+ if (pp->fbs_enabled)
+ rx_fis += ap->link.pmp * AHCI_RX_FIS_SZ;
+
+ if (!qc)
+ continue;
+
+ if (ata_is_ncq(qc->tf.protocol)) {
+ u32 *fis = (u32 *)(rx_fis + RX_FIS_SDB);
+ u32 fis_active = fis[1];
+
+ if ((fis_active & (1 << tag))) {
+ ata_qc_complete(qc);
+ nr_done++;
+ }
+ } else {
+ ata_qc_complete(qc);
+ nr_done++;
+ }
+ } else if (qc) {
ata_qc_complete(qc);
nr_done++;
}
--
2.23.1
next reply other threads:[~2024-03-15 5:44 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-15 5:44 Saurav Kashyap [this message]
2024-03-15 8:08 ` [PATCH v2] libata-sata: Check SDB_FIS for completion of DMA transfer before completing the commands Damien Le Moal
2024-04-03 17:27 ` [EXTERNAL] " Saurav Kashyap
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=20240315054414.27954-1-skashyap@marvell.com \
--to=skashyap@marvell.com \
--cc=cassel@kernel.org \
--cc=dlemoal@kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=mphadtare@marvell.com \
--cc=soochon@google.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 read-only IMAP folder(s) and NNTP newsgroup(s).