Skip to content

Commit a7ba218

Browse files
kirankrishnappa-intelVudentz
authored andcommitted
Bluetooth: btintel: Print Firmware Sequencer information
Firmware sequencer (FSEQ) is a common code shared across Bluetooth and Wifi. Printing FSEQ will help to debug if there is any mismatch between Bluetooth and Wifi FSEQ. Signed-off-by: Kiran K <[email protected]> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent f7cbce6 commit a7ba218

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed

drivers/bluetooth/btintel.c

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2670,6 +2670,119 @@ static void btintel_set_msft_opcode(struct hci_dev *hdev, u8 hw_variant)
26702670
}
26712671
}
26722672

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+
26732786
static int btintel_setup_combined(struct hci_dev *hdev)
26742787
{
26752788
const u8 param[1] = { 0xFF };
@@ -2902,6 +3015,7 @@ static int btintel_setup_combined(struct hci_dev *hdev)
29023015

29033016
err = btintel_bootloader_setup_tlv(hdev, &ver_tlv);
29043017
btintel_register_devcoredump_support(hdev);
3018+
btintel_print_fseq_info(hdev);
29053019
break;
29063020
default:
29073021
bt_dev_err(hdev, "Unsupported Intel hw variant (%u)",

0 commit comments

Comments
 (0)