diff options
author | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-16 23:40:32 +0200 |
---|---|---|
committer | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-17 15:11:22 +0200 |
commit | 20ea6adbf199097c4f5f591ffee088340630dae4 (patch) | |
tree | d6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0166-xhci-Use-more-event-ring-segment-table-entries.patch | |
parent | bca05bd072180dc38ef740b37ded9572a6db1981 (diff) | |
download | upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2 upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip |
bcm27xx: add support for linux v5.15
Build system: x86_64
Build-tested: bcm2708, bcm2709, bcm2710, bcm2711
Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B
Signed-off-by: Marty Jones <mj8263788@gmail.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0166-xhci-Use-more-event-ring-segment-table-entries.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0166-xhci-Use-more-event-ring-segment-table-entries.patch | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0166-xhci-Use-more-event-ring-segment-table-entries.patch b/target/linux/bcm27xx/patches-5.15/950-0166-xhci-Use-more-event-ring-segment-table-entries.patch new file mode 100644 index 0000000000..e3f72fe95e --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0166-xhci-Use-more-event-ring-segment-table-entries.patch @@ -0,0 +1,60 @@ +From 271d837c58918de2cac5715798ebf71df43b39f7 Mon Sep 17 00:00:00 2001 +From: Jonathan Bell <jonathan@raspberrypi.org> +Date: Tue, 13 Aug 2019 15:53:29 +0100 +Subject: [PATCH] xhci: Use more event ring segment table entries + +Users have reported log spam created by "Event Ring Full" xHC event +TRBs. These are caused by interrupt latency in conjunction with a very +busy set of devices on the bus. The errors are benign, but throughput +will suffer as the xHC will pause processing of transfers until the +event ring is drained by the kernel. Expand the number of event TRB slots +available by increasing the number of event ring segments in the ERST. + +Controllers have a hardware-defined limit as to the number of ERST +entries they can process, so make the actual number in use +min(ERST_MAX_SEGS, hw_max). + +Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org> +--- + drivers/usb/host/xhci-mem.c | 8 +++++--- + drivers/usb/host/xhci.h | 4 ++-- + 2 files changed, 7 insertions(+), 5 deletions(-) + +--- a/drivers/usb/host/xhci-mem.c ++++ b/drivers/usb/host/xhci-mem.c +@@ -2511,9 +2511,11 @@ int xhci_mem_init(struct xhci_hcd *xhci, + * Event ring setup: Allocate a normal ring, but also setup + * the event ring segment table (ERST). Section 4.9.3. + */ ++ val2 = 1 << HCS_ERST_MAX(xhci->hcs_params2); ++ val2 = min_t(unsigned int, ERST_MAX_SEGS, val2); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Allocating event ring"); +- xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, 1, TYPE_EVENT, +- 0, flags); ++ xhci->event_ring = xhci_ring_alloc(xhci, val2, 1, TYPE_EVENT, ++ 0, flags); + if (!xhci->event_ring) + goto fail; + if (xhci_check_trb_in_td_math(xhci) < 0) +@@ -2526,7 +2528,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, + /* set ERST count with the number of entries in the segment table */ + val = readl(&xhci->ir_set->erst_size); + val &= ERST_SIZE_MASK; +- val |= ERST_NUM_SEGS; ++ val |= val2; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "// Write ERST size = %i to ir_set 0 (some bits preserved)", + val); +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -1673,8 +1673,8 @@ struct urb_priv { + * Each segment table entry is 4*32bits long. 1K seems like an ok size: + * (1K bytes * 8bytes/bit) / (4*32 bits) = 64 segment entries in the table, + * meaning 64 ring segments. +- * Initial allocated size of the ERST, in number of entries */ +-#define ERST_NUM_SEGS 1 ++ * Maximum number of segments in the ERST */ ++#define ERST_MAX_SEGS 8 + /* Poll every 60 seconds */ + #define POLL_TIMEOUT 60 + /* Stop endpoint command timeout (secs) for URB cancellation watchdog timer */ |