mirror of https://gitee.com/openkylin/linux.git
usb: dwc3: ep0: Add chained TRB support
Add chained TRB support to ep0. Now TRB's can be chained just by invoking _dwc3_ep0_start_trans_ with 'chain' parameter set to true. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
368ca113ca
commit
2abd9d5fa6
|
@ -70,7 +70,10 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,
|
||||||
return 0;
|
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->bpl = lower_32_bits(buf_dma);
|
||||||
trb->bph = upper_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 = type;
|
||||||
|
|
||||||
trb->ctrl |= (DWC3_TRB_CTRL_HWO
|
trb->ctrl |= (DWC3_TRB_CTRL_HWO
|
||||||
| DWC3_TRB_CTRL_LST
|
|
||||||
| DWC3_TRB_CTRL_IOC
|
|
||||||
| DWC3_TRB_CTRL_ISP_IMI);
|
| 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));
|
memset(¶ms, 0, sizeof(params));
|
||||||
params.param0 = upper_32_bits(dwc->ep0_trb_addr);
|
params.param0 = upper_32_bits(dwc->ep0_trb_addr);
|
||||||
params.param1 = lower_32_bits(dwc->ep0_trb_addr);
|
params.param1 = lower_32_bits(dwc->ep0_trb_addr);
|
||||||
|
|
|
@ -2687,7 +2687,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
|
||||||
goto err0;
|
goto err0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dwc->ep0_trb = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ep0_trb),
|
dwc->ep0_trb = dma_alloc_coherent(dwc->dev, sizeof(*dwc->ep0_trb) * 2,
|
||||||
&dwc->ep0_trb_addr, GFP_KERNEL);
|
&dwc->ep0_trb_addr, GFP_KERNEL);
|
||||||
if (!dwc->ep0_trb) {
|
if (!dwc->ep0_trb) {
|
||||||
dev_err(dwc->dev, "failed to allocate ep0 trb\n");
|
dev_err(dwc->dev, "failed to allocate ep0 trb\n");
|
||||||
|
|
Loading…
Reference in New Issue