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