[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 7/8] hw/ide/ahci: fix ahci_write_fis_sdb()
From: |
Niklas Cassel |
Subject: |
[PATCH v3 7/8] hw/ide/ahci: fix ahci_write_fis_sdb() |
Date: |
Fri, 9 Jun 2023 16:08:43 +0200 |
From: Niklas Cassel <niklas.cassel@wdc.com>
When there is an error, we need to raise a TFES error irq, see AHCI 1.3.1,
5.3.13.1 SDB:Entry.
If ERR_STAT is set, we jump to state ERR:FatalTaskfile, which will raise
a TFES IRQ unconditionally, regardless if the I bit is set in the FIS or
not.
Thus, we should never raise a normal IRQ after having sent an error IRQ.
It is valid to signal successfully completed commands as finished in the
same SDB FIS that generates the error IRQ. The important thing is that
commands that did not complete successfully (e.g. commands that were
aborted, do not get the finished bit set).
Before this commit, there was never a TFES IRQ raised on NCQ error.
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
---
hw/ide/ahci.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 12aaadc554..ef6c9fc378 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -806,8 +806,14 @@ static void ahci_write_fis_sdb(AHCIState *s,
NCQTransferState *ncq_tfs)
pr->scr_act &= ~ad->finished;
ad->finished = 0;
- /* Trigger IRQ if interrupt bit is set (which currently, it always is) */
- if (sdb_fis->flags & 0x40) {
+ /*
+ * TFES IRQ is always raised if ERR_STAT is set, regardless of I bit.
+ * If ERR_STAT is not set, trigger SDBS IRQ if interrupt bit is set
+ * (which currently, it always is).
+ */
+ if (sdb_fis->status & ERR_STAT) {
+ ahci_trigger_irq(s, ad, AHCI_PORT_IRQ_BIT_TFES);
+ } else if (sdb_fis->flags & 0x40) {
ahci_trigger_irq(s, ad, AHCI_PORT_IRQ_BIT_SDBS);
}
}
--
2.40.1
- [PATCH v3 0/8] misc AHCI cleanups, Niklas Cassel, 2023/06/09
- [PATCH v3 1/8] hw/ide/ahci: remove stray backslash, Niklas Cassel, 2023/06/09
- [PATCH v3 2/8] hw/ide/core: set ERR_STAT in unsupported command completion, Niklas Cassel, 2023/06/09
- [PATCH v3 3/8] hw/ide/ahci: write D2H FIS when processing NCQ command, Niklas Cassel, 2023/06/09
- [PATCH v3 5/8] hw/ide/ahci: PxSACT and PxCI is cleared when PxCMD.ST is cleared, Niklas Cassel, 2023/06/09
- [PATCH v3 4/8] hw/ide/ahci: simplify and document PxCI handling, Niklas Cassel, 2023/06/09
- [PATCH v3 7/8] hw/ide/ahci: fix ahci_write_fis_sdb(),
Niklas Cassel <=
- [PATCH v3 6/8] hw/ide/ahci: PxCI should not get cleared when ERR_STAT is set, Niklas Cassel, 2023/06/09
- [PATCH v3 8/8] hw/ide/ahci: fix broken SError handling, Niklas Cassel, 2023/06/09