blob: 2227b60ace2986ebb866347f732606573ca4f260 [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;
218 tANI_U16 msgLen;
219 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pOemDataReq->sessionId );
220
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800221 smsLog(pMac, LOGW, "OEM_DATA: entering Function %s", __func__);
Bernala0eafe12013-04-26 09:08:08 -0700222
Jeff Johnsone7245742012-09-05 17:12:55 -0700223 msgLen = (tANI_U16)(sizeof(tSirOemDataReq));
224
Kiet Lam64c1b492013-07-12 13:56:44 +0530225 pMsg = vos_mem_malloc(msgLen);
226 if ( NULL == pMsg )
227 status = eHAL_STATUS_FAILURE;
228 else
229 status = eHAL_STATUS_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -0700230 if(HAL_STATUS_SUCCESS(status))
231 {
Kiet Lam64c1b492013-07-12 13:56:44 +0530232 vos_mem_set(pMsg, msgLen, 0);
Jeff Johnsone7245742012-09-05 17:12:55 -0700233 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_OEM_DATA_REQ);
Siddharth Bhal88aa5322014-06-19 14:27:15 +0530234 pMsg->messageLen = pal_cpu_to_be16(msgLen);
Kiet Lam64c1b492013-07-12 13:56:44 +0530235 vos_mem_copy(pMsg->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr) );
236 vos_mem_copy(pMsg->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
Kiet Lam64c1b492013-07-12 13:56:44 +0530237 smsLog(pMac, LOGW, "OEM_DATA: sending message to pe%s", __func__);
238 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnsone7245742012-09-05 17:12:55 -0700239 }
240
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800241 smsLog(pMac, LOGW, "OEM_DATA: exiting Function %s", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700242
243 return status;
244}
245
246/* ---------------------------------------------------------------------------
247 \fn oemData_ProcessOemDataReqCommand
248 \brief This function is called by the smeProcessCommand when the case hits
249 eSmeCommandOemDataReq
Bernala0eafe12013-04-26 09:08:08 -0700250 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700251 -------------------------------------------------------------------------------*/
252eHalStatus oemData_ProcessOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataReqCmd)
253{
254 eHalStatus status = eHAL_STATUS_SUCCESS;
255
Bernala0eafe12013-04-26 09:08:08 -0700256 //check if the system is in proper mode of operation for
Jeff Johnsone7245742012-09-05 17:12:55 -0700257 //oem data req/rsp to be functional. Currently, concurrency is not
Bernala0eafe12013-04-26 09:08:08 -0700258 //supported and the driver must be operational only as
259 //STA for oem data req/rsp to be functional. We return an invalid
Jeff Johnsone7245742012-09-05 17:12:55 -0700260 //mode flag if it is operational as any one of the following
261 //in any of the active sessions
262 //1. AP Mode
263 //2. IBSS Mode
264 //3. BTAMP Mode ...
265
266 if(eHAL_STATUS_SUCCESS == oemData_IsOemDataReqAllowed(pMac))
267 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800268 smsLog(pMac, LOG1, "%s: OEM_DATA REQ allowed in the current mode", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700269 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_TRUE;
270 status = oemData_SendMBOemDataReq(pMac, &(pOemDataReqCmd->u.oemDataCmd.oemDataReq));
271 }
272 else
273 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800274 smsLog(pMac, LOG1, "%s: OEM_DATA REQ not allowed in the current mode", __func__);
Padma, Santhosh Kumar6ea8d812015-02-12 13:07:55 +0530275 status = eHAL_STATUS_FAILURE;
276 }
277
278 if(!HAL_STATUS_SUCCESS(status))
279 {
280 smsLog(pMac, LOG1, "%s: OEM_DATA Failure, Release command", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700281 oemData_ReleaseOemDataReqCommand(pMac, pOemDataReqCmd, eOEM_DATA_REQ_INVALID_MODE);
282 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
283 }
284
285 return status;
286}
287
288/* ---------------------------------------------------------------------------
289 \fn sme_HandleOemDataRsp
290 \brief This function processes the oem data response obtained from the PE
291 \param pMsg - Pointer to the pSirOemDataRsp
Bernala0eafe12013-04-26 09:08:08 -0700292 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700293 -------------------------------------------------------------------------------*/
294eHalStatus sme_HandleOemDataRsp(tHalHandle hHal, tANI_U8* pMsg)
295{
296 eHalStatus status = eHAL_STATUS_SUCCESS;
297 tpAniSirGlobal pMac;
298 tListElem *pEntry = NULL;
299 tSmeCmd *pCommand = NULL;
300 tSirOemDataRsp* pOemDataRsp = NULL;
301 pMac = PMAC_STRUCT(hHal);
302
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800303 smsLog(pMac, LOG1, "%s: OEM_DATA Entering", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700304
305 do
306 {
307 if(pMsg == NULL)
308 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800309 smsLog(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700310 status = eHAL_STATUS_FAILURE;
311 break;
312 }
Bernala0eafe12013-04-26 09:08:08 -0700313
Jeff Johnsone7245742012-09-05 17:12:55 -0700314 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
315 if(pEntry)
316 {
317 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
318 if(eSmeCommandOemDataReq == pCommand->command)
319 {
320 pOemDataRsp = (tSirOemDataRsp*)pMsg;
321
322 //make sure to acquire the lock before modifying the data
323 status = sme_AcquireGlobalLock(&pMac->sme);
324 if(!HAL_STATUS_SUCCESS(status))
325 {
326 break;
327 }
328
329 if(pMac->oemData.pOemDataRsp != NULL)
330 {
331 vos_mem_free(pMac->oemData.pOemDataRsp);
332 }
333 pMac->oemData.pOemDataRsp = (tOemDataRsp*)vos_mem_malloc(sizeof(tOemDataRsp));
334
335 if(pMac->oemData.pOemDataRsp == NULL)
336 {
337 sme_ReleaseGlobalLock(&pMac->sme);
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800338 smsLog(pMac, LOGE, "in %s vos_mem_malloc failed for pMac->oemData.pOemDataRsp", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700339 status = eHAL_STATUS_FAILURE;
340 break;
341 }
342
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800343 smsLog(pMac, LOGE, "Before memory copy");
Kiet Lam64c1b492013-07-12 13:56:44 +0530344 vos_mem_copy((v_VOID_t*)(pMac->oemData.pOemDataRsp),
345 (v_VOID_t*)(&pOemDataRsp->oemDataRsp),
346 sizeof(tOemDataRsp));
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800347 smsLog(pMac, LOGE, "after memory copy");
Jeff Johnsone7245742012-09-05 17:12:55 -0700348 sme_ReleaseGlobalLock(&pMac->sme);
349 }
350 else
351 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800352 smsLog(pMac, LOGE, "in %s eWNI_SME_OEM_DATA_RSP Received but NO REQs are ACTIVE ...",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700353 __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700354 status = eHAL_STATUS_FAILURE;
355 break;
356 }
357 }
358 else
359 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800360 smsLog(pMac, LOGE, "in %s eWNI_SME_OEM_DATA_RSP Received but NO commands are ACTIVE ...", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700361 status = eHAL_STATUS_FAILURE;
362 break;
363 }
364
365 oemData_ReleaseOemDataReqCommand(pMac, pCommand, eHAL_STATUS_SUCCESS);
366 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
367
368 } while(0);
369
370 return status;
371}
372
373/* ---------------------------------------------------------------------------
374 \fn oemData_IsOemDataReqAllowed
Bernala0eafe12013-04-26 09:08:08 -0700375 \brief This function checks if OEM DATA REQs can be performed in the
Jeff Johnsone7245742012-09-05 17:12:55 -0700376 current driver state
Bernala0eafe12013-04-26 09:08:08 -0700377 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700378 -------------------------------------------------------------------------------*/
379eHalStatus oemData_IsOemDataReqAllowed(tHalHandle hHal)
380{
381 eHalStatus status = eHAL_STATUS_SUCCESS;
382 tANI_U32 sessionId;
383
384 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
385
386 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
387 {
388 if(CSR_IS_SESSION_VALID(pMac, sessionId))
389 {
Bernala0eafe12013-04-26 09:08:08 -0700390 //co-exist with IBSS or BT-AMP mode is not supported
391 if(csrIsConnStateIbss(pMac, sessionId) || csrIsBTAMP(pMac, sessionId) )
Jeff Johnsone7245742012-09-05 17:12:55 -0700392 {
Bernala0eafe12013-04-26 09:08:08 -0700393 //co-exist with IBSS or BT-AMP mode is not supported
394 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 -0700395 status = eHAL_STATUS_CSR_WRONG_STATE;
396 break;
397 }
398 }
399 }
400
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800401 smsLog(pMac, LOG1, "Exiting oemData_IsOemDataReqAllowed with status %d", status);
Jeff Johnsone7245742012-09-05 17:12:55 -0700402
403 return (status);
404}
405
406#endif /*FEATURE_OEM_DATA_SUPPORT*/