Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp97836imu; Tue, 22 Jan 2019 14:37:49 -0800 (PST) X-Google-Smtp-Source: ALg8bN76h9n9JQKSozb8Dx3jX0DZgg/tCMyLjE6FzbcLn3toAW0QjuJaBj9IrR/XtIH4OKVJM41P X-Received: by 2002:a63:3703:: with SMTP id e3mr33266451pga.348.1548196669014; Tue, 22 Jan 2019 14:37:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548196668; cv=none; d=google.com; s=arc-20160816; b=gj9zProM/lz59OqmZsCcEISzAoMRnwAGD6f1UIim7by/9KpWBkYGajq/g0sz0N3p7z OeUx8cifHc8res6iuTV1PfxDBRbNkPtN3xC7ChoYo/bTExIMq3QiwIoflsDGljonWfRO zQP3prC1nJawbPVR0VCaVocWZaf86WXZ8jBCL2mY15vmZNUuHdqy4fMI0Ny4yGbAFw05 T7U2cHmkFROTV4dyiuDeYuTmYgFRhdRVGfixibLvZgNJWiuu0nQcuymfS/VdKwx1DdJ/ 0J2cEIp+Dlkb4dwvel/2CtGxTDboTD6N1eVJ9M9qY3QBYXHK7HBxt+GH68wXcLozolFy FVZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=QCFQ3/LFXyB79F8POK8jmGSXV3ke7RikEsl2ThYyROI=; b=ITbaBgerDbqvtMXshk4RBz0nNl1jN+P5+A08k5yoGXqPuzOJjeLB/G4+q1A1s4M4ws htgouWM4d90gF3gP+EDM4Inu7HubiVqIhidq5ucy30mQxturKeHSDE051qN1tEGIiWPd b/MOlRtBxNju6h9c5CmBaqIbWgFzHEDog2CJZ1Eab5t0x6p9T9obQV9M1cJ9YQsh8rS9 886EnvRMj3u8iDX1WSPzp/H5r2qZa9ypkdX2HnR2ewrCyqYkoP5wq9z8XS86WAC7JuVD eGXW7OEKdRO7y0H+IxOl64rqOi2YCiKZDfMMfEfM8hj0LzyXYyG4zAzFWD3OMbtpyFBn rPMQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=tNRdemVe; 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 p18si15640480plo.223.2019.01.22.14.37.33; Tue, 22 Jan 2019 14:37:48 -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=tNRdemVe; 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 S1726951AbfAVWfc (ORCPT + 99 others); Tue, 22 Jan 2019 17:35:32 -0500 Received: from mail-lf1-f67.google.com ([209.85.167.67]:34995 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726839AbfAVWfc (ORCPT ); Tue, 22 Jan 2019 17:35:32 -0500 Received: by mail-lf1-f67.google.com with SMTP id e26so147601lfc.2 for ; Tue, 22 Jan 2019 14:35:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=QCFQ3/LFXyB79F8POK8jmGSXV3ke7RikEsl2ThYyROI=; b=tNRdemVe11eGyQYmbwSwlv4x+G3+rX24JksmHOU3/qAONuaKJnrVdsAcSOl8g391wi 2uhVScAriP4gC2l7bPI6neqT8Oo8a5KDsK2l/VWO15c2DIAy6VUvc50MZyZEEZgOYSgB 5wybwRfyolTwawB0RlAswL60VQaWxU9c8OhBsGAR6zuE0Q0PF3gb/bZmiTWu3ZrKVLFl lSalDQ+23N20sx26SDl1BHGeUzwonPgf2l4/o0MSzdU6ZAnJvWwXbYswbxPdgwX7cF7Q VL0fKemCDfcprSkxMjIkWYYXJt4srUssuVVfvlvH53oho15KBnhDADrgD9Zh1vFMy0+H WHUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=QCFQ3/LFXyB79F8POK8jmGSXV3ke7RikEsl2ThYyROI=; b=oK1voRv8hJgPqIxfmuGr2GzrpfXmPSID1ukYr9SOi0+JtwN84oJbpAhqeg1W2UjIRO 4uTuWe8Q/LxfBzsUq28xunsX13+m7kGWmf0urAu+12qWCVZmu/wy/EtSY0L1kJNN3KkV vUjZPV2NLjR6S2lrNQRc0tSg+aeBmLYzaOvjlCSMlyi1W9iE0O983vH2SN1ixaiyTnMJ sDy1MvZZ7y6pLSujX9yzq4VnkTplsfPSF+g5M/NxcQM8wTDPTP/tf4JAYdPg6NT1G1lU qXpYwXY76CV7UnnsXreLeGDMSsxmpfH+zOuvmQqTeFmC0oot0sKs33kGhPtQ1LyepOpi U7Uw== X-Gm-Message-State: AJcUukddSZyOm5anmmxzBXYup4C7kzPh7Qa0ay4g1beB5rDPjcZo4Y4a f669WjjdQj3qC4IpZkJ3EQYFWFEp8SOF/3XK7l6XpQ== X-Received: by 2002:a19:2906:: with SMTP id p6mr21485955lfp.17.1548196528984; Tue, 22 Jan 2019 14:35:28 -0800 (PST) MIME-Version: 1.0 References: <20181117010748.24347-1-rajatja@google.com> <20190118223407.64818-1-rajatja@google.com> <20190118223407.64818-3-rajatja@google.com> In-Reply-To: From: Rajat Jain Date: Tue, 22 Jan 2019 14:34:52 -0800 Message-ID: Subject: Re: [PATCH v4 3/5] Bluetooth: Reset Bluetooth chip after multiple command timeouts To: Marcel Holtmann Cc: Johan Hedberg , Greg Kroah-Hartman , "David S. Miller" , Dmitry Torokhov , Alex Hung , Bluez mailing list , Linux Kernel Mailing List , linux-usb@vger.kernel.org, netdev , Rajat Jain , Dmitry Torokhov , Raghuram Hegde , chethan.tumkur.narayan@intel.com, "Ghorai, Sukumar" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Jan 19, 2019 at 11:51 AM Marcel Holtmann wrot= e: > > Hi Rajat, > > > 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 > > --- > > v4: same as v1 > > v3: same as v1 > > v2: same as v1 > > > > 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/h= ci_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 =3D container_of(work, struct hci_dev, > > cmd_timer.work); > > > > + hdev->timeout_cnt++; > > if (hdev->sent_cmd) { > > struct hci_command_hdr *sent =3D (void *) hdev->sent_cmd-= >data; > > u16 opcode =3D __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 =3D %u)= ", > > + opcode, hdev->timeout_cnt); > > } else { > > - bt_dev_err(hdev, "command tx timeout"); > > + bt_dev_err(hdev, "command tx timeout (cnt =3D %u)", > > + hdev->timeout_cnt); > > + } > > + > > + if (test_bit(HCI_QUIRK_HW_RESET_ON_TIMEOUT, &hdev->quirks) && > > + hdev->timeout_cnt >=3D 5) { > > + hdev->timeout_cnt =3D 0; > > + if (hdev->hw_reset) > > + hdev->hw_reset(hdev); > > + return; > > } > > so I really do not see the need for the quirk here. Either hdev->hw_reset= is provided, then execute it, if it is not provided then don=E2=80=99t. Th= e quirk is just duplicate information. Sure, will do. > > I also don=E2=80=99t like hdev->hw_reset since that implies that the only= way of handling a command timeout is a hardware reset. I prefer you call t= his hdev->cmd_timeout and also scrap the timeout_cnt. Let the driver decide= what number of timeouts it wants to react on. The number 5 is just an arbi= trary number you picked based on one hardware manufacturer. Sure, I can move the timeout_cnt from hdev to btusb_data so that the btusb can track the number of the timeouts.. Thanks, Rajat > > Regards > > Marcel >