Manually rebased: bcm27xx/patches-5.15/950-0600-xhci-quirks-add-link-TRB-quirk-for-VL805.patch bcm27xx/patches-5.15/950-0606-usb-xhci-add-VLI_TRB_CACHE_BUG-quirk.patch bcm27xx/patches-5.15/950-0717-usb-xhci-add-a-quirk-for-Superspeed-bulk-OUT-transfe.patch bcm53xx/patches-5.15/180-usb-xhci-add-support-for-performing-fake-doorbell.patch lantiq/patches-5.15/0028-NET-lantiq-various-etop-fixes.patch All other patches automatically rebased Build system: x86_64 Build-tested: bcm2711/RPi4B, mt7622/RT3200 Run-tested: bcm2711/RPi4B, mt7622/RT3200 Signed-off-by: John Audia <therealgraysky@proton.me>
		
			
				
	
	
		
			61 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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
 | 
						|
@@ -2520,9 +2520,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)
 | 
						|
@@ -2535,7 +2537,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 */
 |