|
@@ -1584,6 +1584,36 @@ static int ath10k_pci_set_ram_config(struct ath10k *ar, u32 config)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/* if an error happened returns < 0, otherwise the length */
|
|
|
+static int ath10k_pci_dump_memory_generic(struct ath10k *ar,
|
|
|
+ const struct ath10k_mem_region *current_region,
|
|
|
+ u8 *buf)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (current_region->section_table.size > 0)
|
|
|
+ /* Copy each section individually. */
|
|
|
+ return ath10k_pci_dump_memory_section(ar,
|
|
|
+ current_region,
|
|
|
+ buf,
|
|
|
+ current_region->len);
|
|
|
+
|
|
|
+ /* No individiual memory sections defined so we can
|
|
|
+ * copy the entire memory region.
|
|
|
+ */
|
|
|
+ ret = ath10k_pci_diag_read_mem(ar,
|
|
|
+ current_region->start,
|
|
|
+ buf,
|
|
|
+ current_region->len);
|
|
|
+ if (ret) {
|
|
|
+ ath10k_warn(ar, "failed to copy ramdump region %s: %d\n",
|
|
|
+ current_region->name, ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return current_region->len;
|
|
|
+}
|
|
|
+
|
|
|
static void ath10k_pci_dump_memory(struct ath10k *ar,
|
|
|
struct ath10k_fw_crash_data *crash_data)
|
|
|
{
|
|
@@ -1642,27 +1672,14 @@ static void ath10k_pci_dump_memory(struct ath10k *ar,
|
|
|
buf += sizeof(*hdr);
|
|
|
buf_len -= sizeof(*hdr);
|
|
|
|
|
|
- if (current_region->section_table.size > 0) {
|
|
|
- /* Copy each section individually. */
|
|
|
- count = ath10k_pci_dump_memory_section(ar,
|
|
|
- current_region,
|
|
|
- buf,
|
|
|
- current_region->len);
|
|
|
- } else {
|
|
|
- /* No individiual memory sections defined so we can
|
|
|
- * copy the entire memory region.
|
|
|
- */
|
|
|
- ret = ath10k_pci_diag_read_mem(ar,
|
|
|
- current_region->start,
|
|
|
- buf,
|
|
|
- current_region->len);
|
|
|
- if (ret) {
|
|
|
- ath10k_warn(ar, "failed to copy ramdump region %s: %d\n",
|
|
|
- current_region->name, ret);
|
|
|
+ switch (current_region->type) {
|
|
|
+ default:
|
|
|
+ ret = ath10k_pci_dump_memory_generic(ar, current_region, buf);
|
|
|
+ if (ret < 0)
|
|
|
break;
|
|
|
- }
|
|
|
|
|
|
- count = current_region->len;
|
|
|
+ count = ret;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
hdr->region_type = cpu_to_le32(current_region->type);
|