xref: /linux/drivers/net/wireless/ath/ath11k/coredump.c (revision 1a9239bb4253f9076b5b4b2a1a4e8d7defd77a95)
1*5edbb148SMiaoqing Pan // SPDX-License-Identifier: BSD-3-Clause-Clear
2*5edbb148SMiaoqing Pan /*
3*5edbb148SMiaoqing Pan  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
4*5edbb148SMiaoqing Pan  * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
5*5edbb148SMiaoqing Pan  */
6*5edbb148SMiaoqing Pan #include <linux/devcoredump.h>
7*5edbb148SMiaoqing Pan #include "hif.h"
8*5edbb148SMiaoqing Pan #include "coredump.h"
9*5edbb148SMiaoqing Pan #include "debug.h"
10*5edbb148SMiaoqing Pan 
11*5edbb148SMiaoqing Pan enum
ath11k_coredump_get_dump_type(int type)12*5edbb148SMiaoqing Pan ath11k_fw_crash_dump_type ath11k_coredump_get_dump_type(int type)
13*5edbb148SMiaoqing Pan {
14*5edbb148SMiaoqing Pan 	enum ath11k_fw_crash_dump_type dump_type;
15*5edbb148SMiaoqing Pan 
16*5edbb148SMiaoqing Pan 	switch (type) {
17*5edbb148SMiaoqing Pan 	case HOST_DDR_REGION_TYPE:
18*5edbb148SMiaoqing Pan 		dump_type = FW_CRASH_DUMP_REMOTE_MEM_DATA;
19*5edbb148SMiaoqing Pan 		break;
20*5edbb148SMiaoqing Pan 	case M3_DUMP_REGION_TYPE:
21*5edbb148SMiaoqing Pan 		dump_type = FW_CRASH_DUMP_M3_DUMP;
22*5edbb148SMiaoqing Pan 		break;
23*5edbb148SMiaoqing Pan 	case PAGEABLE_MEM_REGION_TYPE:
24*5edbb148SMiaoqing Pan 		dump_type = FW_CRASH_DUMP_PAGEABLE_DATA;
25*5edbb148SMiaoqing Pan 		break;
26*5edbb148SMiaoqing Pan 	case BDF_MEM_REGION_TYPE:
27*5edbb148SMiaoqing Pan 	case CALDB_MEM_REGION_TYPE:
28*5edbb148SMiaoqing Pan 		dump_type = FW_CRASH_DUMP_NONE;
29*5edbb148SMiaoqing Pan 		break;
30*5edbb148SMiaoqing Pan 	default:
31*5edbb148SMiaoqing Pan 		dump_type = FW_CRASH_DUMP_TYPE_MAX;
32*5edbb148SMiaoqing Pan 		break;
33*5edbb148SMiaoqing Pan 	}
34*5edbb148SMiaoqing Pan 
35*5edbb148SMiaoqing Pan 	return dump_type;
36*5edbb148SMiaoqing Pan }
37*5edbb148SMiaoqing Pan EXPORT_SYMBOL(ath11k_coredump_get_dump_type);
38*5edbb148SMiaoqing Pan 
ath11k_coredump_upload(struct work_struct * work)39*5edbb148SMiaoqing Pan void ath11k_coredump_upload(struct work_struct *work)
40*5edbb148SMiaoqing Pan {
41*5edbb148SMiaoqing Pan 	struct ath11k_base *ab = container_of(work, struct ath11k_base, dump_work);
42*5edbb148SMiaoqing Pan 
43*5edbb148SMiaoqing Pan 	ath11k_info(ab, "Uploading coredump\n");
44*5edbb148SMiaoqing Pan 	/* dev_coredumpv() takes ownership of the buffer */
45*5edbb148SMiaoqing Pan 	dev_coredumpv(ab->dev, ab->dump_data, ab->ath11k_coredump_len, GFP_KERNEL);
46*5edbb148SMiaoqing Pan 	ab->dump_data = NULL;
47*5edbb148SMiaoqing Pan }
48*5edbb148SMiaoqing Pan 
ath11k_coredump_collect(struct ath11k_base * ab)49*5edbb148SMiaoqing Pan void ath11k_coredump_collect(struct ath11k_base *ab)
50*5edbb148SMiaoqing Pan {
51*5edbb148SMiaoqing Pan 	ath11k_hif_coredump_download(ab);
52*5edbb148SMiaoqing Pan }
53