blob: 9dea1951191c1a442605fa5cb067cf0a24bcc767 [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
1206
1207 VOS_ASSERT( NULL != pVosContext->pWDAContext);
1208
1209 /* call macPreStart */
1210 vStatus = macPreStart(pVosContext->pMACContext);
1211 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1212 {
1213 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1214 "Failed at macPreStart ");
1215 return VOS_STATUS_E_FAILURE;
1216 }
1217
1218 /* call ccmStart */
1219 ccmStart(pVosContext->pMACContext);
1220
1221 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001222 vos_event_reset(&pVosContext->wdaCompleteEvent);
1223
Jeff Johnson295189b2012-06-20 16:38:30 -07001224
1225 /*call WDA pre start*/
1226 vStatus = WDA_preStart(pVosContext);
1227 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1228 {
1229 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1230 "Failed to WDA prestart ");
1231 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1232 ccmStop(pVosContext->pMACContext);
1233 VOS_ASSERT(0);
1234 return VOS_STATUS_E_FAILURE;
1235 }
1236
1237 /* Need to update time out of complete */
1238 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1239 if ( vStatus != VOS_STATUS_SUCCESS )
1240 {
1241 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1242 {
1243 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001244 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001245 }
1246 else
1247 {
1248 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001249 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 }
1251 VOS_ASSERT( 0 );
1252 return VOS_STATUS_E_FAILURE;
1253 }
1254
1255 return VOS_STATUS_SUCCESS;
1256}
Jeff Johnson295189b2012-06-20 16:38:30 -07001257
1258/**---------------------------------------------------------------------------
1259
1260 \brief wlan_hdd_ftm_open() -
1261
1262 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1263
1264 \param - pAdapter - Pointer HDD Context.
1265
1266 \return - 0 for success, non zero for failure
1267
1268 --------------------------------------------------------------------------*/
1269
1270int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1271{
1272 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1273 pVosContextType pVosContext= NULL;
1274 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001275
Jeff Johnson295189b2012-06-20 16:38:30 -07001276 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1277 "%s: Opening VOSS", __func__);
1278
1279 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1280
1281 if (NULL == pVosContext)
1282 {
1283 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301284 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001285 VOS_ASSERT(0);
1286 goto err_vos_status_failure;
1287 }
1288
1289 // Open VOSS
1290 vStatus = wlan_ftm_vos_open( pVosContext, 0);
1291
1292 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1293 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301294 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001295 goto err_vos_status_failure;
1296 }
1297
Jeff Johnson295189b2012-06-20 16:38:30 -07001298 /*
1299 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1300 */
1301 /* Save the hal context in Adapter */
1302 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001303
1304 if ( NULL == pHddCtx->hHal )
1305 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301306 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001307 goto err_sal_close;
1308 }
1309
1310 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1311 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1312 if( NULL == pAdapter )
1313 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301314 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001315 goto err_adapter_open_failure;
1316 }
1317
1318 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1319 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301320 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001321 goto err_sal_close;
1322 }
1323
1324 //Initialize the nlink service
1325 if(nl_srv_init() != 0)
1326 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301327 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001328 goto err_ftm_register_wext_close;
1329 }
1330
Leo Chang9e646082013-08-02 11:20:21 -07001331#ifdef WLAN_KD_READY_NOTIFIER
1332 pHddCtx->kd_nl_init = 1;
1333#endif /* WLAN_KD_READY_NOTIFIER */
1334
Jeff Johnson295189b2012-06-20 16:38:30 -07001335#ifdef PTT_SOCK_SVC_ENABLE
1336 //Initialize the PTT service
1337 if(ptt_sock_activate_svc(pHddCtx) != 0)
1338 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301339 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001340 goto err_nl_srv_init;
1341 }
1342#endif
1343 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1344 {
1345 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1346 goto err_nl_srv_init;
1347 }
1348#ifdef HDD_SESSIONIZE
1349 //Turn off carrier state
1350 netif_carrier_off(pAdapter->dev);
1351
1352 //Stop the Interface TX queue. Just being safe
1353 netif_tx_disable(pAdapter->dev);
1354#endif
1355
Jeff Johnson295189b2012-06-20 16:38:30 -07001356 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1357 pHddCtx->ftm.targetNVTableSize = 0;
1358 pHddCtx->ftm.targetNVTablePointer = NULL;
1359 pHddCtx->ftm.processedNVTableSize = 0;
1360 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1361 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1362 {
1363 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301364 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001365 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001366 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001367 }
1368 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001369
1370 _ftm_status_init();
1371 /* Initialize the ftm vos event */
1372 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1373 {
1374 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301375 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001376 VOS_ASSERT(0);
1377 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1378 goto err_nl_srv_init;
1379 }
1380
1381 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1382
1383 return VOS_STATUS_SUCCESS;
1384
1385err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001386#ifdef WLAN_KD_READY_NOTIFIER
1387nl_srv_exit(pHddCtx->ptt_pid);
1388#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001389nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001390#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001391err_ftm_register_wext_close:
1392hdd_UnregisterWext(pAdapter->dev);
1393
1394err_adapter_open_failure:
1395hdd_close_all_adapters( pHddCtx );
1396
1397err_sal_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001398
1399err_vos_status_failure:
1400
1401 return VOS_STATUS_E_FAILURE;
1402}
1403
1404
1405
1406int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1407{
1408 VOS_STATUS vosStatus;
1409 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1410
1411 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1412 ENTER();
1413 if(pAdapter == NULL)
1414 {
1415 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1416 return VOS_STATUS_E_NOMEM;
1417 }
1418
Leo Chang4e8183f2013-05-31 15:38:34 -07001419 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1420 {
1421 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1422 "%s: Ftm has been started. stopping ftm", __func__);
1423 wlan_ftm_stop(pHddCtx);
1424 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001425
1426 //Assert Deep sleep signal now to put Libra HW in lowest power state
1427 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
1428 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1429
1430 //Vote off any PMIC voltage supplies
1431 vos_chipPowerDown(NULL, NULL, NULL);
1432
1433 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1434
Leo Chang59cdc7e2013-07-10 10:08:21 -07001435#ifdef WLAN_KD_READY_NOTIFIER
1436 nl_srv_exit(pHddCtx->ptt_pid);
1437#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001438 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001439#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001440 //TODO----------
1441 //Deregister the device with the kernel
1442 hdd_UnregisterWext(pAdapter->dev);
1443
1444 hdd_close_all_adapters( pHddCtx );
1445#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001446 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001447 {
1448 unregister_netdev(pAdapter->dev);
1449 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1450 }
1451#endif
1452 //-----------------
1453
1454 vosStatus = vos_sched_close( vosContext );
1455 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1456 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1457 "%s: Failed to close VOSS Scheduler",__func__);
1458 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1459 }
1460
1461 //Close VOSS
1462 wlan_ftm_vos_close(vosContext);
1463
1464
1465 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1466 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1467 {
1468 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1469 "%s: Failed to destroy ftm_vos Event",__func__);
1470 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1471 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001472 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001473
1474 //Free up dynamically allocated members inside HDD Adapter
1475 kfree(pHddCtx->cfg_ini);
1476 pHddCtx->cfg_ini= NULL;
1477
1478 return 0;
1479
1480}
1481
1482/**---------------------------------------------------------------------------
1483
1484 \brief wlan_ftm_send_response() -
1485
1486 The function sends the response to the ptt socket application running in user space.
1487
1488 \param - pAdapter - Pointer HDD Context.
1489
1490 \return - 0 for success, non zero for failure
1491
1492 --------------------------------------------------------------------------*/
1493
1494static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1495
1496 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
1497
Arif Hussain6d2a3322013-11-17 19:50:10 -08001498 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 -07001499 return VOS_STATUS_E_FAILURE;
1500 }
1501 return VOS_STATUS_SUCCESS;
1502}
1503
1504/**---------------------------------------------------------------------------
1505
1506 \brief wlan_hdd_ftm_start() -
1507
1508 This function gets called when the FTM start commands received from the ptt socket application and
1509 it starts the following modules.
1510 1) SAL Start.
1511 2) BAL Start.
1512 3) MAC Start to download the firmware.
1513
1514
1515 \param - pAdapter - Pointer HDD Context.
1516
1517 \return - 0 for success, non zero for failure
1518
1519 --------------------------------------------------------------------------*/
1520
1521static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1522{
1523 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1524 tSirRetStatus sirStatus = eSIR_SUCCESS;
1525 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1526 tHalMacStartParameters halStartParams;
1527
1528 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1529 {
1530 return VOS_STATUS_SUCCESS;
1531 }
1532
1533 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1534 "%s: Starting Libra SW", __func__);
1535
1536 /* We support only one instance for now ...*/
1537 if (pVosContext == NULL)
1538 {
1539 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001540 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001541 goto err_status_failure;
1542 }
1543
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001544
Jeff Johnson295189b2012-06-20 16:38:30 -07001545 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001546 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001547 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001548 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 goto err_status_failure;
1550 }
1551
Jeff Johnson295189b2012-06-20 16:38:30 -07001552 /*
1553 Prima needs to start the WDA correctly instead of BAL and SAL
1554 */
1555
1556 /* Vos preStart is calling */
1557 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1558 {
1559 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1560 goto err_status_failure;
1561 }
1562
1563
1564 vStatus = WDA_NVDownload_Start(pVosContext);
1565
1566 if ( vStatus != VOS_STATUS_SUCCESS )
1567 {
1568 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1569 "%s: Failed to start NV Download",__func__);
1570 return VOS_STATUS_E_FAILURE;
1571 }
1572
1573 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1574
1575 if ( vStatus != VOS_STATUS_SUCCESS )
1576 {
1577 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1578 {
1579 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001580 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001581 }
1582 else
1583 {
1584 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001585 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001586 }
1587 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301588 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001589 }
1590
1591 vStatus = WDA_start(pVosContext);
1592 if (vStatus != VOS_STATUS_SUCCESS)
1593 {
1594 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1595 "%s: Failed to start WDA",__func__);
1596 goto err_status_failure;
1597 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001598
Jeff Johnson295189b2012-06-20 16:38:30 -07001599
1600 /* Start the MAC */
1601 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1602
Jeff Johnson295189b2012-06-20 16:38:30 -07001603
1604 halStartParams.driverType = eDRIVER_TYPE_MFG;
1605
1606 /* Start the MAC */
1607 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1608
Jeff Johnson295189b2012-06-20 16:38:30 -07001609
1610 if (eSIR_SUCCESS != sirStatus)
1611 {
1612 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1613 "%s: Failed to start MAC", __func__);
1614
Jeff Johnson295189b2012-06-20 16:38:30 -07001615 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001616 }
1617
1618 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1619 "%s: MAC correctly started",__func__);
1620
Jeff Johnson295189b2012-06-20 16:38:30 -07001621
1622 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1623
1624 return VOS_STATUS_SUCCESS;
1625
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001626err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001627 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1628 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1629 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1630 if(vStatus != VOS_STATUS_SUCCESS)
1631 {
1632 if(vStatus == VOS_STATUS_E_TIMEOUT)
1633 {
1634 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001635 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001636
1637 }
1638 else
1639 {
1640 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001641 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001642 }
1643 VOS_ASSERT(0);
1644 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001645
1646err_status_failure:
1647
1648 return VOS_STATUS_E_FAILURE;
1649
1650}
1651
1652
1653static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1654{
1655 VOS_STATUS vosStatus;
1656
1657 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1658 {
1659 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1660 return VOS_STATUS_E_FAILURE;
1661 }
1662
1663 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1664 {
1665 /* STOP MAC only */
1666 v_VOID_t *hHal;
1667 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1668 if (NULL == hHal)
1669 {
1670 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1671 "%s: NULL hHal", __func__);
1672 }
1673 else
1674 {
1675 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1676 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1677 {
1678 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1679 "%s: Failed to stop SYS", __func__);
1680 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1681 }
1682 }
1683
Jeff Johnson295189b2012-06-20 16:38:30 -07001684
Jeff Johnson295189b2012-06-20 16:38:30 -07001685 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001686
1687 }
1688 return WLAN_FTM_SUCCESS;
1689}
1690
Jeff Johnson295189b2012-06-20 16:38:30 -07001691/**---------------------------------------------------------------------------
1692
1693 \brief wlan_hdd_ftm_get_nv_table() -
1694 Get Specific NV table
1695
1696 \param - ftmCmd - Pointer FTM Commad Buffer
1697
1698 \return - int
1699 -1, Process Host command fail, vail out
1700 1, Process Host command success
1701
1702 --------------------------------------------------------------------------*/
1703int wlan_hdd_ftm_get_nv_table
1704(
1705 hdd_context_t *pHddCtx,
1706 tPttMsgbuffer *ftmCmd
1707)
1708{
1709 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1710 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1711 v_SIZE_t nvSize;
1712 sHalNv *nvContents = NULL;
1713
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001714
Jeff Johnson295189b2012-06-20 16:38:30 -07001715 if (NULL == pHddCtx)
1716 {
1717 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1718 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001719 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001720 }
1721
1722 /* Test first chunk of NV table */
1723 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1724 (0 == pHddCtx->ftm.processedNVTableSize))
1725 {
1726 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1727 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1728 {
1729 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1730 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001731 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001732 }
1733
1734 switch (nvTable->nvTable)
1735 {
1736 case NV_TABLE_RATE_POWER_SETTINGS:
1737 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1738 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1739 break;
1740
1741 case NV_TABLE_REGULATORY_DOMAINS:
1742 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1743 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1744 break;
1745
1746 case NV_TABLE_DEFAULT_COUNTRY:
1747 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1748 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1749 break;
1750
1751 case NV_TABLE_TPC_POWER_TABLE:
1752 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1753 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1754 break;
1755
1756 case NV_TABLE_TPC_PDADC_OFFSETS:
1757 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1758 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1759 break;
1760
1761 case NV_TABLE_VIRTUAL_RATE:
1762 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1763 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1764 break;
1765
1766 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1767 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1768 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1769 break;
1770
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001771 case NV_TABLE_HW_CAL_VALUES:
1772 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1773 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1774 break;
1775
1776 case NV_TABLE_FW_CONFIG:
1777 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1778 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001779 break;
1780
1781 case NV_TABLE_ANTENNA_PATH_LOSS:
1782 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1783 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1784 break;
1785
1786 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1787 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1788 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1789 break;
1790
1791 default:
1792 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1793 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001794 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001795 break;
1796 }
1797
1798 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1799 {
1800 /* Invalid table size, discard and initialize data */
1801 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001802 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001803 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001804 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001805 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1806 pHddCtx->ftm.targetNVTableSize = 0;
1807 pHddCtx->ftm.processedNVTableSize = 0;
1808 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001809 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001810 }
1811
1812 /* Set Current Processing NV table type */
1813 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1814 /* Copy target NV table value into temp context buffer */
1815 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1816 pHddCtx->ftm.targetNVTablePointer,
1817 pHddCtx->ftm.targetNVTableSize);
1818
1819 }
1820
1821 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1822 {
1823 /* Invalid table type */
1824 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1825 "Invalid NV Table, now Processing %d, not %d",
1826 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1827 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1828 pHddCtx->ftm.targetNVTableSize = 0;
1829 pHddCtx->ftm.processedNVTableSize = 0;
1830 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001831
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001832 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001833 }
1834
1835 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001836 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001837 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1838 nvTable->chunkSize);
1839 /* Update processed pointer to prepare next chunk copy */
1840 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1841
1842 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1843 {
1844 /* Finished to process last chunk of data, initialize buffer */
1845 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1846 pHddCtx->ftm.targetNVTableSize = 0;
1847 pHddCtx->ftm.processedNVTableSize = 0;
1848 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1849 }
1850
1851 return 1;
1852}
1853
1854/**---------------------------------------------------------------------------
1855
1856 \brief wlan_hdd_ftm_set_nv_table() -
1857 Set Specific NV table as given
1858
1859 \param - ftmCmd - Pointer FTM Commad Buffer
1860
1861 \return - int
1862 -1, Process Host command fail, vail out
1863 1, Process Host command success
1864
1865 --------------------------------------------------------------------------*/
1866int wlan_hdd_ftm_set_nv_table
1867(
1868 hdd_context_t *pHddCtx,
1869 tPttMsgbuffer *ftmCmd
1870)
1871{
1872 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1873 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1874 v_SIZE_t nvSize;
1875 sHalNv *nvContents = NULL;
1876
1877 if (NULL == pHddCtx)
1878 {
1879 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1880 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001881 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001882 }
1883
1884 /* Test first chunk of NV table */
1885 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1886 (0 == pHddCtx->ftm.processedNVTableSize))
1887 {
1888 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1889 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1890 {
1891 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1892 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001893 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001894 }
1895
1896 switch (nvTable->nvTable)
1897 {
1898 case NV_TABLE_RATE_POWER_SETTINGS:
1899 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1900 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1901 break;
1902
1903 case NV_TABLE_REGULATORY_DOMAINS:
1904 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1905 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1906 break;
1907
1908 case NV_TABLE_DEFAULT_COUNTRY:
1909 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1910 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1911 break;
1912
1913 case NV_TABLE_TPC_POWER_TABLE:
1914 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1915 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1916 break;
1917
1918 case NV_TABLE_TPC_PDADC_OFFSETS:
1919 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1920 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1921 break;
1922
1923 case NV_TABLE_VIRTUAL_RATE:
1924 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1925 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1926 break;
1927
1928 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1929 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1930 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1931 break;
1932
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001933 case NV_TABLE_HW_CAL_VALUES:
1934 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1935 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1936 break;
1937
1938 case NV_TABLE_FW_CONFIG:
1939 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1940 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001941 break;
1942
1943 case NV_TABLE_ANTENNA_PATH_LOSS:
1944 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1945 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1946 break;
1947
1948 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1949 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1950 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1951 break;
1952
1953 default:
1954 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1955 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001956 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001957 break;
1958 }
1959
1960 /* Set Current Processing NV table type */
1961 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1962 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1963 {
1964 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1965 "Invalid Table Size %d", nvTable->tableSize);
1966 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1967 pHddCtx->ftm.targetNVTableSize = 0;
1968 pHddCtx->ftm.processedNVTableSize = 0;
1969 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001970 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001971 }
1972 }
1973
1974 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1975 {
1976 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1977 "Invalid NV Table, now Processing %d, not %d",
1978 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1979 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1980 pHddCtx->ftm.targetNVTableSize = 0;
1981 pHddCtx->ftm.processedNVTableSize = 0;
1982 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001983 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001984 }
1985 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001986 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001987 nvTable->chunkSize);
1988
1989 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1990 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1991 {
1992 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
1993 pHddCtx->ftm.tempNVTableBuffer,
1994 pHddCtx->ftm.targetNVTableSize);
1995 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1996 pHddCtx->ftm.targetNVTableSize = 0;
1997 pHddCtx->ftm.processedNVTableSize = 0;
1998 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1999 }
2000
2001 return 1;
2002}
2003
2004/**---------------------------------------------------------------------------
2005
2006 \brief wlan_hdd_ftm_blank_nv() -
2007 Set all NV table value as default
2008
2009 \param - ftmCmd - Pointer FTM Commad Buffer
2010
2011 \return - int
2012 -1, Process Host command fail, vail out
2013 0, Process Host command success
2014
2015 --------------------------------------------------------------------------*/
2016int wlan_hdd_ftm_blank_nv_table
2017(
2018 tPttMsgbuffer *ftmCmd
2019)
2020{
2021 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2022 v_SIZE_t nvSize;
2023 v_SIZE_t itemSize;
2024 sHalNv *nvContents = NULL;
2025
2026 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2027 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2028 {
2029 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2030 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002031 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002032 }
2033
2034 itemSize = sizeof(nvContents->tables.pwrOptimum);
2035 memcpy(&nvContents->tables.pwrOptimum,
2036 &nvDefaults.tables.pwrOptimum,
2037 itemSize);
2038
2039 itemSize = sizeof(nvContents->tables.regDomains);
2040 memcpy(&nvContents->tables.regDomains,
2041 &nvDefaults.tables.regDomains,
2042 itemSize);
2043
2044 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2045 memcpy(&nvContents->tables.defaultCountryTable,
2046 &nvDefaults.tables.defaultCountryTable,
2047 itemSize);
2048
2049 itemSize = sizeof(nvContents->tables.plutCharacterized);
2050 memcpy(&nvContents->tables.plutCharacterized[0],
2051 &nvDefaults.tables.plutCharacterized[0],
2052 itemSize);
2053
2054 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2055 memcpy(&nvContents->tables.plutPdadcOffset[0],
2056 &nvDefaults.tables.plutPdadcOffset[0],
2057 itemSize);
2058
2059 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2060 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
2061 &nvDefaults.tables.pwrOptimum_virtualRate[0],
2062 itemSize);
2063
2064 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2065 memcpy(&nvContents->tables.rssiChanOffsets[0],
2066 &nvDefaults.tables.rssiChanOffsets[0],
2067 itemSize);
2068
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002069 itemSize = sizeof(nvContents->tables.hwCalValues);
2070 memcpy(&nvContents->tables.hwCalValues,
2071 &nvDefaults.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002072 itemSize);
2073
2074 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2075 memcpy(&nvContents->tables.antennaPathLoss[0],
2076 &nvDefaults.tables.antennaPathLoss[0],
2077 itemSize);
2078
2079 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2080 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
2081 &nvDefaults.tables.pktTypePwrLimits[0][0],
2082 itemSize);
2083
2084 return 1;
2085}
2086
2087/**---------------------------------------------------------------------------
2088
2089 \brief wlan_hdd_ftm_delete_nv_table() -
2090 Delete Specific NV table
2091
2092 \param - ftmCmd - Pointer FTM Commad Buffer
2093
2094 \return - int
2095 -1, Process Host command fail, vail out
2096 1, Process Host command success
2097
2098 --------------------------------------------------------------------------*/
2099int wlan_hdd_ftm_delete_nv_table
2100(
2101 tPttMsgbuffer *ftmCmd
2102)
2103{
2104 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2105 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2106 v_SIZE_t nvSize;
2107 v_SIZE_t itemSize;
2108 sHalNv *nvContents = NULL;
2109
2110 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2111 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2112 {
2113 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2114 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002115 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002116 }
2117
2118 switch (nvTable->nvTable)
2119 {
2120 case NV_TABLE_RATE_POWER_SETTINGS:
2121 itemSize = sizeof(nvContents->tables.pwrOptimum);
2122 memcpy(&nvContents->tables.pwrOptimum,
2123 &nvDefaults.tables.pwrOptimum,
2124 itemSize);
2125 break;
2126
2127 case NV_TABLE_REGULATORY_DOMAINS:
2128 itemSize = sizeof(nvContents->tables.regDomains);
2129 memcpy(&nvContents->tables.regDomains,
2130 &nvDefaults.tables.regDomains,
2131 itemSize);
2132 break;
2133
2134 case NV_TABLE_DEFAULT_COUNTRY:
2135 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2136 memcpy(&nvContents->tables.defaultCountryTable,
2137 &nvDefaults.tables.defaultCountryTable,
2138 itemSize);
2139 break;
2140
2141 case NV_TABLE_TPC_POWER_TABLE:
2142 itemSize = sizeof(nvContents->tables.plutCharacterized);
2143 memcpy(&nvContents->tables.plutCharacterized[0],
2144 &nvDefaults.tables.plutCharacterized[0],
2145 itemSize);
2146 break;
2147
2148 case NV_TABLE_TPC_PDADC_OFFSETS:
2149 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2150 memcpy(&nvContents->tables.plutPdadcOffset[0],
2151 &nvDefaults.tables.plutPdadcOffset[0],
2152 itemSize);
2153 break;
2154
2155 case NV_TABLE_VIRTUAL_RATE:
2156 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2157 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
2158 &nvDefaults.tables.pwrOptimum_virtualRate[0],
2159 itemSize);
2160 break;
2161
2162 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2163 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2164 memcpy(&nvContents->tables.rssiChanOffsets[0],
2165 &nvDefaults.tables.rssiChanOffsets[0],
2166 itemSize);
2167 break;
2168
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002169 case NV_TABLE_HW_CAL_VALUES:
2170 itemSize = sizeof(nvContents->tables.hwCalValues);
2171 memcpy(&nvContents->tables.hwCalValues,
2172 &nvDefaults.tables.hwCalValues,
2173 itemSize);
2174 break;
2175
2176 case NV_TABLE_FW_CONFIG:
2177 itemSize = sizeof(nvContents->tables.fwConfig);
2178 memcpy(&nvContents->tables.fwConfig,
2179 &nvDefaults.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002180 itemSize);
2181 break;
2182
2183 case NV_TABLE_ANTENNA_PATH_LOSS:
2184 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2185 memcpy(&nvContents->tables.antennaPathLoss[0],
2186 &nvDefaults.tables.antennaPathLoss[0],
2187 itemSize);
2188 break;
2189
2190 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2191 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2192 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
2193 &nvDefaults.tables.pktTypePwrLimits[0][0],
2194 itemSize);
2195 break;
2196
2197 default:
2198 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2199 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002200 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002201 break;
2202 }
2203
2204 return 1;
2205}
2206
2207/**---------------------------------------------------------------------------
2208
2209 \brief wlan_hdd_ftm_get_nv_field() -
2210 Get Specific NV field
2211
2212 \param - ftmCmd - Pointer FTM Commad Buffer
2213
2214 \return - int
2215 -1, Process Host command fail, vail out
2216 1, Process Host command success
2217
2218 --------------------------------------------------------------------------*/
2219int wlan_hdd_ftm_get_nv_field
2220(
2221 tPttMsgbuffer *ftmCmd
2222)
2223{
2224 sNvFields nvFieldDataBuffer;
2225 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2226 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2227 sHalNv *nvContents = NULL;
2228 v_SIZE_t nvSize;
2229
2230 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2231 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2232 {
2233 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2234 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002235 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002236 }
2237 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2238
2239 switch (nvField->nvField)
2240 {
2241 case NV_COMMON_PRODUCT_ID:
2242 memcpy((void *)&nvField->fieldData,
2243 &nvFieldDataBuffer.productId,
2244 sizeof(nvFieldDataBuffer.productId));
2245 break;
2246
2247 case NV_COMMON_PRODUCT_BANDS:
2248 memcpy((void *)&nvField->fieldData,
2249 &nvFieldDataBuffer.productBands,
2250 sizeof(nvFieldDataBuffer.productBands));
2251 break;
2252
2253 case NV_COMMON_NUM_OF_TX_CHAINS:
2254 memcpy((void *)&nvField->fieldData,
2255 &nvFieldDataBuffer.numOfTxChains,
2256 sizeof(nvFieldDataBuffer.numOfTxChains));
2257 break;
2258
2259 case NV_COMMON_NUM_OF_RX_CHAINS:
2260 memcpy((void *)&nvField->fieldData,
2261 &nvFieldDataBuffer.numOfRxChains,
2262 sizeof(nvFieldDataBuffer.numOfRxChains));
2263 break;
2264
2265 case NV_COMMON_MAC_ADDR:
2266 memcpy((void *)&nvField->fieldData,
2267 &nvFieldDataBuffer.macAddr[0],
2268 NV_FIELD_MAC_ADDR_SIZE);
2269 break;
2270
2271 case NV_COMMON_MFG_SERIAL_NUMBER:
2272 memcpy((void *)&nvField->fieldData,
2273 &nvFieldDataBuffer.mfgSN[0],
2274 NV_FIELD_MFG_SN_SIZE);
2275 break;
2276
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002277 case NV_COMMON_WLAN_NV_REV_ID:
2278 memcpy((void *)&nvField->fieldData,
2279 &nvFieldDataBuffer.wlanNvRevId,
2280 sizeof(nvFieldDataBuffer.wlanNvRevId));
2281 break;
2282
Jeff Johnson295189b2012-06-20 16:38:30 -07002283 case NV_COMMON_COUPLER_TYPE:
2284 memcpy((void *)&nvField->fieldData,
2285 &nvFieldDataBuffer.couplerType,
2286 sizeof(nvFieldDataBuffer.couplerType));
2287 break;
2288
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002289 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002290 {
2291 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2292 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2293
2294 nvEmbededStatus = vos_nv_isEmbeddedNV();
2295
2296 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2297 {
2298 // High bit is set to indicate embedded NV..
2299 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2300 }
2301
2302 memcpy((void *)&nvField->fieldData,
2303 &nvVersion,
2304 sizeof(nvFieldDataBuffer.nvVersion));
2305 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002306 break;
2307
Jeff Johnson295189b2012-06-20 16:38:30 -07002308 default:
2309 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2310 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002311 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002312 break;
2313 }
2314
2315 return 1;
2316}
2317
2318/**---------------------------------------------------------------------------
2319
2320 \brief wlan_hdd_ftm_set_nv_field() -
2321 Set Specific NV field
2322
2323 \param - ftmCmd - Pointer FTM Commad Buffer
2324
2325 \return - int
2326 -1, Process Host command fail, vail out
2327 1, Process Host command success
2328
2329 --------------------------------------------------------------------------*/
2330int wlan_hdd_ftm_set_nv_field
2331(
2332 tPttMsgbuffer *ftmCmd
2333)
2334{
2335 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2336 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2337 v_SIZE_t nvSize;
2338 sHalNv *nvContents = NULL;
2339 v_U8_t macLoop;
2340 v_U8_t *pNVMac;
2341 v_U8_t lastByteMAC;
2342
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002343
Jeff Johnson295189b2012-06-20 16:38:30 -07002344 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2345 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2346 {
2347 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2348 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002349 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002350 }
2351
2352 switch (nvField->nvField)
2353 {
2354 case NV_COMMON_PRODUCT_ID:
2355 memcpy(&nvContents->fields.productId,
2356 &nvField->fieldData,
2357 sizeof(nvContents->fields.productId));
2358 break;
2359
2360 case NV_COMMON_PRODUCT_BANDS:
2361 memcpy(&nvContents->fields.productBands,
2362 &nvField->fieldData,
2363 sizeof(nvContents->fields.productBands));
2364 break;
2365
2366 case NV_COMMON_NUM_OF_TX_CHAINS:
2367 memcpy(&nvContents->fields.numOfTxChains,
2368 &nvField->fieldData,
2369 sizeof(nvContents->fields.numOfTxChains));
2370 break;
2371
2372 case NV_COMMON_NUM_OF_RX_CHAINS:
2373 memcpy(&nvContents->fields.numOfRxChains,
2374 &nvField->fieldData,
2375 sizeof(nvContents->fields.numOfRxChains));
2376 break;
2377
2378 case NV_COMMON_MAC_ADDR:
2379 /* If Last byte is larger than 252 (0xFC), return Error,
2380 * Since 3MACs should be derived from first MAC */
2381 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002382 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002383 {
2384 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2385 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002386 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002387 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002388 }
2389
2390 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002391 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002392 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2393 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002394 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002395 lastByteMAC + macLoop;
2396 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002397 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002398 NV_FIELD_MAC_ADDR_SIZE);
2399 }
2400 break;
2401
2402 case NV_COMMON_MFG_SERIAL_NUMBER:
2403 memcpy(&nvContents->fields.mfgSN[0],
2404 &nvField->fieldData,
2405 NV_FIELD_MFG_SN_SIZE);
2406 break;
2407
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002408 case NV_COMMON_WLAN_NV_REV_ID:
2409 memcpy(&nvContents->fields.wlanNvRevId,
2410 &nvField->fieldData,
2411 sizeof(nvContents->fields.wlanNvRevId));
2412 break;
2413
Jeff Johnson295189b2012-06-20 16:38:30 -07002414 case NV_COMMON_COUPLER_TYPE:
2415 memcpy(&nvContents->fields.couplerType,
2416 &nvField->fieldData,
2417 sizeof(nvContents->fields.couplerType));
2418 break;
2419
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002420 case NV_COMMON_NV_VERSION:
2421 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2422 "Cannot modify NV version field %d", nvField->nvField);
2423 return -EIO;
2424 break;
2425
Jeff Johnson295189b2012-06-20 16:38:30 -07002426 default:
2427 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2428 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002429 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002430 break;
2431 }
2432
2433 return 1;
2434}
2435
2436/**---------------------------------------------------------------------------
2437
2438 \brief wlan_hdd_ftm_store_nv_table() -
2439 Store Cached NV information into Flash Memory, file
2440
2441 \param - ftmCmd - Pointer FTM Commad Buffer
2442
2443 \return - int
2444 -1, Process Host command fail, vail out
2445 0, Process Host command success
2446
2447 --------------------------------------------------------------------------*/
2448int wlan_hdd_ftm_store_nv_table
2449(
2450 tPttMsgbuffer *ftmCmd
2451)
2452{
2453 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2454 v_SIZE_t nvSize;
2455 sHalNv *nvContents = NULL;
2456 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2457 void *tablePtr = NULL;
2458 unsigned int tableSize = 0;
2459 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
2460
2461 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2462 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2463 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002464 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002465 }
2466
2467 /* Set Platform type as PRIMA */
2468 nvContents->fields.wlanNvRevId = 2;
2469
2470 switch(nvTable->nvTable)
2471 {
2472 case NV_FIELDS_IMAGE:
2473 tablePtr = (void *)&nvContents->fields;
2474 tableSize = sizeof(nvContents->fields);
2475 tableVNVType = VNV_FIELD_IMAGE;
2476 break;
2477
2478 case NV_TABLE_RATE_POWER_SETTINGS:
2479 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2480 tableSize = sizeof(nvContents->tables.pwrOptimum);
2481 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2482 break;
2483
2484 case NV_TABLE_REGULATORY_DOMAINS:
2485 tablePtr = (void *)&nvContents->tables.regDomains[0];
2486 tableSize = sizeof(nvContents->tables.regDomains);
2487 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2488 break;
2489
2490 case NV_TABLE_DEFAULT_COUNTRY:
2491 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2492 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2493 tableVNVType = VNV_DEFAULT_LOCATION;
2494 break;
2495
2496 case NV_TABLE_TPC_POWER_TABLE:
2497 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2498 tableSize = sizeof(nvContents->tables.plutCharacterized);
2499 tableVNVType = VNV_TPC_POWER_TABLE;
2500 break;
2501
2502 case NV_TABLE_TPC_PDADC_OFFSETS:
2503 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2504 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2505 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2506 break;
2507
2508 case NV_TABLE_VIRTUAL_RATE:
2509 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2510 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2511 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2512 break;
2513
2514 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2515 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2516 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2517 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2518 break;
2519
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002520 case NV_TABLE_HW_CAL_VALUES:
2521 tablePtr = (void *)&nvContents->tables.hwCalValues;
2522 tableSize = sizeof(nvContents->tables.hwCalValues);
2523 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002524 break;
2525
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002526 case NV_TABLE_FW_CONFIG:
2527 tablePtr = (void *)&nvContents->tables.fwConfig;
2528 tableSize = sizeof(nvContents->tables.fwConfig);
2529 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002530 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002531
Jeff Johnson295189b2012-06-20 16:38:30 -07002532 case NV_TABLE_ANTENNA_PATH_LOSS:
2533 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2534 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2535 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2536 break;
2537
2538 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2539 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2540 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2541 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2542 break;
2543
2544 default:
2545 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2546 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002547 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002548 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002549
Jeff Johnson295189b2012-06-20 16:38:30 -07002550 }
2551
2552 nvStatus = vos_nv_write(tableVNVType,
2553 tablePtr,
2554 tableSize);
2555 if(VOS_STATUS_SUCCESS != nvStatus)
2556 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002557 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002558 }
2559
2560 return 1;
2561}
2562
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002563/* --------------------------------------------------------------------------
2564 \brief wlan_hdd_ftm_get_nv_bin() -
2565 Get NV bin read from Flash Memory, file
2566
2567 \param - ftmCmd - Pointer FTM Commad Buffer
2568
2569 \return - int
2570 -1, Process Host command fail, vail out
2571 0, Process Host command success
2572--------------------------------------------------------------------------*/
2573
2574static int wlan_hdd_ftm_get_nv_bin
2575(
2576 v_U16_t msgId,
2577 hdd_context_t *pHddCtx,
2578 tPttMsgbuffer *ftmCmd
2579)
2580{
2581 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2582 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2583 v_SIZE_t nvSize;
2584 v_U8_t *nvContents;
2585 v_U16_t offset = 0;
2586
2587
2588 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2589 (0 == pHddCtx->ftm.processedNVTableSize))
2590 {
2591 if ( msgId == PTT_MSG_GET_NV_BIN )
2592 {
2593 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2594 }
2595 else
2596 {
2597 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2598 }
2599
2600 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2601 {
2602 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2603 "Fail to get cached NV value Status %d", nvStatus);
2604 return -EIO;
2605 }
2606
2607 switch (nvTable->nvTable)
2608 {
2609 case NV_BINARY_IMAGE:
2610 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2611 break;
2612 default:
2613 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2614 "Not Valid NV Table %d", nvTable->nvTable);
2615 return -EIO;
2616 break;
2617 }
2618
2619 /* Set Current Processing NV table type */
2620 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2621 if ( msgId == PTT_MSG_GET_NV_BIN )
2622 {
2623 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2624 /* Validity Period */
2625 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2626 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2627 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2628 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2629 offset = sizeof(v_U32_t);
2630 }
2631 else
2632 {
2633 pHddCtx->ftm.targetNVTableSize = nvSize;
2634 offset = 0;
2635 }
2636
2637 /* Copy target NV table value into temp context buffer */
2638 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2639 pHddCtx->ftm.targetNVTablePointer,
2640 pHddCtx->ftm.targetNVTableSize);
2641 }
2642
2643
2644 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2645 {
2646 /* Invalid table type */
2647 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2648 "Invalid NV Table, now Processing %d, not %d",
2649 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2650
2651 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2652 pHddCtx->ftm.targetNVTableSize = 0;
2653 pHddCtx->ftm.processedNVTableSize = 0;
2654 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2655
2656 return -EINVAL;
2657 }
2658
2659 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2660
2661 /* Update processed pointer to prepare next chunk copy */
2662 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2663 pHddCtx->ftm.targetNVTableSize )
2664 {
2665 nvTable->chunkSize =
2666 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2667 }
2668
2669 /* Copy next chunk of NV table value into response buffer */
2670 vos_mem_copy(
2671 &nvTable->tableData,
2672 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2673 nvTable->chunkSize);
2674
2675 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2676
2677 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2678 {
2679 /* Finished to process last chunk of data, initialize buffer */
2680 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2681 pHddCtx->ftm.targetNVTableSize = 0;
2682 pHddCtx->ftm.processedNVTableSize = 0;
2683 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2684 }
2685
2686 return 1;
2687}
2688
2689/**---------------------------------------------------------------------------
2690
2691 \brief wlan_hdd_ftm_set_nv_bin() -
2692 Set NV bin to Flash Memory, file
2693
2694 \param - ftmCmd - Pointer FTM Commad Buffer
2695
2696 \return - int
2697 -1, Process Host command fail, vail out
2698 0, Process Host command success
2699
2700+----------------------------------------------------------------------------*/
2701
2702static int wlan_hdd_ftm_set_nv_bin
2703(
2704 hdd_context_t *pHddCtx,
2705 tPttMsgbuffer *ftmCmd
2706)
2707{
2708 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2709 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
2710
2711 /* Test first chunk of NV table */
2712 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2713 (0 == pHddCtx->ftm.processedNVTableSize))
2714 {
2715 switch (nvTable->nvTable)
2716 {
2717 case NV_BINARY_IMAGE:
2718 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2719 break;
2720 default:
2721 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2722 "Not Valid NV Table %d", nvTable->nvTable);
2723 return -EIO;
2724 break;
2725 }
2726
2727 /* Set Current Processing NV table type */
2728 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2729 pHddCtx->ftm.processedNVTableSize = 0;
2730
2731 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2732 {
2733 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2734 "Invalid Table Size %d", nvTable->tableSize);
2735 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2736 pHddCtx->ftm.targetNVTableSize = 0;
2737 pHddCtx->ftm.processedNVTableSize = 0;
2738 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2739 return -EINVAL;
2740 }
2741 }
2742
2743 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2744 {
2745 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2746 "Invalid NV Table, now Processing %d, not %d",
2747 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2748 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2749 pHddCtx->ftm.targetNVTableSize = 0;
2750 pHddCtx->ftm.processedNVTableSize = 0;
2751 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2752 return -EINVAL;
2753 }
2754
2755 vos_mem_copy(
2756 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2757 &nvTable->tableData,
2758 nvTable->chunkSize);
2759
2760 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2761
2762 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2763 {
2764 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2765 "Processing Done!! write encoded Buffer %d",
2766 pHddCtx->ftm.targetNVTableSize);
2767
2768 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2769 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2770
2771 if ((VOS_STATUS_SUCCESS != nvStatus))
2772 {
2773 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2774 "Fail to set NV Binary %d", nvStatus);
2775 return -EIO;
2776 }
2777
2778 nvStatus = vos_nv_setNVEncodedBuffer(
2779 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2780 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
2781
2782 if ((VOS_STATUS_SUCCESS != nvStatus))
2783 {
2784 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2785 "Fail to set NV Binary %d", nvStatus);
2786 return -EIO;
2787 }
2788
2789 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2790 pHddCtx->ftm.targetNVTableSize = 0;
2791 pHddCtx->ftm.processedNVTableSize = 0;
2792 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2793 }
2794
2795 return 1;
2796}
2797
Jeff Johnson295189b2012-06-20 16:38:30 -07002798/**---------------------------------------------------------------------------
2799
2800 \brief wlan_hdd_ftm_temp_get_rel_num() -
2801 Get internal release number
2802
2803 \param - ftmCmd - Pointer FTM Commad Buffer
2804
2805 \return - int
2806 -1, Process Host command fail, vail out
2807 0, Process Host command success
2808
2809 --------------------------------------------------------------------------*/
2810int wlan_hdd_ftm_temp_get_rel_num
2811(
2812 tPttMsgbuffer *ftmCmd
2813)
2814{
2815 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2816
2817 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2818 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2819 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2820 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2821 relNum->relParams.pttMax = 10;
2822 relNum->relParams.pttMin = 1;
2823
2824 return 1;
2825}
2826
2827/**---------------------------------------------------------------------------
2828
2829 \brief wlan_hdd_process_ftm_host_cmd() -
2830 process any command should be handled within host.
2831 decide any command should be send to HAL or not
2832
2833 \param - ftmCmd - Pointer FTM Commad Buffer
2834
2835 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002836 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002837 0, Process Host command success, not need to send CMD to HAL
2838 1, Process Host command success, need to send CMD to HAL
2839
2840 --------------------------------------------------------------------------*/
2841int wlan_hdd_process_ftm_host_cmd
2842(
2843 hdd_context_t *pHddCtx,
2844 void *ftmCmd
2845)
2846{
2847 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2848 int needToRouteHal = 1;
2849 int hostState = 1;
2850
2851 switch(pFTMCmd->msgId)
2852 {
2853 case PTT_MSG_GET_NV_TABLE:
2854 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2855 needToRouteHal = 0;
2856 break;
2857
2858 case PTT_MSG_SET_NV_TABLE:
2859 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2860 /* Temp NV Operation will be isolated to host
2861 needToRouteHal = 1; */
2862 needToRouteHal = 0;
2863 break;
2864
2865 case PTT_MSG_BLANK_NV:
2866 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2867 needToRouteHal = 1;
2868 break;
2869
2870 case PTT_MSG_DEL_NV_TABLE:
2871 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2872 needToRouteHal = 1;
2873 break;
2874
2875 case PTT_MSG_GET_NV_FIELD:
2876 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2877 needToRouteHal = 0;
2878 break;
2879
2880 case PTT_MSG_SET_NV_FIELD:
2881 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2882 needToRouteHal = 0;
2883 break;
2884
2885 case PTT_MSG_STORE_NV_TABLE:
2886 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2887 needToRouteHal = 0;
2888 break;
2889
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002890 case PTT_MSG_GET_NV_BIN:
2891 case PTT_MSG_GET_DICTIONARY:
2892 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
2893 needToRouteHal = 0;
2894 break;
2895
2896 case PTT_MSG_SET_NV_BIN:
2897 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
2898 needToRouteHal = 0;
2899 break;
2900
Jeff Johnson295189b2012-06-20 16:38:30 -07002901 case PTT_MSG_DBG_READ_REGISTER:
2902 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
2903 &pFTMCmd->msgBody.DbgReadRegister.regValue);
2904 needToRouteHal = 0;
2905 break;
2906
2907 case PTT_MSG_DBG_WRITE_REGISTER:
2908 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
2909 pFTMCmd->msgBody.DbgWriteRegister.regValue);
2910 needToRouteHal = 0;
2911 break;
2912
2913 case PTT_MSG_DBG_READ_MEMORY:
2914 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
2915 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
2916 pFTMCmd->msgBody.DbgReadMemory.nBytes);
2917 needToRouteHal = 0;
2918 break;
2919
2920 case PTT_MSG_DBG_WRITE_MEMORY:
2921 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
2922 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
2923 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
2924 needToRouteHal = 0;
2925 break;
2926
2927 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
2928 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
2929 needToRouteHal = 0;
2930 break;
2931
2932 default:
2933 needToRouteHal = 1;
2934 break;
2935 }
2936
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002937 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002938 {
2939 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2940 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002941 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07002942 }
2943
2944 return needToRouteHal;
2945}
Jeff Johnson295189b2012-06-20 16:38:30 -07002946
2947/**---------------------------------------------------------------------------
2948
2949 \brief wlan_hdd_process_ftm_cmd() -
2950
2951 This function process the commands received from the ptt socket application.
2952
2953 \param - pAdapter - Pointer HDD Context.
2954
2955 \param - wnl - Pointer to the ANI netlink header.
2956
2957 \return - none
2958
2959 --------------------------------------------------------------------------*/
2960
2961void wlan_hdd_process_ftm_cmd
2962(
2963 hdd_context_t *pHddCtx,
2964 tAniNlHdr *wnl
2965)
2966{
2967 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
2968 v_U16_t cmd_len;
2969 v_U8_t *pftm_data;
2970 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07002971 int hostState;
2972 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002973
2974 ENTER();
2975
Jeff Johnsone7245742012-09-05 17:12:55 -07002976 //Delay to fix NV write failure on JB
2977 vos_busy_wait(10000); //10ms
2978
Jeff Johnson295189b2012-06-20 16:38:30 -07002979 if (!pRequestBuf) {
2980
Arif Hussain6d2a3322013-11-17 19:50:10 -08002981 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002982 return ;
2983 }
2984 /*Save the received request*/
2985 pHddCtx->ftm.pRequestBuf = pRequestBuf;
2986
2987 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
2988 /*Save the received request netlink header used for sending the response*/
2989 pHddCtx->ftm.wnl = wnl;
2990 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
2991
Arif Hussain6d2a3322013-11-17 19:50:10 -08002992 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07002993
2994 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2995 wlan_ftm_send_response(pHddCtx);
2996 return ;
2997 }
2998
2999 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3000 {
3001 case WLAN_FTM_START:
3002 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3003
Arif Hussain6d2a3322013-11-17 19:50:10 -08003004 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003005 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3006 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3007 wlan_ftm_send_response(pHddCtx);
3008 return;
3009 }
3010
3011 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3012 {
3013 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3014 ,__func__);
3015 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3016 wlan_ftm_send_response(pHddCtx);
3017 return;
3018 }
3019 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3020 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3021 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3022 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3023
3024 wlan_ftm_send_response(pHddCtx);
3025
3026 break;
3027
3028 case WLAN_FTM_STOP:
3029 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3030
Arif Hussain6d2a3322013-11-17 19:50:10 -08003031 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003032 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3033 wlan_ftm_send_response(pHddCtx);
3034 return;
3035 }
3036
3037 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3038
3039 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3040 wlan_ftm_send_response(pHddCtx);
3041 return;
3042 }
3043
3044 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3045 /* This would send back the Command Success Status */
3046 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3047
3048 wlan_ftm_send_response(pHddCtx);
3049
3050 break;
3051
3052 case WLAN_FTM_CMD:
3053 /* if it is regular FTM command, pass it to HAL PHY */
3054 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003055 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003056 return;
3057 }
3058 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3059
Arif Hussain6d2a3322013-11-17 19:50:10 -08003060 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003061
3062 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3063 wlan_ftm_send_response(pHddCtx);
3064 return;
3065
3066 }
3067 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3068 cmd_len = pRequestBuf->ftm_hdr.data_len;
3069 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3070 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3071
Jeff Johnson295189b2012-06-20 16:38:30 -07003072 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3073 if (0 == hostState)
3074 {
3075 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3076 if (NULL == tempRspBuffer)
3077 {
3078 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003079 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003080 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3081 wlan_ftm_send_response(pHddCtx);
3082 return;
3083 }
3084 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3085 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3086 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3087 (unsigned char *) tempRspBuffer,
3088 tempRspBuffer->msgBodyLength);
3089 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3090 wlan_ftm_send_response(pHddCtx);
3091 vos_mem_free(tempRspBuffer);
3092 return;
3093 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003094 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003095 {
3096 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3097 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3098 wlan_ftm_send_response(pHddCtx);
3099 return;
3100 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003101
3102 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3103
3104 pHddCtx->ftm.IsCmdPending = TRUE;
3105
3106 /*Post the command to the HAL*/
3107 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3108
Arif Hussain6d2a3322013-11-17 19:50:10 -08003109 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003110 return;
3111
3112 }
3113 /*Wait here until you get the response from HAL*/
3114 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3115 {
3116 hddLog(VOS_TRACE_LEVEL_ERROR,
3117 "%s: vos_wait_single_event failed",__func__);
3118 return;
3119 }
3120
3121 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3122
3123 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3124
3125 wlan_ftm_send_response(pHddCtx);
3126 pHddCtx->ftm.IsCmdPending = FALSE;
3127 break;
3128
3129 default:
3130
Arif Hussain6d2a3322013-11-17 19:50:10 -08003131 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003132 return;
3133 }
3134
3135 EXIT();
3136 return;
3137} /* wlan_adp_ftm_cmd() */
3138
3139/**---------------------------------------------------------------------------
3140
3141 \brief wlan_ftm_priv_start_stop_ftm() -
3142
3143 This function is used for start/stop the ftm driver.
3144
3145 \param - pAdapter - Pointer HDD Context.
3146 - start - 1/0 to start/stop ftm driver.
3147
3148 \return - 0 for success, non zero for failure
3149
3150 --------------------------------------------------------------------------*/
3151
3152static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3153 v_U16_t start)
3154{
3155 VOS_STATUS status;
3156 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3157
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003158 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003159 {
3160 pHddCtx->ftm.cmd_iwpriv = TRUE;
3161 status = wlan_hdd_ftm_start(pHddCtx);
3162
3163 if (status != VOS_STATUS_SUCCESS)
3164 {
3165 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3166 "FTM Start Failed");
3167 return VOS_STATUS_E_FAILURE;
3168 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303169 if (NULL == pMsgBuf)
3170 {
3171 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3172 if (NULL == pMsgBuf)
3173 {
3174 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3175 "%s:pMsgBuf is NULL", __func__);
3176 return VOS_STATUS_E_FAILURE;
3177 }
3178 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003179 }
3180 else
3181 {
3182 status = wlan_ftm_stop(pHddCtx);
3183
3184 if (status != VOS_STATUS_SUCCESS)
3185 {
3186 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3187 "FTM Stop Failed");
3188 return VOS_STATUS_E_FAILURE;
3189 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303190 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3191 if (pMsgBuf)
3192 {
3193 vos_mem_free((v_VOID_t * )pMsgBuf);
3194 pMsgBuf = NULL;
3195 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003196 }
3197 return VOS_STATUS_SUCCESS;
3198}
3199
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303200
3201static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3202{
3203 unsigned int *table = NULL;
3204 int index = 0;
3205
3206 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3207 table = valid_channel;
3208 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3209 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3210 table = valid_channel_cb40;
3211 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3212 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3213 table = valid_channel_cb80;
3214
3215 if (NULL == table)
3216 return VOS_STATUS_E_FAILURE;
3217
3218 while (table[index] != 0)
3219 {
3220 if (table[index] == channel)
3221 return VOS_STATUS_SUCCESS;
3222
3223 index++;
3224 }
3225
3226 return VOS_STATUS_E_FAILURE;
3227}
3228
3229
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303230static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3231{
3232 unsigned int primary_channel = center_channel;
3233
3234 if (center_channel <= 14)
3235 return primary_channel ;
3236
3237 switch (cb)
3238 {
3239 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3240 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3241 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3242 primary_channel -= 2;
3243 break;
3244
3245
3246 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3247 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3248 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3249 primary_channel += 2;
3250 break;
3251
3252 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3253 primary_channel -= 6;
3254 break;
3255
3256 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3257 primary_channel += 6;
3258 break;
3259 }
3260
3261 return primary_channel;
3262
3263}
3264
Jeff Johnson295189b2012-06-20 16:38:30 -07003265/**---------------------------------------------------------------------------
3266
3267 \brief wlan_ftm_priv_set_channel() -
3268
3269 This function is used for setting the channel to the halphy ptt module.
3270
3271 \param - pAdapter - Pointer HDD Context.
3272 - channel - Channel Number 1-14.
3273
3274 \return - 0 for success, non zero for failure
3275
3276 --------------------------------------------------------------------------*/
3277
3278static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3279{
Jeff Johnson295189b2012-06-20 16:38:30 -07003280 uPttMsgs *pMsgBody;
3281 VOS_STATUS status;
3282 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3283
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303284 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003285 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303286 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3287 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003288 return VOS_STATUS_E_FAILURE;
3289 }
3290
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303291 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003292 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303293 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3294 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003295 return VOS_STATUS_E_FAILURE;
3296 }
3297
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303298 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003299 init_completion(&pHddCtx->ftm.ftm_comp_var);
3300 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3301 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3302
3303 pMsgBody = &pMsgBuf->msgBody;
3304
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303305 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003306
Arif Hussain6d2a3322013-11-17 19:50:10 -08003307 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303308 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003309
3310 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3311
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303312 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003313 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303314 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3315 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003316 status = VOS_STATUS_E_FAILURE;
3317 goto done;
3318
3319 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303320 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3321 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003322
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303323 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003324 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303325 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3326 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003327 status = VOS_STATUS_E_FAILURE;
3328 goto done;
3329
3330 }
3331done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003332
3333 return status;
3334}
3335
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303336
3337/**---------------------------------------------------------------------------
3338
3339 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3340
3341 This function is used for setting the power control mode for tx.
3342
3343 \param - pAdapter - Pointer HDD Context.
3344 - pwr_mode - power control mode 0-2.
3345
3346 \return - 0 for success, non zero for failure
3347
3348 --------------------------------------------------------------------------*/
3349
3350static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3351 v_U16_t pwr_mode)
3352{
3353 uPttMsgs *pMsgBody;
3354 VOS_STATUS status;
3355 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3356
3357 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3358 {
3359 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3360 "%s:Ftm has not started. Please start the ftm. ", __func__);
3361 return VOS_STATUS_E_FAILURE;
3362 }
3363
3364 if (pwr_mode > 2)
3365 {
3366 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3367 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3368 return VOS_STATUS_E_FAILURE;
3369 }
3370
3371 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3372 init_completion(&pHddCtx->ftm.ftm_comp_var);
3373 pMsgBody = &pMsgBuf->msgBody;
3374 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3375 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3376
3377 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3378 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3379
3380 if (status != VOS_STATUS_SUCCESS)
3381 {
3382 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3383 "%s:wlan_ftm_postmsg failed", __func__);
3384 status = VOS_STATUS_E_FAILURE;
3385 goto done;
3386 }
3387 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3388 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3389
3390 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3391 {
3392 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3393 "%s:Ptt response status failed", __func__);
3394 status = VOS_STATUS_E_FAILURE;
3395 goto done;
3396 }
3397
3398 done:
3399 return status;
3400
3401}
3402
Jeff Johnson295189b2012-06-20 16:38:30 -07003403/**---------------------------------------------------------------------------
3404
3405 \brief wlan_ftm_priv_set_txpower() -
3406
3407 This function is used for setting the txpower to the halphy ptt module.
3408
3409 \param - pAdapter - Pointer HDD Context.
3410 - txpower - txpower Number 1-18.
3411
3412 \return - 0 for success, non zero for failure
3413
3414 --------------------------------------------------------------------------*/
3415
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303416static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3417 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003418{
Jeff Johnson295189b2012-06-20 16:38:30 -07003419 uPttMsgs *pMsgBody;
3420 VOS_STATUS status;
3421 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3422
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303423 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003424 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303425 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3426 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003427 return VOS_STATUS_E_FAILURE;
3428 }
3429
3430 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3431 * when tx pktgen is enabled
3432 */
3433 if (ftm_status.frameGenEnabled)
3434 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303435 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3436 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 return VOS_STATUS_E_FAILURE;
3438 }
3439
3440 if(!(txpower >= 9 && txpower <= 24))
3441 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303442 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3443 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003444 return VOS_STATUS_E_FAILURE;
3445 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003446
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303447 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3448 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003449 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003450 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3451 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3452
3453 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3454
3455 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3456
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303457 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003458 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303459 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3460 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003461 status = VOS_STATUS_E_FAILURE;
3462 goto done;
3463 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303464 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3465 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003466
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303467 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003468 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303469 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3470 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003471 status = VOS_STATUS_E_FAILURE;
3472 goto done;
3473 }
3474
3475 ftm_status.txpower = txpower ;
3476 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003477
3478 return status;
3479
3480}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303481
3482
3483static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3484 v_U16_t enable)
3485{
3486 tANI_U32 value = 0;
3487 tANI_U32 reg_addr;
3488 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3489 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3490 {
3491 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3492 "%s:Ftm has not started. Please start the ftm. ", __func__);
3493 return VOS_STATUS_E_FAILURE;
3494 }
3495
3496#ifdef WCN_PRONTO
3497 reg_addr = 0xfb018000;
3498#else
3499 reg_addr = 0x03018000;
3500#endif
3501 wpalReadRegister(reg_addr, &value);
3502 if (enable)
3503 {
3504 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3505 }
3506 else
3507 {
3508 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3509 }
3510
3511 wpalWriteRegister(reg_addr, value);
3512
3513 return VOS_STATUS_SUCCESS;
3514}
3515
3516
Jeff Johnson295189b2012-06-20 16:38:30 -07003517/**---------------------------------------------------------------------------
3518
3519 \brief wlan_ftm_priv_set_txrate() -
3520
3521 This function is used for setting the txrate to the halphy ptt module.
3522 It converts the user input string for txrate to the tx rate index.
3523
3524 \param - pAdapter - Pointer HDD Context.
3525 - txrate - Pointer to the tx rate string.
3526
3527 \return - 0 for success, non zero for failure
3528
3529 --------------------------------------------------------------------------*/
3530
3531static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3532{
3533 int ii;
3534 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3535 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3536 {
3537 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3538 return VOS_STATUS_E_FAILURE;
3539 }
3540
3541 /* do not allow to change setting when tx pktgen is enabled */
3542 if (ftm_status.frameGenEnabled)
3543 {
3544 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3545 return VOS_STATUS_E_FAILURE;
3546 }
3547
3548 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3549 {
3550 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3551 break;
3552 }
3553 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3554 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003555 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003556 return VOS_STATUS_E_FAILURE;
3557 }
3558
3559 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3560 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3561
3562 return VOS_STATUS_SUCCESS;
3563}
3564
3565/**---------------------------------------------------------------------------
3566
3567 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3568
3569 This function is used for start/stop the tx packet generation.
3570
3571 \param - pAdapter - Pointer HDD Context.
3572 - startStop - Value( 1/0) start/stop the tx packet generation.
3573
3574 \return - 0 for success, non zero for failure
3575
3576 --------------------------------------------------------------------------*/
3577
3578static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3579{
Jeff Johnson295189b2012-06-20 16:38:30 -07003580 uPttMsgs *pMsgBody;
3581 VOS_STATUS status;
3582 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3583
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303584 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003585 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303586 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3587 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003588 return VOS_STATUS_E_FAILURE;
3589 }
3590
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303591 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003592 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303593 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3594 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003595 return VOS_STATUS_E_FAILURE;
3596 }
3597
3598 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3599 (!ftm_status.frameGenEnabled && startStop == 0))
3600 {
3601 return VOS_STATUS_SUCCESS ;
3602 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303603 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003604
Jeff Johnson295189b2012-06-20 16:38:30 -07003605 if (startStop == 1)
3606 {
3607 init_completion(&pHddCtx->ftm.ftm_comp_var);
3608 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3609 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3610 pMsgBody = &pMsgBuf->msgBody;
3611 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3612
3613 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303614 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003615 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303616 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3617 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003618 status = VOS_STATUS_E_FAILURE;
3619 goto done;
3620 }
3621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303622 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3623 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3624 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003625 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303626 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3627 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003628 status = VOS_STATUS_E_FAILURE;
3629 goto done;
3630 }
3631 }
3632
3633 init_completion(&pHddCtx->ftm.ftm_comp_var);
3634 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3635 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3636 pMsgBody = &pMsgBuf->msgBody;
3637 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3638
3639 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3640 if(status != VOS_STATUS_SUCCESS)
3641 {
3642 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3643 status = VOS_STATUS_E_FAILURE;
3644 goto done;
3645 }
3646
3647 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3648 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3649 {
3650 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3651 status = VOS_STATUS_E_FAILURE;
3652 goto done;
3653 }
3654
3655done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003656
3657 if (status == VOS_STATUS_SUCCESS)
3658 {
3659 if (startStop == 1)
3660 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303661 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003662 }
3663 else
3664 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303665 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003666 }
3667 }
3668
3669 return status;
3670}
3671
3672
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303673
3674static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3675{
3676
3677 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3678 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3679 {
3680 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3681 "%s:Ftm has not started. Please start the ftm. ", __func__);
3682 return VOS_STATUS_E_FAILURE;
3683 }
3684
3685 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3686 {
3687 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3688 "%s:cb mode value is invalid ", __func__);
3689 return VOS_STATUS_E_FAILURE;
3690 }
3691
3692 ftm_status.cbmode = cbmode;
3693
3694 return VOS_STATUS_SUCCESS;
3695
3696}
3697
Jeff Johnson295189b2012-06-20 16:38:30 -07003698/**---------------------------------------------------------------------------
3699
3700 \brief wlan_ftm_rx_mode() -
3701
3702 This function is used for start/stop the rx packet generation.
3703
3704 \param - pAdapter - Pointer HDD Context.
3705 - rxmode - 0-disable RX.
3706 - 1-rx ALL frames
3707 - 2-rx 11 g/n frames
3708 - 3-rx 11b frames
3709
3710 \return - 0 for success, non zero for failure
3711
3712 --------------------------------------------------------------------------*/
3713
3714static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3715{
Jeff Johnson295189b2012-06-20 16:38:30 -07003716 uPttMsgs *pMsgBody;
3717 VOS_STATUS status;
3718
3719 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303720 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003721 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303722 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3723 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003724 return VOS_STATUS_E_FAILURE;
3725 }
3726
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303727 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003728 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303729 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3730 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003731 return VOS_STATUS_E_FAILURE;
3732 }
3733
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303734 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003735 init_completion(&pHddCtx->ftm.ftm_comp_var);
3736
3737 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3738 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3739
3740 pMsgBody = &pMsgBuf->msgBody;
3741
3742 switch(rxmode)
3743 {
3744 case RXMODE_DISABLE_ALL:
3745 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3746 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3747 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3748 break;
3749
3750 case RXMODE_ENABLE_ALL:
3751 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3752 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3753 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3754 break;
3755
3756 case RXMODE_ENABLE_11GN:
3757 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3758 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3759 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3760 break;
3761
3762 case RXMODE_ENABLE_11B:
3763 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3764 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3765 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3766 break;
3767
3768 }
3769
3770 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3771
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303772 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003773 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303774 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3775 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003776 status = VOS_STATUS_E_FAILURE;
3777 goto done;
3778 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303779 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3780 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003781
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303782 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003783 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303784 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3785 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003786 status = VOS_STATUS_E_FAILURE;
3787 goto done;
3788 }
3789 ftm_status.rxmode = rxmode ;
3790done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003791
3792 return status;
3793}
3794
3795/**---------------------------------------------------------------------------
3796
3797 \brief wlan_ftm_priv_rx_pkt_clear() -
3798
3799 This function sets the rx pkt count to zero.
3800
3801 \param - pAdapter - Pointer HDD Context.
3802 - rx_pkt_clear - rx_pkt_clear value.
3803
3804 \return - 0 for success, non zero for failure
3805
3806 --------------------------------------------------------------------------*/
3807
3808static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3809{
Jeff Johnson295189b2012-06-20 16:38:30 -07003810 VOS_STATUS status;
3811 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3812
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303813 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003814 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303815 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3816 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003817 return VOS_STATUS_E_FAILURE;
3818 }
3819
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303820 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07003821 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303822 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3823 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003824 return VOS_STATUS_E_FAILURE;
3825 }
3826
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303827 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003828 init_completion(&pHddCtx->ftm.ftm_comp_var);
3829 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
3830 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
3831
Jeff Johnson295189b2012-06-20 16:38:30 -07003832 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3833
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303834 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003835 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303836 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3837 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003838 status = VOS_STATUS_E_FAILURE;
3839 goto done;
3840 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303841 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3842 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003843
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303844 if (pMsgBuf->msgResponse != PTT_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:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003848 status = VOS_STATUS_E_FAILURE;
3849 goto done;
3850 }
3851done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003852
3853 return status;
3854}
3855
3856/**---------------------------------------------------------------------------
3857
3858 \brief wlan_ftm_priv_get_channel() -
3859
3860 This function gets the channel number from the halphy ptt module and
3861 returns the channel number to the application.
3862
3863 \param - pAdapter - Pointer HDD Context.
3864 - pChannel - Poniter to get the Channel number.
3865
3866 \return - 0 for success, non zero for failure
3867
3868 --------------------------------------------------------------------------*/
3869
3870static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
3871{
Jeff Johnson295189b2012-06-20 16:38:30 -07003872 uPttMsgs *pMsgBody;
3873 VOS_STATUS status;
3874 v_U16_t freq;
3875 v_U8_t indx=0;
3876
3877 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3878
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303879 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3882 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003883 return VOS_STATUS_E_FAILURE;
3884 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303885 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003886 init_completion(&pHddCtx->ftm.ftm_comp_var);
3887 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3888 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3889
3890 pMsgBody = &pMsgBuf->msgBody;
3891 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
3892
3893 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3894
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303895 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003896 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303897 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3898 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003899 status = VOS_STATUS_E_FAILURE;
3900 goto done;
3901
3902 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303903 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3904 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003905
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303906 if (pMsgBuf->msgResponse != PTT_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:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003910 status = VOS_STATUS_E_FAILURE;
3911 goto done;
3912 }
3913
3914 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
3915
3916 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
3917 indx++;
3918 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
3919 {
3920 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
3921 status = VOS_STATUS_E_FAILURE;
3922 goto done;
3923 }
3924
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003925 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07003926
Arif Hussain6d2a3322013-11-17 19:50:10 -08003927 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003928 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003929
3930 return status;
3931}
3932
3933/**---------------------------------------------------------------------------
3934
3935 \brief wlan_ftm_priv_get_txpower() -
3936
3937 This function gets the TX power from the halphy ptt module and
3938 returns the TX power to the application.
3939
3940 \param - pAdapter - Pointer HDD Context.
3941 - pTxPwr - Poniter to get the Tx power.
3942
3943 \return - 0 for success, non zero for failure
3944
3945 --------------------------------------------------------------------------*/
3946
3947static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
3948{
Jeff Johnson295189b2012-06-20 16:38:30 -07003949 uPttMsgs *pMsgBody;
3950 VOS_STATUS status;
3951 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3952
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303953 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003954 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303955 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3956 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003957 return VOS_STATUS_E_FAILURE;
3958 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303959 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003960 init_completion(&pHddCtx->ftm.ftm_comp_var);
3961 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
3962 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
3963
3964 pMsgBody = &pMsgBuf->msgBody;
3965
3966 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3967
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303968 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003969 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303970 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3971 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003972 status = VOS_STATUS_E_FAILURE;
3973 goto done;
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_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003982 status = VOS_STATUS_E_FAILURE;
3983 goto done;
3984 }
3985 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
3986
3987 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003988
3989 return status;
3990}
3991
3992/**---------------------------------------------------------------------------
3993
3994 \brief wlan_ftm_priv_get_ftm_version() -
3995
3996 This function gets ftm driver and firmware version.
3997
3998 \param - pAdapter - Pointer HDD Context.
3999 - pTxRate - Poniter to get the Tx rate.
4000
4001 \return - 0 for success, non zero for failure
4002
4003 --------------------------------------------------------------------------*/
4004
4005VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4006{
Jeff Johnson295189b2012-06-20 16:38:30 -07004007 uPttMsgs *pMsgBody;
4008 VOS_STATUS status;
4009 v_U32_t reg_val;
4010 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004011 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4012 int lenRes = 0;
4013 int lenBuf = WE_FTM_MAX_STR_LEN;
4014
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304015 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004016 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4018 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004019 return VOS_STATUS_E_FAILURE;
4020 }
4021
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304022 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004023 init_completion(&pHddCtx->ftm.ftm_comp_var);
4024 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4025 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4026
4027 pMsgBody = &pMsgBuf->msgBody;
4028 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4029
4030 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4031
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304032 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004033 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304034 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4035 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004036 status = VOS_STATUS_E_FAILURE;
4037 goto done;
4038
4039 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304040 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4041 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004042
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304043 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004044 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304045 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4046 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004047 status = VOS_STATUS_E_FAILURE;
4048 goto done;
4049 }
4050
4051 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4052
4053 init_completion(&pHddCtx->ftm.ftm_comp_var);
4054
4055 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4056 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4057
4058 pMsgBody = &pMsgBuf->msgBody;
4059
4060 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4061
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304062 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004063 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304064 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4065 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004066 status = VOS_STATUS_E_FAILURE;
4067 goto done;
4068 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304069 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4070 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004071
4072
4073 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4074 if(lenRes < 0 || lenRes >= lenBuf)
4075 {
4076 status = VOS_STATUS_E_FAILURE;
4077 goto done;
4078 }
4079
4080 buf += lenRes;
4081 lenBuf -= lenRes;
4082
4083 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004084 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 -07004085 if(lenRes < 0 || lenRes >= lenBuf)
4086 {
4087 status = VOS_STATUS_E_FAILURE;
4088 goto done;
4089 }
4090
4091 buf += lenRes;
4092 lenBuf -= lenRes;
4093
4094 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4095 if(lenRes < 0 || lenRes >= lenBuf)
4096 {
4097 status = VOS_STATUS_E_FAILURE;
4098 goto done;
4099 }
4100
4101 buf += lenRes;
4102 lenBuf -= lenRes;
4103
Jeff Johnson295189b2012-06-20 16:38:30 -07004104
4105done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004106
4107 return status;
4108
4109}
4110
4111/**---------------------------------------------------------------------------
4112
4113 \brief wlan_ftm_priv_get_txrate() -
4114
4115 This function gets the TX rate from the halphy ptt module and
4116 returns the TX rate to the application.
4117
4118 \param - pAdapter - Pointer HDD Context.
4119 - pTxRate - Poniter to get the Tx rate.
4120
4121 \return - 0 for success, non zero for failure
4122
4123 --------------------------------------------------------------------------*/
4124
4125static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4126{
Jeff Johnson295189b2012-06-20 16:38:30 -07004127 uPttMsgs *pMsgBody;
4128 VOS_STATUS status;
4129 v_U16_t rate_index,ii;
4130 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4131
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304132 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004133 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304134 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4135 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004136 return VOS_STATUS_E_FAILURE;
4137 }
4138
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304139 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004140 init_completion(&pHddCtx->ftm.ftm_comp_var);
4141 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4142 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4143
4144 pMsgBody = &pMsgBuf->msgBody;
4145
4146 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4147
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304148 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004149 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304150 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4151 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004152 status = VOS_STATUS_E_FAILURE;
4153 goto done;
4154 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304155 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4156 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004157
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304158 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004159
4160 rate_index = pMsgBody->GetTxPowerReport.rate;
4161 }
4162 else {
4163 /*Return the default rate*/
4164 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304165 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4166 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004167 status = VOS_STATUS_E_FAILURE;
4168 goto done;
4169 }
4170
4171 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4172 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4173 break;
4174 }
4175 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4176 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004178 status = VOS_STATUS_E_FAILURE;
4179 goto done;
4180 }
4181 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4182done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004183
4184 return status;
4185
4186}
4187
4188/**---------------------------------------------------------------------------
4189
4190 \brief wlan_ftm_priv_get_rx_pkt_count() -
4191
4192 This function gets the rx pkt count from the halphy ptt module and
4193 returns the rx pkt count to the application.
4194
4195 \param - pAdapter - Pointer HDD Context.
4196 - pRxPktCnt - Poniter to get the rx pkt count.
4197
4198 \return - 0 for success, non zero for failure
4199
4200 --------------------------------------------------------------------------*/
4201
4202static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4203{
Jeff Johnson295189b2012-06-20 16:38:30 -07004204 uPttMsgs *pMsgBody;
4205 VOS_STATUS status;
4206 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4207
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304208 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004209 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304210 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4211 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004212 return VOS_STATUS_E_FAILURE;
4213 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304214 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004215 init_completion(&pHddCtx->ftm.ftm_comp_var);
4216 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4217 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4218
4219 pMsgBody = &pMsgBuf->msgBody;
4220
4221 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4222
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304223 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304225 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4226 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004227 status = VOS_STATUS_E_FAILURE;
4228 goto done;
4229 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304230 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4231 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004232
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304233 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004234 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304235 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4236 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004237 status = VOS_STATUS_E_FAILURE;
4238 goto done;
4239 }
4240 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4241done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004242
4243 return status;
4244}
4245
4246/**---------------------------------------------------------------------------
4247
4248 \brief wlan_ftm_priv_get_rx_rssi() -
4249
4250 This function gets the rx rssi from the halphy ptt module and
4251 returns the rx rssi to the application.
4252
4253 \param - pAdapter - Pointer HDD Context.
4254 - buf - Poniter to get rssi of Rx chains
4255
4256 \return - 0 for success, non zero for failure
4257
4258 --------------------------------------------------------------------------*/
4259
4260static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4261{
Jeff Johnson295189b2012-06-20 16:38:30 -07004262 uPttMsgs *pMsgBody;
4263 VOS_STATUS status;
4264 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4265 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004266
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304267 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004268 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304269 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4270 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004271 return VOS_STATUS_E_FAILURE;
4272 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304273 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004274 init_completion(&pHddCtx->ftm.ftm_comp_var);
4275 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4276 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4277
4278 pMsgBody = &pMsgBuf->msgBody;
4279
4280 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4281
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304282 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004283 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304284 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4285 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004286 status = VOS_STATUS_E_FAILURE;
4287 goto done;
4288 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304289 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4290 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004291
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304292 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004293 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304294 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4295 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004296 status = VOS_STATUS_E_FAILURE;
4297 goto done;
4298 }
4299
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004300 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4301 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004302 pMsgBody->GetRxRssi.rssi.rx[1]);
4303
4304 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4305 {
4306 status = VOS_STATUS_E_FAILURE;
4307 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004308
Jeff Johnson295189b2012-06-20 16:38:30 -07004309done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004310
4311 return status;
4312}
4313
4314/**---------------------------------------------------------------------------
4315
4316 \brief wlan_ftm_priv_get_mac_address() -
4317
4318 This function gets the mac address from the halphy ptt module and
4319 returns the mac address to the application.
4320
4321 \param - pAdapter - Pointer HDD Context.
4322 - buf - Poniter to get the mac address.
4323
4324 \return - 0 for success, non zero for failure
4325
4326 --------------------------------------------------------------------------*/
4327
4328static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4329{
4330 v_BOOL_t itemIsValid = VOS_FALSE;
4331 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4332 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004333
Jeff Johnson295189b2012-06-20 16:38:30 -07004334 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4335
4336 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4337 {
4338 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4339 return VOS_STATUS_E_FAILURE;
4340 }
4341 /*Check the NV FIELD is valid or not*/
4342 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4343 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004344 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004345 {
4346 vos_nv_readMacAddress(macAddr);
4347
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004348 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4349 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004350 MAC_ADDR_ARRAY(macAddr));
4351 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4352 {
4353 return VOS_STATUS_E_FAILURE;
4354 }
4355 }
4356 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004357 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004358 {
4359 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004360 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4361 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004362 MAC_ADDR_ARRAY(macAddr));
4363
4364 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4365 {
4366 return VOS_STATUS_E_FAILURE;
4367 }
4368 }
4369 return VOS_STATUS_SUCCESS;
4370}
4371
4372/**---------------------------------------------------------------------------
4373
4374 \brief wlan_ftm_priv_set_mac_address() -
4375
4376 This function sets the mac address to the halphy ptt module and
4377 sends the netlink message to the ptt socket application which writes
4378 the macaddress to the qcom_wlan_nv.bin file
4379
4380 \param - pAdapter - Pointer HDD Context.
4381 - buf - Poniter to the macaddress.
4382
4383 \return - 0 for success, non zero for failure
4384
4385 --------------------------------------------------------------------------*/
4386
4387static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4388{
Jeff Johnson295189b2012-06-20 16:38:30 -07004389 uPttMsgs *pMsgBody;
4390 VOS_STATUS status;
4391 int macAddr[VOS_MAC_ADDRESS_LEN];
4392 v_U8_t *pMacAddress;
4393 v_U8_t ii;
4394 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4395
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304396 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004397 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304398 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4399 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004400 return VOS_STATUS_E_FAILURE;
4401 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304402 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004403 init_completion(&pHddCtx->ftm.ftm_comp_var);
4404 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4405 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4406
4407 pMsgBody = &pMsgBuf->msgBody;
4408 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4409
4410 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004411 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]))
4412 {
4413 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4414 "Invalid MacAddress Input %s", buf);
4415 return VOS_STATUS_E_FAILURE;
4416 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004417
Arif Hussain24bafea2013-11-15 15:10:03 -08004418 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4419 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004420
4421
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004422 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004423
4424 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4425 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4426
4427
Arif Hussain24bafea2013-11-15 15:10:03 -08004428 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4429 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4431
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304432 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004433 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304434 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4435 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004436 status = VOS_STATUS_E_FAILURE;
4437 goto done;
4438 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304439 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4440 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004441
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304442 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004443 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304444 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4445 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004446 status = VOS_STATUS_E_FAILURE;
4447 goto done;
4448 }
4449
Arif Hussain6d2a3322013-11-17 19:50:10 -08004450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004451
4452 init_completion(&pHddCtx->ftm.ftm_comp_var);
4453 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4454
4455 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4456 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4457
4458 pMsgBody = &pMsgBuf->msgBody;
4459
4460 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4461
4462 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4463
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304464 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004465 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304466 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4467 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004468 status = VOS_STATUS_E_FAILURE;
4469 goto done;
4470 }
4471
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304472 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4473 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004474done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004475
4476 return VOS_STATUS_SUCCESS;
4477}
4478
4479/* set param sub-ioctls */
4480static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4481 union iwreq_data *wrqu, char *extra)
4482{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004483 int ret,sub_cmd;
4484 unsigned int length;
Jeff Johnson295189b2012-06-20 16:38:30 -07004485 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004486 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004487
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004488 ret =0;
4489 length = wrqu->data.length;
4490 sub_cmd = wrqu->data.flags;
4491 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4492
4493 /*we can only accept input falling between 1 and length bytes,
4494 *and ensure extra is null delimited string
4495 */
4496 if (wrqu->data.length>=512)
4497 return -EINVAL;
4498 vos_mem_zero(extra + length,512 - length);
4499
4500 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4501 "%s: Received length %d", __func__, length);
4502
4503 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4504 "%s: Received data %s", __func__, extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07004505
4506 switch(sub_cmd)
4507 {
4508 case WE_SET_MAC_ADDRESS:
4509 {
4510
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004511 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004512 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004513
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004514 status = wlan_ftm_priv_set_mac_address(pAdapter,extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07004515
4516 if(status != VOS_STATUS_SUCCESS)
4517 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004518 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004519 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004520
Jeff Johnson295189b2012-06-20 16:38:30 -07004521 ret = -EINVAL;
4522 }
4523
4524 }
4525 break;
4526 case WE_SET_TX_RATE:
4527 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004528 status = wlan_ftm_priv_set_txrate(pAdapter,extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07004529
4530 if(status != VOS_STATUS_SUCCESS)
4531 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004532 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004533 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004534
4535 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004536 }
4537
4538 break;
4539 }
4540 default:
4541 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004542 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004543 ret = -EINVAL;
4544 break;
4545 }
4546 }
4547 return ret;
4548}
4549
4550static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4551 union iwreq_data *wrqu, char *extra)
4552{
4553 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4554 int *value = (int *)extra;
4555 int sub_cmd = value[0];
4556 int set_value = value[1];
4557 int ret = 0; /* success */
4558 VOS_STATUS status;
4559
4560 switch(sub_cmd)
4561 {
4562 case WE_FTM_ON_OFF:
4563 {
4564 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4565
4566 if(status != VOS_STATUS_SUCCESS)
4567 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004568 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004569 ret = -EINVAL;
4570 }
4571
4572 break;
4573 }
4574
4575 case WE_TX_PKT_GEN:
4576 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4577
4578 if(status != VOS_STATUS_SUCCESS)
4579 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004580 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004581 ret = -EINVAL;
4582 }
4583 break;
4584
4585 case WE_SET_TX_IFS:
4586 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4587
4588 if(status != VOS_STATUS_SUCCESS)
4589 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004590 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004591 ret = -EINVAL;
4592 }
4593 break;
4594
4595 case WE_SET_TX_PKT_CNT:
4596 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4597
4598 if(status != VOS_STATUS_SUCCESS)
4599 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004600 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004601 ret = -EINVAL;
4602 }
4603 break;
4604
4605 case WE_SET_TX_PKT_LEN:
4606 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4607
4608 if(status != VOS_STATUS_SUCCESS)
4609 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004610 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004611 ret = -EINVAL;
4612 }
4613 break;
4614
4615 case WE_SET_CHANNEL:
4616 {
4617 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4618
4619 if(status != VOS_STATUS_SUCCESS)
4620 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004621 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004622 ret = -EINVAL;
4623 }
4624 break;
4625 }
4626 case WE_SET_TX_POWER:
4627 {
4628 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4629
4630 if(status != VOS_STATUS_SUCCESS)
4631 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004632 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004633 ret = -EINVAL;
4634 }
4635 break;
4636 }
4637 case WE_CLEAR_RX_PKT_CNT:
4638 {
4639 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4640
4641 if(status != VOS_STATUS_SUCCESS)
4642 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004643 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004644 ret = -EINVAL;
4645 }
4646 break;
4647 }
4648 case WE_RX:
4649 {
4650 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4651
4652 if(status != VOS_STATUS_SUCCESS)
4653 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004654 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004655 ret = -EINVAL;
4656 }
4657 break;
4658 }
4659 case WE_ENABLE_CHAIN:
4660 {
4661 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4662
4663 if(status != VOS_STATUS_SUCCESS)
4664 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004665 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004666 ret = -EINVAL;
4667 }
4668 break;
4669 }
4670
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304671 case WE_SET_PWR_CNTL_MODE:
4672 {
4673 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4674 if (status != VOS_STATUS_SUCCESS)
4675 {
4676 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4677 status);
4678 ret = -EINVAL;
4679 }
4680 break;
4681 }
4682
4683 case WE_ENABLE_DPD:
4684 {
4685 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4686 if (status != VOS_STATUS_SUCCESS)
4687 {
4688 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4689 ret = -EINVAL;
4690 }
4691 break;
4692 }
4693
4694 case WE_SET_CB:
4695 {
4696 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4697 if (status != VOS_STATUS_SUCCESS)
4698 {
4699 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4700 ret = -EINVAL;
4701 }
4702 break;
4703 }
4704
Jeff Johnson295189b2012-06-20 16:38:30 -07004705 default:
4706 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004707 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004708 sub_cmd, set_value);
4709 break;
4710 }
4711 }
4712
4713 return ret;
4714}
4715
4716/* get param sub-ioctls */
4717static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4718 union iwreq_data *wrqu, char *extra)
4719{
4720 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4721 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004722 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004723 VOS_STATUS status;
4724
4725 switch (value[0])
4726 {
4727 case WE_GET_CHANNEL:
4728 {
4729 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4730
4731 if(status != VOS_STATUS_SUCCESS)
4732 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004733 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004734 ret = -EINVAL;
4735 }
4736 break;
4737 }
4738 case WE_GET_TX_POWER:
4739 {
4740 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4741
4742 if(status != VOS_STATUS_SUCCESS)
4743 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004744 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004745 ret = -EINVAL;
4746 }
4747 break;
4748 }
4749 case WE_GET_RX_PKT_CNT:
4750 {
4751 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4752
4753 if(status != VOS_STATUS_SUCCESS)
4754 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004755 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004756 ret = -EINVAL;
4757 }
4758 break;
4759 }
4760 default:
4761 {
4762 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
4763 break;
4764 }
4765 }
4766
4767 return ret;
4768}
4769
4770static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
4771 union iwreq_data *wrqu, char *extra)
4772{
4773 int sub_cmd = wrqu->data.flags;
4774 VOS_STATUS status;
4775 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4776
4777 switch(sub_cmd)
4778 {
4779 case WE_GET_MAC_ADDRESS:
4780 {
4781 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
4782
4783 if(status != VOS_STATUS_SUCCESS)
4784 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004785 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004786 return -EINVAL;
4787 }
4788 wrqu->data.length = strlen(extra)+1;
4789 break;
4790 }
4791 case WE_GET_TX_RATE:
4792 {
4793 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
4794
4795 if(status != VOS_STATUS_SUCCESS)
4796 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004797 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004798 return -EINVAL;
4799 }
4800
4801 wrqu->data.length = strlen(extra)+1;
4802 break;
4803 }
4804 case WE_GET_FTM_VERSION:
4805 {
4806 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
4807
4808 if(status != VOS_STATUS_SUCCESS)
4809 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004810 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004811 return -EINVAL;
4812 }
4813 wrqu->data.length = strlen(extra)+1;
4814 break;
4815 }
4816 case WE_GET_FTM_STATUS:
4817 {
4818 status = wlan_ftm_priv_get_status(pAdapter, extra);
4819
4820 if(status != VOS_STATUS_SUCCESS)
4821 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004822 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004823 return -EINVAL;
4824 }
4825
4826 wrqu->data.length = strlen(extra)+1;
4827 break;
4828 }
4829 case WE_GET_RX_RSSI:
4830 {
4831 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
4832
4833 if(status != VOS_STATUS_SUCCESS)
4834 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004835 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004836 return -EINVAL;
4837 }
4838
4839 wrqu->data.length = strlen(extra)+1;
4840 break;
4841 }
4842 default:
4843 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004844 hddLog(LOGE, "Invalid IOCTL command %d", sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07004845 break;
4846 }
4847 }
4848
4849 return 0;
4850}
Jeff Johnson295189b2012-06-20 16:38:30 -07004851
4852VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
4853{
Jeff Johnson88ba7742013-02-27 14:36:02 -08004854#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07004855 tAniHdr *wmsg = NULL;
4856 v_U8_t *pBuf;
4857 hdd_context_t *pHddCtx = NULL;
4858 v_CONTEXT_t pVosContext= NULL;
4859
4860 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
4861 if(pBuf == NULL)
4862 {
4863 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
4864 return VOS_STATUS_E_NOMEM;
4865 }
4866 wmsg = (tAniHdr*)pBuf;
4867 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
4868 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
4869 wmsg->length = FTM_SWAP16(wmsg->length);
4870 pBuf += sizeof(tAniHdr);
4871
4872 /*Get the global context */
4873 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4874
4875 /*Get the Hdd Context */
4876 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
4877 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
4878
4879 /* EfS command Code */
4880 *(v_U32_t*)pBuf = 0x000000EF;
4881
4882 pBuf += sizeof(v_U32_t);
4883
4884 memcpy(pBuf, pData,data_len);
4885
4886 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
4887 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
4888
Arif Hussain6d2a3322013-11-17 19:50:10 -08004889 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 -07004890 vos_mem_free((v_VOID_t*)wmsg);
4891 return VOS_STATUS_E_FAILURE;
4892 }
4893 }
4894 else {
4895 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
4896
Arif Hussain6d2a3322013-11-17 19:50:10 -08004897 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 -07004898 vos_mem_free((v_VOID_t*)wmsg);
4899 return VOS_STATUS_E_FAILURE;
4900 }
4901 }
4902
4903 vos_mem_free((v_VOID_t*)wmsg);
4904#endif //FTM and ANDROID
4905
4906 return VOS_STATUS_SUCCESS;
4907}
4908
Jeff Johnson295189b2012-06-20 16:38:30 -07004909/* action sub-ioctls */
4910static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
4911 union iwreq_data *wrqu, char *extra)
4912{
4913 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004914 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004915
4916 switch (sub_cmd)
4917 {
4918 case WE_SET_NV_DEFAULTS:
4919 {
4920 v_U8_t *pu8buf,*pTempBuf;
4921 v_U16_t size;
4922 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08004923 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07004924 pu8buf = vos_mem_malloc(size);
4925 if(pu8buf == NULL)
4926 {
4927 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
4928 return VOS_STATUS_E_NOMEM;
4929 }
4930 memset(pu8buf,0,size);
4931 pTempBuf = pu8buf;
4932 pTempBuf += sizeof(v_U32_t);
4933 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
4934
4935 wlan_write_to_efs(pu8buf,size);
4936 vos_mem_free(pu8buf);
4937 }
4938
4939 default:
4940 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004941 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004942 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
4943 break;
4944 }
4945 }
4946
4947 return ret;
4948}
4949
Jeff Johnson295189b2012-06-20 16:38:30 -07004950static const iw_handler we_ftm_private[] = {
4951
4952 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
4953 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
4954 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
4955 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
4956 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07004957};
4958
4959/*Maximum command length can be only 15 */
4960static const struct iw_priv_args we_ftm_private_args[] = {
4961
4962 /* handlers for main ioctl */
4963 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
4964 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4965 0,
4966 "" },
4967
4968 { WE_FTM_ON_OFF,
4969 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4970 0,
4971 "ftm" },
4972
4973 { WE_TX_PKT_GEN,
4974 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4975 0,
4976 "tx" },
4977
4978 { WE_SET_TX_IFS,
4979 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4980 0,
4981 "set_txifs" },
4982
4983 { WE_SET_TX_PKT_CNT,
4984 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4985 0,
4986 "set_txpktcnt" },
4987
4988 { WE_SET_TX_PKT_LEN,
4989 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4990 0,
4991 "set_txpktlen" },
4992
4993 { WE_SET_CHANNEL,
4994 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4995 0,
4996 "set_channel" },
4997
4998 { WE_SET_TX_POWER,
4999 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5000 0,
5001 "set_txpower" },
5002
5003 { WE_CLEAR_RX_PKT_CNT,
5004 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5005 0,
5006 "clr_rxpktcnt" },
5007
5008 { WE_RX,
5009 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5010 0,
5011 "rx" },
5012
5013 { WE_ENABLE_CHAIN,
5014 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5015 0,
5016 "ena_chain" },
5017
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305018 { WE_SET_PWR_CNTL_MODE,
5019 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5020 0,
5021 "pwr_cntl_mode" },
5022
5023 { WE_ENABLE_DPD,
5024 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5025 0,
5026 "ena_dpd" },
5027
5028 { WE_SET_CB,
5029 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5030 0,
5031 "set_cb" },
5032
Jeff Johnson295189b2012-06-20 16:38:30 -07005033 /* handlers for main ioctl */
5034 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5035 0,
5036 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5037 "" },
5038
5039 { WE_GET_CHANNEL,
5040 0,
5041 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5042 "get_channel" },
5043
5044 { WE_GET_TX_POWER,
5045 0,
5046 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5047 "get_txpower" },
5048
5049 { WE_GET_RX_PKT_CNT,
5050 0,
5051 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5052 "get_rxpktcnt" },
5053
5054 /* handlers for main ioctl */
5055 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5056 IW_PRIV_TYPE_CHAR| 512,
5057 0,
5058 "" },
5059
5060 { WE_SET_MAC_ADDRESS,
5061 IW_PRIV_TYPE_CHAR| 512,
5062 0,
5063 "set_mac_address" },
5064
5065 { WE_SET_TX_RATE,
5066 IW_PRIV_TYPE_CHAR | 512,
5067 0,
5068 "set_txrate" },
5069
5070 /* handlers for main ioctl */
5071 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5072 0,
5073 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5074 "" },
5075
5076 { WE_GET_MAC_ADDRESS,
5077 0,
5078 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5079 "get_mac_address" },
5080
5081 { WE_GET_FTM_VERSION,
5082 0,
5083 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5084 "ftm_version" },
5085
5086 { WE_GET_TX_RATE,
5087 0,
5088 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5089 "get_txrate" },
5090
5091 { WE_GET_FTM_STATUS,
5092 0,
5093 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5094 "get_status" },
5095
5096 { WE_GET_RX_RSSI,
5097 0,
5098 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5099 "get_rx_rssi" },
5100
Jeff Johnson295189b2012-06-20 16:38:30 -07005101 /* handlers for main ioctl */
5102 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5103 0,
5104 0,
5105 "" },
5106
5107 /* handlers for sub-ioctl */
5108 { WE_SET_NV_DEFAULTS,
5109 0,
5110 0,
5111 "set_nv_defaults" },
5112
5113};
5114
5115const struct iw_handler_def we_ftm_handler_def = {
5116 .num_standard = 0,
5117 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5118 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5119
5120 .standard = (iw_handler *)NULL,
5121 .private = (iw_handler *)we_ftm_private,
5122 .private_args = we_ftm_private_args,
5123 .get_wireless_stats = NULL,
5124};
5125
5126static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5127{
5128
5129 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5130
5131 // Zero the memory. This zeros the profile structure.
5132 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005133
Jeff Johnson295189b2012-06-20 16:38:30 -07005134 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5135
5136 return 0;
5137}
5138
Jeff Johnson295189b2012-06-20 16:38:30 -07005139
5140VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5141{
Jeff Johnson295189b2012-06-20 16:38:30 -07005142 ftm_rsp_msg_t *pFtmMsgRsp;
5143
5144 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5145 hdd_context_t *pHddCtx;
5146 v_CONTEXT_t pVosContext= NULL;
5147
5148 ENTER();
5149
5150 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5151
5152 if (!message )
5153 {
5154 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5155 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5156 return VOS_STATUS_E_INVAL;
5157 }
5158 /*Get the global context */
5159 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5160
5161 /*Get the Hdd Context */
5162 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5163
5164 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5165
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305166 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005167 complete(&pHddCtx->ftm.ftm_comp_var);
5168 }
5169 else {
5170 /*Response length to Ptt App*/
5171 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5172
5173 /*Ptt App expects the response length in LE */
5174 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5175
5176 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005177 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005178 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5179
5180 /*Copy the message*/
5181 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5182
5183 /*Update the error code*/
5184 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5185
5186 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5187
5188 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5189 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005190 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005191 return VOS_STATUS_E_FAILURE;
5192 }
5193 }
5194 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005195 return VOS_STATUS_SUCCESS;
5196
5197}