summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManjeet Singh <manjee@codeaurora.org>2016-07-08 11:40:00 +0530
committerNandini Suresh <snandini@codeaurora.org>2016-07-08 05:14:42 -0700
commitf82ed071d0274487b548fa38df412a24600aee2a (patch)
treec05628d9f912dd4dc1155d5b5d544b662c87ef9d
parent371e5af0bd7c5043f79fa12cc1d97acf91009b05 (diff)
qcacld-3.0: Add support for WMI_PDEV_WAL_POWER_DEBUG_CMD
Add support for WMI POWER DEBUG command to control mac_core power features for run time debugging. Change-Id: I77ad747843cae31de1705b7ce8fa80e18c9ca53e CRs-Fixed: 1007598
-rw-r--r--core/hdd/src/wlan_hdd_wext.c49
-rw-r--r--core/mac/inc/sir_api.h17
-rw-r--r--core/mac/src/include/sir_params.h2
-rw-r--r--core/sme/inc/sme_api.h5
-rw-r--r--core/sme/src/common/sme_api.c48
-rw-r--r--core/wma/inc/wma_internal.h5
-rw-r--r--core/wma/src/wma_main.c40
7 files changed, 165 insertions, 1 deletions
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index 809176854e26..cb0ad82e48fc 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -339,8 +339,9 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#define WLAN_PRIV_SET_VAR_INT_GET_NONE (SIOCIWFIRSTPRIV + 7)
#define WE_P2P_NOA_CMD 2
+/* subcommands 3 is unused */
-/* subcommands 3 and 4 are unused */
+#define WE_MAC_PWR_DEBUG_CMD 4
#ifdef FEATURE_WLAN_TDLS
#define WE_TDLS_CONFIG_PARAMS 5
@@ -8039,6 +8040,46 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
}
break;
#endif
+ case WE_MAC_PWR_DEBUG_CMD:
+ {
+ struct sir_mac_pwr_dbg_cmd mac_pwr_dbg_args;
+ tHalHandle hal = WLAN_HDD_GET_HAL_CTX(pAdapter);
+ int i, j;
+
+ if (num_args < 3) {
+ hdd_err("number of arguments can't be null %d",
+ num_args);
+ return -EINVAL;
+ }
+ if (num_args - 3 != apps_args[2]) {
+ hdd_err("arg list of size %d doesn't match num_args %d",
+ num_args-3, apps_args[2]);
+ return -EINVAL;
+ }
+ if ((apps_args[1] < WLAN_MODULE_ID_MIN) ||
+ (apps_args[1] >= WLAN_MODULE_ID_MAX)) {
+ hdd_err("Invalid MODULE ID %d", apps_args[1]);
+ return -EINVAL;
+ }
+ if (apps_args[2] > (MAX_POWER_DBG_ARGS_SUPPORTED)) {
+ hdd_err("Too Many args %d", apps_args[2]);
+ return -EINVAL;
+ }
+ mac_pwr_dbg_args.pdev_id = apps_args[0];
+ mac_pwr_dbg_args.module_id = apps_args[1];
+ mac_pwr_dbg_args.num_args = apps_args[2];
+
+ for (i = 0, j = 3; i < mac_pwr_dbg_args.num_args; i++, j++)
+ mac_pwr_dbg_args.args[i] = apps_args[j];
+
+ if (QDF_STATUS_SUCCESS !=
+ sme_process_mac_pwr_dbg_cmd(hal, pAdapter->sessionId,
+ &mac_pwr_dbg_args)) {
+ return -EINVAL;
+ }
+ }
+ break;
+
default:
{
hdd_err("Invalid IOCTL command %d", sub_cmd);
@@ -10730,6 +10771,12 @@ static const struct iw_priv_args we_private_args[] = {
0,
"setUnitTestCmd"
},
+ {
+ WE_MAC_PWR_DEBUG_CMD,
+ IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
+ 0,
+ "halPwrDebug"
+ },
#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
{WE_LED_FLASHING_PARAM,
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 1f1a663760df..fdf1f8763daa 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -99,6 +99,8 @@ typedef uint8_t tSirVersionString[SIR_VERSION_STRING_LEN];
/* This should not be greater than MAX_NUMBER_OF_CONC_CONNECTIONS */
#define MAX_VDEV_SUPPORTED 4
+#define MAX_POWER_DBG_ARGS_SUPPORTED 8
+
/**
* enum sir_conn_update_reason: Reason for conc connection update
* @SIR_UPDATE_REASON_SET_OPER_CHAN: Set probable operating channel
@@ -6331,4 +6333,19 @@ struct sir_p2p_lo_event {
uint32_t vdev_id;
uint32_t reason_code;
};
+
+/**
+ * struct sir_hal_pwr_dbg_cmd - unit test command parameters
+ * @pdev_id: pdev id
+ * @module_id: module id
+ * @num_args: number of arguments
+ * @args: arguments
+ */
+struct sir_mac_pwr_dbg_cmd {
+ uint32_t pdev_id;
+ uint32_t module_id;
+ uint32_t num_args;
+ uint32_t args[MAX_POWER_DBG_ARGS_SUPPORTED];
+};
+
#endif /* __SIR_API_H */
diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h
index 3357dcc8fc83..cde2bd73a830 100644
--- a/core/mac/src/include/sir_params.h
+++ b/core/mac/src/include/sir_params.h
@@ -629,6 +629,8 @@ typedef struct sSirMbMsgP2p {
#define SIR_HAL_NDP_CONFIRM (SIR_HAL_ITC_MSG_TYPES_BEGIN + 356)
#define SIR_HAL_NDP_END_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 357)
+#define SIR_HAL_POWER_DBG_CMD (SIR_HAL_ITC_MSG_TYPES_BEGIN + 347)
+
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
/* CFG message types */
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 29909124e9c3..2bd89c38868b 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -1131,4 +1131,9 @@ void sme_update_vdev_type_nss(tHalHandle hal, uint8_t max_supp_nss,
uint32_t vdev_type_nss, eCsrBand band);
void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
p2p_lo_callback callback);
+
+QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
+ struct sir_mac_pwr_dbg_cmd*
+ dbg_args);
+
#endif /* #if !defined( __SME_API_H ) */
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index d8b9a56bf803..493def9ac410 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -15800,3 +15800,51 @@ void sme_register_p2p_lo_event(tHalHandle hHal, void *context,
pMac->sme.p2p_lo_event_context = context;
sme_release_global_lock(&pMac->sme);
}
+
+/**
+ * sme_process_mac_pwr_dbg_cmd() - enable mac pwr debugging
+ * @hal: The handle returned by macOpen
+ * @session_id: session id
+ * @dbg_args: args for mac pwr debug command
+ * Return: Return QDF_STATUS, otherwise appropriate failure code
+ */
+QDF_STATUS sme_process_mac_pwr_dbg_cmd(tHalHandle hal, uint32_t session_id,
+ struct sir_mac_pwr_dbg_cmd*
+ dbg_args)
+{
+ cds_msg_t message;
+ tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+ struct sir_mac_pwr_dbg_cmd *req;
+ int i;
+
+ if (!CSR_IS_SESSION_VALID(mac_ctx, session_id)) {
+ sms_log(mac_ctx, LOGE,
+ "CSR session not valid: %d",
+ session_id);
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ req = qdf_mem_malloc(sizeof(*req));
+ if (NULL == req) {
+ QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
+ "%s: fail to alloc mac_pwr_dbg_args", __func__);
+ return QDF_STATUS_E_FAILURE;
+ }
+ req->module_id = dbg_args->module_id;
+ req->pdev_id = dbg_args->pdev_id;
+ req->num_args = dbg_args->num_args;
+ for (i = 0; i < req->num_args; i++)
+ req->args[i] = dbg_args->args[i];
+
+ message.type = SIR_HAL_POWER_DBG_CMD;
+ message.bodyptr = req;
+
+ if (!QDF_IS_STATUS_SUCCESS(cds_mq_post_message
+ (QDF_MODULE_ID_WMA, &message))) {
+ QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
+ "%s: Not able to post msg to WDA!",
+ __func__);
+ qdf_mem_free(req);
+ }
+ return QDF_STATUS_SUCCESS;
+}
diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h
index 0cf62491f941..9c4cff42ed9a 100644
--- a/core/wma/inc/wma_internal.h
+++ b/core/wma/inc/wma_internal.h
@@ -1216,4 +1216,9 @@ void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id,
uint8_t type);
int wma_p2p_lo_event_handler(void *handle, uint8_t *event_buf,
uint32_t len);
+
+QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
+ struct sir_mac_pwr_dbg_cmd *
+ sir_pwr_dbg_params);
+
#endif
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index 64faa1d1a18f..a0d9e9439805 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -1470,6 +1470,41 @@ static int wma_process_fw_event_tasklet_ctx(void *ctx, void *ev)
}
/**
+ * wma_process_hal_pwr_dbg_cmd() - send hal pwr dbg cmd to fw.
+ * @handle: wma handle
+ * @sir_pwr_dbg_params: unit test command
+ *
+ * This function send unit test command to fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
+ */
+QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle,
+ struct sir_mac_pwr_dbg_cmd *
+ sir_pwr_dbg_params)
+{
+ tp_wma_handle wma_handle = (tp_wma_handle)handle;
+ int i;
+ struct wmi_power_dbg_params wmi_pwr_dbg_params;
+ QDF_STATUS status;
+
+ if (!sir_pwr_dbg_params) {
+ WMA_LOGE("%s: sir_pwr_dbg_params is null", __func__);
+ return QDF_STATUS_E_INVAL;
+ }
+ wmi_pwr_dbg_params.module_id = sir_pwr_dbg_params->module_id;
+ wmi_pwr_dbg_params.pdev_id = sir_pwr_dbg_params->pdev_id;
+ wmi_pwr_dbg_params.num_args = sir_pwr_dbg_params->num_args;
+
+ for (i = 0; i < wmi_pwr_dbg_params.num_args; i++)
+ wmi_pwr_dbg_params.args[i] = sir_pwr_dbg_params->args[i];
+
+ status = wmi_unified_send_power_dbg_cmd(wma_handle->wmi_handle,
+ &wmi_pwr_dbg_params);
+
+ return status;
+}
+
+/**
* wma_process_fw_event_handler() - common event handler to serialize
* event processing through mc_thread
* @ctx: wmi context
@@ -5959,6 +5994,11 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg)
wma_handle_ndp_end_req(wma_handle, msg->bodyptr);
qdf_mem_free(msg->bodyptr);
break;
+ case SIR_HAL_POWER_DBG_CMD:
+ wma_process_hal_pwr_dbg_cmd(wma_handle,
+ msg->bodyptr);
+ qdf_mem_free(msg->bodyptr);
+ break;
default:
WMA_LOGD("unknow msg type %x", msg->type);
/* Do Nothing? MSG Body should be freed at here */