Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.37 Manually rebased patch: generic/hack-6.12/902-debloat_proc.patch[1] New Kconfig symbol: x86: enable MITIGATION_TSA[2] All other patches are automatically refreshed. [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.37&id=ead91de35d9cd5c4f80ec51e6020f342079170af [2] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.37&id=7a0395f6607a5d01e2b2a86355596b3f1224acbd Signed-off-by: Shiji Yang <yangshiji66@outlook.com> Link: https://github.com/openwrt/openwrt/pull/19317 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
41 lines
1.6 KiB
Diff
41 lines
1.6 KiB
Diff
From ffed949237b748631402bd096d2e015796afe802 Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Bell <jonathan@raspberrypi.com>
|
|
Date: Wed, 11 Aug 2021 15:33:57 +0100
|
|
Subject: [PATCH] usb: xhci: workaround for bogus SET_DEQ_PENDING endpoint
|
|
state
|
|
|
|
See https://github.com/raspberrypi/linux/issues/3981
|
|
|
|
An unknown unsafe memory access can result in the ep_state variable
|
|
in xhci_virt_ep being trampled with a stuck SET_DEQ_PENDING state
|
|
despite successful completion of a Set TR Deq Pointer command.
|
|
|
|
All URB enqueue/dequeue calls for the endpoint will fail in this state
|
|
so no transfers are possible until the device is reconnected.
|
|
|
|
As a workaround, clear the flag if we see it set and issue a new Set
|
|
TR Deq command anyway - this should be harmless, as a prior Set TR Deq
|
|
command will only have been issued in the Stopped state, and if the
|
|
endpoint is Running then the controller is required to ignore it and
|
|
respond with a Context State Error event TRB.
|
|
|
|
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
|
---
|
|
drivers/usb/host/xhci-ring.c | 6 +++---
|
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
--- a/drivers/usb/host/xhci-ring.c
|
|
+++ b/drivers/usb/host/xhci-ring.c
|
|
@@ -719,9 +719,9 @@ static int xhci_move_dequeue_past_td(str
|
|
}
|
|
|
|
if ((ep->ep_state & SET_DEQ_PENDING)) {
|
|
- xhci_warn(xhci, "Set TR Deq already pending, don't submit for 0x%pad\n",
|
|
- &addr);
|
|
- return -EBUSY;
|
|
+ xhci_warn(xhci, "WARN A Set TR Deq Ptr command is pending for slot %u ep %u\n",
|
|
+ slot_id, ep_index);
|
|
+ ep->ep_state &= ~SET_DEQ_PENDING;
|
|
}
|
|
|
|
/* This function gets called from contexts where it cannot sleep */
|