aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/dwc2/gadget.c20
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 */
837static void dwc2_gadget_config_nonisoc_xfer_ddma(struct dwc2_hsotg_ep *hs_ep, 837static 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),