Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp49877imu; Fri, 16 Nov 2018 17:09:02 -0800 (PST) X-Google-Smtp-Source: AJdET5dvUazC7dHb7hA3pi5TGz0bbHDA5t/4SydlAvsTjVEIJSrvuULl7zvD10F01LuE+yp4SBKy X-Received: by 2002:a62:4d82:: with SMTP id a124-v6mr11881747pfb.113.1542416942594; Fri, 16 Nov 2018 17:09:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542416942; cv=none; d=google.com; s=arc-20160816; b=Js0PBBzf/arQQpbm05moL//5X9wcAL2b01u2p8ny5n5ljen73EgW2Tk+javepbB58y Ig7QbFZieVTlfcbj3hqWU1MklNdAFywOCQoPwQRCBUxjxV1BKxKYKlCH8SflEtXy92gJ sO77Nqaw7c1sCXl4O8KCTNKILxFj09WgXrkyC5+bIpkvPFBCKrers9PBGRQBkzB5xpN3 NkUfzJI3y93WT8Q8iEiTzw3cVIcdCbMQ+TZn2cCW1Cydrfwcwet0bJnhHP7r4v2Mky1F vrfVA98joJk9SOQVm8cClxn04ROZv91C/k5gaZZwTN2oJqbpCLuEe/1viGsLEFDdmozd GFEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=vGykdBl547WQNsa3hHIaJmF/PJ6TocftyqcyGK983ds=; b=jcppHV2fCJNKGzXyee45TwJjrfrPbe2v/EF9xaSVHP9mcmLUcWfKkp+NHN/ZFUYbEz Cbjf/HtFO/BbR69LY5aDolxpDkk3vWoVAwozu0rDcMNSKLH3tWbrNBpJ25lN7S4OTfIc Ivu0LmqXBNn2Xl/eUiUm9VbKEIna9qZxdChLAVrgV9ua+Hn8TU1ZKhpDFZwG/PRNZZir n6x56cc4wAJ+pPADJSGnQ9SYSHLv9DrcPC+VWMJ9nnbw8E0dR7zJ2EmxcMpw/IJS9odc SuBya2xl1g0iHU273MhR9aGNeFH4qSssPqURnvKmuGe+fa9d4KLTGmfeVR6hDP/9GKxV F3pw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="Bk0/2DMl"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i5si4691607pfo.189.2018.11.16.17.08.48; Fri, 16 Nov 2018 17:09:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="Bk0/2DMl"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730973AbeKQLWr (ORCPT + 99 others); Sat, 17 Nov 2018 06:22:47 -0500 Received: from mail-pf1-f202.google.com ([209.85.210.202]:54035 "EHLO mail-pf1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730286AbeKQLWq (ORCPT ); Sat, 17 Nov 2018 06:22:46 -0500 Received: by mail-pf1-f202.google.com with SMTP id j9-v6so20501389pfn.20 for ; Fri, 16 Nov 2018 17:08:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=vGykdBl547WQNsa3hHIaJmF/PJ6TocftyqcyGK983ds=; b=Bk0/2DMl06D/t/uR8JTQ4g1fx6IEQ5hmQQYf4mjM5WPed+7xOkh0asmfs5FCU7f+Ho yOUaOt0n7bR5h0MAgFM2kvhwgDzED/W2rYgGU1cebcxSCZf/yz7o2nqXPQn22eB5g4Zh uxMcpw2guzTs/xpn3Eu0fUbrWUURv9U/Xsa6DpV2rHA7POiEENo2FhRxicOozEtNRK/m WejB9wgIeXQuUpDQe3Bv1GHZdrWszM0vvU9/mOR+emMLORcZlRjcfpMgbbGScBBFVgsD tNCP4Y3lTnXDRj3Rxt3wFUH0gDPN+evLbRY3AW/OtjFKZ2DSgN1Sv8PWSF+W3K92i1WN 7VZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=vGykdBl547WQNsa3hHIaJmF/PJ6TocftyqcyGK983ds=; b=UVSabqYUQCMDDdn0d/gsx6kFIc8YNgmXe53sYzV3YftC1DtkHQDnL1D5UmkI36Xvp+ /yVs+7//AH9YL2SB1ozgayLEokF6Ta5mZ07Pj7+rehUFiK4+pFPPozgBydI4i4qT6n95 bXpbYUpm6rGFSyjSzA5c7b3EijZ5sH7MRjz3xFKlk2Zwxb4DeQ2vqpDLbHq1mt4+o9qv GFS+7PqMf9TGhpxZPwU8inzkeBHFuWGAw/2Nhh40JBys27jlAYnprf5VYsp25SPlyc6O gqLegXRizNFOQf4Gt+41eQvRtIfDJh7FEmE70y/N9b62fy2SX82BQSflEkps+Fxf6rQw /6LA== X-Gm-Message-State: AA+aEWbQdK4na7K/n5+wV9ZNriswW4bWAvn7rTu4w3UawZ69ktZlK9Ll NuOJPMGWrNbcHRXG38FyozB2Vd/OP1fL X-Received: by 2002:a63:5fd6:: with SMTP id t205mr51086pgb.77.1542416885652; Fri, 16 Nov 2018 17:08:05 -0800 (PST) Date: Fri, 16 Nov 2018 17:07:46 -0800 In-Reply-To: <20181117010748.24347-1-rajatja@google.com> Message-Id: <20181117010748.24347-4-rajatja@google.com> Mime-Version: 1.0 References: <20181117010748.24347-1-rajatja@google.com> X-Mailer: git-send-email 2.19.1.1215.g8438c0b245-goog Subject: [PATCH 3/5] Bluetooth: Reset Bluetooth chip after multiple command timeouts From: Rajat Jain To: Marcel Holtmann , Johan Hedberg , Greg Kroah-Hartman , "David S. Miller" , Dmitry Torokhov , Rajat Jain , Alex Hung , linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, netdev@vger.kernel.org Cc: rajatxjain@gmail.com, dtor@google.com, raghuram.hegde@intel.com, chethan.tumkur.narayan@intel.com, sukumar.ghorai@intel.com Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a quirk and a hook to allow the HCI core to reset the BT chip if needed (after a number of timed out commands). Use that new hook to initiate BT chip reset if the controller fails to respond to certain number of commands (currently 5) including the HCI reset commands. This is done based on a newly introduced quirk. This is done based on some initial work by Intel. Signed-off-by: Rajat Jain --- include/net/bluetooth/hci.h | 8 ++++++++ include/net/bluetooth/hci_core.h | 2 ++ net/bluetooth/hci_core.c | 15 +++++++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index c36dc1e20556..af02fa5ffe54 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -192,6 +192,14 @@ enum { * */ HCI_QUIRK_NON_PERSISTENT_SETUP, + + /* When this quirk is set, hw_reset() would be run to reset the + * hardware, after a certain number of commands (currently 5) + * time out because the device fails to respond. + * + * This quirk should be set before hci_register_dev is called. + */ + HCI_QUIRK_HW_RESET_ON_TIMEOUT, }; /* HCI device flags */ diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index e5ea633ea368..b86218304b80 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -313,6 +313,7 @@ struct hci_dev { unsigned int acl_cnt; unsigned int sco_cnt; unsigned int le_cnt; + unsigned int timeout_cnt; unsigned int acl_mtu; unsigned int sco_mtu; @@ -437,6 +438,7 @@ struct hci_dev { int (*post_init)(struct hci_dev *hdev); int (*set_diag)(struct hci_dev *hdev, bool enable); int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr); + void (*hw_reset)(struct hci_dev *hdev); }; #define HCI_PHY_HANDLE(handle) (handle & 0xff) diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 7352fe85674b..ab3a6a8b7ba6 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -2569,13 +2569,24 @@ static void hci_cmd_timeout(struct work_struct *work) struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_timer.work); + hdev->timeout_cnt++; if (hdev->sent_cmd) { struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data; u16 opcode = __le16_to_cpu(sent->opcode); - bt_dev_err(hdev, "command 0x%4.4x tx timeout", opcode); + bt_dev_err(hdev, "command 0x%4.4x tx timeout (cnt = %u)", + opcode, hdev->timeout_cnt); } else { - bt_dev_err(hdev, "command tx timeout"); + bt_dev_err(hdev, "command tx timeout (cnt = %u)", + hdev->timeout_cnt); + } + + if (test_bit(HCI_QUIRK_HW_RESET_ON_TIMEOUT, &hdev->quirks) && + hdev->timeout_cnt >= 5) { + hdev->timeout_cnt = 0; + if (hdev->hw_reset) + hdev->hw_reset(hdev); + return; } atomic_set(&hdev->cmd_cnt, 1); -- 2.19.1.1215.g8438c0b245-goog