diff mbox series

[v2,3/3] Bluetooth: btusb: mediatek: add MediaTek devcoredump support

Message ID 8130cc14237922f95e852fc14a6f90aed2f1117c.1664497281.git.objelf@gmail.com (mailing list archive)
State New, archived
Headers show
Series [v2,1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding | expand

Commit Message

Sean Wang Sept. 30, 2022, 12:23 a.m. UTC
From: Jing Cai <jing.cai@mediatek.com>

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: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Jing Cai <jing.cai@mediatek.com>
---
The patch is built and tested on the top of the patches
[v6,1/3] Bluetooth: Add support for hci devcoredump
[v6,2/3] Bluetooth: btusb: Add btusb devcoredump support
[v6,3/3] Bluetooth: btintel: Add Intel devcoredump support
which are contributed from Manish Mandlik

v2: rebase onto the latest codebase
---
 drivers/bluetooth/btmtk.c | 124 ++++++++++++++++++++++++++++++++++++++
 drivers/bluetooth/btmtk.h |  13 ++++
 drivers/bluetooth/btusb.c |  11 ++++
 3 files changed, 148 insertions(+)

Comments

kernel test robot Sept. 30, 2022, 11:38 a.m. UTC | #1
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on bluetooth/master]
[also build test ERROR on bluetooth-next/master linus/master v6.0-rc7 next-20220929]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
config: arm-randconfig-r033-20220925
compiler: arm-linux-gnueabi-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/046dccfde843fe56b2ad741a42d972365bb70b03
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
        git checkout 046dccfde843fe56b2ad741a42d972365bb70b03
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/bluetooth/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/bluetooth/btmtk.c: In function 'btmtk_coredump_notify':
   drivers/bluetooth/btmtk.c:111:14: error: 'HCI_DEVCOREDUMP_ACTIVE' undeclared (first use in this function); did you mean 'BTMTK_COREDUMP_ACTIVE'?
     111 |         case HCI_DEVCOREDUMP_ACTIVE:
         |              ^~~~~~~~~~~~~~~~~~~~~~
         |              BTMTK_COREDUMP_ACTIVE
   drivers/bluetooth/btmtk.c:111:14: note: each undeclared identifier is reported only once for each function it appears in
   drivers/bluetooth/btmtk.c:114:14: error: 'HCI_DEVCOREDUMP_TIMEOUT' undeclared (first use in this function); did you mean 'HCI_DISCONN_TIMEOUT'?
     114 |         case HCI_DEVCOREDUMP_TIMEOUT:
         |              ^~~~~~~~~~~~~~~~~~~~~~~
         |              HCI_DISCONN_TIMEOUT
   drivers/bluetooth/btmtk.c:115:14: error: 'HCI_DEVCOREDUMP_ABORT' undeclared (first use in this function)
     115 |         case HCI_DEVCOREDUMP_ABORT:
         |              ^~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btmtk.c:116:14: error: 'HCI_DEVCOREDUMP_DONE' undeclared (first use in this function)
     116 |         case HCI_DEVCOREDUMP_DONE:
         |              ^~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btmtk.c: In function 'btmtk_register_coredump':
   drivers/bluetooth/btmtk.c:376:9: error: implicit declaration of function 'hci_devcoredump_register' [-Werror=implicit-function-declaration]
     376 |         hci_devcoredump_register(hdev, btmtk_coredump, btmtk_coredump_hdr,
         |         ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btmtk.c: In function 'btmtk_process_coredump':
   drivers/bluetooth/btmtk.c:393:23: error: implicit declaration of function 'hci_devcoredump_init' [-Werror=implicit-function-declaration]
     393 |                 err = hci_devcoredump_init(hdev, 1024000);
         |                       ^~~~~~~~~~~~~~~~~~~~
>> drivers/bluetooth/btmtk.c:397:44: error: 'struct hci_dev' has no member named 'dump'
     397 |                 schedule_delayed_work(&hdev->dump.dump_timeout,
         |                                            ^~
   drivers/bluetooth/btmtk.c:402:23: error: implicit declaration of function 'hci_devcoredump_append' [-Werror=implicit-function-declaration]
     402 |                 err = hci_devcoredump_append(hdev, skb);
         |                       ^~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btmtk.c:409:25: error: implicit declaration of function 'hci_devcoredump_complete' [-Werror=implicit-function-declaration]
     409 |                         hci_devcoredump_complete(hdev);
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

Kconfig warnings: (for reference only)
   WARNING: unmet direct dependencies detected for TEGRA20_APB_DMA
   Depends on [n]: DMADEVICES [=n] && (ARCH_TEGRA [=y] || COMPILE_TEST [=y])
   Selected by [y]:
   - SOC_TEGRA_FUSE [=y] && ARCH_TEGRA [=y] && ARCH_TEGRA_2x_SOC [=y]


vim +397 drivers/bluetooth/btmtk.c

   380	
   381	int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb)
   382	{
   383		int err;
   384	
   385		if (!IS_ENABLED(CONFIG_DEV_COREDUMP))
   386			return 0;
   387	
   388		switch (coredump_info.state) {
   389		case BTMTK_COREDUMP_DISABLED:
   390			err = -EINVAL;
   391			break;
   392		case BTMTK_COREDUMP_INIT:
   393			err = hci_devcoredump_init(hdev, 1024000);
   394			if (err < 0)
   395				break;
   396			/* It is supposed coredump can be done within 5 seconds */
 > 397			schedule_delayed_work(&hdev->dump.dump_timeout,
   398					      msecs_to_jiffies(5000));
   399			fallthrough;
   400		case BTMTK_COREDUMP_ACTIVE:
   401		default:
   402			err = hci_devcoredump_append(hdev, skb);
   403			if (err < 0)
   404				break;
   405	
   406			if (skb->len > 12 &&
   407			    !strncmp((char *)&skb->data[skb->len - 13],
   408				     MTK_COREDUMP_END, 12))
   409				hci_devcoredump_complete(hdev);
   410	
   411			break;
   412		}
   413	
   414		if (err < 0) {
   415			coredump_info.state = BTMTK_COREDUMP_DISABLED;
   416			kfree_skb(skb);
   417		}
   418	
   419		return err;
   420	}
   421	EXPORT_SYMBOL_GPL(btmtk_process_coredump);
   422
kernel test robot Sept. 30, 2022, 12:21 p.m. UTC | #2
Hi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bluetooth/master]
[also build test WARNING on bluetooth-next/master linus/master v6.0-rc7 next-20220929]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
config: sparc64-randconfig-r016-20220930
compiler: sparc64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/046dccfde843fe56b2ad741a42d972365bb70b03
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
        git checkout 046dccfde843fe56b2ad741a42d972365bb70b03
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc64 SHELL=/bin/bash drivers/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from drivers/bluetooth/btusb.c:28:
>> drivers/bluetooth/btmtk.h:172:6: warning: no previous prototype for 'btmtk_register_coredump' [-Wmissing-prototypes]
     172 | void btmtk_register_coredump(struct hci_dev *hdev, u32 dev_id, const char *name,
         |      ^~~~~~~~~~~~~~~~~~~~~~~


vim +/btmtk_register_coredump +172 drivers/bluetooth/btmtk.h

   171	
 > 172	void btmtk_register_coredump(struct hci_dev *hdev, u32 dev_id, const char *name,
   173				     u32 fw_version)
   174	{
   175	}
   176
kernel test robot Sept. 30, 2022, 12:41 p.m. UTC | #3
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on bluetooth/master]
[also build test ERROR on bluetooth-next/master linus/master v6.0-rc7 next-20220929]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
config: i386-randconfig-a013
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/046dccfde843fe56b2ad741a42d972365bb70b03
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
        git checkout 046dccfde843fe56b2ad741a42d972365bb70b03
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/bluetooth/btmtk.c:111:7: error: use of undeclared identifier 'HCI_DEVCOREDUMP_ACTIVE'; did you mean 'BTMTK_COREDUMP_ACTIVE'?
           case HCI_DEVCOREDUMP_ACTIVE:
                ^~~~~~~~~~~~~~~~~~~~~~
                BTMTK_COREDUMP_ACTIVE
   drivers/bluetooth/btmtk.c:27:2: note: 'BTMTK_COREDUMP_ACTIVE' declared here
           BTMTK_COREDUMP_ACTIVE,
           ^
   drivers/bluetooth/btmtk.c:114:7: error: use of undeclared identifier 'HCI_DEVCOREDUMP_TIMEOUT'
           case HCI_DEVCOREDUMP_TIMEOUT:
                ^
   drivers/bluetooth/btmtk.c:115:7: error: use of undeclared identifier 'HCI_DEVCOREDUMP_ABORT'
           case HCI_DEVCOREDUMP_ABORT:
                ^
   drivers/bluetooth/btmtk.c:116:7: error: use of undeclared identifier 'HCI_DEVCOREDUMP_DONE'
           case HCI_DEVCOREDUMP_DONE:
                ^
   drivers/bluetooth/btmtk.c:376:2: error: implicit declaration of function 'hci_devcoredump_register' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
           hci_devcoredump_register(hdev, btmtk_coredump, btmtk_coredump_hdr,
           ^
   drivers/bluetooth/btmtk.c:393:9: error: implicit declaration of function 'hci_devcoredump_init' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                   err = hci_devcoredump_init(hdev, 1024000);
                         ^
>> drivers/bluetooth/btmtk.c:397:32: error: no member named 'dump' in 'struct hci_dev'
                   schedule_delayed_work(&hdev->dump.dump_timeout,
                                          ~~~~  ^
   drivers/bluetooth/btmtk.c:402:9: error: implicit declaration of function 'hci_devcoredump_append' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                   err = hci_devcoredump_append(hdev, skb);
                         ^
   drivers/bluetooth/btmtk.c:402:9: note: did you mean 'hci_devcoredump_init'?
   drivers/bluetooth/btmtk.c:393:9: note: 'hci_devcoredump_init' declared here
                   err = hci_devcoredump_init(hdev, 1024000);
                         ^
   drivers/bluetooth/btmtk.c:409:4: error: implicit declaration of function 'hci_devcoredump_complete' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                           hci_devcoredump_complete(hdev);
                           ^
   drivers/bluetooth/btmtk.c:409:4: note: did you mean 'hci_devcoredump_append'?
   drivers/bluetooth/btmtk.c:402:9: note: 'hci_devcoredump_append' declared here
                   err = hci_devcoredump_append(hdev, skb);
                         ^
   9 errors generated.


vim +397 drivers/bluetooth/btmtk.c

   380	
   381	int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb)
   382	{
   383		int err;
   384	
   385		if (!IS_ENABLED(CONFIG_DEV_COREDUMP))
   386			return 0;
   387	
   388		switch (coredump_info.state) {
   389		case BTMTK_COREDUMP_DISABLED:
   390			err = -EINVAL;
   391			break;
   392		case BTMTK_COREDUMP_INIT:
   393			err = hci_devcoredump_init(hdev, 1024000);
   394			if (err < 0)
   395				break;
   396			/* It is supposed coredump can be done within 5 seconds */
 > 397			schedule_delayed_work(&hdev->dump.dump_timeout,
   398					      msecs_to_jiffies(5000));
   399			fallthrough;
   400		case BTMTK_COREDUMP_ACTIVE:
   401		default:
   402			err = hci_devcoredump_append(hdev, skb);
   403			if (err < 0)
   404				break;
   405	
   406			if (skb->len > 12 &&
   407			    !strncmp((char *)&skb->data[skb->len - 13],
   408				     MTK_COREDUMP_END, 12))
   409				hci_devcoredump_complete(hdev);
   410	
   411			break;
   412		}
   413	
   414		if (err < 0) {
   415			coredump_info.state = BTMTK_COREDUMP_DISABLED;
   416			kfree_skb(skb);
   417		}
   418	
   419		return err;
   420	}
   421	EXPORT_SYMBOL_GPL(btmtk_process_coredump);
   422
kernel test robot Oct. 3, 2022, 12:02 a.m. UTC | #4
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on bluetooth/master]
[also build test ERROR on bluetooth-next/master linus/master v6.0-rc7 next-20220930]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
config: ia64-allmodconfig
compiler: ia64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/046dccfde843fe56b2ad741a42d972365bb70b03
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review sean-wang-mediatek-com/Bluetooth-btusb-mediatek-use-readx_poll_timeout-instead-of-open-coding/20220930-082512
        git checkout 046dccfde843fe56b2ad741a42d972365bb70b03
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/bluetooth/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/bluetooth/btmtk.c: In function 'btmtk_coredump_notify':
>> drivers/bluetooth/btmtk.c:111:14: error: 'HCI_DEVCOREDUMP_ACTIVE' undeclared (first use in this function); did you mean 'BTMTK_COREDUMP_ACTIVE'?
     111 |         case HCI_DEVCOREDUMP_ACTIVE:
         |              ^~~~~~~~~~~~~~~~~~~~~~
         |              BTMTK_COREDUMP_ACTIVE
   drivers/bluetooth/btmtk.c:111:14: note: each undeclared identifier is reported only once for each function it appears in
>> drivers/bluetooth/btmtk.c:114:14: error: 'HCI_DEVCOREDUMP_TIMEOUT' undeclared (first use in this function); did you mean 'HCI_DISCONN_TIMEOUT'?
     114 |         case HCI_DEVCOREDUMP_TIMEOUT:
         |              ^~~~~~~~~~~~~~~~~~~~~~~
         |              HCI_DISCONN_TIMEOUT
>> drivers/bluetooth/btmtk.c:115:14: error: 'HCI_DEVCOREDUMP_ABORT' undeclared (first use in this function)
     115 |         case HCI_DEVCOREDUMP_ABORT:
         |              ^~~~~~~~~~~~~~~~~~~~~
>> drivers/bluetooth/btmtk.c:116:14: error: 'HCI_DEVCOREDUMP_DONE' undeclared (first use in this function)
     116 |         case HCI_DEVCOREDUMP_DONE:
         |              ^~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btmtk.c: In function 'btmtk_register_coredump':
>> drivers/bluetooth/btmtk.c:376:9: error: implicit declaration of function 'hci_devcoredump_register' [-Werror=implicit-function-declaration]
     376 |         hci_devcoredump_register(hdev, btmtk_coredump, btmtk_coredump_hdr,
         |         ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btmtk.c: In function 'btmtk_process_coredump':
>> drivers/bluetooth/btmtk.c:393:23: error: implicit declaration of function 'hci_devcoredump_init' [-Werror=implicit-function-declaration]
     393 |                 err = hci_devcoredump_init(hdev, 1024000);
         |                       ^~~~~~~~~~~~~~~~~~~~
>> drivers/bluetooth/btmtk.c:397:44: error: 'struct hci_dev' has no member named 'dump'
     397 |                 schedule_delayed_work(&hdev->dump.dump_timeout,
         |                                            ^~
>> drivers/bluetooth/btmtk.c:402:23: error: implicit declaration of function 'hci_devcoredump_append' [-Werror=implicit-function-declaration]
     402 |                 err = hci_devcoredump_append(hdev, skb);
         |                       ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/bluetooth/btmtk.c:409:25: error: implicit declaration of function 'hci_devcoredump_complete' [-Werror=implicit-function-declaration]
     409 |                         hci_devcoredump_complete(hdev);
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +111 drivers/bluetooth/btmtk.c

   107	
   108	static void btmtk_coredump_notify(struct hci_dev *hdev, int state)
   109	{
   110		switch (state) {
 > 111		case HCI_DEVCOREDUMP_ACTIVE:
   112			coredump_info.state = BTMTK_COREDUMP_ACTIVE;
   113			break;
 > 114		case HCI_DEVCOREDUMP_TIMEOUT:
 > 115		case HCI_DEVCOREDUMP_ABORT:
 > 116		case HCI_DEVCOREDUMP_DONE:
   117			coredump_info.state = BTMTK_COREDUMP_INIT;
   118			btmtk_reset_sync(coredump_info.hdev);
   119			break;
   120		}
   121	}
   122
diff mbox series

Patch

diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
index 77df7b5c3ef3..2835ae28ae35 100644
--- a/drivers/bluetooth/btmtk.c
+++ b/drivers/bluetooth/btmtk.c
@@ -18,6 +18,14 @@ 
 #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_END		"coredump end"
+
+enum {
+	BTMTK_COREDUMP_INIT,
+	BTMTK_COREDUMP_DISABLED,
+	BTMTK_COREDUMP_ACTIVE,
+};
 
 struct btmtk_patch_header {
 	u8 datetime[16];
@@ -53,8 +61,65 @@  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 int btmtk_coredump_hdr(struct hci_dev *hdev, char *buf, size_t size)
+{
+	char *ptr = buf;
+	size_t rem = size;
+	size_t read = 0;
+
+	read = snprintf(ptr, rem, "Controller Name: 0x%X\n", coredump_info.dev_id);
+	rem -= read;
+	ptr += read;
+
+	read = snprintf(ptr, rem, "Firmware Version: 0x%X\n", coredump_info.fw_version);
+	rem -= read;
+	ptr += read;
+
+	read = snprintf(ptr, rem, "Driver: %s\n", coredump_info.driver_name);
+	rem -= read;
+	ptr += read;
+
+	read = snprintf(ptr, rem, "Vendor: MediaTek\n");
+	rem -= read;
+	ptr += read;
+
+	return size - rem;
+}
+
+static void btmtk_coredump_notify(struct hci_dev *hdev, int state)
+{
+	switch (state) {
+	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 +361,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_devcoredump_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_devcoredump_init(hdev, 1024000);
+		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_devcoredump_append(hdev, skb);
+		if (err < 0)
+			break;
+
+		if (skb->len > 12 &&
+		    !strncmp((char *)&skb->data[skb->len - 13],
+			     MTK_COREDUMP_END, 12))
+			hci_devcoredump_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 <sean.wang@mediatek.com>");
 MODULE_AUTHOR("Mark Chen <mark-yw.chen@mediatek.com>");
 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 d0130a5b91d6..52c0b6c1c508 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2835,6 +2835,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:
@@ -2989,6 +2990,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 */
@@ -2996,6 +2998,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 */