]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
usb: dwc3: gadget: Refactor loop to avoid NULL endpoints
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 12 Feb 2025 19:28:02 +0000 (21:28 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2025 08:29:20 +0000 (09:29 +0100)
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: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: Ferry Toth <fntoth@gmail.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20250212193116.2487289-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/gadget.c

index d27af65eb08ae0adf024347f8408c1430bb4ee9b..73cebb7d90c243c3c1c4cbe04d7f8fc129cc9853 100644 (file)
@@ -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 @@ out:
 
                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))