diff options
| -rw-r--r-- | drivers/usb/dwc2/gadget.c | 27 |
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 | ||
| 4109 | error2: | 4112 | error2: |
| 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; |
