Loading drivers/net/wireless/cnss2/main.c +41 −0 Original line number Diff line number Diff line Loading @@ -1868,6 +1868,47 @@ int cnss_minidump_add_region(struct cnss_plat_data *plat_priv, return ret; } int cnss_minidump_remove_region(struct cnss_plat_data *plat_priv, enum cnss_fw_dump_type type, int seg_no, void *va, phys_addr_t pa, size_t size) { struct md_region md_entry; int ret; switch (type) { case CNSS_FW_IMAGE: snprintf(md_entry.name, sizeof(md_entry.name), "FBC_%X", seg_no); break; case CNSS_FW_RDDM: snprintf(md_entry.name, sizeof(md_entry.name), "RDDM_%X", seg_no); break; case CNSS_FW_REMOTE_HEAP: snprintf(md_entry.name, sizeof(md_entry.name), "RHEAP_%X", seg_no); break; default: cnss_pr_err("Unknown dump type ID: %d\n", type); return -EINVAL; } md_entry.phys_addr = pa; md_entry.virt_addr = (uintptr_t)va; md_entry.size = size; md_entry.id = MSM_DUMP_DATA_CNSS_WLAN; cnss_pr_dbg("Remove mini dump region: %s, va: %pK, pa: %pa, size: 0x%zx\n", md_entry.name, va, &pa, size); ret = msm_minidump_remove_region(&md_entry); if (ret) cnss_pr_err("Failed to remove mini dump region, err = %d\n", ret); return ret; } static int cnss_register_bus_scale(struct cnss_plat_data *plat_priv) { int ret = 0; Loading drivers/net/wireless/cnss2/main.h +3 −0 Original line number Diff line number Diff line Loading @@ -412,5 +412,8 @@ int cnss_va_to_pa(struct device *dev, size_t size, void *va, dma_addr_t dma, int cnss_minidump_add_region(struct cnss_plat_data *plat_priv, enum cnss_fw_dump_type type, int seg_no, void *va, phys_addr_t pa, size_t size); int cnss_minidump_remove_region(struct cnss_plat_data *plat_priv, enum cnss_fw_dump_type type, int seg_no, void *va, phys_addr_t pa, size_t size); #endif /* _CNSS_MAIN_H */ drivers/net/wireless/cnss2/pci.c +48 −0 Original line number Diff line number Diff line Loading @@ -3486,6 +3486,19 @@ static void cnss_pci_add_dump_seg(struct cnss_pci_data *pci_priv, cnss_minidump_add_region(plat_priv, type, seg_no, va, pa, size); } static void cnss_pci_remove_dump_seg(struct cnss_pci_data *pci_priv, struct cnss_dump_seg *dump_seg, enum cnss_fw_dump_type type, int seg_no, void *va, dma_addr_t dma, size_t size) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; struct device *dev = &pci_priv->pci_dev->dev; phys_addr_t pa; cnss_va_to_pa(dev, size, va, dma, &pa, DMA_ATTR_FORCE_CONTIGUOUS); cnss_minidump_remove_region(plat_priv, type, seg_no, va, pa, size); } void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; Loading Loading @@ -3570,6 +3583,41 @@ void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) void cnss_pci_clear_dump_info(struct cnss_pci_data *pci_priv) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; struct cnss_dump_seg *dump_seg = plat_priv->ramdump_info_v2.dump_data_vaddr; struct image_info *fw_image, *rddm_image; struct cnss_fw_mem *fw_mem = plat_priv->fw_mem; int i, j; fw_image = pci_priv->mhi_ctrl->fbc_image; rddm_image = pci_priv->mhi_ctrl->rddm_image; for (i = 0; i < fw_image->entries; i++) { cnss_pci_remove_dump_seg(pci_priv, dump_seg, CNSS_FW_IMAGE, i, fw_image->mhi_buf[i].buf, fw_image->mhi_buf[i].dma_addr, fw_image->mhi_buf[i].len); dump_seg++; } for (i = 0; i < rddm_image->entries; i++) { cnss_pci_remove_dump_seg(pci_priv, dump_seg, CNSS_FW_RDDM, i, rddm_image->mhi_buf[i].buf, rddm_image->mhi_buf[i].dma_addr, rddm_image->mhi_buf[i].len); dump_seg++; } for (i = 0, j = 0; i < plat_priv->fw_mem_seg_len; i++) { if (fw_mem[i].type == CNSS_MEM_TYPE_DDR) { cnss_pci_remove_dump_seg(pci_priv, dump_seg, CNSS_FW_REMOTE_HEAP, j, fw_mem[i].va, fw_mem[i].pa, fw_mem[i].size); dump_seg++; j++; } } plat_priv->ramdump_info_v2.dump_data.nentries = 0; plat_priv->ramdump_info_v2.dump_data_valid = false; Loading Loading
drivers/net/wireless/cnss2/main.c +41 −0 Original line number Diff line number Diff line Loading @@ -1868,6 +1868,47 @@ int cnss_minidump_add_region(struct cnss_plat_data *plat_priv, return ret; } int cnss_minidump_remove_region(struct cnss_plat_data *plat_priv, enum cnss_fw_dump_type type, int seg_no, void *va, phys_addr_t pa, size_t size) { struct md_region md_entry; int ret; switch (type) { case CNSS_FW_IMAGE: snprintf(md_entry.name, sizeof(md_entry.name), "FBC_%X", seg_no); break; case CNSS_FW_RDDM: snprintf(md_entry.name, sizeof(md_entry.name), "RDDM_%X", seg_no); break; case CNSS_FW_REMOTE_HEAP: snprintf(md_entry.name, sizeof(md_entry.name), "RHEAP_%X", seg_no); break; default: cnss_pr_err("Unknown dump type ID: %d\n", type); return -EINVAL; } md_entry.phys_addr = pa; md_entry.virt_addr = (uintptr_t)va; md_entry.size = size; md_entry.id = MSM_DUMP_DATA_CNSS_WLAN; cnss_pr_dbg("Remove mini dump region: %s, va: %pK, pa: %pa, size: 0x%zx\n", md_entry.name, va, &pa, size); ret = msm_minidump_remove_region(&md_entry); if (ret) cnss_pr_err("Failed to remove mini dump region, err = %d\n", ret); return ret; } static int cnss_register_bus_scale(struct cnss_plat_data *plat_priv) { int ret = 0; Loading
drivers/net/wireless/cnss2/main.h +3 −0 Original line number Diff line number Diff line Loading @@ -412,5 +412,8 @@ int cnss_va_to_pa(struct device *dev, size_t size, void *va, dma_addr_t dma, int cnss_minidump_add_region(struct cnss_plat_data *plat_priv, enum cnss_fw_dump_type type, int seg_no, void *va, phys_addr_t pa, size_t size); int cnss_minidump_remove_region(struct cnss_plat_data *plat_priv, enum cnss_fw_dump_type type, int seg_no, void *va, phys_addr_t pa, size_t size); #endif /* _CNSS_MAIN_H */
drivers/net/wireless/cnss2/pci.c +48 −0 Original line number Diff line number Diff line Loading @@ -3486,6 +3486,19 @@ static void cnss_pci_add_dump_seg(struct cnss_pci_data *pci_priv, cnss_minidump_add_region(plat_priv, type, seg_no, va, pa, size); } static void cnss_pci_remove_dump_seg(struct cnss_pci_data *pci_priv, struct cnss_dump_seg *dump_seg, enum cnss_fw_dump_type type, int seg_no, void *va, dma_addr_t dma, size_t size) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; struct device *dev = &pci_priv->pci_dev->dev; phys_addr_t pa; cnss_va_to_pa(dev, size, va, dma, &pa, DMA_ATTR_FORCE_CONTIGUOUS); cnss_minidump_remove_region(plat_priv, type, seg_no, va, pa, size); } void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; Loading Loading @@ -3570,6 +3583,41 @@ void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) void cnss_pci_clear_dump_info(struct cnss_pci_data *pci_priv) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; struct cnss_dump_seg *dump_seg = plat_priv->ramdump_info_v2.dump_data_vaddr; struct image_info *fw_image, *rddm_image; struct cnss_fw_mem *fw_mem = plat_priv->fw_mem; int i, j; fw_image = pci_priv->mhi_ctrl->fbc_image; rddm_image = pci_priv->mhi_ctrl->rddm_image; for (i = 0; i < fw_image->entries; i++) { cnss_pci_remove_dump_seg(pci_priv, dump_seg, CNSS_FW_IMAGE, i, fw_image->mhi_buf[i].buf, fw_image->mhi_buf[i].dma_addr, fw_image->mhi_buf[i].len); dump_seg++; } for (i = 0; i < rddm_image->entries; i++) { cnss_pci_remove_dump_seg(pci_priv, dump_seg, CNSS_FW_RDDM, i, rddm_image->mhi_buf[i].buf, rddm_image->mhi_buf[i].dma_addr, rddm_image->mhi_buf[i].len); dump_seg++; } for (i = 0, j = 0; i < plat_priv->fw_mem_seg_len; i++) { if (fw_mem[i].type == CNSS_MEM_TYPE_DDR) { cnss_pci_remove_dump_seg(pci_priv, dump_seg, CNSS_FW_REMOTE_HEAP, j, fw_mem[i].va, fw_mem[i].pa, fw_mem[i].size); dump_seg++; j++; } } plat_priv->ramdump_info_v2.dump_data.nentries = 0; plat_priv->ramdump_info_v2.dump_data_valid = false; Loading