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

Commit f5a8583f authored by Mayank Rana's avatar Mayank Rana Committed by Hemant Kumar
Browse files

Revert "usb: dwc3: gadget: always enable IOC on bulk/interrupt transfers"



This change reverts Commit f3af3651 ("usb: dwc3: gadget: always
enable IOC on bulk/interrupt transfers") which sets IOC bit for both
bulk/interrupt transfers resulting into interrupt for each TRB
completion with event as XFERINPROGRESS. In some cases it has been
observed that controller is not able to complete provided TRB on
bulk-in endpoint causing stall conditions. Hence Fix this issue by not
setting IOC bit for each TRB to receive XFERCOMPLETE interrupt with it.

Change-Id: I5ff08188f37044332f7dadba8d677288e83bfec8
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent ef529d56
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -891,11 +891,19 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
			trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST;
		else
			trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS;

		if (!req->request.no_interrupt && !chain)
			trb->ctrl |= DWC3_TRB_CTRL_IOC;
		break;

	case USB_ENDPOINT_XFER_BULK:
	case USB_ENDPOINT_XFER_INT:
		trb->ctrl = DWC3_TRBCTL_NORMAL;
		if (req->request.num_mapped_sgs > 0) {
			if (!last && !chain &&
				!req->request.no_interrupt)
				trb->ctrl |= DWC3_TRB_CTRL_IOC;
		}
		break;
	default:
		/*
@@ -905,9 +913,6 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
		BUG();
	}

	if (!req->request.no_interrupt && !chain)
		trb->ctrl |= DWC3_TRB_CTRL_IOC;

	if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
		trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
		trb->ctrl |= DWC3_TRB_CTRL_CSP;
@@ -2477,6 +2482,9 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
		return 1;
	}

	if ((event->status & DEPEVT_STATUS_IOC) &&
			(trb->ctrl & DWC3_TRB_CTRL_IOC))
		return 0;
	return 1;
}