From patchwork Wed Apr 26 23:08:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sean.wang@mediatek.com X-Patchwork-Id: 88032 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp560849vqo; Wed, 26 Apr 2023 16:21:37 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7fV6adNU+PmLkewqoZpeE18GLpE+8vfTnHi0BHIiLKzzb4kVibb2At9NlNqehamlF7WduM X-Received: by 2002:a17:90a:4803:b0:246:5787:6f5d with SMTP id a3-20020a17090a480300b0024657876f5dmr4944974pjh.10.1682551297262; Wed, 26 Apr 2023 16:21:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682551297; cv=none; d=google.com; s=arc-20160816; b=e8SBd62O47qRFwMWtKBiVyAjul8veLKUpBuxYAYYKCwfs/yc8qHoZTBUL8v9o7vLyw ijxVqIqnEoiexrnXaVwa7L4D+YsY3sCVo4if4OtDeiclbDutUWeVEiDV6qcIA1PyGO6I 07A6gq99kZGyaIMWf6CtGAnIYuE5REGCyll8D1Blo0iyAjWkcuO0Zxb1fYDVIQGEOzTV NB4DFTTfN4blhmTvQJu4yBtbRn4XFT65chvp1AerDkrNtE7HHXoSFqvmSnVCcBM+9uNL qR0Q8WdQ4/EHRiEL/ts4DUKRUqpF/YPFO38Qlew2GUQfbCZgUybxZWI1T+P94zHiP2vh YBLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from :dkim-signature; bh=LvCgUr2ETcJqr1CXGO9ztSMkSpF7OTl0p7qH3bPYTe8=; b=XMcl20Qo7FCYrVepi04b5fJNQTGMmh+cUQwETmyPGmZGBGv7reMFYhfD6JkwO8ZZgx lOcAS/C0sIrqp03vgGLZLAajkY6hLuzFxIY/72G0r91dBtPLFmL8QVqm7c+UkWLgotUI UpIW+dgNZU/e1aFKHMts0TY+gTIfXS2NwOspDSo8nhaAIgdA1dqaUjJlzKkucdqSsAyF faQ9SJXU69/Ecc9RtkzqmAyYvUOD6ZZQPUd6s1iOCudeCZNdvQyHWTbGBWakIhTFdSUX A8Vl+Zvfoyuvda86pDySLGmFCPjtphBOX1d7TvHzwNjpBGyDVJZYPiN3NGRU8ch0wwQS bvcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b="g/otazdZ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 33-20020a630f61000000b0052117aaa3c2si17913428pgp.225.2023.04.26.16.21.25; Wed, 26 Apr 2023 16:21:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b="g/otazdZ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239759AbjDZXJH (ORCPT + 99 others); Wed, 26 Apr 2023 19:09:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36688 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239440AbjDZXJF (ORCPT ); Wed, 26 Apr 2023 19:09:05 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EB3093AA4; Wed, 26 Apr 2023 16:09:03 -0700 (PDT) X-UUID: 4d6c53e2e48711eda9a90f0bb45854f4-20230427 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:Message-ID:Date:Subject:CC:To:From; bh=LvCgUr2ETcJqr1CXGO9ztSMkSpF7OTl0p7qH3bPYTe8=; b=g/otazdZGi/r3xlORWXphLGG8MsyTKxvaNBlGPzUKw1d1YDja4ZfZawc35IKcY45Yy9cGABd5hMJ5+9LOqtOvxitYqad8yRW0HNC28jZ0sWZwLZM2vUd9KeO8Hnm73VKg3xbNqCsD8C619pzz8eq1EZdAkW43SIpQsDaKw6sZ3Y=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.22,REQID:ab947dd4-ea1d-48fb-8577-123644497f59,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:0 X-CID-META: VersionHash:120426c,CLOUDID:ad2442ec-db6f-41fe-8b83-13fe7ed1ef52,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:-3,IP:nil,U RL:11|1,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0 X-CID-BVR: 0,NGT X-CID-BAS: 0,NGT,0,_ X-UUID: 4d6c53e2e48711eda9a90f0bb45854f4-20230427 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 2044046433; Thu, 27 Apr 2023 07:08:48 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs13n1.mediatek.inc (172.21.101.193) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.25; Thu, 27 Apr 2023 07:08:47 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Thu, 27 Apr 2023 07:08:47 +0800 From: To: , , CC: , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v4 1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding Date: Thu, 27 Apr 2023 07:08:43 +0800 Message-ID: <4699f59b36d522ec263dcea71eda40ae939004f8.1682549719.git.objelf@gmail.com> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764282909288947249?= X-GMAIL-MSGID: =?utf-8?q?1764282909288947249?= From: Sean Wang Use readx_poll_timeout instead of open coding to poll the hardware reset status until it is done. Signed-off-by: Sean Wang --- v2: use 20ms as the unit to poll according to the requirement of readx_poll_timeout v3: refine btusb_mtk_reset_done and drop the necessary error check in btusb_mtk_cmd_timeout v4: rebase onto the latest codebase --- drivers/bluetooth/btusb.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 2a8e2bb038f5..275e0666503d 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -2566,8 +2566,6 @@ static int btusb_setup_realtek(struct hci_dev *hdev) #define MTK_EP_RST_OPT 0x74011890 #define MTK_EP_RST_IN_OUT_OPT 0x00010001 #define MTK_BT_RST_DONE 0x00000100 -#define MTK_BT_RESET_WAIT_MS 100 -#define MTK_BT_RESET_NUM_TRIES 10 static void btusb_mtk_wmt_recv(struct urb *urb) { @@ -2938,6 +2936,16 @@ static int btusb_mtk_id_get(struct btusb_data *data, u32 reg, u32 *id) return btusb_mtk_reg_read(data, reg, id); } +static u32 btusb_mtk_reset_done(struct hci_dev *hdev) +{ + struct btusb_data *data = hci_get_drvdata(hdev); + u32 val = 0; + + btusb_mtk_uhw_reg_read(data, MTK_BT_MISC, &val); + + return val & MTK_BT_RST_DONE; +} + static int btusb_mtk_setup(struct hci_dev *hdev) { struct btusb_data *data = hci_get_drvdata(hdev); @@ -3127,7 +3135,7 @@ static void btusb_mtk_cmd_timeout(struct hci_dev *hdev) { struct btusb_data *data = hci_get_drvdata(hdev); u32 val; - int err, retry = 0; + int err; /* It's MediaTek specific bluetooth reset mechanism via USB */ if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { @@ -3158,18 +3166,10 @@ static void btusb_mtk_cmd_timeout(struct hci_dev *hdev) btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 0); btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val); - /* Poll the register until reset is completed */ - do { - btusb_mtk_uhw_reg_read(data, MTK_BT_MISC, &val); - if (val & MTK_BT_RST_DONE) { - bt_dev_dbg(hdev, "Bluetooth Reset Successfully"); - break; - } - - bt_dev_dbg(hdev, "Polling Bluetooth Reset CR"); - retry++; - msleep(MTK_BT_RESET_WAIT_MS); - } while (retry < MTK_BT_RESET_NUM_TRIES); + err = readx_poll_timeout(btusb_mtk_reset_done, hdev, val, + val & MTK_BT_RST_DONE, 20000, 1000000); + if (err < 0) + bt_dev_err(hdev, "Reset timeout"); btusb_mtk_id_get(data, 0x70010200, &val); if (!val) From patchwork Wed Apr 26 23:08:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sean.wang@mediatek.com X-Patchwork-Id: 88031 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp560753vqo; Wed, 26 Apr 2023 16:21:18 -0700 (PDT) X-Google-Smtp-Source: AKy350YAXmoMSToRzqTbKcnQkdZVeTDM4K1MBNFz5q+sI3b67xbP/UCYjJq8M2RQhRhnYT0H2WV3 X-Received: by 2002:a05:6a00:1989:b0:63a:75a4:b2d4 with SMTP id d9-20020a056a00198900b0063a75a4b2d4mr29717447pfl.24.1682551278478; Wed, 26 Apr 2023 16:21:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682551278; cv=none; d=google.com; s=arc-20160816; b=HsIAX8A6u4fQpGgtoryup7KcJkORRmPTUntfJ0nFod9ncc2RdjGaB6HJyaQkht1lM4 +cbzg5Wq63nU9R9GK1HigKgRdXeAlxW/7ec4BFRu0fDU4i3xODEUJepRd42nWdG60dJE gw/B8ysr61WS7Z+2csL0mzys8N4+mUyudNc5L6dKoDnF/tr9GZ7FaJw7eHhr7Ujp9FGQ hDVsJwRX/3OX46kBgcG9wkwh6h1dby2ZLok5TK4/NDMzNZ7OpNRpBPDW+wDWHz/XXIp3 nUeWuN36nxJIWXU6F8yxR7aU5dphVwnsJoxyTbXkBSByEDNHqP8mZkXWfBPI8L9wiEbo Hkgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=cz+TffTmXKxpybe6qN3YNlNMNNXQcl2nckFZ953sp4U=; b=mXGMcgZmScwczejxy1EePmgEMrKxcASylYh1ymt6vlxbFaSEspDmD+5rpjghAoVHWu oyazQVIferBA1QfEOx6AHZ7b8hfVKiIfofl3YviuE8fxwNm0oFYnuIKK+CIkZliaEI/+ p9r5Jb+UUQwBBWHkG16kce9uqUCjWEs0HRv4Ue19d/usCuijor3CG50B2DBnCaRt8ZLP AayoWVnh3ZFUaPGTh4uNzlApWcjWuQ4YzyK75hrLPEXLS9eJtKbQOqusPsTNIYeqgqsF 3VFIQBiij1uGt6glcqzfczxf+0IjxoF5RQW9iMjMkYejAYuH4nzFbGULgbNwgIsQFx5f jRZw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=rZ4Kwlh3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b9-20020aa78ec9000000b0063b8935bcbasi16837300pfr.310.2023.04.26.16.21.05; Wed, 26 Apr 2023 16:21:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=rZ4Kwlh3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236225AbjDZXJA (ORCPT + 99 others); Wed, 26 Apr 2023 19:09:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36600 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229582AbjDZXI6 (ORCPT ); Wed, 26 Apr 2023 19:08:58 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E98482694; Wed, 26 Apr 2023 16:08:56 -0700 (PDT) X-UUID: 4e8822bae48711eda9a90f0bb45854f4-20230427 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=cz+TffTmXKxpybe6qN3YNlNMNNXQcl2nckFZ953sp4U=; b=rZ4Kwlh3EPPzieHOeCa35PdPC2Lp/aoG9uO5B5WLtXoSSVX5QbQxBQhy8khUKucsvP3wXLOz63Lol1/QGVjmX1Ujp+s2Kv387N9nOypYf9mUSsLHIkgKPhdTJQkjHGOpIWf62nXQeaza4d4Jmx0xz0cFHPyShb7Whd0Q8bvhHKU=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.22,REQID:2ca381d4-2cd1-4db1-b2ad-e247e7a531d8,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:0 X-CID-META: VersionHash:120426c,CLOUDID:ff43a0a2-8fcb-430b-954a-ba3f00fa94a5,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:-3,IP:nil,U RL:11|1,File:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0 X-CID-BVR: 0 X-CID-BAS: 0,_,0,_ X-UUID: 4e8822bae48711eda9a90f0bb45854f4-20230427 Received: from mtkmbs11n2.mediatek.inc [(172.21.101.187)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1254055266; Thu, 27 Apr 2023 07:08:50 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs10n2.mediatek.inc (172.21.101.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.26; Thu, 27 Apr 2023 07:08:49 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Thu, 27 Apr 2023 07:08:49 +0800 From: To: , , CC: , , , , , , , , , , , , , , , , , , , , , , , Jing Cai Subject: [PATCH v4 2/3] Bluetooth: btmtk: introduce btmtk reset work Date: Thu, 27 Apr 2023 07:08:44 +0800 Message-ID: <037a3ab699b7f545884b493c5ea5a4b7e7b667a8.1682549719.git.objelf@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <4699f59b36d522ec263dcea71eda40ae939004f8.1682549719.git.objelf@gmail.com> References: <4699f59b36d522ec263dcea71eda40ae939004f8.1682549719.git.objelf@gmail.com> MIME-Version: 1.0 X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764282889453417374?= X-GMAIL-MSGID: =?utf-8?q?1764282889453417374?= From: Jing Cai Introduce btmtk_reset_work which can be called whenever the firmware abort, HCI command timeout, other fatal error happen. Co-developed-by: Sean Wang Signed-off-by: Sean Wang Signed-off-by: Jing Cai --- v2, v3, v4: rebase onto the latest codebase --- drivers/bluetooth/btmtk.c | 16 ++++++ drivers/bluetooth/btmtk.h | 14 +++++ drivers/bluetooth/btusb.c | 106 ++++++++++++++++++++------------------ 3 files changed, 86 insertions(+), 50 deletions(-) diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c index 809762d64fc6..77df7b5c3ef3 100644 --- a/drivers/bluetooth/btmtk.c +++ b/drivers/bluetooth/btmtk.c @@ -53,6 +53,8 @@ struct btmtk_section_map { }; } __packed; +static struct btmtk_reset_work reset_work; + int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, wmt_cmd_sync_func_t wmt_cmd_sync) { @@ -280,6 +282,20 @@ int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) } EXPORT_SYMBOL_GPL(btmtk_set_bdaddr); +void btmtk_init_reset_work(struct hci_dev *hdev, work_func_t func) +{ + reset_work.hdev = hdev; + INIT_WORK(&reset_work.work, func); +} +EXPORT_SYMBOL_GPL(btmtk_init_reset_work); + +void btmtk_reset_sync(struct hci_dev *hdev) +{ + schedule_work(&reset_work.work); + flush_work(&reset_work.work); +} +EXPORT_SYMBOL_GPL(btmtk_reset_sync); + MODULE_AUTHOR("Sean Wang "); MODULE_AUTHOR("Mark Chen "); MODULE_DESCRIPTION("Bluetooth support for MediaTek devices ver " VERSION); diff --git a/drivers/bluetooth/btmtk.h b/drivers/bluetooth/btmtk.h index 2a88ea8e475e..22d39f637652 100644 --- a/drivers/bluetooth/btmtk.h +++ b/drivers/bluetooth/btmtk.h @@ -119,6 +119,11 @@ struct btmtk_hci_wmt_params { u32 *status; }; +struct btmtk_reset_work { + struct hci_dev *hdev; + struct work_struct work; +}; + typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, struct btmtk_hci_wmt_params *); @@ -131,6 +136,8 @@ int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, wmt_cmd_sync_func_t wmt_cmd_sync); +void btmtk_init_reset_work(struct hci_dev *hdev, work_func_t func); +void btmtk_reset_sync(struct hci_dev *hdev); #else static inline int btmtk_set_bdaddr(struct hci_dev *hdev, @@ -151,4 +158,11 @@ static int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, return -EOPNOTSUPP; } +static void btmtk_init_reset_work(struct hci_dev *hdev, work_func_t func) +{ +} + +static void btmtk_reset_sync(struct hci_dev *hdev) +{ +} #endif diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 275e0666503d..e84f1a8d03a3 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -2946,6 +2946,59 @@ static u32 btusb_mtk_reset_done(struct hci_dev *hdev) return val & MTK_BT_RST_DONE; } +static void btusb_mtk_reset_work(struct work_struct *work) +{ + struct btmtk_reset_work *info = container_of(work, + struct btmtk_reset_work, + work); + struct hci_dev *hdev = info->hdev; + struct btusb_data *data = hci_get_drvdata(hdev); + u32 val; + int err; + + /* It's MediaTek specific bluetooth reset mechanism via USB */ + if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { + bt_dev_err(hdev, "last reset failed? Not resetting again"); + return; + } + + err = usb_autopm_get_interface(data->intf); + if (err < 0) + return; + + btusb_stop_traffic(data); + usb_kill_anchored_urbs(&data->tx_anchor); + + /* It's Device EndPoint Reset Option Register */ + bt_dev_dbg(hdev, "Initiating reset mechanism via uhw"); + btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, MTK_EP_RST_IN_OUT_OPT); + btusb_mtk_uhw_reg_read(data, MTK_BT_WDT_STATUS, &val); + + /* Reset the bluetooth chip via USB interface. */ + btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 1); + btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT, 0x000000FF); + btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT, &val); + btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT1, 0x000000FF); + btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT1, &val); + /* MT7921 need to delay 20ms between toggle reset bit */ + msleep(20); + btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 0); + btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val); + + err = readx_poll_timeout(btusb_mtk_reset_done, hdev, val, + val & MTK_BT_RST_DONE, 20000, 1000000); + if (err < 0) + bt_dev_err(hdev, "Reset timeout"); + + btusb_mtk_id_get(data, 0x70010200, &val); + if (!val) + bt_dev_err(hdev, "Can't get device id, subsys reset fail."); + + usb_queue_reset_device(data->intf); + + clear_bit(BTUSB_HW_RESET_ACTIVE, &data->flags); +} + static int btusb_mtk_setup(struct hci_dev *hdev) { struct btusb_data *data = hci_get_drvdata(hdev); @@ -2982,6 +3035,8 @@ static int btusb_mtk_setup(struct hci_dev *hdev) } } + btmtk_init_reset_work(hdev, btusb_mtk_reset_work); + switch (dev_id) { case 0x7663: fwname = FIRMWARE_MT7663; @@ -3131,55 +3186,6 @@ static int btusb_mtk_shutdown(struct hci_dev *hdev) return 0; } -static void btusb_mtk_cmd_timeout(struct hci_dev *hdev) -{ - struct btusb_data *data = hci_get_drvdata(hdev); - u32 val; - int err; - - /* It's MediaTek specific bluetooth reset mechanism via USB */ - if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { - bt_dev_err(hdev, "last reset failed? Not resetting again"); - return; - } - - err = usb_autopm_get_interface(data->intf); - if (err < 0) - return; - - btusb_stop_traffic(data); - usb_kill_anchored_urbs(&data->tx_anchor); - - /* It's Device EndPoint Reset Option Register */ - bt_dev_dbg(hdev, "Initiating reset mechanism via uhw"); - btusb_mtk_uhw_reg_write(data, MTK_EP_RST_OPT, MTK_EP_RST_IN_OUT_OPT); - btusb_mtk_uhw_reg_read(data, MTK_BT_WDT_STATUS, &val); - - /* Reset the bluetooth chip via USB interface. */ - btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 1); - btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT, 0x000000FF); - btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT, &val); - btusb_mtk_uhw_reg_write(data, MTK_UDMA_INT_STA_BT1, 0x000000FF); - btusb_mtk_uhw_reg_read(data, MTK_UDMA_INT_STA_BT1, &val); - /* MT7921 need to delay 20ms between toggle reset bit */ - msleep(20); - btusb_mtk_uhw_reg_write(data, MTK_BT_SUBSYS_RST, 0); - btusb_mtk_uhw_reg_read(data, MTK_BT_SUBSYS_RST, &val); - - err = readx_poll_timeout(btusb_mtk_reset_done, hdev, val, - val & MTK_BT_RST_DONE, 20000, 1000000); - if (err < 0) - bt_dev_err(hdev, "Reset timeout"); - - btusb_mtk_id_get(data, 0x70010200, &val); - if (!val) - bt_dev_err(hdev, "Can't get device id, subsys reset fail."); - - usb_queue_reset_device(data->intf); - - clear_bit(BTUSB_HW_RESET_ACTIVE, &data->flags); -} - static int btusb_recv_acl_mtk(struct hci_dev *hdev, struct sk_buff *skb) { struct btusb_data *data = hci_get_drvdata(hdev); @@ -4301,7 +4307,7 @@ static int btusb_probe(struct usb_interface *intf, hdev->setup = btusb_mtk_setup; hdev->shutdown = btusb_mtk_shutdown; hdev->manufacturer = 70; - hdev->cmd_timeout = btusb_mtk_cmd_timeout; + hdev->cmd_timeout = btmtk_reset_sync; hdev->set_bdaddr = btmtk_set_bdaddr; set_bit(HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, &hdev->quirks); set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); From patchwork Wed Apr 26 23:08:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sean.wang@mediatek.com X-Patchwork-Id: 88033 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp561757vqo; Wed, 26 Apr 2023 16:24:11 -0700 (PDT) X-Google-Smtp-Source: AKy350axGmMz2HAl6btR8XFhjyixFteRNxygy0yB6hHxYfPR1nuLXallKAjpQVSfq7iEcxTxosMw X-Received: by 2002:a17:902:db11:b0:1a6:8405:f709 with SMTP id m17-20020a170902db1100b001a68405f709mr30704883plx.20.1682551450861; Wed, 26 Apr 2023 16:24:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682551450; cv=none; d=google.com; s=arc-20160816; b=0dVq7ljpQv9l3Lm8p14wKtQToJ6Lfm2pgeQCDPyqzAmUlsNQW9UrWWDjPa5JkToPSJ b79pB19uNBqW6L5/EIOhqCtQRleCRNETb65j1sfjagwqe8UeHj3kP4azf3CJQN5cLHh+ YD0SEeuHEhBNoL1IdblnZApakPNIa34UvaERlYV+x3/VVS2z8sep2AwJVfq3GPKXDjUo jfs40bneuisFN+ONke1vU73sq9svd9I6hebjptnChmvZkwqyQo0swA6YgfViHnzObvQD 1uLAlvBocb6AddaWOa46os38YWKEHkKRnO9PH9MPzR5omTJ4DjC6E472tBtl0+Cm7Jv9 e1kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=MjQmkvN1bHP14qGtS7nnlOwqloIPdNnbXQ2Bz4X1HWA=; b=YFdYGsa5J31GMahFYMeE5i8gq5L1Pq1CdT/46Q2/L8/qnZcLNNSDvuQueTKjyMqXNY o0G7/25sKBu+BVp+lo/GW5L7JNz8/BRtY7QcS/+uPQn9X0mf/FE9R+UbLMTW+Sfnd6HY kdYupsXWv13SeIWv6GnavVobAIIbpkyhpNLIjFizj8JX9+TeSIzHbJ7O8qAUHgTS8PLl 6BHKuOaXBUB7VrRDFxn9E+B0boqi99pRHls0L6gOdKpsPRsWqfFX3cn5gXv/EyhcfWvT c40Era0urdaSODllGpyjou5dhRXYkIUUxH2vCnsZO/r+YTQ35FQsWcjfSVQUwMyQdBqg OGUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=q8S6mrte; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id kb14-20020a170903338e00b001a8096ef2bfsi16401139plb.34.2023.04.26.16.23.57; Wed, 26 Apr 2023 16:24:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=q8S6mrte; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239080AbjDZXJE (ORCPT + 99 others); Wed, 26 Apr 2023 19:09:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36632 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229582AbjDZXJC (ORCPT ); Wed, 26 Apr 2023 19:09:02 -0400 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 26645BB; Wed, 26 Apr 2023 16:08:59 -0700 (PDT) X-UUID: 4f49de0ae48711edb6b9f13eb10bd0fe-20230427 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=MjQmkvN1bHP14qGtS7nnlOwqloIPdNnbXQ2Bz4X1HWA=; b=q8S6mrtesyj2lQuemH3U8WEArX0f2Bxm8imQKrTCiL8rvZAkX5Sa3Oh1YbHTpXTsj1niFAJY7uz15z+hnYoUFtNtGjaYYWrDG82eFw6NdSvkUhz1ZC0pOtVcbkTUI8Su6lMWxnnL1xxBrjSyeEH1aUVNvZU5gS5Pb0CvC7q135U=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.22,REQID:9d465849-e6f6-4b82-90fd-a845aa6bc0f3,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:95 X-CID-INFO: VERSION:1.1.22,REQID:9d465849-e6f6-4b82-90fd-a845aa6bc0f3,IP:0,URL :0,TC:0,Content:0,EDM:0,RT:0,SF:95,FILE:0,BULK:0,RULE:Spam_GS981B3D,ACTION :quarantine,TS:95 X-CID-META: VersionHash:120426c,CLOUDID:d08f5b85-cd9c-45f5-8134-710979e3df0e,B ulkID:2304270708535YV56AV6,BulkQuantity:0,Recheck:0,SF:38|29|28|17|19|48,T C:nil,Content:0,EDM:-3,IP:nil,URL:11|1,File:nil,Bulk:nil,QS:nil,BEC:nil,CO L:0,OSI:0,OSA:0,AV:0 X-CID-BVR: 0 X-CID-BAS: 0,_,0,_ X-UUID: 4f49de0ae48711edb6b9f13eb10bd0fe-20230427 Received: from mtkmbs13n1.mediatek.inc [(172.21.101.193)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 169641459; Thu, 27 Apr 2023 07:08:52 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs11n1.mediatek.inc (172.21.101.185) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.25; Thu, 27 Apr 2023 07:08:50 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Thu, 27 Apr 2023 07:08:50 +0800 From: To: , , CC: , , , , , , , , , , , , , , , , , , , , , , , Jing Cai Subject: [PATCH v4 3/3] Bluetooth: btusb: mediatek: add MediaTek devcoredump support Date: Thu, 27 Apr 2023 07:08:45 +0800 Message-ID: <01d3fe06d3a1e333b193e7d9fbc9cbfb4ee5d02b.1682549719.git.objelf@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <4699f59b36d522ec263dcea71eda40ae939004f8.1682549719.git.objelf@gmail.com> References: <4699f59b36d522ec263dcea71eda40ae939004f8.1682549719.git.objelf@gmail.com> MIME-Version: 1.0 X-MTK: N X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764283070374309601?= X-GMAIL-MSGID: =?utf-8?q?1764283070374309601?= From: Jing Cai This patch implement function .coredump() and dmp_hdr() in btusb driver for MediaTek controller. FW core dump was triggered by FW specific event to show something unexpected happened in the controller. The driver would be responsible for collecting and uploading the device core dump pieces in hci driver using core dump API. Once we finished the whole process, the driver would reset the controller to recover the kind of fatal error. Co-developed-by: Chris Lu Signed-off-by: Chris Lu Co-developed-by: Sean Wang Signed-off-by: Sean Wang Signed-off-by: Jing Cai --- v2, v3: rebase onto the latest codebase v4: update the newest API usage for the coredump which was already into the upstream --- drivers/bluetooth/btmtk.c | 120 ++++++++++++++++++++++++++++++++++++++ drivers/bluetooth/btmtk.h | 13 +++++ drivers/bluetooth/btusb.c | 11 ++++ 3 files changed, 144 insertions(+) diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c index 77df7b5c3ef3..96c1b49cf7c0 100644 --- a/drivers/bluetooth/btmtk.c +++ b/drivers/bluetooth/btmtk.c @@ -18,6 +18,15 @@ #define MTK_FW_ROM_PATCH_SEC_MAP_SIZE 64 #define MTK_SEC_MAP_COMMON_SIZE 12 #define MTK_SEC_MAP_NEED_SEND_SIZE 52 +#define MTK_DRIVER_NAME_LEN 16 +#define MTK_COREDUMP_SIZE (1024 * 1000) +#define MTK_COREDUMP_END "coredump end" + +enum { + BTMTK_COREDUMP_INIT, + BTMTK_COREDUMP_DISABLED, + BTMTK_COREDUMP_ACTIVE, +}; struct btmtk_patch_header { u8 datetime[16]; @@ -53,8 +62,60 @@ struct btmtk_section_map { }; } __packed; +static struct btmtk_coredump_info { + struct hci_dev *hdev; + char driver_name[MTK_DRIVER_NAME_LEN]; + u32 dev_id; + u32 fw_version; + int state; +} coredump_info; + static struct btmtk_reset_work reset_work; +static void btmtk_coredump(struct hci_dev *hdev) +{ + int err; + + err = __hci_cmd_send(hdev, 0xfd5b, 0, NULL); + if (err < 0) + bt_dev_err(hdev, "Coredump failed (%d)", err); +} + +static void btmtk_coredump_hdr(struct hci_dev *hdev, struct sk_buff *skb) +{ + char buf[80]; + + snprintf(buf, sizeof(buf), "Controller Name: 0x%X\n", coredump_info.dev_id); + skb_put_data(skb, buf, strlen(buf)); + + snprintf(buf, sizeof(buf), "Firmware Version: 0x%X\n", coredump_info.fw_version); + skb_put_data(skb, buf, strlen(buf)); + + snprintf(buf, sizeof(buf), "Driver: %s\n", coredump_info.driver_name); + skb_put_data(skb, buf, strlen(buf)); + + snprintf(buf, sizeof(buf), "Vendor: MediaTek\n"); + skb_put_data(skb, buf, strlen(buf)); +} + +static void btmtk_coredump_notify(struct hci_dev *hdev, int state) +{ + switch (state) { + case HCI_DEVCOREDUMP_IDLE: + coredump_info.state = BTMTK_COREDUMP_INIT; + break; + case HCI_DEVCOREDUMP_ACTIVE: + coredump_info.state = BTMTK_COREDUMP_ACTIVE; + break; + case HCI_DEVCOREDUMP_TIMEOUT: + case HCI_DEVCOREDUMP_ABORT: + case HCI_DEVCOREDUMP_DONE: + coredump_info.state = BTMTK_COREDUMP_INIT; + btmtk_reset_sync(coredump_info.hdev); + break; + } +} + int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, wmt_cmd_sync_func_t wmt_cmd_sync) { @@ -296,6 +357,65 @@ void btmtk_reset_sync(struct hci_dev *hdev) } EXPORT_SYMBOL_GPL(btmtk_reset_sync); +void btmtk_register_coredump(struct hci_dev *hdev, u32 dev_id, + const char *name, u32 fw_version) +{ + if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) + return; + + coredump_info.hdev = hdev; + coredump_info.dev_id = dev_id; + coredump_info.fw_version = fw_version; + coredump_info.state = BTMTK_COREDUMP_INIT; + strncpy(coredump_info.driver_name, name, MTK_DRIVER_NAME_LEN - 1); + + hci_devcd_register(hdev, btmtk_coredump, btmtk_coredump_hdr, + btmtk_coredump_notify); +} +EXPORT_SYMBOL_GPL(btmtk_register_coredump); + +int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb) +{ + int err; + + if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) + return 0; + + switch (coredump_info.state) { + case BTMTK_COREDUMP_DISABLED: + err = -EINVAL; + break; + case BTMTK_COREDUMP_INIT: + err = hci_devcd_init(hdev, MTK_COREDUMP_SIZE); + if (err < 0) + break; + /* It is supposed coredump can be done within 5 seconds */ + schedule_delayed_work(&hdev->dump.dump_timeout, + msecs_to_jiffies(5000)); + fallthrough; + case BTMTK_COREDUMP_ACTIVE: + default: + err = hci_devcd_append(hdev, skb); + if (err < 0) + break; + + if (skb->len > 12 && + !strncmp((char *)&skb->data[skb->len - 13], + MTK_COREDUMP_END, 12)) + hci_devcd_complete(hdev); + + break; + } + + if (err < 0) { + coredump_info.state = BTMTK_COREDUMP_DISABLED; + kfree_skb(skb); + } + + return err; +} +EXPORT_SYMBOL_GPL(btmtk_process_coredump); + MODULE_AUTHOR("Sean Wang "); MODULE_AUTHOR("Mark Chen "); MODULE_DESCRIPTION("Bluetooth support for MediaTek devices ver " VERSION); diff --git a/drivers/bluetooth/btmtk.h b/drivers/bluetooth/btmtk.h index 22d39f637652..faf941ce7ca2 100644 --- a/drivers/bluetooth/btmtk.h +++ b/drivers/bluetooth/btmtk.h @@ -138,6 +138,9 @@ int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, wmt_cmd_sync_func_t wmt_cmd_sync); void btmtk_init_reset_work(struct hci_dev *hdev, work_func_t func); void btmtk_reset_sync(struct hci_dev *hdev); +void btmtk_register_coredump(struct hci_dev *hdev, u32 dev_id, const char *name, + u32 fw_version); +int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb); #else static inline int btmtk_set_bdaddr(struct hci_dev *hdev, @@ -165,4 +168,14 @@ static void btmtk_init_reset_work(struct hci_dev *hdev, work_func_t func) static void btmtk_reset_sync(struct hci_dev *hdev) { } + +void btmtk_register_coredump(struct hci_dev *hdev, u32 dev_id, const char *name, + u32 fw_version) +{ +} + +static int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb) +{ + return -EOPNOTSUPP; +} #endif diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index e84f1a8d03a3..72a1cf83a859 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -3036,6 +3036,7 @@ static int btusb_mtk_setup(struct hci_dev *hdev) } btmtk_init_reset_work(hdev, btusb_mtk_reset_work); + btmtk_register_coredump(hdev, dev_id, btusb_driver.name, fw_version); switch (dev_id) { case 0x7663: @@ -3190,6 +3191,7 @@ static int btusb_recv_acl_mtk(struct hci_dev *hdev, struct sk_buff *skb) { struct btusb_data *data = hci_get_drvdata(hdev); u16 handle = le16_to_cpu(hci_acl_hdr(skb)->handle); + struct sk_buff *skb_cd; switch (handle) { case 0xfc6f: /* Firmware dump from device */ @@ -3197,6 +3199,15 @@ static int btusb_recv_acl_mtk(struct hci_dev *hdev, struct sk_buff *skb) * suspend and thus disable auto-suspend. */ usb_disable_autosuspend(data->udev); + + /* We need to forward the diagnostic packet to userspace daemon + * for backward compatibility, so we have to clone the packet + * extraly for the in-kernel coredump support. + */ + skb_cd = skb_clone(skb, GFP_ATOMIC); + if (skb_cd) + btmtk_process_coredump(hdev, skb_cd); + fallthrough; case 0x05ff: /* Firmware debug logging 1 */ case 0x05fe: /* Firmware debug logging 2 */