qcacld-3.0: Add FW Profiling support

Add Profiling stats support in HOST driver to
have CPU based profiling for critical data
path functions in FW.

Change-Id: Ib6d4f0b220f622cf304536c8e538d4dc34c6434b
CRs-Fixed: 921950
This commit is contained in:
Govind Singh 2015-10-12 17:11:14 +05:30 • committed by Prakash Dhavali
commit 8f88538e87
9 changed files with 471 additions and 20 deletions

View file

@ -147,6 +147,7 @@ typedef struct {
/* Private ioctls and their sub-ioctls */
#define QCSAP_PRIV_GET_CHAR_SET_NONE (SIOCIWFIRSTPRIV + 13)
#define QCSAP_GET_STATS 1
#define QCSAP_LIST_FW_PROFILE 2
#define QCSAP_IOCTL_CLR_STATS (SIOCIWFIRSTPRIV+14)
#define QCSAP_IOCTL_PRIV_SET_THREE_INT_GET_NONE (SIOCIWFIRSTPRIV+15)
@ -171,6 +172,8 @@ typedef struct {
#define QCSAP_IOCTL_SET_FW_CRASH_INJECT 1
#endif
#define QCSAP_IOCTL_DUMP_DP_TRACE_LEVEL 2
#define QCSAP_ENABLE_FW_PROFILE 3
#define QCSAP_SET_FW_PROFILE_HIST_INTVL 4
#define MAX_VAR_ARGS 7
#define QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED (SIOCIWFIRSTPRIV + 31)
@ -237,6 +240,8 @@ enum {
QCASAP_DUMP_STATS,
QCASAP_CLEAR_STATS,
QCASAP_SET_RADAR_DBG,
QCSAP_GET_FW_PROFILE_DATA,
QCSAP_START_FW_PROFILING
};
int iw_softap_get_channel_list(struct net_device *dev,

View file

@ -306,6 +306,8 @@ extern void hdd_wlan_get_version(hdd_adapter_t *pAdapter,
extern void hdd_wlan_get_stats(hdd_adapter_t *pAdapter, uint16_t *length,
char *buffer, uint16_t buf_len);
extern void hdd_wlan_list_fw_profile(uint16_t *length,
char *buffer, uint16_t buf_len);
extern int iw_set_essid(struct net_device *dev,
struct iw_request_info *info,

View file

@ -2032,29 +2032,36 @@ static iw_softap_get_ini_cfg(struct net_device *dev,
return ret;
}
/**
* iw_softap_set_two_ints_getnone() - Generic "set two integer" ioctl handler
* @dev: device upon which the ioctl was received
* @info: ioctl request information
* @wrqu: ioctl request data
* @extra: ioctl extra data
*
* Return: 0 on success, non-zero on error
*/
static int __iw_softap_set_two_ints_getnone(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *pHddCtx;
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
int ret;
int *value = (int *)extra;
int sub_cmd = value[0];
int ret = 0;
hdd_context_t *hdd_ctx;
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
ret = wlan_hdd_validate_context(pHddCtx);
if (ret != 0) {
hddLog(LOGE, FL("HDD context is not valid!"));
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
ret = wlan_hdd_validate_context(hdd_ctx);
if (ret != 0)
goto out;
}
switch (sub_cmd) {
#ifdef DEBUG
case QCSAP_IOCTL_SET_FW_CRASH_INJECT:
hddLog(LOGE, "WE_SET_FW_CRASH_INJECT: %d %d",
value[1], value[2]);
ret = wma_cli_set2_command(pAdapter->sessionId,
ret = wma_cli_set2_command(adapter->sessionId,
GEN_PARAM_CRASH_INJECT,
value[1], value[2],
GEN_CMD);
@ -2066,6 +2073,19 @@ static int __iw_softap_set_two_ints_getnone(struct net_device *dev,
if (value[1] == DUMP_DP_TRACE)
cdf_dp_trace_dump_all(value[2]);
break;
case QCSAP_ENABLE_FW_PROFILE:
hddLog(LOG1, "QCSAP_ENABLE_FW_PROFILE: %d %d",
value[1], value[2]);
ret = wma_cli_set2_command(adapter->sessionId,
WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
value[1], value[2], DBG_CMD);
break;
case QCSAP_SET_FW_PROFILE_HIST_INTVL:
hddLog(LOG1, "QCSAP_SET_FW_PROFILE_HIST_INTVL: %d %d",
value[1], value[2]);
ret = wma_cli_set2_command(adapter->sessionId,
WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
value[1], value[2], DBG_CMD);
default:
hddLog(LOGE, FL("Invalid IOCTL command %d"), sub_cmd);
break;
@ -2793,6 +2813,12 @@ static __iw_softap_setparam(struct net_device *dev,
}
break;
}
case QCSAP_START_FW_PROFILING:
hddLog(LOG1, "QCSAP_START_FW_PROFILING %d", set_value);
ret = wma_cli_set_command(pHostapdAdapter->sessionId,
WMI_WLAN_PROFILE_TRIGGER_CMDID,
set_value, DBG_CMD);
break;
default:
hddLog(LOGE, FL("Invalid setparam command %d value %d"),
sub_cmd, set_value);
@ -3007,6 +3033,12 @@ static __iw_softap_getparam(struct net_device *dev,
ret = wlan_hdd_get_temperature(pHostapdAdapter, value);
break;
}
case QCSAP_GET_FW_PROFILE_DATA:
hddLog(LOG1, "QCSAP_GET_FW_PROFILE_DATA");
ret = wma_cli_set_command(pHostapdAdapter->sessionId,
WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
0, DBG_CMD);
break;
default:
hddLog(LOGE, FL("Invalid getparam command %d"), sub_cmd);
ret = -EINVAL;
@ -3415,31 +3447,44 @@ static iw_softap_disassoc_sta(struct net_device *dev,
return ret;
}
/**
* iw_get_char_setnone() - Generic "get char" private ioctl handler
* @dev: device upon which the ioctl was received
* @info: ioctl request information
* @wrqu: ioctl request data
* @extra: ioctl extra data
*
* Return: 0 on success, non-zero on error
*/
static int __iw_get_char_setnone(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
CDF_STATUS status;
int ret;
int sub_cmd = wrqu->data.flags;
hdd_context_t *hdd_ctx;
ENTER();
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
status = wlan_hdd_validate_context(hdd_ctx);
if (status != 0)
return status;
ret = wlan_hdd_validate_context(hdd_ctx);
if (ret != 0)
return ret;
switch (sub_cmd) {
case QCSAP_GET_STATS:
hdd_wlan_get_stats(adapter, &(wrqu->data.length),
extra, WE_MAX_STR_LEN);
break;
case QCSAP_LIST_FW_PROFILE:
hdd_wlan_list_fw_profile(&(wrqu->data.length),
extra, WE_MAX_STR_LEN);
break;
}
EXIT();
return status;
return ret;
}
static int iw_get_char_setnone(struct net_device *dev,
@ -5464,6 +5509,10 @@ static const struct iw_priv_args hostapd_private_args[] = {
QCASAP_CLEAR_STATS,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0, "clearStats"
}, {
QCSAP_START_FW_PROFILING,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0, "startProfile"
}, {
QCSAP_IOCTL_GETPARAM, 0,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam"
@ -5529,6 +5578,9 @@ static const struct iw_priv_args hostapd_private_args[] = {
}, {
QCASAP_GET_TEMP_CMD, 0,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_temp"
}, {
QCSAP_GET_FW_PROFILE_DATA, 0,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getProfileData"
}, {
QCSAP_IOCTL_GET_STAWPAIE,
IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 0,
@ -5571,6 +5623,10 @@ static const struct iw_priv_args hostapd_private_args[] = {
QCSAP_GET_STATS, 0,
IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN, "getStats"
}
, {
QCSAP_LIST_FW_PROFILE, 0,
IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN, "listProfile"
}
, {
QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED,
IW_PRIV_TYPE_CHAR | 18,
@ -5677,6 +5733,17 @@ static const struct iw_priv_args hostapd_private_args[] = {
0, "dump_dp_trace"
}
,
{
QCSAP_ENABLE_FW_PROFILE,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
0, "enableProfile"
}
,
{
QCSAP_SET_FW_PROFILE_HIST_INTVL,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
0, "set_hist_intvl"
}
};
static const iw_handler hostapd_private[] = {

View file

@ -213,6 +213,8 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#define WE_SET_CTS_CBW 84
#define WE_DUMP_STATS 85
#define WE_CLEAR_STATS 86
/* Private sub ioctl for starting/stopping the profiling */
#define WE_START_FW_PROFILE 87
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
@ -314,6 +316,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#define WE_GET_OEM_DATA_CAP 13
#endif
#define WE_GET_SNR 14
#define WE_LIST_FW_PROFILE 15
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_NONE_GET_NONE (SIOCIWFIRSTPRIV + 6)
@ -328,6 +331,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#define WE_DUMP_PCIE_LOG 16
#endif
#define WE_GET_RECOVERY_STAT 17
#define WE_GET_FW_PROFILE_DATA 18
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_VAR_INT_GET_NONE (SIOCIWFIRSTPRIV + 7)
@ -424,6 +428,9 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#endif
#define WE_DUMP_DP_TRACE_LEVEL 3
#define DUMP_DP_TRACE 0
/* Private sub ioctl for enabling and setting histogram interval of profiling */
#define WE_ENABLE_FW_PROFILE 4
#define WE_SET_FW_PROFILE_HIST_INTVL 5
/* (SIOCIWFIRSTPRIV + 29) is currently unused */
@ -647,6 +654,41 @@ void hdd_wlan_get_stats(hdd_adapter_t *pAdapter, uint16_t *length,
*length = len + 1;
}
/**
* hdd_wlan_list_fw_profile() - Get fw profiling points
* @length: Size of the data copied
* @buffer: Pointer to char buffer.
* @buf_len: Length of the char buffer.
*
* This function called when the "iwpriv wlan0 listProfile" command is given.
* It is used to get the supported profiling points in FW.
*
* Return - none
*/
void hdd_wlan_list_fw_profile(uint16_t *length,
char *buffer, uint16_t buf_len)
{
uint32_t len = 0;
len = scnprintf(buffer, buf_len,
"PROF_CPU_IDLE: %u\n"
"PROF_PPDU_PROC: %u\n"
"PROF_PPDU_POST: %u\n"
"PROF_HTT_TX_INPUT: %u\n"
"PROF_MSDU_ENQ: %u\n"
"PROF_PPDU_POST_HAL: %u\n"
"PROF_COMPUTE_TX_TIME: %u\n",
PROF_CPU_IDLE,
PROF_PPDU_PROC,
PROF_PPDU_POST,
PROF_HTT_TX_INPUT,
PROF_MSDU_ENQ,
PROF_PPDU_POST_HAL,
PROF_COMPUTE_TX_TIME);
*length = len + 1;
}
/**
* hdd_wlan_dump_stats() - display dump Stats
* @adapter: adapter handle
@ -6072,6 +6114,14 @@ static int __iw_setint_getnone(struct net_device *dev,
sme_set_scan_disable(WLAN_HDD_GET_HAL_CTX(pAdapter), set_value);
break;
}
case WE_START_FW_PROFILE:
{
hddLog(LOG1, "WE_START_FW_PROFILE %d", set_value);
ret = wma_cli_set_command(pAdapter->sessionId,
WMI_WLAN_PROFILE_TRIGGER_CMDID,
set_value, DBG_CMD);
break;
}
default:
{
hddLog(LOGE, "%s: Invalid sub command %d", __func__,
@ -6896,6 +6946,11 @@ static int __iw_get_char_setnone(struct net_device *dev,
break;
}
case WE_LIST_FW_PROFILE:
hdd_wlan_list_fw_profile(&(wrqu->data.length),
extra, WE_MAX_STR_LEN);
break;
/* The case prints the current state of the HDD, SME, CSR, PE,
* TL it can be extended for WDI Global State as well. And
* currently it only checks P2P_CLIENT adapter. P2P_DEVICE
@ -7409,6 +7464,12 @@ static int __iw_setnone_getnone(struct net_device *dev,
break;
}
case WE_GET_FW_PROFILE_DATA:
ret = wma_cli_set_command(pAdapter->sessionId,
WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
0, DBG_CMD);
break;
case WE_SET_REASSOC_TRIGGER:
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@ -9431,6 +9492,20 @@ static int __iw_set_two_ints_getnone(struct net_device *dev,
value[1], value[2], GEN_CMD);
break;
#endif
case WE_ENABLE_FW_PROFILE:
hddLog(LOGE, "WE_ENABLE_FW_PROFILE: %d %d",
value[1], value[2]);
ret = wma_cli_set2_command(pAdapter->sessionId,
WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
value[1], value[2], DBG_CMD);
break;
case WE_SET_FW_PROFILE_HIST_INTVL:
hddLog(LOGE, "WE_SET_FW_PROFILE_HIST_INTVL: %d %d",
value[1], value[2]);
ret = wma_cli_set2_command(pAdapter->sessionId,
WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
value[1], value[2], DBG_CMD);
break;
case WE_SET_DUAL_MAC_FW_MODE_CONFIG:
hdd_debug("Ioctl to set dual fw mode config");
if (hdd_ctx->config->dual_mac_feature_disable) {
@ -9986,6 +10061,10 @@ static const struct iw_priv_args we_private_args[] = {
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0, "clearStats"},
{WE_START_FW_PROFILE,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0, "startProfile"},
{WLAN_PRIV_SET_NONE_GET_INT,
0,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
@ -10322,6 +10401,10 @@ static const struct iw_priv_args we_private_args[] = {
0,
IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
"getStats"},
{WE_LIST_FW_PROFILE,
0,
IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
"listProfile"},
{WE_GET_STATES,
0,
IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
@ -10388,12 +10471,17 @@ static const struct iw_priv_args we_private_args[] = {
0,
0,
"getRecoverStat"},
{
WE_SET_REASSOC_TRIGGER,
0,
0,
"reassoc"
},
{WE_GET_FW_PROFILE_DATA,
0,
0,
"getProfileData"},
{WE_SET_REASSOC_TRIGGER,
0,
0,
"reassoc"},
{WE_DUMP_AGC_START,
0,
0,
@ -10608,6 +10696,14 @@ static const struct iw_priv_args we_private_args[] = {
0, "crash_inject"}
,
#endif
{WE_ENABLE_FW_PROFILE,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
0, "enableProfile"}
,
{WE_SET_FW_PROFILE_HIST_INTVL,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
0, "set_hist_intvl"}
,
{WE_SET_DUAL_MAC_FW_MODE_CONFIG,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
0, "set_fw_mode_cfg"}

View file

@ -1630,6 +1630,28 @@ enum uapsd_peer_param_enabled_ac {
UAPSD_BE_ENABLED = 0x08
};
/**
* enum profile_id_t - Firmware profiling index
* @PROF_CPU_IDLE: cpu idle profile
* @PROF_PPDU_PROC: ppdu processing profile
* @PROF_PPDU_POST: ppdu post profile
* @PROF_HTT_TX_INPUT: htt tx input profile
* @PROF_MSDU_ENQ: msdu enqueue profile
* @PROF_PPDU_POST_HAL: ppdu post profile
* @PROF_COMPUTE_TX_TIME: tx time profile
* @PROF_MAX_ID: max profile index
*/
enum profile_id_t {
PROF_CPU_IDLE,
PROF_PPDU_PROC,
PROF_PPDU_POST,
PROF_HTT_TX_INPUT,
PROF_MSDU_ENQ,
PROF_PPDU_POST_HAL,
PROF_COMPUTE_TX_TIME,
PROF_MAX_ID,
};
/**
* struct p2p_ie - P2P IE structural definition.
* @p2p_id: p2p id

View file

@ -868,6 +868,12 @@ int32_t wmi_unified_pdev_green_ap_ps_enable_cmd(wmi_unified_t wmi_handle,
uint32_t value);
#endif
int wma_profile_data_report_event_handler(void *handle, uint8_t *event_buf,
uint32_t len);
int32_t wmi_unified_fw_profiling_cmd(wmi_unified_t wmi_handle,
uint32_t cmd, uint32_t value1, uint32_t value2);
void wma_wow_tx_complete(void *wma);
int wmi_unified_nat_keepalive_enable(tp_wma_handle wma, uint8_t vdev_id);

View file

@ -1025,6 +1025,137 @@ int32_t wmi_unified_pdev_green_ap_ps_enable_cmd(wmi_unified_t wmi_handle,
}
#endif /* FEATURE_GREEN_AP */
/**
* wmi_unified_fw_profiling_cmd() - send FW profiling cmd to WLAN FW
* @wma: wma handle
* @cmd: Profiling command index
* @value1: parameter1 value
* @value2: parameter2 value
*
* Return: 0 for success else error code
*/
int32_t wmi_unified_fw_profiling_cmd(wmi_unified_t wmi_handle,
uint32_t cmd, uint32_t value1, uint32_t value2)
{
wmi_buf_t buf;
int32_t len = 0;
int ret;
wmi_wlan_profile_trigger_cmd_fixed_param *prof_trig_cmd;
wmi_wlan_profile_set_hist_intvl_cmd_fixed_param *hist_intvl_cmd;
wmi_wlan_profile_enable_profile_id_cmd_fixed_param *profile_enable_cmd;
wmi_wlan_profile_get_prof_data_cmd_fixed_param *profile_getdata_cmd;
switch (cmd) {
case WMI_WLAN_PROFILE_TRIGGER_CMDID:
len = sizeof(wmi_wlan_profile_trigger_cmd_fixed_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) {
WMA_LOGP("%s: wmi_buf_alloc Failed", __func__);
return -ENOMEM;
}
prof_trig_cmd =
(wmi_wlan_profile_trigger_cmd_fixed_param *)
wmi_buf_data(buf);
WMITLV_SET_HDR(&prof_trig_cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_wlan_profile_trigger_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_wlan_profile_trigger_cmd_fixed_param));
prof_trig_cmd->enable = value1;
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_WLAN_PROFILE_TRIGGER_CMDID);
if (ret) {
WMA_LOGE("PROFILE_TRIGGER cmd Failed with value %d",
value1);
cdf_nbuf_free(buf);
return ret;
}
break;
case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
len = sizeof(wmi_wlan_profile_get_prof_data_cmd_fixed_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) {
WMA_LOGP("%s: wmi_buf_alloc Failed", __func__);
return -ENOMEM;
}
profile_getdata_cmd =
(wmi_wlan_profile_get_prof_data_cmd_fixed_param *)
wmi_buf_data(buf);
WMITLV_SET_HDR(&profile_getdata_cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_wlan_profile_get_prof_data_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_wlan_profile_get_prof_data_cmd_fixed_param));
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID);
if (ret) {
WMA_LOGE("PROFILE_DATA cmd Failed for id %d value %d",
value1, value2);
cdf_nbuf_free(buf);
return ret;
}
break;
case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
len = sizeof(wmi_wlan_profile_set_hist_intvl_cmd_fixed_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) {
WMA_LOGP("%s: wmi_buf_alloc Failed", __func__);
return -ENOMEM;
}
hist_intvl_cmd =
(wmi_wlan_profile_set_hist_intvl_cmd_fixed_param *)
wmi_buf_data(buf);
WMITLV_SET_HDR(&hist_intvl_cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_wlan_profile_set_hist_intvl_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_wlan_profile_set_hist_intvl_cmd_fixed_param));
hist_intvl_cmd->profile_id = value1;
hist_intvl_cmd->value = value2;
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID);
if (ret) {
WMA_LOGE("HIST_INTVL cmd Failed for id %d value %d",
value1, value2);
cdf_nbuf_free(buf);
return ret;
}
break;
case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
len =
sizeof(wmi_wlan_profile_enable_profile_id_cmd_fixed_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) {
WMA_LOGP("%s: wmi_buf_alloc Failed", __func__);
return -ENOMEM;
}
profile_enable_cmd =
(wmi_wlan_profile_enable_profile_id_cmd_fixed_param *)
wmi_buf_data(buf);
WMITLV_SET_HDR(&profile_enable_cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_wlan_profile_enable_profile_id_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_wlan_profile_enable_profile_id_cmd_fixed_param));
profile_enable_cmd->profile_id = value1;
profile_enable_cmd->enable = value2;
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID);
if (ret) {
WMA_LOGE("enable cmd Failed for id %d value %d",
value1, value2);
cdf_nbuf_free(buf);
return ret;
}
break;
default:
WMA_LOGD("%s: invalid profiling command", __func__);
break;
}
return 0;
}
#ifdef FEATURE_WLAN_LPHB
/**
* wma_lphb_handler() - send LPHB indication to SME

View file

@ -955,6 +955,52 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
WMA_LOGE("dbglog_report_enable failed ret %d",
ret);
break;
case WMI_WLAN_PROFILE_TRIGGER_CMDID:
ret = wmi_unified_fw_profiling_cmd(wma->wmi_handle,
WMI_WLAN_PROFILE_TRIGGER_CMDID,
privcmd->param_value, 0);
if (ret)
WMA_LOGE("Profile cmd failed for %d ret %d",
WMI_WLAN_PROFILE_TRIGGER_CMDID, ret);
break;
case WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID:
ret = wmi_unified_fw_profiling_cmd(wma->wmi_handle,
WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
privcmd->param_value,
privcmd->param_sec_value);
if (ret)
WMA_LOGE("Profile cmd failed for %d ret %d",
WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
ret);
break;
case WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID:
ret = wmi_unified_fw_profiling_cmd(wma->wmi_handle,
WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
privcmd->param_value,
privcmd->param_sec_value);
if (ret)
WMA_LOGE("Profile cmd failed for %d ret %d",
WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
ret);
break;
case WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID:
ret = wmi_unified_fw_profiling_cmd(wma->wmi_handle,
WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
0, 0);
if (ret)
WMA_LOGE("Profile cmd failed for %d ret %d",
WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
ret);
break;
case WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID:
ret = wmi_unified_fw_profiling_cmd(wma->wmi_handle,
WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
0, 0);
if (ret)
WMA_LOGE("Profile cmd failed for %d ret %d",
WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
ret);
break;
#ifdef FEATURE_GREEN_AP
case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
/* Set the Green AP */
@ -1640,6 +1686,10 @@ CDF_STATUS wma_open(void *cds_context,
wmi_unified_register_event_handler(wma_handle->wmi_handle,
WMI_DEBUG_PRINT_EVENTID,
wma_unified_debug_print_event_handler);
/* Register profiling event Handler */
wmi_unified_register_event_handler(wma_handle->wmi_handle,
WMI_WLAN_PROFILE_DATA_EVENTID,
wma_profile_data_report_event_handler);
wma_handle->tgt_cfg_update_cb = tgt_cfg_cb;
wma_handle->dfs_radar_indication_cb = radar_ind_cb;

View file

@ -381,6 +381,78 @@ int wma_stats_ext_event_handler(void *handle, uint8_t *event_buf,
}
#endif /* WLAN_FEATURE_STATS_EXT */
/**
* wma_profile_data_report_event_handler() - fw profiling handler
* @handle: wma handle
* @event_buf: event buffer received from fw
* @len: length of data
*
* Return: 0 for success or error code
*/
int wma_profile_data_report_event_handler(void *handle, uint8_t *event_buf,
uint32_t len)
{
WMI_WLAN_PROFILE_DATA_EVENTID_param_tlvs *param_buf;
wmi_wlan_profile_ctx_t *profile_ctx;
wmi_wlan_profile_t *profile_data;
uint32_t i = 0;
uint32_t entries;
uint8_t *buf_ptr;
param_buf = (WMI_WLAN_PROFILE_DATA_EVENTID_param_tlvs *) event_buf;
if (!param_buf) {
WMA_LOGE("%s: Invalid profile data event buf", __func__);
return -EINVAL;
}
profile_ctx = param_buf->profile_ctx;
buf_ptr = (uint8_t *)profile_ctx;
buf_ptr = buf_ptr + sizeof(wmi_wlan_profile_ctx_t) + WMI_TLV_HDR_SIZE;
profile_data = (wmi_wlan_profile_t *) buf_ptr;
entries = profile_ctx->bin_count;
CDF_TRACE(CDF_MODULE_ID_WMA, CDF_TRACE_LEVEL_ERROR,
"Profile data stats\n");
CDF_TRACE(CDF_MODULE_ID_WMA, CDF_TRACE_LEVEL_ERROR,
"TOT: %d\n"
"tx_msdu_cnt: %d\n"
"tx_mpdu_cnt: %d\n"
"tx_ppdu_cnt: %d\n"
"rx_msdu_cnt: %d\n"
"rx_mpdu_cnt: %d\n"
"bin_count: %d\n",
profile_ctx->tot,
profile_ctx->tx_msdu_cnt,
profile_ctx->tx_mpdu_cnt,
profile_ctx->tx_ppdu_cnt,
profile_ctx->rx_msdu_cnt,
profile_ctx->rx_mpdu_cnt,
profile_ctx->bin_count);
for (i = 0; i < entries; i++) {
if (i == WMI_WLAN_PROFILE_MAX_BIN_CNT)
break;
CDF_TRACE(CDF_MODULE_ID_WMA, CDF_TRACE_LEVEL_ERROR,
"Profile ID: %d\n"
"Profile Count: %d\n"
"Profile TOT: %d\n"
"Profile Min: %d\n"
"Profile Max: %d\n"
"Profile hist_intvl: %d\n"
"Profile hist[0]: %d\n"
"Profile hist[1]: %d\n"
"Profile hist[2]: %d\n",
profile_data[i].id,
profile_data[i].cnt,
profile_data[i].tot,
profile_data[i].min,
profile_data[i].max,
profile_data[i].hist_intvl,
profile_data[i].hist[0],
profile_data[i].hist[1],
profile_data[i].hist[2]);
}
return 0;
}
#ifdef WLAN_FEATURE_LINK_LAYER_STATS