|
@@ -555,6 +555,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
|
|
size_t size; /* Amount of data in a TX request. */
|
|
|
size_t bytes_copied = 0;
|
|
|
struct usb_request *req;
|
|
|
+ int value;
|
|
|
|
|
|
DBG(dev, "printer_write trying to send %d bytes\n", (int)len);
|
|
|
|
|
@@ -634,7 +635,11 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
|
|
return -EAGAIN;
|
|
|
}
|
|
|
|
|
|
- if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) {
|
|
|
+ /* here, we unlock, and only unlock, to avoid deadlock. */
|
|
|
+ spin_unlock(&dev->lock);
|
|
|
+ value = usb_ep_queue(dev->in_ep, req, GFP_ATOMIC);
|
|
|
+ spin_lock(&dev->lock);
|
|
|
+ if (value) {
|
|
|
list_add(&req->list, &dev->tx_reqs);
|
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
|
mutex_unlock(&dev->lock_printer_io);
|