diff options
-rw-r--r-- | drivers/usb/dwc2/gadget.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 1d4aef8d4137..bff48a8a1984 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c | |||
@@ -835,19 +835,22 @@ static void dwc2_gadget_fill_nonisoc_xfer_ddma_one(struct dwc2_hsotg_ep *hs_ep, | |||
835 | * with corresponding information based on transfer data. | 835 | * with corresponding information based on transfer data. |
836 | */ | 836 | */ |
837 | static void dwc2_gadget_config_nonisoc_xfer_ddma(struct dwc2_hsotg_ep *hs_ep, | 837 | static void dwc2_gadget_config_nonisoc_xfer_ddma(struct dwc2_hsotg_ep *hs_ep, |
838 | struct usb_request *ureq, | 838 | dma_addr_t dma_buff, |
839 | unsigned int offset, | ||
840 | unsigned int len) | 839 | unsigned int len) |
841 | { | 840 | { |
841 | struct usb_request *ureq = NULL; | ||
842 | struct dwc2_dma_desc *desc = hs_ep->desc_list; | 842 | struct dwc2_dma_desc *desc = hs_ep->desc_list; |
843 | struct scatterlist *sg; | 843 | struct scatterlist *sg; |
844 | int i; | 844 | int i; |
845 | u8 desc_count = 0; | 845 | u8 desc_count = 0; |
846 | 846 | ||
847 | if (hs_ep->req) | ||
848 | ureq = &hs_ep->req->req; | ||
849 | |||
847 | /* non-DMA sg buffer */ | 850 | /* non-DMA sg buffer */ |
848 | if (!ureq->num_sgs) { | 851 | if (!ureq || !ureq->num_sgs) { |
849 | dwc2_gadget_fill_nonisoc_xfer_ddma_one(hs_ep, &desc, | 852 | dwc2_gadget_fill_nonisoc_xfer_ddma_one(hs_ep, &desc, |
850 | ureq->dma + offset, len, true); | 853 | dma_buff, len, true); |
851 | return; | 854 | return; |
852 | } | 855 | } |
853 | 856 | ||
@@ -1135,7 +1138,7 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg, | |||
1135 | offset = ureq->actual; | 1138 | offset = ureq->actual; |
1136 | 1139 | ||
1137 | /* Fill DDMA chain entries */ | 1140 | /* Fill DDMA chain entries */ |
1138 | dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, ureq, offset, | 1141 | dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, ureq->dma + offset, |
1139 | length); | 1142 | length); |
1140 | 1143 | ||
1141 | /* write descriptor chain address to control register */ | 1144 | /* write descriptor chain address to control register */ |
@@ -2037,12 +2040,13 @@ static void dwc2_hsotg_program_zlp(struct dwc2_hsotg *hsotg, | |||
2037 | dev_dbg(hsotg->dev, "Receiving zero-length packet on ep%d\n", | 2040 | dev_dbg(hsotg->dev, "Receiving zero-length packet on ep%d\n", |
2038 | index); | 2041 | index); |
2039 | if (using_desc_dma(hsotg)) { | 2042 | if (using_desc_dma(hsotg)) { |
2043 | /* Not specific buffer needed for ep0 ZLP */ | ||
2044 | dma_addr_t dma = hs_ep->desc_list_dma; | ||
2045 | |||
2040 | if (!index) | 2046 | if (!index) |
2041 | dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep); | 2047 | dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep); |
2042 | 2048 | ||
2043 | /* Not specific buffer needed for ep0 ZLP */ | 2049 | dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, dma, 0); |
2044 | dwc2_gadget_fill_nonisoc_xfer_ddma_one(hs_ep, &hs_ep->desc_list, | ||
2045 | hs_ep->desc_list_dma, 0, true); | ||
2046 | } else { | 2050 | } else { |
2047 | dwc2_writel(hsotg, DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) | | 2051 | dwc2_writel(hsotg, DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) | |
2048 | DXEPTSIZ_XFERSIZE(0), | 2052 | DXEPTSIZ_XFERSIZE(0), |