From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-la0-f41.google.com ([209.85.215.41]:34201 "EHLO mail-la0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754275AbbHaTVU (ORCPT ); Mon, 31 Aug 2015 15:21:20 -0400 Received: by laba3 with SMTP id a3so77694938lab.1 for ; Mon, 31 Aug 2015 12:21:19 -0700 (PDT) Subject: Re: [PATCH] Revert "usb: dwc3: gadget: drop unnecessary loop when cleaning up TRBs" To: ville.syrjala@linux.intel.com, Felipe Balbi References: <1441039708-2504-1-git-send-email-ville.syrjala@linux.intel.com> Cc: Greg Kroah-Hartman , linux-usb@vger.kernel.org, stable@vger.kernel.org From: Sergei Shtylyov Message-ID: <55E4A92C.70407@cogentembedded.com> Date: Mon, 31 Aug 2015 22:21:16 +0300 MIME-Version: 1.0 In-Reply-To: <1441039708-2504-1-git-send-email-ville.syrjala@linux.intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: stable-owner@vger.kernel.org List-ID: Hello. On 08/31/2015 07:48 PM, ville.syrjala@linux.intel.com wrote: > From: Ville Syrjälä > > 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 > Cc: Greg Kroah-Hartman > Cc: linux-usb@vger.kernel.org > Cc: stable@vger.kernel.org > Signed-off-by: Ville Syrjälä > --- > drivers/usb/dwc3/gadget.c | 37 +++++++++++++++++++++---------------- > 1 file changed, 21 insertions(+), 16 deletions(-) > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index 333a7c0..9a5de54 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -1859,27 +1859,32 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, > 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); Space needed after }. And this *do {} while* loop seems replaceable with *foor* loop... [...]