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