Commit d6e10bf2 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Felipe Balbi

usb: dwc3: avoid -Wmaybe-uninitialized warning

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: default avatarArnd Bergmann <arnd@arndb.de>
Fixes: 31162af4 ("usb: dwc3: gadget: avoid while (1) loop on completion")
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent c9ffc787
...@@ -1934,6 +1934,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, ...@@ -1934,6 +1934,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
{ {
struct dwc3_request *req, *n; struct dwc3_request *req, *n;
struct dwc3_trb *trb; struct dwc3_trb *trb;
bool ioc = false;
int ret; int ret;
list_for_each_entry_safe(req, n, &dep->started_list, list) { 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, ...@@ -1981,8 +1982,12 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
dwc3_gadget_giveback(dep, req, status); 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; break;
}
} }
/* /*
...@@ -2010,10 +2015,9 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, ...@@ -2010,10 +2015,9 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
return 1; return 1;
} }
if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && ioc)
if ((event->status & DEPEVT_STATUS_IOC) && return 0;
(trb->ctrl & DWC3_TRB_CTRL_IOC))
return 0;
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment