69 lines
2.1 KiB
Diff
69 lines
2.1 KiB
Diff
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
|
|
index 0a10aa2f8f5c..d7c5a3d1c4de 100644
|
|
--- a/drivers/usb/dwc2/gadget.c
|
|
+++ b/drivers/usb/dwc2/gadget.c
|
|
@@ -226,10 +226,7 @@ int dwc2_hsotg_tx_fifo_total_depth(struct dwc2_hsotg *hsotg)
|
|
{
|
|
int addr;
|
|
int tx_addr_max;
|
|
- u32 np_tx_fifo_size;
|
|
-
|
|
- np_tx_fifo_size = min_t(u32, hsotg->hw_params.dev_nperio_tx_fifo_size,
|
|
- hsotg->params.g_np_tx_fifo_size);
|
|
+ u32 np_tx_fifo_size = hsotg->params.g_np_tx_fifo_size;
|
|
|
|
/* Get Endpoint Info Control block size in DWORDs. */
|
|
tx_addr_max = hsotg->hw_params.total_fifo_size;
|
|
diff --git a/drivers/usb/dwc2/params.c b/drivers/usb/dwc2/params.c
|
|
index 5d29c2157fbe..b25f7399b41c 100644
|
|
--- a/drivers/usb/dwc2/params.c
|
|
+++ b/drivers/usb/dwc2/params.c
|
|
@@ -767,6 +767,35 @@ static void dwc2_check_param_tx_fifo_sizes(struct dwc2_hsotg *hsotg)
|
|
}
|
|
}
|
|
|
|
+static void dwc2_check_param_fifo_total(struct dwc2_hsotg *hsotg)
|
|
+{
|
|
+ struct dwc2_core_params *p = &hsotg->params;
|
|
+ u32 total_tx = 0;
|
|
+ u32 max_np;
|
|
+ int fifo_count;
|
|
+ int fifo;
|
|
+
|
|
+ fifo_count = dwc2_hsotg_tx_fifo_count(hsotg);
|
|
+ for (fifo = 1; fifo <= fifo_count; fifo++)
|
|
+ total_tx += p->g_tx_fifo_size[fifo];
|
|
+
|
|
+ if (p->g_rx_fifo_size + p->g_np_tx_fifo_size + total_tx <=
|
|
+ hsotg->hw_params.total_fifo_size)
|
|
+ return;
|
|
+
|
|
+ max_np = 16;
|
|
+ if (hsotg->hw_params.total_fifo_size > p->g_rx_fifo_size + total_tx)
|
|
+ max_np = hsotg->hw_params.total_fifo_size -
|
|
+ p->g_rx_fifo_size - total_tx;
|
|
+ if (max_np < 16)
|
|
+ max_np = 16;
|
|
+
|
|
+ dev_warn(hsotg->dev,
|
|
+ "%s: FIFO sizes exceed total, clamping g_np_tx_fifo_size to %u\n",
|
|
+ __func__, max_np);
|
|
+ p->g_np_tx_fifo_size = max_np;
|
|
+}
|
|
+
|
|
static void dwc2_check_param_eusb2_disc(struct dwc2_hsotg *hsotg)
|
|
{
|
|
u32 gsnpsid;
|
|
@@ -879,9 +879,10 @@ static void dwc2_check_params(struct dwc2_hsotg *hsotg)
|
|
CHECK_RANGE(g_rx_fifo_size,
|
|
16, hw->rx_fifo_size,
|
|
hw->rx_fifo_size);
|
|
CHECK_RANGE(g_np_tx_fifo_size,
|
|
- 16, hw->dev_nperio_tx_fifo_size,
|
|
+ 16, hw->total_fifo_size,
|
|
hw->dev_nperio_tx_fifo_size);
|
|
dwc2_check_param_tx_fifo_sizes(hsotg);
|
|
+ dwc2_check_param_fifo_total(hsotg);
|
|
}
|
|
}
|