blob: c2e7e7d37819e7c312579a4e51e876bdd20d1e0d [file] [log] [blame]
Jeff Johnsone7245742012-09-05 17:12:55 -07001/*
Kiet Lam0fb93dd2014-02-19 00:32:59 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam0fb93dd2014-02-19 00:32:59 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnsone7245742012-09-05 17:12:55 -070028#ifdef FEATURE_OEM_DATA_SUPPORT
Bernala0eafe12013-04-26 09:08:08 -070029/** ------------------------------------------------------------------------- *
30 ------------------------------------------------------------------------- *
Jeff Johnsone7245742012-09-05 17:12:55 -070031
Bernala0eafe12013-04-26 09:08:08 -070032
Jeff Johnsone7245742012-09-05 17:12:55 -070033 \file oemDataApi.c
Bernala0eafe12013-04-26 09:08:08 -070034
Jeff Johnsone7245742012-09-05 17:12:55 -070035 Implementation for the OEM DATA REQ/RSP interfaces.
Jeff Johnsone7245742012-09-05 17:12:55 -070036 ========================================================================== */
37#include "aniGlobal.h"
38#include "oemDataApi.h"
39#include "palApi.h"
40#include "smeInside.h"
41#include "smsDebug.h"
42
43#include "csrSupport.h"
44#include "wlan_qct_tl.h"
45
46#include "vos_diag_core_log.h"
47#include "vos_diag_core_event.h"
48
49/* ---------------------------------------------------------------------------
50 \fn oemData_OemDataReqOpen
51 \brief This function must be called before any API call to (OEM DATA REQ/RSP module)
Bernala0eafe12013-04-26 09:08:08 -070052 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -070053 -------------------------------------------------------------------------------*/
54
55eHalStatus oemData_OemDataReqOpen(tHalHandle hHal)
56{
57 eHalStatus status = eHAL_STATUS_SUCCESS;
58 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
59
60 do
61 {
62 //initialize all the variables to null
63 vos_mem_set(&(pMac->oemData), sizeof(tOemDataStruct), 0);
64 if(!HAL_STATUS_SUCCESS(status))
65 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -080066 smsLog(pMac, LOGE, "oemData_OemDataReqOpen: Cannot allocate memory for the timer function");
Jeff Johnsone7245742012-09-05 17:12:55 -070067 break;
68 }
69 } while(0);
70
71 return status;
72}
73
74/* ---------------------------------------------------------------------------
75 \fn oemData_OemDataReqClose
76 \brief This function must be called before closing the csr module
Bernala0eafe12013-04-26 09:08:08 -070077 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -070078 -------------------------------------------------------------------------------*/
79
80eHalStatus oemData_OemDataReqClose(tHalHandle hHal)
81{
82 eHalStatus status = eHAL_STATUS_SUCCESS;
83 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
84
85 do
86 {
87 if(!HAL_STATUS_SUCCESS(status))
88 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -080089 smsLog(pMac, LOGE, "oemData_OemDataReqClose: Failed in oemData_OemDataReqClose at StopTimers");
Jeff Johnsone7245742012-09-05 17:12:55 -070090 break;
91 }
92
93 if(pMac->oemData.pOemDataRsp != NULL)
94 {
95 vos_mem_free(pMac->oemData.pOemDataRsp);
96 }
Bernala0eafe12013-04-26 09:08:08 -070097
Jeff Johnsone7245742012-09-05 17:12:55 -070098 //initialize all the variables to null
99 vos_mem_set(&(pMac->oemData), sizeof(tOemDataStruct), 0);
100 } while(0);
101
102 return eHAL_STATUS_SUCCESS;
103}
104
105/* ---------------------------------------------------------------------------
106 \fn oemData_ReleaseOemDataReqCommand
Bernala0eafe12013-04-26 09:08:08 -0700107 \brief This function removes the oemDataCommand from the active list and
Jeff Johnsone7245742012-09-05 17:12:55 -0700108 and frees up any memory occupied by this
Bernala0eafe12013-04-26 09:08:08 -0700109 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700110 -------------------------------------------------------------------------------*/
111void oemData_ReleaseOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataCmd, eOemDataReqStatus oemDataReqStatus)
112{
113 //Do the callback
114 pOemDataCmd->u.oemDataCmd.callback(pMac, pOemDataCmd->u.oemDataCmd.pContext, pOemDataCmd->u.oemDataCmd.oemDataReqID, oemDataReqStatus);
115
116 //First take this command out of the active list
117 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, &pOemDataCmd->Link, LL_ACCESS_LOCK))
118 {
119 vos_mem_set(&(pOemDataCmd->u.oemDataCmd), sizeof(tOemDataCmd), 0);
120
121 //Now put this command back on the avilable command list
122 smeReleaseCommand(pMac, pOemDataCmd);
123 }
124 else
125 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800126 smsLog(pMac, LOGE, "OEM_DATA: **************** oemData_ReleaseOemDataReqCommand cannot release the command");
Jeff Johnsone7245742012-09-05 17:12:55 -0700127 }
128}
129
130/* ---------------------------------------------------------------------------
131 \fn oemData_OemDataReq
132 \brief Request an OEM DATA RSP
133 \param sessionId - Id of session to be used
134 \param pOemDataReqID - pointer to an object to get back the request ID
135 \param callback - a callback function that is called upon finish
136 \param pContext - a pointer passed in for the callback
Bernala0eafe12013-04-26 09:08:08 -0700137 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700138 -------------------------------------------------------------------------------*/
Bernala0eafe12013-04-26 09:08:08 -0700139eHalStatus oemData_OemDataReq(tHalHandle hHal,
Jeff Johnsone7245742012-09-05 17:12:55 -0700140 tANI_U8 sessionId,
Bernala0eafe12013-04-26 09:08:08 -0700141 tOemDataReqConfig *oemDataReqConfig,
142 tANI_U32 *pOemDataReqID,
143 oemData_OemDataReqCompleteCallback callback,
Jeff Johnsone7245742012-09-05 17:12:55 -0700144 void *pContext)
145{
146 eHalStatus status = eHAL_STATUS_SUCCESS;
147 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
148 tSmeCmd *pOemDataCmd = NULL;
149
Bernala0eafe12013-04-26 09:08:08 -0700150 do
Jeff Johnsone7245742012-09-05 17:12:55 -0700151 {
152 if( !CSR_IS_SESSION_VALID( pMac, sessionId ) )
153 {
154 status = eHAL_STATUS_FAILURE;
155 break;
156 }
157
158 pMac->oemData.oemDataReqConfig.sessionId = sessionId;
159 pMac->oemData.callback = callback;
160 pMac->oemData.pContext = pContext;
161 pMac->oemData.oemDataReqID = *(pOemDataReqID);
Bernala0eafe12013-04-26 09:08:08 -0700162
Kiet Lam64c1b492013-07-12 13:56:44 +0530163 vos_mem_copy((v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq),
164 (v_VOID_t*)(oemDataReqConfig->oemDataReq),
165 OEM_DATA_REQ_SIZE);
Bernala0eafe12013-04-26 09:08:08 -0700166
Jeff Johnsone7245742012-09-05 17:12:55 -0700167 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
Bernala0eafe12013-04-26 09:08:08 -0700168
Jeff Johnsone7245742012-09-05 17:12:55 -0700169 pOemDataCmd = smeGetCommandBuffer(pMac);
Bernala0eafe12013-04-26 09:08:08 -0700170
Jeff Johnsone7245742012-09-05 17:12:55 -0700171 //fill up the command before posting it.
172 if(pOemDataCmd)
173 {
174 pOemDataCmd->command = eSmeCommandOemDataReq;
175 pOemDataCmd->u.oemDataCmd.callback = callback;
176 pOemDataCmd->u.oemDataCmd.pContext = pContext;
177 pOemDataCmd->u.oemDataCmd.oemDataReqID = pMac->oemData.oemDataReqID;
Bernala0eafe12013-04-26 09:08:08 -0700178
Jeff Johnsone7245742012-09-05 17:12:55 -0700179 //set the oem data request
180 pOemDataCmd->u.oemDataCmd.oemDataReq.sessionId = pMac->oemData.oemDataReqConfig.sessionId;
Bernala0eafe12013-04-26 09:08:08 -0700181 vos_mem_copy((v_VOID_t*)(pOemDataCmd->u.oemDataCmd.oemDataReq.oemDataReq),
Kiet Lamaa8e15a2014-02-11 23:30:06 -0800182 (v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq),
183 OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -0700184 }
185 else
186 {
187 status = eHAL_STATUS_FAILURE;
188 break;
189 }
Bernala0eafe12013-04-26 09:08:08 -0700190
Jeff Johnsone7245742012-09-05 17:12:55 -0700191 //now queue this command in the sme command queue
192 //Here since this is not interacting with the csr just push the command
193 //into the sme queue. Also push this command with the normal priority
194 smePushCommand(pMac, pOemDataCmd, eANI_BOOLEAN_FALSE);
195
196 } while(0);
197
198 if(!HAL_STATUS_SUCCESS(status) && pOemDataCmd)
199 {
200 oemData_ReleaseOemDataReqCommand(pMac, pOemDataCmd, eOEM_DATA_REQ_FAILURE);
201 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
202 }
203
204 return status;
205}
206
207/* ---------------------------------------------------------------------------
208 \fn oemData_SendMBOemDataReq
209 \brief Request an OEM DATA REQ to be passed down to PE
210 \param pMac:
211 \param pOemDataReq: Pointer to the oem data request
Bernala0eafe12013-04-26 09:08:08 -0700212 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700213 -------------------------------------------------------------------------------*/
214eHalStatus oemData_SendMBOemDataReq(tpAniSirGlobal pMac, tOemDataReq *pOemDataReq)
215{
216 eHalStatus status = eHAL_STATUS_SUCCESS;
217 tSirOemDataReq* pMsg;
Jeff Johnsone7245742012-09-05 17:12:55 -0700218 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pOemDataReq->sessionId );
219
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800220 smsLog(pMac, LOGW, "OEM_DATA: entering Function %s", __func__);
Bernala0eafe12013-04-26 09:08:08 -0700221
Sreelakshmi Konamki8a5362a2016-09-21 15:17:42 +0530222 pMsg = vos_mem_malloc(sizeof(*pMsg));
Kiet Lam64c1b492013-07-12 13:56:44 +0530223 if ( NULL == pMsg )
224 status = eHAL_STATUS_FAILURE;
225 else
226 status = eHAL_STATUS_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -0700227 if(HAL_STATUS_SUCCESS(status))
228 {
Sreelakshmi Konamki8a5362a2016-09-21 15:17:42 +0530229 vos_mem_set(pMsg, sizeof(*pMsg), 0);
Jeff Johnsone7245742012-09-05 17:12:55 -0700230 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_OEM_DATA_REQ);
Sreelakshmi Konamki8a5362a2016-09-21 15:17:42 +0530231 pMsg->messageLen = pal_cpu_to_be16((uint16_t) sizeof(*pMsg));
Kiet Lam64c1b492013-07-12 13:56:44 +0530232 vos_mem_copy(pMsg->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr) );
233 vos_mem_copy(pMsg->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
Kiet Lam64c1b492013-07-12 13:56:44 +0530234 smsLog(pMac, LOGW, "OEM_DATA: sending message to pe%s", __func__);
235 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnsone7245742012-09-05 17:12:55 -0700236 }
237
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800238 smsLog(pMac, LOGW, "OEM_DATA: exiting Function %s", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700239
240 return status;
241}
242
243/* ---------------------------------------------------------------------------
244 \fn oemData_ProcessOemDataReqCommand
245 \brief This function is called by the smeProcessCommand when the case hits
246 eSmeCommandOemDataReq
Bernala0eafe12013-04-26 09:08:08 -0700247 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700248 -------------------------------------------------------------------------------*/
249eHalStatus oemData_ProcessOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataReqCmd)
250{
251 eHalStatus status = eHAL_STATUS_SUCCESS;
252
Bernala0eafe12013-04-26 09:08:08 -0700253 //check if the system is in proper mode of operation for
Jeff Johnsone7245742012-09-05 17:12:55 -0700254 //oem data req/rsp to be functional. Currently, concurrency is not
Bernala0eafe12013-04-26 09:08:08 -0700255 //supported and the driver must be operational only as
256 //STA for oem data req/rsp to be functional. We return an invalid
Jeff Johnsone7245742012-09-05 17:12:55 -0700257 //mode flag if it is operational as any one of the following
258 //in any of the active sessions
259 //1. AP Mode
260 //2. IBSS Mode
261 //3. BTAMP Mode ...
262
263 if(eHAL_STATUS_SUCCESS == oemData_IsOemDataReqAllowed(pMac))
264 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800265 smsLog(pMac, LOG1, "%s: OEM_DATA REQ allowed in the current mode", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700266 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_TRUE;
267 status = oemData_SendMBOemDataReq(pMac, &(pOemDataReqCmd->u.oemDataCmd.oemDataReq));
268 }
269 else
270 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800271 smsLog(pMac, LOG1, "%s: OEM_DATA REQ not allowed in the current mode", __func__);
Padma, Santhosh Kumar6ea8d812015-02-12 13:07:55 +0530272 status = eHAL_STATUS_FAILURE;
273 }
274
275 if(!HAL_STATUS_SUCCESS(status))
276 {
277 smsLog(pMac, LOG1, "%s: OEM_DATA Failure, Release command", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700278 oemData_ReleaseOemDataReqCommand(pMac, pOemDataReqCmd, eOEM_DATA_REQ_INVALID_MODE);
279 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
280 }
281
282 return status;
283}
284
285/* ---------------------------------------------------------------------------
286 \fn sme_HandleOemDataRsp
287 \brief This function processes the oem data response obtained from the PE
288 \param pMsg - Pointer to the pSirOemDataRsp
Bernala0eafe12013-04-26 09:08:08 -0700289 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700290 -------------------------------------------------------------------------------*/
291eHalStatus sme_HandleOemDataRsp(tHalHandle hHal, tANI_U8* pMsg)
292{
293 eHalStatus status = eHAL_STATUS_SUCCESS;
294 tpAniSirGlobal pMac;
295 tListElem *pEntry = NULL;
296 tSmeCmd *pCommand = NULL;
297 tSirOemDataRsp* pOemDataRsp = NULL;
298 pMac = PMAC_STRUCT(hHal);
299
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800300 smsLog(pMac, LOG1, "%s: OEM_DATA Entering", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700301
302 do
303 {
304 if(pMsg == NULL)
305 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800306 smsLog(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700307 status = eHAL_STATUS_FAILURE;
308 break;
309 }
Bernala0eafe12013-04-26 09:08:08 -0700310
Jeff Johnsone7245742012-09-05 17:12:55 -0700311 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
312 if(pEntry)
313 {
314 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
315 if(eSmeCommandOemDataReq == pCommand->command)
316 {
317 pOemDataRsp = (tSirOemDataRsp*)pMsg;
318
319 //make sure to acquire the lock before modifying the data
320 status = sme_AcquireGlobalLock(&pMac->sme);
321 if(!HAL_STATUS_SUCCESS(status))
322 {
323 break;
324 }
325
326 if(pMac->oemData.pOemDataRsp != NULL)
327 {
328 vos_mem_free(pMac->oemData.pOemDataRsp);
329 }
330 pMac->oemData.pOemDataRsp = (tOemDataRsp*)vos_mem_malloc(sizeof(tOemDataRsp));
331
332 if(pMac->oemData.pOemDataRsp == NULL)
333 {
334 sme_ReleaseGlobalLock(&pMac->sme);
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800335 smsLog(pMac, LOGE, "in %s vos_mem_malloc failed for pMac->oemData.pOemDataRsp", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700336 status = eHAL_STATUS_FAILURE;
337 break;
338 }
339
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800340 smsLog(pMac, LOGE, "Before memory copy");
Kiet Lam64c1b492013-07-12 13:56:44 +0530341 vos_mem_copy((v_VOID_t*)(pMac->oemData.pOemDataRsp),
342 (v_VOID_t*)(&pOemDataRsp->oemDataRsp),
343 sizeof(tOemDataRsp));
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800344 smsLog(pMac, LOGE, "after memory copy");
Jeff Johnsone7245742012-09-05 17:12:55 -0700345 sme_ReleaseGlobalLock(&pMac->sme);
346 }
347 else
348 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800349 smsLog(pMac, LOGE, "in %s eWNI_SME_OEM_DATA_RSP Received but NO REQs are ACTIVE ...",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700350 __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700351 status = eHAL_STATUS_FAILURE;
352 break;
353 }
354 }
355 else
356 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800357 smsLog(pMac, LOGE, "in %s eWNI_SME_OEM_DATA_RSP Received but NO commands are ACTIVE ...", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700358 status = eHAL_STATUS_FAILURE;
359 break;
360 }
361
362 oemData_ReleaseOemDataReqCommand(pMac, pCommand, eHAL_STATUS_SUCCESS);
363 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
364
365 } while(0);
366
367 return status;
368}
369
370/* ---------------------------------------------------------------------------
371 \fn oemData_IsOemDataReqAllowed
Bernala0eafe12013-04-26 09:08:08 -0700372 \brief This function checks if OEM DATA REQs can be performed in the
Jeff Johnsone7245742012-09-05 17:12:55 -0700373 current driver state
Bernala0eafe12013-04-26 09:08:08 -0700374 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700375 -------------------------------------------------------------------------------*/
376eHalStatus oemData_IsOemDataReqAllowed(tHalHandle hHal)
377{
378 eHalStatus status = eHAL_STATUS_SUCCESS;
379 tANI_U32 sessionId;
380
381 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
382
383 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
384 {
385 if(CSR_IS_SESSION_VALID(pMac, sessionId))
386 {
Bernala0eafe12013-04-26 09:08:08 -0700387 //co-exist with IBSS or BT-AMP mode is not supported
388 if(csrIsConnStateIbss(pMac, sessionId) || csrIsBTAMP(pMac, sessionId) )
Jeff Johnsone7245742012-09-05 17:12:55 -0700389 {
Bernala0eafe12013-04-26 09:08:08 -0700390 //co-exist with IBSS or BT-AMP mode is not supported
391 smsLog(pMac, LOGW, "OEM DATA REQ is not allowed due to IBSS|BTAMP exist in session %d", sessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -0700392 status = eHAL_STATUS_CSR_WRONG_STATE;
393 break;
394 }
395 }
396 }
397
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800398 smsLog(pMac, LOG1, "Exiting oemData_IsOemDataReqAllowed with status %d", status);
Jeff Johnsone7245742012-09-05 17:12:55 -0700399
400 return (status);
401}
402
403#endif /*FEATURE_OEM_DATA_SUPPORT*/