wlan: Use request manager for GET_ANTENA_DIVERSITY_SELECTION
We are transitioning to the new request manager framework. Change
wlan_hdd_get_current_antenna_index() and hdd_get_current_antenna_index()
to this framework.
Change-Id: Ibf68072ff93e2916d2bd39a0f91f7f2de17f2492
CRs-Fixed: 2215444
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index ed07452..5c5e7d8 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -6692,39 +6692,27 @@
return ret;
}
-static void hdd_GetCurrentAntennaIndex(int antennaId, void *pContext)
+struct get_antenna_idx_priv {
+ int antenna_id;
+};
+
+static void hdd_get_current_antenna_index_cb(int antenna_id, void *context)
{
- struct statsContext *context;
- hdd_adapter_t *pAdapter;
+ struct hdd_request *request;
+ struct get_antenna_idx_priv *priv;
- if (NULL == pContext)
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: Bad param, pContext [%pK]",
- __func__, pContext);
- return;
- }
+ request = hdd_request_get(context);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Obsolete request"));
+ return;
+ }
- context = pContext;
- pAdapter = context->pAdapter;
+ priv = hdd_request_priv(request);
+ priv->antenna_id = antenna_id;
- spin_lock(&hdd_context_lock);
+ hdd_request_complete(request);
+ hdd_request_put(request);
- if ((NULL == pAdapter) || (ANTENNA_CONTEXT_MAGIC != context->magic))
- {
- /* the caller presumably timed out so there is nothing we can do */
- spin_unlock(&hdd_context_lock);
- hddLog(VOS_TRACE_LEVEL_WARN,
- "%s: Invalid context, pAdapter [%pK] magic [%08x]",
- __func__, pAdapter, context->magic);
- return;
- }
-
- context->magic = 0;
- pAdapter->antennaIndex = antennaId;
-
- complete(&context->completion);
- spin_unlock(&hdd_context_lock);
}
static VOS_STATUS wlan_hdd_get_current_antenna_index(hdd_adapter_t *pAdapter,
@@ -6732,8 +6720,14 @@
{
hdd_context_t *pHddCtx;
eHalStatus halStatus;
- struct statsContext context;
- long lrc;
+ int ret;
+ void *cookie;
+ struct hdd_request *request;
+ struct get_antenna_idx_priv *priv;
+ static const struct hdd_request_params params = {
+ .priv_size = sizeof(*priv),
+ .timeout_ms = WLAN_WAIT_TIME_STATS,
+ };
ENTER();
if (NULL == pAdapter)
@@ -6754,46 +6748,49 @@
__func__);
return VOS_STATUS_E_NOSUPPORT;
}
- init_completion(&context.completion);
- context.pAdapter = pAdapter;
- context.magic = ANTENNA_CONTEXT_MAGIC;
+
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Request allocation failure"));
+ return VOS_STATUS_E_NOMEM;
+ }
+ cookie = hdd_request_cookie(request);
halStatus = sme_GetCurrentAntennaIndex(pHddCtx->hHal,
- hdd_GetCurrentAntennaIndex,
- &context, pAdapter->sessionId);
+ hdd_get_current_antenna_index_cb,
+ cookie, pAdapter->sessionId);
if (eHAL_STATUS_SUCCESS != halStatus)
{
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Unable to retrieve Antenna Index",
__func__);
/* we'll returned a cached value below */
*antennaIndex = -1;
- return VOS_STATUS_E_FAILURE;
}
else
{
/* request was sent -- wait for the response */
- lrc = wait_for_completion_interruptible_timeout(&context.completion,
- msecs_to_jiffies(WLAN_WAIT_TIME_STATS));
- if (lrc <= 0)
+ if (ret)
{
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
- hddLog(VOS_TRACE_LEVEL_ERROR, "%s:SME %s while retrieving Antenna"
- " Index",
- __func__, (0 == lrc) ? "timeout" : "interrupt");
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("SME timeout while retrieving Antenna Index"));
*antennaIndex = -1;
- return VOS_STATUS_E_FAILURE;
+ }
+ else
+ {
+ priv = hdd_request_priv(request);
+ pAdapter->antennaIndex = priv->antenna_id;
}
}
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
- *antennaIndex = pAdapter->antennaIndex;
+ if (*antennaIndex != -1)
+ *antennaIndex = pAdapter->antennaIndex;
+
+ /*
+ * either we never sent a request, we sent a request and received a
+ * response or we sent a request and timed out. Regardless we are
+ * done with the request.
+ */
+ hdd_request_put(request);
EXIT();
return VOS_STATUS_SUCCESS;