Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.18.39 Removed upstreamed: backport-6.18/704-v7.2-netfilter-flowtable-fix-offloaded-ct-timeout-never-b.patch[1] All other patches automatically rebased via update_kernel.sh 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.18.39&id=81a5971cbe18b474b49c651e32f2194b2fb171fe Build system: x86/64 Build-tested: x86/64-glibc Run-tested: x86/64-glibc Signed-off-by: John Audia <therealgraysky@proton.me> Link: https://github.com/openwrt/openwrt/pull/24282 Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
61 lines
2.3 KiB
Diff
61 lines
2.3 KiB
Diff
From 4d173a0592c2aa01fd61c9356ff9497ab51aacd4 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
|
|
@@ -41,6 +41,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;
|
|
@@ -5000,7 +5004,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;
|
|
@@ -5064,7 +5068,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;
|