From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com ([192.55.52.93]:18354 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752776AbdC0PXw (ORCPT ); Mon, 27 Mar 2017 11:23:52 -0400 Subject: Re: [PATCH v2 3/3] xhci: Manually give back cancelled URB if queuing it for cancel fails To: Felipe Balbi , gregkh@linuxfoundation.org References: <1490624830-9761-1-git-send-email-mathias.nyman@linux.intel.com> <1490624830-9761-4-git-send-email-mathias.nyman@linux.intel.com> <874lyekbwg.fsf@linux.intel.com> Cc: linux-usb@vger.kernel.org, stable@vger.kernel.org From: Mathias Nyman Message-ID: <58D92DA0.4040808@linux.intel.com> Date: Mon, 27 Mar 2017 18:20:00 +0300 MIME-Version: 1.0 In-Reply-To: <874lyekbwg.fsf@linux.intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org List-ID: On 27.03.2017 17:54, Felipe Balbi wrote: > > Hi, > > Mathias Nyman writes: >> Manually give back URB if we are can not add it to the cancel queue, and >> stop the endpoint normally. > > this sentence doesn't parse very well ;-) > >> This can happen if device just reset before URB timed out and dequeued, >> leading to missing endpoint ring. > > seems like this could be extended a bit too. > >> @@ -1554,6 +1553,14 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) >> done: >> spin_unlock_irqrestore(&xhci->lock, flags); >> return ret; >> + >> +err_giveback: >> + if (urb_priv) >> + xhci_urb_free_priv(urb_priv); >> + usb_hcd_unlink_urb_from_ep(hcd, urb); > > well, aren't you introducing another regression here? > > if the return status from usb_hcd_check_unlink_urb() is -EBUSY, then, > perhaps, you really shouldn't give it back now. I'm not giving it back in that case, it works as it should: ret = usb_hcd_check_unlink_urb(hcd, urb, status); if (ret) goto done; ... done: spin_unlock_irqrestore(&xhci->lock, flags); return ret; -Mathias