Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
[firefly-linux-kernel-4.4.55.git] / drivers / usb / gadget / printer.c
index 69b76efd11e9bea3f11d9d2effe293c04045f01c..6474081dcbaff171dcc1413d78de383716977dcd 100644 (file)
@@ -427,12 +427,17 @@ setup_rx_reqs(struct printer_dev *dev)
                req->length = USB_BUFSIZE;
                req->complete = rx_complete;
 
+               /* here, we unlock, and only unlock, to avoid deadlock. */
+               spin_unlock(&dev->lock);
                error = usb_ep_queue(dev->out_ep, req, GFP_ATOMIC);
+               spin_lock(&dev->lock);
                if (error) {
                        DBG(dev, "rx submit --> %d\n", error);
                        list_add(&req->list, &dev->rx_reqs);
                        break;
-               } else {
+               }
+               /* if the req is empty, then add it into dev->rx_reqs_active. */
+               else if (list_empty(&req->list)) {
                        list_add(&req->list, &dev->rx_reqs_active);
                }
        }
@@ -1133,6 +1138,7 @@ static int __init printer_bind_config(struct usb_configuration *c)
                                  NULL, "g_printer");
        if (IS_ERR(dev->pdev)) {
                ERROR(dev, "Failed to create device: g_printer\n");
+               status = PTR_ERR(dev->pdev);
                goto fail;
        }