Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ca186c5 authored by Mayank Rana's avatar Mayank Rana
Browse files

dwc3: Fix USB TRB ring initialization in BAM2BAM case



With unexpected TRB ring initialization USB BAM2BAM functionality
stalls. Hence use trb_enqueue as index to get TRB from TRB pool
to initialize TRB ring for BAM2BAM case.

CRs-Fixed: 2064160
Change-Id: I1cfbb9985fa5c9f1c56f2636e0e2bf7e7f3bec73
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent e13b3810
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -617,8 +617,8 @@ static int __dwc3_msm_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
	list_add_tail(&req->list, &dep->started_list);

	/* First, prepare a normal TRB, point to the fake buffer */
	trb = &dep->trb_pool[dep->trb_enqueue & DWC3_TRB_NUM];
	dep->trb_enqueue++;
	trb = &dep->trb_pool[dep->trb_enqueue];
	dwc3_ep_inc_enq(dep);
	memset(trb, 0, sizeof(*trb));

	req->trb = trb;
@@ -629,8 +629,8 @@ static int __dwc3_msm_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
	req->trb_dma = dwc3_trb_dma_offset(dep, trb);

	/* Second, prepare a Link TRB that points to the first TRB*/
	trb_link = &dep->trb_pool[dep->trb_enqueue & DWC3_TRB_NUM];
	dep->trb_enqueue++;
	trb_link = &dep->trb_pool[dep->trb_enqueue];
	dwc3_ep_inc_enq(dep);
	memset(trb_link, 0, sizeof(*trb_link));

	trb_link->bpl = lower_32_bits(req->trb_dma);
+2 −2
Original line number Diff line number Diff line
@@ -164,12 +164,12 @@ static void dwc3_ep_inc_trb(u8 *index)
		*index = 0;
}

static void dwc3_ep_inc_enq(struct dwc3_ep *dep)
void dwc3_ep_inc_enq(struct dwc3_ep *dep)
{
	dwc3_ep_inc_trb(&dep->trb_enqueue);
}

static void dwc3_ep_inc_deq(struct dwc3_ep *dep)
void dwc3_ep_inc_deq(struct dwc3_ep *dep)
{
	dwc3_ep_inc_trb(&dep->trb_dequeue);
}
+2 −0
Original line number Diff line number Diff line
@@ -98,6 +98,8 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value, int protocol);
void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force);
irqreturn_t dwc3_interrupt(int irq, void *_dwc);
void dwc3_bh_work(struct work_struct *w);
void dwc3_ep_inc_enq(struct dwc3_ep *dep);
void dwc3_ep_inc_deq(struct dwc3_ep *dep);

static inline dma_addr_t dwc3_trb_dma_offset(struct dwc3_ep *dep,
		struct dwc3_trb *trb)