|
@@ -70,7 +70,10 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- trb = dwc->ep0_trb;
|
|
|
+ trb = &dwc->ep0_trb[dep->free_slot];
|
|
|
+
|
|
|
+ if (chain)
|
|
|
+ dep->free_slot++;
|
|
|
|
|
|
trb->bpl = lower_32_bits(buf_dma);
|
|
|
trb->bph = upper_32_bits(buf_dma);
|
|
@@ -78,10 +81,17 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,
|
|
|
trb->ctrl = type;
|
|
|
|
|
|
trb->ctrl |= (DWC3_TRB_CTRL_HWO
|
|
|
- | DWC3_TRB_CTRL_LST
|
|
|
- | DWC3_TRB_CTRL_IOC
|
|
|
| DWC3_TRB_CTRL_ISP_IMI);
|
|
|
|
|
|
+ if (chain)
|
|
|
+ trb->ctrl |= DWC3_TRB_CTRL_CHN;
|
|
|
+ else
|
|
|
+ trb->ctrl |= (DWC3_TRB_CTRL_IOC
|
|
|
+ | DWC3_TRB_CTRL_LST);
|
|
|
+
|
|
|
+ if (chain)
|
|
|
+ return 0;
|
|
|
+
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
|
params.param0 = upper_32_bits(dwc->ep0_trb_addr);
|
|
|
params.param1 = lower_32_bits(dwc->ep0_trb_addr);
|