@@ -2670,6 +2670,119 @@ static void btintel_set_msft_opcode(struct hci_dev *hdev, u8 hw_variant)
2670
2670
}
2671
2671
}
2672
2672
2673
+ static void btintel_print_fseq_info (struct hci_dev * hdev )
2674
+ {
2675
+ struct sk_buff * skb ;
2676
+ u8 * p ;
2677
+ u32 val ;
2678
+ const char * str ;
2679
+
2680
+ skb = __hci_cmd_sync (hdev , 0xfcb3 , 0 , NULL , HCI_CMD_TIMEOUT );
2681
+ if (IS_ERR (skb )) {
2682
+ bt_dev_dbg (hdev , "Reading fseq status command failed (%ld)" ,
2683
+ PTR_ERR (skb ));
2684
+ return ;
2685
+ }
2686
+
2687
+ if (skb -> len < (sizeof (u32 ) * 16 + 2 )) {
2688
+ bt_dev_dbg (hdev , "Malformed packet of length %u received" ,
2689
+ skb -> len );
2690
+ kfree_skb (skb );
2691
+ return ;
2692
+ }
2693
+
2694
+ p = skb_pull_data (skb , 1 );
2695
+ if (* p ) {
2696
+ bt_dev_dbg (hdev , "Failed to get fseq status (0x%2.2x)" , * p );
2697
+ kfree_skb (skb );
2698
+ return ;
2699
+ }
2700
+
2701
+ p = skb_pull_data (skb , 1 );
2702
+ switch (* p ) {
2703
+ case 0 :
2704
+ str = "Success" ;
2705
+ break ;
2706
+ case 1 :
2707
+ str = "Fatal error" ;
2708
+ break ;
2709
+ case 2 :
2710
+ str = "Semaphore acquire error" ;
2711
+ break ;
2712
+ default :
2713
+ str = "Unknown error" ;
2714
+ break ;
2715
+ }
2716
+
2717
+ if (* p ) {
2718
+ bt_dev_err (hdev , "Fseq status: %s (0x%2.2x)" , str , * p );
2719
+ kfree_skb (skb );
2720
+ return ;
2721
+ }
2722
+
2723
+ bt_dev_info (hdev , "Fseq status: %s (0x%2.2x)" , str , * p );
2724
+
2725
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2726
+ bt_dev_dbg (hdev , "Reason: 0x%8.8x" , val );
2727
+
2728
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2729
+ bt_dev_dbg (hdev , "Global version: 0x%8.8x" , val );
2730
+
2731
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2732
+ bt_dev_dbg (hdev , "Installed version: 0x%8.8x" , val );
2733
+
2734
+ p = skb -> data ;
2735
+ skb_pull_data (skb , 4 );
2736
+ bt_dev_info (hdev , "Fseq executed: %2.2u.%2.2u.%2.2u.%2.2u" , p [0 ], p [1 ],
2737
+ p [2 ], p [3 ]);
2738
+
2739
+ p = skb -> data ;
2740
+ skb_pull_data (skb , 4 );
2741
+ bt_dev_info (hdev , "Fseq BT Top: %2.2u.%2.2u.%2.2u.%2.2u" , p [0 ], p [1 ],
2742
+ p [2 ], p [3 ]);
2743
+
2744
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2745
+ bt_dev_dbg (hdev , "Fseq Top init version: 0x%8.8x" , val );
2746
+
2747
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2748
+ bt_dev_dbg (hdev , "Fseq Cnvio init version: 0x%8.8x" , val );
2749
+
2750
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2751
+ bt_dev_dbg (hdev , "Fseq MBX Wifi file version: 0x%8.8x" , val );
2752
+
2753
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2754
+ bt_dev_dbg (hdev , "Fseq BT version: 0x%8.8x" , val );
2755
+
2756
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2757
+ bt_dev_dbg (hdev , "Fseq Top reset address: 0x%8.8x" , val );
2758
+
2759
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2760
+ bt_dev_dbg (hdev , "Fseq MBX timeout: 0x%8.8x" , val );
2761
+
2762
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2763
+ bt_dev_dbg (hdev , "Fseq MBX ack: 0x%8.8x" , val );
2764
+
2765
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2766
+ bt_dev_dbg (hdev , "Fseq CNVi id: 0x%8.8x" , val );
2767
+
2768
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2769
+ bt_dev_dbg (hdev , "Fseq CNVr id: 0x%8.8x" , val );
2770
+
2771
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2772
+ bt_dev_dbg (hdev , "Fseq Error handle: 0x%8.8x" , val );
2773
+
2774
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2775
+ bt_dev_dbg (hdev , "Fseq Magic noalive indication: 0x%8.8x" , val );
2776
+
2777
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2778
+ bt_dev_dbg (hdev , "Fseq OTP version: 0x%8.8x" , val );
2779
+
2780
+ val = get_unaligned_le32 (skb_pull_data (skb , 4 ));
2781
+ bt_dev_dbg (hdev , "Fseq MBX otp version: 0x%8.8x" , val );
2782
+
2783
+ kfree_skb (skb );
2784
+ }
2785
+
2673
2786
static int btintel_setup_combined (struct hci_dev * hdev )
2674
2787
{
2675
2788
const u8 param [1 ] = { 0xFF };
@@ -2902,6 +3015,7 @@ static int btintel_setup_combined(struct hci_dev *hdev)
2902
3015
2903
3016
err = btintel_bootloader_setup_tlv (hdev , & ver_tlv );
2904
3017
btintel_register_devcoredump_support (hdev );
3018
+ btintel_print_fseq_info (hdev );
2905
3019
break ;
2906
3020
default :
2907
3021
bt_dev_err (hdev , "Unsupported Intel hw variant (%u)" ,
0 commit comments