blob: 25867048da69e5ddc57761ab7632638d372330df [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
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530156#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
157
Jeff Johnson295189b2012-06-20 16:38:30 -0700158typedef struct {
159 tANI_U32 tableSize; /* Whole NV Table Size */
160 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
161 eNvTable nvTable;
162 tANI_U8 tableData; /* Filled by host driver */
163} pttGetNvTable;
164
165typedef struct {
166 tANI_U32 tableSize; /* Whole NV Table Size */
167 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
168 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700169 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700170} pttSetNvTable;
171
Jeff Johnson295189b2012-06-20 16:38:30 -0700172
173extern const sHalNv nvDefaults;
174static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700175static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700176VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700177
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700178/* 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 -0700179 Since it is associated to agc.channel_freq register for mapping.
180 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
181*/
182static const freq_chan_t freq_chan_tbl[] = {
183 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
184 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
185};
186
187static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
188{
189 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
190 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
191 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
192 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
193 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
194 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
195 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
196 //Spica_Virgo 11A 20MHz Rates
197 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
198 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
199 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
200 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
201 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
202 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
203 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
204 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
205
206//MCS Index #0-15 (20MHz)
207 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
208 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
209 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
210 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
211 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
212 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
213 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
214 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530215 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_72_2_MBPS"},
216
217//MCS Index #8-15 (40MHz)
218
219 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_B_MBPS" },
220 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
221 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
222 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
223 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
224 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
225 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
226 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
227 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
228 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
229 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
230 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
231 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
232 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
233 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800234 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530235
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800236#ifdef WLAN_FEATURE_11AC
237 /*11AC rate 20MHZ Normal GI*/
238 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
239 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
240 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
241 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
242 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
243 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
244 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
245 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
246 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
247 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
248
249 /*11AC rate 20MHZ Short GI*/
250 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
251 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
252 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
253 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
254 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
255 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
256 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
257 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
258 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
259 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
260
261 /*11AC rates 40MHZ normal GI*/
262 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
263 "MCS_VHT40_NGI_CB_13_5_MBPS"},
264 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
265 "MCS_VHT40_NGI_CB_27_MBPS"},
266 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
267 "MCS_VHT40_NGI_CB_40_5_MBPS"},
268 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
269 "MCS_VHT40_NGI_CB_54_MBPS"},
270 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
271 "MCS_VHT40_NGI_CB_81_MBPS"},
272 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
273 "MCS_VHT40_NGI_CB_108_MBPS"},
274 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
275 "MCS_VHT40_NGI_CB_121_5_MBPS"},
276 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
277 "MCS_VHT40_NGI_CB_135_MBPS"},
278 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
279 "MCS_VHT40_NGI_CB_162_MBPS"},
280 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
281 "MCS_VHT40_NGI_CB_180_MBPS"},
282
283 /*11AC rates 40MHZ short GI*/
284 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
285 "MCS_VHT40_SGI_CB_15_MBPS"},
286 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
287 "MCS_VHT40_SGI_CB_30_MBPS"},
288 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
289 "MCS_VHT40_SGI_CB_45_MBPS"},
290 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
291 "MCS_VHT40_SGI_CB_60_MBPS"},
292 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
293 "MCS_VHT40_SGI_CB_90_MBPS"},
294 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
295 "MCS_VHT40_SGI_CB_120_MBPS"},
296 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
297 "MCS_VHT40_SGI_CB_135_MBPS"},
298 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
299 "MCS_VHT40_SGI_CB_150_MBPS"},
300 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
301 "MCS_VHT40_SGI_CB_180_MBPS"},
302 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
303 "MCS_VHT40_SGI_CB_200_MBPS"},
304
305 /*11AC rates 80 MHZ normal GI*/
306 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
307 "MCS_VHT80_NGI_CB_29_3_MBPS"},
308 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
309 "MCS_VHT80_NGI_CB_58_5_MBPS"},
310 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
311 "MCS_VHT80_NGI_CB_87_8_MBPS"},
312 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
313 "MCS_VHT80_NGI_CB_117_MBPS"},
314 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
315 "MCS_VHT80_NGI_CB_175_5_MBPS"},
316 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
317 "MCS_VHT80_NGI_CB_234_MBPS"},
318 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
319 "MCS_VHT80_NGI_CB_263_3_MBPS"},
320 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
321 "MCS_VHT80_NGI_CB_292_5_MBPS"},
322 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
323 "MCS_VHT80_NGI_CB_351_MBPS"},
324 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
325 "MCS_VHT80_NGI_CB_390_MBPS"},
326
327 /*11AC rates 80 MHZ short GI*/
328 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
329 "MCS_VHT80_SGI_CB_32_5_MBPS"},
330 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
331 "MCS_VHT80_SGI_CB_65_MBPS"},
332 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
333 "MCS_VHT80_SGI_CB_97_5_MBPS"},
334 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
335 "MCS_VHT80_SGI_CB_130_MBPS"},
336 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
337 "MCS_VHT80_SGI_CB_195_MBPS"},
338 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
339 "MCS_VHT80_SGI_CB_260_MBPS"},
340 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
341 "MCS_VHT80_SGI_CB_292_5_MBPS"},
342 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
343 "MCS_VHT80_SGI_CB_325_MBPS"},
344 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
345 "MCS_VHT80_SGI_CB_390_MBPS"},
346 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
347 "MCS_VHT80_SGI_CB_433_3_MBPS"},
348#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700349};
350
351static rateIndex2Preamble_t rate_index_2_preamble_table[] =
352{
353
354 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
355 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
356 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
357 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
358 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
359 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
360 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
361
Jeff Johnson295189b2012-06-20 16:38:30 -0700362
363 //Spica_Virgo 11A 20MHz Rates
364 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
365 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
366 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
367 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
368 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
369 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
370 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
371 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
372
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530373 // 11A 20MHz Rates
374 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
375 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
376 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
377 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
378 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
379 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
380 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
381 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
382
Jeff Johnson295189b2012-06-20 16:38:30 -0700383 //MCS Index #0-15 (20MHz)
384 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
385 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
386 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
387 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
388 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
389 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
390 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
391 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
392 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
393 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
394 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
395 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
396 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
397 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
398 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
399 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530400
401 //MCS index (40MHz)
402 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
409 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
410 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
411 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
412 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
413 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800417 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530418
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800419#ifdef WLAN_FEATURE_11AC
420 /*11AC rate 20MHZ Normal GI*/
421 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
422 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
423 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
424 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
425 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
426 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
431
432 /*11AC rate 20MHZ Short GI*/
433 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
435 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
436 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
437 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
438 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
439 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
440 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
443
444 /*11AC rates 40MHZ normal GI*/
445 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
450 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
451 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
452 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
455
456 /*11AC rates 40MHZ short GI*/
457 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
458 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
459 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
462 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
463 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
464 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
465 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
466 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
467
468 /*11AC rates 80 MHZ normal GI*/
469 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
470 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
471 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
472 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
473 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
474 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
475 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
476 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
477 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
478 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
479
480 /*11AC rates 80 MHZ short GI*/
481 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
482 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
483 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
484 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
485 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
486 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
487 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
488 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
489 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
490 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
491#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700492};
493
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530494static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
495 11, 12, 13, 14, 36, 40, 44, 48,
496 52, 56, 60, 64, 100, 104, 108,
497 112, 116, 120, 124, 128, 132,
498 136, 140, 149, 153, 157, 161,
499 165, 208, 212, 216, 240, 244,
500 248, 252, 0 };
501static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
502 42, 46, 50, 54, 58, 62, 102, 106,
503 110, 114, 118, 122, 126, 130, 134,
504 138, 151, 155, 159, 163, 210, 214,
505 242, 246, 250, 0 };
506static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
507 114, 118, 122, 126, 130, 134, 155,
508 159, 246, 0 };
509
Jeff Johnson295189b2012-06-20 16:38:30 -0700510typedef struct
511{
512 tANI_BOOLEAN frameGenEnabled;
513 tANI_BOOLEAN wfmEnabled;
514 sPttFrameGenParams frameParams;
515 v_U16_t txpower;
516 v_U16_t rxmode;
517 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530518 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700519
520} FTM_STATUS ;
521static FTM_STATUS ftm_status;
522
523//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530524static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700525
526static void _ftm_status_init(void)
527{
528 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
529 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
530 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
531
532 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
533 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
534 ftm_status.frameParams.numTestPackets = 0; //Continuous
535 ftm_status.frameParams.interFrameSpace = 10;
536 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
537 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
538 ftm_status.frameParams.payloadLength = 2000;
539 ftm_status.frameParams.payloadFillByte = 0xA5;
540 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
541 ftm_status.frameParams.tx_mode = 0;
542 ftm_status.frameParams.crc = 0;
543 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
544 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
545 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
546 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
547 ftm_status.txpower = 2 ;
548 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
549 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530550 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700551
552 return;
553}
554
555/**---------------------------------------------------------------------------
556
557 \brief wlan_ftm_postmsg() -
558
559 The function used for sending the command to the halphy.
560
561 \param - cmd_ptr - Pointer command buffer.
562
563 \param - cmd_len - Command length.
564
565 \return - 0 for success, non zero for failure
566
567 --------------------------------------------------------------------------*/
568
569static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
570{
571 vos_msg_t *ftmReqMsg;
572 vos_msg_t ftmMsg;
573 ENTER();
574
575 ftmReqMsg = (vos_msg_t *) cmd_ptr;
576
Jeff Johnson295189b2012-06-20 16:38:30 -0700577 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700578 ftmMsg.reserved = 0;
579 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
580 ftmMsg.bodyval = 0;
581
582 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700583 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700584 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700585 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800586 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700587
588 return VOS_STATUS_E_FAILURE;
589 }
590
591 EXIT();
592 return VOS_STATUS_SUCCESS;
593}
594
595/*---------------------------------------------------------------------------
596
597 \brief wlan_ftm_vos_open() - Open the vOSS Module
598
599 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
600 Upon successful initialization:
601
602 - All VOS submodules should have been initialized
603
604 - The VOS scheduler should have opened
605
606 - All the WLAN SW components should have been opened. This include
607 MAC.
608
609
610 \param hddContextSize: Size of the HDD context to allocate.
611
612
613 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
614 is ready to be used.
615
616 VOS_STATUS_E_RESOURCES - System resources (other than memory)
617 are unavailable to initialize the scheduler
618
619
620 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
621
622 \sa wlan_ftm_vos_open()
623
624---------------------------------------------------------------------------*/
625static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_SIZE_t hddContextSize )
626{
627 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
628 int iter = 0;
629 tSirRetStatus sirStatus = eSIR_SUCCESS;
630 tMacOpenParameters macOpenParms;
631 pVosContextType gpVosContext = (pVosContextType)pVosContext;
632
633 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
634 "%s: Opening VOSS", __func__);
635
636 if (NULL == gpVosContext)
637 {
638 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
639 "%s: Trying to open VOSS without a PreOpen",__func__);
640 VOS_ASSERT(0);
641 return VOS_STATUS_E_FAILURE;
642 }
643
644 /* Initialize the probe event */
645 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
646 {
647 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
648 "%s: Unable to init probeEvent",__func__);
649 VOS_ASSERT(0);
650 return VOS_STATUS_E_FAILURE;
651 }
652
Jeff Johnson295189b2012-06-20 16:38:30 -0700653 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
654 {
655 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
656 "%s: Unable to init wdaCompleteEvent",__func__);
657 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700658
Jeff Johnson295189b2012-06-20 16:38:30 -0700659 goto err_probe_event;
660 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700661
662 /* Initialize the free message queue */
663 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
664 if (! VOS_IS_STATUS_SUCCESS(vStatus))
665 {
666
667 /* Critical Error ... Cannot proceed further */
668 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
669 "%s: Failed to initialize VOS free message queue",__func__);
670 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700671 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700672 }
673
674 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
675 {
676 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
677 &(gpVosContext->aMsgBuffers[iter]);
678 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
679 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
680 }
681
682 /* Now Open the VOS Scheduler */
683 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
684 sizeof(VosSchedContext));
685
686 if (!VOS_IS_STATUS_SUCCESS(vStatus))
687 {
688 /* Critical Error ... Cannot proceed further */
689 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
690 "%s: Failed to open VOS Scheduler", __func__);
691 VOS_ASSERT(0);
692 goto err_msg_queue;
693 }
694
695 /* Open the SYS module */
696 vStatus = sysOpen(gpVosContext);
697
698 if (!VOS_IS_STATUS_SUCCESS(vStatus))
699 {
700 /* Critical Error ... Cannot proceed further */
701 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
702 "%s: Failed to open SYS module",__func__);
703 VOS_ASSERT(0);
704 goto err_sched_close;
705 }
706
Jeff Johnson295189b2012-06-20 16:38:30 -0700707 /*Open the WDA module */
708 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
709 macOpenParms.driverType = eDRIVER_TYPE_MFG;
710 vStatus = WDA_open(gpVosContext, gpVosContext->pHDDContext, &macOpenParms);
711 if (!VOS_IS_STATUS_SUCCESS(vStatus))
712 {
713 /* Critical Error ... Cannot proceed further */
714 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
715 "%s: Failed to open WDA module",__func__);
716 VOS_ASSERT(0);
717 goto err_sys_close;
718 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700719
720 /* initialize the NV module */
721 vStatus = vos_nv_open();
722 if (!VOS_IS_STATUS_SUCCESS(vStatus))
723 {
724 // NV module cannot be initialized, however the driver is allowed
725 // to proceed
726 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
727 "%s: Failed to initialize the NV module", __func__);
728 goto err_wda_close;
729 }
730
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700731 vStatus = vos_nv_get_dictionary_data();
732
733 if (!VOS_IS_STATUS_SUCCESS(vStatus))
734 {
735 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
736 "%s : failed to get dictionary data for NV", __func__);
737 goto err_wda_close;
738 }
739
Jeff Johnson295189b2012-06-20 16:38:30 -0700740 /* If we arrive here, both threads dispacthing messages correctly */
741
742 /* Now proceed to open the MAC */
743
744 /* UMA is supported in hardware for performing the
745 frame translation 802.11 <-> 802.3 */
746 macOpenParms.frameTransRequired = 1;
747 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
748 &macOpenParms);
749
750 if (eSIR_SUCCESS != sirStatus)
751 {
752 /* Critical Error ... Cannot proceed further */
753 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
754 "%s: Failed to open MAC", __func__);
755 VOS_ASSERT(0);
756 goto err_nv_close;
757 }
758
Jeff Johnson295189b2012-06-20 16:38:30 -0700759 /* Now proceed to open the SME */
760 vStatus = sme_Open(gpVosContext->pMACContext);
761 if (!VOS_IS_STATUS_SUCCESS(vStatus))
762 {
763 /* Critical Error ... Cannot proceed further */
764 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
765 "%s: Failed to open SME",__func__);
766 goto err_mac_close;
767 }
768 return VOS_STATUS_SUCCESS;
769
Jeff Johnson295189b2012-06-20 16:38:30 -0700770
771 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
772 "%s: VOSS successfully Opened",__func__);
773
774 return VOS_STATUS_SUCCESS;
775err_mac_close:
776 macClose(gpVosContext->pMACContext);
777
778err_nv_close:
779 vos_nv_close();
780
781err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700782 WDA_close(gpVosContext);
783
784err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700785 sysClose(gpVosContext);
786
787err_sched_close:
788 vos_sched_close(gpVosContext);
789err_msg_queue:
790 vos_mq_deinit(&gpVosContext->freeVosMq);
791
Jeff Johnson295189b2012-06-20 16:38:30 -0700792err_wda_complete_event:
793 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700794
795err_probe_event:
796 vos_event_destroy(&gpVosContext->ProbeEvent);
797
798 return VOS_STATUS_E_FAILURE;
799
800} /* wlan_ftm_vos_open() */
801
802/*---------------------------------------------------------------------------
803
804 \brief wlan_ftm_vos_close() - Close the vOSS Module
805
806 The \a wlan_ftm_vos_close() function closes the vOSS Module
807
808 \param vosContext context of vos
809
810 \return VOS_STATUS_SUCCESS - successfully closed
811
812 \sa wlan_ftm_vos_close()
813
814---------------------------------------------------------------------------*/
815
816static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
817{
818 VOS_STATUS vosStatus;
819 pVosContextType gpVosContext = (pVosContextType)vosContext;
820
Jeff Johnson295189b2012-06-20 16:38:30 -0700821 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
822 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
823 {
824 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
825 "%s: Failed to close BAL",__func__);
826 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
827 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700828
829 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
830 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
831 {
832 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
833 "%s: Failed to close MAC",__func__);
834 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
835 }
836
837 ((pVosContextType)vosContext)->pMACContext = NULL;
838
839 vosStatus = vos_nv_close();
840 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
841 {
842 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
843 "%s: Failed to close NV",__func__);
844 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
845 }
846
847
848 vosStatus = sysClose( vosContext );
849 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
850 {
851 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
852 "%s: Failed to close SYS",__func__);
853 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
854 }
855
Jeff Johnson295189b2012-06-20 16:38:30 -0700856 vosStatus = WDA_close( vosContext );
857 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
858 {
859 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
860 "%s: Failed to close WDA",__func__);
861 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
862 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700863
864 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
865
866 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
867 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
868 {
869 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
870 "%s: Failed to destroy ProbeEvent",__func__);
871 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
872 }
873
Jeff Johnson295189b2012-06-20 16:38:30 -0700874 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
875 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
876 {
877 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
878 "%s: Failed to destroy wdaCompleteEvent",__func__);
879 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
880 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700881
882 return VOS_STATUS_SUCCESS;
883}
884
885/**---------------------------------------------------------------------------
886
887 \brief wlan_ftm_priv_set_txifs() -
888
889 This function is used for
890
891 \param - pAdapter - Pointer HDD Context.
892 - ifs
893
894 \return - 0 for success, non zero for failure
895
896 --------------------------------------------------------------------------*/
897
898
899
900static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
901{
902 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
903 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
904 {
905 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
906 return VOS_STATUS_E_FAILURE;
907 }
908
909 /* do not allow to change setting when tx pktgen is enabled */
910 if (ftm_status.frameGenEnabled)
911 {
912 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
913 return VOS_STATUS_E_FAILURE;
914 }
915
916 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
917 {
918 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:ifs value is invalid ",__func__);
919 return VOS_STATUS_E_FAILURE;
920 }
921
922 ftm_status.frameParams.interFrameSpace = ifs;
923
924 return VOS_STATUS_SUCCESS;
925}
926
927/**---------------------------------------------------------------------------
928
929 \brief wlan_ftm_priv_set_txpktcnt() -
930
931 This function is used for
932
933 \param - pAdapter - Pointer HDD Context.
934 - ifs
935
936 \return - 0 for success, non zero for failure
937
938 --------------------------------------------------------------------------*/
939
940static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
941{
942 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
943 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
944 {
945 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
946 return VOS_STATUS_E_FAILURE;
947 }
948
949 /* do not allow to change setting when tx pktgen is enabled */
950 if (ftm_status.frameGenEnabled)
951 {
952 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
953 return VOS_STATUS_E_FAILURE;
954 }
955
956 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
957 {
958 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pktcnt value is invalid",__func__);
959 return VOS_STATUS_E_FAILURE;
960 }
961
962 ftm_status.frameParams.numTestPackets = cnt;
963
964 return VOS_STATUS_SUCCESS;
965}
966
967static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
968{
969 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
970 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
971 {
972 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
973 return VOS_STATUS_E_FAILURE;
974 }
975
976 /* do not allow to change setting when tx pktgen is enabled */
977 if (ftm_status.frameGenEnabled)
978 {
979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
980 return VOS_STATUS_E_FAILURE;
981 }
982
983 if (len > 4095) //4096
984 {
985 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:payload len is invalid",__func__);
986 return VOS_STATUS_E_FAILURE;
987 }
988
989 ftm_status.frameParams.payloadLength = (tANI_U16)len;
990
991 return VOS_STATUS_SUCCESS;
992}
993
Jeff Johnson295189b2012-06-20 16:38:30 -0700994
995static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
996{
Jeff Johnson295189b2012-06-20 16:38:30 -0700997 uPttMsgs *pMsgBody;
998 VOS_STATUS status;
999 v_U16_t chainSelect_save = chainSelect;
1000 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1001
1002 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1003 {
1004 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1005 return VOS_STATUS_E_FAILURE;
1006 }
1007
1008 if (chainSelect > FTM_CHAIN_SEL_MAX)
1009 {
1010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid chain",__func__);
1011 return VOS_STATUS_E_FAILURE;
1012 }
1013
1014 /* do not allow to change setting when tx pktgen is enabled */
1015 if (ftm_status.frameGenEnabled)
1016 {
1017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1018 return VOS_STATUS_E_FAILURE;
1019 }
1020
1021 switch (chainSelect)
1022 {
1023 case FTM_CHAIN_SEL_NO_RX_TX:
1024 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1025 break;
1026
1027 case FTM_CHAIN_SEL_R0_ON:
1028 chainSelect = PHY_CHAIN_SEL_R0_ON;
1029 break;
1030
1031 case FTM_CHAIN_SEL_T0_ON:
1032 chainSelect = PHY_CHAIN_SEL_T0_ON;
1033 break;
1034 }
1035
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301036 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001037 init_completion(&pHddCtx->ftm.ftm_comp_var);
1038 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1039 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1040
1041 pMsgBody = &pMsgBuf->msgBody;
1042 pMsgBody->EnableChains.chainSelect = chainSelect;
1043
1044 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1045
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301046 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001047 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301048 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1049 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001050 status = VOS_STATUS_E_FAILURE;
1051 goto done;
1052 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301053 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1054 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07001055
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301056 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001057 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301058 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1059 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001060 status = VOS_STATUS_E_FAILURE;
1061 goto done;
1062 }
1063 ftm_status.chainSelect = chainSelect_save;
1064done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001065
1066 return status;
1067}
1068
1069/**---------------------------------------------------------------------------
1070 --------------------------------------------------------------------------*/
1071static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1072{
1073 int ii;
1074 int lenBuf = WE_FTM_MAX_STR_LEN;
1075 int lenRes = 0;
1076 char *chain[] = {
1077 "None",
1078 "R0,R1",
1079 "R0",
1080 "R1",
1081 "T0",
1082 "R0,R1,T0"
1083 };
1084 char *rx[] = {
1085 "disable",
1086 "11b/g/n",
1087 "11g/n",
1088 "11b"
1089 };
1090 char *tx[] = {
1091 "stopped",
1092 "started",
1093 };
1094 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1095
1096 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1097 {
1098 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1099 return VOS_STATUS_E_FAILURE;
1100 }
1101
1102 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001103 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001104 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1105 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001106 ftm_status.frameParams.interFrameSpace);
1107 if ((lenRes < 0) || (lenRes >= lenBuf))
1108 {
1109 return VOS_STATUS_E_FAILURE;
1110 }
1111
1112 buf += lenRes;
1113 lenBuf -= lenRes;
1114
1115 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1116 {
1117 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1118 break;
1119 }
1120
1121 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1122 {
1123 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1124 }
1125 else
1126 {
1127 lenRes = strlcpy(buf, "invalid", lenBuf);
1128 }
1129 if ((lenRes < 0) || (lenRes >= lenBuf))
1130 {
1131 return VOS_STATUS_E_FAILURE;
1132 }
1133
1134 buf += lenRes;
1135 lenBuf -= lenRes;
1136
Jeff Johnson02797792013-10-26 19:17:13 -07001137 lenRes = snprintf(buf, lenBuf, "\n txpower: %d\n txpktcnt: %d\n "
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001138 "txpktlen: %d\n", ftm_status.txpower,
1139 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001140 ftm_status.frameParams.payloadLength);
1141
1142 if ((lenRes < 0) || (lenRes >= lenBuf))
1143 {
1144 return VOS_STATUS_E_FAILURE;
1145 }
1146
1147 return VOS_STATUS_SUCCESS;
1148}
1149
Jeff Johnson295189b2012-06-20 16:38:30 -07001150
1151void HEXDUMP(char *s0, char *s1, int len)
1152{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301153 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001154 printk(KERN_EMERG "%s\n :", s0);
1155
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301156 if (len > 8)
1157 {
1158 for (j = 0; j < len/8; j++)
1159 {
1160 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1161 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1162 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1163 }
1164 len = len - j*8;
1165 }
1166 for (i = 0; i< len; i++) {
1167 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001168 }
1169 printk("\n");
1170}
1171
Jeff Johnson295189b2012-06-20 16:38:30 -07001172/*---------------------------------------------------------------------------
1173
1174 \brief vos_ftm_preStart() -
1175
1176 The \a vos_ftm_preStart() function to download CFG.
1177 including:
1178 - ccmStart
1179
1180 - WDA: triggers the CFG download
1181
1182
1183 \param pVosContext: The VOS context
1184
1185
1186 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1187 is ready to be used.
1188
1189 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1190 are unavailable to initialize the scheduler
1191
1192
1193 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1194
1195 \sa vos_start
1196
1197---------------------------------------------------------------------------*/
1198VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1199{
1200 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1201 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001202
Jeff Johnson295189b2012-06-20 16:38:30 -07001203 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1204 "vos prestart");
1205
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001206 if (NULL == pVosContext->pWDAContext)
1207 {
1208 VOS_ASSERT(0);
1209 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1210 "%s: WDA NULL context", __func__);
1211 return VOS_STATUS_E_FAILURE;
1212 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001213
1214 /* call macPreStart */
1215 vStatus = macPreStart(pVosContext->pMACContext);
1216 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1217 {
1218 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1219 "Failed at macPreStart ");
1220 return VOS_STATUS_E_FAILURE;
1221 }
1222
1223 /* call ccmStart */
1224 ccmStart(pVosContext->pMACContext);
1225
1226 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001227 vos_event_reset(&pVosContext->wdaCompleteEvent);
1228
Jeff Johnson295189b2012-06-20 16:38:30 -07001229
1230 /*call WDA pre start*/
1231 vStatus = WDA_preStart(pVosContext);
1232 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1233 {
1234 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1235 "Failed to WDA prestart ");
1236 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1237 ccmStop(pVosContext->pMACContext);
1238 VOS_ASSERT(0);
1239 return VOS_STATUS_E_FAILURE;
1240 }
1241
1242 /* Need to update time out of complete */
1243 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1244 if ( vStatus != VOS_STATUS_SUCCESS )
1245 {
1246 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1247 {
1248 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001249 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 }
1251 else
1252 {
1253 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001254 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001255 }
1256 VOS_ASSERT( 0 );
1257 return VOS_STATUS_E_FAILURE;
1258 }
1259
1260 return VOS_STATUS_SUCCESS;
1261}
Jeff Johnson295189b2012-06-20 16:38:30 -07001262
1263/**---------------------------------------------------------------------------
1264
1265 \brief wlan_hdd_ftm_open() -
1266
1267 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1268
1269 \param - pAdapter - Pointer HDD Context.
1270
1271 \return - 0 for success, non zero for failure
1272
1273 --------------------------------------------------------------------------*/
1274
1275int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1276{
1277 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1278 pVosContextType pVosContext= NULL;
1279 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001280
Jeff Johnson295189b2012-06-20 16:38:30 -07001281 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1282 "%s: Opening VOSS", __func__);
1283
1284 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1285
1286 if (NULL == pVosContext)
1287 {
1288 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301289 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001290 VOS_ASSERT(0);
1291 goto err_vos_status_failure;
1292 }
1293
1294 // Open VOSS
1295 vStatus = wlan_ftm_vos_open( pVosContext, 0);
1296
1297 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1298 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301299 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001300 goto err_vos_status_failure;
1301 }
1302
Jeff Johnson295189b2012-06-20 16:38:30 -07001303 /*
1304 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1305 */
1306 /* Save the hal context in Adapter */
1307 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001308
1309 if ( NULL == pHddCtx->hHal )
1310 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301311 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001312 goto err_sal_close;
1313 }
1314
1315 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1316 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1317 if( NULL == pAdapter )
1318 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301319 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001320 goto err_adapter_open_failure;
1321 }
1322
1323 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1324 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301325 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001326 goto err_sal_close;
1327 }
1328
1329 //Initialize the nlink service
1330 if(nl_srv_init() != 0)
1331 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301332 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001333 goto err_ftm_register_wext_close;
1334 }
1335
Leo Chang9e646082013-08-02 11:20:21 -07001336#ifdef WLAN_KD_READY_NOTIFIER
1337 pHddCtx->kd_nl_init = 1;
1338#endif /* WLAN_KD_READY_NOTIFIER */
1339
Jeff Johnson295189b2012-06-20 16:38:30 -07001340#ifdef PTT_SOCK_SVC_ENABLE
1341 //Initialize the PTT service
1342 if(ptt_sock_activate_svc(pHddCtx) != 0)
1343 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301344 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001345 goto err_nl_srv_init;
1346 }
1347#endif
1348 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1349 {
1350 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1351 goto err_nl_srv_init;
1352 }
1353#ifdef HDD_SESSIONIZE
1354 //Turn off carrier state
1355 netif_carrier_off(pAdapter->dev);
1356
1357 //Stop the Interface TX queue. Just being safe
1358 netif_tx_disable(pAdapter->dev);
1359#endif
1360
Jeff Johnson295189b2012-06-20 16:38:30 -07001361 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1362 pHddCtx->ftm.targetNVTableSize = 0;
1363 pHddCtx->ftm.targetNVTablePointer = NULL;
1364 pHddCtx->ftm.processedNVTableSize = 0;
1365 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1366 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1367 {
1368 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301369 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001370 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001371 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001372 }
1373 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001374
1375 _ftm_status_init();
1376 /* Initialize the ftm vos event */
1377 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1378 {
1379 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301380 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001381 VOS_ASSERT(0);
1382 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1383 goto err_nl_srv_init;
1384 }
1385
1386 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1387
1388 return VOS_STATUS_SUCCESS;
1389
1390err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001391#ifdef WLAN_KD_READY_NOTIFIER
1392nl_srv_exit(pHddCtx->ptt_pid);
1393#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001394nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001395#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001396err_ftm_register_wext_close:
1397hdd_UnregisterWext(pAdapter->dev);
1398
1399err_adapter_open_failure:
1400hdd_close_all_adapters( pHddCtx );
1401
1402err_sal_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001403
1404err_vos_status_failure:
1405
1406 return VOS_STATUS_E_FAILURE;
1407}
1408
1409
1410
1411int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1412{
1413 VOS_STATUS vosStatus;
1414 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1415
1416 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1417 ENTER();
1418 if(pAdapter == NULL)
1419 {
1420 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1421 return VOS_STATUS_E_NOMEM;
1422 }
1423
Leo Chang4e8183f2013-05-31 15:38:34 -07001424 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1425 {
1426 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1427 "%s: Ftm has been started. stopping ftm", __func__);
1428 wlan_ftm_stop(pHddCtx);
1429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001430
1431 //Assert Deep sleep signal now to put Libra HW in lowest power state
1432 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
1433 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1434
1435 //Vote off any PMIC voltage supplies
1436 vos_chipPowerDown(NULL, NULL, NULL);
1437
1438 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1439
Leo Chang59cdc7e2013-07-10 10:08:21 -07001440#ifdef WLAN_KD_READY_NOTIFIER
1441 nl_srv_exit(pHddCtx->ptt_pid);
1442#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001443 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001444#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001445 //TODO----------
1446 //Deregister the device with the kernel
1447 hdd_UnregisterWext(pAdapter->dev);
1448
1449 hdd_close_all_adapters( pHddCtx );
1450#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001451 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001452 {
1453 unregister_netdev(pAdapter->dev);
1454 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1455 }
1456#endif
1457 //-----------------
1458
1459 vosStatus = vos_sched_close( vosContext );
1460 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1461 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1462 "%s: Failed to close VOSS Scheduler",__func__);
1463 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1464 }
1465
1466 //Close VOSS
1467 wlan_ftm_vos_close(vosContext);
1468
1469
1470 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1471 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1472 {
1473 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1474 "%s: Failed to destroy ftm_vos Event",__func__);
1475 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1476 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001477 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001478
1479 //Free up dynamically allocated members inside HDD Adapter
1480 kfree(pHddCtx->cfg_ini);
1481 pHddCtx->cfg_ini= NULL;
1482
1483 return 0;
1484
1485}
1486
1487/**---------------------------------------------------------------------------
1488
1489 \brief wlan_ftm_send_response() -
1490
1491 The function sends the response to the ptt socket application running in user space.
1492
1493 \param - pAdapter - Pointer HDD Context.
1494
1495 \return - 0 for success, non zero for failure
1496
1497 --------------------------------------------------------------------------*/
1498
1499static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1500
1501 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
1502
Arif Hussain6d2a3322013-11-17 19:50:10 -08001503 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001504 return VOS_STATUS_E_FAILURE;
1505 }
1506 return VOS_STATUS_SUCCESS;
1507}
1508
1509/**---------------------------------------------------------------------------
1510
1511 \brief wlan_hdd_ftm_start() -
1512
1513 This function gets called when the FTM start commands received from the ptt socket application and
1514 it starts the following modules.
1515 1) SAL Start.
1516 2) BAL Start.
1517 3) MAC Start to download the firmware.
1518
1519
1520 \param - pAdapter - Pointer HDD Context.
1521
1522 \return - 0 for success, non zero for failure
1523
1524 --------------------------------------------------------------------------*/
1525
1526static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1527{
1528 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1529 tSirRetStatus sirStatus = eSIR_SUCCESS;
1530 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1531 tHalMacStartParameters halStartParams;
1532
1533 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1534 {
1535 return VOS_STATUS_SUCCESS;
1536 }
1537
1538 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1539 "%s: Starting Libra SW", __func__);
1540
1541 /* We support only one instance for now ...*/
1542 if (pVosContext == NULL)
1543 {
1544 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001545 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001546 goto err_status_failure;
1547 }
1548
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001549
Jeff Johnson295189b2012-06-20 16:38:30 -07001550 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001551 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001552 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001553 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001554 goto err_status_failure;
1555 }
1556
Jeff Johnson295189b2012-06-20 16:38:30 -07001557 /*
1558 Prima needs to start the WDA correctly instead of BAL and SAL
1559 */
1560
1561 /* Vos preStart is calling */
1562 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1563 {
1564 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1565 goto err_status_failure;
1566 }
1567
1568
1569 vStatus = WDA_NVDownload_Start(pVosContext);
1570
1571 if ( vStatus != VOS_STATUS_SUCCESS )
1572 {
1573 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1574 "%s: Failed to start NV Download",__func__);
1575 return VOS_STATUS_E_FAILURE;
1576 }
1577
1578 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1579
1580 if ( vStatus != VOS_STATUS_SUCCESS )
1581 {
1582 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1583 {
1584 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001585 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001586 }
1587 else
1588 {
1589 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001590 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001591 }
1592 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301593 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001594 }
1595
1596 vStatus = WDA_start(pVosContext);
1597 if (vStatus != VOS_STATUS_SUCCESS)
1598 {
1599 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1600 "%s: Failed to start WDA",__func__);
1601 goto err_status_failure;
1602 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001603
Jeff Johnson295189b2012-06-20 16:38:30 -07001604
1605 /* Start the MAC */
1606 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1607
Jeff Johnson295189b2012-06-20 16:38:30 -07001608
1609 halStartParams.driverType = eDRIVER_TYPE_MFG;
1610
1611 /* Start the MAC */
1612 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1613
Jeff Johnson295189b2012-06-20 16:38:30 -07001614
1615 if (eSIR_SUCCESS != sirStatus)
1616 {
1617 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1618 "%s: Failed to start MAC", __func__);
1619
Jeff Johnson295189b2012-06-20 16:38:30 -07001620 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001621 }
1622
1623 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1624 "%s: MAC correctly started",__func__);
1625
Jeff Johnson295189b2012-06-20 16:38:30 -07001626
1627 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1628
1629 return VOS_STATUS_SUCCESS;
1630
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001631err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001632 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1633 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1634 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1635 if(vStatus != VOS_STATUS_SUCCESS)
1636 {
1637 if(vStatus == VOS_STATUS_E_TIMEOUT)
1638 {
1639 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001640 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001641
1642 }
1643 else
1644 {
1645 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001646 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001647 }
1648 VOS_ASSERT(0);
1649 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001650
1651err_status_failure:
1652
1653 return VOS_STATUS_E_FAILURE;
1654
1655}
1656
1657
1658static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1659{
1660 VOS_STATUS vosStatus;
1661
1662 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1663 {
1664 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1665 return VOS_STATUS_E_FAILURE;
1666 }
1667
1668 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1669 {
1670 /* STOP MAC only */
1671 v_VOID_t *hHal;
1672 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1673 if (NULL == hHal)
1674 {
1675 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1676 "%s: NULL hHal", __func__);
1677 }
1678 else
1679 {
1680 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1681 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1682 {
1683 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1684 "%s: Failed to stop SYS", __func__);
1685 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1686 }
1687 }
1688
Jeff Johnson295189b2012-06-20 16:38:30 -07001689
Jeff Johnson295189b2012-06-20 16:38:30 -07001690 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001691
1692 }
1693 return WLAN_FTM_SUCCESS;
1694}
1695
Jeff Johnson295189b2012-06-20 16:38:30 -07001696/**---------------------------------------------------------------------------
1697
1698 \brief wlan_hdd_ftm_get_nv_table() -
1699 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001700 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001701
1702 \param - ftmCmd - Pointer FTM Commad Buffer
1703
1704 \return - int
1705 -1, Process Host command fail, vail out
1706 1, Process Host command success
1707
1708 --------------------------------------------------------------------------*/
1709int wlan_hdd_ftm_get_nv_table
1710(
1711 hdd_context_t *pHddCtx,
1712 tPttMsgbuffer *ftmCmd
1713)
1714{
1715 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1716 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1717 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001718 sHalNvV2 *nvContents = NULL;
1719 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001720
Jeff Johnson295189b2012-06-20 16:38:30 -07001721 if (NULL == pHddCtx)
1722 {
1723 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1724 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001725 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001726 }
1727
Leo Chang80de3c22013-11-26 10:52:12 -08001728 nvVersion = vos_nv_getNvVersion();
1729 if (E_NV_V2 != nvVersion)
1730 {
1731 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1732 "%s : Not valid NV Version %d", __func__, nvVersion);
1733 return -EINVAL;
1734 }
1735
Jeff Johnson295189b2012-06-20 16:38:30 -07001736 /* Test first chunk of NV table */
1737 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1738 (0 == pHddCtx->ftm.processedNVTableSize))
1739 {
1740 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1741 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1742 {
1743 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1744 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001745 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001746 }
1747
1748 switch (nvTable->nvTable)
1749 {
1750 case NV_TABLE_RATE_POWER_SETTINGS:
1751 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1752 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1753 break;
1754
1755 case NV_TABLE_REGULATORY_DOMAINS:
1756 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1757 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1758 break;
1759
1760 case NV_TABLE_DEFAULT_COUNTRY:
1761 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1762 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1763 break;
1764
1765 case NV_TABLE_TPC_POWER_TABLE:
1766 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1767 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1768 break;
1769
1770 case NV_TABLE_TPC_PDADC_OFFSETS:
1771 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1772 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1773 break;
1774
1775 case NV_TABLE_VIRTUAL_RATE:
1776 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1777 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1778 break;
1779
1780 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1781 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1782 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1783 break;
1784
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001785 case NV_TABLE_HW_CAL_VALUES:
1786 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1787 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1788 break;
1789
1790 case NV_TABLE_FW_CONFIG:
1791 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1792 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001793 break;
1794
1795 case NV_TABLE_ANTENNA_PATH_LOSS:
1796 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1797 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1798 break;
1799
1800 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1801 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1802 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1803 break;
1804
1805 default:
1806 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1807 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001808 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001809 break;
1810 }
1811
1812 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1813 {
1814 /* Invalid table size, discard and initialize data */
1815 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001816 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001817 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001818 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001819 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1820 pHddCtx->ftm.targetNVTableSize = 0;
1821 pHddCtx->ftm.processedNVTableSize = 0;
1822 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001823 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001824 }
1825
1826 /* Set Current Processing NV table type */
1827 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1828 /* Copy target NV table value into temp context buffer */
1829 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1830 pHddCtx->ftm.targetNVTablePointer,
1831 pHddCtx->ftm.targetNVTableSize);
1832
1833 }
1834
1835 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1836 {
1837 /* Invalid table type */
1838 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1839 "Invalid NV Table, now Processing %d, not %d",
1840 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1841 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1842 pHddCtx->ftm.targetNVTableSize = 0;
1843 pHddCtx->ftm.processedNVTableSize = 0;
1844 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001845
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001846 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001847 }
1848
1849 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001850 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001851 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1852 nvTable->chunkSize);
1853 /* Update processed pointer to prepare next chunk copy */
1854 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1855
1856 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1857 {
1858 /* Finished to process last chunk of data, initialize buffer */
1859 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1860 pHddCtx->ftm.targetNVTableSize = 0;
1861 pHddCtx->ftm.processedNVTableSize = 0;
1862 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1863 }
1864
1865 return 1;
1866}
1867
1868/**---------------------------------------------------------------------------
1869
1870 \brief wlan_hdd_ftm_set_nv_table() -
1871 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08001872 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001873
1874 \param - ftmCmd - Pointer FTM Commad Buffer
1875
1876 \return - int
1877 -1, Process Host command fail, vail out
1878 1, Process Host command success
1879
1880 --------------------------------------------------------------------------*/
1881int wlan_hdd_ftm_set_nv_table
1882(
1883 hdd_context_t *pHddCtx,
1884 tPttMsgbuffer *ftmCmd
1885)
1886{
1887 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1888 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1889 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001890 sHalNvV2 *nvContents = NULL;
1891 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001892
1893 if (NULL == pHddCtx)
1894 {
1895 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1896 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001897 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001898 }
1899
Leo Chang80de3c22013-11-26 10:52:12 -08001900 nvVersion = vos_nv_getNvVersion();
1901 if (E_NV_V2 != nvVersion)
1902 {
1903 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1904 "%s : Not valid NV Version %d", __func__, nvVersion);
1905 return -EINVAL;
1906 }
1907
Jeff Johnson295189b2012-06-20 16:38:30 -07001908 /* Test first chunk of NV table */
1909 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1910 (0 == pHddCtx->ftm.processedNVTableSize))
1911 {
1912 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1913 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1914 {
1915 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1916 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001917 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001918 }
1919
1920 switch (nvTable->nvTable)
1921 {
1922 case NV_TABLE_RATE_POWER_SETTINGS:
1923 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1924 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1925 break;
1926
1927 case NV_TABLE_REGULATORY_DOMAINS:
1928 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1929 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1930 break;
1931
1932 case NV_TABLE_DEFAULT_COUNTRY:
1933 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1934 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1935 break;
1936
1937 case NV_TABLE_TPC_POWER_TABLE:
1938 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1939 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1940 break;
1941
1942 case NV_TABLE_TPC_PDADC_OFFSETS:
1943 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1944 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1945 break;
1946
1947 case NV_TABLE_VIRTUAL_RATE:
1948 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1949 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1950 break;
1951
1952 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1953 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1954 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1955 break;
1956
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001957 case NV_TABLE_HW_CAL_VALUES:
1958 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1959 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1960 break;
1961
1962 case NV_TABLE_FW_CONFIG:
1963 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1964 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001965 break;
1966
1967 case NV_TABLE_ANTENNA_PATH_LOSS:
1968 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1969 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1970 break;
1971
1972 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1973 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1974 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1975 break;
1976
1977 default:
1978 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1979 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001980 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001981 break;
1982 }
1983
1984 /* Set Current Processing NV table type */
1985 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1986 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1987 {
1988 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1989 "Invalid Table Size %d", nvTable->tableSize);
1990 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1991 pHddCtx->ftm.targetNVTableSize = 0;
1992 pHddCtx->ftm.processedNVTableSize = 0;
1993 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001994 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001995 }
1996 }
1997
1998 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1999 {
2000 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2001 "Invalid NV Table, now Processing %d, not %d",
2002 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2003 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2004 pHddCtx->ftm.targetNVTableSize = 0;
2005 pHddCtx->ftm.processedNVTableSize = 0;
2006 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002007 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002008 }
2009 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002010 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002011 nvTable->chunkSize);
2012
2013 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2014 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2015 {
2016 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2017 pHddCtx->ftm.tempNVTableBuffer,
2018 pHddCtx->ftm.targetNVTableSize);
2019 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2020 pHddCtx->ftm.targetNVTableSize = 0;
2021 pHddCtx->ftm.processedNVTableSize = 0;
2022 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2023 }
2024
2025 return 1;
2026}
2027
2028/**---------------------------------------------------------------------------
2029
2030 \brief wlan_hdd_ftm_blank_nv() -
2031 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002032 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002033
2034 \param - ftmCmd - Pointer FTM Commad Buffer
2035
2036 \return - int
2037 -1, Process Host command fail, vail out
2038 0, Process Host command success
2039
2040 --------------------------------------------------------------------------*/
2041int wlan_hdd_ftm_blank_nv_table
2042(
2043 tPttMsgbuffer *ftmCmd
2044)
2045{
Leo Chang80de3c22013-11-26 10:52:12 -08002046 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002047 v_SIZE_t nvSize;
2048 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002049 sHalNvV2 *nvContents = NULL;
2050 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002051
2052 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2053 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2054 {
2055 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2056 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002057 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002058 }
2059
Leo Chang80de3c22013-11-26 10:52:12 -08002060 nvVersion = vos_nv_getNvVersion();
2061 if (E_NV_V2 != nvVersion)
2062 {
2063 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2064 "%s : Not valid NV Version %d", __func__, nvVersion);
2065 return -EINVAL;
2066 }
2067
Jeff Johnson295189b2012-06-20 16:38:30 -07002068 itemSize = sizeof(nvContents->tables.pwrOptimum);
2069 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002070 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002071 itemSize);
2072
2073 itemSize = sizeof(nvContents->tables.regDomains);
2074 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002075 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002076 itemSize);
2077
2078 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2079 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002080 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002081 itemSize);
2082
2083 itemSize = sizeof(nvContents->tables.plutCharacterized);
2084 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002085 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002086 itemSize);
2087
2088 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2089 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002090 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002091 itemSize);
2092
2093 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2094 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002095 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002096 itemSize);
2097
2098 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2099 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002100 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002101 itemSize);
2102
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002103 itemSize = sizeof(nvContents->tables.hwCalValues);
2104 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002105 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002106 itemSize);
2107
2108 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2109 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002110 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002111 itemSize);
2112
2113 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2114 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002115 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002116 itemSize);
2117
2118 return 1;
2119}
2120
2121/**---------------------------------------------------------------------------
2122
2123 \brief wlan_hdd_ftm_delete_nv_table() -
2124 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002125 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002126
2127 \param - ftmCmd - Pointer FTM Commad Buffer
2128
2129 \return - int
2130 -1, Process Host command fail, vail out
2131 1, Process Host command success
2132
2133 --------------------------------------------------------------------------*/
2134int wlan_hdd_ftm_delete_nv_table
2135(
2136 tPttMsgbuffer *ftmCmd
2137)
2138{
Leo Chang80de3c22013-11-26 10:52:12 -08002139 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002140 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2141 v_SIZE_t nvSize;
2142 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002143 sHalNvV2 *nvContents = NULL;
2144 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002145
2146 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2147 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2148 {
2149 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2150 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002151 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002152 }
2153
Leo Chang80de3c22013-11-26 10:52:12 -08002154 nvVersion = vos_nv_getNvVersion();
2155 if (E_NV_V2 != nvVersion)
2156 {
2157 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2158 "%s : Not valid NV Version %d", __func__, nvVersion);
2159 return -EINVAL;
2160 }
2161
Jeff Johnson295189b2012-06-20 16:38:30 -07002162 switch (nvTable->nvTable)
2163 {
2164 case NV_TABLE_RATE_POWER_SETTINGS:
2165 itemSize = sizeof(nvContents->tables.pwrOptimum);
2166 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002167 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002168 itemSize);
2169 break;
2170
2171 case NV_TABLE_REGULATORY_DOMAINS:
2172 itemSize = sizeof(nvContents->tables.regDomains);
2173 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002174 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002175 itemSize);
2176 break;
2177
2178 case NV_TABLE_DEFAULT_COUNTRY:
2179 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2180 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002181 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002182 itemSize);
2183 break;
2184
2185 case NV_TABLE_TPC_POWER_TABLE:
2186 itemSize = sizeof(nvContents->tables.plutCharacterized);
2187 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002188 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002189 itemSize);
2190 break;
2191
2192 case NV_TABLE_TPC_PDADC_OFFSETS:
2193 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2194 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002195 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002196 itemSize);
2197 break;
2198
2199 case NV_TABLE_VIRTUAL_RATE:
2200 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2201 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002202 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002203 itemSize);
2204 break;
2205
2206 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2207 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2208 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002209 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002210 itemSize);
2211 break;
2212
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002213 case NV_TABLE_HW_CAL_VALUES:
2214 itemSize = sizeof(nvContents->tables.hwCalValues);
2215 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002216 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002217 itemSize);
2218 break;
2219
2220 case NV_TABLE_FW_CONFIG:
2221 itemSize = sizeof(nvContents->tables.fwConfig);
2222 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002223 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002224 itemSize);
2225 break;
2226
2227 case NV_TABLE_ANTENNA_PATH_LOSS:
2228 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2229 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002230 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002231 itemSize);
2232 break;
2233
2234 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2235 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2236 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002237 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002238 itemSize);
2239 break;
2240
2241 default:
2242 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2243 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002244 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002245 break;
2246 }
2247
2248 return 1;
2249}
2250
2251/**---------------------------------------------------------------------------
2252
2253 \brief wlan_hdd_ftm_get_nv_field() -
2254 Get Specific NV field
2255
2256 \param - ftmCmd - Pointer FTM Commad Buffer
2257
2258 \return - int
2259 -1, Process Host command fail, vail out
2260 1, Process Host command success
2261
2262 --------------------------------------------------------------------------*/
2263int wlan_hdd_ftm_get_nv_field
2264(
2265 tPttMsgbuffer *ftmCmd
2266)
2267{
2268 sNvFields nvFieldDataBuffer;
2269 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2270 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2271 sHalNv *nvContents = NULL;
2272 v_SIZE_t nvSize;
2273
2274 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2275 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2276 {
2277 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2278 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002279 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002280 }
2281 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2282
2283 switch (nvField->nvField)
2284 {
2285 case NV_COMMON_PRODUCT_ID:
2286 memcpy((void *)&nvField->fieldData,
2287 &nvFieldDataBuffer.productId,
2288 sizeof(nvFieldDataBuffer.productId));
2289 break;
2290
2291 case NV_COMMON_PRODUCT_BANDS:
2292 memcpy((void *)&nvField->fieldData,
2293 &nvFieldDataBuffer.productBands,
2294 sizeof(nvFieldDataBuffer.productBands));
2295 break;
2296
2297 case NV_COMMON_NUM_OF_TX_CHAINS:
2298 memcpy((void *)&nvField->fieldData,
2299 &nvFieldDataBuffer.numOfTxChains,
2300 sizeof(nvFieldDataBuffer.numOfTxChains));
2301 break;
2302
2303 case NV_COMMON_NUM_OF_RX_CHAINS:
2304 memcpy((void *)&nvField->fieldData,
2305 &nvFieldDataBuffer.numOfRxChains,
2306 sizeof(nvFieldDataBuffer.numOfRxChains));
2307 break;
2308
2309 case NV_COMMON_MAC_ADDR:
2310 memcpy((void *)&nvField->fieldData,
2311 &nvFieldDataBuffer.macAddr[0],
2312 NV_FIELD_MAC_ADDR_SIZE);
2313 break;
2314
2315 case NV_COMMON_MFG_SERIAL_NUMBER:
2316 memcpy((void *)&nvField->fieldData,
2317 &nvFieldDataBuffer.mfgSN[0],
2318 NV_FIELD_MFG_SN_SIZE);
2319 break;
2320
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002321 case NV_COMMON_WLAN_NV_REV_ID:
2322 memcpy((void *)&nvField->fieldData,
2323 &nvFieldDataBuffer.wlanNvRevId,
2324 sizeof(nvFieldDataBuffer.wlanNvRevId));
2325 break;
2326
Jeff Johnson295189b2012-06-20 16:38:30 -07002327 case NV_COMMON_COUPLER_TYPE:
2328 memcpy((void *)&nvField->fieldData,
2329 &nvFieldDataBuffer.couplerType,
2330 sizeof(nvFieldDataBuffer.couplerType));
2331 break;
2332
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002333 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002334 {
2335 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2336 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2337
2338 nvEmbededStatus = vos_nv_isEmbeddedNV();
2339
2340 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2341 {
2342 // High bit is set to indicate embedded NV..
2343 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2344 }
2345
2346 memcpy((void *)&nvField->fieldData,
2347 &nvVersion,
2348 sizeof(nvFieldDataBuffer.nvVersion));
2349 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002350 break;
2351
Jeff Johnson295189b2012-06-20 16:38:30 -07002352 default:
2353 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2354 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002355 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002356 break;
2357 }
2358
2359 return 1;
2360}
2361
2362/**---------------------------------------------------------------------------
2363
2364 \brief wlan_hdd_ftm_set_nv_field() -
2365 Set Specific NV field
2366
2367 \param - ftmCmd - Pointer FTM Commad Buffer
2368
2369 \return - int
2370 -1, Process Host command fail, vail out
2371 1, Process Host command success
2372
2373 --------------------------------------------------------------------------*/
2374int wlan_hdd_ftm_set_nv_field
2375(
2376 tPttMsgbuffer *ftmCmd
2377)
2378{
2379 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2380 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2381 v_SIZE_t nvSize;
2382 sHalNv *nvContents = NULL;
2383 v_U8_t macLoop;
2384 v_U8_t *pNVMac;
2385 v_U8_t lastByteMAC;
2386
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002387
Jeff Johnson295189b2012-06-20 16:38:30 -07002388 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2389 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2390 {
2391 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2392 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002393 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002394 }
2395
2396 switch (nvField->nvField)
2397 {
2398 case NV_COMMON_PRODUCT_ID:
2399 memcpy(&nvContents->fields.productId,
2400 &nvField->fieldData,
2401 sizeof(nvContents->fields.productId));
2402 break;
2403
2404 case NV_COMMON_PRODUCT_BANDS:
2405 memcpy(&nvContents->fields.productBands,
2406 &nvField->fieldData,
2407 sizeof(nvContents->fields.productBands));
2408 break;
2409
2410 case NV_COMMON_NUM_OF_TX_CHAINS:
2411 memcpy(&nvContents->fields.numOfTxChains,
2412 &nvField->fieldData,
2413 sizeof(nvContents->fields.numOfTxChains));
2414 break;
2415
2416 case NV_COMMON_NUM_OF_RX_CHAINS:
2417 memcpy(&nvContents->fields.numOfRxChains,
2418 &nvField->fieldData,
2419 sizeof(nvContents->fields.numOfRxChains));
2420 break;
2421
2422 case NV_COMMON_MAC_ADDR:
2423 /* If Last byte is larger than 252 (0xFC), return Error,
2424 * Since 3MACs should be derived from first MAC */
2425 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002426 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002427 {
2428 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2429 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002430 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002431 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002432 }
2433
2434 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002435 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002436 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2437 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002438 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002439 lastByteMAC + macLoop;
2440 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002441 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002442 NV_FIELD_MAC_ADDR_SIZE);
2443 }
2444 break;
2445
2446 case NV_COMMON_MFG_SERIAL_NUMBER:
2447 memcpy(&nvContents->fields.mfgSN[0],
2448 &nvField->fieldData,
2449 NV_FIELD_MFG_SN_SIZE);
2450 break;
2451
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002452 case NV_COMMON_WLAN_NV_REV_ID:
2453 memcpy(&nvContents->fields.wlanNvRevId,
2454 &nvField->fieldData,
2455 sizeof(nvContents->fields.wlanNvRevId));
2456 break;
2457
Jeff Johnson295189b2012-06-20 16:38:30 -07002458 case NV_COMMON_COUPLER_TYPE:
2459 memcpy(&nvContents->fields.couplerType,
2460 &nvField->fieldData,
2461 sizeof(nvContents->fields.couplerType));
2462 break;
2463
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002464 case NV_COMMON_NV_VERSION:
2465 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2466 "Cannot modify NV version field %d", nvField->nvField);
2467 return -EIO;
2468 break;
2469
Jeff Johnson295189b2012-06-20 16:38:30 -07002470 default:
2471 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2472 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002473 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002474 break;
2475 }
2476
2477 return 1;
2478}
2479
2480/**---------------------------------------------------------------------------
2481
2482 \brief wlan_hdd_ftm_store_nv_table() -
2483 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002484 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002485
2486 \param - ftmCmd - Pointer FTM Commad Buffer
2487
2488 \return - int
2489 -1, Process Host command fail, vail out
2490 0, Process Host command success
2491
2492 --------------------------------------------------------------------------*/
2493int wlan_hdd_ftm_store_nv_table
2494(
2495 tPttMsgbuffer *ftmCmd
2496)
2497{
2498 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2499 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002500 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2501 void *tablePtr = NULL;
2502 unsigned int tableSize = 0;
2503 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002504 sHalNvV2 *nvContents = NULL;
2505 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002506
2507 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2508 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2509 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002510 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002511 }
2512
Leo Chang80de3c22013-11-26 10:52:12 -08002513 nvVersion = vos_nv_getNvVersion();
2514 if (E_NV_V2 != nvVersion)
2515 {
2516 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2517 "%s : Not valid NV Version %d", __func__, nvVersion);
2518 return -EINVAL;
2519 }
2520
Jeff Johnson295189b2012-06-20 16:38:30 -07002521 /* Set Platform type as PRIMA */
2522 nvContents->fields.wlanNvRevId = 2;
2523
2524 switch(nvTable->nvTable)
2525 {
2526 case NV_FIELDS_IMAGE:
2527 tablePtr = (void *)&nvContents->fields;
2528 tableSize = sizeof(nvContents->fields);
2529 tableVNVType = VNV_FIELD_IMAGE;
2530 break;
2531
2532 case NV_TABLE_RATE_POWER_SETTINGS:
2533 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2534 tableSize = sizeof(nvContents->tables.pwrOptimum);
2535 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2536 break;
2537
2538 case NV_TABLE_REGULATORY_DOMAINS:
2539 tablePtr = (void *)&nvContents->tables.regDomains[0];
2540 tableSize = sizeof(nvContents->tables.regDomains);
2541 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2542 break;
2543
2544 case NV_TABLE_DEFAULT_COUNTRY:
2545 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2546 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2547 tableVNVType = VNV_DEFAULT_LOCATION;
2548 break;
2549
2550 case NV_TABLE_TPC_POWER_TABLE:
2551 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2552 tableSize = sizeof(nvContents->tables.plutCharacterized);
2553 tableVNVType = VNV_TPC_POWER_TABLE;
2554 break;
2555
2556 case NV_TABLE_TPC_PDADC_OFFSETS:
2557 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2558 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2559 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2560 break;
2561
2562 case NV_TABLE_VIRTUAL_RATE:
2563 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2564 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2565 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2566 break;
2567
2568 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2569 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2570 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2571 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2572 break;
2573
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002574 case NV_TABLE_HW_CAL_VALUES:
2575 tablePtr = (void *)&nvContents->tables.hwCalValues;
2576 tableSize = sizeof(nvContents->tables.hwCalValues);
2577 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002578 break;
2579
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002580 case NV_TABLE_FW_CONFIG:
2581 tablePtr = (void *)&nvContents->tables.fwConfig;
2582 tableSize = sizeof(nvContents->tables.fwConfig);
2583 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002584 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002585
Jeff Johnson295189b2012-06-20 16:38:30 -07002586 case NV_TABLE_ANTENNA_PATH_LOSS:
2587 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2588 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2589 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2590 break;
2591
2592 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2593 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2594 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2595 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2596 break;
2597
2598 default:
2599 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2600 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002601 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002602 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002603
Jeff Johnson295189b2012-06-20 16:38:30 -07002604 }
2605
2606 nvStatus = vos_nv_write(tableVNVType,
2607 tablePtr,
2608 tableSize);
2609 if(VOS_STATUS_SUCCESS != nvStatus)
2610 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002611 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002612 }
2613
2614 return 1;
2615}
2616
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002617/* --------------------------------------------------------------------------
2618 \brief wlan_hdd_ftm_get_nv_bin() -
2619 Get NV bin read from Flash Memory, file
2620
2621 \param - ftmCmd - Pointer FTM Commad Buffer
2622
2623 \return - int
2624 -1, Process Host command fail, vail out
2625 0, Process Host command success
2626--------------------------------------------------------------------------*/
2627
2628static int wlan_hdd_ftm_get_nv_bin
2629(
2630 v_U16_t msgId,
2631 hdd_context_t *pHddCtx,
2632 tPttMsgbuffer *ftmCmd
2633)
2634{
2635 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2636 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2637 v_SIZE_t nvSize;
2638 v_U8_t *nvContents;
2639 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002640 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002641
Leo Chang80de3c22013-11-26 10:52:12 -08002642 nvVersion = vos_nv_getNvVersion();
2643 if (E_NV_V3 != nvVersion)
2644 {
2645 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2646 "%s : Not valid NV Version %d", __func__, nvVersion);
2647 return -EINVAL;
2648 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002649
2650 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2651 (0 == pHddCtx->ftm.processedNVTableSize))
2652 {
2653 if ( msgId == PTT_MSG_GET_NV_BIN )
2654 {
2655 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2656 }
2657 else
2658 {
2659 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2660 }
2661
2662 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2663 {
2664 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2665 "Fail to get cached NV value Status %d", nvStatus);
2666 return -EIO;
2667 }
2668
2669 switch (nvTable->nvTable)
2670 {
2671 case NV_BINARY_IMAGE:
2672 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2673 break;
2674 default:
2675 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2676 "Not Valid NV Table %d", nvTable->nvTable);
2677 return -EIO;
2678 break;
2679 }
2680
2681 /* Set Current Processing NV table type */
2682 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2683 if ( msgId == PTT_MSG_GET_NV_BIN )
2684 {
2685 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2686 /* Validity Period */
2687 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2688 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2689 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2690 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2691 offset = sizeof(v_U32_t);
2692 }
2693 else
2694 {
2695 pHddCtx->ftm.targetNVTableSize = nvSize;
2696 offset = 0;
2697 }
2698
2699 /* Copy target NV table value into temp context buffer */
2700 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2701 pHddCtx->ftm.targetNVTablePointer,
2702 pHddCtx->ftm.targetNVTableSize);
2703 }
2704
2705
2706 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2707 {
2708 /* Invalid table type */
2709 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2710 "Invalid NV Table, now Processing %d, not %d",
2711 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2712
2713 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2714 pHddCtx->ftm.targetNVTableSize = 0;
2715 pHddCtx->ftm.processedNVTableSize = 0;
2716 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2717
2718 return -EINVAL;
2719 }
2720
2721 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2722
2723 /* Update processed pointer to prepare next chunk copy */
2724 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2725 pHddCtx->ftm.targetNVTableSize )
2726 {
2727 nvTable->chunkSize =
2728 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2729 }
2730
2731 /* Copy next chunk of NV table value into response buffer */
2732 vos_mem_copy(
2733 &nvTable->tableData,
2734 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2735 nvTable->chunkSize);
2736
2737 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2738
2739 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2740 {
2741 /* Finished to process last chunk of data, initialize buffer */
2742 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2743 pHddCtx->ftm.targetNVTableSize = 0;
2744 pHddCtx->ftm.processedNVTableSize = 0;
2745 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2746 }
2747
2748 return 1;
2749}
2750
2751/**---------------------------------------------------------------------------
2752
2753 \brief wlan_hdd_ftm_set_nv_bin() -
2754 Set NV bin to Flash Memory, file
2755
2756 \param - ftmCmd - Pointer FTM Commad Buffer
2757
2758 \return - int
2759 -1, Process Host command fail, vail out
2760 0, Process Host command success
2761
2762+----------------------------------------------------------------------------*/
2763
2764static int wlan_hdd_ftm_set_nv_bin
2765(
2766 hdd_context_t *pHddCtx,
2767 tPttMsgbuffer *ftmCmd
2768)
2769{
2770 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2771 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002772 eNvVersionType nvVersion;
2773
2774 nvVersion = vos_nv_getNvVersion();
2775 if (E_NV_V3 != nvVersion)
2776 {
2777 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2778 "%s : Not valid NV Version %d", __func__, nvVersion);
2779 return -EINVAL;
2780 }
2781
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002782
2783 /* Test first chunk of NV table */
2784 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2785 (0 == pHddCtx->ftm.processedNVTableSize))
2786 {
2787 switch (nvTable->nvTable)
2788 {
2789 case NV_BINARY_IMAGE:
2790 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2791 break;
2792 default:
2793 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2794 "Not Valid NV Table %d", nvTable->nvTable);
2795 return -EIO;
2796 break;
2797 }
2798
2799 /* Set Current Processing NV table type */
2800 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2801 pHddCtx->ftm.processedNVTableSize = 0;
2802
2803 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2804 {
2805 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2806 "Invalid Table Size %d", nvTable->tableSize);
2807 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2808 pHddCtx->ftm.targetNVTableSize = 0;
2809 pHddCtx->ftm.processedNVTableSize = 0;
2810 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2811 return -EINVAL;
2812 }
2813 }
2814
2815 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2816 {
2817 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2818 "Invalid NV Table, now Processing %d, not %d",
2819 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2820 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2821 pHddCtx->ftm.targetNVTableSize = 0;
2822 pHddCtx->ftm.processedNVTableSize = 0;
2823 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2824 return -EINVAL;
2825 }
2826
2827 vos_mem_copy(
2828 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2829 &nvTable->tableData,
2830 nvTable->chunkSize);
2831
2832 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2833
2834 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2835 {
2836 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2837 "Processing Done!! write encoded Buffer %d",
2838 pHddCtx->ftm.targetNVTableSize);
2839
2840 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2841 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2842
2843 if ((VOS_STATUS_SUCCESS != nvStatus))
2844 {
2845 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2846 "Fail to set NV Binary %d", nvStatus);
2847 return -EIO;
2848 }
2849
2850 nvStatus = vos_nv_setNVEncodedBuffer(
2851 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2852 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
2853
2854 if ((VOS_STATUS_SUCCESS != nvStatus))
2855 {
2856 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2857 "Fail to set NV Binary %d", nvStatus);
2858 return -EIO;
2859 }
2860
2861 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2862 pHddCtx->ftm.targetNVTableSize = 0;
2863 pHddCtx->ftm.processedNVTableSize = 0;
2864 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2865 }
2866
2867 return 1;
2868}
2869
Jeff Johnson295189b2012-06-20 16:38:30 -07002870/**---------------------------------------------------------------------------
2871
2872 \brief wlan_hdd_ftm_temp_get_rel_num() -
2873 Get internal release number
2874
2875 \param - ftmCmd - Pointer FTM Commad Buffer
2876
2877 \return - int
2878 -1, Process Host command fail, vail out
2879 0, Process Host command success
2880
2881 --------------------------------------------------------------------------*/
2882int wlan_hdd_ftm_temp_get_rel_num
2883(
2884 tPttMsgbuffer *ftmCmd
2885)
2886{
2887 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2888
2889 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2890 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2891 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2892 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2893 relNum->relParams.pttMax = 10;
2894 relNum->relParams.pttMin = 1;
2895
2896 return 1;
2897}
2898
2899/**---------------------------------------------------------------------------
2900
2901 \brief wlan_hdd_process_ftm_host_cmd() -
2902 process any command should be handled within host.
2903 decide any command should be send to HAL or not
2904
2905 \param - ftmCmd - Pointer FTM Commad Buffer
2906
2907 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002908 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002909 0, Process Host command success, not need to send CMD to HAL
2910 1, Process Host command success, need to send CMD to HAL
2911
2912 --------------------------------------------------------------------------*/
2913int wlan_hdd_process_ftm_host_cmd
2914(
2915 hdd_context_t *pHddCtx,
2916 void *ftmCmd
2917)
2918{
2919 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2920 int needToRouteHal = 1;
2921 int hostState = 1;
2922
2923 switch(pFTMCmd->msgId)
2924 {
2925 case PTT_MSG_GET_NV_TABLE:
2926 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2927 needToRouteHal = 0;
2928 break;
2929
2930 case PTT_MSG_SET_NV_TABLE:
2931 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2932 /* Temp NV Operation will be isolated to host
2933 needToRouteHal = 1; */
2934 needToRouteHal = 0;
2935 break;
2936
2937 case PTT_MSG_BLANK_NV:
2938 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2939 needToRouteHal = 1;
2940 break;
2941
2942 case PTT_MSG_DEL_NV_TABLE:
2943 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2944 needToRouteHal = 1;
2945 break;
2946
2947 case PTT_MSG_GET_NV_FIELD:
2948 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2949 needToRouteHal = 0;
2950 break;
2951
2952 case PTT_MSG_SET_NV_FIELD:
2953 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2954 needToRouteHal = 0;
2955 break;
2956
2957 case PTT_MSG_STORE_NV_TABLE:
2958 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2959 needToRouteHal = 0;
2960 break;
2961
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002962 case PTT_MSG_GET_NV_BIN:
2963 case PTT_MSG_GET_DICTIONARY:
2964 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
2965 needToRouteHal = 0;
2966 break;
2967
2968 case PTT_MSG_SET_NV_BIN:
2969 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
2970 needToRouteHal = 0;
2971 break;
2972
Jeff Johnson295189b2012-06-20 16:38:30 -07002973 case PTT_MSG_DBG_READ_REGISTER:
2974 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
2975 &pFTMCmd->msgBody.DbgReadRegister.regValue);
2976 needToRouteHal = 0;
2977 break;
2978
2979 case PTT_MSG_DBG_WRITE_REGISTER:
2980 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
2981 pFTMCmd->msgBody.DbgWriteRegister.regValue);
2982 needToRouteHal = 0;
2983 break;
2984
2985 case PTT_MSG_DBG_READ_MEMORY:
2986 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
2987 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
2988 pFTMCmd->msgBody.DbgReadMemory.nBytes);
2989 needToRouteHal = 0;
2990 break;
2991
2992 case PTT_MSG_DBG_WRITE_MEMORY:
2993 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
2994 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
2995 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
2996 needToRouteHal = 0;
2997 break;
2998
2999 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3000 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3001 needToRouteHal = 0;
3002 break;
3003
3004 default:
3005 needToRouteHal = 1;
3006 break;
3007 }
3008
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003009 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003010 {
3011 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3012 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003013 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003014 }
3015
3016 return needToRouteHal;
3017}
Jeff Johnson295189b2012-06-20 16:38:30 -07003018
3019/**---------------------------------------------------------------------------
3020
3021 \brief wlan_hdd_process_ftm_cmd() -
3022
3023 This function process the commands received from the ptt socket application.
3024
3025 \param - pAdapter - Pointer HDD Context.
3026
3027 \param - wnl - Pointer to the ANI netlink header.
3028
3029 \return - none
3030
3031 --------------------------------------------------------------------------*/
3032
3033void wlan_hdd_process_ftm_cmd
3034(
3035 hdd_context_t *pHddCtx,
3036 tAniNlHdr *wnl
3037)
3038{
3039 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3040 v_U16_t cmd_len;
3041 v_U8_t *pftm_data;
3042 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003043 int hostState;
3044 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003045
3046 ENTER();
3047
Jeff Johnsone7245742012-09-05 17:12:55 -07003048 //Delay to fix NV write failure on JB
3049 vos_busy_wait(10000); //10ms
3050
Jeff Johnson295189b2012-06-20 16:38:30 -07003051 if (!pRequestBuf) {
3052
Arif Hussain6d2a3322013-11-17 19:50:10 -08003053 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003054 return ;
3055 }
3056 /*Save the received request*/
3057 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3058
3059 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3060 /*Save the received request netlink header used for sending the response*/
3061 pHddCtx->ftm.wnl = wnl;
3062 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3063
Arif Hussain6d2a3322013-11-17 19:50:10 -08003064 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003065
3066 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3067 wlan_ftm_send_response(pHddCtx);
3068 return ;
3069 }
3070
3071 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3072 {
3073 case WLAN_FTM_START:
3074 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3075
Arif Hussain6d2a3322013-11-17 19:50:10 -08003076 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003077 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3078 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3079 wlan_ftm_send_response(pHddCtx);
3080 return;
3081 }
3082
3083 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3084 {
3085 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3086 ,__func__);
3087 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3088 wlan_ftm_send_response(pHddCtx);
3089 return;
3090 }
3091 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3092 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3093 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3094 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3095
3096 wlan_ftm_send_response(pHddCtx);
3097
3098 break;
3099
3100 case WLAN_FTM_STOP:
3101 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3102
Arif Hussain6d2a3322013-11-17 19:50:10 -08003103 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003104 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3105 wlan_ftm_send_response(pHddCtx);
3106 return;
3107 }
3108
3109 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3110
3111 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3112 wlan_ftm_send_response(pHddCtx);
3113 return;
3114 }
3115
3116 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3117 /* This would send back the Command Success Status */
3118 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3119
3120 wlan_ftm_send_response(pHddCtx);
3121
3122 break;
3123
3124 case WLAN_FTM_CMD:
3125 /* if it is regular FTM command, pass it to HAL PHY */
3126 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003127 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003128 return;
3129 }
3130 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3131
Arif Hussain6d2a3322013-11-17 19:50:10 -08003132 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003133
3134 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3135 wlan_ftm_send_response(pHddCtx);
3136 return;
3137
3138 }
3139 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3140 cmd_len = pRequestBuf->ftm_hdr.data_len;
3141 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3142 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3143
Jeff Johnson295189b2012-06-20 16:38:30 -07003144 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3145 if (0 == hostState)
3146 {
3147 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3148 if (NULL == tempRspBuffer)
3149 {
3150 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003151 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003152 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3153 wlan_ftm_send_response(pHddCtx);
3154 return;
3155 }
3156 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3157 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3158 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3159 (unsigned char *) tempRspBuffer,
3160 tempRspBuffer->msgBodyLength);
3161 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3162 wlan_ftm_send_response(pHddCtx);
3163 vos_mem_free(tempRspBuffer);
3164 return;
3165 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003166 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003167 {
3168 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3169 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3170 wlan_ftm_send_response(pHddCtx);
3171 return;
3172 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003173
3174 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3175
3176 pHddCtx->ftm.IsCmdPending = TRUE;
3177
3178 /*Post the command to the HAL*/
3179 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3180
Arif Hussain6d2a3322013-11-17 19:50:10 -08003181 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003182 return;
3183
3184 }
3185 /*Wait here until you get the response from HAL*/
3186 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3187 {
3188 hddLog(VOS_TRACE_LEVEL_ERROR,
3189 "%s: vos_wait_single_event failed",__func__);
3190 return;
3191 }
3192
3193 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3194
3195 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3196
3197 wlan_ftm_send_response(pHddCtx);
3198 pHddCtx->ftm.IsCmdPending = FALSE;
3199 break;
3200
3201 default:
3202
Arif Hussain6d2a3322013-11-17 19:50:10 -08003203 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003204 return;
3205 }
3206
3207 EXIT();
3208 return;
3209} /* wlan_adp_ftm_cmd() */
3210
3211/**---------------------------------------------------------------------------
3212
3213 \brief wlan_ftm_priv_start_stop_ftm() -
3214
3215 This function is used for start/stop the ftm driver.
3216
3217 \param - pAdapter - Pointer HDD Context.
3218 - start - 1/0 to start/stop ftm driver.
3219
3220 \return - 0 for success, non zero for failure
3221
3222 --------------------------------------------------------------------------*/
3223
3224static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3225 v_U16_t start)
3226{
3227 VOS_STATUS status;
3228 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3229
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003230 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003231 {
3232 pHddCtx->ftm.cmd_iwpriv = TRUE;
3233 status = wlan_hdd_ftm_start(pHddCtx);
3234
3235 if (status != VOS_STATUS_SUCCESS)
3236 {
3237 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3238 "FTM Start Failed");
3239 return VOS_STATUS_E_FAILURE;
3240 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303241 if (NULL == pMsgBuf)
3242 {
3243 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3244 if (NULL == pMsgBuf)
3245 {
3246 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3247 "%s:pMsgBuf is NULL", __func__);
3248 return VOS_STATUS_E_FAILURE;
3249 }
3250 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003251 }
3252 else
3253 {
3254 status = wlan_ftm_stop(pHddCtx);
3255
3256 if (status != VOS_STATUS_SUCCESS)
3257 {
3258 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3259 "FTM Stop Failed");
3260 return VOS_STATUS_E_FAILURE;
3261 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303262 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3263 if (pMsgBuf)
3264 {
3265 vos_mem_free((v_VOID_t * )pMsgBuf);
3266 pMsgBuf = NULL;
3267 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003268 }
3269 return VOS_STATUS_SUCCESS;
3270}
3271
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303272
3273static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3274{
3275 unsigned int *table = NULL;
3276 int index = 0;
3277
3278 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3279 table = valid_channel;
3280 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3281 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3282 table = valid_channel_cb40;
3283 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3284 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3285 table = valid_channel_cb80;
3286
3287 if (NULL == table)
3288 return VOS_STATUS_E_FAILURE;
3289
3290 while (table[index] != 0)
3291 {
3292 if (table[index] == channel)
3293 return VOS_STATUS_SUCCESS;
3294
3295 index++;
3296 }
3297
3298 return VOS_STATUS_E_FAILURE;
3299}
3300
3301
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303302static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3303{
3304 unsigned int primary_channel = center_channel;
3305
3306 if (center_channel <= 14)
3307 return primary_channel ;
3308
3309 switch (cb)
3310 {
3311 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3312 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3313 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3314 primary_channel -= 2;
3315 break;
3316
3317
3318 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3319 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3320 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3321 primary_channel += 2;
3322 break;
3323
3324 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3325 primary_channel -= 6;
3326 break;
3327
3328 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3329 primary_channel += 6;
3330 break;
3331 }
3332
3333 return primary_channel;
3334
3335}
3336
Jeff Johnson295189b2012-06-20 16:38:30 -07003337/**---------------------------------------------------------------------------
3338
3339 \brief wlan_ftm_priv_set_channel() -
3340
3341 This function is used for setting the channel to the halphy ptt module.
3342
3343 \param - pAdapter - Pointer HDD Context.
3344 - channel - Channel Number 1-14.
3345
3346 \return - 0 for success, non zero for failure
3347
3348 --------------------------------------------------------------------------*/
3349
3350static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3351{
Jeff Johnson295189b2012-06-20 16:38:30 -07003352 uPttMsgs *pMsgBody;
3353 VOS_STATUS status;
3354 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3355
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303356 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003357 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303358 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3359 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003360 return VOS_STATUS_E_FAILURE;
3361 }
3362
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303363 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003364 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303365 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3366 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003367 return VOS_STATUS_E_FAILURE;
3368 }
3369
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303370 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003371 init_completion(&pHddCtx->ftm.ftm_comp_var);
3372 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3373 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3374
3375 pMsgBody = &pMsgBuf->msgBody;
3376
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303377 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003378
Arif Hussain6d2a3322013-11-17 19:50:10 -08003379 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303380 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003381
3382 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3383
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303384 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003385 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303386 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3387 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003388 status = VOS_STATUS_E_FAILURE;
3389 goto done;
3390
3391 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303392 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3393 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003394
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303395 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003396 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303397 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3398 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003399 status = VOS_STATUS_E_FAILURE;
3400 goto done;
3401
3402 }
3403done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003404
3405 return status;
3406}
3407
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303408
3409/**---------------------------------------------------------------------------
3410
3411 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3412
3413 This function is used for setting the power control mode for tx.
3414
3415 \param - pAdapter - Pointer HDD Context.
3416 - pwr_mode - power control mode 0-2.
3417
3418 \return - 0 for success, non zero for failure
3419
3420 --------------------------------------------------------------------------*/
3421
3422static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3423 v_U16_t pwr_mode)
3424{
3425 uPttMsgs *pMsgBody;
3426 VOS_STATUS status;
3427 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3428
3429 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3430 {
3431 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3432 "%s:Ftm has not started. Please start the ftm. ", __func__);
3433 return VOS_STATUS_E_FAILURE;
3434 }
3435
3436 if (pwr_mode > 2)
3437 {
3438 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3439 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3440 return VOS_STATUS_E_FAILURE;
3441 }
3442
3443 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3444 init_completion(&pHddCtx->ftm.ftm_comp_var);
3445 pMsgBody = &pMsgBuf->msgBody;
3446 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3447 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3448
3449 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3450 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3451
3452 if (status != VOS_STATUS_SUCCESS)
3453 {
3454 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3455 "%s:wlan_ftm_postmsg failed", __func__);
3456 status = VOS_STATUS_E_FAILURE;
3457 goto done;
3458 }
3459 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3460 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3461
3462 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3463 {
3464 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3465 "%s:Ptt response status failed", __func__);
3466 status = VOS_STATUS_E_FAILURE;
3467 goto done;
3468 }
3469
3470 done:
3471 return status;
3472
3473}
3474
Jeff Johnson295189b2012-06-20 16:38:30 -07003475/**---------------------------------------------------------------------------
3476
3477 \brief wlan_ftm_priv_set_txpower() -
3478
3479 This function is used for setting the txpower to the halphy ptt module.
3480
3481 \param - pAdapter - Pointer HDD Context.
3482 - txpower - txpower Number 1-18.
3483
3484 \return - 0 for success, non zero for failure
3485
3486 --------------------------------------------------------------------------*/
3487
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303488static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3489 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003490{
Jeff Johnson295189b2012-06-20 16:38:30 -07003491 uPttMsgs *pMsgBody;
3492 VOS_STATUS status;
3493 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3494
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303495 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003496 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303497 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3498 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003499 return VOS_STATUS_E_FAILURE;
3500 }
3501
3502 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3503 * when tx pktgen is enabled
3504 */
3505 if (ftm_status.frameGenEnabled)
3506 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303507 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3508 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003509 return VOS_STATUS_E_FAILURE;
3510 }
3511
3512 if(!(txpower >= 9 && txpower <= 24))
3513 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303514 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3515 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003516 return VOS_STATUS_E_FAILURE;
3517 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003518
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303519 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3520 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003521 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003522 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3523 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3524
3525 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3526
3527 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3528
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303529 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003530 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303531 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3532 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003533 status = VOS_STATUS_E_FAILURE;
3534 goto done;
3535 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303536 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3537 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003538
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303539 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003540 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303541 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3542 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003543 status = VOS_STATUS_E_FAILURE;
3544 goto done;
3545 }
3546
3547 ftm_status.txpower = txpower ;
3548 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003549
3550 return status;
3551
3552}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303553
3554
3555static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3556 v_U16_t enable)
3557{
3558 tANI_U32 value = 0;
3559 tANI_U32 reg_addr;
3560 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3561 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3562 {
3563 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3564 "%s:Ftm has not started. Please start the ftm. ", __func__);
3565 return VOS_STATUS_E_FAILURE;
3566 }
3567
3568#ifdef WCN_PRONTO
3569 reg_addr = 0xfb018000;
3570#else
3571 reg_addr = 0x03018000;
3572#endif
3573 wpalReadRegister(reg_addr, &value);
3574 if (enable)
3575 {
3576 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3577 }
3578 else
3579 {
3580 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3581 }
3582
3583 wpalWriteRegister(reg_addr, value);
3584
3585 return VOS_STATUS_SUCCESS;
3586}
3587
3588
Jeff Johnson295189b2012-06-20 16:38:30 -07003589/**---------------------------------------------------------------------------
3590
3591 \brief wlan_ftm_priv_set_txrate() -
3592
3593 This function is used for setting the txrate to the halphy ptt module.
3594 It converts the user input string for txrate to the tx rate index.
3595
3596 \param - pAdapter - Pointer HDD Context.
3597 - txrate - Pointer to the tx rate string.
3598
3599 \return - 0 for success, non zero for failure
3600
3601 --------------------------------------------------------------------------*/
3602
3603static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3604{
3605 int ii;
3606 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3607 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3608 {
3609 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3610 return VOS_STATUS_E_FAILURE;
3611 }
3612
3613 /* do not allow to change setting when tx pktgen is enabled */
3614 if (ftm_status.frameGenEnabled)
3615 {
3616 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3617 return VOS_STATUS_E_FAILURE;
3618 }
3619
3620 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3621 {
3622 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3623 break;
3624 }
3625 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3626 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003627 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003628 return VOS_STATUS_E_FAILURE;
3629 }
3630
3631 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3632 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3633
3634 return VOS_STATUS_SUCCESS;
3635}
3636
3637/**---------------------------------------------------------------------------
3638
3639 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3640
3641 This function is used for start/stop the tx packet generation.
3642
3643 \param - pAdapter - Pointer HDD Context.
3644 - startStop - Value( 1/0) start/stop the tx packet generation.
3645
3646 \return - 0 for success, non zero for failure
3647
3648 --------------------------------------------------------------------------*/
3649
3650static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3651{
Jeff Johnson295189b2012-06-20 16:38:30 -07003652 uPttMsgs *pMsgBody;
3653 VOS_STATUS status;
3654 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3655
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303656 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003657 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303658 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3659 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003660 return VOS_STATUS_E_FAILURE;
3661 }
3662
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303663 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003664 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303665 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3666 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003667 return VOS_STATUS_E_FAILURE;
3668 }
3669
3670 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3671 (!ftm_status.frameGenEnabled && startStop == 0))
3672 {
3673 return VOS_STATUS_SUCCESS ;
3674 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303675 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003676
Jeff Johnson295189b2012-06-20 16:38:30 -07003677 if (startStop == 1)
3678 {
3679 init_completion(&pHddCtx->ftm.ftm_comp_var);
3680 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3681 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3682 pMsgBody = &pMsgBuf->msgBody;
3683 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3684
3685 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303686 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003687 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303688 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3689 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003690 status = VOS_STATUS_E_FAILURE;
3691 goto done;
3692 }
3693
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303694 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3695 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3696 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303698 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3699 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003700 status = VOS_STATUS_E_FAILURE;
3701 goto done;
3702 }
3703 }
3704
3705 init_completion(&pHddCtx->ftm.ftm_comp_var);
3706 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3707 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3708 pMsgBody = &pMsgBuf->msgBody;
3709 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3710
3711 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3712 if(status != VOS_STATUS_SUCCESS)
3713 {
3714 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3715 status = VOS_STATUS_E_FAILURE;
3716 goto done;
3717 }
3718
3719 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3720 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3721 {
3722 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3723 status = VOS_STATUS_E_FAILURE;
3724 goto done;
3725 }
3726
3727done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003728
3729 if (status == VOS_STATUS_SUCCESS)
3730 {
3731 if (startStop == 1)
3732 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303733 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003734 }
3735 else
3736 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303737 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003738 }
3739 }
3740
3741 return status;
3742}
3743
3744
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303745
3746static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3747{
3748
3749 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3750 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3751 {
3752 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3753 "%s:Ftm has not started. Please start the ftm. ", __func__);
3754 return VOS_STATUS_E_FAILURE;
3755 }
3756
3757 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3758 {
3759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3760 "%s:cb mode value is invalid ", __func__);
3761 return VOS_STATUS_E_FAILURE;
3762 }
3763
3764 ftm_status.cbmode = cbmode;
3765
3766 return VOS_STATUS_SUCCESS;
3767
3768}
3769
Jeff Johnson295189b2012-06-20 16:38:30 -07003770/**---------------------------------------------------------------------------
3771
3772 \brief wlan_ftm_rx_mode() -
3773
3774 This function is used for start/stop the rx packet generation.
3775
3776 \param - pAdapter - Pointer HDD Context.
3777 - rxmode - 0-disable RX.
3778 - 1-rx ALL frames
3779 - 2-rx 11 g/n frames
3780 - 3-rx 11b frames
3781
3782 \return - 0 for success, non zero for failure
3783
3784 --------------------------------------------------------------------------*/
3785
3786static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3787{
Jeff Johnson295189b2012-06-20 16:38:30 -07003788 uPttMsgs *pMsgBody;
3789 VOS_STATUS status;
3790
3791 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303792 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003793 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3795 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003796 return VOS_STATUS_E_FAILURE;
3797 }
3798
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303799 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003800 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303801 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3802 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003803 return VOS_STATUS_E_FAILURE;
3804 }
3805
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303806 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003807 init_completion(&pHddCtx->ftm.ftm_comp_var);
3808
3809 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3810 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3811
3812 pMsgBody = &pMsgBuf->msgBody;
3813
3814 switch(rxmode)
3815 {
3816 case RXMODE_DISABLE_ALL:
3817 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3818 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3819 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3820 break;
3821
3822 case RXMODE_ENABLE_ALL:
3823 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3824 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3825 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3826 break;
3827
3828 case RXMODE_ENABLE_11GN:
3829 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3830 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3831 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3832 break;
3833
3834 case RXMODE_ENABLE_11B:
3835 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3836 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3837 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3838 break;
3839
3840 }
3841
3842 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3843
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303844 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003845 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303846 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3847 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003848 status = VOS_STATUS_E_FAILURE;
3849 goto done;
3850 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303851 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3852 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003853
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303854 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003855 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303856 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3857 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003858 status = VOS_STATUS_E_FAILURE;
3859 goto done;
3860 }
3861 ftm_status.rxmode = rxmode ;
3862done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003863
3864 return status;
3865}
3866
3867/**---------------------------------------------------------------------------
3868
3869 \brief wlan_ftm_priv_rx_pkt_clear() -
3870
3871 This function sets the rx pkt count to zero.
3872
3873 \param - pAdapter - Pointer HDD Context.
3874 - rx_pkt_clear - rx_pkt_clear value.
3875
3876 \return - 0 for success, non zero for failure
3877
3878 --------------------------------------------------------------------------*/
3879
3880static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3881{
Jeff Johnson295189b2012-06-20 16:38:30 -07003882 VOS_STATUS status;
3883 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3884
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303885 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003886 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303887 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3888 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003889 return VOS_STATUS_E_FAILURE;
3890 }
3891
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303892 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07003893 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303894 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3895 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003896 return VOS_STATUS_E_FAILURE;
3897 }
3898
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303899 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003900 init_completion(&pHddCtx->ftm.ftm_comp_var);
3901 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
3902 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
3903
Jeff Johnson295189b2012-06-20 16:38:30 -07003904 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3905
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303906 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003907 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303908 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3909 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003910 status = VOS_STATUS_E_FAILURE;
3911 goto done;
3912 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303913 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3914 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003915
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303916 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003917 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303918 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3919 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003920 status = VOS_STATUS_E_FAILURE;
3921 goto done;
3922 }
3923done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003924
3925 return status;
3926}
3927
3928/**---------------------------------------------------------------------------
3929
3930 \brief wlan_ftm_priv_get_channel() -
3931
3932 This function gets the channel number from the halphy ptt module and
3933 returns the channel number to the application.
3934
3935 \param - pAdapter - Pointer HDD Context.
3936 - pChannel - Poniter to get the Channel number.
3937
3938 \return - 0 for success, non zero for failure
3939
3940 --------------------------------------------------------------------------*/
3941
3942static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
3943{
Jeff Johnson295189b2012-06-20 16:38:30 -07003944 uPttMsgs *pMsgBody;
3945 VOS_STATUS status;
3946 v_U16_t freq;
3947 v_U8_t indx=0;
3948
3949 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3950
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303951 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003952 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303953 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3954 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003955 return VOS_STATUS_E_FAILURE;
3956 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303957 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003958 init_completion(&pHddCtx->ftm.ftm_comp_var);
3959 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3960 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3961
3962 pMsgBody = &pMsgBuf->msgBody;
3963 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
3964
3965 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3966
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303967 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003968 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303969 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3970 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003971 status = VOS_STATUS_E_FAILURE;
3972 goto done;
3973
3974 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303975 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3976 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003977
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303978 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003979 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303980 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3981 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003982 status = VOS_STATUS_E_FAILURE;
3983 goto done;
3984 }
3985
3986 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
3987
3988 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
3989 indx++;
3990 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
3991 {
3992 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
3993 status = VOS_STATUS_E_FAILURE;
3994 goto done;
3995 }
3996
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003997 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07003998
Arif Hussain6d2a3322013-11-17 19:50:10 -08003999 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004000 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004001
4002 return status;
4003}
4004
4005/**---------------------------------------------------------------------------
4006
4007 \brief wlan_ftm_priv_get_txpower() -
4008
4009 This function gets the TX power from the halphy ptt module and
4010 returns the TX power to the application.
4011
4012 \param - pAdapter - Pointer HDD Context.
4013 - pTxPwr - Poniter to get the Tx power.
4014
4015 \return - 0 for success, non zero for failure
4016
4017 --------------------------------------------------------------------------*/
4018
4019static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4020{
Jeff Johnson295189b2012-06-20 16:38:30 -07004021 uPttMsgs *pMsgBody;
4022 VOS_STATUS status;
4023 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4024
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304025 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004026 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304027 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4028 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 return VOS_STATUS_E_FAILURE;
4030 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304031 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004032 init_completion(&pHddCtx->ftm.ftm_comp_var);
4033 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4034 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4035
4036 pMsgBody = &pMsgBuf->msgBody;
4037
4038 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4039
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304040 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304042 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4043 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004044 status = VOS_STATUS_E_FAILURE;
4045 goto done;
4046 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304047 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4048 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004049
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304050 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004051 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304052 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4053 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004054 status = VOS_STATUS_E_FAILURE;
4055 goto done;
4056 }
4057 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4058
4059 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004060
4061 return status;
4062}
4063
4064/**---------------------------------------------------------------------------
4065
4066 \brief wlan_ftm_priv_get_ftm_version() -
4067
4068 This function gets ftm driver and firmware version.
4069
4070 \param - pAdapter - Pointer HDD Context.
4071 - pTxRate - Poniter to get the Tx rate.
4072
4073 \return - 0 for success, non zero for failure
4074
4075 --------------------------------------------------------------------------*/
4076
4077VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4078{
Jeff Johnson295189b2012-06-20 16:38:30 -07004079 uPttMsgs *pMsgBody;
4080 VOS_STATUS status;
4081 v_U32_t reg_val;
4082 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004083 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4084 int lenRes = 0;
4085 int lenBuf = WE_FTM_MAX_STR_LEN;
4086
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304087 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004088 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304089 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4090 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004091 return VOS_STATUS_E_FAILURE;
4092 }
4093
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304094 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004095 init_completion(&pHddCtx->ftm.ftm_comp_var);
4096 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4097 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4098
4099 pMsgBody = &pMsgBuf->msgBody;
4100 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4101
4102 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4103
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304104 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004105 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304106 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4107 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 status = VOS_STATUS_E_FAILURE;
4109 goto done;
4110
4111 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304112 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4113 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004114
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304115 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004116 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304117 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4118 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004119 status = VOS_STATUS_E_FAILURE;
4120 goto done;
4121 }
4122
4123 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4124
4125 init_completion(&pHddCtx->ftm.ftm_comp_var);
4126
4127 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4128 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4129
4130 pMsgBody = &pMsgBuf->msgBody;
4131
4132 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4133
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304134 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004135 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304136 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4137 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004138 status = VOS_STATUS_E_FAILURE;
4139 goto done;
4140 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304141 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4142 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004143
4144
4145 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4146 if(lenRes < 0 || lenRes >= lenBuf)
4147 {
4148 status = VOS_STATUS_E_FAILURE;
4149 goto done;
4150 }
4151
4152 buf += lenRes;
4153 lenBuf -= lenRes;
4154
4155 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004156 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 -07004157 if(lenRes < 0 || lenRes >= lenBuf)
4158 {
4159 status = VOS_STATUS_E_FAILURE;
4160 goto done;
4161 }
4162
4163 buf += lenRes;
4164 lenBuf -= lenRes;
4165
4166 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4167 if(lenRes < 0 || lenRes >= lenBuf)
4168 {
4169 status = VOS_STATUS_E_FAILURE;
4170 goto done;
4171 }
4172
4173 buf += lenRes;
4174 lenBuf -= lenRes;
4175
Jeff Johnson295189b2012-06-20 16:38:30 -07004176
4177done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004178
4179 return status;
4180
4181}
4182
4183/**---------------------------------------------------------------------------
4184
4185 \brief wlan_ftm_priv_get_txrate() -
4186
4187 This function gets the TX rate from the halphy ptt module and
4188 returns the TX rate to the application.
4189
4190 \param - pAdapter - Pointer HDD Context.
4191 - pTxRate - Poniter to get the Tx rate.
4192
4193 \return - 0 for success, non zero for failure
4194
4195 --------------------------------------------------------------------------*/
4196
4197static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4198{
Jeff Johnson295189b2012-06-20 16:38:30 -07004199 uPttMsgs *pMsgBody;
4200 VOS_STATUS status;
4201 v_U16_t rate_index,ii;
4202 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4203
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304204 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004205 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304206 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4207 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 return VOS_STATUS_E_FAILURE;
4209 }
4210
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304211 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004212 init_completion(&pHddCtx->ftm.ftm_comp_var);
4213 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4214 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4215
4216 pMsgBody = &pMsgBuf->msgBody;
4217
4218 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4219
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304220 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004221 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304222 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4223 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 status = VOS_STATUS_E_FAILURE;
4225 goto done;
4226 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304227 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4228 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004229
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304230 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004231
4232 rate_index = pMsgBody->GetTxPowerReport.rate;
4233 }
4234 else {
4235 /*Return the default rate*/
4236 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304237 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4238 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004239 status = VOS_STATUS_E_FAILURE;
4240 goto done;
4241 }
4242
4243 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4244 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4245 break;
4246 }
4247 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4248 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004249 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004250 status = VOS_STATUS_E_FAILURE;
4251 goto done;
4252 }
4253 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4254done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004255
4256 return status;
4257
4258}
4259
4260/**---------------------------------------------------------------------------
4261
4262 \brief wlan_ftm_priv_get_rx_pkt_count() -
4263
4264 This function gets the rx pkt count from the halphy ptt module and
4265 returns the rx pkt count to the application.
4266
4267 \param - pAdapter - Pointer HDD Context.
4268 - pRxPktCnt - Poniter to get the rx pkt count.
4269
4270 \return - 0 for success, non zero for failure
4271
4272 --------------------------------------------------------------------------*/
4273
4274static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4275{
Jeff Johnson295189b2012-06-20 16:38:30 -07004276 uPttMsgs *pMsgBody;
4277 VOS_STATUS status;
4278 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4279
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304280 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004281 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304282 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4283 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004284 return VOS_STATUS_E_FAILURE;
4285 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304286 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004287 init_completion(&pHddCtx->ftm.ftm_comp_var);
4288 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4289 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4290
4291 pMsgBody = &pMsgBuf->msgBody;
4292
4293 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4294
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304295 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004296 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304297 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4298 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004299 status = VOS_STATUS_E_FAILURE;
4300 goto done;
4301 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304302 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4303 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004304
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304305 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004306 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304307 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4308 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004309 status = VOS_STATUS_E_FAILURE;
4310 goto done;
4311 }
4312 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4313done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004314
4315 return status;
4316}
4317
4318/**---------------------------------------------------------------------------
4319
4320 \brief wlan_ftm_priv_get_rx_rssi() -
4321
4322 This function gets the rx rssi from the halphy ptt module and
4323 returns the rx rssi to the application.
4324
4325 \param - pAdapter - Pointer HDD Context.
4326 - buf - Poniter to get rssi of Rx chains
4327
4328 \return - 0 for success, non zero for failure
4329
4330 --------------------------------------------------------------------------*/
4331
4332static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4333{
Jeff Johnson295189b2012-06-20 16:38:30 -07004334 uPttMsgs *pMsgBody;
4335 VOS_STATUS status;
4336 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4337 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004338
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304339 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004340 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304341 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4342 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004343 return VOS_STATUS_E_FAILURE;
4344 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304345 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004346 init_completion(&pHddCtx->ftm.ftm_comp_var);
4347 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4348 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4349
4350 pMsgBody = &pMsgBuf->msgBody;
4351
4352 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4353
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304354 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004355 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304356 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4357 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004358 status = VOS_STATUS_E_FAILURE;
4359 goto done;
4360 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304361 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4362 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004363
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304364 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004365 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304366 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4367 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004368 status = VOS_STATUS_E_FAILURE;
4369 goto done;
4370 }
4371
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004372 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4373 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004374 pMsgBody->GetRxRssi.rssi.rx[1]);
4375
4376 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4377 {
4378 status = VOS_STATUS_E_FAILURE;
4379 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004380
Jeff Johnson295189b2012-06-20 16:38:30 -07004381done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004382
4383 return status;
4384}
4385
4386/**---------------------------------------------------------------------------
4387
4388 \brief wlan_ftm_priv_get_mac_address() -
4389
4390 This function gets the mac address from the halphy ptt module and
4391 returns the mac address to the application.
4392
4393 \param - pAdapter - Pointer HDD Context.
4394 - buf - Poniter to get the mac address.
4395
4396 \return - 0 for success, non zero for failure
4397
4398 --------------------------------------------------------------------------*/
4399
4400static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4401{
4402 v_BOOL_t itemIsValid = VOS_FALSE;
4403 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4404 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004405
Jeff Johnson295189b2012-06-20 16:38:30 -07004406 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4407
4408 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4409 {
4410 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4411 return VOS_STATUS_E_FAILURE;
4412 }
4413 /*Check the NV FIELD is valid or not*/
4414 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4415 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004416 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004417 {
4418 vos_nv_readMacAddress(macAddr);
4419
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004420 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4421 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004422 MAC_ADDR_ARRAY(macAddr));
4423 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4424 {
4425 return VOS_STATUS_E_FAILURE;
4426 }
4427 }
4428 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004429 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 {
4431 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004432 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4433 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004434 MAC_ADDR_ARRAY(macAddr));
4435
4436 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4437 {
4438 return VOS_STATUS_E_FAILURE;
4439 }
4440 }
4441 return VOS_STATUS_SUCCESS;
4442}
4443
4444/**---------------------------------------------------------------------------
4445
4446 \brief wlan_ftm_priv_set_mac_address() -
4447
4448 This function sets the mac address to the halphy ptt module and
4449 sends the netlink message to the ptt socket application which writes
4450 the macaddress to the qcom_wlan_nv.bin file
4451
4452 \param - pAdapter - Pointer HDD Context.
4453 - buf - Poniter to the macaddress.
4454
4455 \return - 0 for success, non zero for failure
4456
4457 --------------------------------------------------------------------------*/
4458
4459static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4460{
Jeff Johnson295189b2012-06-20 16:38:30 -07004461 uPttMsgs *pMsgBody;
4462 VOS_STATUS status;
4463 int macAddr[VOS_MAC_ADDRESS_LEN];
4464 v_U8_t *pMacAddress;
4465 v_U8_t ii;
4466 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4467
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304468 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004469 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304470 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4471 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004472 return VOS_STATUS_E_FAILURE;
4473 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304474 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004475 init_completion(&pHddCtx->ftm.ftm_comp_var);
4476 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4477 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4478
4479 pMsgBody = &pMsgBuf->msgBody;
4480 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4481
4482 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004483 if (6 != 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]))
4484 {
4485 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4486 "Invalid MacAddress Input %s", buf);
4487 return VOS_STATUS_E_FAILURE;
4488 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004489
Arif Hussain24bafea2013-11-15 15:10:03 -08004490 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4491 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004492
4493
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004494 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004495
4496 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4497 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4498
4499
Arif Hussain24bafea2013-11-15 15:10:03 -08004500 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4501 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004502 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4503
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304504 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004505 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304506 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4507 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004508 status = VOS_STATUS_E_FAILURE;
4509 goto done;
4510 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304511 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4512 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004513
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304514 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004515 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304516 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4517 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004518 status = VOS_STATUS_E_FAILURE;
4519 goto done;
4520 }
4521
Arif Hussain6d2a3322013-11-17 19:50:10 -08004522 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004523
4524 init_completion(&pHddCtx->ftm.ftm_comp_var);
4525 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4526
4527 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4528 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4529
4530 pMsgBody = &pMsgBuf->msgBody;
4531
4532 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4533
4534 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4535
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304536 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004537 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304538 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4539 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004540 status = VOS_STATUS_E_FAILURE;
4541 goto done;
4542 }
4543
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304544 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4545 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004546done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004547
4548 return VOS_STATUS_SUCCESS;
4549}
4550
4551/* set param sub-ioctls */
4552static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4553 union iwreq_data *wrqu, char *extra)
4554{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004555 int ret,sub_cmd;
4556 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004557 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004558 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004559 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004560
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004561 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004562 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004563 length = wrqu->data.length;
4564 sub_cmd = wrqu->data.flags;
4565 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4566
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004567 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4568 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4569 * odd number which assigns set_args to zero.we assisgn memory using
4570 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004571 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004572 param = kzalloc(length + 1, GFP_KERNEL);
4573 if (!param)
4574 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004575
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004576 if (copy_from_user(param, pointer, length))
4577 {
4578 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4579 "%s:Failed to get user data %s", __func__, param);
4580
4581 ret = -EINVAL;
4582 goto OUT;
4583 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004584
4585 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4586 "%s: Received length %d", __func__, length);
4587
4588 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004589 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004590
4591 switch(sub_cmd)
4592 {
4593 case WE_SET_MAC_ADDRESS:
4594 {
4595
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004596 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004597 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004598
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004599 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004600
4601 if(status != VOS_STATUS_SUCCESS)
4602 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004603 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004604 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004605
Jeff Johnson295189b2012-06-20 16:38:30 -07004606 ret = -EINVAL;
4607 }
4608
Wilson Yang7c471652013-12-20 16:36:44 -08004609 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004610 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004611 case WE_SET_TX_RATE:
4612 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004613 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004614
4615 if(status != VOS_STATUS_SUCCESS)
4616 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004617 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004618 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004619
4620 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004621 }
4622
4623 break;
Wilson Yang7c471652013-12-20 16:36:44 -08004624 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004625 default:
4626 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004627 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004628 ret = -EINVAL;
4629 break;
4630 }
4631 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004632
4633OUT:
4634 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004635 return ret;
4636}
4637
4638static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4639 union iwreq_data *wrqu, char *extra)
4640{
4641 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4642 int *value = (int *)extra;
4643 int sub_cmd = value[0];
4644 int set_value = value[1];
4645 int ret = 0; /* success */
4646 VOS_STATUS status;
4647
4648 switch(sub_cmd)
4649 {
4650 case WE_FTM_ON_OFF:
4651 {
4652 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4653
4654 if(status != VOS_STATUS_SUCCESS)
4655 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004656 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004657 ret = -EINVAL;
4658 }
4659
4660 break;
4661 }
4662
4663 case WE_TX_PKT_GEN:
4664 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4665
4666 if(status != VOS_STATUS_SUCCESS)
4667 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004668 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004669 ret = -EINVAL;
4670 }
4671 break;
4672
4673 case WE_SET_TX_IFS:
4674 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4675
4676 if(status != VOS_STATUS_SUCCESS)
4677 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004678 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004679 ret = -EINVAL;
4680 }
4681 break;
4682
4683 case WE_SET_TX_PKT_CNT:
4684 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4685
4686 if(status != VOS_STATUS_SUCCESS)
4687 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004688 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004689 ret = -EINVAL;
4690 }
4691 break;
4692
4693 case WE_SET_TX_PKT_LEN:
4694 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4695
4696 if(status != VOS_STATUS_SUCCESS)
4697 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004698 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004699 ret = -EINVAL;
4700 }
4701 break;
4702
4703 case WE_SET_CHANNEL:
4704 {
4705 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4706
4707 if(status != VOS_STATUS_SUCCESS)
4708 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004709 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004710 ret = -EINVAL;
4711 }
4712 break;
4713 }
4714 case WE_SET_TX_POWER:
4715 {
4716 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4717
4718 if(status != VOS_STATUS_SUCCESS)
4719 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004720 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004721 ret = -EINVAL;
4722 }
4723 break;
4724 }
4725 case WE_CLEAR_RX_PKT_CNT:
4726 {
4727 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4728
4729 if(status != VOS_STATUS_SUCCESS)
4730 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004731 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004732 ret = -EINVAL;
4733 }
4734 break;
4735 }
4736 case WE_RX:
4737 {
4738 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4739
4740 if(status != VOS_STATUS_SUCCESS)
4741 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004742 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004743 ret = -EINVAL;
4744 }
4745 break;
4746 }
4747 case WE_ENABLE_CHAIN:
4748 {
4749 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4750
4751 if(status != VOS_STATUS_SUCCESS)
4752 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004753 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004754 ret = -EINVAL;
4755 }
4756 break;
4757 }
4758
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304759 case WE_SET_PWR_CNTL_MODE:
4760 {
4761 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4762 if (status != VOS_STATUS_SUCCESS)
4763 {
4764 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4765 status);
4766 ret = -EINVAL;
4767 }
4768 break;
4769 }
4770
4771 case WE_ENABLE_DPD:
4772 {
4773 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4774 if (status != VOS_STATUS_SUCCESS)
4775 {
4776 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4777 ret = -EINVAL;
4778 }
4779 break;
4780 }
4781
4782 case WE_SET_CB:
4783 {
4784 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4785 if (status != VOS_STATUS_SUCCESS)
4786 {
4787 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4788 ret = -EINVAL;
4789 }
4790 break;
4791 }
4792
Jeff Johnson295189b2012-06-20 16:38:30 -07004793 default:
4794 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004795 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004796 sub_cmd, set_value);
4797 break;
4798 }
4799 }
4800
4801 return ret;
4802}
4803
4804/* get param sub-ioctls */
4805static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4806 union iwreq_data *wrqu, char *extra)
4807{
4808 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4809 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004810 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004811 VOS_STATUS status;
4812
4813 switch (value[0])
4814 {
4815 case WE_GET_CHANNEL:
4816 {
4817 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4818
4819 if(status != VOS_STATUS_SUCCESS)
4820 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004821 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004822 ret = -EINVAL;
4823 }
4824 break;
4825 }
4826 case WE_GET_TX_POWER:
4827 {
4828 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4829
4830 if(status != VOS_STATUS_SUCCESS)
4831 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004832 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004833 ret = -EINVAL;
4834 }
4835 break;
4836 }
4837 case WE_GET_RX_PKT_CNT:
4838 {
4839 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4840
4841 if(status != VOS_STATUS_SUCCESS)
4842 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004843 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004844 ret = -EINVAL;
4845 }
4846 break;
4847 }
4848 default:
4849 {
4850 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
4851 break;
4852 }
4853 }
4854
4855 return ret;
4856}
4857
4858static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
4859 union iwreq_data *wrqu, char *extra)
4860{
4861 int sub_cmd = wrqu->data.flags;
4862 VOS_STATUS status;
4863 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4864
4865 switch(sub_cmd)
4866 {
4867 case WE_GET_MAC_ADDRESS:
4868 {
4869 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
4870
4871 if(status != VOS_STATUS_SUCCESS)
4872 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004873 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004874 return -EINVAL;
4875 }
4876 wrqu->data.length = strlen(extra)+1;
4877 break;
4878 }
4879 case WE_GET_TX_RATE:
4880 {
4881 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
4882
4883 if(status != VOS_STATUS_SUCCESS)
4884 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004885 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004886 return -EINVAL;
4887 }
4888
4889 wrqu->data.length = strlen(extra)+1;
4890 break;
4891 }
4892 case WE_GET_FTM_VERSION:
4893 {
4894 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
4895
4896 if(status != VOS_STATUS_SUCCESS)
4897 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004898 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004899 return -EINVAL;
4900 }
4901 wrqu->data.length = strlen(extra)+1;
4902 break;
4903 }
4904 case WE_GET_FTM_STATUS:
4905 {
4906 status = wlan_ftm_priv_get_status(pAdapter, extra);
4907
4908 if(status != VOS_STATUS_SUCCESS)
4909 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004910 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004911 return -EINVAL;
4912 }
4913
4914 wrqu->data.length = strlen(extra)+1;
4915 break;
4916 }
4917 case WE_GET_RX_RSSI:
4918 {
4919 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
4920
4921 if(status != VOS_STATUS_SUCCESS)
4922 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004923 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004924 return -EINVAL;
4925 }
4926
4927 wrqu->data.length = strlen(extra)+1;
4928 break;
4929 }
4930 default:
4931 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004932 hddLog(LOGE, "Invalid IOCTL command %d", sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07004933 break;
4934 }
4935 }
4936
4937 return 0;
4938}
Jeff Johnson295189b2012-06-20 16:38:30 -07004939
4940VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
4941{
Jeff Johnson88ba7742013-02-27 14:36:02 -08004942#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07004943 tAniHdr *wmsg = NULL;
4944 v_U8_t *pBuf;
4945 hdd_context_t *pHddCtx = NULL;
4946 v_CONTEXT_t pVosContext= NULL;
4947
4948 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
4949 if(pBuf == NULL)
4950 {
4951 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
4952 return VOS_STATUS_E_NOMEM;
4953 }
4954 wmsg = (tAniHdr*)pBuf;
4955 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
4956 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
4957 wmsg->length = FTM_SWAP16(wmsg->length);
4958 pBuf += sizeof(tAniHdr);
4959
4960 /*Get the global context */
4961 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4962
4963 /*Get the Hdd Context */
4964 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
4965 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
4966
4967 /* EfS command Code */
4968 *(v_U32_t*)pBuf = 0x000000EF;
4969
4970 pBuf += sizeof(v_U32_t);
4971
4972 memcpy(pBuf, pData,data_len);
4973
4974 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
4975 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
4976
Arif Hussain6d2a3322013-11-17 19:50:10 -08004977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004978 vos_mem_free((v_VOID_t*)wmsg);
4979 return VOS_STATUS_E_FAILURE;
4980 }
4981 }
4982 else {
4983 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
4984
Arif Hussain6d2a3322013-11-17 19:50:10 -08004985 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004986 vos_mem_free((v_VOID_t*)wmsg);
4987 return VOS_STATUS_E_FAILURE;
4988 }
4989 }
4990
4991 vos_mem_free((v_VOID_t*)wmsg);
4992#endif //FTM and ANDROID
4993
4994 return VOS_STATUS_SUCCESS;
4995}
4996
Jeff Johnson295189b2012-06-20 16:38:30 -07004997/* action sub-ioctls */
4998static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
4999 union iwreq_data *wrqu, char *extra)
5000{
5001 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005002 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005003
5004 switch (sub_cmd)
5005 {
5006 case WE_SET_NV_DEFAULTS:
5007 {
5008 v_U8_t *pu8buf,*pTempBuf;
5009 v_U16_t size;
5010 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005011 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005012 pu8buf = vos_mem_malloc(size);
5013 if(pu8buf == NULL)
5014 {
5015 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5016 return VOS_STATUS_E_NOMEM;
5017 }
5018 memset(pu8buf,0,size);
5019 pTempBuf = pu8buf;
5020 pTempBuf += sizeof(v_U32_t);
5021 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5022
5023 wlan_write_to_efs(pu8buf,size);
5024 vos_mem_free(pu8buf);
5025 }
5026
5027 default:
5028 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005030 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5031 break;
5032 }
5033 }
5034
5035 return ret;
5036}
5037
Jeff Johnson295189b2012-06-20 16:38:30 -07005038static const iw_handler we_ftm_private[] = {
5039
5040 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5041 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5042 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5043 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5044 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07005045};
5046
5047/*Maximum command length can be only 15 */
5048static const struct iw_priv_args we_ftm_private_args[] = {
5049
5050 /* handlers for main ioctl */
5051 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5052 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5053 0,
5054 "" },
5055
5056 { WE_FTM_ON_OFF,
5057 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5058 0,
5059 "ftm" },
5060
5061 { WE_TX_PKT_GEN,
5062 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5063 0,
5064 "tx" },
5065
5066 { WE_SET_TX_IFS,
5067 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5068 0,
5069 "set_txifs" },
5070
5071 { WE_SET_TX_PKT_CNT,
5072 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5073 0,
5074 "set_txpktcnt" },
5075
5076 { WE_SET_TX_PKT_LEN,
5077 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5078 0,
5079 "set_txpktlen" },
5080
5081 { WE_SET_CHANNEL,
5082 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5083 0,
5084 "set_channel" },
5085
5086 { WE_SET_TX_POWER,
5087 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5088 0,
5089 "set_txpower" },
5090
5091 { WE_CLEAR_RX_PKT_CNT,
5092 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5093 0,
5094 "clr_rxpktcnt" },
5095
5096 { WE_RX,
5097 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5098 0,
5099 "rx" },
5100
5101 { WE_ENABLE_CHAIN,
5102 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5103 0,
5104 "ena_chain" },
5105
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305106 { WE_SET_PWR_CNTL_MODE,
5107 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5108 0,
5109 "pwr_cntl_mode" },
5110
5111 { WE_ENABLE_DPD,
5112 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5113 0,
5114 "ena_dpd" },
5115
5116 { WE_SET_CB,
5117 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5118 0,
5119 "set_cb" },
5120
Jeff Johnson295189b2012-06-20 16:38:30 -07005121 /* handlers for main ioctl */
5122 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5123 0,
5124 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5125 "" },
5126
5127 { WE_GET_CHANNEL,
5128 0,
5129 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5130 "get_channel" },
5131
5132 { WE_GET_TX_POWER,
5133 0,
5134 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5135 "get_txpower" },
5136
5137 { WE_GET_RX_PKT_CNT,
5138 0,
5139 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5140 "get_rxpktcnt" },
5141
5142 /* handlers for main ioctl */
5143 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5144 IW_PRIV_TYPE_CHAR| 512,
5145 0,
5146 "" },
5147
5148 { WE_SET_MAC_ADDRESS,
5149 IW_PRIV_TYPE_CHAR| 512,
5150 0,
5151 "set_mac_address" },
5152
5153 { WE_SET_TX_RATE,
5154 IW_PRIV_TYPE_CHAR | 512,
5155 0,
5156 "set_txrate" },
5157
5158 /* handlers for main ioctl */
5159 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5160 0,
5161 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5162 "" },
5163
5164 { WE_GET_MAC_ADDRESS,
5165 0,
5166 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5167 "get_mac_address" },
5168
5169 { WE_GET_FTM_VERSION,
5170 0,
5171 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5172 "ftm_version" },
5173
5174 { WE_GET_TX_RATE,
5175 0,
5176 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5177 "get_txrate" },
5178
5179 { WE_GET_FTM_STATUS,
5180 0,
5181 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5182 "get_status" },
5183
5184 { WE_GET_RX_RSSI,
5185 0,
5186 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5187 "get_rx_rssi" },
5188
Jeff Johnson295189b2012-06-20 16:38:30 -07005189 /* handlers for main ioctl */
5190 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5191 0,
5192 0,
5193 "" },
5194
5195 /* handlers for sub-ioctl */
5196 { WE_SET_NV_DEFAULTS,
5197 0,
5198 0,
5199 "set_nv_defaults" },
5200
5201};
5202
5203const struct iw_handler_def we_ftm_handler_def = {
5204 .num_standard = 0,
5205 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5206 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5207
5208 .standard = (iw_handler *)NULL,
5209 .private = (iw_handler *)we_ftm_private,
5210 .private_args = we_ftm_private_args,
5211 .get_wireless_stats = NULL,
5212};
5213
5214static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5215{
5216
5217 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5218
5219 // Zero the memory. This zeros the profile structure.
5220 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005221
Jeff Johnson295189b2012-06-20 16:38:30 -07005222 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5223
5224 return 0;
5225}
5226
Jeff Johnson295189b2012-06-20 16:38:30 -07005227
5228VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5229{
Jeff Johnson295189b2012-06-20 16:38:30 -07005230 ftm_rsp_msg_t *pFtmMsgRsp;
5231
5232 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5233 hdd_context_t *pHddCtx;
5234 v_CONTEXT_t pVosContext= NULL;
5235
5236 ENTER();
5237
5238 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5239
5240 if (!message )
5241 {
5242 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5243 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5244 return VOS_STATUS_E_INVAL;
5245 }
5246 /*Get the global context */
5247 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5248
5249 /*Get the Hdd Context */
5250 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5251
5252 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5253
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305254 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005255 complete(&pHddCtx->ftm.ftm_comp_var);
5256 }
5257 else {
5258 /*Response length to Ptt App*/
5259 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5260
5261 /*Ptt App expects the response length in LE */
5262 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5263
5264 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005265 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005266 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5267
5268 /*Copy the message*/
5269 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5270
5271 /*Update the error code*/
5272 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5273
5274 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5275
5276 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5277 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005278 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005279 return VOS_STATUS_E_FAILURE;
5280 }
5281 }
5282 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005283 return VOS_STATUS_SUCCESS;
5284
5285}