From aecad7cfd20b4d290b6b1269b7c8c4019b2a4841 Mon Sep 17 00:00:00 2001 From: David Lopo Date: Tue, 29 Apr 2008 10:14:38 +0100 Subject: [PATCH] --- yaml --- r: 95807 b: refs/heads/master c: 62fd2cac5bf5cf9e6fcb2fc40b32e7271e605c53 h: refs/heads/master i: 95805: b41951d832ed610d154a31225379bded3defe22c 95803: 1120fb0c4fbba943157d3384c8ffd0a338db7294 95799: d57b43b8baf4648a2dc7fcb997a4083361c85184 95791: 911a7d7d7bbd11e12d3372b3950bbabf75f54c10 95775: 95b0238e00476a9841442bdb2c782cb16452342d 95743: d7dfffab0cb0b2509279ad7a6225a5971bd1b718 v: v3 --- [refs] | 2 +- trunk/drivers/usb/gadget/file_storage.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index d04238bb7fd1..5b57a7d0af47 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a5e54b0dbb6a099793caf508b1d6c7d82f965ec3 +refs/heads/master: 62fd2cac5bf5cf9e6fcb2fc40b32e7271e605c53 diff --git a/trunk/drivers/usb/gadget/file_storage.c b/trunk/drivers/usb/gadget/file_storage.c index bf3f946fd455..47bb9f09a1aa 100644 --- a/trunk/drivers/usb/gadget/file_storage.c +++ b/trunk/drivers/usb/gadget/file_storage.c @@ -2307,6 +2307,29 @@ static int halt_bulk_in_endpoint(struct fsg_dev *fsg) return rc; } +static int wedge_bulk_in_endpoint(struct fsg_dev *fsg) +{ + int rc; + + DBG(fsg, "bulk-in set wedge\n"); + rc = usb_ep_set_wedge(fsg->bulk_in); + if (rc == -EAGAIN) + VDBG(fsg, "delayed bulk-in endpoint wedge\n"); + while (rc != 0) { + if (rc != -EAGAIN) { + WARN(fsg, "usb_ep_set_wedge -> %d\n", rc); + rc = 0; + break; + } + + /* Wait for a short time and then try again */ + if (msleep_interruptible(100) != 0) + return -EINTR; + rc = usb_ep_set_wedge(fsg->bulk_in); + } + return rc; +} + static int pad_with_zeros(struct fsg_dev *fsg) { struct fsg_buffhd *bh = fsg->next_buffhd_to_fill; @@ -2957,7 +2980,7 @@ static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh) * We aren't required to halt the OUT endpoint; instead * we can simply accept and discard any data received * until the next reset. */ - halt_bulk_in_endpoint(fsg); + wedge_bulk_in_endpoint(fsg); set_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags); return -EINVAL; }