All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH 2/2] Bluetooth: btusb: Add Intel devcoredump support
@ 2022-03-26  5:47 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2022-03-26  5:47 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 16133 bytes --]

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220320183225.2.I61857ea92be43418b8ce16839f79a4704cc89fa6@changeid>
References: <20220320183225.2.I61857ea92be43418b8ce16839f79a4704cc89fa6@changeid>
TO: Manish Mandlik <mmandlik@google.com>
TO: marcel(a)holtmann.org
TO: luiz.dentz(a)gmail.com
CC: chromeos-bluetooth-upstreaming(a)chromium.org
CC: linux-bluetooth(a)vger.kernel.org
CC: "Abhishek Pandit-Subedi" <abhishekpandit@chromium.org>
CC: Manish Mandlik <mmandlik@google.com>
CC: Chethan Tumkur Narayan <chethan.tumkur.narayan@intel.com>
CC: Johan Hedberg <johan.hedberg@gmail.com>
CC: linux-kernel(a)vger.kernel.org

Hi Manish,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bluetooth/master]
[also build test WARNING on bluetooth-next/master v5.17 next-20220325]
[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]

url:    https://github.com/0day-ci/linux/commits/Manish-Mandlik/Bluetooth-Add-support-for-devcoredump/20220321-093553
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
:::::: branch date: 5 days ago
:::::: commit date: 5 days ago
config: i386-randconfig-c001 (https://download.01.org/0day-ci/archive/20220326/202203261345.wp9YyAkO-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 85e9b2687a13d1908aa86d1b89c5ce398a06cd39)
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/0day-ci/linux/commit/677f482cb7027ab030842015cfd6c188568df39f
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Manish-Mandlik/Bluetooth-Add-support-for-devcoredump/20220321-093553
        git checkout 677f482cb7027ab030842015cfd6c188568df39f
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=i386 clang-analyzer 

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


clang-analyzer warnings: (new ones prefixed by >>)
                                                      ^~~~
   drivers/bluetooth/btintel.c:636:2: note: '?' condition is false
           if (skb->data[0]) {
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                 ^
   drivers/bluetooth/btintel.c:636:2: note: '?' condition is false
           if (skb->data[0]) {
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                                       ^
   include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
           ^
   drivers/bluetooth/btintel.c:636:2: note: Taking false branch
           if (skb->data[0]) {
           ^
   include/linux/compiler.h:56:23: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                         ^
   drivers/bluetooth/btintel.c:643:2: note: Calling 'btintel_parse_version_tlv'
           btintel_parse_version_tlv(hdev, version, skb);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btintel.c:530:2: note: Loop condition is false. Execution continues on line 617
           while (skb->len) {
           ^
   drivers/bluetooth/btintel.c:617:2: note: Returning without writing to 'version->cnvi_bt'
           return 0;
           ^
   drivers/bluetooth/btintel.c:643:2: note: Returning from 'btintel_parse_version_tlv'
           btintel_parse_version_tlv(hdev, version, skb);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btintel.c:646:2: note: Returning without writing to 'version->cnvi_bt'
           return 0;
           ^
   drivers/bluetooth/btintel.c:2360:8: note: Returning from 'btintel_read_version_tlv'
           err = btintel_read_version_tlv(hdev, &new_ver);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btintel.c:2361:2: note: '?' condition is false
           if (err)
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                 ^
   drivers/bluetooth/btintel.c:2361:6: note: 'err' is 0
           if (err)
               ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                                                        ^~~~
   include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
            ^~~~
   drivers/bluetooth/btintel.c:2361:2: note: '?' condition is false
           if (err)
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                                       ^
   include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
           ^
   drivers/bluetooth/btintel.c:2361:2: note: Taking false branch
           if (err)
           ^
   include/linux/compiler.h:56:23: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                         ^
   drivers/bluetooth/btintel.c:2364:2: note: Calling 'btintel_version_info_tlv'
           btintel_version_info_tlv(hdev, &new_ver);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btintel.c:444:6: note: The left operand of '&' is a garbage value
           if (INTEL_HW_PLATFORM(version->cnvi_bt) != 0x37) {
               ^
   drivers/bluetooth/btintel.h:146:53: note: expanded from macro 'INTEL_HW_PLATFORM'
   #define INTEL_HW_PLATFORM(cnvx_bt)      ((u8)(((cnvx_bt) & 0x0000ff00) >> 8))
                                                   ~~~~~~~  ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                      ^~~~
>> drivers/bluetooth/btintel.c:1425:2: warning: Value stored to 'ptr' is never read [clang-analyzer-deadcode.DeadStores]
           ptr += read;
           ^      ~~~~
   drivers/bluetooth/btintel.c:1425:2: note: Value stored to 'ptr' is never read
           ptr += read;
           ^      ~~~~
   Suppressed 1 warnings (1 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   1 warning generated.
   sound/synth/util_mem.c:50:3: warning: Use of memory after it is freed [clang-analyzer-unix.Malloc]
                   list_del(p);
                   ^        ~
   sound/synth/util_mem.c:46:6: note: Assuming 'hdr' is non-null
           if (!hdr)
               ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                      ^~~~
   sound/synth/util_mem.c:46:2: note: '?' condition is false
           if (!hdr)
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                 ^
   sound/synth/util_mem.c:46:7: note: 'hdr' is non-null
           if (!hdr)
                ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                                                        ^~~~
   include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
            ^~~~
   sound/synth/util_mem.c:46:7: note: 'hdr' is non-null
           if (!hdr)
                ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                                                        ^~~~
   include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
            ^~~~
   sound/synth/util_mem.c:46:2: note: '?' condition is false
           if (!hdr)
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
                                                                       ^
   include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
           ^
   sound/synth/util_mem.c:46:2: note: Taking false branch
           if (!hdr)
           ^
   include/linux/compiler.h:56:23: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                         ^
   sound/synth/util_mem.c:49:2: note: Loop condition is true.  Entering loop body
           while ((p = hdr->block.next) != &hdr->block) {
           ^
   sound/synth/util_mem.c:51:3: note: Memory is released
                   kfree(get_memblk(p));
                   ^~~~~~~~~~~~~~~~~~~~
   sound/synth/util_mem.c:49:2: note: Loop condition is true.  Entering loop body
           while ((p = hdr->block.next) != &hdr->block) {
           ^
   sound/synth/util_mem.c:50:3: note: Use of memory after it is freed
                   list_del(p);
                   ^        ~
   1 warning generated.
   Suppressed 1 warnings (1 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   11 warnings generated.
   net/ipv6/route.c:567:6: warning: Access to field 'nh' results in a dereference of a null pointer (loaded from variable 'f6i') [clang-analyzer-core.NullDereference]
           if (unlikely(f6i->nh)) {
               ^
   include/linux/compiler.h:48:24: note: expanded from macro 'unlikely'
   #  define unlikely(x)   (__branch_check__(x, 0, __builtin_constant_p(x)))
                            ^                ~
   include/linux/compiler.h:33:33: note: expanded from macro '__branch_check__'
                           ______r = __builtin_expect(!!(x), expect);      \
                                                        ^~
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'

vim +/ptr +1425 drivers/bluetooth/btintel.c

927ac8da35db763 Joseph Hwang           2021-08-15  1404  
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1405  static int btintel_dmp_hdr(struct hci_dev *hdev, char *buf, size_t size)
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1406  {
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1407  	char *ptr = buf;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1408  	size_t rem = size;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1409  	size_t read = 0;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1410  
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1411  	read = snprintf(ptr, rem, "Controller Name: 0x%X\n", hw_variant);
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1412  	rem -= read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1413  	ptr += read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1414  
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1415  	read = snprintf(ptr, rem, "Firmware Version: 0x%X\n", fw_build_num);
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1416  	rem -= read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1417  	ptr += read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1418  
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1419  	read = snprintf(ptr, rem, "Driver: %s\n", driver_name);
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1420  	rem -= read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1421  	ptr += read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1422  
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1423  	read = snprintf(ptr, rem, "Vendor: Intel\n");
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1424  	rem -= read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20 @1425  	ptr += read;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1426  
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1427  	return size - rem;
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1428  }
677f482cb7027ab Abhishek Pandit-Subedi 2022-03-20  1429  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 2/2] Bluetooth: btusb: Add Intel devcoredump support
  2022-03-21  1:34 ` [PATCH 2/2] Bluetooth: btusb: Add Intel devcoredump support Manish Mandlik
@ 2022-03-21  7:38   ` kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2022-03-21  7:38 UTC (permalink / raw)
  To: Manish Mandlik, marcel, luiz.dentz
  Cc: kbuild-all, chromeos-bluetooth-upstreaming, linux-bluetooth,
	Abhishek Pandit-Subedi, Manish Mandlik, Chethan Tumkur Narayan,
	Johan Hedberg, linux-kernel

Hi Manish,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bluetooth/master]
[also build test WARNING on bluetooth-next/master v5.17 next-20220318]
[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]

url:    https://github.com/0day-ci/linux/commits/Manish-Mandlik/Bluetooth-Add-support-for-devcoredump/20220321-093553
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
config: parisc-randconfig-r023-20220320 (https://download.01.org/0day-ci/archive/20220321/202203211500.z1bvoo6A-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 11.2.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/0day-ci/linux/commit/677f482cb7027ab030842015cfd6c188568df39f
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Manish-Mandlik/Bluetooth-Add-support-for-devcoredump/20220321-093553
        git checkout 677f482cb7027ab030842015cfd6c188568df39f
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=parisc SHELL=/bin/bash drivers/bluetooth/

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

All warnings (new ones prefixed by >>):

   drivers/bluetooth/btintel.c: In function 'btintel_register_devcoredump_support':
>> drivers/bluetooth/btintel.c:1447:9: warning: 'strncpy' specified bound 16 equals destination size [-Wstringop-truncation]
    1447 |         strncpy(driver_name, driver, DRIVER_NAME_LEN);
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


vim +/strncpy +1447 drivers/bluetooth/btintel.c

  1429	
  1430	int btintel_register_devcoredump_support(struct hci_dev *hdev,
  1431						 const char *driver)
  1432	{
  1433		struct intel_debug_features features;
  1434		int err;
  1435	
  1436		err = btintel_read_debug_features(hdev, &features);
  1437		if (err) {
  1438			bt_dev_info(hdev, "Error reading debug features");
  1439			return err;
  1440		}
  1441	
  1442		if (!(features.page1[0] & 0x3f)) {
  1443			bt_dev_info(hdev, "Telemetry exception format not supported");
  1444			return -EOPNOTSUPP;
  1445		}
  1446	
> 1447		strncpy(driver_name, driver, DRIVER_NAME_LEN);
  1448		hci_devcoredump_register(hdev, btintel_dmp_hdr, NULL);
  1449	
  1450		return err;
  1451	}
  1452	EXPORT_SYMBOL_GPL(btintel_register_devcoredump_support);
  1453	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 2/2] Bluetooth: btusb: Add Intel devcoredump support
  2022-03-21  1:34 [PATCH 1/2] Bluetooth: Add support for devcoredump Manish Mandlik
@ 2022-03-21  1:34 ` Manish Mandlik
  2022-03-21  7:38   ` kernel test robot
  0 siblings, 1 reply; 3+ messages in thread
From: Manish Mandlik @ 2022-03-21  1:34 UTC (permalink / raw)
  To: marcel, luiz.dentz
  Cc: chromeos-bluetooth-upstreaming, linux-bluetooth,
	Abhishek Pandit-Subedi, Manish Mandlik, Chethan Tumkur Narayan,
	Johan Hedberg, linux-kernel

From: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>

Intercept debug exception events from the controller and put them into
a devcoredump using hci devcoredump APIs. The debug exception contains
data in a TLV format and it will be parsed in userspace.

Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Signed-off-by: Manish Mandlik <mmandlik@google.com>
Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Reviewed-by: Chethan Tumkur Narayan <chethan.tumkur.narayan@intel.com>
---

 drivers/bluetooth/btintel.c | 60 +++++++++++++++++++++++++++++++++++++
 drivers/bluetooth/btintel.h | 14 +++++++++
 drivers/bluetooth/btusb.c   | 47 +++++++++++++++++++++++++----
 3 files changed, 115 insertions(+), 6 deletions(-)

diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
index 06514ed66022..9ac7a4441b38 100644
--- a/drivers/bluetooth/btintel.c
+++ b/drivers/bluetooth/btintel.c
@@ -32,6 +32,11 @@ struct cmd_write_boot_params {
 	u8  fw_build_yy;
 } __packed;
 
+#define DRIVER_NAME_LEN		16
+static char driver_name[DRIVER_NAME_LEN];
+static u8 hw_variant;
+static u32 fw_build_num;
+
 int btintel_check_bdaddr(struct hci_dev *hdev)
 {
 	struct hci_rp_read_bd_addr *bda;
@@ -304,6 +309,9 @@ int btintel_version_info(struct hci_dev *hdev, struct intel_version *ver)
 		return -EINVAL;
 	}
 
+	hw_variant = ver->hw_variant;
+	fw_build_num = ver->fw_build_num;
+
 	bt_dev_info(hdev, "%s revision %u.%u build %u week %u %u",
 		    variant, ver->fw_revision >> 4, ver->fw_revision & 0x0f,
 		    ver->fw_build_num, ver->fw_build_ww,
@@ -497,6 +505,9 @@ static int btintel_version_info_tlv(struct hci_dev *hdev,
 		return -EINVAL;
 	}
 
+	hw_variant = INTEL_HW_VARIANT(version->cnvi_bt);
+	fw_build_num = version->build_num;
+
 	bt_dev_info(hdev, "%s timestamp %u.%u buildtype %u build %u", variant,
 		    2000 + (version->timestamp >> 8), version->timestamp & 0xff,
 		    version->build_type, version->build_num);
@@ -1391,6 +1402,55 @@ int btintel_set_quality_report(struct hci_dev *hdev, bool enable)
 }
 EXPORT_SYMBOL_GPL(btintel_set_quality_report);
 
+static int btintel_dmp_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", hw_variant);
+	rem -= read;
+	ptr += read;
+
+	read = snprintf(ptr, rem, "Firmware Version: 0x%X\n", fw_build_num);
+	rem -= read;
+	ptr += read;
+
+	read = snprintf(ptr, rem, "Driver: %s\n", driver_name);
+	rem -= read;
+	ptr += read;
+
+	read = snprintf(ptr, rem, "Vendor: Intel\n");
+	rem -= read;
+	ptr += read;
+
+	return size - rem;
+}
+
+int btintel_register_devcoredump_support(struct hci_dev *hdev,
+					 const char *driver)
+{
+	struct intel_debug_features features;
+	int err;
+
+	err = btintel_read_debug_features(hdev, &features);
+	if (err) {
+		bt_dev_info(hdev, "Error reading debug features");
+		return err;
+	}
+
+	if (!(features.page1[0] & 0x3f)) {
+		bt_dev_info(hdev, "Telemetry exception format not supported");
+		return -EOPNOTSUPP;
+	}
+
+	strncpy(driver_name, driver, DRIVER_NAME_LEN);
+	hci_devcoredump_register(hdev, btintel_dmp_hdr, NULL);
+
+	return err;
+}
+EXPORT_SYMBOL_GPL(btintel_register_devcoredump_support);
+
 static const struct firmware *btintel_legacy_rom_get_fw(struct hci_dev *hdev,
 					       struct intel_version *ver)
 {
diff --git a/drivers/bluetooth/btintel.h b/drivers/bluetooth/btintel.h
index e0060e58573c..785c63cc6c1d 100644
--- a/drivers/bluetooth/btintel.h
+++ b/drivers/bluetooth/btintel.h
@@ -137,6 +137,12 @@ struct intel_offload_use_cases {
 	__u8	preset[8];
 } __packed;
 
+#define INTEL_TLV_TYPE_ID		0x1
+
+#define INTEL_TLV_SYSTEM_EXCEPTION	0x0
+#define INTEL_TLV_FATAL_EXCEPTION	0x1
+#define INTEL_TLV_DEBUG_EXCEPTION	0x2
+
 #define INTEL_HW_PLATFORM(cnvx_bt)	((u8)(((cnvx_bt) & 0x0000ff00) >> 8))
 #define INTEL_HW_VARIANT(cnvx_bt)	((u8)(((cnvx_bt) & 0x003f0000) >> 16))
 #define INTEL_CNVX_TOP_TYPE(cnvx_top)	((cnvx_top) & 0x00000fff)
@@ -206,6 +212,8 @@ int btintel_read_boot_params(struct hci_dev *hdev,
 			     struct intel_boot_params *params);
 int btintel_download_firmware(struct hci_dev *dev, struct intel_version *ver,
 			      const struct firmware *fw, u32 *boot_param);
+int btintel_register_devcoredump_support(struct hci_dev *hdev,
+					 const char *driver);
 int btintel_configure_setup(struct hci_dev *hdev);
 void btintel_bootup(struct hci_dev *hdev, const void *ptr, unsigned int len);
 void btintel_secure_send_result(struct hci_dev *hdev,
@@ -302,6 +310,12 @@ static inline void btintel_secure_send_result(struct hci_dev *hdev,
 {
 }
 
+static int btintel_register_devcoredump_support(struct hci_dev *hdev,
+						const char *driver)
+{
+	return -EOPNOTSUPP;
+}
+
 static inline int btintel_set_quality_report(struct hci_dev *hdev, bool enable)
 {
 	return -ENODEV;
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 50df417207af..42a3d90180a4 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2155,16 +2155,42 @@ static int btusb_recv_bulk_intel(struct btusb_data *data, void *buffer,
 	return btusb_recv_bulk(data, buffer, count);
 }
 
+static int btusb_intel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb)
+{
+	struct intel_tlv *tlv = (void *)&skb->data[5];
+
+	/* The first event is always an event type TLV */
+	if (tlv->type != INTEL_TLV_TYPE_ID)
+		goto recv_frame;
+
+	switch (tlv->val[0]) {
+	case INTEL_TLV_SYSTEM_EXCEPTION:
+	case INTEL_TLV_FATAL_EXCEPTION:
+	case INTEL_TLV_DEBUG_EXCEPTION:
+		/* Generate devcoredump from exception */
+		if (!hci_devcoredump_init(hdev, skb->len)) {
+			hci_devcoredump_append(hdev, skb);
+			hci_devcoredump_complete(hdev);
+			return 0;
+		}
+		break;
+	}
+
+recv_frame:
+	return hci_recv_frame(hdev, skb);
+}
+
 static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
 {
-	if (btintel_test_flag(hdev, INTEL_BOOTLOADER)) {
-		struct hci_event_hdr *hdr = (void *)skb->data;
+	struct hci_event_hdr *hdr = (void *)skb->data;
+	const char diagnostics_hdr[] = { 0x87, 0x80, 0x03 };
 
-		if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
-		    hdr->plen > 0) {
-			const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
-			unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
+	if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
+	    hdr->plen > 0) {
+		const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
+		unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
 
+		if (btintel_test_flag(hdev, INTEL_BOOTLOADER)) {
 			switch (skb->data[2]) {
 			case 0x02:
 				/* When switching to the operational firmware
@@ -2183,6 +2209,15 @@ static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
 				break;
 			}
 		}
+
+		/* Handle all diagnostics events separately. May still call
+		 * hci_recv_frame.
+		 */
+		if (len >= sizeof(diagnostics_hdr) &&
+		    memcmp(&skb->data[2], diagnostics_hdr,
+			   sizeof(diagnostics_hdr)) == 0) {
+			return btusb_intel_diagnostics(hdev, skb);
+		}
 	}
 
 	return hci_recv_frame(hdev, skb);
-- 
2.35.1.894.gb6a874cedc-goog


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-03-26  5:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-26  5:47 [PATCH 2/2] Bluetooth: btusb: Add Intel devcoredump support kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2022-03-21  1:34 [PATCH 1/2] Bluetooth: Add support for devcoredump Manish Mandlik
2022-03-21  1:34 ` [PATCH 2/2] Bluetooth: btusb: Add Intel devcoredump support Manish Mandlik
2022-03-21  7:38   ` kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.