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

Commit c2fa65d8 authored by Devdutt Patnaik's avatar Devdutt Patnaik
Browse files

usb: dwc3: Allocate fixed h/w eps for GSI endpoints



Adds support to allocate specific hardware EPs to
GSI enabled endpoints. Creates EP list with names
"gsi-epin" for IN and "gsi-epout" for OUT EPs that
are intended for use by the GSI function driver.
The EPs are reserved from the end of the EP list.

CRs-Fixed: 946385

Change-Id: I70ebce8c2717baaea38f7b6235976d8a522eb9fd
Signed-off-by: default avatarDevdutt Patnaik <dpatnaik@codeaurora.org>
parent a3883c35
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -1089,11 +1089,6 @@ static void gsi_free_trbs(struct usb_ep *ep)
		dep->trb_pool = NULL;
		dep->trb_pool_dma = 0;
		dep->trb_dma_pool = NULL;
		/*
		 * Reset the ep_type to NORMAL, for next compostion
		 * switch which may be non-gsi.
		 */
		dep->endpoint.ep_type = EP_TYPE_NORMAL;
	}
}
/*
@@ -1114,9 +1109,6 @@ static void gsi_configure_ep(struct usb_ep *ep, struct usb_gsi_request *request)

	memset(&params, 0x00, sizeof(params));

	/* Set the ep_type as GSI */
	dep->endpoint.ep_type = EP_TYPE_GSI;

	/* Configure GSI EP */
	params.param0 = DWC3_DEPCFG_EP_TYPE(usb_endpoint_type(desc))
		| DWC3_DEPCFG_MAX_PACKET_SIZE(usb_endpoint_maxp(desc));
+37 −5
Original line number Diff line number Diff line
@@ -745,9 +745,12 @@ static int dwc3_gadget_ep_disable(struct usb_ep *ep)
		return 0;
	}

	/* Keep GSI ep names with "-gsi" suffix */
	if (!strnstr(dep->name, "gsi", 10)) {
		snprintf(dep->name, sizeof(dep->name), "ep%d%s",
			dep->number >> 1,
			(dep->number & 1) ? "in" : "out");
	}

	spin_lock_irqsave(&dwc->lock, flags);
	ret = __dwc3_gadget_ep_disable(dep);
@@ -2249,11 +2252,27 @@ static const struct usb_gadget_ops dwc3_gadget_ops = {

/* -------------------------------------------------------------------------- */

#define NUM_GSI_OUT_EPS	1
#define NUM_GSI_IN_EPS	2

static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc,
		u8 num, u32 direction)
{
	struct dwc3_ep			*dep;
	u8				i;
	u8				i, gsi_ep_count, gsi_ep_index = 0;

	/* Read number of event buffers to check if we need
	 * to update gsi_ep_count. For non GSI targets this
	 * will be 0 and we will skip reservation of GSI eps.
	 * There is one event buffer for each GSI EP.
	 */
	gsi_ep_count = dwc->num_gsi_event_buffers;
	/* OUT GSI EPs based on direction field */
	if (gsi_ep_count && !direction)
		gsi_ep_count = NUM_GSI_OUT_EPS;
	/* IN GSI EPs */
	else if (gsi_ep_count && direction)
		gsi_ep_count = NUM_GSI_IN_EPS;

	for (i = 0; i < num; i++) {
		u8 epnum = (i << 1) | (!!direction);
@@ -2267,12 +2286,25 @@ static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc,
		dep->direction = !!direction;
		dwc->eps[epnum] = dep;

		snprintf(dep->name, sizeof(dep->name), "ep%d%s", epnum >> 1,
				(epnum & 1) ? "in" : "out");
		/* Reserve EPs at the end for GSI based on gsi_ep_count */
		if ((gsi_ep_index < gsi_ep_count) &&
				(i > (num - 1 - gsi_ep_count))) {
			gsi_ep_index++;
			/* For GSI EPs, name eps as "gsi-epin" or "gsi-epout" */
			snprintf(dep->name, sizeof(dep->name), "%s",
				(epnum & 1) ? "gsi-epin" : "gsi-epout");
			/* Set ep type as GSI */
			dep->endpoint.ep_type = EP_TYPE_GSI;
		} else {
			snprintf(dep->name, sizeof(dep->name), "ep%d%s",
				epnum >> 1, (epnum & 1) ? "in" : "out");
		}

		dep->endpoint.ep_num = epnum >> 1;
		dep->endpoint.name = dep->name;

		dev_vdbg(dwc->dev, "initializing %s\n", dep->name);
		dev_vdbg(dwc->dev, "initializing %s %d\n",
				dep->name, epnum >> 1);

		if (epnum == 0 || epnum == 1) {
			usb_ep_set_maxpacket_limit(&dep->endpoint, 512);
+1 −0
Original line number Diff line number Diff line
@@ -268,6 +268,7 @@ struct usb_ep {
	const struct usb_endpoint_descriptor	*desc;
	const struct usb_ss_ep_comp_descriptor	*comp_desc;
	enum ep_type		ep_type;
	u8			ep_num;
	u8			ep_intr_num;
	bool			endless;
};