Message ID | 8130cc14237922f95e852fc14a6f90aed2f1117c.1664497281.git.objelf@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | [v2,1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding | expand |
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
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 --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 */