2025-05-10 21:58:58 +08:00

1444 lines
52 KiB
C

/******************************************************************************
*
* Copyright(c) 2019 - 2020 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* Author: vincent_fann@realtek.com
*
*****************************************************************************/
#define _PHL_DBG_CMD_C_
#include "phl_dbg_cmd.h"
#include "phl_ps_dbg_cmd.h"
/*
* proc debug command of core
*/
enum PHL_DBG__CORE_CMD_ID {
PHL_DBG_CORE_HELP,
PHL_DBG_CORE_GIT_INFO
};
static const struct phl_dbg_cmd_info phl_dbg_core_cmd_i[] = {
{"git_info", PHL_DBG_CORE_GIT_INFO}
};
void phl_dbg_git_info(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
/* #REMOVE BEGIN */
#if CONFIG_GEN_GIT_INFO
#include "../phl_git_info.h"
u32 used = 0;
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"\ncore_ver : %s\n", RTK_CORE_TAGINFO);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"phl_ver : %s\n", RTK_PHL_TAGINFO);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"halmac_ver : %s\n", RTK_HALMAC_TAGINFO);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"halbb_ver : %s\n", RTK_HALBB_TAGINFO);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"halrf_ver : %s\n", RTK_HALRF_TAGINFO);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"btc_ver : %s\n", RTK_BTC_TAGINFO);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"\ncore_sha1 : %s\n", RTK_CORE_SHA1);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"phl_sha1 : %s\n", RTK_PHL_SHA1);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"halmac_sha1: %s\n", RTK_HALMAC_SHA1);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"halbb_sha1 : %s\n", RTK_HALBB_SHA1);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"halrf_sha1 : %s\n", RTK_HALRF_SHA1);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"btc_sha1 : %s\n", RTK_BTC_SHA1);
#endif /* CONFIG_GEN_GIT_INFO */
/* #REMOVE END */
}
void phl_dbg_core_cmd_parser(void *phl, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
struct phl_info_t *phl_info = (struct phl_info_t *)phl;
u8 id = 0;
u32 i;
u32 used = 0;
u32 phl_ary_size = sizeof(phl_dbg_core_cmd_i) /
sizeof(struct phl_dbg_cmd_info);
if (phl_ary_size == 0)
return;
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used, "\n");
/* Parsing Cmd ID */
if (input_num) {
for (i = 0; i < phl_ary_size; i++) {
if (_os_strcmp(phl_dbg_core_cmd_i[i].name, input[0]) == 0) {
id = phl_dbg_core_cmd_i[i].id;
PHL_INFO("[%s]===>\n", phl_dbg_core_cmd_i[i].name);
break;
}
}
if (i == phl_ary_size) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "PHL CMD not found!\n");
return;
}
}
switch (id) {
case PHL_DBG_CORE_HELP:
{
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"phl_dbg_core_cmd_parser : PHL_DBG_CORE_HELP \n");
for (i = 0; i < phl_ary_size - 2; i++)
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "%-5d: %s\n",
(int)i, phl_dbg_core_cmd_i[i + 2].name);
}
break;
case PHL_DBG_CORE_GIT_INFO:
{
phl_dbg_git_info(phl_info, input, input_num, output, out_len);
}
break;
default:
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[DBG] Do not support this command\n");
break;
}
}
s32
phl_dbg_core_proc_cmd(struct phl_info_t *phl_info,
char *input, char *output, u32 out_len)
{
char *token;
u32 argc = 0;
char argv[MAX_ARGC][MAX_ARGV];
do {
token = _os_strsep(&input, ", ");
if (token) {
if (_os_strlen((u8 *)token) <= MAX_ARGV)
_os_strcpy(argv[argc], token);
argc++;
} else {
break;
}
} while (argc < MAX_ARGC);
if (argc == 1)
argv[0][_os_strlen((u8 *)argv[0])] = '\0';
phl_dbg_core_cmd_parser(phl_info, argv, argc, output, out_len);
return 0;
}
enum rtw_phl_status
rtw_phl_dbg_core_cmd(struct phl_info_t *phl_info,
struct rtw_proc_cmd *incmd,
char *output,
u32 out_len)
{
if (incmd->in_type == RTW_ARG_TYPE_BUF) {
phl_dbg_core_proc_cmd(phl_info, incmd->in.buf, output, out_len);
} else if(incmd->in_type == RTW_ARG_TYPE_ARRAY){
phl_dbg_core_cmd_parser(phl_info, incmd->in.vector,
incmd->in_cnt_len, output, out_len);
}
return RTW_PHL_STATUS_SUCCESS;
}
#ifdef CONFIG_PHL_TEST_SUITE
bool
_is_hex_digit(char ch_tmp)
{
if( (ch_tmp >= '0' && ch_tmp <= '9') ||
(ch_tmp >= 'a' && ch_tmp <= 'f') ||
(ch_tmp >= 'A' && ch_tmp <= 'F') ) {
return true;
} else {
return false;
}
}
u32
_map_char_to_hex_digit(char ch_tmp)
{
if(ch_tmp >= '0' && ch_tmp <= '9')
return (ch_tmp - '0');
else if(ch_tmp >= 'a' && ch_tmp <= 'f')
return (10 + (ch_tmp - 'a'));
else if(ch_tmp >= 'A' && ch_tmp <= 'F')
return (10 + (ch_tmp - 'A'));
else
return 0;
}
bool
_get_hex_from_string(char *szstr, u32 *val)
{
char *sz_scan = szstr;
/* Check input parameter.*/
if (szstr == NULL || val == NULL) {
PHL_TRACE(COMP_PHL_DBG, _PHL_WARNING_,
"_get_hex_from_string(): Invalid inpur argumetns! szStr: %p, pu4bVal: %p \n",
szstr, val);
return false;
}
/* Initialize output. */
*val = 0;
/* Skip leading space. */
while(*sz_scan != '\0' && (*sz_scan == ' ' || *sz_scan == '\t')) {
sz_scan++;
}
/* Skip leading '0x' or '0X'. */
if (*sz_scan == '0' && (*(sz_scan+1) == 'x' || *(sz_scan+1) == 'X')) {
sz_scan += 2;
}
if (!_is_hex_digit(*sz_scan)) {
return false;
}
do {
(*val) <<= 4;
*val += _map_char_to_hex_digit(*sz_scan);
sz_scan++;
} while (_is_hex_digit(*sz_scan));
return true;
}
void
_phl_dbg_cmd_switch_chbw(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
u32 band = 0;
u32 bw = 0;
u32 offset = 0;
u32 ch = 36;
u32 used = 0;
struct rtw_chan_def chdef = {0};
do {
if (input_num < 5){
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"\n[DBG] echo phl set_ch [band(0,1)] [ch(hex)] [bw(0,1,2,3)] [offset(0,1,2,3)]\n");
break;
}
if (!_get_hex_from_string(input[1], &band))
break;
if (band > 1)
break;
if (!_get_hex_from_string(input[2], &ch))
break;
if (!_get_hex_from_string(input[3], &bw))
break;
if (!_get_hex_from_string(input[4], &offset))
break;
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"\n[DBG] PHL_DBG_SET_CH_BW ==> band = %d\n",
(int)band);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"[DBG] PHL_DBG_SET_CH_BW ==> ch = %d\n",
(int)ch);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"[DBG] PHL_DBG_SET_CH_BW ==> bw = %d\n",
(int)bw);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"[DBG] PHL_DBG_SET_CH_BW ==> offset = %d\n",
(int)offset);
chdef.chan = (u8)ch;
chdef.band = rtw_phl_get_band_type(chdef.chan);
chdef.bw = (enum channel_width)bw;
chdef.offset = (enum chan_offset)offset;
rtw_hal_set_ch_bw(phl_info->hal, (u8)band, &chdef, false);
} while (0);
}
void _dump_wifi_role(struct phl_info_t *phl_info, char *output, u32 out_len)
{
struct rtw_wifi_role_t *wrole = NULL;
struct rtw_phl_stainfo_t *sta_info = NULL;
u32 used = 0;
u8 j = 0;
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"==> PHL_DBG_DUMP_WROLE CH/BW information\n");
for( j = 0; j < MAX_WIFI_ROLE_NUMBER; j++) {
wrole = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, j);
if (NULL == wrole)
continue;
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole idx = 0x%x \n", j);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->type = 0x%x \n",
wrole->type);
/* debug_dump_mac_addr(wrole->mac_addr); */
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->chandef.bw = 0x%x \n",
wrole->chandef.bw);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->chandef.band = 0x%x \n",
wrole->chandef.band);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->chandef.center_ch = 0x%x \n",
wrole->chandef.center_ch);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->chandef.chan = 0x%x \n",
wrole->chandef.chan);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->chandef.center_freq1 = %u \n",
(int)wrole->chandef.center_freq1);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->chandef.center_freq2 = %u \n",
(int)wrole->chandef.center_freq2);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "wrole->chandef.offset = 0x%x \n",
wrole->chandef.offset);
sta_info = rtw_phl_get_stainfo_self(phl_info, wrole);
if (NULL == sta_info)
continue;
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "sta_info->macid = 0x%x \n",
sta_info->macid);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "sta_info->aid = 0x%x \n",
sta_info->aid);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "mac_addr : %02x-%02x-%02x-%02x-%02x-%02x- \n",
sta_info->mac_addr[0], sta_info->mac_addr[1],
sta_info->mac_addr[2], sta_info->mac_addr[3],
sta_info->mac_addr[4], sta_info->mac_addr[5]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "sta_info->wmode = 0x%x \n",
sta_info->wmode);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "-----------------------------\n");
}
}
void _dump_rx_rate(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
u32 ctrl = 0;
u32 used = 0;
struct rtw_stats *rx_stat = &phl_info->phl_com->phl_stats;
if(input_num < 2)
return;
_get_hex_from_string(input[1], &ctrl);
if (ctrl == 2) {
/*TODO: Clear Counter*/
return;
}
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "\nOFDM 6M = %d ; OFDM 24M = %d ; OFDM 54M = %d\n",
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_OFDM6],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_OFDM24],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_OFDM54]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "VHT 1SS\
\nMCS0 = %d ; MCS1 = %d ; MCS2 = %d ;\
\nMCS3 = %d ; MCS4 = %d ; MCS5 = %d ;\
\nMCS6 = %d ; MCS7 = %d ; MCS8 = %d ;\
\nMCS9 = %d ;\n",
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS0],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS1],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS2],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS3],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS4],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS5],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS6],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS7],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS8],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS1_MCS9]
);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "VHT 2SS\
\nMCS0 = %d ; MCS1 = %d ; MCS2 = %d ;\
\nMCS3 = %d ; MCS4 = %d ; MCS5 = %d ;\
\nMCS6 = %d ; MCS7 = %d ; MCS8 = %d ;\
\nMCS9 = %d ;\n",
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS0],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS1],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS2],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS3],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS4],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS5],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS6],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS7],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS8],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_VHT_NSS2_MCS9]
);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "HE 1SS\
\nMCS0 = %d ; MCS1 = %d ; MCS2 = %d ;\
\nMCS3 = %d ; MCS4 = %d ; MCS5 = %d ;\
\nMCS6 = %d ; MCS7 = %d ; MCS8 = %d ;\
\nMCS9 = %d ; MCS10 = %d ; MCS11 = %d;\n",
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS0],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS1],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS2],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS3],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS4],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS5],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS6],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS7],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS8],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS9],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS10],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS1_MCS11]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "HE 2SS\
\nMCS0 = %d ; MCS1 = %d ; MCS2 = %d ;\
\nMCS3 = %d ; MCS4 = %d ; MCS5 = %d ;\
\nMCS6 = %d ; MCS7 = %d ; MCS8 = %d ;\
\nMCS9 = %d ; MCS10 = %d ; MCS11 = %d ;\n",
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS0],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS1],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS2],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS3],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS4],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS5],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS6],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS7],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS8],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS9],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS10],
(int)rx_stat->rx_rate_nmr[RTW_DATA_RATE_HE_NSS2_MCS11]
);
}
static const char *_get_mac_pwr_st_str(enum rtw_mac_pwr_st st)
{
switch (st) {
case RTW_MAC_PWR_OFF:
return "off";
case RTW_MAC_PWR_ON:
return "on";
case RTW_MAC_PWR_LPS:
return "lps";
default:
return "n/a";
}
}
static const char *_get_wow_opmode_str(enum rtw_wow_op_mode mode)
{
switch (mode) {
case RTW_WOW_OP_PWR_DOWN:
return "power down";
case RTW_WOW_OP_DISCONNECT_STBY:
return "disconnected standby";
case RTW_WOW_OP_CONNECT_STBY:
return "connected standby";
default:
return "n/a";
}
}
void _dump_wow_stats(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
#ifdef CONFIG_WOWLAN
struct phl_wow_info *wow_info = phl_to_wow_info(phl_info);
struct phl_wow_stat *wow_stat = &wow_info->wow_stat;
u32 used = 0;
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"\n%-20s : op_mode = %s, func_en = %s, mac pwr = %s, wake_rsn = %s\
\n%-20s : keep_alive_en = %d, disc_det_en = %d, arp_en = %d, ndp_en = %d, gtk_en = %d, dot11w_en = %d\
\n%-20s : init err = 0x%x, deinit err = 0x%x\
\n%-20s : aoac_rpt_fail_cnt = 0x%x\n",
"[wow information]",
_get_wow_opmode_str(wow_stat->op_mode), (wow_stat->func_en == 1 ? "yes" : "no"),
_get_mac_pwr_st_str(wow_stat->mac_pwr), rtw_phl_get_wow_rsn_str(phl_info, wow_stat->wake_rsn),
"[wow function]",
wow_stat->keep_alive_en, wow_stat->disc_det_en, wow_stat->arp_en, wow_stat->ndp_en, wow_stat->gtk_en, wow_stat->dot11w_en,
"[wow error]",
wow_stat->err.init, wow_stat->err.deinit,
"[wow aoac]",
wow_stat->aoac_rpt_fail_cnt);
#endif /* CONFIG_WOWLAN */
}
#ifdef CONFIG_MCC_SUPPORT
void _dump_mcc_info(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
bool get_ok = false;
struct rtw_phl_mcc_en_info en_info = {0};
enum rtw_phl_tdmra_wmode mcc_mode;
enum rtw_phl_mcc_state state;
enum rtw_phl_mcc_coex_mode coex_mode;
struct rtw_phl_mcc_bt_info bt_info = {0};
struct rtw_phl_mcc_role *mrole = NULL;
struct rtw_chan_def *chdef = NULL;
struct rtw_phl_mcc_dur_info *dur_i = NULL;
struct rtw_phl_mcc_pattern *m_pattern = NULL;
struct rtw_phl_mcc_dbg_slot_info *dbg_slot_i = NULL;
u32 used = 0;
u8 i = 0;
get_ok = rtw_phl_mcc_get_dbg_info(phl_info, 0, MCC_DBG_STATE, &state);
if (false == get_ok) {
PHL_TRACE(COMP_PHL_MCC, _PHL_ERR_, "_dump_mcc_info(): get MCC_DBG_STATE fail\n");
goto exit;
}
get_ok = rtw_phl_mcc_get_dbg_info(phl_info, 0, MCC_DBG_OP_MODE, &mcc_mode);
if (false == get_ok) {
PHL_TRACE(COMP_PHL_MCC, _PHL_ERR_, "_dump_mcc_info(): get MCC_DBG_OP_MODE fail\n");
goto exit;
}
get_ok = rtw_phl_mcc_get_dbg_info(phl_info, 0, MCC_DBG_COEX_MODE, &coex_mode);
if (false == get_ok) {
PHL_TRACE(COMP_PHL_MCC, _PHL_ERR_, "_dump_mcc_info(): get MCC_DBG_COEX_MODE fail\n");
goto exit;
}
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "\n======== MCC Info ========\n");
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "MCC Info: State(%s, %d), Mode(%s, %d), Coex(%s, %d)\n",
((state == MCC_NONE) ? "None" :
((state == MCC_TRIGGER_FW_EN) ? "Trig_Fw_En" :
((state == MCC_FW_EN_FAIL) ? "Fw_En_Fail" :
((state == MCC_RUNING) ? "Runing" :
((state == MCC_TRIGGER_FW_DIS) ? "Trig_Fw_Dis" :
((state == MCC_FW_DIS_FAIL) ? "Fw_Dis_Fail" :
((state == MCC_STOP) ? "Fw_Stop" : "Unknown"))))))),
state,
((mcc_mode == RTW_PHL_TDMRA_WMODE_NONE) ? "None" :
((mcc_mode == RTW_PHL_TDMRA_AP_CLIENT_WMODE) ? "AP_Client" :
((mcc_mode == RTW_PHL_TDMRA_2CLIENTS_WMODE) ? "2Clients" :
((mcc_mode == RTW_PHL_TDMRA_AP_WMODE) ? "AP" : "Unknown")))),
mcc_mode,
((coex_mode == RTW_PHL_MCC_COEX_MODE_NONE) ? "None" :
((coex_mode == RTW_PHL_MCC_COEX_MODE_BT_MASTER) ? "BT_M" :
((coex_mode == RTW_PHL_MCC_COEX_MODE_WIFI_MASTER) ? "Wifi_M" :
((coex_mode == RTW_PHL_MCC_COEX_MODE_BT_WIFI_BALANCE) ? "Balance" : "Unknown")))),
coex_mode);
get_ok = rtw_phl_mcc_get_dbg_info(phl_info, 0, MCC_DBG_BT_INFO, &bt_info);
if (false == get_ok) {
PHL_TRACE(COMP_PHL_MCC, _PHL_ERR_, "_dump_mcc_info(): get MCC_DBG_BT_INFO fail\n");
goto exit;
}
if (bt_info.bt_seg_num <= BT_SEG_NUM) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "MCC Info: Bt_dur(%d), Add_Bt_Role(%d), Seg_Num(%d), bt_seg[0](%d), bt_seg[1](%d)\n",
bt_info.bt_dur, bt_info.add_bt_role,
bt_info.bt_seg_num, bt_info.bt_seg[0],
bt_info.bt_seg[1]);
}
get_ok = rtw_phl_mcc_get_dbg_info(phl_info, 0, MCC_DBG_EN_INFO, &en_info);
if (false == get_ok) {
PHL_TRACE(COMP_PHL_MCC, _PHL_ERR_, "_dump_mcc_info(): get MCC_DBG_EN_INFO fail\n");
goto exit;
}
m_pattern = &en_info.m_pattern;
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "MCC Info: mcc_intvl(%d), Start_tsf(0x%04x%04x %04x%04x), bcns_offset(%d), tob_r(%d), toa_r(%d), tob_a(%d), toa_a(%d)\n",
en_info.mcc_intvl, (u16)(en_info.tsf_high >> 16),
(u16)(en_info.tsf_high),
(u16)(en_info.tsf_low >> 16),
(u16)(en_info.tsf_low), m_pattern->bcns_offset,
m_pattern->tob_r, m_pattern->toa_r,
m_pattern->tob_a, m_pattern->toa_a);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "\n======== MCC Role Info ========\n");
for (i = 0; i < en_info.mrole_num; i++) {
mrole = &en_info.mcc_role[i];
chdef = mrole->chandef;
dur_i = &mrole->policy.dur_info;
if (NULL == chdef)
break;
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "MCC Info: Role(%d): macid(0x%x), Bcn_intvl(%d), band(%d), chan(%d), center_ch(%d), bw(%d), offset(%d)\n",
i, mrole->macid, mrole->bcn_intvl, chdef->band,
chdef->chan, chdef->center_ch, chdef->bw,
chdef->offset);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "MCC Info: Role(%d): dur(0x%x), lim_en(%d), tag(%d), max_dur(%d), max_toa(%d), max_tob(%d)\n\n",
i, dur_i->dur, dur_i->dur_limit.enable,
dur_i->dur_limit.tag, dur_i->dur_limit.max_dur,
dur_i->dur_limit.max_toa,
dur_i->dur_limit.max_tob);
}
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "======== Hal MCC Info ========\n");
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "MCC Info: btc_in_group(%d)\n",
en_info.dbg_hal_i.btc_in_group);
for (i = 0; i < en_info.dbg_hal_i.slot_num; i++) {
dbg_slot_i = &en_info.dbg_hal_i.dbg_slot_i[i];
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "MCC Info: FW Slot(%d), BT_Role(%d), Dur(%d), Ch(%d), Macid(0x%x)\n",
i, dbg_slot_i->bt_role, dbg_slot_i->dur,
dbg_slot_i->ch, dbg_slot_i->macid);
}
exit:
return;
}
#endif
void phl_dbg_cmd_snd(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
u32 role_idx;
u32 ctrl;
u32 used = 0;
if (input_num < 2)
return;
_get_hex_from_string(input[1], &ctrl);
_get_hex_from_string(input[2], &role_idx);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "ctrl 0x%x with role_idx 0x%x!!\n",
(int)ctrl, (int)role_idx);
if (1 == ctrl) {
rtw_phl_sound_start(phl_info, (u8)role_idx, 0, 200,
PHL_SND_TEST_F_ONE_TIME |
PHL_SND_TEST_F_PASS_STS_CHK);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "SOUND START(once) : wrole %d !!\n", (int)role_idx);
} else if (2 == ctrl) {
rtw_phl_sound_abort(phl_info);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "SOUND ABORT!!\n");
} else if (3 == ctrl) {
rtw_phl_sound_start(phl_info, (u8)role_idx, 0, 200,
PHL_SND_TEST_F_PASS_STS_CHK);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "SOUND START(loop) : wrole %d !!\n", (int)role_idx);
} else if(9 == ctrl) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "DUMP BF Entry in debugview\n");
rtw_hal_bf_dbg_dump_entry_all(phl_info->hal);
} else {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "SOUND TEST CMD not found!\n");
}
}
void _convert_tx_rate(enum hal_rate_mode mode, u8 mcs_ss_idx, char *str, u32 str_len)
{
switch (mode) {
case HAL_LEGACY_MODE:
switch (mcs_ss_idx) {
case RTW_DATA_RATE_CCK1: _os_snprintf(str, str_len,"CCK 1"); break;
case RTW_DATA_RATE_CCK2: _os_snprintf(str, str_len,"CCK 2"); break;
case RTW_DATA_RATE_CCK5_5: _os_snprintf(str, str_len,"CCK 5_5"); break;
case RTW_DATA_RATE_CCK11: _os_snprintf(str, str_len,"CCK 11"); break;
case RTW_DATA_RATE_OFDM6: _os_snprintf(str, str_len,"OFDM 6"); break;
case RTW_DATA_RATE_OFDM9: _os_snprintf(str, str_len,"OFDM 9"); break;
case RTW_DATA_RATE_OFDM12: _os_snprintf(str, str_len,"OFDM 12"); break;
case RTW_DATA_RATE_OFDM18: _os_snprintf(str, str_len,"OFDM 18"); break;
case RTW_DATA_RATE_OFDM24: _os_snprintf(str, str_len,"OFDM 24"); break;
case RTW_DATA_RATE_OFDM36: _os_snprintf(str, str_len,"OFDM 36"); break;
case RTW_DATA_RATE_OFDM48: _os_snprintf(str, str_len,"OFDM 48"); break;
case RTW_DATA_RATE_OFDM54: _os_snprintf(str, str_len,"OFDM 54"); break;
default:
_os_snprintf(str, str_len,"Unkown rate(0x%01x)", mcs_ss_idx);
break;
}
break;
case HAL_HT_MODE:
_os_snprintf(str, str_len,"MCS%d", mcs_ss_idx);
break;
case HAL_VHT_MODE:
case HAL_HE_MODE:
_os_snprintf(str, str_len,"%dSS MCS%d",
((mcs_ss_idx & 0x70)>> 4) + 1,
(mcs_ss_idx & 0x0F));
break;
default:
_os_snprintf(str, str_len,"Unknown mode(0x%01x)", mode);
break;
}
}
void _convert_rx_rate(u32 rx_rate, char *str, u32 str_len)
{
switch(rx_rate) {
case RTW_DATA_RATE_CCK1: _os_snprintf(str, str_len,"CCK 1"); break;
case RTW_DATA_RATE_CCK2: _os_snprintf(str, str_len,"CCK 2"); break;
case RTW_DATA_RATE_CCK5_5: _os_snprintf(str, str_len,"CCK 5_5"); break;
case RTW_DATA_RATE_CCK11: _os_snprintf(str, str_len,"CCK 11"); break;
case RTW_DATA_RATE_OFDM6: _os_snprintf(str, str_len,"OFDM 6"); break;
case RTW_DATA_RATE_OFDM9: _os_snprintf(str, str_len,"OFDM 9"); break;
case RTW_DATA_RATE_OFDM12: _os_snprintf(str, str_len,"OFDM 12"); break;
case RTW_DATA_RATE_OFDM18: _os_snprintf(str, str_len,"OFDM 18"); break;
case RTW_DATA_RATE_OFDM24: _os_snprintf(str, str_len,"OFDM 24"); break;
case RTW_DATA_RATE_OFDM36: _os_snprintf(str, str_len,"OFDM 36"); break;
case RTW_DATA_RATE_OFDM48: _os_snprintf(str, str_len,"OFDM 48"); break;
case RTW_DATA_RATE_OFDM54: _os_snprintf(str, str_len,"OFDM 54"); break;
case RTW_DATA_RATE_MCS0: _os_snprintf(str, str_len,"MCS 0"); break;
case RTW_DATA_RATE_MCS1: _os_snprintf(str, str_len,"MCS 1"); break;
case RTW_DATA_RATE_MCS2: _os_snprintf(str, str_len,"MCS 2"); break;
case RTW_DATA_RATE_MCS3: _os_snprintf(str, str_len,"MCS 3"); break;
case RTW_DATA_RATE_MCS4: _os_snprintf(str, str_len,"MCS 4"); break;
case RTW_DATA_RATE_MCS5: _os_snprintf(str, str_len,"MCS 5"); break;
case RTW_DATA_RATE_MCS6: _os_snprintf(str, str_len,"MCS 6"); break;
case RTW_DATA_RATE_MCS7: _os_snprintf(str, str_len,"MCS 7"); break;
case RTW_DATA_RATE_MCS8: _os_snprintf(str, str_len,"MCS 8"); break;
case RTW_DATA_RATE_MCS9: _os_snprintf(str, str_len,"MCS 9"); break;
case RTW_DATA_RATE_MCS10: _os_snprintf(str, str_len,"MCS 10"); break;
case RTW_DATA_RATE_MCS11: _os_snprintf(str, str_len,"MCS 11"); break;
case RTW_DATA_RATE_MCS12: _os_snprintf(str, str_len,"MCS 12"); break;
case RTW_DATA_RATE_MCS13: _os_snprintf(str, str_len,"MCS 13"); break;
case RTW_DATA_RATE_MCS14: _os_snprintf(str, str_len,"MCS 14"); break;
case RTW_DATA_RATE_MCS15: _os_snprintf(str, str_len,"MCS 15"); break;
case RTW_DATA_RATE_MCS16: _os_snprintf(str, str_len,"MCS 16"); break;
case RTW_DATA_RATE_MCS17: _os_snprintf(str, str_len,"MCS 17"); break;
case RTW_DATA_RATE_MCS18: _os_snprintf(str, str_len,"MCS 18"); break;
case RTW_DATA_RATE_MCS19: _os_snprintf(str, str_len,"MCS 19"); break;
case RTW_DATA_RATE_MCS20: _os_snprintf(str, str_len,"MCS 20"); break;
case RTW_DATA_RATE_MCS21: _os_snprintf(str, str_len,"MCS 21"); break;
case RTW_DATA_RATE_MCS22: _os_snprintf(str, str_len,"MCS 22"); break;
case RTW_DATA_RATE_MCS23: _os_snprintf(str, str_len,"MCS 23"); break;
case RTW_DATA_RATE_MCS24: _os_snprintf(str, str_len,"MCS 24"); break;
case RTW_DATA_RATE_MCS25: _os_snprintf(str, str_len,"MCS 25"); break;
case RTW_DATA_RATE_MCS26: _os_snprintf(str, str_len,"MCS 26"); break;
case RTW_DATA_RATE_MCS27: _os_snprintf(str, str_len,"MCS 27"); break;
case RTW_DATA_RATE_MCS28: _os_snprintf(str, str_len,"MCS 28"); break;
case RTW_DATA_RATE_MCS29: _os_snprintf(str, str_len,"MCS 29"); break;
case RTW_DATA_RATE_MCS30: _os_snprintf(str, str_len,"MCS 30"); break;
case RTW_DATA_RATE_MCS31: _os_snprintf(str, str_len,"MCS 31"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS0: _os_snprintf(str, str_len,"NSS1_MCS0"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS1: _os_snprintf(str, str_len,"NSS1_MCS1"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS2: _os_snprintf(str, str_len,"NSS1_MCS2"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS3: _os_snprintf(str, str_len,"NSS1_MCS3"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS4: _os_snprintf(str, str_len,"NSS1_MCS4"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS5: _os_snprintf(str, str_len,"NSS1_MCS5"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS6: _os_snprintf(str, str_len,"NSS1_MCS6"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS7: _os_snprintf(str, str_len,"NSS1_MCS7"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS8: _os_snprintf(str, str_len,"NSS1_MCS8"); break;
case RTW_DATA_RATE_VHT_NSS1_MCS9: _os_snprintf(str, str_len,"NSS1_MCS9"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS0: _os_snprintf(str, str_len,"NSS2_MCS0"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS1: _os_snprintf(str, str_len,"NSS2_MCS1"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS2: _os_snprintf(str, str_len,"NSS2_MCS2"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS3: _os_snprintf(str, str_len,"NSS2_MCS3"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS4: _os_snprintf(str, str_len,"NSS2_MCS4"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS5: _os_snprintf(str, str_len,"NSS2_MCS5"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS6: _os_snprintf(str, str_len,"NSS2_MCS6"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS7: _os_snprintf(str, str_len,"NSS2_MCS7"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS8: _os_snprintf(str, str_len,"NSS2_MCS8"); break;
case RTW_DATA_RATE_VHT_NSS2_MCS9: _os_snprintf(str, str_len,"NSS2_MCS9"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS0: _os_snprintf(str, str_len,"NSS3_MCS0"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS1: _os_snprintf(str, str_len,"NSS3_MCS1"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS2: _os_snprintf(str, str_len,"NSS3_MCS2"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS3: _os_snprintf(str, str_len,"NSS3_MCS3"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS4: _os_snprintf(str, str_len,"NSS3_MCS4"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS5: _os_snprintf(str, str_len,"NSS3_MCS5"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS6: _os_snprintf(str, str_len,"NSS3_MCS6"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS7: _os_snprintf(str, str_len,"NSS3_MCS7"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS8: _os_snprintf(str, str_len,"NSS3_MCS8"); break;
case RTW_DATA_RATE_VHT_NSS3_MCS9: _os_snprintf(str, str_len,"NSS3_MCS9"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS0: _os_snprintf(str, str_len,"NSS4_MCS0"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS1: _os_snprintf(str, str_len,"NSS4_MCS1"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS2: _os_snprintf(str, str_len,"NSS4_MCS2"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS3: _os_snprintf(str, str_len,"NSS4_MCS3"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS4: _os_snprintf(str, str_len,"NSS4_MCS4"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS5: _os_snprintf(str, str_len,"NSS4_MCS5"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS6: _os_snprintf(str, str_len,"NSS4_MCS6"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS7: _os_snprintf(str, str_len,"NSS4_MCS7"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS8: _os_snprintf(str, str_len,"NSS4_MCS8"); break;
case RTW_DATA_RATE_VHT_NSS4_MCS9: _os_snprintf(str, str_len,"NSS4_MCS9"); break;
case RTW_DATA_RATE_HE_NSS1_MCS0: _os_snprintf(str, str_len,"HE_NSS1_MCS0"); break;
case RTW_DATA_RATE_HE_NSS1_MCS1: _os_snprintf(str, str_len,"HE_NSS1_MCS1"); break;
case RTW_DATA_RATE_HE_NSS1_MCS2: _os_snprintf(str, str_len,"HE_NSS1_MCS2"); break;
case RTW_DATA_RATE_HE_NSS1_MCS3: _os_snprintf(str, str_len,"HE_NSS1_MCS3"); break;
case RTW_DATA_RATE_HE_NSS1_MCS4: _os_snprintf(str, str_len,"HE_NSS1_MCS4"); break;
case RTW_DATA_RATE_HE_NSS1_MCS5: _os_snprintf(str, str_len,"HE_NSS1_MCS5"); break;
case RTW_DATA_RATE_HE_NSS1_MCS6: _os_snprintf(str, str_len,"HE_NSS1_MCS6"); break;
case RTW_DATA_RATE_HE_NSS1_MCS7: _os_snprintf(str, str_len,"HE_NSS1_MCS7"); break;
case RTW_DATA_RATE_HE_NSS1_MCS8: _os_snprintf(str, str_len,"HE_NSS1_MCS8"); break;
case RTW_DATA_RATE_HE_NSS1_MCS9: _os_snprintf(str, str_len,"HE_NSS1_MCS9"); break;
case RTW_DATA_RATE_HE_NSS1_MCS10: _os_snprintf(str, str_len,"HE_NSS1_MCS10"); break;
case RTW_DATA_RATE_HE_NSS1_MCS11: _os_snprintf(str, str_len,"HE_NSS1_MCS11"); break;
case RTW_DATA_RATE_HE_NSS2_MCS0: _os_snprintf(str, str_len,"HE_NSS2_MCS0"); break;
case RTW_DATA_RATE_HE_NSS2_MCS1: _os_snprintf(str, str_len,"HE_NSS2_MCS1"); break;
case RTW_DATA_RATE_HE_NSS2_MCS2: _os_snprintf(str, str_len,"HE_NSS2_MCS2"); break;
case RTW_DATA_RATE_HE_NSS2_MCS3: _os_snprintf(str, str_len,"HE_NSS2_MCS3"); break;
case RTW_DATA_RATE_HE_NSS2_MCS4: _os_snprintf(str, str_len,"HE_NSS2_MCS4"); break;
case RTW_DATA_RATE_HE_NSS2_MCS5: _os_snprintf(str, str_len,"HE_NSS2_MCS5"); break;
case RTW_DATA_RATE_HE_NSS2_MCS6: _os_snprintf(str, str_len,"HE_NSS2_MCS6"); break;
case RTW_DATA_RATE_HE_NSS2_MCS7: _os_snprintf(str, str_len,"HE_NSS2_MCS7"); break;
case RTW_DATA_RATE_HE_NSS2_MCS8: _os_snprintf(str, str_len,"HE_NSS2_MCS8"); break;
case RTW_DATA_RATE_HE_NSS2_MCS9: _os_snprintf(str, str_len,"HE_NSS2_MCS9"); break;
case RTW_DATA_RATE_HE_NSS2_MCS10: _os_snprintf(str, str_len,"HE_NSS2_MCS10"); break;
case RTW_DATA_RATE_HE_NSS2_MCS11: _os_snprintf(str, str_len,"HE_NSS2_MCS11"); break;
case RTW_DATA_RATE_HE_NSS3_MCS0: _os_snprintf(str, str_len,"HE_NSS3_MCS0"); break;
case RTW_DATA_RATE_HE_NSS3_MCS1: _os_snprintf(str, str_len,"HE_NSS3_MCS1"); break;
case RTW_DATA_RATE_HE_NSS3_MCS2: _os_snprintf(str, str_len,"HE_NSS3_MCS2"); break;
case RTW_DATA_RATE_HE_NSS3_MCS3: _os_snprintf(str, str_len,"HE_NSS3_MCS3"); break;
case RTW_DATA_RATE_HE_NSS3_MCS4: _os_snprintf(str, str_len,"HE_NSS3_MCS4"); break;
case RTW_DATA_RATE_HE_NSS3_MCS5: _os_snprintf(str, str_len,"HE_NSS3_MCS5"); break;
case RTW_DATA_RATE_HE_NSS3_MCS6: _os_snprintf(str, str_len,"HE_NSS3_MCS6"); break;
case RTW_DATA_RATE_HE_NSS3_MCS7: _os_snprintf(str, str_len,"HE_NSS3_MCS7"); break;
case RTW_DATA_RATE_HE_NSS3_MCS8: _os_snprintf(str, str_len,"HE_NSS3_MCS8"); break;
case RTW_DATA_RATE_HE_NSS3_MCS9: _os_snprintf(str, str_len,"HE_NSS3_MCS9"); break;
case RTW_DATA_RATE_HE_NSS3_MCS10: _os_snprintf(str, str_len,"HE_NSS3_MCS10"); break;
case RTW_DATA_RATE_HE_NSS3_MCS11: _os_snprintf(str, str_len,"HE_NSS3_MCS11"); break;
case RTW_DATA_RATE_HE_NSS4_MCS0: _os_snprintf(str, str_len,"HE_NSS4_MCS0"); break;
case RTW_DATA_RATE_HE_NSS4_MCS1: _os_snprintf(str, str_len,"HE_NSS4_MCS1"); break;
case RTW_DATA_RATE_HE_NSS4_MCS2: _os_snprintf(str, str_len,"HE_NSS4_MCS2"); break;
case RTW_DATA_RATE_HE_NSS4_MCS3: _os_snprintf(str, str_len,"HE_NSS4_MCS3"); break;
case RTW_DATA_RATE_HE_NSS4_MCS4: _os_snprintf(str, str_len,"HE_NSS4_MCS4"); break;
case RTW_DATA_RATE_HE_NSS4_MCS5: _os_snprintf(str, str_len,"HE_NSS4_MCS5"); break;
case RTW_DATA_RATE_HE_NSS4_MCS6: _os_snprintf(str, str_len,"HE_NSS4_MCS6"); break;
case RTW_DATA_RATE_HE_NSS4_MCS7: _os_snprintf(str, str_len,"HE_NSS4_MCS7"); break;
case RTW_DATA_RATE_HE_NSS4_MCS8: _os_snprintf(str, str_len,"HE_NSS4_MCS8"); break;
case RTW_DATA_RATE_HE_NSS4_MCS9: _os_snprintf(str, str_len,"HE_NSS4_MCS9"); break;
case RTW_DATA_RATE_HE_NSS4_MCS10: _os_snprintf(str, str_len,"HE_NSS4_MCS10"); break;
case RTW_DATA_RATE_HE_NSS4_MCS11: _os_snprintf(str, str_len,"HE_NSS4_MCS11"); break;
case RTW_DATA_RATE_MAX: _os_snprintf(str, str_len,"RATE_MAX"); break;
default:
_os_snprintf(str, str_len,"Unknown rate(0x%01x)", (unsigned int)rx_rate);
break;
}
}
void phl_dbg_cmd_asoc_sta(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
u32 ctrl = 0, wrole_idx = 0;
u32 used = 0;
struct rtw_wifi_role_t *wrole = NULL;
struct rtw_phl_stainfo_t *n, *psta;
void *drv = phl_to_drvpriv(phl_info);
char tx_rate_str[32] = {0};
char rx_rate_str[32] = {0};
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "\nDUMP Associate STA infomations\n");
if(input_num < 2) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "phl asoc_sta [wrole index] [1=dump list basic information]\n");
return;
}
_get_hex_from_string(input[1], &ctrl);
_get_hex_from_string(input[2], &wrole_idx);
if (wrole_idx >= MAX_WIFI_ROLE_NUMBER) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "Wrole Index shall < 5\n");
return;
}
wrole = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, (u8)wrole_idx);
if (1 == ctrl) {
_os_spinlock(drv, &wrole->assoc_sta_queue.lock, _bh, NULL);
phl_list_for_loop_safe(psta, n, struct rtw_phl_stainfo_t,
&wrole->assoc_sta_queue.queue, list) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "\nmac_id 0x%x ; aid 0x%x ; mac addr %02x-%02x-%02x-%02x-%02x-%02x ; AX_Support %d\n",
(int)psta->macid, (int)psta->aid,
psta->mac_addr[0], psta->mac_addr[1],
psta->mac_addr[2], psta->mac_addr[3],
psta->mac_addr[4], psta->mac_addr[5],
(psta->wmode&WLAN_MD_11AX) ? 1 : 0);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "WROLE-IDX:%d wlan_mode:0x%02x, chan:%d, bw%d\n",
psta->wrole->id, psta->wmode, psta->chandef.chan, psta->chandef.bw);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[Stats] Tput -[Tx:%d KBits Rx :%d KBits]\n",
(int)psta->stats.tx_tp_kbits, (int)psta->stats.rx_tp_kbits);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[Stats] RSSI:-%d(dBm)\n",
PHL_MAX_RSSI - psta->hal_sta->rssi_stat.ma_rssi);
_convert_tx_rate( psta->hal_sta->ra_info.rpt_rt_i.mode,
psta->hal_sta->ra_info.rpt_rt_i.mcs_ss_idx,
tx_rate_str, 32);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[Stats] Tx Rate :%s\n",
tx_rate_str);
_convert_rx_rate(psta->stats.rx_rate, rx_rate_str, 32);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[Stats] Rx Rate :%s\n",
rx_rate_str);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[Stats] rx_ok_cnt:%d rx_err_cnt:%d\n",
(int)psta->hal_sta->trx_stat.rx_ok_cnt,
(int)psta->hal_sta->trx_stat.rx_err_cnt);
}
_os_spinunlock(drv, &wrole->assoc_sta_queue.lock, _bh, NULL);
}
}
#ifdef CONFIG_PCI_HCI
void _dbg_tx_stats_pcie(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len, u32 *used,
u32 ctrl, u32 ch)
{
struct hci_info_t *hci_info = (struct hci_info_t *)phl_info->hci;
struct rtw_hal_com_t *hal_com = rtw_hal_get_halcom(phl_info->hal);
struct rtw_wp_rpt_stats *rpt_stats = NULL;
rpt_stats = (struct rtw_wp_rpt_stats *)hal_com->trx_stat.wp_rpt_stats;
if (ch >= hci_info->total_txch_num) {
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"\n Invalid channel number\n");
return;
}
if (0xFF == ctrl) {
rpt_stats[ch].tx_ok_cnt = 0;
rpt_stats[ch].rty_fail_cnt = 0;
rpt_stats[ch].lifetime_drop_cnt = 0;
rpt_stats[ch].macid_drop_cnt = 0;
rpt_stats[ch].sw_drop_cnt = 0;
rpt_stats[ch].recycle_fail_cnt = 0;
rpt_stats[ch].delay_tx_ok_cnt = 0;
rpt_stats[ch].delay_rty_fail_cnt = 0;
rpt_stats[ch].delay_lifetime_drop_cnt = 0;
rpt_stats[ch].delay_macid_drop_cnt = 0;
return;
}
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"\n== wp report statistics == \n");
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"ch : %u\n", (int)ch);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"busy count : %u\n", (int)rpt_stats[ch].busy_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"ok count : %u\n", (int)rpt_stats[ch].tx_ok_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"retry fail count : %u\n",
(int)rpt_stats[ch].rty_fail_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"lifetime drop count : %u\n",
(int)rpt_stats[ch].lifetime_drop_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"macid drop count : %u\n",
(int)rpt_stats[ch].macid_drop_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"sw drop count : %u\n",
(int)rpt_stats[ch].sw_drop_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"recycle fail count : %u\n",
(int)rpt_stats[ch].recycle_fail_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"delay ok count : %u\n",
(int)rpt_stats[ch].delay_tx_ok_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"delay retry fail count : %u\n",
(int)rpt_stats[ch].delay_rty_fail_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"delay lifetime drop count : %u\n",
(int)rpt_stats[ch].delay_lifetime_drop_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"delay macid drop count : %u\n",
(int)rpt_stats[ch].delay_macid_drop_cnt);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"ltr tx delay count : %u\n",
(int)hal_com->trx_stat.ltr_tx_dly_count);
PHL_DBG_MON_INFO(out_len, *used, output + *used, out_len - *used,
"ltr last tx delay time : %u\n",
(int)hal_com->trx_stat.ltr_last_tx_dly_time);
}
#endif
void phl_dbg_ltr_stats(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
#ifdef CONFIG_PCI_HCI
u32 used = 0;
#ifdef RTW_WKARD_DYNAMIC_LTR
if (input_num == 3) {
if (0 == _os_strcmp(input[1], "set")) {
if (0 == _os_strcmp(input[2], "disable")) {
phl_ltr_hw_ctrl(phl_info->phl_com, false);
phl_ltr_sw_ctrl(phl_info->phl_com, phl_info->hal, false);
} else if (0 == _os_strcmp(input[2], "enable")) {
phl_ltr_hw_ctrl(phl_info->phl_com, true);
phl_ltr_sw_ctrl(phl_info->phl_com, phl_info->hal, true);
} else {
return;
}
}
return;
}
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"\nltr sw ctrl : %u\n",
rtw_hal_ltr_is_sw_ctrl(phl_info->phl_com, phl_info->hal) ? 1 : 0);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"ltr hw ctrl : %u\n",
rtw_hal_ltr_is_hw_ctrl(phl_info->phl_com, phl_info->hal) ? 1 : 0);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"ltr current state : %u\n",
phl_ltr_get_cur_state(phl_info->phl_com));
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"ltr last trigger time : %lu\n",
phl_ltr_get_last_trigger_time(phl_info->phl_com));
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"ltr active trigger cnt: %lu\n",
phl_ltr_get_tri_cnt(phl_info->phl_com, RTW_PCIE_LTR_SW_ACT));
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"ltr idle trigger cnt: %lu\n",
phl_ltr_get_tri_cnt(phl_info->phl_com, RTW_PCIE_LTR_SW_IDLE));
#else
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"Not Support Dynamical LTR\n");
#endif
#endif
}
void phl_dbg_trx_stats(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
struct rtw_phl_com_t *phl_com = phl_info->phl_com;
struct rtw_stats *phl_stats = &phl_com->phl_stats;
u32 used = 0;
u32 ctrl = 0;
u32 ch = 0;
if (input_num < 2) {
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"Invalid Input\n");
return;
}
_get_hex_from_string(input[1], &ch);
if (input_num == 3) {
_get_hex_from_string(input[2], &ctrl);
}
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"\nunicast tx bytes : %llu\n", phl_stats->tx_byte_uni);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"total tx bytes : %llu\n", phl_stats->tx_byte_total);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"tx throughput : %d(kbps)\n",
(int)phl_stats->tx_tp_kbits);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"last tx time : %d(ms)\n",
(int)phl_stats->last_tx_time_ms);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"tx request num to phl : %d\n",
(int)phl_stats->txreq_num);
#ifdef CONFIG_PCI_HCI
_dbg_tx_stats_pcie(phl_info, input, input_num, output, out_len, &used,
ctrl, ch);
#endif
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"\nunicast rx bytes : %llu\n", phl_stats->rx_byte_uni);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"total rx bytes : %llu\n", phl_stats->rx_byte_total);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"rx throughput : %d(kbps)\n",
(int)phl_stats->rx_tp_kbits);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"last rx time : %d(ms)\n",
(int)phl_stats->last_rx_time_ms);
}
void phl_dbg_cmd_show_rssi(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
u32 used = 0;
struct rtw_phl_rssi_stat *rssi_stat = NULL;
struct rtw_phl_stainfo_t *psta = NULL;
struct rtw_phl_com_t *phl_com = NULL;
u32 macid = 0;
if (NULL == phl_info)
return;
rssi_stat = &phl_info->phl_com->rssi_stat;
phl_com = phl_info->phl_com;
_os_spinlock(phl_com->drv_priv,
&(phl_com->rssi_stat.lock), _bh, NULL);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "\nShow Moving Average RSSI Statistics Informations\n");
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"DATA (A1 Match, AddrCam Valid) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_DATA_ACAM_A1M]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"DATA (A1 Not Match, AddrCam Valid) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_DATA_ACAM]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"DATA (other) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_DATA_OTHER]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"MGNT (A1 Match, AddrCam Valid) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_MGNT_ACAM_A1M]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"MGNT (A1 Not Match, AddrCam Valid) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_MGNT_ACAM]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"MGNT (other) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_MGNT_OTHER]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"CTRL (A1 Match, AddrCam Valid) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_CTRL_ACAM_A1M]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"CTRL (A1 Not Match, AddrCam Valid) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_CTRL_ACAM]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"CTRL (other) : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_CTRL_OTHER]);
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"Unknown : %d\n",
rssi_stat->ma_rssi[RTW_RSSI_UNKNOWN]);
_os_spinunlock(phl_com->drv_priv,
&(phl_com->rssi_stat.lock), _bh, NULL);
if(input_num > 1) {
_get_hex_from_string(input[1], &macid);
psta = rtw_phl_get_stainfo_by_macid(phl_info, (u16)macid);
if (psta != NULL) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used,
"STA macid : %d ; mv_avg_rssi = %d ; asoc_rssi = %d (bb : %d, %d)\n",
(int)macid, (int)psta->hal_sta->rssi_stat.ma_rssi,
(int)psta->hal_sta->rssi_stat.assoc_rssi,
(int)(psta->hal_sta->rssi_stat.rssi >> 1),
(int)(psta->hal_sta->rssi_stat.rssi_ma >> 5));
}
}
}
void phl_dbg_cmd_parser(struct phl_info_t *phl_info, char input[][MAX_ARGV],
u32 input_num, char *output, u32 out_len)
{
u8 id = 0;
u32 i;
u32 used = 0;
u32 phl_ary_size = sizeof(phl_dbg_cmd_i) /
sizeof(struct phl_dbg_cmd_info);
if (phl_ary_size == 0)
return;
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used, "\n");
/* Parsing Cmd ID */
if (input_num) {
for (i = 0; i < phl_ary_size; i++) {
if (_os_strcmp(phl_dbg_cmd_i[i].name, input[0]) == 0) {
id = phl_dbg_cmd_i[i].id;
PHL_DBG("[%s]===>\n", phl_dbg_cmd_i[i].name);
break;
}
}
if (i == phl_ary_size) {
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "PHL CMD not found!\n");
return;
}
}
switch (id) {
case PHL_DBG_MON_HELP:
{
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"phl_dbg_cmd_parser : PHL_DBG_MON_HELP \n");
for (i = 0; i < phl_ary_size - 2; i++)
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "%-5d: %s\n",
(int)i, phl_dbg_cmd_i[i + 2].name);
}
break;
case PHL_DBG_MON_TEST:
{
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] PHL_DBG_MON_TEST (SAMPLE) \n");
}
break;
case PHL_DBG_COMP:
{
u32 ctrl = 0, comp = 0;
u32 ret = 0;
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] PHL_DBG_COMP [1=set comp_bit, 2=clear comp_bit, 4=set value]\n");
if (input_num <= 2)
break;
_get_hex_from_string(input[1], &ctrl);
_get_hex_from_string(input[2], &comp);
ret = rtw_phl_dbg_ctrl_comp((u8)ctrl, comp);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] PHL_DBG_COMP (COMP = 0x%x) \n", (int)ret);
}
break;
case PHL_DBG_DUMP_WROLE:
{
_dump_wifi_role(phl_info, output, out_len);
}
break;
case PHL_DBG_SET_CH_BW:
{
_phl_dbg_cmd_switch_chbw(phl_info, input, input_num,
output, out_len);
}
break;
case PHL_DBG_SHOW_RX_RATE:
{
_dump_rx_rate(phl_info, input, input_num, output, out_len);
}
break;
case PHL_DBG_SOUND :
{
phl_dbg_cmd_snd(phl_info, input, input_num, output, out_len);
}
break;
case PHL_DBG_ASOC_STA:
{
phl_dbg_cmd_asoc_sta(phl_info, input, input_num, output, out_len);
}
break;
#ifdef CONFIG_FSM
case PHL_DBG_FSM:
{
phl_fsm_dbg(phl_info, input, input_num, output, out_len);
}
break;
#endif
case PHL_DBG_TRX_STATS:
{
phl_dbg_trx_stats(phl_info, input, input_num, output, out_len);
}
break;
case PHL_DBG_LTR:
{
phl_dbg_ltr_stats(phl_info, input, input_num, output, out_len);
}
break;
case PHL_SHOW_RSSI_STAT :
{
phl_dbg_cmd_show_rssi(phl_info, input, input_num, output, out_len);
}
break;
case PHL_DBG_SER:
{
phl_ser_cmd_parser(phl_info, input, input_num, output, out_len);
}
break;
case PHL_DBG_WOW:
{
_dump_wow_stats(phl_info, input, input_num, output, out_len);
}
break;
#ifdef CONFIG_POWER_SAVE
case PHL_DBG_PS:
{
phl_ps_cmd_parser(phl_info, input, input_num, output, out_len);
}
break;
#endif
#ifdef CONFIG_MCC_SUPPORT
case PHL_DBG_MCC:
{
_dump_mcc_info(phl_info, input, input_num, output, out_len);
}
break;
#endif /* CONFIG_MCC_SUPPORT */
case PHL_DBG_ECSA:
{
#ifdef CONFIG_PHL_ECSA
struct rtw_wifi_role_t *role = NULL;
struct rtw_phl_ecsa_param param = {0};
int chan = 0;
int bw = 0;
int offset = 0;
int count = 0;
int op_class = 0;
int mode = 0;
int delay_start_ms = 0;
if (input_num <= 7)
break;
_os_sscanf(input[1], "%d", &chan);
_os_sscanf(input[2], "%d", &bw);
_os_sscanf(input[3], "%d", &offset);
_os_sscanf(input[4], "%d", &count);
_os_sscanf(input[5], "%d", &op_class);
_os_sscanf(input[6], "%d", &mode);
_os_sscanf(input[7], "%d", &delay_start_ms);
role = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, 2);
if(role){
param.ecsa_type = ECSA_TYPE_AP;
param.ch = (u8)chan;
param.count = (u8)count;
param.flag = 0;
param.mode = (u8)mode;
param.op_class = (u8)op_class;
param.delay_start_ms = delay_start_ms;
param.new_chan_def.chan = (u8)chan;
param.new_chan_def.bw = (u8)bw;
param.new_chan_def.offset = (u8)offset;
rtw_phl_ecsa_start(phl_info, role, &param);
}
else
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[DBG] Role 2 is NULL\n");
#else
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[DBG] ECSA not support!\n");
#endif /* CONFIG_PHL_ECSA */
}
break;
case PHL_DBG_CFG_TX_DUTY:
{
int tx_duty = 100;
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] PHL_DBG_CFG_TX_DUTY [100-30] \n");
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] TX duty interval = 100ms \n");
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] No TX duty control: 100 \n");
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] Minimum TX duty control: 30 (TX 30ms pause TX 70ms)\n");
if (input_num <= 1)
break;
_os_sscanf(input[1], "%d", &tx_duty);
if (tx_duty < 30 || tx_duty > 100) {
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] TX duty should be 30~100 \n");
break;
}
if (tx_duty == 100)
phl_thermal_protect_stop_tx_duty(phl_info);
else
phl_thermal_protect_cfg_tx_duty(phl_info, 100, (u8)tx_duty);
PHL_DBG_MON_INFO(out_len, used, output + used, out_len - used,
"[DBG] Current TX duty control: %d \n", tx_duty);
}
break;
default:
PHL_DBG_MON_INFO(out_len, used, output + used,
out_len - used, "[DBG] Do not support this command\n");
break;
}
}
s32
phl_dbg_proc_cmd(struct phl_info_t *phl_info,
char *input, char *output, u32 out_len)
{
char *token;
u32 argc = 0;
char argv[MAX_ARGC][MAX_ARGV];
do {
token = _os_strsep(&input, ", ");
if (token) {
if (_os_strlen((u8 *)token) <= MAX_ARGV)
_os_strcpy(argv[argc], token);
argc++;
} else {
break;
}
} while (argc < MAX_ARGC);
if (argc == 1)
argv[0][_os_strlen((u8 *)argv[0])] = '\0';
phl_dbg_cmd_parser(phl_info, argv, argc, output, out_len);
return 0;
}
enum rtw_hal_status
rtw_phl_dbg_proc_cmd(struct phl_info_t *phl_info,
struct rtw_proc_cmd *incmd,
char *output,
u32 out_len)
{
if (incmd->in_type == RTW_ARG_TYPE_BUF) {
phl_dbg_proc_cmd(phl_info, incmd->in.buf, output, out_len);
} else if(incmd->in_type == RTW_ARG_TYPE_ARRAY){
phl_dbg_cmd_parser(phl_info, incmd->in.vector,
incmd->in_cnt_len, output, out_len);
}
return RTW_HAL_STATUS_SUCCESS;
}
#endif