[PATCH v2] usb: dwc3: gadget: Refine the logic for resizing Tx FIFOs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The current logic is rigid, setting num_fifos to fixed values:

3 for any maxburst greater than 1.
tx_fifo_resize_max_num for maxburst greater than 6.
Additionally, it did not differentiate much between bulk and
isochronous transfers, applying similar logic to both.

The new logic is more dynamic and tailored to the specific needs of
bulk and isochronous transfers:

Bulk Transfers: Ensures that num_fifos is optimized by considering
both the maxburst value and the maximum allowed number of FIFOs.

Isochronous Transfers: Ensures that num_fifos is sufficient by
considering the maxburst value and the maximum packet multiplier.

This change aims to optimize the allocation of Tx FIFOs for both bulk
and isochronous endpoints, potentially improving data transfer
efficiency and overall performance.
It also enhances support for all use cases, which can be tweaked
with DT parameters and the endpoint’s maxburst and maxpacket.

Signed-off-by: Akash Kumar <quic_akakum@xxxxxxxxxxx>
---
Changes for v2:
Redefine logic for resizing tx fifos.

Changes for v1:
Added additional condition to allocate tx fifo for hs isoc eps,
keeping the other resize logic same.
---
 drivers/usb/dwc3/gadget.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 89fc690fdf34..49809a931104 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -778,15 +778,12 @@ static int dwc3_gadget_resize_tx_fifos(struct dwc3_ep *dep)
 
 	ram1_depth = DWC3_RAM1_DEPTH(dwc->hwparams.hwparams7);
 
-	if ((dep->endpoint.maxburst > 1 &&
-	     usb_endpoint_xfer_bulk(dep->endpoint.desc)) ||
-	    usb_endpoint_xfer_isoc(dep->endpoint.desc))
-		num_fifos = 3;
-
-	if (dep->endpoint.maxburst > 6 &&
-	    (usb_endpoint_xfer_bulk(dep->endpoint.desc) ||
-	     usb_endpoint_xfer_isoc(dep->endpoint.desc)) && DWC3_IP_IS(DWC31))
-		num_fifos = dwc->tx_fifo_resize_max_num;
+	if (usb_endpoint_xfer_bulk(dep->endpoint.desc))
+		num_fifos = min_t(unsigned int, dep->endpoint.maxburst + 1,
+				  dwc->tx_fifo_resize_max_num);
+	if (usb_endpoint_xfer_isoc(dep->endpoint.desc))
+		num_fifos = max_t(unsigned int, dep->endpoint.maxburst,
+				  usb_endpoint_maxp_mult(dep->endpoint.desc));
 
 	/* FIFO size for a single buffer */
 	fifo = dwc3_gadget_calc_tx_fifo_size(dwc, 1);
-- 
2.17.1





[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux