usb: ci_udc: don't assume QTDs are adjacent when transmitting ZLPs
authorStephen Warren <swarren@nvidia.com>
Tue, 1 Jul 2014 17:41:14 +0000 (11:41 -0600)
committerMarek Vasut <marex@denx.de>
Wed, 2 Jul 2014 13:45:38 +0000 (15:45 +0200)
Fix ci_ep_submit_next_request()'s ZLP transmission code to explicitly
call ci_get_qtd() to find the address of the other QTD to use. This
will allow us to correctly align each QTD individually in the future,
which may involve leaving a gap between the QTDs.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
drivers/usb/gadget/ci_udc.c

index 8ba604841c47802e059b85da281eb011090c47ac..4115cd5dab0fb91926ccd5295fdc17ef4402acad 100644 (file)
@@ -404,10 +404,11 @@ static void ci_ep_submit_next_request(struct ci_ep *ci_ep)
                 * only 1 is used at a time since either an IN or an OUT but
                 * not both is queued. For an IN transaction, item currently
                 * points at the second of these items, so we know that we
-                * can use (item - 1) to transmit the extra zero-length packet
+                * can use the other to transmit the extra zero-length packet.
                 */
-               item->next = (unsigned)(item - 1);
-               item--;
+               struct ept_queue_item *other_item = ci_get_qtd(num, 0);
+               item->next = (unsigned)other_item;
+               item = other_item;
                item->info = INFO_ACTIVE;
        }