mirror of
https://github.com/Heleguo/lede.git
synced 2025-12-16 19:01:32 +00:00
Manually rebased: bcm27xx/patches-6.12/950-0018-arm64-setup-Fix-build-warning.patch All other patches automatically rebased. Signed-off-by: John Audia <therealgraysky@proton.me>
61 lines
2.3 KiB
Diff
61 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;
|
|
@@ -4791,7 +4795,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;
|
|
@@ -4855,7 +4859,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;
|