usb: gadget: f_sourcesink: format data pattern according to max packet size
authorPeter Chen <peter.chen@freescale.com>
Tue, 1 Sep 2015 01:48:02 +0000 (09:48 +0800)
committerFelipe Balbi <balbi@ti.com>
Sun, 27 Sep 2015 15:54:31 +0000 (10:54 -0500)
Since the host and gadget can't agree with transfer length before
each transfer, but they agree with max packet size for each
endpoint, we use max packet size to format data pattern.

Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/function/f_sourcesink.c

index cbfaf86fe45652911744055d6549a88c88b056d3..37c7a51bd89820f8c1e9789e153cf450f37a6e4c 100644 (file)
@@ -489,6 +489,7 @@ static int check_read_data(struct f_sourcesink *ss, struct usb_request *req)
        unsigned                i;
        u8                      *buf = req->buf;
        struct usb_composite_dev *cdev = ss->function.config->cdev;
+       int max_packet_size = le16_to_cpu(ss->out_ep->desc->wMaxPacketSize);
 
        if (pattern == 2)
                return 0;
@@ -510,7 +511,7 @@ static int check_read_data(struct f_sourcesink *ss, struct usb_request *req)
                 * stutter for any reason, including buffer duplication...)
                 */
                case 1:
-                       if (*buf == (u8)(i % 63))
+                       if (*buf == (u8)((i % max_packet_size) % 63))
                                continue;
                        break;
                }
@@ -525,6 +526,7 @@ static void reinit_write_data(struct usb_ep *ep, struct usb_request *req)
 {
        unsigned        i;
        u8              *buf = req->buf;
+       int max_packet_size = le16_to_cpu(ep->desc->wMaxPacketSize);
 
        switch (pattern) {
        case 0:
@@ -532,7 +534,7 @@ static void reinit_write_data(struct usb_ep *ep, struct usb_request *req)
                break;
        case 1:
                for  (i = 0; i < req->length; i++)
-                       *buf++ = (u8) (i % 63);
+                       *buf++ = (u8) ((i % max_packet_size) % 63);
                break;
        case 2:
                break;