aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/dwc2/gadget.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 5f314a10a116..fafd9cc9c8b2 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -716,13 +716,11 @@ static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep)
716 unsigned int maxsize; 716 unsigned int maxsize;
717 717
718 if (is_isoc) 718 if (is_isoc)
719 maxsize = hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT : 719 maxsize = (hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT :
720 DEV_DMA_ISOC_RX_NBYTES_LIMIT; 720 DEV_DMA_ISOC_RX_NBYTES_LIMIT) *
721 MAX_DMA_DESC_NUM_HS_ISOC;
721 else 722 else
722 maxsize = DEV_DMA_NBYTES_LIMIT; 723 maxsize = DEV_DMA_NBYTES_LIMIT * MAX_DMA_DESC_NUM_GENERIC;
723
724 /* Above size of one descriptor was chosen, multiple it */
725 maxsize *= MAX_DMA_DESC_NUM_GENERIC;
726 724
727 return maxsize; 725 return maxsize;
728} 726}
@@ -934,7 +932,7 @@ static int dwc2_gadget_fill_isoc_desc(struct dwc2_hsotg_ep *hs_ep,
934 932
935 /* Update index of last configured entry in the chain */ 933 /* Update index of last configured entry in the chain */
936 hs_ep->next_desc++; 934 hs_ep->next_desc++;
937 if (hs_ep->next_desc >= MAX_DMA_DESC_NUM_GENERIC) 935 if (hs_ep->next_desc >= MAX_DMA_DESC_NUM_HS_ISOC)
938 hs_ep->next_desc = 0; 936 hs_ep->next_desc = 0;
939 937
940 return 0; 938 return 0;
@@ -966,7 +964,7 @@ static void dwc2_gadget_start_isoc_ddma(struct dwc2_hsotg_ep *hs_ep)
966 } 964 }
967 965
968 /* Initialize descriptor chain by Host Busy status */ 966 /* Initialize descriptor chain by Host Busy status */
969 for (i = 0; i < MAX_DMA_DESC_NUM_GENERIC; i++) { 967 for (i = 0; i < MAX_DMA_DESC_NUM_HS_ISOC; i++) {
970 desc = &hs_ep->desc_list[i]; 968 desc = &hs_ep->desc_list[i];
971 desc->status = 0; 969 desc->status = 0;
972 desc->status |= (DEV_DMA_BUFF_STS_HBUSY 970 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)
2173 dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0); 2171 dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0);
2174 2172
2175 hs_ep->compl_desc++; 2173 hs_ep->compl_desc++;
2176 if (hs_ep->compl_desc > (MAX_DMA_DESC_NUM_GENERIC - 1)) 2174 if (hs_ep->compl_desc > (MAX_DMA_DESC_NUM_HS_ISOC - 1))
2177 hs_ep->compl_desc = 0; 2175 hs_ep->compl_desc = 0;
2178 desc_sts = hs_ep->desc_list[hs_ep->compl_desc].status; 2176 desc_sts = hs_ep->desc_list[hs_ep->compl_desc].status;
2179 } 2177 }
@@ -3915,6 +3913,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
3915 unsigned int i, val, size; 3913 unsigned int i, val, size;
3916 int ret = 0; 3914 int ret = 0;
3917 unsigned char ep_type; 3915 unsigned char ep_type;
3916 int desc_num;
3918 3917
3919 dev_dbg(hsotg->dev, 3918 dev_dbg(hsotg->dev,
3920 "%s: ep %s: a 0x%02x, attr 0x%02x, mps 0x%04x, intr %d\n", 3919 "%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,
3961 dev_dbg(hsotg->dev, "%s: read DxEPCTL=0x%08x from 0x%08x\n", 3960 dev_dbg(hsotg->dev, "%s: read DxEPCTL=0x%08x from 0x%08x\n",
3962 __func__, epctrl, epctrl_reg); 3961 __func__, epctrl, epctrl_reg);
3963 3962
3963 if (using_desc_dma(hsotg) && ep_type == USB_ENDPOINT_XFER_ISOC)
3964 desc_num = MAX_DMA_DESC_NUM_HS_ISOC;
3965 else
3966 desc_num = MAX_DMA_DESC_NUM_GENERIC;
3967
3964 /* Allocate DMA descriptor chain for non-ctrl endpoints */ 3968 /* Allocate DMA descriptor chain for non-ctrl endpoints */
3965 if (using_desc_dma(hsotg) && !hs_ep->desc_list) { 3969 if (using_desc_dma(hsotg) && !hs_ep->desc_list) {
3966 hs_ep->desc_list = dmam_alloc_coherent(hsotg->dev, 3970 hs_ep->desc_list = dmam_alloc_coherent(hsotg->dev,
3967 MAX_DMA_DESC_NUM_GENERIC * 3971 desc_num * sizeof(struct dwc2_dma_desc),
3968 sizeof(struct dwc2_dma_desc),
3969 &hs_ep->desc_list_dma, GFP_ATOMIC); 3972 &hs_ep->desc_list_dma, GFP_ATOMIC);
3970 if (!hs_ep->desc_list) { 3973 if (!hs_ep->desc_list) {
3971 ret = -ENOMEM; 3974 ret = -ENOMEM;
@@ -4108,7 +4111,7 @@ error1:
4108 4111
4109error2: 4112error2:
4110 if (ret && using_desc_dma(hsotg) && hs_ep->desc_list) { 4113 if (ret && using_desc_dma(hsotg) && hs_ep->desc_list) {
4111 dmam_free_coherent(hsotg->dev, MAX_DMA_DESC_NUM_GENERIC * 4114 dmam_free_coherent(hsotg->dev, desc_num *
4112 sizeof(struct dwc2_dma_desc), 4115 sizeof(struct dwc2_dma_desc),
4113 hs_ep->desc_list, hs_ep->desc_list_dma); 4116 hs_ep->desc_list, hs_ep->desc_list_dma);
4114 hs_ep->desc_list = NULL; 4117 hs_ep->desc_list = NULL;