usb: gadget: f_accessory: Enabled Zero Length Packet (ZLP) for acc_write
authorAnson Jacob <ansonkuzhumbil@gmail.com>
Mon, 23 Jun 2014 11:07:44 +0000 (19:07 +0800)
committerJohn Stultz <john.stultz@linaro.org>
Tue, 16 Feb 2016 21:52:00 +0000 (13:52 -0800)
Accessory connected to Android Device requires
Zero Length Packet (ZLP) to be written when data
transferred out from the Android device are multiples
of wMaxPacketSize (64bytes (Full-Speed) / 512bytes (High-Speed))
to end the transfer.

Change-Id: Ib2c2c0ab98ef9afa10e74a720142deca5c0ed476
Signed-off-by: Anson Jacob <ansonkuzhumbil@gmail.com>
drivers/usb/gadget/f_accessory.c

index 73c6b2072d73f494d44910d30e528c22e4caa748..f8490c034107eabce7ac7f3d4f01de7cf23fa3df 100644 (file)
@@ -640,10 +640,17 @@ static ssize_t acc_write(struct file *fp, const char __user *buf,
                        break;
                }
 
-               if (count > BULK_BUFFER_SIZE)
+               if (count > BULK_BUFFER_SIZE) {
                        xfer = BULK_BUFFER_SIZE;
-               else
+                       /* ZLP, They will be more TX requests so not yet. */
+                       req->zero = 0;
+               } else {
                        xfer = count;
+                       /* If the data length is a multple of the
+                        * maxpacket size then send a zero length packet(ZLP).
+                       */
+                       req->zero = ((xfer % dev->ep_in->maxpacket) == 0);
+               }
                if (copy_from_user(req->buf, buf, xfer)) {
                        r = -EFAULT;
                        break;