On Fri, Aug 28 2015, Peter Chen wrote: > From: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > > 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. > > (Fixed the 'line over 80 characters warning' by Peter Chen) > Tested-by: Peter Chen <peter.chen@xxxxxxxxxxxxx> > Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> I think this requires your signed-off-by as well. Acked-by: Michal Nazarewicz <mina86@xxxxxxxxxx> > --- > 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 481a935..da0afd0e 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; > } > > @@ -2172,7 +2185,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; > @@ -2190,7 +2204,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; > @@ -2207,7 +2222,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; > @@ -2224,7 +2240,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; > -- > 1.9.1 > -- Best regards, _ _ .o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o ..o | Computer Science, ミハウ “mina86” ナザレヴイツ (o o) ooo +--<mpn@xxxxxxxxxx>--<xmpp:mina86@xxxxxxxxxx>-----ooO--(_)--Ooo-- -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html