On Fri, Apr 28, 2023 at 9:23 AM Niklas Cassel <[email protected]> wrote:
>
> From: Niklas Cassel <[email protected]>
>
> 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.
>
> 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 <[email protected]>
ACK.
> ---
> hw/ide/ahci.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
> index 366929132b..2a59d0e0f5 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
> --
> 2.40.0
>