blob: 54e74d3d7a430eb0be40140af91b3ec9617173e3 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -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 Johnson295189b2012-06-20 16:38:30 -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/**========================================================================
43
44 \file wlan_hdd_ftm.c
45
46 \brief This file contains the WLAN factory test mode implementation
47
48 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
49
50 Qualcomm Confidential and Proprietary.
51
52 ========================================================================*/
53
54/**=========================================================================
55
56 EDIT HISTORY FOR FILE
57
58
59 This section contains comments describing changes made to the module.
60 Notice that changes are listed in reverse chronological order.
61
62
63 $Header:$ $DateTime: $ $Author: $
64
65
66 when who what, where, why
67 -------- --- --------------------------------------------------------
68 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
69 for FTM and mission mode
70 04/5/09 Shailender Created module.
71
72 ==========================================================================*/
73#include <vos_mq.h>
74#include "vos_sched.h"
75#include <vos_api.h>
76#include "sirTypes.h"
77#include "halTypes.h"
78#include "sirApi.h"
79#include "sirMacProtDef.h"
80#include "sme_Api.h"
81#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070082#include "wlan_qct_sys.h"
83#include "wlan_qct_tl.h"
84#include "wlan_hdd_misc.h"
85#include "i_vos_packet.h"
86#include "vos_nvitem.h"
87#include "wlan_hdd_main.h"
88#include "vos_power.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070089#include "qwlan_version.h"
90
Jeff Johnson295189b2012-06-20 16:38:30 -070091#include "wlan_nv.h"
92#include "wlan_qct_wda.h"
93#include "cfgApi.h"
94#include "pttMsgApi.h"
95#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070096
Jeff Johnson295189b2012-06-20 16:38:30 -070097#define RXMODE_DISABLE_ALL 0
98#define RXMODE_ENABLE_ALL 1
99#define RXMODE_ENABLE_11GN 2
100#define RXMODE_ENABLE_11B 3
101
102#define FTM_CHAIN_SEL_NO_RX_TX 0
103#define FTM_CHAIN_SEL_R0_ON 1
104#define FTM_CHAIN_SEL_T0_ON 2
105#define FTM_CHAIN_SEL_R0_T0_ON 3
106#define FTM_CHAIN_SEL_MAX 3
107
Jeff Johnson295189b2012-06-20 16:38:30 -0700108#ifndef QWLAN_PHYDBG_BASE
109#define QWLAN_PHYDBG_BASE 0x03004000
110#endif /* QWLAN_PHYDBG_BASE */
111
112#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800113#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700114#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
115#endif
116
117#ifndef QWLAN_AGC_BASE
118#define QWLAN_AGC_BASE 0x03013C00
119#endif /* QWLAN_AGC_BASE */
120
121#ifndef QWLAN_AGC_CHANNEL_FREQ_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800122#define QWLAN_AGC_CHANNEL_FREQ_REG (QWLAN_AGC_BASE + 0x34)
Jeff Johnson295189b2012-06-20 16:38:30 -0700123#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
124#endif /* QWLAN_AGC_CHANNEL_FREQ_REG */
125
126#ifndef QWLAN_AGC_SUBBAND_CONFIG_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800127#define QWLAN_AGC_SUBBAND_CONFIG_REG (QWLAN_AGC_BASE + 0x30)
Jeff Johnson295189b2012-06-20 16:38:30 -0700128#define QWLAN_AGC_SUBBAND_CONFIG_STG2_SUBBAND_MASK 0x03
129#endif /* QWLAN_AGC_SUBBAND_CONFIG_REG */
130
131#ifndef QWLAN_RFAPB_BASE
132#define QWLAN_RFAPB_BASE 0x0E02F800
133#endif /* QWLAN_RFAPB_BASE */
134
135#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800136#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700137#endif /* QWLAN_RFAPB_REV_ID_REG */
138
139#ifndef QWLAN_TXCTL_BASE
140#define QWLAN_TXCTL_BASE 0x03012000
141#endif /* QWLAN_TXCTL_BASE */
142
143#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800144#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700145#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
146#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
147#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
148#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
149#endif /* QWLAN_TXCTL_FSHIFT_REG */
150
151/* To set 4MAC addresses from given first MAC address,
152 * Last byte value within given MAC address must less than 0xFF - 3 */
153#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
154
155typedef struct {
156 tANI_U32 tableSize; /* Whole NV Table Size */
157 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
158 eNvTable nvTable;
159 tANI_U8 tableData; /* Filled by host driver */
160} pttGetNvTable;
161
162typedef struct {
163 tANI_U32 tableSize; /* Whole NV Table Size */
164 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
165 eNvTable nvTable;
166 tANI_U8 tableData;
167} pttSetNvTable;
168
Jeff Johnson295189b2012-06-20 16:38:30 -0700169
170extern const sHalNv nvDefaults;
171static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700172static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -0700173
174/* for PRIMA: all the available frequency, channal pair i the table are defined for channel frequency @ RF center frequency
175 Since it is associated to agc.channel_freq register for mapping.
176 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
177*/
178static const freq_chan_t freq_chan_tbl[] = {
179 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
180 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
181};
182
183static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
184{
185 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
186 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
187 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
188 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
189 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
190 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
191 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
192 //Spica_Virgo 11A 20MHz Rates
193 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
194 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
195 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
196 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
197 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
198 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
199 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
200 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
201
202//MCS Index #0-15 (20MHz)
203 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
204 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
205 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
206 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
207 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
208 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
209 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
210 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
211 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_72_2_MBPS"}
212};
213
214static rateIndex2Preamble_t rate_index_2_preamble_table[] =
215{
216
217 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
218 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
219 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
220 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
221 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
222 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
223 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
224
Jeff Johnson295189b2012-06-20 16:38:30 -0700225
226 //Spica_Virgo 11A 20MHz Rates
227 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
228 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
229 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
230 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
231 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
232 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
233 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
234 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
235
236 //MCS Index #0-15 (20MHz)
237 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
238 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
239 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
240 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
241 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
242 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
243 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
244 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
245 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
246 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
247 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
248 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
249 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
250 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
251 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
252 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
253};
254
255typedef struct
256{
257 tANI_BOOLEAN frameGenEnabled;
258 tANI_BOOLEAN wfmEnabled;
259 sPttFrameGenParams frameParams;
260 v_U16_t txpower;
261 v_U16_t rxmode;
262 v_U16_t chainSelect;
263
264} FTM_STATUS ;
265static FTM_STATUS ftm_status;
266
267//tpAniSirGlobal pMac;
268
269static void _ftm_status_init(void)
270{
271 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
272 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
273 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
274
275 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
276 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
277 ftm_status.frameParams.numTestPackets = 0; //Continuous
278 ftm_status.frameParams.interFrameSpace = 10;
279 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
280 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
281 ftm_status.frameParams.payloadLength = 2000;
282 ftm_status.frameParams.payloadFillByte = 0xA5;
283 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
284 ftm_status.frameParams.tx_mode = 0;
285 ftm_status.frameParams.crc = 0;
286 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
287 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
288 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
289 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
290 ftm_status.txpower = 2 ;
291 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
292 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
293
294 return;
295}
296
297/**---------------------------------------------------------------------------
298
299 \brief wlan_ftm_postmsg() -
300
301 The function used for sending the command to the halphy.
302
303 \param - cmd_ptr - Pointer command buffer.
304
305 \param - cmd_len - Command length.
306
307 \return - 0 for success, non zero for failure
308
309 --------------------------------------------------------------------------*/
310
311static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
312{
313 vos_msg_t *ftmReqMsg;
314 vos_msg_t ftmMsg;
315 ENTER();
316
317 ftmReqMsg = (vos_msg_t *) cmd_ptr;
318
Jeff Johnson295189b2012-06-20 16:38:30 -0700319 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700320 ftmMsg.reserved = 0;
321 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
322 ftmMsg.bodyval = 0;
323
324 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700325 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700326 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700327 (vos_msg_t *)&ftmMsg)) {
328 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL\n",__func__);
329
330 return VOS_STATUS_E_FAILURE;
331 }
332
333 EXIT();
334 return VOS_STATUS_SUCCESS;
335}
336
337/*---------------------------------------------------------------------------
338
339 \brief wlan_ftm_vos_open() - Open the vOSS Module
340
341 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
342 Upon successful initialization:
343
344 - All VOS submodules should have been initialized
345
346 - The VOS scheduler should have opened
347
348 - All the WLAN SW components should have been opened. This include
349 MAC.
350
351
352 \param hddContextSize: Size of the HDD context to allocate.
353
354
355 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
356 is ready to be used.
357
358 VOS_STATUS_E_RESOURCES - System resources (other than memory)
359 are unavailable to initialize the scheduler
360
361
362 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
363
364 \sa wlan_ftm_vos_open()
365
366---------------------------------------------------------------------------*/
367static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_SIZE_t hddContextSize )
368{
369 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
370 int iter = 0;
371 tSirRetStatus sirStatus = eSIR_SUCCESS;
372 tMacOpenParameters macOpenParms;
373 pVosContextType gpVosContext = (pVosContextType)pVosContext;
374
375 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
376 "%s: Opening VOSS", __func__);
377
378 if (NULL == gpVosContext)
379 {
380 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
381 "%s: Trying to open VOSS without a PreOpen",__func__);
382 VOS_ASSERT(0);
383 return VOS_STATUS_E_FAILURE;
384 }
385
386 /* Initialize the probe event */
387 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
388 {
389 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
390 "%s: Unable to init probeEvent",__func__);
391 VOS_ASSERT(0);
392 return VOS_STATUS_E_FAILURE;
393 }
394
Jeff Johnson295189b2012-06-20 16:38:30 -0700395 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
396 {
397 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
398 "%s: Unable to init wdaCompleteEvent",__func__);
399 VOS_ASSERT(0);
400
401 goto err_probe_event;
402 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700403
404 /* Initialize the free message queue */
405 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
406 if (! VOS_IS_STATUS_SUCCESS(vStatus))
407 {
408
409 /* Critical Error ... Cannot proceed further */
410 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
411 "%s: Failed to initialize VOS free message queue",__func__);
412 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700413 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700414 }
415
416 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
417 {
418 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
419 &(gpVosContext->aMsgBuffers[iter]);
420 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
421 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
422 }
423
424 /* Now Open the VOS Scheduler */
425 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
426 sizeof(VosSchedContext));
427
428 if (!VOS_IS_STATUS_SUCCESS(vStatus))
429 {
430 /* Critical Error ... Cannot proceed further */
431 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
432 "%s: Failed to open VOS Scheduler", __func__);
433 VOS_ASSERT(0);
434 goto err_msg_queue;
435 }
436
437 /* Open the SYS module */
438 vStatus = sysOpen(gpVosContext);
439
440 if (!VOS_IS_STATUS_SUCCESS(vStatus))
441 {
442 /* Critical Error ... Cannot proceed further */
443 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
444 "%s: Failed to open SYS module",__func__);
445 VOS_ASSERT(0);
446 goto err_sched_close;
447 }
448
Jeff Johnson295189b2012-06-20 16:38:30 -0700449 /*Open the WDA module */
450 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
451 macOpenParms.driverType = eDRIVER_TYPE_MFG;
452 vStatus = WDA_open(gpVosContext, gpVosContext->pHDDContext, &macOpenParms);
453 if (!VOS_IS_STATUS_SUCCESS(vStatus))
454 {
455 /* Critical Error ... Cannot proceed further */
456 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
457 "%s: Failed to open WDA module",__func__);
458 VOS_ASSERT(0);
459 goto err_sys_close;
460 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700461
462 /* initialize the NV module */
463 vStatus = vos_nv_open();
464 if (!VOS_IS_STATUS_SUCCESS(vStatus))
465 {
466 // NV module cannot be initialized, however the driver is allowed
467 // to proceed
468 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
469 "%s: Failed to initialize the NV module", __func__);
470 goto err_wda_close;
471 }
472
Jeff Johnson295189b2012-06-20 16:38:30 -0700473 /* If we arrive here, both threads dispacthing messages correctly */
474
475 /* Now proceed to open the MAC */
476
477 /* UMA is supported in hardware for performing the
478 frame translation 802.11 <-> 802.3 */
479 macOpenParms.frameTransRequired = 1;
480 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
481 &macOpenParms);
482
483 if (eSIR_SUCCESS != sirStatus)
484 {
485 /* Critical Error ... Cannot proceed further */
486 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
487 "%s: Failed to open MAC", __func__);
488 VOS_ASSERT(0);
489 goto err_nv_close;
490 }
491
Jeff Johnson295189b2012-06-20 16:38:30 -0700492 /* Now proceed to open the SME */
493 vStatus = sme_Open(gpVosContext->pMACContext);
494 if (!VOS_IS_STATUS_SUCCESS(vStatus))
495 {
496 /* Critical Error ... Cannot proceed further */
497 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
498 "%s: Failed to open SME",__func__);
499 goto err_mac_close;
500 }
501 return VOS_STATUS_SUCCESS;
502
Jeff Johnson295189b2012-06-20 16:38:30 -0700503
504 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
505 "%s: VOSS successfully Opened",__func__);
506
507 return VOS_STATUS_SUCCESS;
508err_mac_close:
509 macClose(gpVosContext->pMACContext);
510
511err_nv_close:
512 vos_nv_close();
513
514err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700515 WDA_close(gpVosContext);
516
517err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700518 sysClose(gpVosContext);
519
520err_sched_close:
521 vos_sched_close(gpVosContext);
522err_msg_queue:
523 vos_mq_deinit(&gpVosContext->freeVosMq);
524
Jeff Johnson295189b2012-06-20 16:38:30 -0700525err_wda_complete_event:
526 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700527
528err_probe_event:
529 vos_event_destroy(&gpVosContext->ProbeEvent);
530
531 return VOS_STATUS_E_FAILURE;
532
533} /* wlan_ftm_vos_open() */
534
535/*---------------------------------------------------------------------------
536
537 \brief wlan_ftm_vos_close() - Close the vOSS Module
538
539 The \a wlan_ftm_vos_close() function closes the vOSS Module
540
541 \param vosContext context of vos
542
543 \return VOS_STATUS_SUCCESS - successfully closed
544
545 \sa wlan_ftm_vos_close()
546
547---------------------------------------------------------------------------*/
548
549static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
550{
551 VOS_STATUS vosStatus;
552 pVosContextType gpVosContext = (pVosContextType)vosContext;
553
Jeff Johnson295189b2012-06-20 16:38:30 -0700554 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
555 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
556 {
557 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
558 "%s: Failed to close BAL",__func__);
559 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
560 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700561
562 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
563 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
564 {
565 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
566 "%s: Failed to close MAC",__func__);
567 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
568 }
569
570 ((pVosContextType)vosContext)->pMACContext = NULL;
571
572 vosStatus = vos_nv_close();
573 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
574 {
575 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
576 "%s: Failed to close NV",__func__);
577 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
578 }
579
580
581 vosStatus = sysClose( vosContext );
582 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
583 {
584 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
585 "%s: Failed to close SYS",__func__);
586 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
587 }
588
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 vosStatus = WDA_close( vosContext );
590 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
591 {
592 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
593 "%s: Failed to close WDA",__func__);
594 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
595 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700596
597 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
598
599 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
600 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
601 {
602 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
603 "%s: Failed to destroy ProbeEvent",__func__);
604 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
605 }
606
Jeff Johnson295189b2012-06-20 16:38:30 -0700607 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
608 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
609 {
610 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
611 "%s: Failed to destroy wdaCompleteEvent",__func__);
612 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
613 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700614
615 return VOS_STATUS_SUCCESS;
616}
617
618/**---------------------------------------------------------------------------
619
620 \brief wlan_ftm_priv_set_txifs() -
621
622 This function is used for
623
624 \param - pAdapter - Pointer HDD Context.
625 - ifs
626
627 \return - 0 for success, non zero for failure
628
629 --------------------------------------------------------------------------*/
630
631
632
633static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
634{
635 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
636 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
637 {
638 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
639 return VOS_STATUS_E_FAILURE;
640 }
641
642 /* do not allow to change setting when tx pktgen is enabled */
643 if (ftm_status.frameGenEnabled)
644 {
645 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
646 return VOS_STATUS_E_FAILURE;
647 }
648
649 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
650 {
651 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:ifs value is invalid ",__func__);
652 return VOS_STATUS_E_FAILURE;
653 }
654
655 ftm_status.frameParams.interFrameSpace = ifs;
656
657 return VOS_STATUS_SUCCESS;
658}
659
660/**---------------------------------------------------------------------------
661
662 \brief wlan_ftm_priv_set_txpktcnt() -
663
664 This function is used for
665
666 \param - pAdapter - Pointer HDD Context.
667 - ifs
668
669 \return - 0 for success, non zero for failure
670
671 --------------------------------------------------------------------------*/
672
673static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
674{
675 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
676 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
677 {
678 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
679 return VOS_STATUS_E_FAILURE;
680 }
681
682 /* do not allow to change setting when tx pktgen is enabled */
683 if (ftm_status.frameGenEnabled)
684 {
685 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
686 return VOS_STATUS_E_FAILURE;
687 }
688
689 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
690 {
691 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pktcnt value is invalid",__func__);
692 return VOS_STATUS_E_FAILURE;
693 }
694
695 ftm_status.frameParams.numTestPackets = cnt;
696
697 return VOS_STATUS_SUCCESS;
698}
699
700static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
701{
702 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
703 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
704 {
705 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
706 return VOS_STATUS_E_FAILURE;
707 }
708
709 /* do not allow to change setting when tx pktgen is enabled */
710 if (ftm_status.frameGenEnabled)
711 {
712 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
713 return VOS_STATUS_E_FAILURE;
714 }
715
716 if (len > 4095) //4096
717 {
718 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:payload len is invalid",__func__);
719 return VOS_STATUS_E_FAILURE;
720 }
721
722 ftm_status.frameParams.payloadLength = (tANI_U16)len;
723
724 return VOS_STATUS_SUCCESS;
725}
726
727/**---------------------------------------------------------------------------
728 --------------------------------------------------------------------------*/
729
730static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
731{
732 tPttMsgbuffer *pMsgBuf;
733 uPttMsgs *pMsgBody;
734 VOS_STATUS status;
735 v_U16_t chainSelect_save = chainSelect;
736 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
737
738 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
739 {
740 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
741 return VOS_STATUS_E_FAILURE;
742 }
743
744 if (chainSelect > FTM_CHAIN_SEL_MAX)
745 {
746 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid chain",__func__);
747 return VOS_STATUS_E_FAILURE;
748 }
749
750 /* do not allow to change setting when tx pktgen is enabled */
751 if (ftm_status.frameGenEnabled)
752 {
753 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
754 return VOS_STATUS_E_FAILURE;
755 }
756
757 switch (chainSelect)
758 {
759 case FTM_CHAIN_SEL_NO_RX_TX:
760 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
761 break;
762
763 case FTM_CHAIN_SEL_R0_ON:
764 chainSelect = PHY_CHAIN_SEL_R0_ON;
765 break;
766
767 case FTM_CHAIN_SEL_T0_ON:
768 chainSelect = PHY_CHAIN_SEL_T0_ON;
769 break;
770 }
771
772 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
773 if(pMsgBuf == NULL)
774 {
775 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
776 return VOS_STATUS_E_NOMEM;
777 }
778 init_completion(&pHddCtx->ftm.ftm_comp_var);
779 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
780 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
781
782 pMsgBody = &pMsgBuf->msgBody;
783 pMsgBody->EnableChains.chainSelect = chainSelect;
784
785 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
786
787 if(status != VOS_STATUS_SUCCESS)
788 {
789 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
790 status = VOS_STATUS_E_FAILURE;
791 goto done;
792 }
793 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
794
795 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
796 {
797 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
798 status = VOS_STATUS_E_FAILURE;
799 goto done;
800 }
801 ftm_status.chainSelect = chainSelect_save;
802done:
803 vos_mem_free((v_VOID_t * )pMsgBuf);
804
805 return status;
806}
807
808/**---------------------------------------------------------------------------
809 --------------------------------------------------------------------------*/
810static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
811{
812 int ii;
813 int lenBuf = WE_FTM_MAX_STR_LEN;
814 int lenRes = 0;
815 char *chain[] = {
816 "None",
817 "R0,R1",
818 "R0",
819 "R1",
820 "T0",
821 "R0,R1,T0"
822 };
823 char *rx[] = {
824 "disable",
825 "11b/g/n",
826 "11g/n",
827 "11b"
828 };
829 char *tx[] = {
830 "stopped",
831 "started",
832 };
833 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
834
835 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
836 {
837 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
838 return VOS_STATUS_E_FAILURE;
839 }
840
841 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
842 "txpktgen: %s\n txifs: %ld\n txrate: ",
843 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
844 tx[ftm_status.frameGenEnabled],
845 ftm_status.frameParams.interFrameSpace);
846 if ((lenRes < 0) || (lenRes >= lenBuf))
847 {
848 return VOS_STATUS_E_FAILURE;
849 }
850
851 buf += lenRes;
852 lenBuf -= lenRes;
853
854 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
855 {
856 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
857 break;
858 }
859
860 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
861 {
862 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
863 }
864 else
865 {
866 lenRes = strlcpy(buf, "invalid", lenBuf);
867 }
868 if ((lenRes < 0) || (lenRes >= lenBuf))
869 {
870 return VOS_STATUS_E_FAILURE;
871 }
872
873 buf += lenRes;
874 lenBuf -= lenRes;
875
876 lenRes = snprintf(buf, lenBuf, "\n txpower: %d\n txpktcnt: %ld\n "
877 "txpktlen: %d\n", ftm_status.txpower,
878 ftm_status.frameParams.numTestPackets,
879 ftm_status.frameParams.payloadLength);
880
881 if ((lenRes < 0) || (lenRes >= lenBuf))
882 {
883 return VOS_STATUS_E_FAILURE;
884 }
885
886 return VOS_STATUS_SUCCESS;
887}
888
Jeff Johnson295189b2012-06-20 16:38:30 -0700889
890void HEXDUMP(char *s0, char *s1, int len)
891{
892 int tmp;
893 printk(KERN_EMERG "%s\n :", s0);
894
895 for (tmp = 0; tmp< len; tmp++) {
896 printk(KERN_EMERG "%02x ", *s1++);
897 }
898 printk("\n");
899}
900
Jeff Johnson295189b2012-06-20 16:38:30 -0700901/*---------------------------------------------------------------------------
902
903 \brief vos_ftm_preStart() -
904
905 The \a vos_ftm_preStart() function to download CFG.
906 including:
907 - ccmStart
908
909 - WDA: triggers the CFG download
910
911
912 \param pVosContext: The VOS context
913
914
915 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
916 is ready to be used.
917
918 VOS_STATUS_E_RESOURCES - System resources (other than memory)
919 are unavailable to initialize the scheduler
920
921
922 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
923
924 \sa vos_start
925
926---------------------------------------------------------------------------*/
927VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
928{
929 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
930 pVosContextType pVosContext = (pVosContextType)vosContext;
931
932 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
933 "vos prestart");
934
935
936 VOS_ASSERT( NULL != pVosContext->pWDAContext);
937
938 /* call macPreStart */
939 vStatus = macPreStart(pVosContext->pMACContext);
940 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
941 {
942 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
943 "Failed at macPreStart ");
944 return VOS_STATUS_E_FAILURE;
945 }
946
947 /* call ccmStart */
948 ccmStart(pVosContext->pMACContext);
949
950 /* Reset wda wait event */
951 vos_event_reset(&pVosContext->wdaCompleteEvent);
952
953
954 /*call WDA pre start*/
955 vStatus = WDA_preStart(pVosContext);
956 if (!VOS_IS_STATUS_SUCCESS(vStatus))
957 {
958 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
959 "Failed to WDA prestart ");
960 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
961 ccmStop(pVosContext->pMACContext);
962 VOS_ASSERT(0);
963 return VOS_STATUS_E_FAILURE;
964 }
965
966 /* Need to update time out of complete */
967 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
968 if ( vStatus != VOS_STATUS_SUCCESS )
969 {
970 if ( vStatus == VOS_STATUS_E_TIMEOUT )
971 {
972 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
973 "%s: Timeout occurred before WDA complete\n",__func__);
974 }
975 else
976 {
977 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
978 "%s: WDA_preStart reporting other error \n",__func__);
979 }
980 VOS_ASSERT( 0 );
981 return VOS_STATUS_E_FAILURE;
982 }
983
984 return VOS_STATUS_SUCCESS;
985}
Jeff Johnson295189b2012-06-20 16:38:30 -0700986
987/**---------------------------------------------------------------------------
988
989 \brief wlan_hdd_ftm_open() -
990
991 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
992
993 \param - pAdapter - Pointer HDD Context.
994
995 \return - 0 for success, non zero for failure
996
997 --------------------------------------------------------------------------*/
998
999int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1000{
1001 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1002 pVosContextType pVosContext= NULL;
1003 hdd_adapter_t *pAdapter;
1004
1005 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1006 "%s: Opening VOSS", __func__);
1007
1008 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1009
1010 if (NULL == pVosContext)
1011 {
1012 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301013 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001014 VOS_ASSERT(0);
1015 goto err_vos_status_failure;
1016 }
1017
1018 // Open VOSS
1019 vStatus = wlan_ftm_vos_open( pVosContext, 0);
1020
1021 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1022 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301023 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001024 goto err_vos_status_failure;
1025 }
1026
Jeff Johnson295189b2012-06-20 16:38:30 -07001027 /*
1028 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1029 */
1030 /* Save the hal context in Adapter */
1031 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001032
1033 if ( NULL == pHddCtx->hHal )
1034 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301035 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001036 goto err_sal_close;
1037 }
1038
1039 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1040 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1041 if( NULL == pAdapter )
1042 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301043 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001044 goto err_adapter_open_failure;
1045 }
1046
1047 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1048 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301049 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001050 goto err_sal_close;
1051 }
1052
1053 //Initialize the nlink service
1054 if(nl_srv_init() != 0)
1055 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301056 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001057 goto err_ftm_register_wext_close;
1058 }
1059
Leo Chang9e646082013-08-02 11:20:21 -07001060#ifdef WLAN_KD_READY_NOTIFIER
1061 pHddCtx->kd_nl_init = 1;
1062#endif /* WLAN_KD_READY_NOTIFIER */
1063
Jeff Johnson295189b2012-06-20 16:38:30 -07001064#ifdef PTT_SOCK_SVC_ENABLE
1065 //Initialize the PTT service
1066 if(ptt_sock_activate_svc(pHddCtx) != 0)
1067 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301068 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001069 goto err_nl_srv_init;
1070 }
1071#endif
1072 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1073 {
1074 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1075 goto err_nl_srv_init;
1076 }
1077#ifdef HDD_SESSIONIZE
1078 //Turn off carrier state
1079 netif_carrier_off(pAdapter->dev);
1080
1081 //Stop the Interface TX queue. Just being safe
1082 netif_tx_disable(pAdapter->dev);
1083#endif
1084
Jeff Johnson295189b2012-06-20 16:38:30 -07001085 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1086 pHddCtx->ftm.targetNVTableSize = 0;
1087 pHddCtx->ftm.targetNVTablePointer = NULL;
1088 pHddCtx->ftm.processedNVTableSize = 0;
1089 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1090 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1091 {
1092 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301093 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001094 VOS_ASSERT(0);
1095 goto err_nl_srv_init;
1096 }
1097 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001098
1099 _ftm_status_init();
1100 /* Initialize the ftm vos event */
1101 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1102 {
1103 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301104 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001105 VOS_ASSERT(0);
1106 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1107 goto err_nl_srv_init;
1108 }
1109
1110 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1111
1112 return VOS_STATUS_SUCCESS;
1113
1114err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001115#ifdef WLAN_KD_READY_NOTIFIER
1116nl_srv_exit(pHddCtx->ptt_pid);
1117#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001118nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001119#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001120err_ftm_register_wext_close:
1121hdd_UnregisterWext(pAdapter->dev);
1122
1123err_adapter_open_failure:
1124hdd_close_all_adapters( pHddCtx );
1125
1126err_sal_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001127
1128err_vos_status_failure:
1129
1130 return VOS_STATUS_E_FAILURE;
1131}
1132
1133
1134
1135int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1136{
1137 VOS_STATUS vosStatus;
1138 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1139
1140 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1141 ENTER();
1142 if(pAdapter == NULL)
1143 {
1144 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1145 return VOS_STATUS_E_NOMEM;
1146 }
1147
Leo Chang4e8183f2013-05-31 15:38:34 -07001148 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1149 {
1150 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1151 "%s: Ftm has been started. stopping ftm", __func__);
1152 wlan_ftm_stop(pHddCtx);
1153 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001154
1155 //Assert Deep sleep signal now to put Libra HW in lowest power state
1156 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
1157 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1158
1159 //Vote off any PMIC voltage supplies
1160 vos_chipPowerDown(NULL, NULL, NULL);
1161
1162 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1163
Leo Chang59cdc7e2013-07-10 10:08:21 -07001164#ifdef WLAN_KD_READY_NOTIFIER
1165 nl_srv_exit(pHddCtx->ptt_pid);
1166#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001167 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001168#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001169 //TODO----------
1170 //Deregister the device with the kernel
1171 hdd_UnregisterWext(pAdapter->dev);
1172
1173 hdd_close_all_adapters( pHddCtx );
1174#if 0
1175 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
1176 {
1177 unregister_netdev(pAdapter->dev);
1178 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1179 }
1180#endif
1181 //-----------------
1182
1183 vosStatus = vos_sched_close( vosContext );
1184 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1185 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1186 "%s: Failed to close VOSS Scheduler",__func__);
1187 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1188 }
1189
1190 //Close VOSS
1191 wlan_ftm_vos_close(vosContext);
1192
1193
1194 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1195 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1196 {
1197 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1198 "%s: Failed to destroy ftm_vos Event",__func__);
1199 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1200 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001201 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001202
1203 //Free up dynamically allocated members inside HDD Adapter
1204 kfree(pHddCtx->cfg_ini);
1205 pHddCtx->cfg_ini= NULL;
1206
1207 return 0;
1208
1209}
1210
1211/**---------------------------------------------------------------------------
1212
1213 \brief wlan_ftm_send_response() -
1214
1215 The function sends the response to the ptt socket application running in user space.
1216
1217 \param - pAdapter - Pointer HDD Context.
1218
1219 \return - 0 for success, non zero for failure
1220
1221 --------------------------------------------------------------------------*/
1222
1223static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1224
1225 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
1226
1227 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!\n"));
1228 return VOS_STATUS_E_FAILURE;
1229 }
1230 return VOS_STATUS_SUCCESS;
1231}
1232
1233/**---------------------------------------------------------------------------
1234
1235 \brief wlan_hdd_ftm_start() -
1236
1237 This function gets called when the FTM start commands received from the ptt socket application and
1238 it starts the following modules.
1239 1) SAL Start.
1240 2) BAL Start.
1241 3) MAC Start to download the firmware.
1242
1243
1244 \param - pAdapter - Pointer HDD Context.
1245
1246 \return - 0 for success, non zero for failure
1247
1248 --------------------------------------------------------------------------*/
1249
1250static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1251{
1252 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1253 tSirRetStatus sirStatus = eSIR_SUCCESS;
1254 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1255 tHalMacStartParameters halStartParams;
1256
1257 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1258 {
1259 return VOS_STATUS_SUCCESS;
1260 }
1261
1262 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1263 "%s: Starting Libra SW", __func__);
1264
1265 /* We support only one instance for now ...*/
1266 if (pVosContext == NULL)
1267 {
1268 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001269 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001270 goto err_status_failure;
1271 }
1272
Jeff Johnson295189b2012-06-20 16:38:30 -07001273
1274 if (pVosContext->pMACContext == NULL)
1275 {
1276 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001277 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001278 goto err_status_failure;
1279 }
1280
Jeff Johnson295189b2012-06-20 16:38:30 -07001281 /*
1282 Prima needs to start the WDA correctly instead of BAL and SAL
1283 */
1284
1285 /* Vos preStart is calling */
1286 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1287 {
1288 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1289 goto err_status_failure;
1290 }
1291
1292
1293 vStatus = WDA_NVDownload_Start(pVosContext);
1294
1295 if ( vStatus != VOS_STATUS_SUCCESS )
1296 {
1297 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1298 "%s: Failed to start NV Download",__func__);
1299 return VOS_STATUS_E_FAILURE;
1300 }
1301
1302 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1303
1304 if ( vStatus != VOS_STATUS_SUCCESS )
1305 {
1306 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1307 {
1308 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1309 "%s: Timeout occurred before WDA_NVDownload_Start complete\n",__func__);
1310 }
1311 else
1312 {
1313 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1314 "%s: WDA_NVDownload_Start reporting other error \n",__func__);
1315 }
1316 VOS_ASSERT(0);
1317 goto err_wda_stop;
1318 }
1319
1320 vStatus = WDA_start(pVosContext);
1321 if (vStatus != VOS_STATUS_SUCCESS)
1322 {
1323 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1324 "%s: Failed to start WDA",__func__);
1325 goto err_status_failure;
1326 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001327
1328
1329 /* Start the MAC */
1330 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1331
Jeff Johnson295189b2012-06-20 16:38:30 -07001332
1333 halStartParams.driverType = eDRIVER_TYPE_MFG;
1334
1335 /* Start the MAC */
1336 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1337
Jeff Johnson295189b2012-06-20 16:38:30 -07001338
1339 if (eSIR_SUCCESS != sirStatus)
1340 {
1341 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1342 "%s: Failed to start MAC", __func__);
1343
Jeff Johnson295189b2012-06-20 16:38:30 -07001344 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001345 }
1346
1347 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1348 "%s: MAC correctly started",__func__);
1349
Jeff Johnson295189b2012-06-20 16:38:30 -07001350
1351 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1352
1353 return VOS_STATUS_SUCCESS;
1354
Jeff Johnson295189b2012-06-20 16:38:30 -07001355err_wda_stop:
1356 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1357 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1358 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1359 if(vStatus != VOS_STATUS_SUCCESS)
1360 {
1361 if(vStatus == VOS_STATUS_E_TIMEOUT)
1362 {
1363 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1364 "%s: Timeout occurred before WDA_stop complete\n",__func__);
1365
1366 }
1367 else
1368 {
1369 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1370 "%s: WDA_stop reporting other error \n",__func__);
1371 }
1372 VOS_ASSERT(0);
1373 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001374
1375err_status_failure:
1376
1377 return VOS_STATUS_E_FAILURE;
1378
1379}
1380
1381
1382static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1383{
1384 VOS_STATUS vosStatus;
1385
1386 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1387 {
1388 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1389 return VOS_STATUS_E_FAILURE;
1390 }
1391
1392 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1393 {
1394 /* STOP MAC only */
1395 v_VOID_t *hHal;
1396 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1397 if (NULL == hHal)
1398 {
1399 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1400 "%s: NULL hHal", __func__);
1401 }
1402 else
1403 {
1404 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1405 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1406 {
1407 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1408 "%s: Failed to stop SYS", __func__);
1409 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1410 }
1411 }
1412
Jeff Johnson295189b2012-06-20 16:38:30 -07001413
Jeff Johnson295189b2012-06-20 16:38:30 -07001414 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001415
1416 }
1417 return WLAN_FTM_SUCCESS;
1418}
1419
Jeff Johnson295189b2012-06-20 16:38:30 -07001420/**---------------------------------------------------------------------------
1421
1422 \brief wlan_hdd_ftm_get_nv_table() -
1423 Get Specific NV table
1424
1425 \param - ftmCmd - Pointer FTM Commad Buffer
1426
1427 \return - int
1428 -1, Process Host command fail, vail out
1429 1, Process Host command success
1430
1431 --------------------------------------------------------------------------*/
1432int wlan_hdd_ftm_get_nv_table
1433(
1434 hdd_context_t *pHddCtx,
1435 tPttMsgbuffer *ftmCmd
1436)
1437{
1438 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1439 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1440 v_SIZE_t nvSize;
1441 sHalNv *nvContents = NULL;
1442
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001443
Jeff Johnson295189b2012-06-20 16:38:30 -07001444 if (NULL == pHddCtx)
1445 {
1446 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1447 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001448 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001449 }
1450
1451 /* Test first chunk of NV table */
1452 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1453 (0 == pHddCtx->ftm.processedNVTableSize))
1454 {
1455 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1456 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1457 {
1458 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1459 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001460 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001461 }
1462
1463 switch (nvTable->nvTable)
1464 {
1465 case NV_TABLE_RATE_POWER_SETTINGS:
1466 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1467 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1468 break;
1469
1470 case NV_TABLE_REGULATORY_DOMAINS:
1471 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1472 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1473 break;
1474
1475 case NV_TABLE_DEFAULT_COUNTRY:
1476 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1477 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1478 break;
1479
1480 case NV_TABLE_TPC_POWER_TABLE:
1481 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1482 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1483 break;
1484
1485 case NV_TABLE_TPC_PDADC_OFFSETS:
1486 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1487 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1488 break;
1489
1490 case NV_TABLE_VIRTUAL_RATE:
1491 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1492 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1493 break;
1494
1495 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1496 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1497 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1498 break;
1499
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001500 case NV_TABLE_HW_CAL_VALUES:
1501 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1502 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1503 break;
1504
1505 case NV_TABLE_FW_CONFIG:
1506 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1507 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001508 break;
1509
1510 case NV_TABLE_ANTENNA_PATH_LOSS:
1511 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1512 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1513 break;
1514
1515 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1516 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1517 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1518 break;
1519
1520 default:
1521 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1522 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001523 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001524 break;
1525 }
1526
1527 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1528 {
1529 /* Invalid table size, discard and initialize data */
1530 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001531 "Invalid Table Size %d for Table %d"
1532 " expected size %d\n", nvTable->tableSize, nvTable->nvTable,
1533 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001534 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1535 pHddCtx->ftm.targetNVTableSize = 0;
1536 pHddCtx->ftm.processedNVTableSize = 0;
1537 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001538 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001539 }
1540
1541 /* Set Current Processing NV table type */
1542 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1543 /* Copy target NV table value into temp context buffer */
1544 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1545 pHddCtx->ftm.targetNVTablePointer,
1546 pHddCtx->ftm.targetNVTableSize);
1547
1548 }
1549
1550 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1551 {
1552 /* Invalid table type */
1553 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1554 "Invalid NV Table, now Processing %d, not %d",
1555 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1556 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1557 pHddCtx->ftm.targetNVTableSize = 0;
1558 pHddCtx->ftm.processedNVTableSize = 0;
1559 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1560
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001561 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001562 }
1563
1564 /* Copy next chunk of NV table value into response buffer */
1565 vos_mem_copy(&nvTable->tableData,
1566 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1567 nvTable->chunkSize);
1568 /* Update processed pointer to prepare next chunk copy */
1569 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1570
1571 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1572 {
1573 /* Finished to process last chunk of data, initialize buffer */
1574 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1575 pHddCtx->ftm.targetNVTableSize = 0;
1576 pHddCtx->ftm.processedNVTableSize = 0;
1577 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1578 }
1579
1580 return 1;
1581}
1582
1583/**---------------------------------------------------------------------------
1584
1585 \brief wlan_hdd_ftm_set_nv_table() -
1586 Set Specific NV table as given
1587
1588 \param - ftmCmd - Pointer FTM Commad Buffer
1589
1590 \return - int
1591 -1, Process Host command fail, vail out
1592 1, Process Host command success
1593
1594 --------------------------------------------------------------------------*/
1595int wlan_hdd_ftm_set_nv_table
1596(
1597 hdd_context_t *pHddCtx,
1598 tPttMsgbuffer *ftmCmd
1599)
1600{
1601 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1602 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1603 v_SIZE_t nvSize;
1604 sHalNv *nvContents = NULL;
1605
1606 if (NULL == pHddCtx)
1607 {
1608 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1609 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001610 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001611 }
1612
1613 /* Test first chunk of NV table */
1614 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1615 (0 == pHddCtx->ftm.processedNVTableSize))
1616 {
1617 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1618 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1619 {
1620 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1621 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001622 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001623 }
1624
1625 switch (nvTable->nvTable)
1626 {
1627 case NV_TABLE_RATE_POWER_SETTINGS:
1628 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1629 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1630 break;
1631
1632 case NV_TABLE_REGULATORY_DOMAINS:
1633 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1634 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1635 break;
1636
1637 case NV_TABLE_DEFAULT_COUNTRY:
1638 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1639 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1640 break;
1641
1642 case NV_TABLE_TPC_POWER_TABLE:
1643 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1644 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1645 break;
1646
1647 case NV_TABLE_TPC_PDADC_OFFSETS:
1648 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1649 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1650 break;
1651
1652 case NV_TABLE_VIRTUAL_RATE:
1653 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1654 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1655 break;
1656
1657 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1658 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1659 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1660 break;
1661
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001662 case NV_TABLE_HW_CAL_VALUES:
1663 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1664 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1665 break;
1666
1667 case NV_TABLE_FW_CONFIG:
1668 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1669 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001670 break;
1671
1672 case NV_TABLE_ANTENNA_PATH_LOSS:
1673 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1674 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1675 break;
1676
1677 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1678 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1679 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1680 break;
1681
1682 default:
1683 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1684 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001685 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001686 break;
1687 }
1688
1689 /* Set Current Processing NV table type */
1690 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1691 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1692 {
1693 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1694 "Invalid Table Size %d", nvTable->tableSize);
1695 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1696 pHddCtx->ftm.targetNVTableSize = 0;
1697 pHddCtx->ftm.processedNVTableSize = 0;
1698 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001699 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001700 }
1701 }
1702
1703 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1704 {
1705 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1706 "Invalid NV Table, now Processing %d, not %d",
1707 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1708 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1709 pHddCtx->ftm.targetNVTableSize = 0;
1710 pHddCtx->ftm.processedNVTableSize = 0;
1711 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001712 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001713 }
1714 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1715 &nvTable->tableData,
1716 nvTable->chunkSize);
1717
1718 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1719 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1720 {
1721 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
1722 pHddCtx->ftm.tempNVTableBuffer,
1723 pHddCtx->ftm.targetNVTableSize);
1724 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1725 pHddCtx->ftm.targetNVTableSize = 0;
1726 pHddCtx->ftm.processedNVTableSize = 0;
1727 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1728 }
1729
1730 return 1;
1731}
1732
1733/**---------------------------------------------------------------------------
1734
1735 \brief wlan_hdd_ftm_blank_nv() -
1736 Set all NV table value as default
1737
1738 \param - ftmCmd - Pointer FTM Commad Buffer
1739
1740 \return - int
1741 -1, Process Host command fail, vail out
1742 0, Process Host command success
1743
1744 --------------------------------------------------------------------------*/
1745int wlan_hdd_ftm_blank_nv_table
1746(
1747 tPttMsgbuffer *ftmCmd
1748)
1749{
1750 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1751 v_SIZE_t nvSize;
1752 v_SIZE_t itemSize;
1753 sHalNv *nvContents = NULL;
1754
1755 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1756 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1757 {
1758 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
1759 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001760 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001761 }
1762
1763 itemSize = sizeof(nvContents->tables.pwrOptimum);
1764 memcpy(&nvContents->tables.pwrOptimum,
1765 &nvDefaults.tables.pwrOptimum,
1766 itemSize);
1767
1768 itemSize = sizeof(nvContents->tables.regDomains);
1769 memcpy(&nvContents->tables.regDomains,
1770 &nvDefaults.tables.regDomains,
1771 itemSize);
1772
1773 itemSize = sizeof(nvContents->tables.defaultCountryTable);
1774 memcpy(&nvContents->tables.defaultCountryTable,
1775 &nvDefaults.tables.defaultCountryTable,
1776 itemSize);
1777
1778 itemSize = sizeof(nvContents->tables.plutCharacterized);
1779 memcpy(&nvContents->tables.plutCharacterized[0],
1780 &nvDefaults.tables.plutCharacterized[0],
1781 itemSize);
1782
1783 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
1784 memcpy(&nvContents->tables.plutPdadcOffset[0],
1785 &nvDefaults.tables.plutPdadcOffset[0],
1786 itemSize);
1787
1788 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1789 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
1790 &nvDefaults.tables.pwrOptimum_virtualRate[0],
1791 itemSize);
1792
1793 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
1794 memcpy(&nvContents->tables.rssiChanOffsets[0],
1795 &nvDefaults.tables.rssiChanOffsets[0],
1796 itemSize);
1797
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001798 itemSize = sizeof(nvContents->tables.hwCalValues);
1799 memcpy(&nvContents->tables.hwCalValues,
1800 &nvDefaults.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07001801 itemSize);
1802
1803 itemSize = sizeof(nvContents->tables.antennaPathLoss);
1804 memcpy(&nvContents->tables.antennaPathLoss[0],
1805 &nvDefaults.tables.antennaPathLoss[0],
1806 itemSize);
1807
1808 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
1809 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
1810 &nvDefaults.tables.pktTypePwrLimits[0][0],
1811 itemSize);
1812
1813 return 1;
1814}
1815
1816/**---------------------------------------------------------------------------
1817
1818 \brief wlan_hdd_ftm_delete_nv_table() -
1819 Delete Specific NV table
1820
1821 \param - ftmCmd - Pointer FTM Commad Buffer
1822
1823 \return - int
1824 -1, Process Host command fail, vail out
1825 1, Process Host command success
1826
1827 --------------------------------------------------------------------------*/
1828int wlan_hdd_ftm_delete_nv_table
1829(
1830 tPttMsgbuffer *ftmCmd
1831)
1832{
1833 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1834 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
1835 v_SIZE_t nvSize;
1836 v_SIZE_t itemSize;
1837 sHalNv *nvContents = NULL;
1838
1839 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1840 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1841 {
1842 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
1843 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001844 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001845 }
1846
1847 switch (nvTable->nvTable)
1848 {
1849 case NV_TABLE_RATE_POWER_SETTINGS:
1850 itemSize = sizeof(nvContents->tables.pwrOptimum);
1851 memcpy(&nvContents->tables.pwrOptimum,
1852 &nvDefaults.tables.pwrOptimum,
1853 itemSize);
1854 break;
1855
1856 case NV_TABLE_REGULATORY_DOMAINS:
1857 itemSize = sizeof(nvContents->tables.regDomains);
1858 memcpy(&nvContents->tables.regDomains,
1859 &nvDefaults.tables.regDomains,
1860 itemSize);
1861 break;
1862
1863 case NV_TABLE_DEFAULT_COUNTRY:
1864 itemSize = sizeof(nvContents->tables.defaultCountryTable);
1865 memcpy(&nvContents->tables.defaultCountryTable,
1866 &nvDefaults.tables.defaultCountryTable,
1867 itemSize);
1868 break;
1869
1870 case NV_TABLE_TPC_POWER_TABLE:
1871 itemSize = sizeof(nvContents->tables.plutCharacterized);
1872 memcpy(&nvContents->tables.plutCharacterized[0],
1873 &nvDefaults.tables.plutCharacterized[0],
1874 itemSize);
1875 break;
1876
1877 case NV_TABLE_TPC_PDADC_OFFSETS:
1878 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
1879 memcpy(&nvContents->tables.plutPdadcOffset[0],
1880 &nvDefaults.tables.plutPdadcOffset[0],
1881 itemSize);
1882 break;
1883
1884 case NV_TABLE_VIRTUAL_RATE:
1885 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1886 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
1887 &nvDefaults.tables.pwrOptimum_virtualRate[0],
1888 itemSize);
1889 break;
1890
1891 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1892 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
1893 memcpy(&nvContents->tables.rssiChanOffsets[0],
1894 &nvDefaults.tables.rssiChanOffsets[0],
1895 itemSize);
1896 break;
1897
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001898 case NV_TABLE_HW_CAL_VALUES:
1899 itemSize = sizeof(nvContents->tables.hwCalValues);
1900 memcpy(&nvContents->tables.hwCalValues,
1901 &nvDefaults.tables.hwCalValues,
1902 itemSize);
1903 break;
1904
1905 case NV_TABLE_FW_CONFIG:
1906 itemSize = sizeof(nvContents->tables.fwConfig);
1907 memcpy(&nvContents->tables.fwConfig,
1908 &nvDefaults.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07001909 itemSize);
1910 break;
1911
1912 case NV_TABLE_ANTENNA_PATH_LOSS:
1913 itemSize = sizeof(nvContents->tables.antennaPathLoss);
1914 memcpy(&nvContents->tables.antennaPathLoss[0],
1915 &nvDefaults.tables.antennaPathLoss[0],
1916 itemSize);
1917 break;
1918
1919 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1920 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
1921 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
1922 &nvDefaults.tables.pktTypePwrLimits[0][0],
1923 itemSize);
1924 break;
1925
1926 default:
1927 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1928 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001929 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001930 break;
1931 }
1932
1933 return 1;
1934}
1935
1936/**---------------------------------------------------------------------------
1937
1938 \brief wlan_hdd_ftm_get_nv_field() -
1939 Get Specific NV field
1940
1941 \param - ftmCmd - Pointer FTM Commad Buffer
1942
1943 \return - int
1944 -1, Process Host command fail, vail out
1945 1, Process Host command success
1946
1947 --------------------------------------------------------------------------*/
1948int wlan_hdd_ftm_get_nv_field
1949(
1950 tPttMsgbuffer *ftmCmd
1951)
1952{
1953 sNvFields nvFieldDataBuffer;
1954 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
1955 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1956 sHalNv *nvContents = NULL;
1957 v_SIZE_t nvSize;
1958
1959 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1960 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1961 {
1962 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
1963 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001964 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001965 }
1966 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
1967
1968 switch (nvField->nvField)
1969 {
1970 case NV_COMMON_PRODUCT_ID:
1971 memcpy((void *)&nvField->fieldData,
1972 &nvFieldDataBuffer.productId,
1973 sizeof(nvFieldDataBuffer.productId));
1974 break;
1975
1976 case NV_COMMON_PRODUCT_BANDS:
1977 memcpy((void *)&nvField->fieldData,
1978 &nvFieldDataBuffer.productBands,
1979 sizeof(nvFieldDataBuffer.productBands));
1980 break;
1981
1982 case NV_COMMON_NUM_OF_TX_CHAINS:
1983 memcpy((void *)&nvField->fieldData,
1984 &nvFieldDataBuffer.numOfTxChains,
1985 sizeof(nvFieldDataBuffer.numOfTxChains));
1986 break;
1987
1988 case NV_COMMON_NUM_OF_RX_CHAINS:
1989 memcpy((void *)&nvField->fieldData,
1990 &nvFieldDataBuffer.numOfRxChains,
1991 sizeof(nvFieldDataBuffer.numOfRxChains));
1992 break;
1993
1994 case NV_COMMON_MAC_ADDR:
1995 memcpy((void *)&nvField->fieldData,
1996 &nvFieldDataBuffer.macAddr[0],
1997 NV_FIELD_MAC_ADDR_SIZE);
1998 break;
1999
2000 case NV_COMMON_MFG_SERIAL_NUMBER:
2001 memcpy((void *)&nvField->fieldData,
2002 &nvFieldDataBuffer.mfgSN[0],
2003 NV_FIELD_MFG_SN_SIZE);
2004 break;
2005
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002006 case NV_COMMON_WLAN_NV_REV_ID:
2007 memcpy((void *)&nvField->fieldData,
2008 &nvFieldDataBuffer.wlanNvRevId,
2009 sizeof(nvFieldDataBuffer.wlanNvRevId));
2010 break;
2011
Jeff Johnson295189b2012-06-20 16:38:30 -07002012 case NV_COMMON_COUPLER_TYPE:
2013 memcpy((void *)&nvField->fieldData,
2014 &nvFieldDataBuffer.couplerType,
2015 sizeof(nvFieldDataBuffer.couplerType));
2016 break;
2017
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002018 case NV_COMMON_NV_VERSION:
2019 memcpy((void *)&nvField->fieldData,
2020 &nvFieldDataBuffer.nvVersion,
2021 sizeof(nvFieldDataBuffer.nvVersion));
2022 break;
2023
Jeff Johnson295189b2012-06-20 16:38:30 -07002024 default:
2025 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2026 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002027 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002028 break;
2029 }
2030
2031 return 1;
2032}
2033
2034/**---------------------------------------------------------------------------
2035
2036 \brief wlan_hdd_ftm_set_nv_field() -
2037 Set Specific NV field
2038
2039 \param - ftmCmd - Pointer FTM Commad Buffer
2040
2041 \return - int
2042 -1, Process Host command fail, vail out
2043 1, Process Host command success
2044
2045 --------------------------------------------------------------------------*/
2046int wlan_hdd_ftm_set_nv_field
2047(
2048 tPttMsgbuffer *ftmCmd
2049)
2050{
2051 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2052 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2053 v_SIZE_t nvSize;
2054 sHalNv *nvContents = NULL;
2055 v_U8_t macLoop;
2056 v_U8_t *pNVMac;
2057 v_U8_t lastByteMAC;
2058
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002059
Jeff Johnson295189b2012-06-20 16:38:30 -07002060 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2061 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2062 {
2063 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2064 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002065 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002066 }
2067
2068 switch (nvField->nvField)
2069 {
2070 case NV_COMMON_PRODUCT_ID:
2071 memcpy(&nvContents->fields.productId,
2072 &nvField->fieldData,
2073 sizeof(nvContents->fields.productId));
2074 break;
2075
2076 case NV_COMMON_PRODUCT_BANDS:
2077 memcpy(&nvContents->fields.productBands,
2078 &nvField->fieldData,
2079 sizeof(nvContents->fields.productBands));
2080 break;
2081
2082 case NV_COMMON_NUM_OF_TX_CHAINS:
2083 memcpy(&nvContents->fields.numOfTxChains,
2084 &nvField->fieldData,
2085 sizeof(nvContents->fields.numOfTxChains));
2086 break;
2087
2088 case NV_COMMON_NUM_OF_RX_CHAINS:
2089 memcpy(&nvContents->fields.numOfRxChains,
2090 &nvField->fieldData,
2091 sizeof(nvContents->fields.numOfRxChains));
2092 break;
2093
2094 case NV_COMMON_MAC_ADDR:
2095 /* If Last byte is larger than 252 (0xFC), return Error,
2096 * Since 3MACs should be derived from first MAC */
2097 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002098 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002099 {
2100 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2101 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002102 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002103 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002104 }
2105
2106 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002107 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2109 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002110 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002111 lastByteMAC + macLoop;
2112 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002113 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002114 NV_FIELD_MAC_ADDR_SIZE);
2115 }
2116 break;
2117
2118 case NV_COMMON_MFG_SERIAL_NUMBER:
2119 memcpy(&nvContents->fields.mfgSN[0],
2120 &nvField->fieldData,
2121 NV_FIELD_MFG_SN_SIZE);
2122 break;
2123
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002124 case NV_COMMON_WLAN_NV_REV_ID:
2125 memcpy(&nvContents->fields.wlanNvRevId,
2126 &nvField->fieldData,
2127 sizeof(nvContents->fields.wlanNvRevId));
2128 break;
2129
Jeff Johnson295189b2012-06-20 16:38:30 -07002130 case NV_COMMON_COUPLER_TYPE:
2131 memcpy(&nvContents->fields.couplerType,
2132 &nvField->fieldData,
2133 sizeof(nvContents->fields.couplerType));
2134 break;
2135
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002136 case NV_COMMON_NV_VERSION:
2137 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2138 "Cannot modify NV version field %d", nvField->nvField);
2139 return -EIO;
2140 break;
2141
Jeff Johnson295189b2012-06-20 16:38:30 -07002142 default:
2143 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2144 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002145 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002146 break;
2147 }
2148
2149 return 1;
2150}
2151
2152/**---------------------------------------------------------------------------
2153
2154 \brief wlan_hdd_ftm_store_nv_table() -
2155 Store Cached NV information into Flash Memory, file
2156
2157 \param - ftmCmd - Pointer FTM Commad Buffer
2158
2159 \return - int
2160 -1, Process Host command fail, vail out
2161 0, Process Host command success
2162
2163 --------------------------------------------------------------------------*/
2164int wlan_hdd_ftm_store_nv_table
2165(
2166 tPttMsgbuffer *ftmCmd
2167)
2168{
2169 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2170 v_SIZE_t nvSize;
2171 sHalNv *nvContents = NULL;
2172 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2173 void *tablePtr = NULL;
2174 unsigned int tableSize = 0;
2175 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
2176
2177 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2178 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2179 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002180 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002181 }
2182
2183 /* Set Platform type as PRIMA */
2184 nvContents->fields.wlanNvRevId = 2;
2185
2186 switch(nvTable->nvTable)
2187 {
2188 case NV_FIELDS_IMAGE:
2189 tablePtr = (void *)&nvContents->fields;
2190 tableSize = sizeof(nvContents->fields);
2191 tableVNVType = VNV_FIELD_IMAGE;
2192 break;
2193
2194 case NV_TABLE_RATE_POWER_SETTINGS:
2195 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2196 tableSize = sizeof(nvContents->tables.pwrOptimum);
2197 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2198 break;
2199
2200 case NV_TABLE_REGULATORY_DOMAINS:
2201 tablePtr = (void *)&nvContents->tables.regDomains[0];
2202 tableSize = sizeof(nvContents->tables.regDomains);
2203 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2204 break;
2205
2206 case NV_TABLE_DEFAULT_COUNTRY:
2207 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2208 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2209 tableVNVType = VNV_DEFAULT_LOCATION;
2210 break;
2211
2212 case NV_TABLE_TPC_POWER_TABLE:
2213 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2214 tableSize = sizeof(nvContents->tables.plutCharacterized);
2215 tableVNVType = VNV_TPC_POWER_TABLE;
2216 break;
2217
2218 case NV_TABLE_TPC_PDADC_OFFSETS:
2219 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2220 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2221 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2222 break;
2223
2224 case NV_TABLE_VIRTUAL_RATE:
2225 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2226 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2227 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2228 break;
2229
2230 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2231 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2232 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2233 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2234 break;
2235
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002236 case NV_TABLE_HW_CAL_VALUES:
2237 tablePtr = (void *)&nvContents->tables.hwCalValues;
2238 tableSize = sizeof(nvContents->tables.hwCalValues);
2239 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 break;
2241
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002242 case NV_TABLE_FW_CONFIG:
2243 tablePtr = (void *)&nvContents->tables.fwConfig;
2244 tableSize = sizeof(nvContents->tables.fwConfig);
2245 tableVNVType = VNV_FW_CONFIG;
2246 break;
2247
Jeff Johnson295189b2012-06-20 16:38:30 -07002248 case NV_TABLE_ANTENNA_PATH_LOSS:
2249 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2250 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2251 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2252 break;
2253
2254 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2255 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2256 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2257 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2258 break;
2259
2260 default:
2261 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2262 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002263 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002264 break;
2265
2266 }
2267
2268 nvStatus = vos_nv_write(tableVNVType,
2269 tablePtr,
2270 tableSize);
2271 if(VOS_STATUS_SUCCESS != nvStatus)
2272 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002273 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002274 }
2275
2276 return 1;
2277}
2278
2279/**---------------------------------------------------------------------------
2280
2281 \brief wlan_hdd_ftm_temp_get_rel_num() -
2282 Get internal release number
2283
2284 \param - ftmCmd - Pointer FTM Commad Buffer
2285
2286 \return - int
2287 -1, Process Host command fail, vail out
2288 0, Process Host command success
2289
2290 --------------------------------------------------------------------------*/
2291int wlan_hdd_ftm_temp_get_rel_num
2292(
2293 tPttMsgbuffer *ftmCmd
2294)
2295{
2296 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2297
2298 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2299 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2300 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2301 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2302 relNum->relParams.pttMax = 10;
2303 relNum->relParams.pttMin = 1;
2304
2305 return 1;
2306}
2307
2308/**---------------------------------------------------------------------------
2309
2310 \brief wlan_hdd_process_ftm_host_cmd() -
2311 process any command should be handled within host.
2312 decide any command should be send to HAL or not
2313
2314 \param - ftmCmd - Pointer FTM Commad Buffer
2315
2316 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002317 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002318 0, Process Host command success, not need to send CMD to HAL
2319 1, Process Host command success, need to send CMD to HAL
2320
2321 --------------------------------------------------------------------------*/
2322int wlan_hdd_process_ftm_host_cmd
2323(
2324 hdd_context_t *pHddCtx,
2325 void *ftmCmd
2326)
2327{
2328 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2329 int needToRouteHal = 1;
2330 int hostState = 1;
2331
2332 switch(pFTMCmd->msgId)
2333 {
2334 case PTT_MSG_GET_NV_TABLE:
2335 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2336 needToRouteHal = 0;
2337 break;
2338
2339 case PTT_MSG_SET_NV_TABLE:
2340 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2341 /* Temp NV Operation will be isolated to host
2342 needToRouteHal = 1; */
2343 needToRouteHal = 0;
2344 break;
2345
2346 case PTT_MSG_BLANK_NV:
2347 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2348 needToRouteHal = 1;
2349 break;
2350
2351 case PTT_MSG_DEL_NV_TABLE:
2352 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2353 needToRouteHal = 1;
2354 break;
2355
2356 case PTT_MSG_GET_NV_FIELD:
2357 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2358 needToRouteHal = 0;
2359 break;
2360
2361 case PTT_MSG_SET_NV_FIELD:
2362 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2363 needToRouteHal = 0;
2364 break;
2365
2366 case PTT_MSG_STORE_NV_TABLE:
2367 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2368 needToRouteHal = 0;
2369 break;
2370
2371 case PTT_MSG_DBG_READ_REGISTER:
2372 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
2373 &pFTMCmd->msgBody.DbgReadRegister.regValue);
2374 needToRouteHal = 0;
2375 break;
2376
2377 case PTT_MSG_DBG_WRITE_REGISTER:
2378 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
2379 pFTMCmd->msgBody.DbgWriteRegister.regValue);
2380 needToRouteHal = 0;
2381 break;
2382
2383 case PTT_MSG_DBG_READ_MEMORY:
2384 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
2385 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
2386 pFTMCmd->msgBody.DbgReadMemory.nBytes);
2387 needToRouteHal = 0;
2388 break;
2389
2390 case PTT_MSG_DBG_WRITE_MEMORY:
2391 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
2392 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
2393 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
2394 needToRouteHal = 0;
2395 break;
2396
2397 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
2398 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
2399 needToRouteHal = 0;
2400 break;
2401
2402 default:
2403 needToRouteHal = 1;
2404 break;
2405 }
2406
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002407 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002408 {
2409 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2410 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002411 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07002412 }
2413
2414 return needToRouteHal;
2415}
Jeff Johnson295189b2012-06-20 16:38:30 -07002416
2417/**---------------------------------------------------------------------------
2418
2419 \brief wlan_hdd_process_ftm_cmd() -
2420
2421 This function process the commands received from the ptt socket application.
2422
2423 \param - pAdapter - Pointer HDD Context.
2424
2425 \param - wnl - Pointer to the ANI netlink header.
2426
2427 \return - none
2428
2429 --------------------------------------------------------------------------*/
2430
2431void wlan_hdd_process_ftm_cmd
2432(
2433 hdd_context_t *pHddCtx,
2434 tAniNlHdr *wnl
2435)
2436{
2437 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
2438 v_U16_t cmd_len;
2439 v_U8_t *pftm_data;
2440 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07002441 int hostState;
2442 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002443
2444 ENTER();
2445
Jeff Johnsone7245742012-09-05 17:12:55 -07002446 //Delay to fix NV write failure on JB
2447 vos_busy_wait(10000); //10ms
2448
Jeff Johnson295189b2012-06-20 16:38:30 -07002449 if (!pRequestBuf) {
2450
2451 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null\n",__func__);
2452 return ;
2453 }
2454 /*Save the received request*/
2455 pHddCtx->ftm.pRequestBuf = pRequestBuf;
2456
2457 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
2458 /*Save the received request netlink header used for sending the response*/
2459 pHddCtx->ftm.wnl = wnl;
2460 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
2461
2462 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d\n",__func__,pRequestBuf->module_type);
2463
2464 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2465 wlan_ftm_send_response(pHddCtx);
2466 return ;
2467 }
2468
2469 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
2470 {
2471 case WLAN_FTM_START:
2472 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
2473
2474 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d\n",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
2475 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
2476 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2477 wlan_ftm_send_response(pHddCtx);
2478 return;
2479 }
2480
2481 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
2482 {
2483 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
2484 ,__func__);
2485 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2486 wlan_ftm_send_response(pHddCtx);
2487 return;
2488 }
2489 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
2490 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
2491 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2492 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
2493
2494 wlan_ftm_send_response(pHddCtx);
2495
2496 break;
2497
2498 case WLAN_FTM_STOP:
2499 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
2500
2501 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started\n",__func__);
2502 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2503 wlan_ftm_send_response(pHddCtx);
2504 return;
2505 }
2506
2507 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
2508
2509 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2510 wlan_ftm_send_response(pHddCtx);
2511 return;
2512 }
2513
2514 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
2515 /* This would send back the Command Success Status */
2516 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2517
2518 wlan_ftm_send_response(pHddCtx);
2519
2520 break;
2521
2522 case WLAN_FTM_CMD:
2523 /* if it is regular FTM command, pass it to HAL PHY */
2524 if(pHddCtx->ftm.IsCmdPending == TRUE) {
2525 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process\n",__func__);
2526 return;
2527 }
2528 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
2529
2530 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started\n",__func__);
2531
2532 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2533 wlan_ftm_send_response(pHddCtx);
2534 return;
2535
2536 }
2537 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
2538 cmd_len = pRequestBuf->ftm_hdr.data_len;
2539 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
2540 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
2541
Jeff Johnson295189b2012-06-20 16:38:30 -07002542 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
2543 if (0 == hostState)
2544 {
2545 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
2546 if (NULL == tempRspBuffer)
2547 {
2548 hddLog(VOS_TRACE_LEVEL_ERROR,
2549 "%s:: temp Mem Alloc Fail\n",__func__);
2550 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2551 wlan_ftm_send_response(pHddCtx);
2552 return;
2553 }
2554 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
2555 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
2556 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
2557 (unsigned char *) tempRspBuffer,
2558 tempRspBuffer->msgBodyLength);
2559 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2560 wlan_ftm_send_response(pHddCtx);
2561 vos_mem_free(tempRspBuffer);
2562 return;
2563 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002564 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002565 {
2566 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
2567 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2568 wlan_ftm_send_response(pHddCtx);
2569 return;
2570 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002571
2572 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
2573
2574 pHddCtx->ftm.IsCmdPending = TRUE;
2575
2576 /*Post the command to the HAL*/
2577 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
2578
2579 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed\n",__func__);
2580 return;
2581
2582 }
2583 /*Wait here until you get the response from HAL*/
2584 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
2585 {
2586 hddLog(VOS_TRACE_LEVEL_ERROR,
2587 "%s: vos_wait_single_event failed",__func__);
2588 return;
2589 }
2590
2591 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
2592
2593 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
2594
2595 wlan_ftm_send_response(pHddCtx);
2596 pHddCtx->ftm.IsCmdPending = FALSE;
2597 break;
2598
2599 default:
2600
2601 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported \n",__func__);
2602 return;
2603 }
2604
2605 EXIT();
2606 return;
2607} /* wlan_adp_ftm_cmd() */
2608
2609/**---------------------------------------------------------------------------
2610
2611 \brief wlan_ftm_priv_start_stop_ftm() -
2612
2613 This function is used for start/stop the ftm driver.
2614
2615 \param - pAdapter - Pointer HDD Context.
2616 - start - 1/0 to start/stop ftm driver.
2617
2618 \return - 0 for success, non zero for failure
2619
2620 --------------------------------------------------------------------------*/
2621
2622static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
2623 v_U16_t start)
2624{
2625 VOS_STATUS status;
2626 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
2627
2628 if (start)
2629 {
2630 pHddCtx->ftm.cmd_iwpriv = TRUE;
2631 status = wlan_hdd_ftm_start(pHddCtx);
2632
2633 if (status != VOS_STATUS_SUCCESS)
2634 {
2635 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
2636 "FTM Start Failed");
2637 return VOS_STATUS_E_FAILURE;
2638 }
2639 }
2640 else
2641 {
2642 status = wlan_ftm_stop(pHddCtx);
2643
2644 if (status != VOS_STATUS_SUCCESS)
2645 {
2646 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
2647 "FTM Stop Failed");
2648 return VOS_STATUS_E_FAILURE;
2649 }
2650 }
2651 return VOS_STATUS_SUCCESS;
2652}
2653
2654/**---------------------------------------------------------------------------
2655
2656 \brief wlan_ftm_priv_set_channel() -
2657
2658 This function is used for setting the channel to the halphy ptt module.
2659
2660 \param - pAdapter - Pointer HDD Context.
2661 - channel - Channel Number 1-14.
2662
2663 \return - 0 for success, non zero for failure
2664
2665 --------------------------------------------------------------------------*/
2666
2667static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
2668{
2669 tPttMsgbuffer *pMsgBuf;
2670 uPttMsgs *pMsgBody;
2671 VOS_STATUS status;
2672 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
2673
2674 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
2675 {
2676 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
2677 return VOS_STATUS_E_FAILURE;
2678 }
2679
2680 if(!(channel >= 1 && channel <= 14))
2681 {
2682 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Channel Number. ",__func__);
2683 return VOS_STATUS_E_FAILURE;
2684 }
2685
2686 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
2687 if(pMsgBuf == NULL)
2688 {
2689 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
2690 return VOS_STATUS_E_NOMEM;
2691 }
2692 init_completion(&pHddCtx->ftm.ftm_comp_var);
2693 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
2694 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
2695
2696 pMsgBody = &pMsgBuf->msgBody;
2697
2698 pMsgBody->SetChannel.chId = channel;
2699
2700 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d\n",pMsgBody->SetChannel.chId);
2701 pMsgBody->SetChannel.cbState = PHY_SINGLE_CHANNEL_CENTERED;
2702
2703 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
2704
2705 if(status != VOS_STATUS_SUCCESS)
2706 {
2707 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
2708 status = VOS_STATUS_E_FAILURE;
2709 goto done;
2710
2711 }
2712 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
2713
2714 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
2715 {
2716 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
2717 status = VOS_STATUS_E_FAILURE;
2718 goto done;
2719
2720 }
2721done:
2722 vos_mem_free((v_VOID_t * )pMsgBuf);
2723
2724 return status;
2725}
2726
2727/**---------------------------------------------------------------------------
2728
2729 \brief wlan_ftm_priv_set_txpower() -
2730
2731 This function is used for setting the txpower to the halphy ptt module.
2732
2733 \param - pAdapter - Pointer HDD Context.
2734 - txpower - txpower Number 1-18.
2735
2736 \return - 0 for success, non zero for failure
2737
2738 --------------------------------------------------------------------------*/
2739
2740static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,v_U16_t txpower)
2741{
2742 tPttMsgbuffer *pMsgBuf;
2743 uPttMsgs *pMsgBody;
2744 VOS_STATUS status;
2745 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
2746
2747 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
2748 {
2749 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
2750 return VOS_STATUS_E_FAILURE;
2751 }
2752
2753 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
2754 * when tx pktgen is enabled
2755 */
2756 if (ftm_status.frameGenEnabled)
2757 {
2758 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpower when pktgen is enabled.",__func__);
2759 return VOS_STATUS_E_FAILURE;
2760 }
2761
2762 if(!(txpower >= 9 && txpower <= 24))
2763 {
2764 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid tx power. ",__func__);
2765 return VOS_STATUS_E_FAILURE;
2766 }
2767 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
2768 if(pMsgBuf == NULL)
2769 {
2770 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
2771 return VOS_STATUS_E_NOMEM;
2772 }
2773 init_completion(&pHddCtx->ftm.ftm_comp_var);
2774 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP;
2775 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
2776
2777 pMsgBody = &pMsgBuf->msgBody;
2778 pMsgBody->CloseTpcLoop.tpcClose = TRUE;
2779
2780 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
2781
2782 if(status != VOS_STATUS_SUCCESS)
2783 {
2784 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
2785 status = VOS_STATUS_E_FAILURE;
2786 goto done;
2787 }
2788 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
2789
2790 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
2791 {
2792 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
2793 status = VOS_STATUS_E_FAILURE;
2794 goto done;
2795 }
2796
2797 init_completion(&pHddCtx->ftm.ftm_comp_var);
2798 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
2799 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
2800
2801 pMsgBody->SetTxPower.dbmPwr = txpower*100;
2802
2803 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
2804
2805 if(status != VOS_STATUS_SUCCESS)
2806 {
2807 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
2808 status = VOS_STATUS_E_FAILURE;
2809 goto done;
2810 }
2811 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
2812
2813 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
2814 {
2815 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
2816 status = VOS_STATUS_E_FAILURE;
2817 goto done;
2818 }
2819
2820 ftm_status.txpower = txpower ;
2821 done:
2822 vos_mem_free((v_VOID_t * )pMsgBuf);
2823
2824 return status;
2825
2826}
2827/**---------------------------------------------------------------------------
2828
2829 \brief wlan_ftm_priv_set_txrate() -
2830
2831 This function is used for setting the txrate to the halphy ptt module.
2832 It converts the user input string for txrate to the tx rate index.
2833
2834 \param - pAdapter - Pointer HDD Context.
2835 - txrate - Pointer to the tx rate string.
2836
2837 \return - 0 for success, non zero for failure
2838
2839 --------------------------------------------------------------------------*/
2840
2841static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
2842{
2843 int ii;
2844 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
2845 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
2846 {
2847 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
2848 return VOS_STATUS_E_FAILURE;
2849 }
2850
2851 /* do not allow to change setting when tx pktgen is enabled */
2852 if (ftm_status.frameGenEnabled)
2853 {
2854 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
2855 return VOS_STATUS_E_FAILURE;
2856 }
2857
2858 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
2859 {
2860 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
2861 break;
2862 }
2863 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
2864 {
2865 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String\n",__func__);
2866 return VOS_STATUS_E_FAILURE;
2867 }
2868
2869 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
2870 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
2871
2872 return VOS_STATUS_SUCCESS;
2873}
2874
2875/**---------------------------------------------------------------------------
2876
2877 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
2878
2879 This function is used for start/stop the tx packet generation.
2880
2881 \param - pAdapter - Pointer HDD Context.
2882 - startStop - Value( 1/0) start/stop the tx packet generation.
2883
2884 \return - 0 for success, non zero for failure
2885
2886 --------------------------------------------------------------------------*/
2887
2888static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
2889{
2890 tPttMsgbuffer *pMsgBuf;
2891 uPttMsgs *pMsgBody;
2892 VOS_STATUS status;
2893 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
2894
2895 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
2896 {
2897 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
2898 return VOS_STATUS_E_FAILURE;
2899 }
2900
2901 if(startStop != 1 && startStop != 0)
2902 {
2903 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Tx value is invalid ",__func__);
2904 return VOS_STATUS_E_FAILURE;
2905 }
2906
2907 if ((ftm_status.frameGenEnabled && startStop == 1) ||
2908 (!ftm_status.frameGenEnabled && startStop == 0))
2909 {
2910 return VOS_STATUS_SUCCESS ;
2911 }
2912
2913 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
2914 if(pMsgBuf == NULL)
2915 {
2916 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
2917 return VOS_STATUS_E_NOMEM;
2918 }
2919 if (startStop == 1)
2920 {
2921 init_completion(&pHddCtx->ftm.ftm_comp_var);
2922 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
2923 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
2924 pMsgBody = &pMsgBuf->msgBody;
2925 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
2926
2927 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
2928 if(status != VOS_STATUS_SUCCESS)
2929 {
2930 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",__func__);
2931 status = VOS_STATUS_E_FAILURE;
2932 goto done;
2933 }
2934
2935 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
2936 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
2937 {
2938 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed",__func__);
2939 status = VOS_STATUS_E_FAILURE;
2940 goto done;
2941 }
2942 }
2943
2944 init_completion(&pHddCtx->ftm.ftm_comp_var);
2945 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
2946 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
2947 pMsgBody = &pMsgBuf->msgBody;
2948 pMsgBody->StartStopTxPacketGen.startStop = startStop;
2949
2950 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
2951 if(status != VOS_STATUS_SUCCESS)
2952 {
2953 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
2954 status = VOS_STATUS_E_FAILURE;
2955 goto done;
2956 }
2957
2958 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
2959 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
2960 {
2961 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
2962 status = VOS_STATUS_E_FAILURE;
2963 goto done;
2964 }
2965
2966done:
2967 vos_mem_free((v_VOID_t * )pMsgBuf);
2968
2969 if (status == VOS_STATUS_SUCCESS)
2970 {
2971 if (startStop == 1)
2972 {
2973 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE ;
2974 }
2975 else
2976 {
2977 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE ;
2978 }
2979 }
2980
2981 return status;
2982}
2983
2984
Jeff Johnson295189b2012-06-20 16:38:30 -07002985/**---------------------------------------------------------------------------
2986
2987 \brief wlan_ftm_rx_mode() -
2988
2989 This function is used for start/stop the rx packet generation.
2990
2991 \param - pAdapter - Pointer HDD Context.
2992 - rxmode - 0-disable RX.
2993 - 1-rx ALL frames
2994 - 2-rx 11 g/n frames
2995 - 3-rx 11b frames
2996
2997 \return - 0 for success, non zero for failure
2998
2999 --------------------------------------------------------------------------*/
3000
3001static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3002{
3003 tPttMsgbuffer *pMsgBuf;
3004 uPttMsgs *pMsgBody;
3005 VOS_STATUS status;
3006
3007 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3008 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3009 {
3010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3011 return VOS_STATUS_E_FAILURE;
3012 }
3013
3014 if(rxmode > 3)
3015 {
3016 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Rx mode value is invalid ",__func__);
3017 return VOS_STATUS_E_FAILURE;
3018 }
3019
3020 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3021 if(pMsgBuf == NULL)
3022 {
3023 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3024 return VOS_STATUS_E_NOMEM;
3025 }
3026 init_completion(&pHddCtx->ftm.ftm_comp_var);
3027
3028 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3029 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3030
3031 pMsgBody = &pMsgBuf->msgBody;
3032
3033 switch(rxmode)
3034 {
3035 case RXMODE_DISABLE_ALL:
3036 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3037 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3038 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3039 break;
3040
3041 case RXMODE_ENABLE_ALL:
3042 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3043 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3044 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3045 break;
3046
3047 case RXMODE_ENABLE_11GN:
3048 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3049 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3050 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3051 break;
3052
3053 case RXMODE_ENABLE_11B:
3054 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3055 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3056 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3057 break;
3058
3059 }
3060
3061 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3062
3063 if(status != VOS_STATUS_SUCCESS)
3064 {
3065 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3066 status = VOS_STATUS_E_FAILURE;
3067 goto done;
3068 }
3069 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3070
3071 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3072 {
3073 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3074 status = VOS_STATUS_E_FAILURE;
3075 goto done;
3076 }
3077 ftm_status.rxmode = rxmode ;
3078done:
3079 vos_mem_free((v_VOID_t * )pMsgBuf);
3080
3081 return status;
3082}
3083
3084/**---------------------------------------------------------------------------
3085
3086 \brief wlan_ftm_priv_rx_pkt_clear() -
3087
3088 This function sets the rx pkt count to zero.
3089
3090 \param - pAdapter - Pointer HDD Context.
3091 - rx_pkt_clear - rx_pkt_clear value.
3092
3093 \return - 0 for success, non zero for failure
3094
3095 --------------------------------------------------------------------------*/
3096
3097static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3098{
3099 tPttMsgbuffer *pMsgBuf;
3100 uPttMsgs *pMsgBody;
3101 VOS_STATUS status;
3102 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3103
3104 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3105 {
3106 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3107 return VOS_STATUS_E_FAILURE;
3108 }
3109
3110 if(rx_pkt_clear != 1)
3111 {
3112 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid rx_pkt_clear value ",__func__);
3113 return VOS_STATUS_E_FAILURE;
3114 }
3115
3116 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3117 if(pMsgBuf == NULL)
3118 {
3119 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3120 return VOS_STATUS_E_NOMEM;
3121 }
3122 init_completion(&pHddCtx->ftm.ftm_comp_var);
3123 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
3124 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
3125
3126 pMsgBody = &pMsgBuf->msgBody;
3127 pMsgBody->ResetRxPacketStatistics.notUsed= rx_pkt_clear;
3128
3129 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3130
3131 if(status != VOS_STATUS_SUCCESS)
3132 {
3133 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3134 status = VOS_STATUS_E_FAILURE;
3135 goto done;
3136 }
3137 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3138
3139 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3140 {
3141 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3142 status = VOS_STATUS_E_FAILURE;
3143 goto done;
3144 }
3145done:
3146 vos_mem_free((v_VOID_t * )pMsgBuf);
3147
3148 return status;
3149}
3150
3151/**---------------------------------------------------------------------------
3152
3153 \brief wlan_ftm_priv_get_channel() -
3154
3155 This function gets the channel number from the halphy ptt module and
3156 returns the channel number to the application.
3157
3158 \param - pAdapter - Pointer HDD Context.
3159 - pChannel - Poniter to get the Channel number.
3160
3161 \return - 0 for success, non zero for failure
3162
3163 --------------------------------------------------------------------------*/
3164
3165static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
3166{
3167 tPttMsgbuffer *pMsgBuf;
3168 uPttMsgs *pMsgBody;
3169 VOS_STATUS status;
3170 v_U16_t freq;
3171 v_U8_t indx=0;
3172
3173 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3174
3175 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3176 {
3177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3178 return VOS_STATUS_E_FAILURE;
3179 }
3180 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3181 if(pMsgBuf == NULL)
3182 {
3183 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3184 return VOS_STATUS_E_NOMEM;
3185 }
3186 init_completion(&pHddCtx->ftm.ftm_comp_var);
3187 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3188 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3189
3190 pMsgBody = &pMsgBuf->msgBody;
3191 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
3192
3193 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3194
3195 if(status != VOS_STATUS_SUCCESS)
3196 {
3197 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3198 status = VOS_STATUS_E_FAILURE;
3199 goto done;
3200
3201 }
3202 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3203
3204 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3205 {
3206 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3207 status = VOS_STATUS_E_FAILURE;
3208 goto done;
3209 }
3210
3211 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
3212
3213 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
3214 indx++;
3215 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
3216 {
3217 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
3218 status = VOS_STATUS_E_FAILURE;
3219 goto done;
3220 }
3221
3222 *pChannel = freq_chan_tbl[indx].chan;
3223
3224 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d\n",*pChannel, freq);
3225 done:
3226 vos_mem_free((v_VOID_t * )pMsgBuf);
3227
3228 return status;
3229}
3230
3231/**---------------------------------------------------------------------------
3232
3233 \brief wlan_ftm_priv_get_txpower() -
3234
3235 This function gets the TX power from the halphy ptt module and
3236 returns the TX power to the application.
3237
3238 \param - pAdapter - Pointer HDD Context.
3239 - pTxPwr - Poniter to get the Tx power.
3240
3241 \return - 0 for success, non zero for failure
3242
3243 --------------------------------------------------------------------------*/
3244
3245static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
3246{
3247 tPttMsgbuffer *pMsgBuf;
3248 uPttMsgs *pMsgBody;
3249 VOS_STATUS status;
3250 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3251
3252 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3253 {
3254 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3255 return VOS_STATUS_E_FAILURE;
3256 }
3257 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3258 if(pMsgBuf == NULL)
3259 {
3260 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3261 return VOS_STATUS_E_NOMEM;
3262 }
3263 init_completion(&pHddCtx->ftm.ftm_comp_var);
3264 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
3265 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
3266
3267 pMsgBody = &pMsgBuf->msgBody;
3268
3269 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3270
3271 if(status != VOS_STATUS_SUCCESS)
3272 {
3273 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3274 status = VOS_STATUS_E_FAILURE;
3275 goto done;
3276 }
3277 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3278
3279 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3280 {
3281 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s: PTT_MSG_GET_TX_POWER_REPORT failed",__func__);
3282 status = VOS_STATUS_E_FAILURE;
3283 goto done;
3284 }
3285 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
3286
3287 done:
3288 vos_mem_free((v_VOID_t * )pMsgBuf);
3289
3290 return status;
3291}
3292
3293/**---------------------------------------------------------------------------
3294
3295 \brief wlan_ftm_priv_get_ftm_version() -
3296
3297 This function gets ftm driver and firmware version.
3298
3299 \param - pAdapter - Pointer HDD Context.
3300 - pTxRate - Poniter to get the Tx rate.
3301
3302 \return - 0 for success, non zero for failure
3303
3304 --------------------------------------------------------------------------*/
3305
3306VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
3307{
3308 tPttMsgbuffer *pMsgBuf;
3309 uPttMsgs *pMsgBody;
3310 VOS_STATUS status;
3311 v_U32_t reg_val;
3312 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07003313 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3314 int lenRes = 0;
3315 int lenBuf = WE_FTM_MAX_STR_LEN;
3316
3317 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3318 {
3319 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3320 return VOS_STATUS_E_FAILURE;
3321 }
3322
3323 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3324 if(pMsgBuf == NULL)
3325 {
3326 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3327 return VOS_STATUS_E_NOMEM;
3328 }
3329 init_completion(&pHddCtx->ftm.ftm_comp_var);
3330 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3331 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3332
3333 pMsgBody = &pMsgBuf->msgBody;
3334 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
3335
3336 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3337
3338 if(status != VOS_STATUS_SUCCESS)
3339 {
3340 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3341 status = VOS_STATUS_E_FAILURE;
3342 goto done;
3343
3344 }
3345 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3346
3347 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3348 {
3349 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3350 status = VOS_STATUS_E_FAILURE;
3351 goto done;
3352 }
3353
3354 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
3355
3356 init_completion(&pHddCtx->ftm.ftm_comp_var);
3357
3358 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
3359 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
3360
3361 pMsgBody = &pMsgBuf->msgBody;
3362
3363 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3364
3365 if(status != VOS_STATUS_SUCCESS)
3366 {
3367 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3368 status = VOS_STATUS_E_FAILURE;
3369 goto done;
3370 }
3371 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3372
3373
3374 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
3375 if(lenRes < 0 || lenRes >= lenBuf)
3376 {
3377 status = VOS_STATUS_E_FAILURE;
3378 goto done;
3379 }
3380
3381 buf += lenRes;
3382 lenBuf -= lenRes;
3383
3384 /*Read the RevID*/
3385 lenRes = snprintf(buf, lenBuf, "%x.%x-",(v_U8_t)(reg_val >> 8), (v_U8_t)(reg_val &0x000000FF));
3386 if(lenRes < 0 || lenRes >= lenBuf)
3387 {
3388 status = VOS_STATUS_E_FAILURE;
3389 goto done;
3390 }
3391
3392 buf += lenRes;
3393 lenBuf -= lenRes;
3394
3395 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
3396 if(lenRes < 0 || lenRes >= lenBuf)
3397 {
3398 status = VOS_STATUS_E_FAILURE;
3399 goto done;
3400 }
3401
3402 buf += lenRes;
3403 lenBuf -= lenRes;
3404
Jeff Johnson295189b2012-06-20 16:38:30 -07003405
3406done:
3407 vos_mem_free((v_VOID_t * )pMsgBuf);
3408
3409 return status;
3410
3411}
3412
3413/**---------------------------------------------------------------------------
3414
3415 \brief wlan_ftm_priv_get_txrate() -
3416
3417 This function gets the TX rate from the halphy ptt module and
3418 returns the TX rate to the application.
3419
3420 \param - pAdapter - Pointer HDD Context.
3421 - pTxRate - Poniter to get the Tx rate.
3422
3423 \return - 0 for success, non zero for failure
3424
3425 --------------------------------------------------------------------------*/
3426
3427static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
3428{
3429 tPttMsgbuffer *pMsgBuf;
3430 uPttMsgs *pMsgBody;
3431 VOS_STATUS status;
3432 v_U16_t rate_index,ii;
3433 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3434
3435 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3436 {
3437 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3438 return VOS_STATUS_E_FAILURE;
3439 }
3440
3441 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3442 if(pMsgBuf == NULL)
3443 {
3444 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3445 return VOS_STATUS_E_NOMEM;
3446 }
3447 init_completion(&pHddCtx->ftm.ftm_comp_var);
3448 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
3449 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
3450
3451 pMsgBody = &pMsgBuf->msgBody;
3452
3453 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3454
3455 if(status != VOS_STATUS_SUCCESS)
3456 {
3457 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3458 status = VOS_STATUS_E_FAILURE;
3459 goto done;
3460 }
3461 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3462
3463 if(pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
3464
3465 rate_index = pMsgBody->GetTxPowerReport.rate;
3466 }
3467 else {
3468 /*Return the default rate*/
3469 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
3470 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s: PTT_MSG_GET_TX_POWER_REPORT failed",__func__);
3471 status = VOS_STATUS_E_FAILURE;
3472 goto done;
3473 }
3474
3475 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
3476 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
3477 break;
3478 }
3479 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3480 {
3481 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index\n",__func__);
3482 status = VOS_STATUS_E_FAILURE;
3483 goto done;
3484 }
3485 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
3486done:
3487 vos_mem_free((v_VOID_t * )pMsgBuf);
3488
3489 return status;
3490
3491}
3492
3493/**---------------------------------------------------------------------------
3494
3495 \brief wlan_ftm_priv_get_rx_pkt_count() -
3496
3497 This function gets the rx pkt count from the halphy ptt module and
3498 returns the rx pkt count to the application.
3499
3500 \param - pAdapter - Pointer HDD Context.
3501 - pRxPktCnt - Poniter to get the rx pkt count.
3502
3503 \return - 0 for success, non zero for failure
3504
3505 --------------------------------------------------------------------------*/
3506
3507static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
3508{
3509 tPttMsgbuffer *pMsgBuf;
3510 uPttMsgs *pMsgBody;
3511 VOS_STATUS status;
3512 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3513
3514 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3515 {
3516 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3517 return VOS_STATUS_E_FAILURE;
3518 }
3519 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3520 if(pMsgBuf == NULL)
3521 {
3522 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3523 return VOS_STATUS_E_NOMEM;
3524 }
3525 init_completion(&pHddCtx->ftm.ftm_comp_var);
3526 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
3527 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
3528
3529 pMsgBody = &pMsgBuf->msgBody;
3530
3531 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3532
3533 if(status != VOS_STATUS_SUCCESS)
3534 {
3535 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3536 status = VOS_STATUS_E_FAILURE;
3537 goto done;
3538 }
3539 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3540
3541 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3542 {
3543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3544 status = VOS_STATUS_E_FAILURE;
3545 goto done;
3546 }
3547 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
3548done:
3549 vos_mem_free((v_VOID_t * )pMsgBuf);
3550
3551 return status;
3552}
3553
3554/**---------------------------------------------------------------------------
3555
3556 \brief wlan_ftm_priv_get_rx_rssi() -
3557
3558 This function gets the rx rssi from the halphy ptt module and
3559 returns the rx rssi to the application.
3560
3561 \param - pAdapter - Pointer HDD Context.
3562 - buf - Poniter to get rssi of Rx chains
3563
3564 \return - 0 for success, non zero for failure
3565
3566 --------------------------------------------------------------------------*/
3567
3568static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
3569{
3570 tPttMsgbuffer *pMsgBuf;
3571 uPttMsgs *pMsgBody;
3572 VOS_STATUS status;
3573 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3574 int ret;
3575
3576 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3577 {
3578 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3579 return VOS_STATUS_E_FAILURE;
3580 }
3581 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3582 if(pMsgBuf == NULL)
3583 {
3584 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3585 return VOS_STATUS_E_NOMEM;
3586 }
3587 init_completion(&pHddCtx->ftm.ftm_comp_var);
3588 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
3589 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
3590
3591 pMsgBody = &pMsgBuf->msgBody;
3592
3593 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3594
3595 if(status != VOS_STATUS_SUCCESS)
3596 {
3597 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3598 status = VOS_STATUS_E_FAILURE;
3599 goto done;
3600 }
3601 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3602
3603 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3604 {
3605 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3606 status = VOS_STATUS_E_FAILURE;
3607 goto done;
3608 }
3609
3610 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
3611 pMsgBody->GetRxRssi.rssi.rx[0],
3612 pMsgBody->GetRxRssi.rssi.rx[1]);
3613
3614 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
3615 {
3616 status = VOS_STATUS_E_FAILURE;
3617 }
3618
3619done:
3620 vos_mem_free((v_VOID_t * )pMsgBuf);
3621
3622 return status;
3623}
3624
3625/**---------------------------------------------------------------------------
3626
3627 \brief wlan_ftm_priv_get_mac_address() -
3628
3629 This function gets the mac address from the halphy ptt module and
3630 returns the mac address to the application.
3631
3632 \param - pAdapter - Pointer HDD Context.
3633 - buf - Poniter to get the mac address.
3634
3635 \return - 0 for success, non zero for failure
3636
3637 --------------------------------------------------------------------------*/
3638
3639static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
3640{
3641 v_BOOL_t itemIsValid = VOS_FALSE;
3642 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
3643 int ret;
3644
3645 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3646
3647 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3648 {
3649 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3650 return VOS_STATUS_E_FAILURE;
3651 }
3652 /*Check the NV FIELD is valid or not*/
3653 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
3654 {
3655 if (itemIsValid == VOS_TRUE)
3656 {
3657 vos_nv_readMacAddress(macAddr);
3658
3659 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
3660 "%02x:%02x:%02x:%02x:%02x:%02x",
3661 MAC_ADDR_ARRAY(macAddr));
3662 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
3663 {
3664 return VOS_STATUS_E_FAILURE;
3665 }
3666 }
3667 }
3668 else
3669 {
3670 /*Return Hard coded mac address*/
3671 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
3672 "%02x:%02x:%02x:%02x:%02x:%02x",
3673 MAC_ADDR_ARRAY(macAddr));
3674
3675 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
3676 {
3677 return VOS_STATUS_E_FAILURE;
3678 }
3679 }
3680 return VOS_STATUS_SUCCESS;
3681}
3682
3683/**---------------------------------------------------------------------------
3684
3685 \brief wlan_ftm_priv_set_mac_address() -
3686
3687 This function sets the mac address to the halphy ptt module and
3688 sends the netlink message to the ptt socket application which writes
3689 the macaddress to the qcom_wlan_nv.bin file
3690
3691 \param - pAdapter - Pointer HDD Context.
3692 - buf - Poniter to the macaddress.
3693
3694 \return - 0 for success, non zero for failure
3695
3696 --------------------------------------------------------------------------*/
3697
3698static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
3699{
3700 tPttMsgbuffer *pMsgBuf;
3701 uPttMsgs *pMsgBody;
3702 VOS_STATUS status;
3703 int macAddr[VOS_MAC_ADDRESS_LEN];
3704 v_U8_t *pMacAddress;
3705 v_U8_t ii;
3706 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3707
3708 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3709 {
3710 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
3711 return VOS_STATUS_E_FAILURE;
3712 }
3713 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3714 if(pMsgBuf == NULL)
3715 {
3716 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pMsgBuf is NULL",__func__);
3717 return VOS_STATUS_E_NOMEM;
3718 }
3719 init_completion(&pHddCtx->ftm.ftm_comp_var);
3720 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
3721 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
3722
3723 pMsgBody = &pMsgBuf->msgBody;
3724 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
3725
3726 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
3727 sscanf(buf,"%02x:%02x:%02x:%02x:%02x:%02x",&macAddr[0],(int*)&macAddr[1],(int*)&macAddr[2],(int*)&macAddr[3],(int*)&macAddr[4],(int*)&macAddr[5]);
3728
3729 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "MacAddress = %02x:%02x:%02x:%02x:%02x:%02x",MAC_ADDR_ARRAY(macAddr));
3730
3731
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07003732 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07003733
3734 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
3735 pMacAddress[ii] = (v_U8_t)macAddr[ii];
3736
3737
3738 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "pMacAddress = %02x:%02x:%02x:%02x:%02x:%02x",MAC_ADDR_ARRAY(pMacAddress));
3739 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3740
3741 if(status != VOS_STATUS_SUCCESS)
3742 {
3743 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed!!",__func__);
3744 status = VOS_STATUS_E_FAILURE;
3745 goto done;
3746 }
3747 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3748
3749 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3750 {
3751 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3752 status = VOS_STATUS_E_FAILURE;
3753 goto done;
3754 }
3755
3756 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!\n");
3757
3758 init_completion(&pHddCtx->ftm.ftm_comp_var);
3759 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
3760
3761 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
3762 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
3763
3764 pMsgBody = &pMsgBuf->msgBody;
3765
3766 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
3767
3768 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3769
3770 if(status != VOS_STATUS_SUCCESS)
3771 {
3772 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed!!!!",__func__);
3773 status = VOS_STATUS_E_FAILURE;
3774 goto done;
3775 }
3776
3777 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3778done:
3779 vos_mem_free((v_VOID_t * )pMsgBuf);
3780
3781 return VOS_STATUS_SUCCESS;
3782}
3783
3784/* set param sub-ioctls */
3785static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
3786 union iwreq_data *wrqu, char *extra)
3787{
3788 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08003789 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07003790 VOS_STATUS status;
3791 hdd_adapter_t *pAdapter = (netdev_priv(dev));
3792
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003793 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Received length %d", __func__, wrqu->data.length);
3794 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Received data %s", __func__, (char*)wrqu->data.pointer);
Jeff Johnson295189b2012-06-20 16:38:30 -07003795
3796 switch(sub_cmd)
3797 {
3798 case WE_SET_MAC_ADDRESS:
3799 {
3800
3801 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "SET MAC ADDRESS\n");
3802
3803 status = wlan_ftm_priv_set_mac_address(pAdapter,(char*)wrqu->data.pointer);
3804
3805 if(status != VOS_STATUS_SUCCESS)
3806 {
3807 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_mac_address Failed =%d\n",status);
3808 ret = -EINVAL;
3809 }
3810
3811 }
3812 break;
3813 case WE_SET_TX_RATE:
3814 {
3815 status = wlan_ftm_priv_set_txrate(pAdapter,(char*)wrqu->data.pointer);
3816
3817 if(status != VOS_STATUS_SUCCESS)
3818 {
3819 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txrate Failed =%d\n",status);
3820 ret = -EINVAL;
3821 }
3822
3823 break;
3824 }
3825 default:
3826 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003827 hddLog(LOGE, "%s: Invalid sub command %d\n",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07003828 ret = -EINVAL;
3829 break;
3830 }
3831 }
3832 return ret;
3833}
3834
3835static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
3836 union iwreq_data *wrqu, char *extra)
3837{
3838 hdd_adapter_t *pAdapter = (netdev_priv(dev));
3839 int *value = (int *)extra;
3840 int sub_cmd = value[0];
3841 int set_value = value[1];
3842 int ret = 0; /* success */
3843 VOS_STATUS status;
3844
3845 switch(sub_cmd)
3846 {
3847 case WE_FTM_ON_OFF:
3848 {
3849 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
3850
3851 if(status != VOS_STATUS_SUCCESS)
3852 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003853 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d\n",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07003854 ret = -EINVAL;
3855 }
3856
3857 break;
3858 }
3859
3860 case WE_TX_PKT_GEN:
3861 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
3862
3863 if(status != VOS_STATUS_SUCCESS)
3864 {
3865 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d\n",status);
3866 ret = -EINVAL;
3867 }
3868 break;
3869
3870 case WE_SET_TX_IFS:
3871 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
3872
3873 if(status != VOS_STATUS_SUCCESS)
3874 {
3875 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d\n",status);
3876 ret = -EINVAL;
3877 }
3878 break;
3879
3880 case WE_SET_TX_PKT_CNT:
3881 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
3882
3883 if(status != VOS_STATUS_SUCCESS)
3884 {
3885 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d\n",status);
3886 ret = -EINVAL;
3887 }
3888 break;
3889
3890 case WE_SET_TX_PKT_LEN:
3891 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
3892
3893 if(status != VOS_STATUS_SUCCESS)
3894 {
3895 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d\n",status);
3896 ret = -EINVAL;
3897 }
3898 break;
3899
3900 case WE_SET_CHANNEL:
3901 {
3902 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
3903
3904 if(status != VOS_STATUS_SUCCESS)
3905 {
3906 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d\n",status);
3907 ret = -EINVAL;
3908 }
3909 break;
3910 }
3911 case WE_SET_TX_POWER:
3912 {
3913 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
3914
3915 if(status != VOS_STATUS_SUCCESS)
3916 {
3917 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d\n",status);
3918 ret = -EINVAL;
3919 }
3920 break;
3921 }
3922 case WE_CLEAR_RX_PKT_CNT:
3923 {
3924 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
3925
3926 if(status != VOS_STATUS_SUCCESS)
3927 {
3928 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d\n",status);
3929 ret = -EINVAL;
3930 }
3931 break;
3932 }
3933 case WE_RX:
3934 {
3935 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
3936
3937 if(status != VOS_STATUS_SUCCESS)
3938 {
3939 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d\n",status);
3940 ret = -EINVAL;
3941 }
3942 break;
3943 }
3944 case WE_ENABLE_CHAIN:
3945 {
3946 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
3947
3948 if(status != VOS_STATUS_SUCCESS)
3949 {
3950 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d\n",status);
3951 ret = -EINVAL;
3952 }
3953 break;
3954 }
3955
3956 default:
3957 {
3958 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d \n",
3959 sub_cmd, set_value);
3960 break;
3961 }
3962 }
3963
3964 return ret;
3965}
3966
3967/* get param sub-ioctls */
3968static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
3969 union iwreq_data *wrqu, char *extra)
3970{
3971 hdd_adapter_t *pAdapter = (netdev_priv(dev));
3972 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08003973 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07003974 VOS_STATUS status;
3975
3976 switch (value[0])
3977 {
3978 case WE_GET_CHANNEL:
3979 {
3980 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
3981
3982 if(status != VOS_STATUS_SUCCESS)
3983 {
3984 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d\n",status);
3985 ret = -EINVAL;
3986 }
3987 break;
3988 }
3989 case WE_GET_TX_POWER:
3990 {
3991 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
3992
3993 if(status != VOS_STATUS_SUCCESS)
3994 {
3995 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d\n",status);
3996 ret = -EINVAL;
3997 }
3998 break;
3999 }
4000 case WE_GET_RX_PKT_CNT:
4001 {
4002 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4003
4004 if(status != VOS_STATUS_SUCCESS)
4005 {
4006 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d\n",status);
4007 ret = -EINVAL;
4008 }
4009 break;
4010 }
4011 default:
4012 {
4013 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
4014 break;
4015 }
4016 }
4017
4018 return ret;
4019}
4020
4021static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
4022 union iwreq_data *wrqu, char *extra)
4023{
4024 int sub_cmd = wrqu->data.flags;
4025 VOS_STATUS status;
4026 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4027
4028 switch(sub_cmd)
4029 {
4030 case WE_GET_MAC_ADDRESS:
4031 {
4032 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
4033
4034 if(status != VOS_STATUS_SUCCESS)
4035 {
4036 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d\n",status);
4037 return -EINVAL;
4038 }
4039 wrqu->data.length = strlen(extra)+1;
4040 break;
4041 }
4042 case WE_GET_TX_RATE:
4043 {
4044 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
4045
4046 if(status != VOS_STATUS_SUCCESS)
4047 {
4048 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d\n",status);
4049 return -EINVAL;
4050 }
4051
4052 wrqu->data.length = strlen(extra)+1;
4053 break;
4054 }
4055 case WE_GET_FTM_VERSION:
4056 {
4057 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
4058
4059 if(status != VOS_STATUS_SUCCESS)
4060 {
4061 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d\n",status);
4062 return -EINVAL;
4063 }
4064 wrqu->data.length = strlen(extra)+1;
4065 break;
4066 }
4067 case WE_GET_FTM_STATUS:
4068 {
4069 status = wlan_ftm_priv_get_status(pAdapter, extra);
4070
4071 if(status != VOS_STATUS_SUCCESS)
4072 {
4073 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d\n",status);
4074 return -EINVAL;
4075 }
4076
4077 wrqu->data.length = strlen(extra)+1;
4078 break;
4079 }
4080 case WE_GET_RX_RSSI:
4081 {
4082 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
4083
4084 if(status != VOS_STATUS_SUCCESS)
4085 {
4086 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d\n",status);
4087 return -EINVAL;
4088 }
4089
4090 wrqu->data.length = strlen(extra)+1;
4091 break;
4092 }
4093 default:
4094 {
4095 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
4096 break;
4097 }
4098 }
4099
4100 return 0;
4101}
Jeff Johnson295189b2012-06-20 16:38:30 -07004102
4103VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
4104{
Jeff Johnson88ba7742013-02-27 14:36:02 -08004105#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07004106 tAniHdr *wmsg = NULL;
4107 v_U8_t *pBuf;
4108 hdd_context_t *pHddCtx = NULL;
4109 v_CONTEXT_t pVosContext= NULL;
4110
4111 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
4112 if(pBuf == NULL)
4113 {
4114 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
4115 return VOS_STATUS_E_NOMEM;
4116 }
4117 wmsg = (tAniHdr*)pBuf;
4118 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
4119 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
4120 wmsg->length = FTM_SWAP16(wmsg->length);
4121 pBuf += sizeof(tAniHdr);
4122
4123 /*Get the global context */
4124 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4125
4126 /*Get the Hdd Context */
4127 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
4128 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
4129
4130 /* EfS command Code */
4131 *(v_U32_t*)pBuf = 0x000000EF;
4132
4133 pBuf += sizeof(v_U32_t);
4134
4135 memcpy(pBuf, pData,data_len);
4136
4137 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
4138 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
4139
4140 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!\n"));
4141 vos_mem_free((v_VOID_t*)wmsg);
4142 return VOS_STATUS_E_FAILURE;
4143 }
4144 }
4145 else {
4146 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
4147
4148 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!\n"));
4149 vos_mem_free((v_VOID_t*)wmsg);
4150 return VOS_STATUS_E_FAILURE;
4151 }
4152 }
4153
4154 vos_mem_free((v_VOID_t*)wmsg);
4155#endif //FTM and ANDROID
4156
4157 return VOS_STATUS_SUCCESS;
4158}
4159
Jeff Johnson295189b2012-06-20 16:38:30 -07004160/* action sub-ioctls */
4161static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
4162 union iwreq_data *wrqu, char *extra)
4163{
4164 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004165 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004166
4167 switch (sub_cmd)
4168 {
4169 case WE_SET_NV_DEFAULTS:
4170 {
4171 v_U8_t *pu8buf,*pTempBuf;
4172 v_U16_t size;
4173 size = sizeof(v_U32_t) + sizeof(sHalNv);
4174 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d\n",size);
4175 pu8buf = vos_mem_malloc(size);
4176 if(pu8buf == NULL)
4177 {
4178 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
4179 return VOS_STATUS_E_NOMEM;
4180 }
4181 memset(pu8buf,0,size);
4182 pTempBuf = pu8buf;
4183 pTempBuf += sizeof(v_U32_t);
4184 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
4185
4186 wlan_write_to_efs(pu8buf,size);
4187 vos_mem_free(pu8buf);
4188 }
4189
4190 default:
4191 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004192 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004193 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
4194 break;
4195 }
4196 }
4197
4198 return ret;
4199}
4200
Jeff Johnson295189b2012-06-20 16:38:30 -07004201static const iw_handler we_ftm_private[] = {
4202
4203 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
4204 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
4205 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
4206 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
4207 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07004208};
4209
4210/*Maximum command length can be only 15 */
4211static const struct iw_priv_args we_ftm_private_args[] = {
4212
4213 /* handlers for main ioctl */
4214 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
4215 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4216 0,
4217 "" },
4218
4219 { WE_FTM_ON_OFF,
4220 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4221 0,
4222 "ftm" },
4223
4224 { WE_TX_PKT_GEN,
4225 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4226 0,
4227 "tx" },
4228
4229 { WE_SET_TX_IFS,
4230 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4231 0,
4232 "set_txifs" },
4233
4234 { WE_SET_TX_PKT_CNT,
4235 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4236 0,
4237 "set_txpktcnt" },
4238
4239 { WE_SET_TX_PKT_LEN,
4240 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4241 0,
4242 "set_txpktlen" },
4243
4244 { WE_SET_CHANNEL,
4245 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4246 0,
4247 "set_channel" },
4248
4249 { WE_SET_TX_POWER,
4250 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4251 0,
4252 "set_txpower" },
4253
4254 { WE_CLEAR_RX_PKT_CNT,
4255 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4256 0,
4257 "clr_rxpktcnt" },
4258
4259 { WE_RX,
4260 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4261 0,
4262 "rx" },
4263
4264 { WE_ENABLE_CHAIN,
4265 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4266 0,
4267 "ena_chain" },
4268
4269 /* handlers for main ioctl */
4270 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
4271 0,
4272 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4273 "" },
4274
4275 { WE_GET_CHANNEL,
4276 0,
4277 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4278 "get_channel" },
4279
4280 { WE_GET_TX_POWER,
4281 0,
4282 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4283 "get_txpower" },
4284
4285 { WE_GET_RX_PKT_CNT,
4286 0,
4287 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4288 "get_rxpktcnt" },
4289
4290 /* handlers for main ioctl */
4291 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
4292 IW_PRIV_TYPE_CHAR| 512,
4293 0,
4294 "" },
4295
4296 { WE_SET_MAC_ADDRESS,
4297 IW_PRIV_TYPE_CHAR| 512,
4298 0,
4299 "set_mac_address" },
4300
4301 { WE_SET_TX_RATE,
4302 IW_PRIV_TYPE_CHAR | 512,
4303 0,
4304 "set_txrate" },
4305
4306 /* handlers for main ioctl */
4307 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
4308 0,
4309 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4310 "" },
4311
4312 { WE_GET_MAC_ADDRESS,
4313 0,
4314 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4315 "get_mac_address" },
4316
4317 { WE_GET_FTM_VERSION,
4318 0,
4319 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4320 "ftm_version" },
4321
4322 { WE_GET_TX_RATE,
4323 0,
4324 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4325 "get_txrate" },
4326
4327 { WE_GET_FTM_STATUS,
4328 0,
4329 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4330 "get_status" },
4331
4332 { WE_GET_RX_RSSI,
4333 0,
4334 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4335 "get_rx_rssi" },
4336
Jeff Johnson295189b2012-06-20 16:38:30 -07004337 /* handlers for main ioctl */
4338 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
4339 0,
4340 0,
4341 "" },
4342
4343 /* handlers for sub-ioctl */
4344 { WE_SET_NV_DEFAULTS,
4345 0,
4346 0,
4347 "set_nv_defaults" },
4348
4349};
4350
4351const struct iw_handler_def we_ftm_handler_def = {
4352 .num_standard = 0,
4353 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
4354 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
4355
4356 .standard = (iw_handler *)NULL,
4357 .private = (iw_handler *)we_ftm_private,
4358 .private_args = we_ftm_private_args,
4359 .get_wireless_stats = NULL,
4360};
4361
4362static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
4363{
4364
4365 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4366
4367 // Zero the memory. This zeros the profile structure.
4368 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
4369
4370 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
4371
4372 return 0;
4373}
4374
Jeff Johnson295189b2012-06-20 16:38:30 -07004375
4376VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
4377{
Jeff Johnson295189b2012-06-20 16:38:30 -07004378 ftm_rsp_msg_t *pFtmMsgRsp;
4379
4380 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
4381 hdd_context_t *pHddCtx;
4382 v_CONTEXT_t pVosContext= NULL;
4383
4384 ENTER();
4385
4386 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
4387
4388 if (!message )
4389 {
4390 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
4391 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
4392 return VOS_STATUS_E_INVAL;
4393 }
4394 /*Get the global context */
4395 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4396
4397 /*Get the Hdd Context */
4398 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
4399
4400 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
4401
4402 complete(&pHddCtx->ftm.ftm_comp_var);
4403 }
4404 else {
4405 /*Response length to Ptt App*/
4406 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
4407
4408 /*Ptt App expects the response length in LE */
4409 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
4410
4411 /*Response expects the length to be in */
4412 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
4413 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
4414
4415 /*Copy the message*/
4416 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
4417
4418 /*Update the error code*/
4419 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
4420
4421 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
4422
4423 if (!VOS_IS_STATUS_SUCCESS(vos_status))
4424 {
4425 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!\n"));
4426 return VOS_STATUS_E_FAILURE;
4427 }
4428 }
4429 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 return VOS_STATUS_SUCCESS;
4431
4432}