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