From patchwork Tue May 2 23:02:40 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: 89516 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp954760vqo; Tue, 2 May 2023 16:19:16 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4n0IaZZvZ4Yj2lmyUiPQSdlwcYPgG7xqzUrg4nsXP35FPWMSc4NKUqQz5DsfvyzQhb9inE X-Received: by 2002:a17:902:6a8b:b0:1a8:4506:a36f with SMTP id n11-20020a1709026a8b00b001a84506a36fmr176404plk.25.1683069556578; Tue, 02 May 2023 16:19:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683069556; cv=none; d=google.com; s=arc-20160816; b=UNh8X3nW+eFwKTtXwpeiPOGplZ75pds1veN6rA9lr9mHvoFWio2tRyU1UE2+joH97y Tkftyi1XEtFt7vzKgGHdfBQTRGw7HnsaNax6jIo9okg8oi8Yg74EPQHWBXb52Fwsn7Pa qy6/dZAL58cR/iex8+VT/cBLJECK5pKOr32T6CURi8R1Cwi2H+8NoZyK6rdv+hIKHy7X OnvJ5rLWC2naC6DshDOn7vNxaE364PBbD9SqcycsXmv0Ilv8wYXdYxyiDnoDb005w6sb 2XQEqBZv75d5YJAelNE1ISJKvc45POHmhPOVzopZB7xDer3GLf8mkicFX1CMgF917oDW kbQw== 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=nHVEPYLguKcpy/6oCAIqC8r0dEnyeHELgnO194+UDO8=; b=aMyctDcVrYfI8rsx532e25ImDujLA5RERGfq2KTUxMJ6QNHCNmrpLwgBNHLGcPdMqf i51wXcDCOHVGYJsi9uKZWaPetnT629sVvIq+8gdSjG/uWXtcln2NNnMtro5mOcjTFGeO Vamhk0EninmgN2xHDp4kg+IH4+B1ybi9dq6vexubqClNYSpHbrKs1kiUFf8gKTXlBqrs ogaExO7IwQz0MUm/cBKNnaAYvHMs5Rqb+V2UpZG7KF8vcJhilINHcm98nJllc+h2lVCQ 6krN1YlIPtoq5SkjvuIrqhLDGAzVglo5buxaD6+h6TpyJWs44tTLbAZbnh7ievI3xaqO xi3A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=OfII5III; 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 a8-20020a170902ecc800b001a0ae87878dsi33359201plh.388.2023.05.02.16.19.01; Tue, 02 May 2023 16:19:16 -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=OfII5III; 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 S229838AbjEBXDC (ORCPT + 99 others); Tue, 2 May 2023 19:03:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229756AbjEBXDA (ORCPT ); Tue, 2 May 2023 19:03:00 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 75E4B273A; Tue, 2 May 2023 16:02:54 -0700 (PDT) X-UUID: 744a450ee93d11ed9cb5633481061a41-20230503 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=nHVEPYLguKcpy/6oCAIqC8r0dEnyeHELgnO194+UDO8=; b=OfII5IIIAH67W5Jw3t9yvTKmYpDpHXuwS6kK1PqjJRaXXTG70FY7MUVpFvzJRwkpOwd3t/jCaRzOiVOm5qnrc0UnUHaaaD/RP3nF8O+9gjgm6/I2l/pJ44g6kA8t3sL2Kq6yZmLdvbOlRSmm80iEzA7XRBja8xCiTKxcoUJ7zkk=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.22,REQID:78669f1f-9b67-4eca-b5c3-32aea9918a9b,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:75288f6a-2f20-4998-991c-3b78627e4938,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: 744a450ee93d11ed9cb5633481061a41-20230503 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 1190135545; Wed, 03 May 2023 07:02:47 +0800 Received: from mtkmbs13n2.mediatek.inc (172.21.101.108) by mtkmbs11n2.mediatek.inc (172.21.101.187) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.26; Wed, 3 May 2023 07:02:45 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs13n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Wed, 3 May 2023 07:02:45 +0800 From: To: , , CC: , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v5 1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding Date: Wed, 3 May 2023 07:02:40 +0800 Message-ID: X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-MTK: N X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=no 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?1764826343016511931?= X-GMAIL-MSGID: =?utf-8?q?1764826343016511931?= 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, v5: 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 Tue May 2 23:02:41 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: 89521 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp963107vqo; Tue, 2 May 2023 16:38:56 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5kcpqU+EWw8SCQie2ID9Ht7UX3Jl03taC4lStK7lyb68CZKUlpFImXoeHBmt2sgNqLOFwp X-Received: by 2002:a17:902:dac4:b0:1a6:9762:6eee with SMTP id q4-20020a170902dac400b001a697626eeemr234819plx.40.1683070735935; Tue, 02 May 2023 16:38:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683070735; cv=none; d=google.com; s=arc-20160816; b=tIi7A/rFp1UGf3Nqnv8yiWI+ZJuRiLS+cZbH1XFEpop0Os94oujSkQrdykJS9k0rwu K/MGlloaj0Kj5QWj6rFXO7i4jadteVdj9kKM9OhAMQUGpqs9KBIaa1OnO4qgTQNQKIab S9vjwPmi1DUM8FtLDffRfAkTJnyI4A1NtDhDTxAsK64eEZ9VXhKaF6MTUv7KgFqkVSVY k4Gec6X6FY74ZdwcW4CihYuqYYZdXhlPWPUU8nqYii5oj7DBFJckFKhqp3utAHYbZvnu T39TQglUxQN4nPiZxZSZim0Rvth6XlEPRE8stz1rti0Vw6JzRkRCTOSv5iwWbUMJZvTF gVBg== 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=WSyJtNWYlXOYfco1RA0F3KuIdy9uw9ikjhrjoNTjehk=; b=uFGMEDGOUBPHsCWORdURfJdmzKFwLjuuzLXkLYAW9Ca8+7i052+kn1NczJ5fMtMhOi p9f5gsCSQLg7tFFs9BlGK1R+gyzhPMdPO4qNt0EZIaGwC1Aq/YM7itTq3+Tv/ZYiPuI1 lE2EP0gr4YsoIESTyyUpjidZzQQVroxyzs7vI//rvmfphE0aoAKNDA8/fmgEdoCPk42N QxOUZ9YmQReWT899ypRBtDGUBwNq7QE77el5cUCRydGlEd0QSpij1isZrj6jEuG8yNBm mBYlsSIiqZ9m9mlCiRndDbsVuP1nNUY5nXRVI3cT9JyXFayVU/4Pfat8XVojCfGeBF4C 1LLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=ZyzGhrLv; 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 q8-20020a170902b10800b001aafe3f40a7si4702218plr.579.2023.05.02.16.38.42; Tue, 02 May 2023 16:38:55 -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=ZyzGhrLv; 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 S230047AbjEBXDF (ORCPT + 99 others); Tue, 2 May 2023 19:03:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52708 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229824AbjEBXDC (ORCPT ); Tue, 2 May 2023 19:03:02 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 116ADC3; Tue, 2 May 2023 16:02:56 -0700 (PDT) X-UUID: 75b9e4bce93d11ed9cb5633481061a41-20230503 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=WSyJtNWYlXOYfco1RA0F3KuIdy9uw9ikjhrjoNTjehk=; b=ZyzGhrLv5SWvjMQUMQW/eaAKd333KOex79UIQNGrIYs8EeUaaqXka+G37Em6XIZ5EA8XdM+h2Z8jucJ6dr8upMobtfqta+9iaeci67hy96SCAOMbOrdb3d+4+qBd5FX+Ye5pGSkxzDavtXMOlAnyiS644MIkNCkUePTanbAnYWI=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.22,REQID:96ce6e57-3b65-4363-bc06-583b1cc79484,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:100,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:100 X-CID-INFO: VERSION:1.1.22,REQID:96ce6e57-3b65-4363-bc06-583b1cc79484,IP:0,URL :0,TC:0,Content:0,EDM:0,RT:0,SF:100,FILE:0,BULK:0,RULE:Spam_GS981B3D,ACTIO N:quarantine,TS:100 X-CID-META: VersionHash:120426c,CLOUDID:d18e8930-6935-4eab-a959-f84f8da15543,B ulkID:230503070252ECIJ2721,BulkQuantity:0,Recheck:0,SF:29|28|17|19|48|38,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: 75b9e4bce93d11ed9cb5633481061a41-20230503 Received: from mtkmbs10n1.mediatek.inc [(172.21.101.34)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 2045014937; Wed, 03 May 2023 07:02:49 +0800 Received: from mtkmbs13n2.mediatek.inc (172.21.101.108) 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; Wed, 3 May 2023 07:02:48 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs13n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Wed, 3 May 2023 07:02:48 +0800 From: To: , , CC: , , , , , , , , , , , , , , , , , , , , , , , Jing Cai Subject: [PATCH v5 2/3] Bluetooth: btmtk: introduce btmtk reset work Date: Wed, 3 May 2023 07:02:41 +0800 Message-ID: X-Mailer: git-send-email 1.7.9.5 In-Reply-To: References: 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 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?1764827580132919688?= X-GMAIL-MSGID: =?utf-8?q?1764827580132919688?= 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: Chris Lu Signed-off-by: Chris Lu Co-developed-by: Sean Wang Signed-off-by: Sean Wang Signed-off-by: Jing Cai --- v2, v3, v4: rebase onto the latest codebase v5: reset the device on hdev basis and use hci_cmd_sync_queue to schedule reset work --- drivers/bluetooth/btmtk.c | 15 ++++++ drivers/bluetooth/btmtk.h | 11 ++++ drivers/bluetooth/btusb.c | 108 ++++++++++++++++++++------------------ 3 files changed, 84 insertions(+), 50 deletions(-) diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c index 809762d64fc6..ac2fac7e3c5f 100644 --- a/drivers/bluetooth/btmtk.c +++ b/drivers/bluetooth/btmtk.c @@ -280,6 +280,21 @@ int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) } EXPORT_SYMBOL_GPL(btmtk_set_bdaddr); +void btmtk_reset_sync(struct hci_dev *hdev) +{ + struct btmtk_data *reset_work = hci_get_priv(hdev); + int err; + + hci_dev_lock(hdev); + + err = hci_cmd_sync_queue(hdev, reset_work->reset_sync, NULL, NULL); + if (err) + bt_dev_err(hdev, "failed to reset (%d)", err); + + hci_dev_unlock(hdev); +} +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..6245662f6ccb 100644 --- a/drivers/bluetooth/btmtk.h +++ b/drivers/bluetooth/btmtk.h @@ -122,6 +122,12 @@ struct btmtk_hci_wmt_params { typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, struct btmtk_hci_wmt_params *); +typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *); + +struct btmtk_data { + btmtk_reset_sync_func_t reset_sync; +}; + #if IS_ENABLED(CONFIG_BT_MTK) int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr); @@ -131,6 +137,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_reset_sync(struct hci_dev *hdev); #else static inline int btmtk_set_bdaddr(struct hci_dev *hdev, @@ -151,4 +159,7 @@ static int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, return -EOPNOTSUPP; } +static void btmtk_reset_sync(struct hci_dev *hdev) +{ +} #endif diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 275e0666503d..034edd8ad777 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -2946,8 +2946,60 @@ static u32 btusb_mtk_reset_done(struct hci_dev *hdev) return val & MTK_BT_RST_DONE; } +static int btusb_mtk_reset_work(struct hci_dev *hdev, void *rst_data) +{ + 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 -EBUSY; + } + + err = usb_autopm_get_interface(data->intf); + if (err < 0) + return err; + + 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); + + return err; +} + static int btusb_mtk_setup(struct hci_dev *hdev) { + struct btmtk_data *btmtk_data = hci_get_priv(hdev); struct btusb_data *data = hci_get_drvdata(hdev); struct btmtk_hci_wmt_params wmt_params; ktime_t calltime, delta, rettime; @@ -2982,6 +3034,8 @@ static int btusb_mtk_setup(struct hci_dev *hdev) } } + btmtk_data->reset_sync = btusb_mtk_reset_work; + switch (dev_id) { case 0x7663: fwname = FIRMWARE_MT7663; @@ -3131,55 +3185,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); @@ -4195,6 +4200,9 @@ static int btusb_probe(struct usb_interface *intf, } else if (id->driver_info & BTUSB_REALTEK) { /* Allocate extra space for Realtek device */ priv_size += sizeof(struct btrealtek_data); + } else if (id->driver_info & BTUSB_MEDIATEK) { + /* Allocate extra space for Mediatek device */ + priv_size += sizeof(struct btmtk_data); } data->recv_acl = hci_recv_frame; @@ -4301,7 +4309,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 Tue May 2 23:02:42 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: 89520 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp961743vqo; Tue, 2 May 2023 16:35:28 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ40n8CY0HSXf/9xOIuVQZ175CnwdhGypKigQReTahrCm3UjyIYwZdeQqFuW3uiIu7HnijDi X-Received: by 2002:a17:903:22ca:b0:1ab:19f6:ef0f with SMTP id y10-20020a17090322ca00b001ab19f6ef0fmr218631plg.33.1683070528358; Tue, 02 May 2023 16:35:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683070528; cv=none; d=google.com; s=arc-20160816; b=AEUQnPbf4Qm9VUiASsAzn8aFzxDx4Pm658p4wxZAT24GVZP1isjx4BVKSsevOaJd7Y YPBsCbUxG/qZAmY2KmbNXYjc7CdwdbnIHlSwoQjnl4rHb9PgqrgAjIa9/eWLB1l6acs3 MBlOJ9qCZzgpYxHg6OV7BggLqB2ZC8nlPyhsgZqZMG5T4iF6kQ0e5Pi0o/E3pACtmMy7 EI4cvSJnxrDItiUVCV5rl7M9euLGv/rSE88Pj9KTfVHTrCxxx0j1pJo9c/m+M5xcoZJ0 D0AbQzeJnEA1dxPSiel/6HbuvgdJMBGbTlPwpMU3RS5j/944J3l8X4jwiTNRfNqAVoEs xxUw== 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=mkU/S3bPr0klY6Ssv879wxrIutAv2eYi1dIiSecem24=; b=zxzJYutV4ZnPXCV6apLPTLley1KyoifoptEEbFehQC6eIhoWd9ZZefCM8eKiEpkBEF K4pytnppsGyqjQZ5+a3bXqVH6cIe01U5W88DP9pQDRLWMiR66+Bpc3kr1FQZNOBwRrwb Tr2e3a3hLlgcxgxu4fgYTGJ0k0A+FF4NeE12XpOQ0WELwPPQX1ELuEDf60b2sB20KsVL LJ1OZlnzxvQPYYJ6CJ4nTspMY88HJd5PtyPqpWnQQSZVEGfYzYGupTIjAf6n/svnCG38 05DV3/E8+e7+SKNt1dT2l5Opie5WgzELkzQ9x44SJQ1AsAI6tcr3awI6590D/PawaSUx 4tUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mediatek.com header.s=dk header.b=q30+JXoA; 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 q8-20020a170902b10800b001aafe3f40a7si4702218plr.579.2023.05.02.16.35.15; Tue, 02 May 2023 16:35:28 -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=q30+JXoA; 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 S230165AbjEBXDJ (ORCPT + 99 others); Tue, 2 May 2023 19:03:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52744 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229820AbjEBXDD (ORCPT ); Tue, 2 May 2023 19:03:03 -0400 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86ABF30CD; Tue, 2 May 2023 16:02:58 -0700 (PDT) X-UUID: 76d141cee93d11edb20a276fd37b9834-20230503 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=mkU/S3bPr0klY6Ssv879wxrIutAv2eYi1dIiSecem24=; b=q30+JXoAjwvPCPByQuGtoo3V/cae7xK1JidYJOSllfSrYCTMeq117y3vnNAQPS2lETiryCzVUXSf+xHf76Dw+qcXqZhGR5Nb+JTM6xQr1/S7WF4sKKJRguDS8ON9hWEWTu+yyuDTyvfxaMqnLEHWj9ZiuU/T4UzN1SNKebklZLI=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.22,REQID:c65c52d9-4f1d-4b08-9db8-b8b959a20607,IP:0,U RL:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:-5 X-CID-META: VersionHash:120426c,CLOUDID:d88e8930-6935-4eab-a959-f84f8da15543,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: 76d141cee93d11edb20a276fd37b9834-20230503 Received: from mtkmbs13n2.mediatek.inc [(172.21.101.108)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1559026427; Wed, 03 May 2023 07:02:51 +0800 Received: from mtkmbs13n2.mediatek.inc (172.21.101.108) 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; Wed, 3 May 2023 07:02:50 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs13n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Wed, 3 May 2023 07:02:50 +0800 From: To: , , CC: , , , , , , , , , , , , , , , , , , , , , , , Jing Cai Subject: [PATCH v5 3/3] Bluetooth: btusb: mediatek: add MediaTek devcoredump support Date: Wed, 3 May 2023 07:02:42 +0800 Message-ID: X-Mailer: git-send-email 1.7.9.5 In-Reply-To: References: MIME-Version: 1.0 X-MTK: N X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,RDNS_NONE, SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=no 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?1764827362128005699?= X-GMAIL-MSGID: =?utf-8?q?1764827362128005699?= 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 v5: support devcoredump on hdev basis --- drivers/bluetooth/btmtk.c | 117 ++++++++++++++++++++++++++++++++++++++ drivers/bluetooth/btmtk.h | 28 +++++++++ drivers/bluetooth/btusb.c | 14 +++++ 3 files changed, 159 insertions(+) diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c index ac2fac7e3c5f..657792f9dcab 100644 --- a/drivers/bluetooth/btmtk.c +++ b/drivers/bluetooth/btmtk.c @@ -19,6 +19,12 @@ #define MTK_SEC_MAP_COMMON_SIZE 12 #define MTK_SEC_MAP_NEED_SEND_SIZE 52 +enum { + BTMTK_COREDUMP_INIT, + BTMTK_COREDUMP_DISABLED, + BTMTK_COREDUMP_ACTIVE, +}; + struct btmtk_patch_header { u8 datetime[16]; u8 platform[4]; @@ -53,6 +59,56 @@ struct btmtk_section_map { }; } __packed; +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) +{ + struct btmtk_data *data = hci_get_priv(hdev); + char buf[80]; + + snprintf(buf, sizeof(buf), "Controller Name: 0x%X\n", + data->cd_info.dev_id); + skb_put_data(skb, buf, strlen(buf)); + + snprintf(buf, sizeof(buf), "Firmware Version: 0x%X\n", + data->cd_info.fw_version); + skb_put_data(skb, buf, strlen(buf)); + + snprintf(buf, sizeof(buf), "Driver: %s\n", + data->cd_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) +{ + struct btmtk_data *data = hci_get_priv(hdev); + + switch (state) { + case HCI_DEVCOREDUMP_IDLE: + data->cd_info.state = BTMTK_COREDUMP_INIT; + break; + case HCI_DEVCOREDUMP_ACTIVE: + data->cd_info.state = BTMTK_COREDUMP_ACTIVE; + break; + case HCI_DEVCOREDUMP_TIMEOUT: + case HCI_DEVCOREDUMP_ABORT: + case HCI_DEVCOREDUMP_DONE: + data->cd_info.state = BTMTK_COREDUMP_INIT; + btmtk_reset_sync(hdev); + break; + } +} + int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, wmt_cmd_sync_func_t wmt_cmd_sync) { @@ -295,6 +351,67 @@ void btmtk_reset_sync(struct hci_dev *hdev) } EXPORT_SYMBOL_GPL(btmtk_reset_sync); +int btmtk_register_coredump(struct hci_dev *hdev, u32 dev_id, + const char *name, u32 fw_version) +{ + struct btmtk_data *data = hci_get_priv(hdev); + + if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) + return -EOPNOTSUPP; + + data->cd_info.dev_id = dev_id; + data->cd_info.fw_version = fw_version; + data->cd_info.state = BTMTK_COREDUMP_INIT; + strncpy(data->cd_info.driver_name, name, MTK_DRIVER_NAME_LEN - 1); + + return 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) +{ + struct btmtk_data *data = hci_get_priv(hdev); + int err; + + if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) + return 0; + + switch (data->cd_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) { + data->cd_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 6245662f6ccb..7eb162f0e7aa 100644 --- a/drivers/bluetooth/btmtk.h +++ b/drivers/bluetooth/btmtk.h @@ -21,6 +21,10 @@ #define MT7921_DLSTATUS 0x7c053c10 #define BT_DL_STATE BIT(1) +#define MTK_DRIVER_NAME_LEN 16 +#define MTK_COREDUMP_SIZE (1024 * 1000) +#define MTK_COREDUMP_END "coredump end" + enum { BTMTK_WMT_PATCH_DWNLD = 0x1, BTMTK_WMT_TEST = 0x2, @@ -119,12 +123,20 @@ struct btmtk_hci_wmt_params { u32 *status; }; +struct btmtk_coredump_info { + char driver_name[MTK_DRIVER_NAME_LEN]; + u32 dev_id; + u32 fw_version; + int state; +}; + typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, struct btmtk_hci_wmt_params *); typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *); struct btmtk_data { + struct btmtk_coredump_info cd_info; btmtk_reset_sync_func_t reset_sync; }; @@ -139,6 +151,11 @@ int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, wmt_cmd_sync_func_t wmt_cmd_sync); void btmtk_reset_sync(struct hci_dev *hdev); + +int 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, @@ -162,4 +179,15 @@ static int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, static void btmtk_reset_sync(struct hci_dev *hdev) { } + +static int btmtk_register_coredump(struct hci_dev *hdev, u32 dev_id, const char *name, + u32 fw_version) +{ + return -EOPNOTSUPP; +} + +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 034edd8ad777..1c2a0cbcf62e 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -3035,6 +3035,10 @@ static int btusb_mtk_setup(struct hci_dev *hdev) } btmtk_data->reset_sync = btusb_mtk_reset_work; + err = btmtk_register_coredump(hdev, dev_id, btusb_driver.name, + fw_version); + if (err < 0) + bt_dev_err(hdev, "Failed to register coredump (%d)", err); switch (dev_id) { case 0x7663: @@ -3189,6 +3193,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 */ @@ -3196,6 +3201,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 */