From patchwork Thu Dec 26 06:45:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rocky Liao X-Patchwork-Id: 11310355 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id ABFAC109A for ; Thu, 26 Dec 2019 06:46:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8A48420838 for ; Thu, 26 Dec 2019 06:46:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=mg.codeaurora.org header.i=@mg.codeaurora.org header.b="GWzhP3Cl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726534AbfLZGqP (ORCPT ); Thu, 26 Dec 2019 01:46:15 -0500 Received: from mail26.static.mailgun.info ([104.130.122.26]:43522 "EHLO mail26.static.mailgun.info" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726277AbfLZGqK (ORCPT ); Thu, 26 Dec 2019 01:46:10 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1577342770; h=References: In-Reply-To: Message-Id: Date: Subject: Cc: To: From: Sender; bh=epW/HtHYtATNZCTrpPKtJ0FoKcsPlVBaRQXOuro5hR8=; b=GWzhP3ClaOTuCVPYKAgPp/Q5ozO2zPirHKlg1P7zGM9ItPhfYXmf1+htjJ47H0ACccaIKXil DPAwn/mHZT/c0M033T7J0kc27LyN72z2q+b3qUk6/xkQnWP4kRQQSLv7LievTYG/eycgN1BM LwUhxnJRsYvuxpQ0H3Tb2foyZ1w= X-Mailgun-Sending-Ip: 104.130.122.26 X-Mailgun-Sid: WyI1MzIzYiIsICJsaW51eC1hcm0tbXNtQHZnZXIua2VybmVsLm9yZyIsICJiZTllNGEiXQ== Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by mxa.mailgun.org with ESMTP id 5e04572b.7f3276c39fb8-smtp-out-n03; Thu, 26 Dec 2019 06:46:03 -0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 16682C4479D; Thu, 26 Dec 2019 06:46:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.0 tests=ALL_TRUSTED,SPF_NONE, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from rocky-Inspiron-7590.qca.qualcomm.com (unknown [180.166.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: rjliao) by smtp.codeaurora.org (Postfix) with ESMTPSA id 32F89C43383; Thu, 26 Dec 2019 06:46:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 32F89C43383 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=none smtp.mailfrom=rjliao@codeaurora.org From: Rocky Liao To: marcel@holtmann.org, johan.hedberg@gmail.com Cc: linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, Rocky Liao Subject: [PATCH v2 1/4] Bluetooth: hci_qca: Add QCA Rome power off support to the qca_power_off() Date: Thu, 26 Dec 2019 14:45:51 +0800 Message-Id: <20191226064554.16803-1-rjliao@codeaurora.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191225060317.5258-1-rjliao@codeaurora.org> References: <20191225060317.5258-1-rjliao@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org We will need to call the qca_power_off() API to power off Rome, add the support into it. QCA Rome is using bt_en GPIO for power off, so we just need to pull down this bt_en GPIO to power off it. Signed-off-by: Rocky Liao --- Changes in v2: None drivers/bluetooth/hci_qca.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index b602ed01505b..43fd84028786 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -1413,13 +1413,26 @@ static void qca_power_shutdown(struct hci_uart *hu) static int qca_power_off(struct hci_dev *hdev) { struct hci_uart *hu = hci_get_drvdata(hdev); + struct qca_serdev *qcadev; + enum qca_btsoc_type soc_type = qca_soc_type(hu); + + if (qca_is_wcn399x(soc_type)) { + /* Perform pre shutdown command */ + qca_send_pre_shutdown_cmd(hdev); + + usleep_range(8000, 10000); - /* Perform pre shutdown command */ - qca_send_pre_shutdown_cmd(hdev); + qca_power_shutdown(hu); + } else { + if (hu->serdev) { + qcadev = serdev_device_get_drvdata(hu->serdev); + + gpiod_set_value_cansleep(qcadev->bt_en, 0); - usleep_range(8000, 10000); + usleep_range(8000, 10000); + } + } - qca_power_shutdown(hu); return 0; } From patchwork Thu Dec 26 06:45:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rocky Liao X-Patchwork-Id: 11310359 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 87B4115AB for ; Thu, 26 Dec 2019 06:46:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 631EE20882 for ; Thu, 26 Dec 2019 06:46:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=mg.codeaurora.org header.i=@mg.codeaurora.org header.b="YhurIOYC" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726134AbfLZGqI (ORCPT ); Thu, 26 Dec 2019 01:46:08 -0500 Received: from mail25.static.mailgun.info ([104.130.122.25]:64106 "EHLO mail25.static.mailgun.info" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725939AbfLZGqI (ORCPT ); Thu, 26 Dec 2019 01:46:08 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1577342767; h=References: In-Reply-To: Message-Id: Date: Subject: Cc: To: From: Sender; bh=3KvIzKQ0OKqH/YujhVWDD4HZ/nw32REwxKJ0gvEgQOY=; b=YhurIOYCiePOa+1XqeApXPcMeMHU+76O4syDnrXpmLKmH8WJNs8B/wgC5jvs+FGPzTYW7WPt yOXppEavx+fUyRTdLD3wfOQKuxiogxqb8/SljXLUc+ubgKyPhPx7XBXihlA5El+vVVdv81gz VJCDU/Ki0x3fl7t0ISXb9/Mcufo= X-Mailgun-Sending-Ip: 104.130.122.25 X-Mailgun-Sid: WyI1MzIzYiIsICJsaW51eC1hcm0tbXNtQHZnZXIua2VybmVsLm9yZyIsICJiZTllNGEiXQ== Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by mxa.mailgun.org with ESMTP id 5e04572d.7f5a4ca58ae8-smtp-out-n01; Thu, 26 Dec 2019 06:46:05 -0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 9622AC4479D; Thu, 26 Dec 2019 06:46:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.0 tests=ALL_TRUSTED,SPF_NONE, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from rocky-Inspiron-7590.qca.qualcomm.com (unknown [180.166.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: rjliao) by smtp.codeaurora.org (Postfix) with ESMTPSA id B8F68C433CB; Thu, 26 Dec 2019 06:46:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org B8F68C433CB Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=none smtp.mailfrom=rjliao@codeaurora.org From: Rocky Liao To: marcel@holtmann.org, johan.hedberg@gmail.com Cc: linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, Rocky Liao Subject: [PATCH v2 2/4] Bluetooth: hci_qca: Retry btsoc initialize when it fails Date: Thu, 26 Dec 2019 14:45:52 +0800 Message-Id: <20191226064554.16803-2-rjliao@codeaurora.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191226064554.16803-1-rjliao@codeaurora.org> References: <20191225060317.5258-1-rjliao@codeaurora.org> <20191226064554.16803-1-rjliao@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org This patch adds the retry of btsoc initialization when it fails. There are reports that the btsoc initialization may fail on some platforms but the repro ratio is very low. The failure may be caused by UART, platform HW or the btsoc itself but it's very difficlut to root cause, given the repro ratio is very low. Add a retry for the btsoc initialization will resolve most of the failures and make Bluetooth finally works. Signed-off-by: Rocky Liao --- Changes in v2: None drivers/bluetooth/hci_qca.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 43fd84028786..45042aa27fa4 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -53,6 +53,9 @@ /* Controller debug log header */ #define QCA_DEBUG_HANDLE 0x2EDC +/* max retry count when init fails */ +#define QCA_MAX_INIT_RETRY_COUNT 3 + enum qca_flags { QCA_IBS_ENABLED, QCA_DROP_VENDOR_EVENT, @@ -1257,7 +1260,9 @@ static int qca_setup(struct hci_uart *hu) { struct hci_dev *hdev = hu->hdev; struct qca_data *qca = hu->priv; + struct qca_serdev *qcadev; unsigned int speed, qca_baudrate = QCA_BAUDRATE_115200; + unsigned int init_retry_count = 0; enum qca_btsoc_type soc_type = qca_soc_type(hu); const char *firmware_name = qca_get_firmware_name(hu); int ret; @@ -1275,6 +1280,7 @@ static int qca_setup(struct hci_uart *hu) */ set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); +retry: if (qca_is_wcn399x(soc_type)) { bt_dev_info(hdev, "setting up wcn3990"); @@ -1293,6 +1299,12 @@ static int qca_setup(struct hci_uart *hu) return ret; } else { bt_dev_info(hdev, "ROME setup"); + if (hu->serdev) { + qcadev = serdev_device_get_drvdata(hu->serdev); + gpiod_set_value_cansleep(qcadev->bt_en, 1); + /* Controller needs time to bootup. */ + msleep(150); + } qca_set_speed(hu, QCA_INIT_SPEED); } @@ -1329,6 +1341,20 @@ static int qca_setup(struct hci_uart *hu) * patch/nvm-config is found, so run with original fw/config. */ ret = 0; + } else { + if (init_retry_count < QCA_MAX_INIT_RETRY_COUNT) { + qca_power_off(hdev); + if (hu->serdev) { + serdev_device_close(hu->serdev); + ret = serdev_device_open(hu->serdev); + if (ret) { + bt_dev_err(hu->hdev, "open port fail"); + return ret; + } + } + init_retry_count++; + goto retry; + } } /* Setup bdaddr */ From patchwork Thu Dec 26 06:45:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rocky Liao X-Patchwork-Id: 11310353 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DCA5B109A for ; Thu, 26 Dec 2019 06:46:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B09E32080D for ; Thu, 26 Dec 2019 06:46:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=mg.codeaurora.org header.i=@mg.codeaurora.org header.b="KsZ1PRTo" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726523AbfLZGqO (ORCPT ); Thu, 26 Dec 2019 01:46:14 -0500 Received: from mail25.static.mailgun.info ([104.130.122.25]:56267 "EHLO mail25.static.mailgun.info" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726442AbfLZGqO (ORCPT ); Thu, 26 Dec 2019 01:46:14 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1577342773; h=References: In-Reply-To: Message-Id: Date: Subject: Cc: To: From: Sender; bh=YvpLMcJ7nf0xT09j0b6TKkJ+vGWvNe7jksE7UBy+iic=; b=KsZ1PRTo1WFVrhCHHuAtVp0lMpIpqFurSgZ7ZYgLPOrhbPFKaaJNDq+Ay4lpBsk/ZD90Tpvz uXwwPWjJC9TgsBaJbjLi92Lzj1cR/C8yEC3D+OR01n8FpqJ00Fk/alIAX5JoBBd6ADfmV8uE 8V6qPLzhrHPkZxu248LfFNynUVk= X-Mailgun-Sending-Ip: 104.130.122.25 X-Mailgun-Sid: WyI1MzIzYiIsICJsaW51eC1hcm0tbXNtQHZnZXIua2VybmVsLm9yZyIsICJiZTllNGEiXQ== Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by mxa.mailgun.org with ESMTP id 5e045730.7fee563aab20-smtp-out-n01; Thu, 26 Dec 2019 06:46:08 -0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 62077C4479C; Thu, 26 Dec 2019 06:46:07 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.0 tests=ALL_TRUSTED,SPF_NONE, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from rocky-Inspiron-7590.qca.qualcomm.com (unknown [180.166.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: rjliao) by smtp.codeaurora.org (Postfix) with ESMTPSA id 28699C433A2; Thu, 26 Dec 2019 06:46:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 28699C433A2 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=none smtp.mailfrom=rjliao@codeaurora.org From: Rocky Liao To: marcel@holtmann.org, johan.hedberg@gmail.com Cc: linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, Rocky Liao Subject: [PATCH v2 3/4] Bluetooth: hci_qca: Enable power off/on support during hci down/up for QCA Rome Date: Thu, 26 Dec 2019 14:45:53 +0800 Message-Id: <20191226064554.16803-3-rjliao@codeaurora.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191226064554.16803-1-rjliao@codeaurora.org> References: <20191225060317.5258-1-rjliao@codeaurora.org> <20191226064554.16803-1-rjliao@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org This patch registers hdev->shutdown() callback and also sets HCI_QUIRK_NON_PERSISTENT_SETUP for QCA Rome. It will power-off the BT chip during hci down and power-on/initialize the chip again during hci up. Signed-off-by: Rocky Liao --- Changes in v2: None drivers/bluetooth/hci_qca.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 45042aa27fa4..7e202041ed77 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -1300,6 +1300,11 @@ static int qca_setup(struct hci_uart *hu) } else { bt_dev_info(hdev, "ROME setup"); if (hu->serdev) { + /* Enable NON_PERSISTENT_SETUP QUIRK to ensure to + * execute setup for every hci up. + */ + set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); + hu->hdev->shutdown = qca_power_off; qcadev = serdev_device_get_drvdata(hu->serdev); gpiod_set_value_cansleep(qcadev->bt_en, 1); /* Controller needs time to bootup. */ From patchwork Thu Dec 26 06:45:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rocky Liao X-Patchwork-Id: 11310357 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E57D4109A for ; Thu, 26 Dec 2019 06:46:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C25DB20838 for ; Thu, 26 Dec 2019 06:46:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=mg.codeaurora.org header.i=@mg.codeaurora.org header.b="w85seMOQ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726628AbfLZGqU (ORCPT ); Thu, 26 Dec 2019 01:46:20 -0500 Received: from mail26.static.mailgun.info ([104.130.122.26]:58092 "EHLO mail26.static.mailgun.info" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725978AbfLZGqU (ORCPT ); Thu, 26 Dec 2019 01:46:20 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1577342779; h=References: In-Reply-To: Message-Id: Date: Subject: Cc: To: From: Sender; bh=v1AH2NA0xoxdtUtCAEWxg+AQOR2pcDRqvKP1MT7e/e8=; b=w85seMOQ8MhFoBZEPbQAykWeVubwv7XqZ29uInGaIogdxFjAuYp+ADjRk79mZ0Y7QnNnrpDb rR3pUzXV/b4lqCvtIFEnknwynIPHymzIIVRqyjq269d/WJ/y4E306LmB7+x6LUAg9yKjU59H 2kBt0fbX0heeEyN88fkWyyBTPW0= X-Mailgun-Sending-Ip: 104.130.122.26 X-Mailgun-Sid: WyI1MzIzYiIsICJsaW51eC1hcm0tbXNtQHZnZXIua2VybmVsLm9yZyIsICJiZTllNGEiXQ== Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by mxa.mailgun.org with ESMTP id 5e045732.7f6fcdf78ab0-smtp-out-n02; Thu, 26 Dec 2019 06:46:10 -0000 (UTC) Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 97422C4479C; Thu, 26 Dec 2019 06:46:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=2.0 tests=ALL_TRUSTED,SPF_NONE, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from rocky-Inspiron-7590.qca.qualcomm.com (unknown [180.166.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: rjliao) by smtp.codeaurora.org (Postfix) with ESMTPSA id B648AC433A2; Thu, 26 Dec 2019 06:46:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org B648AC433A2 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=none smtp.mailfrom=rjliao@codeaurora.org From: Rocky Liao To: marcel@holtmann.org, johan.hedberg@gmail.com Cc: linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-arm-msm@vger.kernel.org, Rocky Liao Subject: [PATCH v2 4/4] Bluetooth: hci_qca: Add HCI command timeout handling Date: Thu, 26 Dec 2019 14:45:54 +0800 Message-Id: <20191226064554.16803-4-rjliao@codeaurora.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191226064554.16803-1-rjliao@codeaurora.org> References: <20191225060317.5258-1-rjliao@codeaurora.org> <20191226064554.16803-1-rjliao@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org This patch adds the HCI command timeout handling, it will trigger btsoc to report its memory dump via vendor specific events when hit the defined max HCI command timeout count. After all the memory dump VSE are sent, the btsoc will also send a HCI_HW_ERROR event to host and this will cause a new hci down/up process and the btsoc will be re-initialized. Signed-off-by: Rocky Liao --- Changes in v2: - Fix build error drivers/bluetooth/hci_qca.c | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 7e202041ed77..34ef73daebb2 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -47,6 +47,8 @@ #define IBS_HOST_TX_IDLE_TIMEOUT_MS 2000 #define CMD_TRANS_TIMEOUT_MS 100 +#define QCA_BTSOC_DUMP_CMD 0xFB + /* susclk rate */ #define SUSCLK_RATE_32KHZ 32768 @@ -56,6 +58,9 @@ /* max retry count when init fails */ #define QCA_MAX_INIT_RETRY_COUNT 3 +/* when hit the max cmd time out count, trigger btsoc dump */ +#define QCA_MAX_CMD_TIMEOUT_COUNT 3 + enum qca_flags { QCA_IBS_ENABLED, QCA_DROP_VENDOR_EVENT, @@ -123,6 +128,8 @@ struct qca_data { u64 rx_votes_off; u64 votes_on; u64 votes_off; + + u32 cmd_timeout_cnt; }; enum qca_speed_type { @@ -170,6 +177,7 @@ static int qca_regulator_enable(struct qca_serdev *qcadev); static void qca_regulator_disable(struct qca_serdev *qcadev); static void qca_power_shutdown(struct hci_uart *hu); static int qca_power_off(struct hci_dev *hdev); +static void qca_cmd_timeout(struct hci_dev *hdev); static enum qca_btsoc_type qca_soc_type(struct hci_uart *hu) { @@ -1337,6 +1345,8 @@ static int qca_setup(struct hci_uart *hu) if (!ret) { set_bit(QCA_IBS_ENABLED, &qca->flags); qca_debugfs_init(hdev); + hdev->cmd_timeout = qca_cmd_timeout; + qca->cmd_timeout_cnt = 0; } else if (ret == -ENOENT) { /* No patch/nvm-config found, run with original fw/config */ ret = 0; @@ -1467,6 +1477,39 @@ static int qca_power_off(struct hci_dev *hdev) return 0; } +static int qca_send_btsoc_dump_cmd(struct hci_uart *hu) +{ + int err = 0; + struct sk_buff *skb = NULL; + struct qca_data *qca = hu->priv; + + BT_DBG("hu %p sending btsoc dump command", hu); + + skb = bt_skb_alloc(1, GFP_ATOMIC); + if (!skb) { + BT_ERR("Failed to allocate memory for qca dump command"); + return -ENOMEM; + } + + skb_put_u8(skb, QCA_BTSOC_DUMP_CMD); + + skb_queue_tail(&qca->txq, skb); + + return err; +} + + +static void qca_cmd_timeout(struct hci_dev *hdev) +{ + struct hci_uart *hu = hci_get_drvdata(hdev); + struct qca_data *qca = hu->priv; + + BT_ERR("hu %p hci cmd timeout count=0x%x", hu, ++qca->cmd_timeout_cnt); + + if (qca->cmd_timeout_cnt >= QCA_MAX_CMD_TIMEOUT_COUNT) + qca_send_btsoc_dump_cmd(hu); +} + static int qca_regulator_enable(struct qca_serdev *qcadev) { struct qca_power *power = qcadev->bt_power;