| From 1fedfcbada84fcf380cd7135d948ea0f572c8e6c Mon Sep 17 00:00:00 2001 |
| From: Minas Harutyunyan <minas.harutyunyan@synopsys.com> |
| Date: Mon, 18 Mar 2019 14:24:30 +0400 |
| Subject: usb: dwc2: gadget: Increase descriptors count for ISOC's |
| |
| [ Upstream commit 54f37f56631747075f1f9a2f0edf6ba405e3e66c ] |
| |
| Some function drivers queueing more than 128 ISOC requests at a time. |
| To avoid "descriptor chain full" cases, increasing descriptors count |
| from MAX_DMA_DESC_NUM_GENERIC to MAX_DMA_DESC_NUM_HS_ISOC for ISOC's |
| only. |
| |
| Signed-off-by: Minas Harutyunyan <hminas@synopsys.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/dwc2/gadget.c | 27 +++++++++++++++------------ |
| 1 file changed, 15 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c |
| index 6812a8a3a98ba..a749de7604c62 100644 |
| --- a/drivers/usb/dwc2/gadget.c |
| +++ b/drivers/usb/dwc2/gadget.c |
| @@ -714,13 +714,11 @@ static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep) |
| unsigned int maxsize; |
| |
| if (is_isoc) |
| - maxsize = hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT : |
| - DEV_DMA_ISOC_RX_NBYTES_LIMIT; |
| + maxsize = (hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT : |
| + DEV_DMA_ISOC_RX_NBYTES_LIMIT) * |
| + MAX_DMA_DESC_NUM_HS_ISOC; |
| else |
| - maxsize = DEV_DMA_NBYTES_LIMIT; |
| - |
| - /* Above size of one descriptor was chosen, multiple it */ |
| - maxsize *= MAX_DMA_DESC_NUM_GENERIC; |
| + maxsize = DEV_DMA_NBYTES_LIMIT * MAX_DMA_DESC_NUM_GENERIC; |
| |
| return maxsize; |
| } |
| @@ -932,7 +930,7 @@ static int dwc2_gadget_fill_isoc_desc(struct dwc2_hsotg_ep *hs_ep, |
| |
| /* Update index of last configured entry in the chain */ |
| hs_ep->next_desc++; |
| - if (hs_ep->next_desc >= MAX_DMA_DESC_NUM_GENERIC) |
| + if (hs_ep->next_desc >= MAX_DMA_DESC_NUM_HS_ISOC) |
| hs_ep->next_desc = 0; |
| |
| return 0; |
| @@ -964,7 +962,7 @@ static void dwc2_gadget_start_isoc_ddma(struct dwc2_hsotg_ep *hs_ep) |
| } |
| |
| /* Initialize descriptor chain by Host Busy status */ |
| - for (i = 0; i < MAX_DMA_DESC_NUM_GENERIC; i++) { |
| + for (i = 0; i < MAX_DMA_DESC_NUM_HS_ISOC; i++) { |
| desc = &hs_ep->desc_list[i]; |
| desc->status = 0; |
| desc->status |= (DEV_DMA_BUFF_STS_HBUSY |
| @@ -2162,7 +2160,7 @@ static void dwc2_gadget_complete_isoc_request_ddma(struct dwc2_hsotg_ep *hs_ep) |
| dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0); |
| |
| hs_ep->compl_desc++; |
| - if (hs_ep->compl_desc > (MAX_DMA_DESC_NUM_GENERIC - 1)) |
| + if (hs_ep->compl_desc > (MAX_DMA_DESC_NUM_HS_ISOC - 1)) |
| hs_ep->compl_desc = 0; |
| desc_sts = hs_ep->desc_list[hs_ep->compl_desc].status; |
| } |
| @@ -3899,6 +3897,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep, |
| unsigned int i, val, size; |
| int ret = 0; |
| unsigned char ep_type; |
| + int desc_num; |
| |
| dev_dbg(hsotg->dev, |
| "%s: ep %s: a 0x%02x, attr 0x%02x, mps 0x%04x, intr %d\n", |
| @@ -3945,11 +3944,15 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep, |
| dev_dbg(hsotg->dev, "%s: read DxEPCTL=0x%08x from 0x%08x\n", |
| __func__, epctrl, epctrl_reg); |
| |
| + if (using_desc_dma(hsotg) && ep_type == USB_ENDPOINT_XFER_ISOC) |
| + desc_num = MAX_DMA_DESC_NUM_HS_ISOC; |
| + else |
| + desc_num = MAX_DMA_DESC_NUM_GENERIC; |
| + |
| /* Allocate DMA descriptor chain for non-ctrl endpoints */ |
| if (using_desc_dma(hsotg) && !hs_ep->desc_list) { |
| hs_ep->desc_list = dmam_alloc_coherent(hsotg->dev, |
| - MAX_DMA_DESC_NUM_GENERIC * |
| - sizeof(struct dwc2_dma_desc), |
| + desc_num * sizeof(struct dwc2_dma_desc), |
| &hs_ep->desc_list_dma, GFP_ATOMIC); |
| if (!hs_ep->desc_list) { |
| ret = -ENOMEM; |
| @@ -4092,7 +4095,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep, |
| |
| error2: |
| if (ret && using_desc_dma(hsotg) && hs_ep->desc_list) { |
| - dmam_free_coherent(hsotg->dev, MAX_DMA_DESC_NUM_GENERIC * |
| + dmam_free_coherent(hsotg->dev, desc_num * |
| sizeof(struct dwc2_dma_desc), |
| hs_ep->desc_list, hs_ep->desc_list_dma); |
| hs_ep->desc_list = NULL; |
| -- |
| 2.20.1 |
| |