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>
60 lines
2.3 KiB
Diff
60 lines
2.3 KiB
Diff
From fbadc723477d9cfe1d7c758bd1465d0e455565f0 Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Bell <jonathan@raspberrypi.com>
|
|
Date: Tue, 15 Apr 2025 14:44:07 +0100
|
|
Subject: [PATCH] usb: xhci: default to Intel scheme for calculating U1/U2
|
|
timeouts
|
|
|
|
By default, the System Exit Latency and Maximum Exit Latency are used to
|
|
calculate hub port U1 and U2 timeout values. This has the effect of
|
|
aggressively power-managing a SuperSpeed link but devices are known to
|
|
report unfeasibly short device exit latencies in their descriptors,
|
|
which under certain usage conditions can significantly degrade
|
|
throughput as the link spends longer retraining than being in a useable
|
|
state.
|
|
|
|
The Intel heuristic approach calculates a reasonably large
|
|
endpoint-dependent U1 timeout, and uses a minimum U2 timeout that is
|
|
several multiples of typical U2 exit latencies.
|
|
|
|
Add a module parameter that defaults to using this scheme.
|
|
|
|
This should have the effect of squelching interop edge-cases where LPM
|
|
noticeably degrades performance, and avoid the usual workaround where
|
|
userspace manually disables it.
|
|
|
|
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
|
---
|
|
drivers/usb/host/xhci.c | 8 ++++++--
|
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -39,6 +39,10 @@ static unsigned long long quirks;
|
|
module_param(quirks, ullong, S_IRUGO);
|
|
MODULE_PARM_DESC(quirks, "Bit flags for quirks to be enabled as default");
|
|
|
|
+static int sandbag_lpm = 1;
|
|
+module_param(sandbag_lpm, int, S_IRUGO | S_IWUSR);
|
|
+MODULE_PARM_DESC(sandbag_lpm, "Use relaxed U1/U2 port LPM timeouts");
|
|
+
|
|
static bool td_on_ring(struct xhci_td *td, struct xhci_ring *ring)
|
|
{
|
|
struct xhci_segment *seg = ring->first_seg;
|
|
@@ -4786,7 +4790,7 @@ static u16 xhci_calculate_u1_timeout(str
|
|
}
|
|
}
|
|
|
|
- if (xhci->quirks & (XHCI_INTEL_HOST | XHCI_ZHAOXIN_HOST))
|
|
+ if (sandbag_lpm || xhci->quirks & (XHCI_INTEL_HOST | XHCI_ZHAOXIN_HOST))
|
|
timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc);
|
|
else
|
|
timeout_ns = udev->u1_params.sel;
|
|
@@ -4850,7 +4854,7 @@ static u16 xhci_calculate_u2_timeout(str
|
|
}
|
|
}
|
|
|
|
- if (xhci->quirks & (XHCI_INTEL_HOST | XHCI_ZHAOXIN_HOST))
|
|
+ if (sandbag_lpm || xhci->quirks & (XHCI_INTEL_HOST | XHCI_ZHAOXIN_HOST))
|
|
timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc);
|
|
else
|
|
timeout_ns = udev->u2_params.sel;
|