Commit eafba020 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Greg Kroah-Hartman
Browse files

usb: dwc3: gadget: Refactor loop to avoid NULL endpoints



Prepare the gadget driver to handle the reserved endpoints that will be
not allocated at the initialisation time.

While at it, add a warning where the NULL endpoint should never happen.

Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: default avatarFerry Toth <fntoth@gmail.com>
Acked-by: default avatarThinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20250212193116.2487289-3-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8bc8a32a
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -547,6 +547,7 @@ static int dwc3_gadget_set_xfer_resource(struct dwc3_ep *dep)
int dwc3_gadget_start_config(struct dwc3 *dwc, unsigned int resource_index)
{
	struct dwc3_gadget_ep_cmd_params params;
	struct dwc3_ep		*dep;
	u32			cmd;
	int			i;
	int			ret;
@@ -563,8 +564,13 @@ int dwc3_gadget_start_config(struct dwc3 *dwc, unsigned int resource_index)
		return ret;

	/* Reset resource allocation flags */
	for (i = resource_index; i < dwc->num_eps && dwc->eps[i]; i++)
		dwc->eps[i]->flags &= ~DWC3_EP_RESOURCE_ALLOCATED;
	for (i = resource_index; i < dwc->num_eps; i++) {
		dep = dwc->eps[i];
		if (!dep)
			continue;

		dep->flags &= ~DWC3_EP_RESOURCE_ALLOCATED;
	}

	return 0;
}
@@ -751,9 +757,11 @@ void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc)

	dwc->last_fifo_depth = fifo_depth;
	/* Clear existing TXFIFO for all IN eps except ep0 */
	for (num = 3; num < min_t(int, dwc->num_eps, DWC3_ENDPOINTS_NUM);
	     num += 2) {
	for (num = 3; num < min_t(int, dwc->num_eps, DWC3_ENDPOINTS_NUM); num += 2) {
		dep = dwc->eps[num];
		if (!dep)
			continue;

		/* Don't change TXFRAMNUM on usb31 version */
		size = DWC3_IP_IS(DWC3) ? 0 :
			dwc3_readl(dwc->regs, DWC3_GTXFIFOSIZ(num >> 1)) &
@@ -3669,6 +3677,8 @@ static bool dwc3_gadget_endpoint_trbs_complete(struct dwc3_ep *dep,

		for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
			dep = dwc->eps[i];
			if (!dep)
				continue;

			if (!(dep->flags & DWC3_EP_ENABLED))
				continue;
@@ -3818,6 +3828,10 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
	u8			epnum = event->endpoint_number;

	dep = dwc->eps[epnum];
	if (!dep) {
		dev_warn(dwc->dev, "spurious event, endpoint %u is not allocated\n", epnum);
		return;
	}

	if (!(dep->flags & DWC3_EP_ENABLED)) {
		if ((epnum > 1) && !(dep->flags & DWC3_EP_TRANSFER_STARTED))