Message ID | ed1d0e9fe7758dac8a05dcff97c7dcb8e9b0be39.1687565769.git.objelf@gmail.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Johannes Berg |
Headers | show |
Series | [v7,1/3] Bluetooth: btusb: mediatek: use readx_poll_timeout instead of open coding | expand |
Hi, kernel test robot noticed the following build errors: [auto build test ERROR on bluetooth-next/master] [also build test ERROR on next-20230623] [cannot apply to bluetooth/master wireless/main wireless-next/main linus/master v6.4-rc7] [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-btmtk-introduce-btmtk-reset-work/20230624-100756 base: https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master patch link: https://lore.kernel.org/r/ed1d0e9fe7758dac8a05dcff97c7dcb8e9b0be39.1687565769.git.objelf%40gmail.com patch subject: [PATCH v7 3/3] Bluetooth: btusb: mediatek: add MediaTek devcoredump support config: x86_64-buildonly-randconfig-r002-20230622 (https://download.01.org/0day-ci/archive/20230624/202306241129.L50H0ubx-lkp@intel.com/config) compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project.git 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a) reproduce: (https://download.01.org/0day-ci/archive/20230624/202306241129.L50H0ubx-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202306241129.L50H0ubx-lkp@intel.com/ All errors (new ones prefixed by >>): >> drivers/bluetooth/btmtk.c:381:32: error: no member named 'dump' in 'struct hci_dev' schedule_delayed_work(&hdev->dump.dump_timeout, ~~~~ ^ 1 error generated. vim +381 drivers/bluetooth/btmtk.c 364 365 int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb) 366 { 367 struct btmediatek_data *data = hci_get_priv(hdev); 368 int err; 369 370 if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) 371 return 0; 372 373 switch (data->cd_info.state) { 374 case HCI_DEVCOREDUMP_IDLE: 375 err = hci_devcd_init(hdev, MTK_COREDUMP_SIZE); 376 if (err < 0) 377 break; 378 data->cd_info.cnt = 0; 379 380 /* It is supposed coredump can be done within 5 seconds */ > 381 schedule_delayed_work(&hdev->dump.dump_timeout, 382 msecs_to_jiffies(5000)); 383 fallthrough; 384 case HCI_DEVCOREDUMP_ACTIVE: 385 default: 386 err = hci_devcd_append(hdev, skb); 387 if (err < 0) 388 break; 389 data->cd_info.cnt++; 390 391 /* Mediatek coredump data would be more than MTK_COREDUMP_NUM */ 392 if (data->cd_info.cnt > MTK_COREDUMP_NUM && 393 skb->len > sizeof(MTK_COREDUMP_END) && 394 !memcmp((char *)&skb->data[skb->len - sizeof(MTK_COREDUMP_END)], 395 MTK_COREDUMP_END, sizeof(MTK_COREDUMP_END) - 1)) { 396 bt_dev_info(hdev, "Mediatek coredump end"); 397 hci_devcd_complete(hdev); 398 } 399 400 break; 401 } 402 403 if (err < 0) 404 kfree_skb(skb); 405 406 return err; 407 } 408 EXPORT_SYMBOL_GPL(btmtk_process_coredump); 409
Hi, kernel test robot noticed the following build errors: [auto build test ERROR on bluetooth-next/master] [also build test ERROR on next-20230623] [cannot apply to bluetooth/master wireless/main wireless-next/main linus/master v6.4-rc7] [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-btmtk-introduce-btmtk-reset-work/20230624-100756 base: https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master patch link: https://lore.kernel.org/r/ed1d0e9fe7758dac8a05dcff97c7dcb8e9b0be39.1687565769.git.objelf%40gmail.com patch subject: [PATCH v7 3/3] Bluetooth: btusb: mediatek: add MediaTek devcoredump support config: x86_64-randconfig-a002-20230621 (https://download.01.org/0day-ci/archive/20230624/202306241617.Dw81i6id-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce: (https://download.01.org/0day-ci/archive/20230624/202306241617.Dw81i6id-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202306241617.Dw81i6id-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/bluetooth/btmtk.c: In function 'btmtk_process_coredump': >> drivers/bluetooth/btmtk.c:381:44: error: 'struct hci_dev' has no member named 'dump' 381 | schedule_delayed_work(&hdev->dump.dump_timeout, | ^~ vim +381 drivers/bluetooth/btmtk.c 364 365 int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb) 366 { 367 struct btmediatek_data *data = hci_get_priv(hdev); 368 int err; 369 370 if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) 371 return 0; 372 373 switch (data->cd_info.state) { 374 case HCI_DEVCOREDUMP_IDLE: 375 err = hci_devcd_init(hdev, MTK_COREDUMP_SIZE); 376 if (err < 0) 377 break; 378 data->cd_info.cnt = 0; 379 380 /* It is supposed coredump can be done within 5 seconds */ > 381 schedule_delayed_work(&hdev->dump.dump_timeout, 382 msecs_to_jiffies(5000)); 383 fallthrough; 384 case HCI_DEVCOREDUMP_ACTIVE: 385 default: 386 err = hci_devcd_append(hdev, skb); 387 if (err < 0) 388 break; 389 data->cd_info.cnt++; 390 391 /* Mediatek coredump data would be more than MTK_COREDUMP_NUM */ 392 if (data->cd_info.cnt > MTK_COREDUMP_NUM && 393 skb->len > sizeof(MTK_COREDUMP_END) && 394 !memcmp((char *)&skb->data[skb->len - sizeof(MTK_COREDUMP_END)], 395 MTK_COREDUMP_END, sizeof(MTK_COREDUMP_END) - 1)) { 396 bt_dev_info(hdev, "Mediatek coredump end"); 397 hci_devcd_complete(hdev); 398 } 399 400 break; 401 } 402 403 if (err < 0) 404 kfree_skb(skb); 405 406 return err; 407 } 408 EXPORT_SYMBOL_GPL(btmtk_process_coredump); 409
diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c index b8678b75276e..8fe1b7e7255c 100644 --- a/drivers/bluetooth/btmtk.c +++ b/drivers/bluetooth/btmtk.c @@ -53,6 +53,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 btmediatek_data *data = hci_get_priv(hdev); + char buf[80]; + + snprintf(buf, sizeof(buf), "Controller Name: 0x%X\n", + data->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 btmediatek_data *data = hci_get_priv(hdev); + + switch (state) { + case HCI_DEVCOREDUMP_IDLE: + data->cd_info.state = HCI_DEVCOREDUMP_IDLE; + break; + case HCI_DEVCOREDUMP_ACTIVE: + data->cd_info.state = HCI_DEVCOREDUMP_ACTIVE; + break; + case HCI_DEVCOREDUMP_TIMEOUT: + case HCI_DEVCOREDUMP_ABORT: + case HCI_DEVCOREDUMP_DONE: + data->cd_info.state = HCI_DEVCOREDUMP_IDLE; + 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 +345,68 @@ void btmtk_reset_sync(struct hci_dev *hdev) } EXPORT_SYMBOL_GPL(btmtk_reset_sync); +int btmtk_register_coredump(struct hci_dev *hdev, const char *name, + u32 fw_version) +{ + struct btmediatek_data *data = hci_get_priv(hdev); + + if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) + return -EOPNOTSUPP; + + data->cd_info.fw_version = fw_version; + data->cd_info.state = HCI_DEVCOREDUMP_IDLE; + data->cd_info.driver_name = name; + + 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 btmediatek_data *data = hci_get_priv(hdev); + int err; + + if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) + return 0; + + switch (data->cd_info.state) { + case HCI_DEVCOREDUMP_IDLE: + err = hci_devcd_init(hdev, MTK_COREDUMP_SIZE); + if (err < 0) + break; + data->cd_info.cnt = 0; + + /* It is supposed coredump can be done within 5 seconds */ + schedule_delayed_work(&hdev->dump.dump_timeout, + msecs_to_jiffies(5000)); + fallthrough; + case HCI_DEVCOREDUMP_ACTIVE: + default: + err = hci_devcd_append(hdev, skb); + if (err < 0) + break; + data->cd_info.cnt++; + + /* Mediatek coredump data would be more than MTK_COREDUMP_NUM */ + if (data->cd_info.cnt > MTK_COREDUMP_NUM && + skb->len > sizeof(MTK_COREDUMP_END) && + !memcmp((char *)&skb->data[skb->len - sizeof(MTK_COREDUMP_END)], + MTK_COREDUMP_END, sizeof(MTK_COREDUMP_END) - 1)) { + bt_dev_info(hdev, "Mediatek coredump end"); + hci_devcd_complete(hdev); + } + + break; + } + + if (err < 0) + 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 75d8e71efcd3..68309dfe076a 100644 --- a/drivers/bluetooth/btmtk.h +++ b/drivers/bluetooth/btmtk.h @@ -22,6 +22,10 @@ #define MT7921_DLSTATUS 0x7c053c10 #define BT_DL_STATE BIT(1) +#define MTK_COREDUMP_SIZE (1024 * 1000) +#define MTK_COREDUMP_END "coredump end" +#define MTK_COREDUMP_NUM 255 + enum { BTMTK_WMT_PATCH_DWNLD = 0x1, BTMTK_WMT_TEST = 0x2, @@ -122,9 +126,17 @@ struct btmtk_hci_wmt_params { typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *); +struct btmtk_coredump_info { + const char *driver_name; + u32 fw_version; + u16 cnt; + int state; +}; + struct btmediatek_data { u32 dev_id; btmtk_reset_sync_func_t reset_sync; + struct btmtk_coredump_info cd_info; }; typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, @@ -141,6 +153,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, 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, @@ -164,4 +181,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, 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 4ebab61c288c..729445ef3871 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -3150,6 +3150,10 @@ static int btusb_mtk_setup(struct hci_dev *hdev) mediatek->dev_id = dev_id; mediatek->reset_sync = btusb_mtk_reset_work; + err = btmtk_register_coredump(hdev, btusb_driver.name, fw_version); + if (err < 0) + bt_dev_err(hdev, "Failed to register coredump (%d)", err); + switch (dev_id) { case 0x7663: fwname = FIRMWARE_MT7663; @@ -3310,6 +3314,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 */ @@ -3317,6 +3322,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 */