Return-Path: Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: [PATCH] bluetooth: btusb: Fix issue with suspend From: Marcel Holtmann In-Reply-To: <1409930194-6318-1-git-send-email-Larry.Finger@lwfinger.net> Date: Sat, 6 Sep 2014 10:02:14 -0700 Cc: "Gustavo F. Padovan" , Johan Hedberg , linux-bluetooth@vger.kernel.org, netdev@vger.kernel.org, Champion Chen , Stable Message-Id: <6DF81E54-681F-4B18-95C7-F4684FF19786@holtmann.org> References: <1409930194-6318-1-git-send-email-Larry.Finger@lwfinger.net> To: Larry Finger Sender: linux-bluetooth-owner@vger.kernel.org List-ID: Hi Larry, > Suspend could fail for some platforms because > btusb_suspend==> btusb_stop_traffic ==> usb_kill_anchored_urbs, > > When btusb_bulk_complete returns before system suspend and resubmits an urb, > the system cannot enter suspend state. > > Signed-off-by: Champion Chen > Signed-off-by: Larry Finger > Cc: Stable > --- > Johan, > > To help Champion with the process, I have formatted the patch in > the correct manner. I hope I understand the issue correctly and > stated it in a coherent manner in the commit message. > > Larry > --- > drivers/bluetooth/btusb.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c > index 292c38e..45a7211 100644 > --- a/drivers/bluetooth/btusb.c > +++ b/drivers/bluetooth/btusb.c > @@ -330,6 +330,9 @@ static void btusb_intr_complete(struct urb *urb) > BT_ERR("%s corrupted event packet", hdev->name); > hdev->stat.err_rx++; > } > + } else if (urb->status == -ENOENT) { > + /* Avoid suspend failed when usb_kill_urb */ > + return; > } > > if (!test_bit(BTUSB_INTR_RUNNING, &data->flags)) > @@ -417,6 +420,9 @@ static void btusb_bulk_complete(struct urb *urb) > urb->actual_length) < 0) { > BT_ERR("%s corrupted ACL packet", hdev->name); > hdev->stat.err_rx++; > + } else if (urb->status == -ENOENT) { > + /* Avoid suspend failed when usb_kill_urb */ > + return; > } this one is utterly bogus. Either urb->status is 0 or it is -ENOENT, but it will not be both. I think you put it to the wrong if clause. > } > > @@ -512,6 +518,9 @@ static void btusb_isoc_complete(struct urb *urb) > hdev->stat.err_rx++; > } > } > + } else if (urb->status == -ENOENT) { > + /* Avoid suspend failed when usb_kill_urb */ > + return; > } > > if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags)) Regards Marcel