From fdf3e5f02cc34035ce50a9031658fdb7bef4bf9c Mon Sep 17 00:00:00 2001 From: Mayank Rana Date: Wed, 5 Oct 2016 09:43:05 -0700 Subject: dwc3: gadget: Don't memset TRB ring with zero related to USB GSI endpoint USB GSI endpoint related TRB ring is allocated with EP_OPS. Each USB endpoint related TRB ring is zeroed with usb_ep_disable() operation. Hence if USB composition switch or USB cable disconnect is performed when there is active data transfer with USB GSI endpoint, it results into IPA GSI accessing 0x0 address causing bus errors. Hence fix this issue by not memsetting TRB ring with zero for USB GSI endpoint. CRs-Fixed: 1072782 Change-Id: I92df514e31d5168b8dff4b249f4d8fd3e70c0118 Signed-off-by: Mayank Rana --- drivers/usb/dwc3/gadget.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 4ad994972b19..805c5e1931e1 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -421,7 +421,16 @@ static void dwc3_free_trb_pool(struct dwc3_ep *dep) if (dep->endpoint.ep_type == EP_TYPE_GSI) return; - if (dep->trb_pool && dep->trb_pool_dma) { + /* + * Clean up ep ring to avoid getting xferInProgress due to stale trbs + * with HWO bit set from previous composition when update transfer cmd + * is issued. + */ + if (dep->number > 1 && dep->trb_pool && dep->trb_pool_dma) { + memset(&dep->trb_pool[0], 0, + sizeof(struct dwc3_trb) * dep->num_trbs); + dbg_event(dep->number, "Clr_TRB", 0); + dma_free_coherent(dwc->dev, sizeof(struct dwc3_trb) * DWC3_TRB_NUM, dep->trb_pool, dep->trb_pool_dma); @@ -723,17 +732,6 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep) (dep->number & 1) ? "in" : "out"); } - /* - * Clean up ep ring of non-control endpoint to avoid getting xferInProgress - * due to stale trbs with HWO bit set from previous composition when update - * transfer cmd is issued. - */ - if (dep->number > 1 && dep->trb_pool) { - memset(&dep->trb_pool[0], 0, - sizeof(struct dwc3_trb) * dep->num_trbs); - dbg_event(dep->number, "Clr_TRB", 0); - } - return 0; } -- cgit v1.2.3