X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fusb%2Fmisc%2Fusbtest.c;h=ccc5e8238bd889581b2b445cdb4b26108b5c6644;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=983e104dd4520653baa6f61c4ca2ccff10a16ba5;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 983e104dd..ccc5e8238 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -801,9 +802,7 @@ error: if (u == urb || !u->dev) continue; - spin_unlock(&ctx->lock); status = usb_unlink_urb (u); - spin_lock(&ctx->lock); switch (status) { case -EINPROGRESS: case -EBUSY: @@ -1242,12 +1241,11 @@ done: static int ctrl_out (struct usbtest_dev *dev, unsigned count, unsigned length, unsigned vary) { - unsigned i, j, len; - int retval; + unsigned i, j, len, retval; u8 *buf; char *what = "?"; struct usb_device *udev; - + if (length < 1 || length > 0xffff || vary >= length) return -EINVAL; @@ -1337,9 +1335,7 @@ struct iso_context { unsigned pending; spinlock_t lock; struct completion done; - int submit_error; unsigned long errors; - unsigned long packet_count; struct usbtest_dev *dev; }; @@ -1350,14 +1346,10 @@ static void iso_callback (struct urb *urb, struct pt_regs *regs) spin_lock(&ctx->lock); ctx->count--; - ctx->packet_count += urb->number_of_packets; if (urb->error_count > 0) ctx->errors += urb->error_count; - else if (urb->status != 0) - ctx->errors += urb->number_of_packets; - if (urb->status == 0 && ctx->count > (ctx->pending - 1) - && !ctx->submit_error) { + if (urb->status == 0 && ctx->count > (ctx->pending - 1)) { int status = usb_submit_urb (urb, GFP_ATOMIC); switch (status) { case 0: @@ -1368,8 +1360,6 @@ static void iso_callback (struct urb *urb, struct pt_regs *regs) status); /* FALLTHROUGH */ case -ENODEV: /* disconnected */ - case -ESHUTDOWN: /* endpoint disabled */ - ctx->submit_error = 1; break; } } @@ -1379,8 +1369,8 @@ static void iso_callback (struct urb *urb, struct pt_regs *regs) if (ctx->pending == 0) { if (ctx->errors) dev_dbg (&ctx->dev->intf->dev, - "iso test, %lu errors out of %lu\n", - ctx->errors, ctx->packet_count); + "iso test, %lu errors\n", + ctx->errors); complete (&ctx->done); } done: @@ -1441,14 +1431,15 @@ test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, struct usb_device *udev; unsigned i; unsigned long packets = 0; - int status = 0; + int status; struct urb *urbs[10]; /* FIXME no limit */ if (param->sglen > 10) return -EDOM; - memset(&context, 0, sizeof context); context.count = param->iterations * param->sglen; + context.pending = param->sglen; + context.errors = 0; context.dev = dev; init_completion (&context.done); spin_lock_init (&context.lock); @@ -1480,7 +1471,6 @@ test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, spin_lock_irq (&context.lock); for (i = 0; i < param->sglen; i++) { - ++context.pending; status = usb_submit_urb (urbs [i], SLAB_ATOMIC); if (status < 0) { ERROR (dev, "submit iso[%d], error %d\n", i, status); @@ -1491,26 +1481,12 @@ test_iso_queue (struct usbtest_dev *dev, struct usbtest_param *param, simple_free_urb (urbs [i]); context.pending--; - context.submit_error = 1; - break; } } spin_unlock_irq (&context.lock); wait_for_completion (&context.done); - - /* - * Isochronous transfers are expected to fail sometimes. As an - * arbitrary limit, we will report an error if any submissions - * fail or if the transfer failure rate is > 10%. - */ - if (status != 0) - ; - else if (context.submit_error) - status = -EACCES; - else if (context.errors > context.packet_count / 10) - status = -EIO; - return status; + return 0; fail: for (i = 0; i < param->sglen; i++) {