xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/phl/phl_debug.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2019 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 #define _PHL_DEBUG_C_
16 #include "phl_headers.h"
17 
18 #ifdef CONFIG_RTW_DEBUG
19 enum _phl_dbg_comp_mode {
20 	PHL_SET_COMP_BIT = 0x01,
21 	PHL_CLEAR_COMP_BIT = 0x2,
22 	PHL_SHOW_COMP = 0x3,
23 	PHL_SET_COMP_VALUE = 0x4,
24 };
25 
26 u32 phl_log_components = COMP_PHL_XMIT |
27 			 COMP_PHL_WOW |
28 			/* COMP_PHL_CMDDISP |*/
29 			 COMP_PHL_RECV |
30 			 COMP_PHL_MAC |
31 			 #ifdef CONFIG_POWER_SAVE
32 			 COMP_PHL_PS |
33 			 #endif
34 			 COMP_PHL_DBG | 0;
35 u8 phl_log_level = _PHL_INFO_;
36 struct dbg_mem_ctx debug_memory_ctx;
37 
debug_dump_mac_address(u8 * mac_addr)38 void debug_dump_mac_address(u8 *mac_addr)
39 {
40 	if (mac_addr == NULL) {
41 		PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "[dump mac addr] mac_addr is NULL\n");
42 		return;
43 	}
44 
45 	PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "[MAC ADDRESS]\n");
46 	PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_,
47 		 "%02X-%02X-%02X-%02X-%02X-%02X\n",
48 		 mac_addr[0], mac_addr[1], mac_addr[2],
49 		 mac_addr[3], mac_addr[4], mac_addr[5]);
50 }
51 
debug_dump_data(u8 * buf,u32 buf_len,const char * prefix)52 void debug_dump_data(u8 *buf, u32 buf_len, const char *prefix)
53 {
54 	u32 i;
55 
56 	if (buf == NULL) {
57 		PHL_TRACE(COMP_PHL_DBG, _PHL_DEBUG_, "[debug dump] buf is NULL\n");
58 		return;
59 	}
60 
61 	PHL_TRACE(COMP_PHL_DBG, _PHL_DEBUG_, "[debug dump] %s\n", prefix);
62 	for (i = 0; i < buf_len; i++) {
63 		if (!(i % 8))
64 			PHL_DATA(COMP_PHL_DBG, _PHL_DEBUG_, "\n");
65 		PHL_DATA(COMP_PHL_DBG, _PHL_DEBUG_, "%02X ", buf[i]);
66 		}
67 	PHL_DATA(COMP_PHL_DBG, _PHL_DEBUG_, "\n");
68 }
69 
rt_alloc_dbg_buf(void * phl,u8 * buf_ptr,u32 buf_size,const u8 * file_name,u32 line_num,const u8 * func_name)70 void rt_alloc_dbg_buf(void *phl, u8 *buf_ptr, u32 buf_size,
71 		const u8 *file_name, u32 line_num, const u8 *func_name)
72 {
73 	_os_list *list = &debug_memory_ctx.alloc_buf_list;
74 	_os_lock *lock = &debug_memory_ctx.alloc_buf_list_lock;
75 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
76 	struct dbg_alloc_buf *dbg_buf = NULL;
77 	u32 name_size = 0;
78 
79 	FUNCIN();
80 
81 	dbg_buf = _os_mem_alloc(phl_to_drvpriv(phl_info), sizeof(*dbg_buf));
82 
83 	dbg_buf->buf_ptr = buf_ptr;
84 		dbg_buf->buf_size = buf_size;
85 
86 	name_size = (_os_strlen((u8 *)file_name) > DEBUG_MAX_NAME_LEN) ?
87 		DEBUG_MAX_NAME_LEN : _os_strlen((u8 *)file_name);
88 	_os_mem_cpy(phl_to_drvpriv(phl_info), dbg_buf->file_name, (u8 *)file_name, name_size);
89 
90 	dbg_buf->line_num = line_num;
91 
92 	name_size = (_os_strlen((u8 *)func_name) > DEBUG_MAX_NAME_LEN) ?
93 		DEBUG_MAX_NAME_LEN : _os_strlen((u8 *)func_name);
94 	_os_mem_cpy(phl_to_drvpriv(phl_info), dbg_buf->func_name, (u8 *)func_name, name_size);
95 
96 	_os_spinlock(phl_to_drvpriv(phl_info), lock, _bh, NULL);
97 
98 	list_add_tail(&(dbg_buf->list), list);
99 	debug_memory_ctx.alloc_buf_cnt++;
100 
101 	_os_spinunlock(phl_to_drvpriv(phl_info), lock, _bh, NULL);
102 
103 	PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "Allocate Memory: %p, size: %d, File: %s, Line: %d, Function: %s\n",
104 		 dbg_buf->buf_ptr, dbg_buf->buf_size, dbg_buf->file_name,
105 		 dbg_buf->line_num, dbg_buf->func_name);
106 
107 	PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "Current allocated buffer count: %d",
108 		 debug_memory_ctx.alloc_buf_cnt);
109 
110 	FUNCOUT();
111 }
112 
113 
rt_free_dbg_buf(void * phl,u8 * buf_ptr,u32 buf_size,const u8 * file_name,u32 line_num,const u8 * func_name)114 void rt_free_dbg_buf(void *phl, u8 *buf_ptr, u32 buf_size,
115 		const u8 *file_name, u32 line_num, const u8 *func_name)
116 {
117 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
118 	_os_list *list = &debug_memory_ctx.alloc_buf_list;
119 	_os_lock *lock = &debug_memory_ctx.alloc_buf_list_lock;
120 	struct dbg_alloc_buf *dbg_buf = NULL , *t;
121 	u8 found = false;
122 
123 	FUNCIN();
124 
125 	_os_spinlock(phl_to_drvpriv(phl_info), lock, _bh, NULL);
126 
127 	phl_list_for_loop_safe(dbg_buf, t, struct dbg_alloc_buf, list, list) {
128 		if (dbg_buf->buf_ptr == buf_ptr) {
129 			list_del(&dbg_buf->list);
130 			found = true;
131 			break;
132 		}
133 	}
134 	_os_spinunlock(phl_to_drvpriv(phl_info), lock, _bh, NULL);
135 
136 	if (true == found) {
137 		PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "Free Memory: %p, size: %d, File: %s, Line: %d, Function: %s\n",
138 			 dbg_buf->buf_ptr, dbg_buf->buf_size, file_name,
139 			 line_num, func_name);
140 		PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "Current allocated buffer count: %d",
141 			 debug_memory_ctx.alloc_buf_cnt);
142 		_os_mem_free(phl_to_drvpriv(phl_info), dbg_buf, sizeof(*dbg_buf));
143 		debug_memory_ctx.alloc_buf_cnt--;
144 	} else {
145 		PHL_TRACE(COMP_PHL_DBG, _PHL_WARNING_,
146 			"WARNING, can not find allocated buffer in list\n");
147 	}
148 
149 	FUNCOUT();
150 }
151 
152 
rt_mem_dbg_init(void * phl)153 void rt_mem_dbg_init(void *phl)
154 {
155 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
156 	_os_list *list = &debug_memory_ctx.alloc_buf_list;
157 	_os_lock *lock = &debug_memory_ctx.alloc_buf_list_lock;
158 
159 	FUNCIN();
160 	debug_memory_ctx.alloc_buf_cnt = 0;
161 	INIT_LIST_HEAD(list);
162 	_os_spinlock_init(phl_to_drvpriv(phl_info), lock);
163 	FUNCOUT();
164 }
165 
rt_mem_dbg_deinit(void * phl)166 void rt_mem_dbg_deinit(void *phl)
167 {
168 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
169 	_os_list *list = &debug_memory_ctx.alloc_buf_list;
170 	_os_lock *lock = &debug_memory_ctx.alloc_buf_list_lock;
171 	struct dbg_alloc_buf *dbg_buf = NULL;
172 
173 	FUNCIN();
174 	while (true != list_empty(list) ||
175 		0 != debug_memory_ctx.alloc_buf_cnt) {
176 
177 		_os_spinlock(phl_to_drvpriv(phl_info), lock, _bh, NULL);
178 		dbg_buf = list_first_entry(list, struct dbg_alloc_buf, list);
179 		list_del(&dbg_buf->list);
180 		_os_spinunlock(phl_to_drvpriv(phl_info), lock, _bh, NULL);
181 
182 		PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "FOUND non-freed Memory: %p, size: %d, File: %s, Line: %d, Function: %s\n",
183 			dbg_buf->buf_ptr, dbg_buf->buf_size,
184 			dbg_buf->file_name, dbg_buf->line_num,
185 			dbg_buf->func_name);
186 		PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "Current allocated buffer count: %d",
187 			debug_memory_ctx.alloc_buf_cnt);
188 		_os_mem_free(phl_to_drvpriv(phl_info), dbg_buf, sizeof(*dbg_buf));
189 		debug_memory_ctx.alloc_buf_cnt--;
190 	}
191 	_os_spinlock_init(phl_to_drvpriv(phl_info), lock);
192 
193 	FUNCOUT();
194 }
195 
196 
phl_dbg_show_log_comp(u32 para_dbg)197 void phl_dbg_show_log_comp(u32 para_dbg)
198 {
199 	PHL_TRACE(COMP_PHL_DBG, _PHL_INFO_, "[DBG] phl_log_components = 0x%x \n", phl_log_components);
200 }
201 
phl_dbg_set_log_comp(u32 para_dbg)202 void phl_dbg_set_log_comp(u32 para_dbg)
203 {
204 	phl_log_components |= BIT(para_dbg);
205 }
206 
phl_dbg_clear_log_comp(u32 para_dbg)207 void phl_dbg_clear_log_comp(u32 para_dbg)
208 {
209 	phl_log_components &= (~BIT(para_dbg));
210 }
211 
phl_dbg_set_log_comp_value(u32 para_dbg)212 void phl_dbg_set_log_comp_value(u32 para_dbg)
213 {
214 	phl_log_components = para_dbg;
215 }
216 
rtw_phl_dbg_ctrl_comp(u8 ctrl,u32 para_dbg)217 u32 rtw_phl_dbg_ctrl_comp(u8 ctrl, u32 para_dbg)
218 {
219 	switch(ctrl){
220 	case PHL_SET_COMP_BIT:
221 		if (para_dbg > 31)
222 			PHL_PRINT( "[DBG] bit num is illegal\n");
223 		else
224 			phl_dbg_set_log_comp(para_dbg);
225 		break;
226 	case PHL_CLEAR_COMP_BIT:
227 		if (para_dbg > 31)
228 			PHL_PRINT("[DBG] bit num is illegal\n");
229 		else
230 			phl_dbg_clear_log_comp(para_dbg);
231 		break;
232 	case PHL_SHOW_COMP:
233 		phl_dbg_show_log_comp(para_dbg);
234 		break;
235 	case PHL_SET_COMP_VALUE:
236 		phl_dbg_set_log_comp_value(para_dbg);
237 		break;
238 	default:
239 		break;
240 	}
241 
242 	phl_dbg_show_log_comp(para_dbg);
243 
244 	return phl_log_components;
245 }
246 #endif	/* #ifdef CONFIG_PHL_DEBUG */
247 
248