4.2.8-ckt12 -stable review patch.  If anyone has any objections, please let me 
know.

---8<------------------------------------------------------------

From: Alan Stern <[email protected]>

commit b9a6e8e1001e28fecbd74c073f5503dac2790563 upstream.

With this change, the host and gadget doesn't need to agree with transfer
length for comparing the data, since they doesn't know each other's
transfer size, but know max packet size.

Signed-off-by: Peter Chen <[email protected]>
Acked-by: Michal Nazarewicz <[email protected]>
(Fixed the 'line over 80 characters warning' by Peter Chen)
Tested-by: Peter Chen <[email protected]>
Signed-off-by: Alan Stern <[email protected]>
Signed-off-by: Felipe Balbi <[email protected]>

Signed-off-by: Kamal Mostafa <[email protected]>
---
 drivers/usb/misc/usbtest.c | 35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
index 0bbafe7..46bb062 100644
--- a/drivers/usb/misc/usbtest.c
+++ b/drivers/usb/misc/usbtest.c
@@ -303,11 +303,20 @@ static unsigned mod_pattern;
 module_param_named(pattern, mod_pattern, uint, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(mod_pattern, "i/o pattern (0 == zeroes)");
 
-static inline void simple_fill_buf(struct urb *urb)
+static unsigned get_maxpacket(struct usb_device *udev, int pipe)
+{
+       struct usb_host_endpoint        *ep;
+
+       ep = usb_pipe_endpoint(udev, pipe);
+       return le16_to_cpup(&ep->desc.wMaxPacketSize);
+}
+
+static void simple_fill_buf(struct urb *urb)
 {
        unsigned        i;
        u8              *buf = urb->transfer_buffer;
        unsigned        len = urb->transfer_buffer_length;
+       unsigned        maxpacket;
 
        switch (pattern) {
        default:
@@ -316,8 +325,9 @@ static inline void simple_fill_buf(struct urb *urb)
                memset(buf, 0, len);
                break;
        case 1:                 /* mod63 */
+               maxpacket = get_maxpacket(urb->dev, urb->pipe);
                for (i = 0; i < len; i++)
-                       *buf++ = (u8) (i % 63);
+                       *buf++ = (u8) ((i % maxpacket) % 63);
                break;
        }
 }
@@ -349,6 +359,7 @@ static int simple_check_buf(struct usbtest_dev *tdev, 
struct urb *urb)
        u8              expected;
        u8              *buf = urb->transfer_buffer;
        unsigned        len = urb->actual_length;
+       unsigned        maxpacket = get_maxpacket(urb->dev, urb->pipe);
 
        int ret = check_guard_bytes(tdev, urb);
        if (ret)
@@ -366,7 +377,7 @@ static int simple_check_buf(struct usbtest_dev *tdev, 
struct urb *urb)
                 * with set_interface or set_config.
                 */
                case 1:                 /* mod63 */
-                       expected = i % 63;
+                       expected = (i % maxpacket) % 63;
                        break;
                /* always fail unsupported patterns */
                default:
@@ -478,11 +489,13 @@ static void free_sglist(struct scatterlist *sg, int nents)
 }
 
 static struct scatterlist *
-alloc_sglist(int nents, int max, int vary)
+alloc_sglist(int nents, int max, int vary, struct usbtest_dev *dev, int pipe)
 {
        struct scatterlist      *sg;
        unsigned                i;
        unsigned                size = max;
+       unsigned                maxpacket =
+               get_maxpacket(interface_to_usbdev(dev->intf), pipe);
 
        if (max == 0)
                return NULL;
@@ -511,7 +524,7 @@ alloc_sglist(int nents, int max, int vary)
                        break;
                case 1:
                        for (j = 0; j < size; j++)
-                               *buf++ = (u8) (j % 63);
+                               *buf++ = (u8) ((j % maxpacket) % 63);
                        break;
                }
 
@@ -2175,7 +2188,8 @@ usbtest_ioctl(struct usb_interface *intf, unsigned int 
code, void *buf)
                        "TEST 5:  write %d sglists %d entries of %d bytes\n",
                                param->iterations,
                                param->sglen, param->length);
-               sg = alloc_sglist(param->sglen, param->length, 0);
+               sg = alloc_sglist(param->sglen, param->length,
+                               0, dev, dev->out_pipe);
                if (!sg) {
                        retval = -ENOMEM;
                        break;
@@ -2193,7 +2207,8 @@ usbtest_ioctl(struct usb_interface *intf, unsigned int 
code, void *buf)
                        "TEST 6:  read %d sglists %d entries of %d bytes\n",
                                param->iterations,
                                param->sglen, param->length);
-               sg = alloc_sglist(param->sglen, param->length, 0);
+               sg = alloc_sglist(param->sglen, param->length,
+                               0, dev, dev->in_pipe);
                if (!sg) {
                        retval = -ENOMEM;
                        break;
@@ -2210,7 +2225,8 @@ usbtest_ioctl(struct usb_interface *intf, unsigned int 
code, void *buf)
                        "TEST 7:  write/%d %d sglists %d entries 0..%d bytes\n",
                                param->vary, param->iterations,
                                param->sglen, param->length);
-               sg = alloc_sglist(param->sglen, param->length, param->vary);
+               sg = alloc_sglist(param->sglen, param->length,
+                               param->vary, dev, dev->out_pipe);
                if (!sg) {
                        retval = -ENOMEM;
                        break;
@@ -2227,7 +2243,8 @@ usbtest_ioctl(struct usb_interface *intf, unsigned int 
code, void *buf)
                        "TEST 8:  read/%d %d sglists %d entries 0..%d bytes\n",
                                param->vary, param->iterations,
                                param->sglen, param->length);
-               sg = alloc_sglist(param->sglen, param->length, param->vary);
+               sg = alloc_sglist(param->sglen, param->length,
+                               param->vary, dev, dev->in_pipe);
                if (!sg) {
                        retval = -ENOMEM;
                        break;
-- 
2.7.4

Reply via email to