Re: [RFT 5/5] xhci: Fix register save/restore order.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2012/3/17 Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>:
> The xHCI 1.0 spec errata released on June 13, 2011, changes the ordering
> that the xHCI registers are saved and restored in.  It moves the
> interrupt pending (IMAN) and interrupt control (IMOD) registers to be
> saved and restored last.  I believe that's because the host controller
> may attempt to fetch the event ring table when interrupts are
> re-enabled.  Therefore we need to restore the event ring registers
> before we re-enable interrupts.

The patch is correct according to errata files 1-7, but it can't fix the
suspend operation issue of VIA xHCI host. The result is same as
the RFT 4/5 and RFT 2/5.

Best Regards,
Elric Fu

>
> Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
> ---
>  drivers/usb/host/xhci.c |    8 ++++----
>  1 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index dcc4972..5f0d152 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -667,11 +667,11 @@ static void xhci_save_registers(struct xhci_hcd *xhci)
>        xhci->s3.dev_nt = xhci_readl(xhci, &xhci->op_regs->dev_notification);
>        xhci->s3.dcbaa_ptr = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr);
>        xhci->s3.config_reg = xhci_readl(xhci, &xhci->op_regs->config_reg);
> -       xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending);
> -       xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control);
>        xhci->s3.erst_size = xhci_readl(xhci, &xhci->ir_set->erst_size);
>        xhci->s3.erst_base = xhci_read_64(xhci, &xhci->ir_set->erst_base);
>        xhci->s3.erst_dequeue = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue);
> +       xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending);
> +       xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control);
>  }
>
>  static void xhci_restore_registers(struct xhci_hcd *xhci)
> @@ -680,11 +680,11 @@ static void xhci_restore_registers(struct xhci_hcd *xhci)
>        xhci_writel(xhci, xhci->s3.dev_nt, &xhci->op_regs->dev_notification);
>        xhci_write_64(xhci, xhci->s3.dcbaa_ptr, &xhci->op_regs->dcbaa_ptr);
>        xhci_writel(xhci, xhci->s3.config_reg, &xhci->op_regs->config_reg);
> -       xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending);
> -       xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control);
>        xhci_writel(xhci, xhci->s3.erst_size, &xhci->ir_set->erst_size);
>        xhci_write_64(xhci, xhci->s3.erst_base, &xhci->ir_set->erst_base);
>        xhci_write_64(xhci, xhci->s3.erst_dequeue, &xhci->ir_set->erst_dequeue);
> +       xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending);
> +       xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control);
>  }
>
>  static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci)
> --
> 1.7.9
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux