If we found a matching driver but its bind() function failed for some
reason, let's continue our search as there may be some other gadget
pending on a list which bind() will succeed for this udc.

Reported-by: Alan Stern <st...@rowland.harvard.edu>
Signed-off-by: Krzysztof Opasiak <k.opas...@samsung.com>
---
 drivers/usb/gadget/udc/core.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
index a83e6017a8b0..b02a166ba380 100644
--- a/drivers/usb/gadget/udc/core.c
+++ b/drivers/usb/gadget/udc/core.c
@@ -1083,16 +1083,22 @@ static void usb_udc_nop_release(struct device *dev)
 /* should be called with udc_lock held */
 static int check_pending_gadget_drivers(struct usb_udc *udc)
 {
-       struct usb_gadget_driver *driver;
+       struct usb_gadget_driver *driver, *tmp;
        int ret = 0;
 
-       list_for_each_entry(driver, &gadget_driver_pending_list, pending)
+       list_for_each_entry_safe(driver, tmp, &gadget_driver_pending_list,
+                                pending)
                if (!driver->udc_name || strcmp(driver->udc_name,
                                                dev_name(&udc->dev)) == 0) {
                        ret = udc_bind_to_driver(udc, driver);
+                       if (ret == 0)
+                               break;
                        if (ret != -EPROBE_DEFER)
                                list_del_init(&driver->pending);
-                       break;
+                       /*
+                        * We failed to bind this driver, so let's try
+                        * next one.
+                        */
                }
 
        return ret;
-- 
2.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to