]> git.ipfire.org Git - thirdparty/kernel/stable.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, 2 May 2025 05:47:02 +0000 (07:47 +0200)
[ Upstream commit eafba0205426091354f050381c32ad1567c35844 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/usb/dwc3/gadget.c

index 75f24febaee4b98a9e5c4a4e709e5218a2b74d32..3360a59c3d331b438ea12be937cbd7cde29da694 100644 (file)
@@ -555,6 +555,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;
@@ -571,8 +572,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;
 }
@@ -721,9 +727,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)) &
@@ -3525,6 +3533,8 @@ out:
 
                for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
                        dep = dwc->eps[i];
+                       if (!dep)
+                               continue;
 
                        if (!(dep->flags & DWC3_EP_ENABLED))
                                continue;
@@ -3713,6 +3723,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))