@@ -43,6 +43,12 @@ struct cmd_write_boot_params {
43
43
u8 fw_build_yy ;
44
44
} __packed ;
45
45
46
+ static struct {
47
+ const char * driver_name ;
48
+ u8 hw_variant ;
49
+ u32 fw_build_num ;
50
+ } coredump_info ;
51
+
46
52
int btintel_check_bdaddr (struct hci_dev * hdev )
47
53
{
48
54
struct hci_rp_read_bd_addr * bda ;
@@ -315,6 +321,9 @@ int btintel_version_info(struct hci_dev *hdev, struct intel_version *ver)
315
321
return - EINVAL ;
316
322
}
317
323
324
+ coredump_info .hw_variant = ver -> hw_variant ;
325
+ coredump_info .fw_build_num = ver -> fw_build_num ;
326
+
318
327
bt_dev_info (hdev , "%s revision %u.%u build %u week %u %u" ,
319
328
variant , ver -> fw_revision >> 4 , ver -> fw_revision & 0x0f ,
320
329
ver -> fw_build_num , ver -> fw_build_ww ,
@@ -509,6 +518,9 @@ static int btintel_version_info_tlv(struct hci_dev *hdev,
509
518
return - EINVAL ;
510
519
}
511
520
521
+ coredump_info .hw_variant = INTEL_HW_VARIANT (version -> cnvi_bt );
522
+ coredump_info .fw_build_num = version -> build_num ;
523
+
512
524
bt_dev_info (hdev , "%s timestamp %u.%u buildtype %u build %u" , variant ,
513
525
2000 + (version -> timestamp >> 8 ), version -> timestamp & 0xff ,
514
526
version -> build_type , version -> build_num );
@@ -1462,6 +1474,59 @@ int btintel_set_quality_report(struct hci_dev *hdev, bool enable)
1462
1474
}
1463
1475
EXPORT_SYMBOL_GPL (btintel_set_quality_report );
1464
1476
1477
+ static void btintel_coredump (struct hci_dev * hdev )
1478
+ {
1479
+ struct sk_buff * skb ;
1480
+
1481
+ skb = __hci_cmd_sync (hdev , 0xfc4e , 0 , NULL , HCI_CMD_TIMEOUT );
1482
+ if (IS_ERR (skb )) {
1483
+ bt_dev_err (hdev , "Coredump failed (%ld)" , PTR_ERR (skb ));
1484
+ return ;
1485
+ }
1486
+
1487
+ kfree_skb (skb );
1488
+ }
1489
+
1490
+ static void btintel_dmp_hdr (struct hci_dev * hdev , struct sk_buff * skb )
1491
+ {
1492
+ char buf [80 ];
1493
+
1494
+ snprintf (buf , sizeof (buf ), "Controller Name: 0x%X\n" ,
1495
+ coredump_info .hw_variant );
1496
+ skb_put_data (skb , buf , strlen (buf ));
1497
+
1498
+ snprintf (buf , sizeof (buf ), "Firmware Version: 0x%X\n" ,
1499
+ coredump_info .fw_build_num );
1500
+ skb_put_data (skb , buf , strlen (buf ));
1501
+
1502
+ snprintf (buf , sizeof (buf ), "Driver: %s\n" , coredump_info .driver_name );
1503
+ skb_put_data (skb , buf , strlen (buf ));
1504
+
1505
+ snprintf (buf , sizeof (buf ), "Vendor: Intel\n" );
1506
+ skb_put_data (skb , buf , strlen (buf ));
1507
+ }
1508
+
1509
+ static int btintel_register_devcoredump_support (struct hci_dev * hdev )
1510
+ {
1511
+ struct intel_debug_features features ;
1512
+ int err ;
1513
+
1514
+ err = btintel_read_debug_features (hdev , & features );
1515
+ if (err ) {
1516
+ bt_dev_info (hdev , "Error reading debug features" );
1517
+ return err ;
1518
+ }
1519
+
1520
+ if (!(features .page1 [0 ] & 0x3f )) {
1521
+ bt_dev_dbg (hdev , "Telemetry exception format not supported" );
1522
+ return - EOPNOTSUPP ;
1523
+ }
1524
+
1525
+ hci_devcd_register (hdev , btintel_coredump , btintel_dmp_hdr , NULL );
1526
+
1527
+ return err ;
1528
+ }
1529
+
1465
1530
static const struct firmware * btintel_legacy_rom_get_fw (struct hci_dev * hdev ,
1466
1531
struct intel_version * ver )
1467
1532
{
@@ -2597,6 +2662,7 @@ static int btintel_setup_combined(struct hci_dev *hdev)
2597
2662
btintel_set_msft_opcode (hdev , ver .hw_variant );
2598
2663
2599
2664
err = btintel_bootloader_setup (hdev , & ver );
2665
+ btintel_register_devcoredump_support (hdev );
2600
2666
break ;
2601
2667
default :
2602
2668
bt_dev_err (hdev , "Unsupported Intel hw variant (%u)" ,
@@ -2670,6 +2736,7 @@ static int btintel_setup_combined(struct hci_dev *hdev)
2670
2736
btintel_set_msft_opcode (hdev , ver .hw_variant );
2671
2737
2672
2738
err = btintel_bootloader_setup (hdev , & ver );
2739
+ btintel_register_devcoredump_support (hdev );
2673
2740
break ;
2674
2741
case 0x17 :
2675
2742
case 0x18 :
@@ -2692,6 +2759,7 @@ static int btintel_setup_combined(struct hci_dev *hdev)
2692
2759
INTEL_HW_VARIANT (ver_tlv .cnvi_bt ));
2693
2760
2694
2761
err = btintel_bootloader_setup_tlv (hdev , & ver_tlv );
2762
+ btintel_register_devcoredump_support (hdev );
2695
2763
break ;
2696
2764
default :
2697
2765
bt_dev_err (hdev , "Unsupported Intel hw variant (%u)" ,
@@ -2741,7 +2809,7 @@ static int btintel_shutdown_combined(struct hci_dev *hdev)
2741
2809
return 0 ;
2742
2810
}
2743
2811
2744
- int btintel_configure_setup (struct hci_dev * hdev )
2812
+ int btintel_configure_setup (struct hci_dev * hdev , const char * driver_name )
2745
2813
{
2746
2814
hdev -> manufacturer = 2 ;
2747
2815
hdev -> setup = btintel_setup_combined ;
@@ -2750,6 +2818,8 @@ int btintel_configure_setup(struct hci_dev *hdev)
2750
2818
hdev -> set_diag = btintel_set_diag_combined ;
2751
2819
hdev -> set_bdaddr = btintel_set_bdaddr ;
2752
2820
2821
+ coredump_info .driver_name = driver_name ;
2822
+
2753
2823
return 0 ;
2754
2824
}
2755
2825
EXPORT_SYMBOL_GPL (btintel_configure_setup );
0 commit comments