Message ID | 20230609140844.202795-8-nks@flawful.org |
---|---|
State | New |
Headers | show |
Series | misc AHCI cleanups | expand |
On 9/6/23 16:08, Niklas Cassel wrote: > 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(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
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); } }