usb: dwc3: avoid -Wmaybe-uninitialized warning
authorArnd Bergmann <arnd@arndb.de>
Fri, 9 Sep 2016 10:01:51 +0000 (12:01 +0200)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 9 Sep 2016 11:56:06 +0000 (14:56 +0300)
Cleaning up the loop in dwc3_cleanup_done_reqs() introduced a
gcc warning if built with "-Wmaybe-uninitialized":

drivers/usb/dwc3/gadget.c: In function 'dwc3_endpoint_transfer_complete':
drivers/usb/dwc3/gadget.c:2015:9: 'trb' may be used uninitialized in this function [-Wmaybe-uninitialized]

I believe it is a false positive and we always have a valid 'trb'
pointer at the end of the function, but neither I nor the compiler
are able to prove that.

This works around the warning by computing a flag earlier in the function
when it's guaranteed to be valid, which tells the compiler that it's
safe and makes it easier to understand to me.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Fixes: 31162af447d7 ("usb: dwc3: gadget: avoid while (1) loop on completion")
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/gadget.c

index 37a8652..a5d496d 100644 (file)
@@ -1934,6 +1934,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
 {
        struct dwc3_request     *req, *n;
        struct dwc3_trb         *trb;
+       bool                    ioc = false;
        int                     ret;
 
        list_for_each_entry_safe(req, n, &dep->started_list, list) {
@@ -1981,8 +1982,12 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
 
                dwc3_gadget_giveback(dep, req, status);
 
-               if (ret)
+               if (ret) {
+                       if ((event->status & DEPEVT_STATUS_IOC) &&
+                           (trb->ctrl & DWC3_TRB_CTRL_IOC))
+                               ioc = true;
                        break;
+               }
        }
 
        /*
@@ -2010,10 +2015,9 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
                return 1;
        }
 
-       if (usb_endpoint_xfer_isoc(dep->endpoint.desc))
-               if ((event->status & DEPEVT_STATUS_IOC) &&
-                               (trb->ctrl & DWC3_TRB_CTRL_IOC))
-                       return 0;
+       if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && ioc)
+               return 0;
+
        return 1;
 }