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