usb: dwc2: gadget: Increase descriptors count for ISOC's
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>
This commit is contained in:

committed by
Felipe Balbi

parent
4035c5b5f2
commit
54f37f5663
@@ -716,13 +716,11 @@ static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep)
|
|||||||
unsigned int maxsize;
|
unsigned int maxsize;
|
||||||
|
|
||||||
if (is_isoc)
|
if (is_isoc)
|
||||||
maxsize = hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT :
|
maxsize = (hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT :
|
||||||
DEV_DMA_ISOC_RX_NBYTES_LIMIT;
|
DEV_DMA_ISOC_RX_NBYTES_LIMIT) *
|
||||||
|
MAX_DMA_DESC_NUM_HS_ISOC;
|
||||||
else
|
else
|
||||||
maxsize = DEV_DMA_NBYTES_LIMIT;
|
maxsize = DEV_DMA_NBYTES_LIMIT * MAX_DMA_DESC_NUM_GENERIC;
|
||||||
|
|
||||||
/* Above size of one descriptor was chosen, multiple it */
|
|
||||||
maxsize *= MAX_DMA_DESC_NUM_GENERIC;
|
|
||||||
|
|
||||||
return maxsize;
|
return maxsize;
|
||||||
}
|
}
|
||||||
@@ -934,7 +932,7 @@ static int dwc2_gadget_fill_isoc_desc(struct dwc2_hsotg_ep *hs_ep,
|
|||||||
|
|
||||||
/* Update index of last configured entry in the chain */
|
/* Update index of last configured entry in the chain */
|
||||||
hs_ep->next_desc++;
|
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;
|
hs_ep->next_desc = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -966,7 +964,7 @@ static void dwc2_gadget_start_isoc_ddma(struct dwc2_hsotg_ep *hs_ep)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize descriptor chain by Host Busy status */
|
/* 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 = &hs_ep->desc_list[i];
|
||||||
desc->status = 0;
|
desc->status = 0;
|
||||||
desc->status |= (DEV_DMA_BUFF_STS_HBUSY
|
desc->status |= (DEV_DMA_BUFF_STS_HBUSY
|
||||||
@@ -2173,7 +2171,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);
|
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0);
|
||||||
|
|
||||||
hs_ep->compl_desc++;
|
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;
|
hs_ep->compl_desc = 0;
|
||||||
desc_sts = hs_ep->desc_list[hs_ep->compl_desc].status;
|
desc_sts = hs_ep->desc_list[hs_ep->compl_desc].status;
|
||||||
}
|
}
|
||||||
@@ -3915,6 +3913,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
|
|||||||
unsigned int i, val, size;
|
unsigned int i, val, size;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned char ep_type;
|
unsigned char ep_type;
|
||||||
|
int desc_num;
|
||||||
|
|
||||||
dev_dbg(hsotg->dev,
|
dev_dbg(hsotg->dev,
|
||||||
"%s: ep %s: a 0x%02x, attr 0x%02x, mps 0x%04x, intr %d\n",
|
"%s: ep %s: a 0x%02x, attr 0x%02x, mps 0x%04x, intr %d\n",
|
||||||
@@ -3961,11 +3960,15 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
|
|||||||
dev_dbg(hsotg->dev, "%s: read DxEPCTL=0x%08x from 0x%08x\n",
|
dev_dbg(hsotg->dev, "%s: read DxEPCTL=0x%08x from 0x%08x\n",
|
||||||
__func__, epctrl, epctrl_reg);
|
__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 */
|
/* Allocate DMA descriptor chain for non-ctrl endpoints */
|
||||||
if (using_desc_dma(hsotg) && !hs_ep->desc_list) {
|
if (using_desc_dma(hsotg) && !hs_ep->desc_list) {
|
||||||
hs_ep->desc_list = dmam_alloc_coherent(hsotg->dev,
|
hs_ep->desc_list = dmam_alloc_coherent(hsotg->dev,
|
||||||
MAX_DMA_DESC_NUM_GENERIC *
|
desc_num * sizeof(struct dwc2_dma_desc),
|
||||||
sizeof(struct dwc2_dma_desc),
|
|
||||||
&hs_ep->desc_list_dma, GFP_ATOMIC);
|
&hs_ep->desc_list_dma, GFP_ATOMIC);
|
||||||
if (!hs_ep->desc_list) {
|
if (!hs_ep->desc_list) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@@ -4108,7 +4111,7 @@ error1:
|
|||||||
|
|
||||||
error2:
|
error2:
|
||||||
if (ret && using_desc_dma(hsotg) && hs_ep->desc_list) {
|
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),
|
sizeof(struct dwc2_dma_desc),
|
||||||
hs_ep->desc_list, hs_ep->desc_list_dma);
|
hs_ep->desc_list, hs_ep->desc_list_dma);
|
||||||
hs_ep->desc_list = NULL;
|
hs_ep->desc_list = NULL;
|
||||||
|
Reference in New Issue
Block a user