]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: gadget: printer: enqueue printer's response for setup request
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Tue, 3 Mar 2015 09:52:05 +0000 (10:52 +0100)
committerFelipe Balbi <balbi@ti.com>
Tue, 10 Mar 2015 20:33:34 +0000 (15:33 -0500)
Function-specific setup requests should be handled in such a way, that
apart from filling in the data buffer, the requests are also actually
enqueued: if function-specific setup is called from composte_setup(),
the "usb_ep_queue()" block of code in composite_setup() is skipped.

The printer function lacks this part and it results in e.g. get device id
requests failing: the host expects some response, the device prepares it
but does not equeue it for sending to the host, so the host finally asserts
timeout.

This patch adds enqueueing the prepared responses.

Cc: <stable@vger.kernel.org> # v3.4+
Fixes: 2e87edf49227: "usb: gadget: make g_printer use composite"
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/legacy/printer.c

index 90545980542f2c7c14e5f669444d012de5e73e26..6385c198c1348ee0455e8d6ebdc78b1aba34d0d1 100644 (file)
@@ -1031,6 +1031,15 @@ static int printer_func_setup(struct usb_function *f,
                break;
        }
        /* host either stalls (value < 0) or reports success */
+       if (value >= 0) {
+               req->length = value;
+               req->zero = value < wLength;
+               value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
+               if (value < 0) {
+                       ERROR(dev, "%s:%d Error!\n", __func__, __LINE__);
+                       req->status = 0;
+               }
+       }
        return value;
 }