| From d115d7050a0d2c4967532f18c9cb522fea6b7280 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> |
| Date: Mon, 31 Aug 2015 19:48:28 +0300 |
| Subject: Revert "usb: dwc3: gadget: drop unnecessary loop when cleaning up TRBs" |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> |
| |
| commit d115d7050a0d2c4967532f18c9cb522fea6b7280 upstream. |
| |
| This reverts commit 8f2c9544aba636134303105ecb164190a39dece4. |
| |
| As it breaks g_ether on my Baytrail FFRD8 device. Everything starts out |
| fine, but after a bit of data has been transferred it just stops |
| flowing. |
| |
| Note that I do get a bunch of these "NOHZ: local_softirq_pending 08" |
| when booting the machine, but I'm not really sure if they're related |
| to this problem. |
| |
| Cc: Felipe Balbi <balbi@ti.com> |
| Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: linux-usb@vger.kernel.org |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Signed-off-by: Felipe Balbi <balbi@ti.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/dwc3/gadget.c | 37 +++++++++++++++++++++---------------- |
| 1 file changed, 21 insertions(+), 16 deletions(-) |
| |
| --- a/drivers/usb/dwc3/gadget.c |
| +++ b/drivers/usb/dwc3/gadget.c |
| @@ -1859,27 +1859,32 @@ static int dwc3_cleanup_done_reqs(struct |
| unsigned int i; |
| int ret; |
| |
| - req = next_request(&dep->req_queued); |
| - if (!req) { |
| - WARN_ON_ONCE(1); |
| - return 1; |
| - } |
| - i = 0; |
| do { |
| - slot = req->start_slot + i; |
| - if ((slot == DWC3_TRB_NUM - 1) && |
| + req = next_request(&dep->req_queued); |
| + if (!req) { |
| + WARN_ON_ONCE(1); |
| + return 1; |
| + } |
| + i = 0; |
| + do { |
| + slot = req->start_slot + i; |
| + if ((slot == DWC3_TRB_NUM - 1) && |
| usb_endpoint_xfer_isoc(dep->endpoint.desc)) |
| - slot++; |
| - slot %= DWC3_TRB_NUM; |
| - trb = &dep->trb_pool[slot]; |
| + slot++; |
| + slot %= DWC3_TRB_NUM; |
| + trb = &dep->trb_pool[slot]; |
| + |
| + ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb, |
| + event, status); |
| + if (ret) |
| + break; |
| + } while (++i < req->request.num_mapped_sgs); |
| + |
| + dwc3_gadget_giveback(dep, req, status); |
| |
| - ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb, |
| - event, status); |
| if (ret) |
| break; |
| - } while (++i < req->request.num_mapped_sgs); |
| - |
| - dwc3_gadget_giveback(dep, req, status); |
| + } while (1); |
| |
| if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && |
| list_empty(&dep->req_queued)) { |