Message ID | 20230609140844.202795-6-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> > > According to AHCI 1.3.1 definition of PxSACT: > This field is cleared when PxCMD.ST is written from a '1' to a '0' by > software. This field is not cleared by a COMRESET or a software reset. Interesting, since its origin in commit f6ad2e32f8 ("ahci: add ahci emulation") PxSACT is reset unconditionally in ahci_reset_port(). As for this patch: Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> > According to AHCI 1.3.1 definition of PxCI: > This field is also cleared when PxCMD.ST is written from a '1' to a '0' > by software. > > Clearing PxCMD.ST is part of the error recovery procedure, see > AHCI 1.3.1, section "6.2 Error Recovery". > > If we don't clear PxCI on error recovery, the previous command will > incorrectly still be marked as pending after error recovery. > > Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com> > --- > hw/ide/ahci.c | 5 +++++ > 1 file changed, 5 insertions(+)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 3deaf01add..a31e6fa65e 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -329,6 +329,11 @@ static void ahci_port_write(AHCIState *s, int port, int offset, uint32_t val) ahci_check_irq(s); break; case AHCI_PORT_REG_CMD: + if ((pr->cmd & PORT_CMD_START) && !(val & PORT_CMD_START)) { + pr->scr_act = 0; + pr->cmd_issue = 0; + } + /* Block any Read-only fields from being set; * including LIST_ON and FIS_ON. * The spec requires to set ICC bits to zero after the ICC change