Re: [PATCH 4/5] xhci: Fix command ring pointer corruption while aborting a command

Mathias Nyman
2021-10-25T11:21:45Z

Hi

>> This patch cause suspend to disk resume usb not work, xhci_hcd 0000:00:14.0:
>> Abort failed to stop command ring: -110.

Thanks for the report, this is odd.

Could you double check that by reverting this patch resume start working again.

If this is the case maybe we need to write all 64bits before this xHC hardware reacts to
CRCR register changes.

Maybe following changes on top of current patch could help:

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 311597bba80e..32665637d5e5 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -366,7 +366,7 @@ static void xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci,
/* Must be called with xhci->lock held, releases and aquires lock back */
static int xhci_abort_cmd_ring(struct xhci_hcd *xhci, unsigned long flags)
{
- u32 temp_32;
+ u64 crcr;
int ret;

xhci_dbg(xhci, "Abort command ring\n");
@@ -375,13 +375,15 @@ static int xhci_abort_cmd_ring(struct xhci_hcd *xhci, unsigned long flags)

/*
* The control bits like command stop, abort are located in lower
- * dword of the command ring control register. Limit the write
- * to the lower dword to avoid corrupting the command ring pointer
- * in case if the command ring is stopped by the time upper dword
- * is written.
+ * dword of the command ring control register. Some hw require all
+ * 64 bits to be written, starting with lower dword.
+ * Make sure the upper dword is valid to avoid corrupting the command
+ * ring pointer in case if the command ring is stopped by the time upper
+ * dword is written.
*/
- temp_32 = readl(&xhci->op_regs->cmd_ring);
- writel(temp_32 | CMD_RING_ABORT, &xhci->op_regs->cmd_ring);
+ crcr = xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg,
+ xhci->cmd_ring->dequeue);
+ xhci_write_64(xhci, crcr | CMD_RING_ABORT, &xhci->op_regs->cmd_ring);

/* Section 4.6.1.2 of xHCI 1.0 spec says software should also time the
* completion of the Command Abort operation. If CRR is not negated in 5

-Mathias