xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/hal_g6/hal_api_efuse.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 _HAL_API_EFUSE_C_
16 #include "hal_headers.h"
17 #include "efuse/hal_efuse_export.h"
18 
19 /*WIFI Efuse*/
20 enum rtw_hal_status
rtw_hal_efuse_shadow_load(struct hal_info_t * hal_info,bool is_limit)21 rtw_hal_efuse_shadow_load(struct hal_info_t *hal_info, bool is_limit)
22 {
23 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
24 
25 	status = rtw_efuse_shadow_load(hal_info->efuse, is_limit);
26 
27 	return status;
28 }
29 
30 enum rtw_hal_status
rtw_hal_efuse_shadow_update(struct hal_info_t * hal_info,bool is_limit)31 rtw_hal_efuse_shadow_update(struct hal_info_t *hal_info, bool is_limit)
32 {
33 	enum rtw_hal_status status = RTW_HAL_STATUS_EFUSE_PG_FAIL;
34 
35 	status = rtw_efuse_shadow_update(hal_info->efuse, is_limit);
36 
37 	return status;
38 }
39 
40 enum rtw_hal_status
rtw_hal_efuse_shadow_read(struct hal_info_t * hal_info,u8 byte_count,u16 offset,u32 * value,bool is_limit)41 rtw_hal_efuse_shadow_read(struct hal_info_t *hal_info, u8 byte_count,
42 						  u16 offset, u32 *value, bool is_limit)
43 {
44 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
45 
46 	status = rtw_efuse_shadow_read(hal_info->efuse, byte_count, offset, value,
47 								   is_limit);
48 
49 	return status;
50 }
51 
52 enum rtw_hal_status
rtw_hal_efuse_shadow_write(struct hal_info_t * hal_info,u8 byte_count,u16 offset,u32 value,bool is_limit)53 rtw_hal_efuse_shadow_write(struct hal_info_t *hal_info, u8 byte_count,
54 						   u16 offset, u32 value, bool is_limit)
55 {
56 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
57 
58 	status = rtw_efuse_shadow_write(hal_info->efuse, byte_count, offset, value,
59 									is_limit);
60 	return status;
61 }
62 
63 enum rtw_hal_status
rtw_hal_efuse_shadow2buf(struct hal_info_t * hal_info,u8 * pbuf,u16 buflen)64 rtw_hal_efuse_shadow2buf(struct hal_info_t *hal_info, u8 *pbuf, u16 buflen)
65 {
66 	enum rtw_hal_status status = RTW_HAL_STATUS_SUCCESS;
67 
68 	status = rtw_efuse_shadow2buf(hal_info->efuse, pbuf, buflen);
69 
70 	return status;
71 }
72 
rtw_hal_efuse_file_map_load(struct hal_info_t * hal_info,char * file_path,u8 is_limit)73 enum rtw_hal_status rtw_hal_efuse_file_map_load(
74 	struct hal_info_t *hal_info, char *file_path, u8 is_limit)
75 {
76 	enum rtw_hal_status hal_status = RTW_HAL_STATUS_FAILURE;
77 
78 	hal_status = rtw_efuse_file_map_load(hal_info->efuse, file_path ,is_limit);
79 
80 	return hal_status;
81 }
82 
rtw_hal_efuse_file_mask_load(struct hal_info_t * hal_info,char * file_path,u8 is_limit)83 enum rtw_hal_status rtw_hal_efuse_file_mask_load(
84 	struct hal_info_t *hal_info, char *file_path, u8 is_limit)
85 {
86 	enum rtw_hal_status hal_status = RTW_HAL_STATUS_FAILURE;
87 
88 	hal_status = rtw_efuse_file_mask_load(hal_info->efuse, file_path, is_limit);
89 
90 	return hal_status;
91 }
92 
93 /* usage = used percentage(1 Byte) + used bytes(2 Bytes) */
rtw_hal_efuse_get_usage(struct hal_info_t * hal_info,u32 * usage)94 enum rtw_hal_status rtw_hal_efuse_get_usage(struct hal_info_t *hal_info,
95 	u32 *usage)
96 {
97 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
98 
99 	status = rtw_efuse_get_usage(hal_info->efuse, usage);
100 
101 	return status;
102 }
103 
rtw_hal_efuse_get_logical_size(struct hal_info_t * hal_info,u32 * size)104 enum rtw_hal_status rtw_hal_efuse_get_logical_size(struct hal_info_t *hal_info,
105 	u32 *size)
106 {
107 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
108 
109 	status = rtw_efuse_get_logical_size(hal_info->efuse, size, true);
110 
111 	return status;
112 }
113 
rtw_hal_efuse_get_size(struct hal_info_t * hal_info,u32 * size)114 enum rtw_hal_status rtw_hal_efuse_get_size(struct hal_info_t *hal_info,
115 	u32 *size)
116 {
117 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
118 
119 	status = rtw_efuse_get_size(hal_info->efuse, size);
120 
121 	return status;
122 }
123 
rtw_hal_efuse_get_avl(struct hal_info_t * hal_info,u32 * size)124 enum rtw_hal_status rtw_hal_efuse_get_avl(struct hal_info_t *hal_info,
125 	u32 *size)
126 {
127 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
128 
129 	status = rtw_efuse_get_avl(hal_info->efuse, size);
130 
131 	return status;
132 }
133 
rtw_hal_efuse_get_shadowmap_from(struct hal_info_t * hal_info,u8 * val)134 enum rtw_hal_status rtw_hal_efuse_get_shadowmap_from(struct hal_info_t *hal_info,
135 	u8 *val)
136 {
137 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
138 
139 	status = rtw_efuse_get_shadowmap_from(hal_info->efuse, val);
140 
141 	return status;
142 }
143 
rtw_hal_efuse_get_offset_mask(struct hal_info_t * hal_info,u16 offset,u8 * mask)144 enum rtw_hal_status rtw_hal_efuse_get_offset_mask(struct hal_info_t *hal_info,
145 	u16 offset, u8 *mask)
146 {
147 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
148 
149 	status = rtw_efuse_get_offset_mask(hal_info->efuse, offset, mask);
150 
151 	return status;
152 }
153 
rtw_hal_efuse_get_mask_buf(struct hal_info_t * hal_info,u8 * destbuf,u32 * buflen)154 enum rtw_hal_status rtw_hal_efuse_get_mask_buf(struct hal_info_t *hal_info,
155 							u8 *destbuf, u32 *buflen)
156 {
157 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
158 
159 	status = rtw_efuse_get_mask_buf(hal_info->efuse, destbuf, buflen);
160 
161 	return status;
162 }
163 
164 enum rtw_hal_status
rtw_hal_efuse_get_info(struct rtw_hal_com_t * hal_com,enum rtw_efuse_info info_type,void * value,u8 size)165 rtw_hal_efuse_get_info(struct rtw_hal_com_t *hal_com,
166 		       enum rtw_efuse_info info_type,
167 		       void *value,
168 		       u8 size)
169 {
170 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
171 	struct hal_info_t *hal_info = hal_com->hal_priv;
172 
173 	status = rtw_efuse_get_info(hal_info->efuse, info_type, value, size);
174 
175 	return status;
176 }
177 
178 /* API export to PHL : rtw_hal_get_efuse_info */
179 enum rtw_hal_status
rtw_hal_get_efuse_info(void * hal,enum rtw_efuse_info info_type,void * value,u8 size)180 rtw_hal_get_efuse_info(void *hal,
181 		       enum rtw_efuse_info info_type,
182 		       void *value,
183 		       u8 size)
184 {
185 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
186 	struct hal_info_t *hal_info = (struct hal_info_t *)hal;
187 
188 	status = rtw_efuse_get_info(hal_info->efuse, info_type, value, size);
189 
190 	return status;
191 }
192 
rtw_hal_efuse_process(struct hal_info_t * hal_info,char * ic_name)193 void rtw_hal_efuse_process(struct hal_info_t *hal_info, char *ic_name)
194 {
195 	rtw_efuse_process(hal_info->efuse, ic_name);
196 }
197 
rtw_hal_efuse_init(struct rtw_phl_com_t * phl_com,struct hal_info_t * hal_info)198 enum rtw_hal_status rtw_hal_efuse_init(struct rtw_phl_com_t *phl_com,
199 					struct hal_info_t *hal_info)
200 {
201 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
202 	struct rtw_hal_com_t *hal_com = hal_info->hal_com;
203 
204 	status = rtw_efuse_init(phl_com, hal_com, &(hal_info->efuse));
205 
206 	return status;
207 }
208 
rtw_hal_efuse_deinit(struct rtw_phl_com_t * phl_com,struct hal_info_t * hal_info)209 void rtw_hal_efuse_deinit(struct rtw_phl_com_t *phl_com,
210 					struct hal_info_t *hal_info)
211 {
212 	struct rtw_hal_com_t *hal_com = hal_info->hal_com;
213 
214 	rtw_efuse_deinit(hal_com, hal_info->efuse);
215 }
216 
217 
218 enum rtw_hal_status
rtw_hal_efuse_bt_shadow_load(struct hal_info_t * hal_info)219 rtw_hal_efuse_bt_shadow_load(struct hal_info_t *hal_info)
220 {
221 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
222 
223 	status = rtw_efuse_bt_shadow_load(hal_info->efuse);
224 
225 	return status;
226 }
227 
228 enum rtw_hal_status
rtw_hal_efuse_bt_shadow_update(struct hal_info_t * hal_info)229 rtw_hal_efuse_bt_shadow_update(struct hal_info_t *hal_info)
230 {
231 	enum rtw_hal_status status = RTW_HAL_STATUS_EFUSE_PG_FAIL;
232 
233 	status = rtw_efuse_bt_shadow_update(hal_info->efuse);
234 
235 	return status;
236 }
237 
238 enum rtw_hal_status
rtw_hal_efuse_bt_shadow_read(struct hal_info_t * hal_info,u8 byte_count,u16 offset,u32 * value)239 rtw_hal_efuse_bt_shadow_read(struct hal_info_t *hal_info, u8 byte_count,
240 						  u16 offset, u32 *value)
241 {
242 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
243 
244 	status = rtw_efuse_bt_shadow_read(hal_info->efuse, byte_count, offset, value);
245 
246 	return status;
247 }
248 
249 enum rtw_hal_status
rtw_hal_efuse_bt_shadow_write(struct hal_info_t * hal_info,u8 byte_count,u16 offset,u32 value)250 rtw_hal_efuse_bt_shadow_write(struct hal_info_t *hal_info, u8 byte_count,
251 						   u16 offset, u32 value)
252 {
253 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
254 
255 	status = rtw_efuse_bt_shadow_write(hal_info->efuse, byte_count, offset, value);
256 	return status;
257 }
258 
259 
260 enum rtw_hal_status
rtw_hal_efuse_bt_shadow2buf(struct hal_info_t * hal_info,u8 * pbuf,u16 buflen)261 rtw_hal_efuse_bt_shadow2buf(struct hal_info_t *hal_info, u8 *pbuf, u16 buflen)
262 {
263    enum rtw_hal_status status = RTW_HAL_STATUS_SUCCESS;
264 
265    status = rtw_efuse_bt_shadow2buf(hal_info->efuse, pbuf, buflen);
266 
267    return status;
268 }
269 
rtw_hal_efuse_bt_file_map_load(struct hal_info_t * hal_info,char * file_path)270 enum rtw_hal_status rtw_hal_efuse_bt_file_map_load(
271 	struct hal_info_t *hal_info, char *file_path)
272 {
273 	enum rtw_hal_status hal_status = RTW_HAL_STATUS_FAILURE;
274 
275 	hal_status = rtw_efuse_bt_file_map_load(hal_info->efuse, file_path);
276 
277 	return hal_status;
278 }
279 
280 
rtw_hal_efuse_bt_file_mask_load(struct hal_info_t * hal_info,char * file_path)281 enum rtw_hal_status rtw_hal_efuse_bt_file_mask_load(
282 	struct hal_info_t *hal_info, char *file_path)
283 {
284 	enum rtw_hal_status hal_status = RTW_HAL_STATUS_FAILURE;
285 
286 	hal_status = rtw_efuse_bt_file_mask_load(hal_info->efuse, file_path);
287 
288 	return hal_status;
289 }
290 
291 /* usage = used percentage(1 Byte) + used bytes(2 Bytes) */
rtw_hal_efuse_bt_get_usage(struct hal_info_t * hal_info,u32 * usage)292 enum rtw_hal_status rtw_hal_efuse_bt_get_usage(struct hal_info_t *hal_info,
293 	u32 *usage)
294 {
295 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
296 
297 	status = rtw_efuse_get_usage(hal_info->efuse, usage);
298 
299 	return status;
300 }
301 
rtw_hal_efuse_bt_get_logical_size(struct hal_info_t * hal_info,u32 * size)302 enum rtw_hal_status rtw_hal_efuse_bt_get_logical_size(struct hal_info_t *hal_info,
303 	u32 *size)
304 {
305 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
306 
307 	status = rtw_efuse_bt_get_logical_size(hal_info->efuse, size);
308 
309 	return status;
310 }
311 
rtw_hal_efuse_bt_get_size(struct hal_info_t * hal_info,u32 * size)312 enum rtw_hal_status rtw_hal_efuse_bt_get_size(struct hal_info_t *hal_info,
313 	u32 *size)
314 {
315 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
316 
317 	status = rtw_efuse_bt_get_size(hal_info->efuse, size);
318 
319 	return status;
320 }
321 
rtw_hal_efuse_bt_get_avl(struct hal_info_t * hal_info,u32 * size)322 enum rtw_hal_status rtw_hal_efuse_bt_get_avl(struct hal_info_t *hal_info,
323 	u32 *size)
324 {
325 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
326 
327 	status = rtw_efuse_bt_get_avl(hal_info->efuse, size);
328 
329 	return status;
330 }
331 
332 
rtw_hal_efuse_bt_get_offset_mask(struct hal_info_t * hal_info,u16 offset,u8 * mask)333 enum rtw_hal_status rtw_hal_efuse_bt_get_offset_mask(struct hal_info_t *hal_info,
334 	u16 offset, u8 *mask)
335 {
336 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
337 
338 	status = rtw_efuse_bt_get_offset_mask(hal_info->efuse, offset, mask);
339 
340 	return status;
341 }
342 
rtw_hal_efuse_bt_get_mask_buf(struct hal_info_t * hal_info,u8 * destbuf,u32 * buflen)343 enum rtw_hal_status rtw_hal_efuse_bt_get_mask_buf(struct hal_info_t *hal_info,
344 							u8 *destbuf, u32 *buflen)
345 {
346 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
347 
348 	status = rtw_efuse_bt_get_mask_buf(hal_info->efuse, destbuf, buflen);
349 
350 	return status;
351 }
rtw_hal_efuse_bt_read_hidden(struct hal_info_t * hal_info,u32 addr,u32 size,u8 * val)352 enum rtw_hal_status rtw_hal_efuse_bt_read_hidden(
353 	struct hal_info_t *hal_info, u32 addr, u32 size, u8 *val)
354 {
355 	enum rtw_hal_status hal_status = RTW_HAL_STATUS_FAILURE;
356 
357 	hal_status = rtw_efuse_bt_read_hidden(hal_info->efuse, addr, size, val);
358 
359 	return hal_status;
360 }
361 
rtw_hal_efuse_bt_write_hidden(struct hal_info_t * hal_info,u32 addr,u8 val)362 enum rtw_hal_status rtw_hal_efuse_bt_write_hidden(
363 	struct hal_info_t *hal_info, u32 addr, u8 val)
364 {
365 	enum rtw_hal_status hal_status = RTW_HAL_STATUS_FAILURE;
366 
367 	hal_status = rtw_efuse_bt_write_hidden(hal_info->efuse, addr, val);
368 
369 	return hal_status;
370 }
371 
rtw_hal_efuse_read_phy_efuse(struct hal_info_t * hal_info,u32 addr,u32 size,u8 * data,u8 type)372 enum rtw_hal_status rtw_hal_efuse_read_phy_efuse(
373 	struct hal_info_t *hal_info, u32 addr, u32 size, u8 *data, u8 type)
374 {
375 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
376 
377 	status = rtw_efuse_read_phy_wifi(hal_info->efuse, addr, size, data, type);
378 
379 	return status;
380 }
381 
rtw_hal_efuse_renew(struct hal_info_t * hal_info,u8 type)382 enum rtw_hal_status rtw_hal_efuse_renew(
383 	struct hal_info_t *hal_info, u8 type)
384 {
385 	enum rtw_hal_status status = RTW_HAL_STATUS_FAILURE;
386 
387 	status = rtw_efuse_renew(hal_info->efuse, type);
388 
389 	return status;
390 }
391 
hal_efuse_dump_wifi_map(struct hal_info_t * hal_info,u32 * used_len,char * output,u32 * out_len)392 void hal_efuse_dump_wifi_map(
393 	struct hal_info_t *hal_info,
394 	u32 *used_len,
395 	char *output,
396 	u32 *out_len
397 	)
398 {
399 	void *d = hal_info->hal_com->drv_priv;
400 	u32 _used_len = *used_len;
401 	u32 _out_len = *out_len;
402 	u32 map_len = 0;
403 	u32 i = 0, j = 0;
404 	u8 *buf = NULL;
405 
406 	rtw_efuse_get_logical_size(hal_info->efuse, &map_len, true);
407 
408 	if(map_len == 0){
409 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
410 				 _out_len - _used_len, "map length is 0!\n");
411 		goto exit;
412 	}
413 
414 	buf = _os_mem_alloc(d, map_len);
415 
416 	if(buf == NULL){
417 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
418 				 _out_len - _used_len, "Allocate buffer fail!\n");
419 		goto exit;
420 	}
421 	rtw_efuse_shadow2buf(hal_info->efuse, buf, (u16)map_len);
422 
423 	PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len, _out_len - _used_len,
424 			 "EFUSE Wifi shadow map from %s\n\n",
425 			 rtw_efuse_get_shadowmap_from_to_str(hal_info->efuse));
426 
427 	PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len, _out_len - _used_len,
428 			 "%14s%-6s%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n",
429 			 " ", "00", "02", "04", "06", "08", "0A", "0C", "0E");
430 	PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len, _out_len - _used_len,
431 			 "%14s%s\n",
432 			 " ", "================================================\n");
433 	for(i = 0; i < map_len; i+=16){
434 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
435 				 _out_len - _used_len, "0x%08X%4s", i, "");
436 		for(j = 0; j<16;j++){
437 			if((i+j) >= map_len)
438 				break;
439 			PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
440 					 _out_len - _used_len, "%02X ", buf[i+j]);
441 		}
442 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
443 				 _out_len - _used_len, "\n");
444 	}
445 	if(buf)
446 		_os_mem_free(d, buf, map_len);
447 exit:
448 	*used_len = _used_len;
449 	*out_len = _out_len;
450 }
451 
hal_efuse_dump_wifi_logic_map(struct hal_info_t * hal_info,u32 * used_len,char * output,u32 * out_len)452 void hal_efuse_dump_wifi_logic_map(
453 	struct hal_info_t *hal_info,
454 	u32 *used_len,
455 	char *output,
456 	u32 *out_len
457 	)
458 {
459 	void *d = hal_info->hal_com->drv_priv;
460 	u32 _used_len = *used_len;
461 	u32 _out_len = *out_len;
462 	u32 map_len = 0;
463 	u32 i = 0, j = 0;
464 	u8 *data = NULL;
465 
466 	rtw_efuse_get_logical_size(hal_info->efuse, &map_len, true);
467 
468 	if(map_len == 0){
469 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
470 				 _out_len - _used_len, "map length is 0!\n");
471 		goto exit;
472 	}
473 
474 	data = _os_mem_alloc(d, map_len);
475 
476 	if(data == NULL){
477 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
478 				 _out_len - _used_len, "Allocate buffer fail!\n");
479 		goto exit;
480 	}
481 
482 	rtw_efuse_logicmap_buf_load(hal_info->efuse, data, false);
483 
484 	PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len, _out_len - _used_len,
485 			 "EFUSE Wifi map from HW\n");
486 
487 	PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len, _out_len - _used_len,
488 			 "%14s%-6s%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n",
489 			 " ", "00", "02", "04", "06", "08", "0A", "0C", "0E");
490 	PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len, _out_len - _used_len,
491 			 "%14s%s\n",
492 			 " ", "================================================\n");
493 	for(i = 0; i < map_len; i+=16){
494 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
495 				 _out_len - _used_len, "0x%08X%4s", i, "");
496 		for(j = 0; j<16;j++){
497 			if((i+j) >= map_len)
498 				break;
499 			PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
500 					 _out_len - _used_len, "%02X ", data[i+j]);
501 		}
502 		PHL_DBG_OUTBUF(_out_len, _used_len, output + _used_len,
503 				 _out_len - _used_len, "\n");
504 	}
505 	if(data)
506 		_os_mem_free(d, data, map_len);
507 exit:
508 	*used_len = _used_len;
509 	*out_len = _out_len;
510 }
511 
hal_efuse_cmd_parser(struct hal_info_t * hal_info,char input[][MAX_ARGV],u32 input_num,char * output,u32 out_len)512 void hal_efuse_cmd_parser(
513 	struct hal_info_t *hal_info,
514 	char input[][MAX_ARGV],
515 	u32 input_num,
516 	char *output,
517 	u32 out_len
518 	)
519 {
520 	u32 hal_cmd_ary_size = sizeof(hal_efuse_cmd_i) / sizeof(struct hal_cmd_info);
521 	u32 i = 0;
522 	u8 id = 0;
523 	u32 used = 0;
524 
525 	PHL_DBG_OUTBUF(out_len, used, output + used, out_len - used, "\n");
526 
527 	if (hal_cmd_ary_size == 0)
528 		return;
529 
530 	/* Parsing Cmd ID */
531 	if (input_num) {
532 		for (i = 0; i < hal_cmd_ary_size; i++) {
533 			if (_os_strcmp(hal_efuse_cmd_i[i].name, input[0]) == 0) {
534 				id = hal_efuse_cmd_i[i].id;
535 				PHL_INFO("enter EFUSE cmd %s\n", hal_efuse_cmd_i[i].name);
536 				break;
537 			}
538 		}
539 		if (i == hal_cmd_ary_size) {
540 			PHL_DBG_OUTBUF(out_len, used, output + used,
541 					 out_len - used,
542 					 "EFUSE command not found!\n");
543 			return;
544 		}
545 	}
546 
547 	switch (id) {
548 		case HAL_EFUSE_HELP:
549 			PHL_DBG_OUTBUF(out_len, used, output + used,
550 					 out_len - used,
551 					 "EFUSE cmd =>\n");
552 			for (i = 0; i < hal_cmd_ary_size - 1; i++)
553 				PHL_DBG_OUTBUF(out_len, used, output + used,
554 						 out_len - used," %s\n", hal_efuse_cmd_i[i].name);
555 			break;
556 		case HAL_EFUSE_WIFI_DUMP_MAP:
557 			hal_efuse_dump_wifi_map(hal_info, &used, output, &out_len);
558 			break;
559 		case HAL_EFUSE_WIFI_LOGIC_DUMP_MAP:
560 			hal_efuse_dump_wifi_logic_map(hal_info, &used, output, &out_len);
561 			break;
562 		default:
563 			PHL_DBG_OUTBUF(out_len, used, output + used,
564 					 out_len - used,"Do not support this command\n");
565 			break;
566 	}
567 }
568 
hal_efuse_cmd(struct hal_info_t * hal_info,char * input,char * output,u32 out_len)569 s32 hal_efuse_cmd(
570 	struct hal_info_t *hal_info,
571 	char *input,
572 	char *output,
573 	u32 out_len
574 	)
575 {
576 	char *token;
577 	u32 argc = 0;
578 	char argv[MAX_ARGC][MAX_ARGV];
579 
580 	do {
581 		token = _os_strsep(&input, ", ");
582 		if (token) {
583 			if (_os_strlen((u8*)token) <= MAX_ARGV)
584 				_os_strcpy(argv[argc], token);
585 
586 			argc++;
587 		} else {
588 			break;
589 		}
590 	} while (argc < MAX_ARGC);
591 
592 	hal_efuse_cmd_parser(hal_info, argv, argc, output, out_len);
593 
594 	return 0;
595 }
596 
rtw_hal_efuse_proc_cmd(struct hal_info_t * hal_info,struct rtw_proc_cmd * incmd,char * output,u32 out_len)597 bool rtw_hal_efuse_proc_cmd(
598 	struct hal_info_t *hal_info,
599 	struct rtw_proc_cmd *incmd,
600 	char *output,
601 	u32 out_len
602 	)
603 {
604 	if(incmd->in_type == RTW_ARG_TYPE_BUF)
605 		hal_efuse_cmd(hal_info, incmd->in.buf, output, out_len);
606 	else if(incmd->in_type == RTW_ARG_TYPE_ARRAY){
607 		hal_efuse_cmd_parser(hal_info, incmd->in.vector,
608 					incmd->in_cnt_len, output, out_len);
609 	}
610 
611 	return true;
612 }