diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index ca923bf0a5be..03810f73d9bd 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -25,6 +25,8 @@ #define CNSS_RDDM_TIMEOUT_MS 20000 #define RECOVERY_TIMEOUT 60000 #define TIME_CLOCK_FREQ_HZ 19200000 +#define CNSS_RAMDUMP_MAGIC 0x574C414E +#define CNSS_RAMDUMP_VERSION 0 #define CNSS_EVENT_SYNC BIT(0) #define CNSS_EVENT_UNINTERRUPTIBLE BIT(1) @@ -173,6 +175,21 @@ enum cnss_fw_dump_type { CNSS_FW_IMAGE, CNSS_FW_RDDM, CNSS_FW_REMOTE_HEAP, + CNSS_FW_DUMP_TYPE_MAX, +}; + +struct cnss_dump_entry { + u32 type; + u32 entry_start; + u32 entry_num; +}; + +struct cnss_dump_meta_info { + u32 magic; + u32 version; + u32 chipset; + u32 total_entries; + struct cnss_dump_entry entry[CNSS_FW_DUMP_TYPE_MAX]; }; enum cnss_driver_event_type { diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 0fcadd6ec4b7..ee83e81a816d 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -1888,20 +1888,33 @@ static int cnss_qca6290_ramdump(struct cnss_pci_data *pci_priv) struct cnss_dump_data *dump_data = &info_v2->dump_data; struct cnss_dump_seg *dump_seg = info_v2->dump_data_vaddr; struct ramdump_segment *ramdump_segs, *s; + struct cnss_dump_meta_info meta_info = {0}; int i, ret = 0; if (!info_v2->dump_data_valid || dump_data->nentries == 0) return 0; - ramdump_segs = kcalloc(dump_data->nentries, + ramdump_segs = kcalloc(dump_data->nentries + 1, sizeof(*ramdump_segs), GFP_KERNEL); if (!ramdump_segs) return -ENOMEM; - s = ramdump_segs; + s = ramdump_segs + 1; for (i = 0; i < dump_data->nentries; i++) { + if (dump_seg->type >= CNSS_FW_DUMP_TYPE_MAX) { + cnss_pr_err("Unsupported dump type: %d", + dump_seg->type); + continue; + } + + if (meta_info.entry[dump_seg->type].entry_start == 0) { + meta_info.entry[dump_seg->type].type = dump_seg->type; + meta_info.entry[dump_seg->type].entry_start = i + 1; + } + meta_info.entry[dump_seg->type].entry_num++; + s->address = dump_seg->address; s->v_address = dump_seg->v_address; s->size = dump_seg->size; @@ -1909,8 +1922,16 @@ static int cnss_qca6290_ramdump(struct cnss_pci_data *pci_priv) dump_seg++; } + meta_info.magic = CNSS_RAMDUMP_MAGIC; + meta_info.version = CNSS_RAMDUMP_VERSION; + meta_info.chipset = pci_priv->device_id; + meta_info.total_entries = CNSS_FW_DUMP_TYPE_MAX; + + ramdump_segs->v_address = &meta_info; + ramdump_segs->size = sizeof(meta_info); + ret = do_elf_ramdump(info_v2->ramdump_dev, ramdump_segs, - dump_data->nentries); + dump_data->nentries + 1); kfree(ramdump_segs); cnss_pci_clear_dump_info(pci_priv);