blob: 9d8580c4554976812d76f21f16ede4af5bc332d4 [file] [log] [blame]
Jeff Johnsone7245742012-09-05 17:12:55 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -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.
20 */
21/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnsone7245742012-09-05 17:12:55 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42#ifdef FEATURE_OEM_DATA_SUPPORT
Bernala0eafe12013-04-26 09:08:08 -070043/** ------------------------------------------------------------------------- *
44 ------------------------------------------------------------------------- *
Jeff Johnsone7245742012-09-05 17:12:55 -070045
Bernala0eafe12013-04-26 09:08:08 -070046
Jeff Johnsone7245742012-09-05 17:12:55 -070047 \file oemDataApi.c
Bernala0eafe12013-04-26 09:08:08 -070048
Jeff Johnsone7245742012-09-05 17:12:55 -070049 Implementation for the OEM DATA REQ/RSP interfaces.
Jeff Johnsone7245742012-09-05 17:12:55 -070050 ========================================================================== */
51#include "aniGlobal.h"
52#include "oemDataApi.h"
53#include "palApi.h"
54#include "smeInside.h"
55#include "smsDebug.h"
56
57#include "csrSupport.h"
58#include "wlan_qct_tl.h"
59
60#include "vos_diag_core_log.h"
61#include "vos_diag_core_event.h"
62
63/* ---------------------------------------------------------------------------
64 \fn oemData_OemDataReqOpen
65 \brief This function must be called before any API call to (OEM DATA REQ/RSP module)
Bernala0eafe12013-04-26 09:08:08 -070066 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -070067 -------------------------------------------------------------------------------*/
68
69eHalStatus oemData_OemDataReqOpen(tHalHandle hHal)
70{
71 eHalStatus status = eHAL_STATUS_SUCCESS;
72 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
73
74 do
75 {
76 //initialize all the variables to null
77 vos_mem_set(&(pMac->oemData), sizeof(tOemDataStruct), 0);
78 if(!HAL_STATUS_SUCCESS(status))
79 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -080080 smsLog(pMac, LOGE, "oemData_OemDataReqOpen: Cannot allocate memory for the timer function");
Jeff Johnsone7245742012-09-05 17:12:55 -070081 break;
82 }
83 } while(0);
84
85 return status;
86}
87
88/* ---------------------------------------------------------------------------
89 \fn oemData_OemDataReqClose
90 \brief This function must be called before closing the csr module
Bernala0eafe12013-04-26 09:08:08 -070091 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -070092 -------------------------------------------------------------------------------*/
93
94eHalStatus oemData_OemDataReqClose(tHalHandle hHal)
95{
96 eHalStatus status = eHAL_STATUS_SUCCESS;
97 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
98
99 do
100 {
101 if(!HAL_STATUS_SUCCESS(status))
102 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800103 smsLog(pMac, LOGE, "oemData_OemDataReqClose: Failed in oemData_OemDataReqClose at StopTimers");
Jeff Johnsone7245742012-09-05 17:12:55 -0700104 break;
105 }
106
107 if(pMac->oemData.pOemDataRsp != NULL)
108 {
109 vos_mem_free(pMac->oemData.pOemDataRsp);
110 }
Bernala0eafe12013-04-26 09:08:08 -0700111
Jeff Johnsone7245742012-09-05 17:12:55 -0700112 //initialize all the variables to null
113 vos_mem_set(&(pMac->oemData), sizeof(tOemDataStruct), 0);
114 } while(0);
115
116 return eHAL_STATUS_SUCCESS;
117}
118
119/* ---------------------------------------------------------------------------
120 \fn oemData_ReleaseOemDataReqCommand
Bernala0eafe12013-04-26 09:08:08 -0700121 \brief This function removes the oemDataCommand from the active list and
Jeff Johnsone7245742012-09-05 17:12:55 -0700122 and frees up any memory occupied by this
Bernala0eafe12013-04-26 09:08:08 -0700123 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700124 -------------------------------------------------------------------------------*/
125void oemData_ReleaseOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataCmd, eOemDataReqStatus oemDataReqStatus)
126{
127 //Do the callback
128 pOemDataCmd->u.oemDataCmd.callback(pMac, pOemDataCmd->u.oemDataCmd.pContext, pOemDataCmd->u.oemDataCmd.oemDataReqID, oemDataReqStatus);
129
130 //First take this command out of the active list
131 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, &pOemDataCmd->Link, LL_ACCESS_LOCK))
132 {
133 vos_mem_set(&(pOemDataCmd->u.oemDataCmd), sizeof(tOemDataCmd), 0);
134
135 //Now put this command back on the avilable command list
136 smeReleaseCommand(pMac, pOemDataCmd);
137 }
138 else
139 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800140 smsLog(pMac, LOGE, "OEM_DATA: **************** oemData_ReleaseOemDataReqCommand cannot release the command");
Jeff Johnsone7245742012-09-05 17:12:55 -0700141 }
142}
143
144/* ---------------------------------------------------------------------------
145 \fn oemData_OemDataReq
146 \brief Request an OEM DATA RSP
147 \param sessionId - Id of session to be used
148 \param pOemDataReqID - pointer to an object to get back the request ID
149 \param callback - a callback function that is called upon finish
150 \param pContext - a pointer passed in for the callback
Bernala0eafe12013-04-26 09:08:08 -0700151 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700152 -------------------------------------------------------------------------------*/
Bernala0eafe12013-04-26 09:08:08 -0700153eHalStatus oemData_OemDataReq(tHalHandle hHal,
Jeff Johnsone7245742012-09-05 17:12:55 -0700154 tANI_U8 sessionId,
Bernala0eafe12013-04-26 09:08:08 -0700155 tOemDataReqConfig *oemDataReqConfig,
156 tANI_U32 *pOemDataReqID,
157 oemData_OemDataReqCompleteCallback callback,
Jeff Johnsone7245742012-09-05 17:12:55 -0700158 void *pContext)
159{
160 eHalStatus status = eHAL_STATUS_SUCCESS;
161 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
162 tSmeCmd *pOemDataCmd = NULL;
163
Bernala0eafe12013-04-26 09:08:08 -0700164 do
Jeff Johnsone7245742012-09-05 17:12:55 -0700165 {
166 if( !CSR_IS_SESSION_VALID( pMac, sessionId ) )
167 {
168 status = eHAL_STATUS_FAILURE;
169 break;
170 }
171
172 pMac->oemData.oemDataReqConfig.sessionId = sessionId;
173 pMac->oemData.callback = callback;
174 pMac->oemData.pContext = pContext;
175 pMac->oemData.oemDataReqID = *(pOemDataReqID);
Bernala0eafe12013-04-26 09:08:08 -0700176
Kiet Lam64c1b492013-07-12 13:56:44 +0530177 vos_mem_copy((v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq),
178 (v_VOID_t*)(oemDataReqConfig->oemDataReq),
179 OEM_DATA_REQ_SIZE);
Bernala0eafe12013-04-26 09:08:08 -0700180
Jeff Johnsone7245742012-09-05 17:12:55 -0700181 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
Bernala0eafe12013-04-26 09:08:08 -0700182
Jeff Johnsone7245742012-09-05 17:12:55 -0700183 pOemDataCmd = smeGetCommandBuffer(pMac);
Bernala0eafe12013-04-26 09:08:08 -0700184
Jeff Johnsone7245742012-09-05 17:12:55 -0700185 //fill up the command before posting it.
186 if(pOemDataCmd)
187 {
188 pOemDataCmd->command = eSmeCommandOemDataReq;
189 pOemDataCmd->u.oemDataCmd.callback = callback;
190 pOemDataCmd->u.oemDataCmd.pContext = pContext;
191 pOemDataCmd->u.oemDataCmd.oemDataReqID = pMac->oemData.oemDataReqID;
Bernala0eafe12013-04-26 09:08:08 -0700192
Jeff Johnsone7245742012-09-05 17:12:55 -0700193 //set the oem data request
194 pOemDataCmd->u.oemDataCmd.oemDataReq.sessionId = pMac->oemData.oemDataReqConfig.sessionId;
Bernala0eafe12013-04-26 09:08:08 -0700195 vos_mem_copy((v_VOID_t*)(pOemDataCmd->u.oemDataCmd.oemDataReq.oemDataReq),
Kiet Lam64c1b492013-07-12 13:56:44 +0530196 (v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq),
197 OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -0700198 }
199 else
200 {
201 status = eHAL_STATUS_FAILURE;
202 break;
203 }
Bernala0eafe12013-04-26 09:08:08 -0700204
Jeff Johnsone7245742012-09-05 17:12:55 -0700205 //now queue this command in the sme command queue
206 //Here since this is not interacting with the csr just push the command
207 //into the sme queue. Also push this command with the normal priority
208 smePushCommand(pMac, pOemDataCmd, eANI_BOOLEAN_FALSE);
209
210 } while(0);
211
212 if(!HAL_STATUS_SUCCESS(status) && pOemDataCmd)
213 {
214 oemData_ReleaseOemDataReqCommand(pMac, pOemDataCmd, eOEM_DATA_REQ_FAILURE);
215 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
216 }
217
218 return status;
219}
220
221/* ---------------------------------------------------------------------------
222 \fn oemData_SendMBOemDataReq
223 \brief Request an OEM DATA REQ to be passed down to PE
224 \param pMac:
225 \param pOemDataReq: Pointer to the oem data request
Bernala0eafe12013-04-26 09:08:08 -0700226 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700227 -------------------------------------------------------------------------------*/
228eHalStatus oemData_SendMBOemDataReq(tpAniSirGlobal pMac, tOemDataReq *pOemDataReq)
229{
230 eHalStatus status = eHAL_STATUS_SUCCESS;
231 tSirOemDataReq* pMsg;
232 tANI_U16 msgLen;
233 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pOemDataReq->sessionId );
234
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800235 smsLog(pMac, LOGW, "OEM_DATA: entering Function %s", __func__);
Bernala0eafe12013-04-26 09:08:08 -0700236
Jeff Johnsone7245742012-09-05 17:12:55 -0700237 msgLen = (tANI_U16)(sizeof(tSirOemDataReq));
238
Kiet Lam64c1b492013-07-12 13:56:44 +0530239 pMsg = vos_mem_malloc(msgLen);
240 if ( NULL == pMsg )
241 status = eHAL_STATUS_FAILURE;
242 else
243 status = eHAL_STATUS_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -0700244 if(HAL_STATUS_SUCCESS(status))
245 {
Kiet Lam64c1b492013-07-12 13:56:44 +0530246 vos_mem_set(pMsg, msgLen, 0);
Jeff Johnsone7245742012-09-05 17:12:55 -0700247 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_OEM_DATA_REQ);
Kiet Lam64c1b492013-07-12 13:56:44 +0530248 vos_mem_copy(pMsg->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr) );
249 vos_mem_copy(pMsg->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
250
251 smsLog(pMac, LOGW, "OEM_DATA: sending message to pe%s", __func__);
252 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnsone7245742012-09-05 17:12:55 -0700253 }
254
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800255 smsLog(pMac, LOGW, "OEM_DATA: exiting Function %s", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700256
257 return status;
258}
259
260/* ---------------------------------------------------------------------------
261 \fn oemData_ProcessOemDataReqCommand
262 \brief This function is called by the smeProcessCommand when the case hits
263 eSmeCommandOemDataReq
Bernala0eafe12013-04-26 09:08:08 -0700264 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700265 -------------------------------------------------------------------------------*/
266eHalStatus oemData_ProcessOemDataReqCommand(tpAniSirGlobal pMac, tSmeCmd *pOemDataReqCmd)
267{
268 eHalStatus status = eHAL_STATUS_SUCCESS;
269
Bernala0eafe12013-04-26 09:08:08 -0700270 //check if the system is in proper mode of operation for
Jeff Johnsone7245742012-09-05 17:12:55 -0700271 //oem data req/rsp to be functional. Currently, concurrency is not
Bernala0eafe12013-04-26 09:08:08 -0700272 //supported and the driver must be operational only as
273 //STA for oem data req/rsp to be functional. We return an invalid
Jeff Johnsone7245742012-09-05 17:12:55 -0700274 //mode flag if it is operational as any one of the following
275 //in any of the active sessions
276 //1. AP Mode
277 //2. IBSS Mode
278 //3. BTAMP Mode ...
279
280 if(eHAL_STATUS_SUCCESS == oemData_IsOemDataReqAllowed(pMac))
281 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800282 smsLog(pMac, LOG1, "%s: OEM_DATA REQ allowed in the current mode", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700283 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_TRUE;
284 status = oemData_SendMBOemDataReq(pMac, &(pOemDataReqCmd->u.oemDataCmd.oemDataReq));
285 }
286 else
287 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800288 smsLog(pMac, LOG1, "%s: OEM_DATA REQ not allowed in the current mode", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700289 oemData_ReleaseOemDataReqCommand(pMac, pOemDataReqCmd, eOEM_DATA_REQ_INVALID_MODE);
290 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
291 }
292
293 return status;
294}
295
296/* ---------------------------------------------------------------------------
297 \fn sme_HandleOemDataRsp
298 \brief This function processes the oem data response obtained from the PE
299 \param pMsg - Pointer to the pSirOemDataRsp
Bernala0eafe12013-04-26 09:08:08 -0700300 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700301 -------------------------------------------------------------------------------*/
302eHalStatus sme_HandleOemDataRsp(tHalHandle hHal, tANI_U8* pMsg)
303{
304 eHalStatus status = eHAL_STATUS_SUCCESS;
305 tpAniSirGlobal pMac;
306 tListElem *pEntry = NULL;
307 tSmeCmd *pCommand = NULL;
308 tSirOemDataRsp* pOemDataRsp = NULL;
309 pMac = PMAC_STRUCT(hHal);
310
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800311 smsLog(pMac, LOG1, "%s: OEM_DATA Entering", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700312
313 do
314 {
315 if(pMsg == NULL)
316 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800317 smsLog(pMac, LOGE, "in %s msg ptr is NULL", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700318 status = eHAL_STATUS_FAILURE;
319 break;
320 }
Bernala0eafe12013-04-26 09:08:08 -0700321
Jeff Johnsone7245742012-09-05 17:12:55 -0700322 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
323 if(pEntry)
324 {
325 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
326 if(eSmeCommandOemDataReq == pCommand->command)
327 {
328 pOemDataRsp = (tSirOemDataRsp*)pMsg;
329
330 //make sure to acquire the lock before modifying the data
331 status = sme_AcquireGlobalLock(&pMac->sme);
332 if(!HAL_STATUS_SUCCESS(status))
333 {
334 break;
335 }
336
337 if(pMac->oemData.pOemDataRsp != NULL)
338 {
339 vos_mem_free(pMac->oemData.pOemDataRsp);
340 }
341 pMac->oemData.pOemDataRsp = (tOemDataRsp*)vos_mem_malloc(sizeof(tOemDataRsp));
342
343 if(pMac->oemData.pOemDataRsp == NULL)
344 {
345 sme_ReleaseGlobalLock(&pMac->sme);
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800346 smsLog(pMac, LOGE, "in %s vos_mem_malloc failed for pMac->oemData.pOemDataRsp", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700347 status = eHAL_STATUS_FAILURE;
348 break;
349 }
350
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800351 smsLog(pMac, LOGE, "Before memory copy");
Kiet Lam64c1b492013-07-12 13:56:44 +0530352 vos_mem_copy((v_VOID_t*)(pMac->oemData.pOemDataRsp),
353 (v_VOID_t*)(&pOemDataRsp->oemDataRsp),
354 sizeof(tOemDataRsp));
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800355 smsLog(pMac, LOGE, "after memory copy");
Jeff Johnsone7245742012-09-05 17:12:55 -0700356 sme_ReleaseGlobalLock(&pMac->sme);
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 REQs are ACTIVE ...",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700361 __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700362 status = eHAL_STATUS_FAILURE;
363 break;
364 }
365 }
366 else
367 {
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800368 smsLog(pMac, LOGE, "in %s eWNI_SME_OEM_DATA_RSP Received but NO commands are ACTIVE ...", __func__);
Jeff Johnsone7245742012-09-05 17:12:55 -0700369 status = eHAL_STATUS_FAILURE;
370 break;
371 }
372
373 oemData_ReleaseOemDataReqCommand(pMac, pCommand, eHAL_STATUS_SUCCESS);
374 pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE;
375
376 } while(0);
377
378 return status;
379}
380
381/* ---------------------------------------------------------------------------
382 \fn oemData_IsOemDataReqAllowed
Bernala0eafe12013-04-26 09:08:08 -0700383 \brief This function checks if OEM DATA REQs can be performed in the
Jeff Johnsone7245742012-09-05 17:12:55 -0700384 current driver state
Bernala0eafe12013-04-26 09:08:08 -0700385 \return eHalStatus
Jeff Johnsone7245742012-09-05 17:12:55 -0700386 -------------------------------------------------------------------------------*/
387eHalStatus oemData_IsOemDataReqAllowed(tHalHandle hHal)
388{
389 eHalStatus status = eHAL_STATUS_SUCCESS;
390 tANI_U32 sessionId;
391
392 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
393
394 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
395 {
396 if(CSR_IS_SESSION_VALID(pMac, sessionId))
397 {
Bernala0eafe12013-04-26 09:08:08 -0700398 //co-exist with IBSS or BT-AMP mode is not supported
399 if(csrIsConnStateIbss(pMac, sessionId) || csrIsBTAMP(pMac, sessionId) )
Jeff Johnsone7245742012-09-05 17:12:55 -0700400 {
Bernala0eafe12013-04-26 09:08:08 -0700401 //co-exist with IBSS or BT-AMP mode is not supported
402 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 -0700403 status = eHAL_STATUS_CSR_WRONG_STATE;
404 break;
405 }
406 }
407 }
408
Kiran Kumar Lokere691dde12013-03-06 17:00:31 -0800409 smsLog(pMac, LOG1, "Exiting oemData_IsOemDataReqAllowed with status %d", status);
Jeff Johnsone7245742012-09-05 17:12:55 -0700410
411 return (status);
412}
413
414#endif /*FEATURE_OEM_DATA_SUPPORT*/