blob: 806858ae34729a2a38ab09363d36628011bcf048 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
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.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**========================================================================
29
30 \file wlan_hdd_ftm.c
31
32 \brief This file contains the WLAN factory test mode implementation
33
Jeff Johnson295189b2012-06-20 16:38:30 -070034
35 ========================================================================*/
36
37/**=========================================================================
38
39 EDIT HISTORY FOR FILE
40
41
42 This section contains comments describing changes made to the module.
43 Notice that changes are listed in reverse chronological order.
44
45
46 $Header:$ $DateTime: $ $Author: $
47
48
49 when who what, where, why
50 -------- --- --------------------------------------------------------
51 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
52 for FTM and mission mode
53 04/5/09 Shailender Created module.
54
55 ==========================================================================*/
56#include <vos_mq.h>
57#include "vos_sched.h"
58#include <vos_api.h>
59#include "sirTypes.h"
60#include "halTypes.h"
61#include "sirApi.h"
62#include "sirMacProtDef.h"
63#include "sme_Api.h"
64#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070065#include "wlan_qct_sys.h"
66#include "wlan_qct_tl.h"
67#include "wlan_hdd_misc.h"
68#include "i_vos_packet.h"
69#include "vos_nvitem.h"
70#include "wlan_hdd_main.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070071#include "qwlan_version.h"
72
Jeff Johnson295189b2012-06-20 16:38:30 -070073#include "wlan_nv.h"
74#include "wlan_qct_wda.h"
75#include "cfgApi.h"
76#include "pttMsgApi.h"
77#include "wlan_qct_pal_device.h"
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053078#include "linux/wcnss_wlan.h"
Anand N Sunkadc05b9c32015-06-18 18:54:53 +053079#include "qc_sap_ioctl.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070080
Jeff Johnson295189b2012-06-20 16:38:30 -070081#define RXMODE_DISABLE_ALL 0
82#define RXMODE_ENABLE_ALL 1
83#define RXMODE_ENABLE_11GN 2
84#define RXMODE_ENABLE_11B 3
85
86#define FTM_CHAIN_SEL_NO_RX_TX 0
87#define FTM_CHAIN_SEL_R0_ON 1
88#define FTM_CHAIN_SEL_T0_ON 2
89#define FTM_CHAIN_SEL_R0_T0_ON 3
mukul sharma0754d6b2015-05-22 18:49:41 +053090#define FTM_CHAIN_SEL_ANTENNA_0 7
91#define FTM_CHAIN_SEL_ANTENNA_1 8
92#define FTM_CHAIN_SEL_MAX 8
Jeff Johnson295189b2012-06-20 16:38:30 -070093
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053094#define WCNSS_TXFIR_OFFSET 0x00018000
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
Jeff Johnson295189b2012-06-20 16:38:30 -070097
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053098#ifndef QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET
99#define QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET 0x00013c34
Jeff Johnson295189b2012-06-20 16:38:30 -0700100#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
Anand N Sunkad5286f8a2014-08-22 14:57:43 +0530101#endif /* QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET */
Jeff Johnson295189b2012-06-20 16:38:30 -0700102
Jeff Johnson295189b2012-06-20 16:38:30 -0700103
Jeff Johnson295189b2012-06-20 16:38:30 -0700104/* To set 4MAC addresses from given first MAC address,
105 * Last byte value within given MAC address must less than 0xFF - 3 */
106#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700107#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700108
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530109#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
110
Jeff Johnson295189b2012-06-20 16:38:30 -0700111typedef struct {
112 tANI_U32 tableSize; /* Whole NV Table Size */
113 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
114 eNvTable nvTable;
115 tANI_U8 tableData; /* Filled by host driver */
116} pttGetNvTable;
117
118typedef struct {
119 tANI_U32 tableSize; /* Whole NV Table Size */
120 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
121 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700122 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700123} pttSetNvTable;
124
Jeff Johnson295189b2012-06-20 16:38:30 -0700125
126extern const sHalNv nvDefaults;
127static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700128static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700129VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700130
Jeff Johnson295189b2012-06-20 16:38:30 -0700131static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
132{
133 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
134 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
135 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
136 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
137 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
138 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
139 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
140 //Spica_Virgo 11A 20MHz Rates
141 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
142 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
143 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
144 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
145 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
146 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
147 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
148 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
149
150//MCS Index #0-15 (20MHz)
151 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
152 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
153 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
154 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
155 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
156 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
157 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
158 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530159 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, "MCS_SG_7_2_MBPS"},
160 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS, "MCS_SG_14_4_MBPS"},
161 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS, "MCS_SG_21_7_MBPS"},
162 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS, "MCS_SG_28_9_MBPS"},
163 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS, "MCS_SG_43_3_MBPS"},
164 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS, "MCS_SG_57_8_MBPS"},
165 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, "MCS_SG_65_MBPS"},
166 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_SG_72_2_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530167
168//MCS Index #8-15 (40MHz)
169
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530170 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_5_MBPS" },
171 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
172 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
173 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
174 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
175 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
176 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
177 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530178 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
179 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
180 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
181 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
182 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
183 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
184 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800185 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530186
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800187#ifdef WLAN_FEATURE_11AC
188 /*11AC rate 20MHZ Normal GI*/
189 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
190 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
191 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
192 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
193 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
194 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
195 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
196 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
197 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530198#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800199 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530200#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800201
202 /*11AC rate 20MHZ Short GI*/
203 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
204 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
205 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
206 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
207 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
208 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
209 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
210 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
211 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530212#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800213 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530214#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800215
216 /*11AC rates 40MHZ normal GI*/
217 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
218 "MCS_VHT40_NGI_CB_13_5_MBPS"},
219 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
220 "MCS_VHT40_NGI_CB_27_MBPS"},
221 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
222 "MCS_VHT40_NGI_CB_40_5_MBPS"},
223 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
224 "MCS_VHT40_NGI_CB_54_MBPS"},
225 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
226 "MCS_VHT40_NGI_CB_81_MBPS"},
227 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
228 "MCS_VHT40_NGI_CB_108_MBPS"},
229 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
230 "MCS_VHT40_NGI_CB_121_5_MBPS"},
231 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
232 "MCS_VHT40_NGI_CB_135_MBPS"},
233 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
234 "MCS_VHT40_NGI_CB_162_MBPS"},
235 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
236 "MCS_VHT40_NGI_CB_180_MBPS"},
237
238 /*11AC rates 40MHZ short GI*/
239 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
240 "MCS_VHT40_SGI_CB_15_MBPS"},
241 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
242 "MCS_VHT40_SGI_CB_30_MBPS"},
243 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
244 "MCS_VHT40_SGI_CB_45_MBPS"},
245 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
246 "MCS_VHT40_SGI_CB_60_MBPS"},
247 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
248 "MCS_VHT40_SGI_CB_90_MBPS"},
249 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
250 "MCS_VHT40_SGI_CB_120_MBPS"},
251 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
252 "MCS_VHT40_SGI_CB_135_MBPS"},
253 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
254 "MCS_VHT40_SGI_CB_150_MBPS"},
255 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
256 "MCS_VHT40_SGI_CB_180_MBPS"},
257 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
258 "MCS_VHT40_SGI_CB_200_MBPS"},
259
260 /*11AC rates 80 MHZ normal GI*/
261 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
262 "MCS_VHT80_NGI_CB_29_3_MBPS"},
263 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
264 "MCS_VHT80_NGI_CB_58_5_MBPS"},
265 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
266 "MCS_VHT80_NGI_CB_87_8_MBPS"},
267 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
268 "MCS_VHT80_NGI_CB_117_MBPS"},
269 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
270 "MCS_VHT80_NGI_CB_175_5_MBPS"},
271 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
272 "MCS_VHT80_NGI_CB_234_MBPS"},
273 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
274 "MCS_VHT80_NGI_CB_263_3_MBPS"},
275 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
276 "MCS_VHT80_NGI_CB_292_5_MBPS"},
277 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
278 "MCS_VHT80_NGI_CB_351_MBPS"},
279 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
280 "MCS_VHT80_NGI_CB_390_MBPS"},
281
282 /*11AC rates 80 MHZ short GI*/
283 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
284 "MCS_VHT80_SGI_CB_32_5_MBPS"},
285 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
286 "MCS_VHT80_SGI_CB_65_MBPS"},
287 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
288 "MCS_VHT80_SGI_CB_97_5_MBPS"},
289 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
290 "MCS_VHT80_SGI_CB_130_MBPS"},
291 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
292 "MCS_VHT80_SGI_CB_195_MBPS"},
293 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
294 "MCS_VHT80_SGI_CB_260_MBPS"},
295 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
296 "MCS_VHT80_SGI_CB_292_5_MBPS"},
297 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
298 "MCS_VHT80_SGI_CB_325_MBPS"},
299 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
300 "MCS_VHT80_SGI_CB_390_MBPS"},
301 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
302 "MCS_VHT80_SGI_CB_433_3_MBPS"},
303#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700304};
305
306static rateIndex2Preamble_t rate_index_2_preamble_table[] =
307{
308
309 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
310 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
311 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
312 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
313 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
314 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
315 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
316
Jeff Johnson295189b2012-06-20 16:38:30 -0700317
318 //Spica_Virgo 11A 20MHz Rates
319 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
320 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
321 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
322 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
323 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
324 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
325 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
326 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
327
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530328 // 11A 20MHz Rates
329 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
330 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
331 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
332 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
333 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
334 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
335 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
336 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
337
Jeff Johnson295189b2012-06-20 16:38:30 -0700338 //MCS Index #0-15 (20MHz)
339 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
340 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
341 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
342 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
343 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
344 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
345 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
346 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
347 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
348 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
349 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
350 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
351 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
352 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
353 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
354 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530355
356 //MCS index (40MHz)
357 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
358 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
359 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
360 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
361 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
362 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
363 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
364 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
365 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
366 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
367 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
368 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
369 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
370 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
371 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800372 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530373
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800374#ifdef WLAN_FEATURE_11AC
375 /*11AC rate 20MHZ Normal GI*/
376 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
377 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
378 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
379 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
380 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
381 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
382 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
383 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530385#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800386 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530387#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800388 /*11AC rate 20MHZ Short GI*/
389 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
390 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
391 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
392 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
393 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
394 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
395 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
396 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
397 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530398#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800399 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530400#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800401
402 /*11AC rates 40MHZ normal GI*/
403 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
409 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
410 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
411 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
412 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
413
414 /*11AC rates 40MHZ short GI*/
415 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
419 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
420 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
422 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
423 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
424 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
425
426 /*11AC rates 80 MHZ normal GI*/
427 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
431 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
432 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
433 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
435 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
436 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
437
438 /*11AC rates 80 MHZ short GI*/
439 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
440 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
443 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
444 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
445 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
449#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700450};
451
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530452static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
453 11, 12, 13, 14, 36, 40, 44, 48,
454 52, 56, 60, 64, 100, 104, 108,
455 112, 116, 120, 124, 128, 132,
456 136, 140, 149, 153, 157, 161,
457 165, 208, 212, 216, 240, 244,
458 248, 252, 0 };
459static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
460 42, 46, 50, 54, 58, 62, 102, 106,
461 110, 114, 118, 122, 126, 130, 134,
462 138, 151, 155, 159, 163, 210, 214,
463 242, 246, 250, 0 };
464static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
465 114, 118, 122, 126, 130, 134, 155,
466 159, 246, 0 };
467
Jeff Johnson295189b2012-06-20 16:38:30 -0700468typedef struct
469{
470 tANI_BOOLEAN frameGenEnabled;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530471 tANI_BOOLEAN wfRfGenEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -0700472 tANI_BOOLEAN wfmEnabled;
473 sPttFrameGenParams frameParams;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530474 v_U16_t powerCtlMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700475 v_U16_t rxmode;
476 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530477 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700478
479} FTM_STATUS ;
480static FTM_STATUS ftm_status;
481
482//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530483static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700484
485static void _ftm_status_init(void)
486{
487 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
488 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
489 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
490
491 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
492 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530493 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700494 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530495 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700496 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
497 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530498 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700499 ftm_status.frameParams.payloadFillByte = 0xA5;
500 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
501 ftm_status.frameParams.tx_mode = 0;
502 ftm_status.frameParams.crc = 0;
503 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
504 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
505 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
506 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530507 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700508 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
509 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530510 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700511
512 return;
513}
514
515/**---------------------------------------------------------------------------
516
517 \brief wlan_ftm_postmsg() -
518
519 The function used for sending the command to the halphy.
520
521 \param - cmd_ptr - Pointer command buffer.
522
523 \param - cmd_len - Command length.
524
525 \return - 0 for success, non zero for failure
526
527 --------------------------------------------------------------------------*/
528
529static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
530{
531 vos_msg_t *ftmReqMsg;
532 vos_msg_t ftmMsg;
533 ENTER();
534
535 ftmReqMsg = (vos_msg_t *) cmd_ptr;
536
Jeff Johnson295189b2012-06-20 16:38:30 -0700537 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700538 ftmMsg.reserved = 0;
539 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
540 ftmMsg.bodyval = 0;
541
542 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700543 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700544 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700545 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800546 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700547
548 return VOS_STATUS_E_FAILURE;
549 }
550
551 EXIT();
552 return VOS_STATUS_SUCCESS;
553}
554
555/*---------------------------------------------------------------------------
556
557 \brief wlan_ftm_vos_open() - Open the vOSS Module
558
559 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
560 Upon successful initialization:
561
562 - All VOS submodules should have been initialized
563
564 - The VOS scheduler should have opened
565
566 - All the WLAN SW components should have been opened. This include
567 MAC.
568
569
Girish Gowli32fbe522014-05-08 20:27:04 +0530570 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700571
572
573 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
574 is ready to be used.
575
576 VOS_STATUS_E_RESOURCES - System resources (other than memory)
577 are unavailable to initialize the scheduler
578
579
580 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
581
582 \sa wlan_ftm_vos_open()
583
584---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530585static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700586{
587 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
588 int iter = 0;
589 tSirRetStatus sirStatus = eSIR_SUCCESS;
590 tMacOpenParameters macOpenParms;
591 pVosContextType gpVosContext = (pVosContextType)pVosContext;
592
593 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
594 "%s: Opening VOSS", __func__);
595
596 if (NULL == gpVosContext)
597 {
598 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
599 "%s: Trying to open VOSS without a PreOpen",__func__);
600 VOS_ASSERT(0);
601 return VOS_STATUS_E_FAILURE;
602 }
603
604 /* Initialize the probe event */
605 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
606 {
607 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
608 "%s: Unable to init probeEvent",__func__);
609 VOS_ASSERT(0);
610 return VOS_STATUS_E_FAILURE;
611 }
612
Jeff Johnson295189b2012-06-20 16:38:30 -0700613 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
614 {
615 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
616 "%s: Unable to init wdaCompleteEvent",__func__);
617 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700618
Jeff Johnson295189b2012-06-20 16:38:30 -0700619 goto err_probe_event;
620 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700621
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530622 if(vos_event_init(&(gpVosContext->fwLogsComplete)) != VOS_STATUS_SUCCESS )
623 {
624 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
625 "%s: Unable to init fwLogsComplete",__func__);
626 VOS_ASSERT(0);
627
628 goto err_wda_complete_event;
629 }
630
Jeff Johnson295189b2012-06-20 16:38:30 -0700631 /* Initialize the free message queue */
632 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
633 if (! VOS_IS_STATUS_SUCCESS(vStatus))
634 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700635 /* Critical Error ... Cannot proceed further */
636 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530637 "%s: Failed to initialize VOS free message queue %d",
638 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700639 VOS_ASSERT(0);
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530640 goto err_fw_logs_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700641 }
642
643 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
644 {
645 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
646 &(gpVosContext->aMsgBuffers[iter]);
647 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
648 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
649 }
650
651 /* Now Open the VOS Scheduler */
652 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
653 sizeof(VosSchedContext));
654
655 if (!VOS_IS_STATUS_SUCCESS(vStatus))
656 {
657 /* Critical Error ... Cannot proceed further */
658 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530659 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700660 VOS_ASSERT(0);
661 goto err_msg_queue;
662 }
663
664 /* Open the SYS module */
665 vStatus = sysOpen(gpVosContext);
666
667 if (!VOS_IS_STATUS_SUCCESS(vStatus))
668 {
669 /* Critical Error ... Cannot proceed further */
670 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530671 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700672 VOS_ASSERT(0);
673 goto err_sched_close;
674 }
675
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 /*Open the WDA module */
677 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
678 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530679 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700680 if (!VOS_IS_STATUS_SUCCESS(vStatus))
681 {
682 /* Critical Error ... Cannot proceed further */
683 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530684 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700685 VOS_ASSERT(0);
686 goto err_sys_close;
687 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700688
689 /* initialize the NV module */
690 vStatus = vos_nv_open();
691 if (!VOS_IS_STATUS_SUCCESS(vStatus))
692 {
693 // NV module cannot be initialized, however the driver is allowed
694 // to proceed
695 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530696 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700697 goto err_wda_close;
698 }
699
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700700 vStatus = vos_nv_get_dictionary_data();
701
702 if (!VOS_IS_STATUS_SUCCESS(vStatus))
703 {
704 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530705 "%s : failed to get dictionary data for NV %d",
706 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700707 goto err_wda_close;
708 }
709
Jeff Johnson295189b2012-06-20 16:38:30 -0700710 /* If we arrive here, both threads dispacthing messages correctly */
711
712 /* Now proceed to open the MAC */
713
714 /* UMA is supported in hardware for performing the
715 frame translation 802.11 <-> 802.3 */
716 macOpenParms.frameTransRequired = 1;
717 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
718 &macOpenParms);
719
720 if (eSIR_SUCCESS != sirStatus)
721 {
722 /* Critical Error ... Cannot proceed further */
723 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530724 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700725 VOS_ASSERT(0);
726 goto err_nv_close;
727 }
728
Jeff Johnson295189b2012-06-20 16:38:30 -0700729 /* Now proceed to open the SME */
730 vStatus = sme_Open(gpVosContext->pMACContext);
731 if (!VOS_IS_STATUS_SUCCESS(vStatus))
732 {
733 /* Critical Error ... Cannot proceed further */
734 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530735 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700736 goto err_mac_close;
737 }
738 return VOS_STATUS_SUCCESS;
739
Jeff Johnson295189b2012-06-20 16:38:30 -0700740
741 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
742 "%s: VOSS successfully Opened",__func__);
743
744 return VOS_STATUS_SUCCESS;
745err_mac_close:
746 macClose(gpVosContext->pMACContext);
747
748err_nv_close:
749 vos_nv_close();
750
751err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700752 WDA_close(gpVosContext);
753
754err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700755 sysClose(gpVosContext);
756
757err_sched_close:
758 vos_sched_close(gpVosContext);
759err_msg_queue:
760 vos_mq_deinit(&gpVosContext->freeVosMq);
761
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530762err_fw_logs_complete_event:
763 vos_event_destroy(&gpVosContext->fwLogsComplete);
764
Jeff Johnson295189b2012-06-20 16:38:30 -0700765err_wda_complete_event:
766 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700767
768err_probe_event:
769 vos_event_destroy(&gpVosContext->ProbeEvent);
770
771 return VOS_STATUS_E_FAILURE;
772
773} /* wlan_ftm_vos_open() */
774
775/*---------------------------------------------------------------------------
776
777 \brief wlan_ftm_vos_close() - Close the vOSS Module
778
779 The \a wlan_ftm_vos_close() function closes the vOSS Module
780
781 \param vosContext context of vos
782
783 \return VOS_STATUS_SUCCESS - successfully closed
784
785 \sa wlan_ftm_vos_close()
786
787---------------------------------------------------------------------------*/
788
789static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
790{
791 VOS_STATUS vosStatus;
792 pVosContextType gpVosContext = (pVosContextType)vosContext;
793
Jeff Johnson295189b2012-06-20 16:38:30 -0700794 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
795 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
796 {
797 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530798 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700799 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
800 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700801
802 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
803 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
804 {
805 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530806 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700807 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
808 }
809
810 ((pVosContextType)vosContext)->pMACContext = NULL;
811
812 vosStatus = vos_nv_close();
813 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
814 {
815 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530816 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700817 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
818 }
819
820
821 vosStatus = sysClose( vosContext );
822 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
823 {
824 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530825 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700826 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
827 }
828
Wu Gaoece54202015-09-25 10:46:49 +0800829 if ( TRUE == WDA_needShutdown(vosContext))
Jeff Johnson295189b2012-06-20 16:38:30 -0700830 {
Wu Gaoece54202015-09-25 10:46:49 +0800831 vosStatus = WDA_shutdown(vosContext, VOS_TRUE);
832 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
833 {
834 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
835 "%s: Failed to shutdown WDA %d", __func__, vosStatus);
836 VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus));
837 }
838
839 }
840 else
841 {
842 vosStatus = WDA_close(vosContext);
843 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
844 {
845 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
846 "%s: Failed to close WDA %d", __func__, vosStatus);
847 VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus));
848 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700850
851 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
852
853 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
854 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
855 {
856 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530857 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700858 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
859 }
860
Jeff Johnson295189b2012-06-20 16:38:30 -0700861 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
862 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
863 {
864 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530865 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700866 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
867 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700868
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530869 vosStatus = vos_event_destroy(&gpVosContext->fwLogsComplete);
870 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
871 {
872 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
873 "%s: Failed to destroy fwLogsComplete %d", __func__, vosStatus);
874 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
875 }
876
Jeff Johnson295189b2012-06-20 16:38:30 -0700877 return VOS_STATUS_SUCCESS;
878}
879
880/**---------------------------------------------------------------------------
881
882 \brief wlan_ftm_priv_set_txifs() -
883
884 This function is used for
885
886 \param - pAdapter - Pointer HDD Context.
887 - ifs
888
889 \return - 0 for success, non zero for failure
890
891 --------------------------------------------------------------------------*/
892
893
894
895static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
896{
897 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
898 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
899 {
900 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
901 return VOS_STATUS_E_FAILURE;
902 }
903
904 /* do not allow to change setting when tx pktgen is enabled */
905 if (ftm_status.frameGenEnabled)
906 {
907 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
908 return VOS_STATUS_E_FAILURE;
909 }
910
911 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
912 {
c_hpothuffdb5272013-10-02 16:42:35 +0530913 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
914 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700915 return VOS_STATUS_E_FAILURE;
916 }
917
918 ftm_status.frameParams.interFrameSpace = ifs;
919
920 return VOS_STATUS_SUCCESS;
921}
922
923/**---------------------------------------------------------------------------
924
925 \brief wlan_ftm_priv_set_txpktcnt() -
926
927 This function is used for
928
929 \param - pAdapter - Pointer HDD Context.
930 - ifs
931
932 \return - 0 for success, non zero for failure
933
934 --------------------------------------------------------------------------*/
935
936static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
937{
938 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
939 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
940 {
941 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
942 return VOS_STATUS_E_FAILURE;
943 }
944
945 /* do not allow to change setting when tx pktgen is enabled */
946 if (ftm_status.frameGenEnabled)
947 {
948 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
949 return VOS_STATUS_E_FAILURE;
950 }
951
952 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
953 {
c_hpothuffdb5272013-10-02 16:42:35 +0530954 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
955 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700956 return VOS_STATUS_E_FAILURE;
957 }
958
959 ftm_status.frameParams.numTestPackets = cnt;
960
961 return VOS_STATUS_SUCCESS;
962}
963
964static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
965{
966 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
967 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
968 {
969 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
970 return VOS_STATUS_E_FAILURE;
971 }
972
973 /* do not allow to change setting when tx pktgen is enabled */
974 if (ftm_status.frameGenEnabled)
975 {
976 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
977 return VOS_STATUS_E_FAILURE;
978 }
979
980 if (len > 4095) //4096
981 {
c_hpothuffdb5272013-10-02 16:42:35 +0530982 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
983 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700984 return VOS_STATUS_E_FAILURE;
985 }
986
987 ftm_status.frameParams.payloadLength = (tANI_U16)len;
988
989 return VOS_STATUS_SUCCESS;
990}
991
Jeff Johnson295189b2012-06-20 16:38:30 -0700992
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530993static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
994/**---------------------------------------------------------------------------
995<FTM_Command>set_tx_wf_gain
996<argument> is <n>
997Designates the number of amplitude gain (31 to 255).
998Description
999This command can be set only when Tx CW generation is stopped.
1000--------------------------------------------------------------------------*/
1001static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
1002{
1003 uPttMsgs *pMsgBody;
1004 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1005 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
1006 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
1007 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1008 "%s:Ftm has not started. Please start the ftm.", __func__);
1009 return VOS_STATUS_E_FAILURE;
1010 }
1011
1012 if (ftm_status.wfRfGenEnabled) {
1013 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1014 "%s:cannot set gain when cwgen is enabled.", __func__);
1015 return VOS_STATUS_E_FAILURE;
1016 }
1017
1018 if (dGain > 24 || dGain <-39) {
1019 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1020 "%s:digital gain value is invalid", __func__);
1021 return VOS_STATUS_E_FAILURE;
1022 }
1023
Anand N Sunkadce9f8012015-04-14 19:24:43 +05301024 if (rfGain > 31) {
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301025 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1026 "%s:rf gain value is invalid", __func__);
1027 return VOS_STATUS_E_FAILURE;
1028 }
1029
1030 if (pMsgBuf == NULL) {
1031 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1032 "%s:pMsgBuf is NULL", __func__);
1033 return VOS_STATUS_E_NOMEM;
1034 }
1035
1036 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1037 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1038
1039 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1040 init_completion(&pHddCtx->ftm.ftm_comp_var);
1041 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1042 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1043 pMsgBody = &pMsgBuf->msgBody;
1044 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1045 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1046 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1047 VOS_STATUS_SUCCESS) {
1048 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1049 "%s:wlan_ftm_postmsg failed",__func__);
1050 return VOS_STATUS_E_FAILURE;
1051 }
1052
1053 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1054 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1055 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1056 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1057 "%s:Ptt response status failed",__func__);
1058 return VOS_STATUS_E_FAILURE;
1059 }
1060 return VOS_STATUS_SUCCESS;
1061}
1062
1063
1064/**---------------------------------------------------------------------------
1065 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1066 <argument> is < 1 | 0 >
1067 1 : Start Tx CW rf generation
1068 0 : Stop Tx CW rf generation
1069 Description
1070 This command starts/stops Tx CW rf generation.
1071--------------------------------------------------------------------------*/
1072static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1073{
1074 uPttMsgs *pMsgBody;
1075 VOS_STATUS status;
1076 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1077
1078 printk(KERN_EMERG "startStop: %02x ", startStop);
1079
1080 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1081 {
1082 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1083 "%s:Ftm has not started. Please start the ftm. ", __func__);
1084 return VOS_STATUS_E_FAILURE;
1085 }
1086
1087 if (startStop != 1 && startStop != 0)
1088 {
1089 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1090 "%s:Tx value is invalid ", __func__);
1091 return VOS_STATUS_E_FAILURE;
1092 }
1093
1094 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1095 (!ftm_status.wfRfGenEnabled && startStop == 0))
1096 {
1097 return VOS_STATUS_SUCCESS;
1098 }
1099
1100 if (pMsgBuf == NULL)
1101 {
1102 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1103 "%s:pMsgBuf is NULL", __func__);
1104 return VOS_STATUS_E_NOMEM;
1105 }
1106 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1107 if (startStop == 1) {
1108 tANI_U16 numSamples = 1;
1109 tANI_BOOLEAN clk80 = TRUE;
1110 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1111
1112 init_completion(&pHddCtx->ftm.ftm_comp_var);
1113 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1114 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1115 pMsgBody = &pMsgBuf->msgBody;
1116
1117 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1118 pMsgBody->SetWaveformRF.numSamples = numSamples;
1119 pMsgBody->SetWaveformRF.clk80 = clk80;
1120 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1121 if (status != VOS_STATUS_SUCCESS) {
1122 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1123 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1124 __func__);
1125 status = VOS_STATUS_E_FAILURE;
1126 goto done;
1127 }
1128 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1129 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1130 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1131 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1132 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1133 status = VOS_STATUS_E_FAILURE;
1134 goto done;
1135 }
1136 } else {
1137 init_completion(&pHddCtx->ftm.ftm_comp_var);
1138 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1139 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1140 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1141 if(status != VOS_STATUS_SUCCESS) {
1142 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1143 "%s:wlan_ftm_postmsg failed", __func__);
1144 status = VOS_STATUS_E_FAILURE;
1145 goto done;
1146 }
1147
1148 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1149 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1150 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1151 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1152 "%s:Ptt response status failed", __func__);
1153 status = VOS_STATUS_E_FAILURE;
1154 }
1155 }
1156done:
1157 if (status == VOS_STATUS_SUCCESS) {
1158 if (startStop == 1)
1159 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1160 else
1161 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1162 }
1163 return status;
1164}
1165
1166
Jeff Johnson295189b2012-06-20 16:38:30 -07001167static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1168{
Jeff Johnson295189b2012-06-20 16:38:30 -07001169 uPttMsgs *pMsgBody;
1170 VOS_STATUS status;
1171 v_U16_t chainSelect_save = chainSelect;
1172 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301173 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001174
1175 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1176 {
1177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1178 return VOS_STATUS_E_FAILURE;
1179 }
1180
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05301181 if (NULL == pMsgBuf)
1182 {
1183 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1184 "%s:pMsgBuf is NULL", __func__);
1185 return VOS_STATUS_E_NOMEM;
1186 }
1187
Jeff Johnson295189b2012-06-20 16:38:30 -07001188 if (chainSelect > FTM_CHAIN_SEL_MAX)
1189 {
c_hpothuffdb5272013-10-02 16:42:35 +05301190 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1191 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001192 return VOS_STATUS_E_FAILURE;
1193 }
1194
1195 /* do not allow to change setting when tx pktgen is enabled */
1196 if (ftm_status.frameGenEnabled)
1197 {
1198 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1199 return VOS_STATUS_E_FAILURE;
1200 }
1201
1202 switch (chainSelect)
1203 {
1204 case FTM_CHAIN_SEL_NO_RX_TX:
1205 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1206 break;
1207
1208 case FTM_CHAIN_SEL_R0_ON:
1209 chainSelect = PHY_CHAIN_SEL_R0_ON;
1210 break;
1211
1212 case FTM_CHAIN_SEL_T0_ON:
1213 chainSelect = PHY_CHAIN_SEL_T0_ON;
1214 break;
mukul sharma0754d6b2015-05-22 18:49:41 +05301215
1216 case FTM_CHAIN_SEL_ANTENNA_0:
1217 chainSelect = PHY_CHAIN_SEL_ANT_0;
1218 break;
1219
1220 case FTM_CHAIN_SEL_ANTENNA_1:
1221 chainSelect = PHY_CHAIN_SEL_ANT_1;
1222 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07001223 }
1224
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301225 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001226 init_completion(&pHddCtx->ftm.ftm_comp_var);
1227 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1228 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1229
1230 pMsgBody = &pMsgBuf->msgBody;
1231 pMsgBody->EnableChains.chainSelect = chainSelect;
1232
1233 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1234
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301235 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001236 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301237 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1238 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001239 status = VOS_STATUS_E_FAILURE;
1240 goto done;
1241 }
c_hpothuffdb5272013-10-02 16:42:35 +05301242 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301243 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301244 if (0 >= ret)
1245 {
1246 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1247 FL("wait on ftm_comp_var failed %ld"), ret);
1248 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001249
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301250 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001251 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301252 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1253 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001254 status = VOS_STATUS_E_FAILURE;
1255 goto done;
1256 }
1257 ftm_status.chainSelect = chainSelect_save;
1258done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001259
1260 return status;
1261}
1262
1263/**---------------------------------------------------------------------------
1264 --------------------------------------------------------------------------*/
1265static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1266{
1267 int ii;
1268 int lenBuf = WE_FTM_MAX_STR_LEN;
1269 int lenRes = 0;
1270 char *chain[] = {
1271 "None",
1272 "R0,R1",
1273 "R0",
1274 "R1",
1275 "T0",
1276 "R0,R1,T0"
1277 };
1278 char *rx[] = {
1279 "disable",
1280 "11b/g/n",
1281 "11g/n",
1282 "11b"
1283 };
1284 char *tx[] = {
1285 "stopped",
1286 "started",
1287 };
1288 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1289
1290 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1291 {
1292 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1293 return VOS_STATUS_E_FAILURE;
1294 }
1295
1296 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001297 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001298 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1299 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001300 ftm_status.frameParams.interFrameSpace);
1301 if ((lenRes < 0) || (lenRes >= lenBuf))
1302 {
c_hpothuffdb5272013-10-02 16:42:35 +05301303 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1304 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001305 return VOS_STATUS_E_FAILURE;
1306 }
1307
1308 buf += lenRes;
1309 lenBuf -= lenRes;
1310
1311 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1312 {
1313 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1314 break;
1315 }
1316
1317 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1318 {
1319 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1320 }
1321 else
1322 {
1323 lenRes = strlcpy(buf, "invalid", lenBuf);
1324 }
1325 if ((lenRes < 0) || (lenRes >= lenBuf))
1326 {
c_hpothuffdb5272013-10-02 16:42:35 +05301327 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1328 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001329 return VOS_STATUS_E_FAILURE;
1330 }
1331
1332 buf += lenRes;
1333 lenBuf -= lenRes;
1334
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301335 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1336 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001337 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001338 ftm_status.frameParams.payloadLength);
1339
1340 if ((lenRes < 0) || (lenRes >= lenBuf))
1341 {
c_hpothuffdb5272013-10-02 16:42:35 +05301342 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1343 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001344 return VOS_STATUS_E_FAILURE;
1345 }
1346
1347 return VOS_STATUS_SUCCESS;
1348}
1349
Jeff Johnson295189b2012-06-20 16:38:30 -07001350
1351void HEXDUMP(char *s0, char *s1, int len)
1352{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301353 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001354 printk(KERN_EMERG "%s\n :", s0);
1355
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301356 if (len > 8)
1357 {
1358 for (j = 0; j < len/8; j++)
1359 {
1360 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1361 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1362 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1363 }
1364 len = len - j*8;
1365 }
1366 for (i = 0; i< len; i++) {
1367 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001368 }
1369 printk("\n");
1370}
1371
Jeff Johnson295189b2012-06-20 16:38:30 -07001372/*---------------------------------------------------------------------------
1373
1374 \brief vos_ftm_preStart() -
1375
1376 The \a vos_ftm_preStart() function to download CFG.
1377 including:
1378 - ccmStart
1379
1380 - WDA: triggers the CFG download
1381
1382
1383 \param pVosContext: The VOS context
1384
1385
1386 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1387 is ready to be used.
1388
1389 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1390 are unavailable to initialize the scheduler
1391
1392
1393 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1394
1395 \sa vos_start
1396
1397---------------------------------------------------------------------------*/
1398VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1399{
1400 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1401 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001402
Jeff Johnson295189b2012-06-20 16:38:30 -07001403 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1404 "vos prestart");
1405
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001406 if (NULL == pVosContext->pWDAContext)
1407 {
1408 VOS_ASSERT(0);
1409 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1410 "%s: WDA NULL context", __func__);
1411 return VOS_STATUS_E_FAILURE;
1412 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001413
1414 /* call macPreStart */
1415 vStatus = macPreStart(pVosContext->pMACContext);
1416 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1417 {
1418 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1419 "Failed at macPreStart ");
1420 return VOS_STATUS_E_FAILURE;
1421 }
1422
1423 /* call ccmStart */
1424 ccmStart(pVosContext->pMACContext);
1425
1426 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001427 vos_event_reset(&pVosContext->wdaCompleteEvent);
1428
Jeff Johnson295189b2012-06-20 16:38:30 -07001429
1430 /*call WDA pre start*/
1431 vStatus = WDA_preStart(pVosContext);
1432 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1433 {
1434 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1435 "Failed to WDA prestart ");
1436 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1437 ccmStop(pVosContext->pMACContext);
1438 VOS_ASSERT(0);
1439 return VOS_STATUS_E_FAILURE;
1440 }
1441
1442 /* Need to update time out of complete */
1443 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1444 if ( vStatus != VOS_STATUS_SUCCESS )
1445 {
1446 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1447 {
1448 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001449 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001450 }
1451 else
1452 {
1453 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001454 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001455 }
1456 VOS_ASSERT( 0 );
1457 return VOS_STATUS_E_FAILURE;
1458 }
1459
1460 return VOS_STATUS_SUCCESS;
1461}
Jeff Johnson295189b2012-06-20 16:38:30 -07001462
1463/**---------------------------------------------------------------------------
1464
1465 \brief wlan_hdd_ftm_open() -
1466
1467 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1468
1469 \param - pAdapter - Pointer HDD Context.
1470
1471 \return - 0 for success, non zero for failure
1472
1473 --------------------------------------------------------------------------*/
1474
1475int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1476{
1477 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1478 pVosContextType pVosContext= NULL;
1479 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001480
Jeff Johnson295189b2012-06-20 16:38:30 -07001481 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1482 "%s: Opening VOSS", __func__);
1483
1484 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1485
1486 if (NULL == pVosContext)
1487 {
1488 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301489 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001490 VOS_ASSERT(0);
1491 goto err_vos_status_failure;
1492 }
1493
1494 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301495 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001496
1497 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1498 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301499 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001500 goto err_vos_status_failure;
1501 }
1502
Jeff Johnson295189b2012-06-20 16:38:30 -07001503 /*
1504 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1505 */
1506 /* Save the hal context in Adapter */
1507 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001508
1509 if ( NULL == pHddCtx->hHal )
1510 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301511 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301512 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001513 }
1514
1515 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1516 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1517 if( NULL == pAdapter )
1518 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301519 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301520 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001521 }
1522
1523 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1524 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301525 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301526 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001527 }
1528
1529 //Initialize the nlink service
1530 if(nl_srv_init() != 0)
1531 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301532 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001533 goto err_ftm_register_wext_close;
1534 }
1535
Leo Chang9e646082013-08-02 11:20:21 -07001536#ifdef WLAN_KD_READY_NOTIFIER
1537 pHddCtx->kd_nl_init = 1;
1538#endif /* WLAN_KD_READY_NOTIFIER */
1539
Jeff Johnson295189b2012-06-20 16:38:30 -07001540#ifdef PTT_SOCK_SVC_ENABLE
1541 //Initialize the PTT service
1542 if(ptt_sock_activate_svc(pHddCtx) != 0)
1543 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301544 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001545 goto err_nl_srv_init;
1546 }
1547#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001548
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1550 pHddCtx->ftm.targetNVTableSize = 0;
1551 pHddCtx->ftm.targetNVTablePointer = NULL;
1552 pHddCtx->ftm.processedNVTableSize = 0;
1553 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1554 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1555 {
1556 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301557 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001558 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001559 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001560 }
1561 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001562
1563 _ftm_status_init();
1564 /* Initialize the ftm vos event */
1565 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1566 {
1567 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301568 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001569 VOS_ASSERT(0);
1570 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1571 goto err_nl_srv_init;
1572 }
1573
1574 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301575 init_completion(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07001576
1577 return VOS_STATUS_SUCCESS;
1578
1579err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001580#ifdef WLAN_KD_READY_NOTIFIER
1581nl_srv_exit(pHddCtx->ptt_pid);
1582#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001583nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001584#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001585err_ftm_register_wext_close:
1586hdd_UnregisterWext(pAdapter->dev);
1587
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301588err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001589err_adapter_open_failure:
1590hdd_close_all_adapters( pHddCtx );
1591
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301592err_ftm_vos_close:
1593 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001594err_vos_status_failure:
1595
1596 return VOS_STATUS_E_FAILURE;
1597}
1598
1599
1600
1601int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1602{
1603 VOS_STATUS vosStatus;
1604 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1605
1606 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1607 ENTER();
1608 if(pAdapter == NULL)
1609 {
1610 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1611 return VOS_STATUS_E_NOMEM;
1612 }
1613
Atul Mittalc41126d2014-03-17 15:10:11 +05301614 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1615 if (pHddCtx->ftm.IsCmdPending == TRUE)
1616 {
1617 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1618 {
1619 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1620 "%s: vos_event_set failed", __func__);
1621 }
1622 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001623 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1624 {
1625 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1626 "%s: Ftm has been started. stopping ftm", __func__);
1627 wlan_ftm_stop(pHddCtx);
1628 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001629
Leo Chang59cdc7e2013-07-10 10:08:21 -07001630#ifdef WLAN_KD_READY_NOTIFIER
1631 nl_srv_exit(pHddCtx->ptt_pid);
1632#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001633 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001634#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001635 //TODO----------
1636 //Deregister the device with the kernel
1637 hdd_UnregisterWext(pAdapter->dev);
1638
1639 hdd_close_all_adapters( pHddCtx );
1640#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001641 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001642 {
1643 unregister_netdev(pAdapter->dev);
1644 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1645 }
1646#endif
1647 //-----------------
1648
1649 vosStatus = vos_sched_close( vosContext );
1650 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1651 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1652 "%s: Failed to close VOSS Scheduler",__func__);
1653 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1654 }
1655
1656 //Close VOSS
1657 wlan_ftm_vos_close(vosContext);
1658
1659
1660 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1661 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1662 {
1663 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1664 "%s: Failed to destroy ftm_vos Event",__func__);
1665 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1666 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001667 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001668
Jeff Johnson295189b2012-06-20 16:38:30 -07001669 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001670}
1671
1672/**---------------------------------------------------------------------------
1673
1674 \brief wlan_ftm_send_response() -
1675
1676 The function sends the response to the ptt socket application running in user space.
1677
1678 \param - pAdapter - Pointer HDD Context.
1679
1680 \return - 0 for success, non zero for failure
1681
1682 --------------------------------------------------------------------------*/
1683
1684static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1685
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301686 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1687 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001688
Arif Hussain6d2a3322013-11-17 19:50:10 -08001689 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 -07001690 return VOS_STATUS_E_FAILURE;
1691 }
1692 return VOS_STATUS_SUCCESS;
1693}
1694
1695/**---------------------------------------------------------------------------
1696
1697 \brief wlan_hdd_ftm_start() -
1698
1699 This function gets called when the FTM start commands received from the ptt socket application and
1700 it starts the following modules.
1701 1) SAL Start.
1702 2) BAL Start.
1703 3) MAC Start to download the firmware.
1704
1705
1706 \param - pAdapter - Pointer HDD Context.
1707
1708 \return - 0 for success, non zero for failure
1709
1710 --------------------------------------------------------------------------*/
1711
1712static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1713{
1714 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1715 tSirRetStatus sirStatus = eSIR_SUCCESS;
1716 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1717 tHalMacStartParameters halStartParams;
1718
1719 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1720 {
1721 return VOS_STATUS_SUCCESS;
1722 }
1723
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301724 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTING;
1725
Jeff Johnson295189b2012-06-20 16:38:30 -07001726 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1727 "%s: Starting Libra SW", __func__);
1728
1729 /* We support only one instance for now ...*/
1730 if (pVosContext == NULL)
1731 {
1732 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001733 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001734 goto err_status_failure;
1735 }
1736
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001737
Jeff Johnson295189b2012-06-20 16:38:30 -07001738 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001739 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001740 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001741 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001742 goto err_status_failure;
1743 }
1744
Jeff Johnson295189b2012-06-20 16:38:30 -07001745 /*
1746 Prima needs to start the WDA correctly instead of BAL and SAL
1747 */
1748
1749 /* Vos preStart is calling */
1750 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1751 {
1752 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1753 goto err_status_failure;
1754 }
1755
1756
1757 vStatus = WDA_NVDownload_Start(pVosContext);
1758
1759 if ( vStatus != VOS_STATUS_SUCCESS )
1760 {
1761 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1762 "%s: Failed to start NV Download",__func__);
1763 return VOS_STATUS_E_FAILURE;
1764 }
1765
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301766 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001767
1768 if ( vStatus != VOS_STATUS_SUCCESS )
1769 {
1770 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1771 {
1772 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001773 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001774 }
1775 else
1776 {
1777 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001778 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001779 }
1780 VOS_ASSERT(0);
Wu Gaoece54202015-09-25 10:46:49 +08001781 WDA_setNeedShutdown(pHddCtx->pvosContext);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301782 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001783 }
1784
1785 vStatus = WDA_start(pVosContext);
1786 if (vStatus != VOS_STATUS_SUCCESS)
1787 {
1788 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1789 "%s: Failed to start WDA",__func__);
1790 goto err_status_failure;
1791 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001792
Jeff Johnson295189b2012-06-20 16:38:30 -07001793
1794 /* Start the MAC */
1795 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1796
Jeff Johnson295189b2012-06-20 16:38:30 -07001797
1798 halStartParams.driverType = eDRIVER_TYPE_MFG;
1799
1800 /* Start the MAC */
1801 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1802
Jeff Johnson295189b2012-06-20 16:38:30 -07001803
1804 if (eSIR_SUCCESS != sirStatus)
1805 {
1806 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1807 "%s: Failed to start MAC", __func__);
1808
Jeff Johnson295189b2012-06-20 16:38:30 -07001809 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001810 }
1811
1812 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1813 "%s: MAC correctly started",__func__);
1814
Jeff Johnson295189b2012-06-20 16:38:30 -07001815
1816 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1817
1818 return VOS_STATUS_SUCCESS;
1819
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001820err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001821 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1822 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1823 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1824 if(vStatus != VOS_STATUS_SUCCESS)
1825 {
1826 if(vStatus == VOS_STATUS_E_TIMEOUT)
1827 {
1828 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001829 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001830
1831 }
1832 else
1833 {
1834 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001835 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001836 }
1837 VOS_ASSERT(0);
1838 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001839
1840err_status_failure:
1841
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301842 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001843 return VOS_STATUS_E_FAILURE;
1844
1845}
1846
1847
1848static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1849{
1850 VOS_STATUS vosStatus;
1851
1852 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1853 {
1854 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1855 return VOS_STATUS_E_FAILURE;
1856 }
1857
1858 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1859 {
1860 /* STOP MAC only */
1861 v_VOID_t *hHal;
1862 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1863 if (NULL == hHal)
1864 {
1865 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1866 "%s: NULL hHal", __func__);
1867 }
1868 else
1869 {
1870 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1871 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1872 {
1873 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1874 "%s: Failed to stop SYS", __func__);
1875 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1876 }
1877 }
1878
Jeff Johnson295189b2012-06-20 16:38:30 -07001879
Jeff Johnson295189b2012-06-20 16:38:30 -07001880 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001881
1882 }
1883 return WLAN_FTM_SUCCESS;
1884}
1885
Jeff Johnson295189b2012-06-20 16:38:30 -07001886/**---------------------------------------------------------------------------
1887
1888 \brief wlan_hdd_ftm_get_nv_table() -
1889 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001890 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001891
1892 \param - ftmCmd - Pointer FTM Commad Buffer
1893
1894 \return - int
1895 -1, Process Host command fail, vail out
1896 1, Process Host command success
1897
1898 --------------------------------------------------------------------------*/
1899int wlan_hdd_ftm_get_nv_table
1900(
1901 hdd_context_t *pHddCtx,
1902 tPttMsgbuffer *ftmCmd
1903)
1904{
1905 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1906 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1907 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001908 sHalNvV2 *nvContents = NULL;
1909 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001910
Jeff Johnson295189b2012-06-20 16:38:30 -07001911 if (NULL == pHddCtx)
1912 {
1913 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1914 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001915 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001916 }
1917
Leo Chang80de3c22013-11-26 10:52:12 -08001918 nvVersion = vos_nv_getNvVersion();
1919 if (E_NV_V2 != nvVersion)
1920 {
1921 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1922 "%s : Not valid NV Version %d", __func__, nvVersion);
1923 return -EINVAL;
1924 }
1925
Jeff Johnson295189b2012-06-20 16:38:30 -07001926 /* Test first chunk of NV table */
1927 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1928 (0 == pHddCtx->ftm.processedNVTableSize))
1929 {
1930 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1931 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1932 {
c_hpothuffdb5272013-10-02 16:42:35 +05301933 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1934 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001935 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001936 }
1937
1938 switch (nvTable->nvTable)
1939 {
1940 case NV_TABLE_RATE_POWER_SETTINGS:
1941 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1942 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1943 break;
1944
1945 case NV_TABLE_REGULATORY_DOMAINS:
1946 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1947 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1948 break;
1949
1950 case NV_TABLE_DEFAULT_COUNTRY:
1951 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1952 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1953 break;
1954
1955 case NV_TABLE_TPC_POWER_TABLE:
1956 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1957 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1958 break;
1959
1960 case NV_TABLE_TPC_PDADC_OFFSETS:
1961 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1962 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1963 break;
1964
1965 case NV_TABLE_VIRTUAL_RATE:
1966 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1967 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1968 break;
1969
1970 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1971 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1972 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1973 break;
1974
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001975 case NV_TABLE_HW_CAL_VALUES:
1976 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1977 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1978 break;
1979
1980 case NV_TABLE_FW_CONFIG:
1981 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1982 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001983 break;
1984
1985 case NV_TABLE_ANTENNA_PATH_LOSS:
1986 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1987 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1988 break;
1989
1990 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1991 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1992 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1993 break;
1994
1995 default:
1996 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1997 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001998 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001999 break;
2000 }
2001
2002 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2003 {
2004 /* Invalid table size, discard and initialize data */
2005 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002006 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002007 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002008 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002009 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2010 pHddCtx->ftm.targetNVTableSize = 0;
2011 pHddCtx->ftm.processedNVTableSize = 0;
2012 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002013 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002014 }
2015
2016 /* Set Current Processing NV table type */
2017 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2018 /* Copy target NV table value into temp context buffer */
2019 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2020 pHddCtx->ftm.targetNVTablePointer,
2021 pHddCtx->ftm.targetNVTableSize);
2022
2023 }
2024
2025 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2026 {
2027 /* Invalid table type */
2028 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2029 "Invalid NV Table, now Processing %d, not %d",
2030 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2031 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2032 pHddCtx->ftm.targetNVTableSize = 0;
2033 pHddCtx->ftm.processedNVTableSize = 0;
2034 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002035
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002036 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002037 }
2038
2039 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002040 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002041 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2042 nvTable->chunkSize);
2043 /* Update processed pointer to prepare next chunk copy */
2044 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2045
2046 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2047 {
2048 /* Finished to process last chunk of data, initialize buffer */
2049 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2050 pHddCtx->ftm.targetNVTableSize = 0;
2051 pHddCtx->ftm.processedNVTableSize = 0;
2052 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2053 }
2054
2055 return 1;
2056}
2057
2058/**---------------------------------------------------------------------------
2059
2060 \brief wlan_hdd_ftm_set_nv_table() -
2061 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002062 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002063
2064 \param - ftmCmd - Pointer FTM Commad Buffer
2065
2066 \return - int
2067 -1, Process Host command fail, vail out
2068 1, Process Host command success
2069
2070 --------------------------------------------------------------------------*/
2071int wlan_hdd_ftm_set_nv_table
2072(
2073 hdd_context_t *pHddCtx,
2074 tPttMsgbuffer *ftmCmd
2075)
2076{
2077 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2078 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2079 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002080 sHalNvV2 *nvContents = NULL;
2081 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002082
2083 if (NULL == pHddCtx)
2084 {
2085 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2086 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002087 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 }
2089
Leo Chang80de3c22013-11-26 10:52:12 -08002090 nvVersion = vos_nv_getNvVersion();
2091 if (E_NV_V2 != nvVersion)
2092 {
2093 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2094 "%s : Not valid NV Version %d", __func__, nvVersion);
2095 return -EINVAL;
2096 }
2097
Jeff Johnson295189b2012-06-20 16:38:30 -07002098 /* Test first chunk of NV table */
2099 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2100 (0 == pHddCtx->ftm.processedNVTableSize))
2101 {
2102 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2103 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2104 {
c_hpothuffdb5272013-10-02 16:42:35 +05302105 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2106 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002107 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 }
2109
2110 switch (nvTable->nvTable)
2111 {
2112 case NV_TABLE_RATE_POWER_SETTINGS:
2113 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2114 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2115 break;
2116
2117 case NV_TABLE_REGULATORY_DOMAINS:
2118 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2119 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2120 break;
2121
2122 case NV_TABLE_DEFAULT_COUNTRY:
2123 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2124 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2125 break;
2126
2127 case NV_TABLE_TPC_POWER_TABLE:
2128 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2129 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2130 break;
2131
2132 case NV_TABLE_TPC_PDADC_OFFSETS:
2133 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2134 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2135 break;
2136
2137 case NV_TABLE_VIRTUAL_RATE:
2138 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2139 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2140 break;
2141
2142 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2143 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2144 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2145 break;
2146
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002147 case NV_TABLE_HW_CAL_VALUES:
2148 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2149 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2150 break;
2151
2152 case NV_TABLE_FW_CONFIG:
2153 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2154 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002155 break;
2156
2157 case NV_TABLE_ANTENNA_PATH_LOSS:
2158 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2159 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2160 break;
2161
2162 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2163 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2164 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2165 break;
2166
2167 default:
2168 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2169 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002170 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002171 break;
2172 }
2173
2174 /* Set Current Processing NV table type */
2175 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2176 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2177 {
2178 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2179 "Invalid Table Size %d", nvTable->tableSize);
2180 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2181 pHddCtx->ftm.targetNVTableSize = 0;
2182 pHddCtx->ftm.processedNVTableSize = 0;
2183 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002184 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002185 }
2186 }
2187
2188 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2189 {
2190 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2191 "Invalid NV Table, now Processing %d, not %d",
2192 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2193 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2194 pHddCtx->ftm.targetNVTableSize = 0;
2195 pHddCtx->ftm.processedNVTableSize = 0;
2196 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002197 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002198 }
2199 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002200 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002201 nvTable->chunkSize);
2202
2203 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2204 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2205 {
2206 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2207 pHddCtx->ftm.tempNVTableBuffer,
2208 pHddCtx->ftm.targetNVTableSize);
2209 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2210 pHddCtx->ftm.targetNVTableSize = 0;
2211 pHddCtx->ftm.processedNVTableSize = 0;
2212 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2213 }
2214
2215 return 1;
2216}
2217
2218/**---------------------------------------------------------------------------
2219
2220 \brief wlan_hdd_ftm_blank_nv() -
2221 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002222 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002223
2224 \param - ftmCmd - Pointer FTM Commad Buffer
2225
2226 \return - int
2227 -1, Process Host command fail, vail out
2228 0, Process Host command success
2229
2230 --------------------------------------------------------------------------*/
2231int wlan_hdd_ftm_blank_nv_table
2232(
2233 tPttMsgbuffer *ftmCmd
2234)
2235{
Leo Chang80de3c22013-11-26 10:52:12 -08002236 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002237 v_SIZE_t nvSize;
2238 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002239 sHalNvV2 *nvContents = NULL;
2240 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002241
2242 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2243 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2244 {
c_hpothuffdb5272013-10-02 16:42:35 +05302245 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2246 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002247 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002248 }
2249
Leo Chang80de3c22013-11-26 10:52:12 -08002250 nvVersion = vos_nv_getNvVersion();
2251 if (E_NV_V2 != nvVersion)
2252 {
2253 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2254 "%s : Not valid NV Version %d", __func__, nvVersion);
2255 return -EINVAL;
2256 }
2257
Jeff Johnson295189b2012-06-20 16:38:30 -07002258 itemSize = sizeof(nvContents->tables.pwrOptimum);
2259 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002260 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002261 itemSize);
2262
2263 itemSize = sizeof(nvContents->tables.regDomains);
2264 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002265 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002266 itemSize);
2267
2268 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2269 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002270 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002271 itemSize);
2272
2273 itemSize = sizeof(nvContents->tables.plutCharacterized);
2274 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002275 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002276 itemSize);
2277
2278 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2279 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002280 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002281 itemSize);
2282
2283 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2284 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002285 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002286 itemSize);
2287
2288 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2289 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002290 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002291 itemSize);
2292
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002293 itemSize = sizeof(nvContents->tables.hwCalValues);
2294 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002295 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002296 itemSize);
2297
2298 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2299 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002300 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002301 itemSize);
2302
2303 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2304 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002305 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002306 itemSize);
2307
2308 return 1;
2309}
2310
2311/**---------------------------------------------------------------------------
2312
2313 \brief wlan_hdd_ftm_delete_nv_table() -
2314 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002315 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002316
2317 \param - ftmCmd - Pointer FTM Commad Buffer
2318
2319 \return - int
2320 -1, Process Host command fail, vail out
2321 1, Process Host command success
2322
2323 --------------------------------------------------------------------------*/
2324int wlan_hdd_ftm_delete_nv_table
2325(
2326 tPttMsgbuffer *ftmCmd
2327)
2328{
Leo Chang80de3c22013-11-26 10:52:12 -08002329 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002330 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2331 v_SIZE_t nvSize;
2332 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002333 sHalNvV2 *nvContents = NULL;
2334 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002335
2336 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2337 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2338 {
c_hpothuffdb5272013-10-02 16:42:35 +05302339 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2340 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002341 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002342 }
2343
Leo Chang80de3c22013-11-26 10:52:12 -08002344 nvVersion = vos_nv_getNvVersion();
2345 if (E_NV_V2 != nvVersion)
2346 {
2347 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2348 "%s : Not valid NV Version %d", __func__, nvVersion);
2349 return -EINVAL;
2350 }
2351
Jeff Johnson295189b2012-06-20 16:38:30 -07002352 switch (nvTable->nvTable)
2353 {
2354 case NV_TABLE_RATE_POWER_SETTINGS:
2355 itemSize = sizeof(nvContents->tables.pwrOptimum);
2356 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002357 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002358 itemSize);
2359 break;
2360
2361 case NV_TABLE_REGULATORY_DOMAINS:
2362 itemSize = sizeof(nvContents->tables.regDomains);
2363 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002364 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002365 itemSize);
2366 break;
2367
2368 case NV_TABLE_DEFAULT_COUNTRY:
2369 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2370 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002371 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002372 itemSize);
2373 break;
2374
2375 case NV_TABLE_TPC_POWER_TABLE:
2376 itemSize = sizeof(nvContents->tables.plutCharacterized);
2377 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002378 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002379 itemSize);
2380 break;
2381
2382 case NV_TABLE_TPC_PDADC_OFFSETS:
2383 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2384 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002385 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002386 itemSize);
2387 break;
2388
2389 case NV_TABLE_VIRTUAL_RATE:
2390 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2391 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002392 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002393 itemSize);
2394 break;
2395
2396 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2397 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2398 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002399 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002400 itemSize);
2401 break;
2402
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002403 case NV_TABLE_HW_CAL_VALUES:
2404 itemSize = sizeof(nvContents->tables.hwCalValues);
2405 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002406 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002407 itemSize);
2408 break;
2409
2410 case NV_TABLE_FW_CONFIG:
2411 itemSize = sizeof(nvContents->tables.fwConfig);
2412 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002413 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002414 itemSize);
2415 break;
2416
2417 case NV_TABLE_ANTENNA_PATH_LOSS:
2418 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2419 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002420 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002421 itemSize);
2422 break;
2423
2424 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2425 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2426 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002427 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002428 itemSize);
2429 break;
2430
2431 default:
2432 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2433 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002434 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002435 break;
2436 }
2437
2438 return 1;
2439}
2440
2441/**---------------------------------------------------------------------------
2442
2443 \brief wlan_hdd_ftm_get_nv_field() -
2444 Get Specific NV field
2445
2446 \param - ftmCmd - Pointer FTM Commad Buffer
2447
2448 \return - int
2449 -1, Process Host command fail, vail out
2450 1, Process Host command success
2451
2452 --------------------------------------------------------------------------*/
2453int wlan_hdd_ftm_get_nv_field
2454(
2455 tPttMsgbuffer *ftmCmd
2456)
2457{
2458 sNvFields nvFieldDataBuffer;
2459 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2460 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2461 sHalNv *nvContents = NULL;
2462 v_SIZE_t nvSize;
2463
2464 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2465 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2466 {
c_hpothuffdb5272013-10-02 16:42:35 +05302467 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2468 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002469 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002470 }
2471 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2472
2473 switch (nvField->nvField)
2474 {
2475 case NV_COMMON_PRODUCT_ID:
2476 memcpy((void *)&nvField->fieldData,
2477 &nvFieldDataBuffer.productId,
2478 sizeof(nvFieldDataBuffer.productId));
2479 break;
2480
2481 case NV_COMMON_PRODUCT_BANDS:
2482 memcpy((void *)&nvField->fieldData,
2483 &nvFieldDataBuffer.productBands,
2484 sizeof(nvFieldDataBuffer.productBands));
2485 break;
2486
2487 case NV_COMMON_NUM_OF_TX_CHAINS:
2488 memcpy((void *)&nvField->fieldData,
2489 &nvFieldDataBuffer.numOfTxChains,
2490 sizeof(nvFieldDataBuffer.numOfTxChains));
2491 break;
2492
2493 case NV_COMMON_NUM_OF_RX_CHAINS:
2494 memcpy((void *)&nvField->fieldData,
2495 &nvFieldDataBuffer.numOfRxChains,
2496 sizeof(nvFieldDataBuffer.numOfRxChains));
2497 break;
2498
2499 case NV_COMMON_MAC_ADDR:
2500 memcpy((void *)&nvField->fieldData,
2501 &nvFieldDataBuffer.macAddr[0],
2502 NV_FIELD_MAC_ADDR_SIZE);
2503 break;
2504
2505 case NV_COMMON_MFG_SERIAL_NUMBER:
2506 memcpy((void *)&nvField->fieldData,
2507 &nvFieldDataBuffer.mfgSN[0],
2508 NV_FIELD_MFG_SN_SIZE);
2509 break;
2510
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002511 case NV_COMMON_WLAN_NV_REV_ID:
2512 memcpy((void *)&nvField->fieldData,
2513 &nvFieldDataBuffer.wlanNvRevId,
2514 sizeof(nvFieldDataBuffer.wlanNvRevId));
2515 break;
2516
Jeff Johnson295189b2012-06-20 16:38:30 -07002517 case NV_COMMON_COUPLER_TYPE:
2518 memcpy((void *)&nvField->fieldData,
2519 &nvFieldDataBuffer.couplerType,
2520 sizeof(nvFieldDataBuffer.couplerType));
2521 break;
2522
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002523 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002524 {
2525 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2526 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2527
2528 nvEmbededStatus = vos_nv_isEmbeddedNV();
2529
2530 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2531 {
2532 // High bit is set to indicate embedded NV..
2533 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2534 }
2535
2536 memcpy((void *)&nvField->fieldData,
2537 &nvVersion,
2538 sizeof(nvFieldDataBuffer.nvVersion));
2539 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002540 break;
2541
Jeff Johnson295189b2012-06-20 16:38:30 -07002542 default:
2543 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2544 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002545 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002546 break;
2547 }
2548
2549 return 1;
2550}
2551
2552/**---------------------------------------------------------------------------
2553
2554 \brief wlan_hdd_ftm_set_nv_field() -
2555 Set Specific NV field
2556
2557 \param - ftmCmd - Pointer FTM Commad Buffer
2558
2559 \return - int
2560 -1, Process Host command fail, vail out
2561 1, Process Host command success
2562
2563 --------------------------------------------------------------------------*/
2564int wlan_hdd_ftm_set_nv_field
2565(
2566 tPttMsgbuffer *ftmCmd
2567)
2568{
2569 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2570 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2571 v_SIZE_t nvSize;
2572 sHalNv *nvContents = NULL;
2573 v_U8_t macLoop;
2574 v_U8_t *pNVMac;
2575 v_U8_t lastByteMAC;
2576
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002577
Jeff Johnson295189b2012-06-20 16:38:30 -07002578 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2579 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2580 {
c_hpothuffdb5272013-10-02 16:42:35 +05302581 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2582 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002583 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002584 }
2585
2586 switch (nvField->nvField)
2587 {
2588 case NV_COMMON_PRODUCT_ID:
2589 memcpy(&nvContents->fields.productId,
2590 &nvField->fieldData,
2591 sizeof(nvContents->fields.productId));
2592 break;
2593
2594 case NV_COMMON_PRODUCT_BANDS:
2595 memcpy(&nvContents->fields.productBands,
2596 &nvField->fieldData,
2597 sizeof(nvContents->fields.productBands));
2598 break;
2599
2600 case NV_COMMON_NUM_OF_TX_CHAINS:
2601 memcpy(&nvContents->fields.numOfTxChains,
2602 &nvField->fieldData,
2603 sizeof(nvContents->fields.numOfTxChains));
2604 break;
2605
2606 case NV_COMMON_NUM_OF_RX_CHAINS:
2607 memcpy(&nvContents->fields.numOfRxChains,
2608 &nvField->fieldData,
2609 sizeof(nvContents->fields.numOfRxChains));
2610 break;
2611
2612 case NV_COMMON_MAC_ADDR:
2613 /* If Last byte is larger than 252 (0xFC), return Error,
2614 * Since 3MACs should be derived from first MAC */
2615 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002616 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002617 {
2618 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2619 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002620 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002621 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002622 }
2623
2624 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002625 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002626 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2627 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002628 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002629 lastByteMAC + macLoop;
2630 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002631 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002632 NV_FIELD_MAC_ADDR_SIZE);
2633 }
2634 break;
2635
2636 case NV_COMMON_MFG_SERIAL_NUMBER:
2637 memcpy(&nvContents->fields.mfgSN[0],
2638 &nvField->fieldData,
2639 NV_FIELD_MFG_SN_SIZE);
2640 break;
2641
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002642 case NV_COMMON_WLAN_NV_REV_ID:
2643 memcpy(&nvContents->fields.wlanNvRevId,
2644 &nvField->fieldData,
2645 sizeof(nvContents->fields.wlanNvRevId));
2646 break;
2647
Jeff Johnson295189b2012-06-20 16:38:30 -07002648 case NV_COMMON_COUPLER_TYPE:
2649 memcpy(&nvContents->fields.couplerType,
2650 &nvField->fieldData,
2651 sizeof(nvContents->fields.couplerType));
2652 break;
2653
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002654 case NV_COMMON_NV_VERSION:
2655 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2656 "Cannot modify NV version field %d", nvField->nvField);
2657 return -EIO;
2658 break;
2659
Jeff Johnson295189b2012-06-20 16:38:30 -07002660 default:
2661 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2662 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002663 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002664 break;
2665 }
2666
2667 return 1;
2668}
2669
2670/**---------------------------------------------------------------------------
2671
2672 \brief wlan_hdd_ftm_store_nv_table() -
2673 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002674 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002675
2676 \param - ftmCmd - Pointer FTM Commad Buffer
2677
2678 \return - int
2679 -1, Process Host command fail, vail out
2680 0, Process Host command success
2681
2682 --------------------------------------------------------------------------*/
2683int wlan_hdd_ftm_store_nv_table
2684(
2685 tPttMsgbuffer *ftmCmd
2686)
2687{
2688 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2689 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002690 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2691 void *tablePtr = NULL;
2692 unsigned int tableSize = 0;
2693 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002694 sHalNvV2 *nvContents = NULL;
2695 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002696
2697 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2698 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2699 {
c_hpothuffdb5272013-10-02 16:42:35 +05302700 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2701 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002702 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002703 }
2704
Leo Chang80de3c22013-11-26 10:52:12 -08002705 nvVersion = vos_nv_getNvVersion();
2706 if (E_NV_V2 != nvVersion)
2707 {
2708 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2709 "%s : Not valid NV Version %d", __func__, nvVersion);
2710 return -EINVAL;
2711 }
2712
Jeff Johnson295189b2012-06-20 16:38:30 -07002713 /* Set Platform type as PRIMA */
2714 nvContents->fields.wlanNvRevId = 2;
2715
2716 switch(nvTable->nvTable)
2717 {
2718 case NV_FIELDS_IMAGE:
2719 tablePtr = (void *)&nvContents->fields;
2720 tableSize = sizeof(nvContents->fields);
2721 tableVNVType = VNV_FIELD_IMAGE;
2722 break;
2723
2724 case NV_TABLE_RATE_POWER_SETTINGS:
2725 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2726 tableSize = sizeof(nvContents->tables.pwrOptimum);
2727 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2728 break;
2729
2730 case NV_TABLE_REGULATORY_DOMAINS:
2731 tablePtr = (void *)&nvContents->tables.regDomains[0];
2732 tableSize = sizeof(nvContents->tables.regDomains);
2733 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2734 break;
2735
2736 case NV_TABLE_DEFAULT_COUNTRY:
2737 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2738 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2739 tableVNVType = VNV_DEFAULT_LOCATION;
2740 break;
2741
2742 case NV_TABLE_TPC_POWER_TABLE:
2743 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2744 tableSize = sizeof(nvContents->tables.plutCharacterized);
2745 tableVNVType = VNV_TPC_POWER_TABLE;
2746 break;
2747
2748 case NV_TABLE_TPC_PDADC_OFFSETS:
2749 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2750 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2751 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2752 break;
2753
2754 case NV_TABLE_VIRTUAL_RATE:
2755 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2756 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2757 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2758 break;
2759
2760 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2761 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2762 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2763 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2764 break;
2765
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002766 case NV_TABLE_HW_CAL_VALUES:
2767 tablePtr = (void *)&nvContents->tables.hwCalValues;
2768 tableSize = sizeof(nvContents->tables.hwCalValues);
2769 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002770 break;
2771
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002772 case NV_TABLE_FW_CONFIG:
2773 tablePtr = (void *)&nvContents->tables.fwConfig;
2774 tableSize = sizeof(nvContents->tables.fwConfig);
2775 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002776 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002777
Jeff Johnson295189b2012-06-20 16:38:30 -07002778 case NV_TABLE_ANTENNA_PATH_LOSS:
2779 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2780 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2781 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2782 break;
2783
2784 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2785 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2786 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2787 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2788 break;
2789
2790 default:
2791 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2792 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002793 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002794 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002795
Jeff Johnson295189b2012-06-20 16:38:30 -07002796 }
2797
2798 nvStatus = vos_nv_write(tableVNVType,
2799 tablePtr,
2800 tableSize);
2801 if(VOS_STATUS_SUCCESS != nvStatus)
2802 {
c_hpothuffdb5272013-10-02 16:42:35 +05302803 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2804 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002805 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002806 }
2807
2808 return 1;
2809}
2810
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002811/* --------------------------------------------------------------------------
2812 \brief wlan_hdd_ftm_get_nv_bin() -
2813 Get NV bin read from Flash Memory, file
2814
2815 \param - ftmCmd - Pointer FTM Commad Buffer
2816
2817 \return - int
2818 -1, Process Host command fail, vail out
2819 0, Process Host command success
2820--------------------------------------------------------------------------*/
2821
2822static int wlan_hdd_ftm_get_nv_bin
2823(
2824 v_U16_t msgId,
2825 hdd_context_t *pHddCtx,
2826 tPttMsgbuffer *ftmCmd
2827)
2828{
2829 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2830 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2831 v_SIZE_t nvSize;
2832 v_U8_t *nvContents;
2833 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002834 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002835
Leo Chang80de3c22013-11-26 10:52:12 -08002836 nvVersion = vos_nv_getNvVersion();
2837 if (E_NV_V3 != nvVersion)
2838 {
2839 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2840 "%s : Not valid NV Version %d", __func__, nvVersion);
2841 return -EINVAL;
2842 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002843
2844 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2845 (0 == pHddCtx->ftm.processedNVTableSize))
2846 {
2847 if ( msgId == PTT_MSG_GET_NV_BIN )
2848 {
2849 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2850 }
2851 else
2852 {
2853 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2854 }
2855
2856 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2857 {
c_hpothuffdb5272013-10-02 16:42:35 +05302858 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2859 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002860 return -EIO;
2861 }
2862
2863 switch (nvTable->nvTable)
2864 {
2865 case NV_BINARY_IMAGE:
2866 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2867 break;
2868 default:
2869 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2870 "Not Valid NV Table %d", nvTable->nvTable);
2871 return -EIO;
2872 break;
2873 }
2874
2875 /* Set Current Processing NV table type */
2876 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2877 if ( msgId == PTT_MSG_GET_NV_BIN )
2878 {
2879 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2880 /* Validity Period */
2881 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2882 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2883 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2884 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2885 offset = sizeof(v_U32_t);
2886 }
2887 else
2888 {
2889 pHddCtx->ftm.targetNVTableSize = nvSize;
2890 offset = 0;
2891 }
2892
2893 /* Copy target NV table value into temp context buffer */
2894 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2895 pHddCtx->ftm.targetNVTablePointer,
2896 pHddCtx->ftm.targetNVTableSize);
2897 }
2898
2899
2900 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2901 {
2902 /* Invalid table type */
2903 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2904 "Invalid NV Table, now Processing %d, not %d",
2905 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2906
2907 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2908 pHddCtx->ftm.targetNVTableSize = 0;
2909 pHddCtx->ftm.processedNVTableSize = 0;
2910 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2911
2912 return -EINVAL;
2913 }
2914
2915 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2916
2917 /* Update processed pointer to prepare next chunk copy */
2918 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2919 pHddCtx->ftm.targetNVTableSize )
2920 {
2921 nvTable->chunkSize =
2922 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2923 }
2924
2925 /* Copy next chunk of NV table value into response buffer */
2926 vos_mem_copy(
2927 &nvTable->tableData,
2928 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2929 nvTable->chunkSize);
2930
2931 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2932
2933 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2934 {
2935 /* Finished to process last chunk of data, initialize buffer */
2936 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2937 pHddCtx->ftm.targetNVTableSize = 0;
2938 pHddCtx->ftm.processedNVTableSize = 0;
2939 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2940 }
2941
2942 return 1;
2943}
2944
2945/**---------------------------------------------------------------------------
2946
2947 \brief wlan_hdd_ftm_set_nv_bin() -
2948 Set NV bin to Flash Memory, file
2949
2950 \param - ftmCmd - Pointer FTM Commad Buffer
2951
2952 \return - int
2953 -1, Process Host command fail, vail out
2954 0, Process Host command success
2955
2956+----------------------------------------------------------------------------*/
2957
2958static int wlan_hdd_ftm_set_nv_bin
2959(
2960 hdd_context_t *pHddCtx,
2961 tPttMsgbuffer *ftmCmd
2962)
2963{
2964 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2965 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002966 eNvVersionType nvVersion;
2967
2968 nvVersion = vos_nv_getNvVersion();
2969 if (E_NV_V3 != nvVersion)
2970 {
2971 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2972 "%s : Not valid NV Version %d", __func__, nvVersion);
2973 return -EINVAL;
2974 }
2975
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002976
2977 /* Test first chunk of NV table */
2978 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2979 (0 == pHddCtx->ftm.processedNVTableSize))
2980 {
2981 switch (nvTable->nvTable)
2982 {
2983 case NV_BINARY_IMAGE:
2984 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2985 break;
2986 default:
2987 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2988 "Not Valid NV Table %d", nvTable->nvTable);
2989 return -EIO;
2990 break;
2991 }
2992
2993 /* Set Current Processing NV table type */
2994 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2995 pHddCtx->ftm.processedNVTableSize = 0;
2996
2997 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2998 {
2999 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3000 "Invalid Table Size %d", nvTable->tableSize);
3001 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3002 pHddCtx->ftm.targetNVTableSize = 0;
3003 pHddCtx->ftm.processedNVTableSize = 0;
3004 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3005 return -EINVAL;
3006 }
3007 }
3008
3009 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3010 {
3011 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3012 "Invalid NV Table, now Processing %d, not %d",
3013 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3014 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3015 pHddCtx->ftm.targetNVTableSize = 0;
3016 pHddCtx->ftm.processedNVTableSize = 0;
3017 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3018 return -EINVAL;
3019 }
3020
3021 vos_mem_copy(
3022 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3023 &nvTable->tableData,
3024 nvTable->chunkSize);
3025
3026 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3027
3028 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3029 {
3030 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3031 "Processing Done!! write encoded Buffer %d",
3032 pHddCtx->ftm.targetNVTableSize);
3033
3034 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3035 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3036
3037 if ((VOS_STATUS_SUCCESS != nvStatus))
3038 {
3039 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3040 "Fail to set NV Binary %d", nvStatus);
3041 return -EIO;
3042 }
3043
3044 nvStatus = vos_nv_setNVEncodedBuffer(
3045 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3046 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3047
3048 if ((VOS_STATUS_SUCCESS != nvStatus))
3049 {
3050 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3051 "Fail to set NV Binary %d", nvStatus);
3052 return -EIO;
3053 }
3054
3055 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3056 pHddCtx->ftm.targetNVTableSize = 0;
3057 pHddCtx->ftm.processedNVTableSize = 0;
3058 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3059 }
3060
3061 return 1;
3062}
3063
Jeff Johnson295189b2012-06-20 16:38:30 -07003064/**---------------------------------------------------------------------------
3065
3066 \brief wlan_hdd_ftm_temp_get_rel_num() -
3067 Get internal release number
3068
3069 \param - ftmCmd - Pointer FTM Commad Buffer
3070
3071 \return - int
3072 -1, Process Host command fail, vail out
3073 0, Process Host command success
3074
3075 --------------------------------------------------------------------------*/
3076int wlan_hdd_ftm_temp_get_rel_num
3077(
3078 tPttMsgbuffer *ftmCmd
3079)
3080{
3081 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3082
3083 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3084 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3085 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3086 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3087 relNum->relParams.pttMax = 10;
3088 relNum->relParams.pttMin = 1;
3089
3090 return 1;
3091}
3092
3093/**---------------------------------------------------------------------------
3094
3095 \brief wlan_hdd_process_ftm_host_cmd() -
3096 process any command should be handled within host.
3097 decide any command should be send to HAL or not
3098
3099 \param - ftmCmd - Pointer FTM Commad Buffer
3100
3101 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003102 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003103 0, Process Host command success, not need to send CMD to HAL
3104 1, Process Host command success, need to send CMD to HAL
3105
3106 --------------------------------------------------------------------------*/
3107int wlan_hdd_process_ftm_host_cmd
3108(
3109 hdd_context_t *pHddCtx,
3110 void *ftmCmd
3111)
3112{
3113 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3114 int needToRouteHal = 1;
3115 int hostState = 1;
3116
3117 switch(pFTMCmd->msgId)
3118 {
3119 case PTT_MSG_GET_NV_TABLE:
3120 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3121 needToRouteHal = 0;
3122 break;
3123
3124 case PTT_MSG_SET_NV_TABLE:
3125 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3126 /* Temp NV Operation will be isolated to host
3127 needToRouteHal = 1; */
3128 needToRouteHal = 0;
3129 break;
3130
3131 case PTT_MSG_BLANK_NV:
3132 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3133 needToRouteHal = 1;
3134 break;
3135
3136 case PTT_MSG_DEL_NV_TABLE:
3137 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3138 needToRouteHal = 1;
3139 break;
3140
3141 case PTT_MSG_GET_NV_FIELD:
3142 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3143 needToRouteHal = 0;
3144 break;
3145
3146 case PTT_MSG_SET_NV_FIELD:
3147 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3148 needToRouteHal = 0;
3149 break;
3150
3151 case PTT_MSG_STORE_NV_TABLE:
3152 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3153 needToRouteHal = 0;
3154 break;
3155
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003156 case PTT_MSG_GET_NV_BIN:
3157 case PTT_MSG_GET_DICTIONARY:
3158 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3159 needToRouteHal = 0;
3160 break;
3161
3162 case PTT_MSG_SET_NV_BIN:
3163 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3164 needToRouteHal = 0;
3165 break;
3166
Jeff Johnson295189b2012-06-20 16:38:30 -07003167 case PTT_MSG_DBG_READ_REGISTER:
3168 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3169 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3170 needToRouteHal = 0;
3171 break;
3172
3173 case PTT_MSG_DBG_WRITE_REGISTER:
3174 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3175 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3176 needToRouteHal = 0;
3177 break;
3178
3179 case PTT_MSG_DBG_READ_MEMORY:
3180 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3181 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3182 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3183 needToRouteHal = 0;
3184 break;
3185
3186 case PTT_MSG_DBG_WRITE_MEMORY:
3187 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3188 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3189 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3190 needToRouteHal = 0;
3191 break;
3192
3193 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3194 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3195 needToRouteHal = 0;
3196 break;
3197
3198 default:
3199 needToRouteHal = 1;
3200 break;
3201 }
3202
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003203 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003204 {
3205 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3206 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003207 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003208 }
3209
3210 return needToRouteHal;
3211}
Jeff Johnson295189b2012-06-20 16:38:30 -07003212
3213/**---------------------------------------------------------------------------
3214
3215 \brief wlan_hdd_process_ftm_cmd() -
3216
3217 This function process the commands received from the ptt socket application.
3218
3219 \param - pAdapter - Pointer HDD Context.
3220
3221 \param - wnl - Pointer to the ANI netlink header.
3222
3223 \return - none
3224
3225 --------------------------------------------------------------------------*/
3226
3227void wlan_hdd_process_ftm_cmd
3228(
3229 hdd_context_t *pHddCtx,
3230 tAniNlHdr *wnl
3231)
3232{
3233 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3234 v_U16_t cmd_len;
3235 v_U8_t *pftm_data;
3236 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003237 int hostState;
3238 tPttMsgbuffer *tempRspBuffer = NULL;
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303239 static int count;
Jeff Johnson295189b2012-06-20 16:38:30 -07003240
3241 ENTER();
3242
Jeff Johnsone7245742012-09-05 17:12:55 -07003243 //Delay to fix NV write failure on JB
3244 vos_busy_wait(10000); //10ms
3245
Jeff Johnson295189b2012-06-20 16:38:30 -07003246 if (!pRequestBuf) {
3247
Arif Hussain6d2a3322013-11-17 19:50:10 -08003248 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003249 return ;
3250 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303251
3252 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3253 {
3254 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3255 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3256 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3257 return ;
3258 }
3259
Jeff Johnson295189b2012-06-20 16:38:30 -07003260 /*Save the received request*/
3261 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3262
3263 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3264 /*Save the received request netlink header used for sending the response*/
3265 pHddCtx->ftm.wnl = wnl;
3266 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3267
Arif Hussain6d2a3322013-11-17 19:50:10 -08003268 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003269
3270 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3271 wlan_ftm_send_response(pHddCtx);
3272 return ;
3273 }
3274
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303275 if (VOS_FTM_MODE != hdd_get_conparam())
3276 {
3277 count++;
3278 if (count == 1 || !(count % 10))
3279 {
3280 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Driver not loaded in FTM"
3281 " mode, current mode: %d ",__func__, hdd_get_conparam());
3282 }
3283 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3284 wlan_ftm_send_response(pHddCtx);
3285 return ;
3286 }
3287
Jeff Johnson295189b2012-06-20 16:38:30 -07003288 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3289 {
3290 case WLAN_FTM_START:
3291 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3292
Arif Hussain6d2a3322013-11-17 19:50:10 -08003293 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003294 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3295 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3296 wlan_ftm_send_response(pHddCtx);
3297 return;
3298 }
3299
3300 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3301 {
3302 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3303 ,__func__);
3304 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3305 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303306 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003307 return;
3308 }
3309 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3310 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3311 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3312 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3313
3314 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303315 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003316 break;
3317
3318 case WLAN_FTM_STOP:
3319 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3320
Arif Hussain6d2a3322013-11-17 19:50:10 -08003321 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003322 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3323 wlan_ftm_send_response(pHddCtx);
3324 return;
3325 }
3326
3327 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3328
3329 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3330 wlan_ftm_send_response(pHddCtx);
3331 return;
3332 }
3333
3334 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3335 /* This would send back the Command Success Status */
3336 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3337
3338 wlan_ftm_send_response(pHddCtx);
3339
3340 break;
3341
3342 case WLAN_FTM_CMD:
3343 /* if it is regular FTM command, pass it to HAL PHY */
3344 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003345 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003346 return;
3347 }
3348 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3349
Arif Hussain6d2a3322013-11-17 19:50:10 -08003350 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003351
3352 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3353 wlan_ftm_send_response(pHddCtx);
3354 return;
3355
3356 }
3357 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3358 cmd_len = pRequestBuf->ftm_hdr.data_len;
3359 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3360 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3361
Jeff Johnson295189b2012-06-20 16:38:30 -07003362 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3363 if (0 == hostState)
3364 {
3365 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3366 if (NULL == tempRspBuffer)
3367 {
3368 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003369 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003370 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3371 wlan_ftm_send_response(pHddCtx);
3372 return;
3373 }
3374 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3375 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3376 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3377 (unsigned char *) tempRspBuffer,
3378 tempRspBuffer->msgBodyLength);
3379 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3380 wlan_ftm_send_response(pHddCtx);
3381 vos_mem_free(tempRspBuffer);
3382 return;
3383 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003384 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003385 {
3386 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3387 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3388 wlan_ftm_send_response(pHddCtx);
3389 return;
3390 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003391
3392 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3393
Jeff Johnson295189b2012-06-20 16:38:30 -07003394
3395 /*Post the command to the HAL*/
3396 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3397
Arif Hussain6d2a3322013-11-17 19:50:10 -08003398 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003399 return;
3400
3401 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303402 /*After successful posting of message the command should be pending*/
3403 pHddCtx->ftm.IsCmdPending = TRUE;
3404
Jeff Johnson295189b2012-06-20 16:38:30 -07003405 /*Wait here until you get the response from HAL*/
3406 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3407 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303408 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3409 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3410 wlan_ftm_send_response(pHddCtx);
3411 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003412 return;
3413 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303414 /*This check will handle the case where the completion is sent by
3415 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3416 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3417 {
3418 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3419 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3420 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3421
3422 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3423 wlan_ftm_send_response(pHddCtx);
3424 pHddCtx->ftm.IsCmdPending = FALSE;
3425 return ;
3426 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003427
3428 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3429
3430 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3431
3432 wlan_ftm_send_response(pHddCtx);
3433 pHddCtx->ftm.IsCmdPending = FALSE;
3434 break;
3435
3436 default:
3437
Arif Hussain6d2a3322013-11-17 19:50:10 -08003438 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003439 return;
3440 }
3441
3442 EXIT();
3443 return;
3444} /* wlan_adp_ftm_cmd() */
3445
3446/**---------------------------------------------------------------------------
3447
3448 \brief wlan_ftm_priv_start_stop_ftm() -
3449
3450 This function is used for start/stop the ftm driver.
3451
3452 \param - pAdapter - Pointer HDD Context.
3453 - start - 1/0 to start/stop ftm driver.
3454
3455 \return - 0 for success, non zero for failure
3456
3457 --------------------------------------------------------------------------*/
3458
3459static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3460 v_U16_t start)
3461{
3462 VOS_STATUS status;
3463 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3464
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003465 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003466 {
3467 pHddCtx->ftm.cmd_iwpriv = TRUE;
3468 status = wlan_hdd_ftm_start(pHddCtx);
3469
3470 if (status != VOS_STATUS_SUCCESS)
3471 {
3472 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3473 "FTM Start Failed");
3474 return VOS_STATUS_E_FAILURE;
3475 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303476 if (NULL == pMsgBuf)
3477 {
3478 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3479 if (NULL == pMsgBuf)
3480 {
3481 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3482 "%s:pMsgBuf is NULL", __func__);
3483 return VOS_STATUS_E_FAILURE;
3484 }
3485 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003486 }
3487 else
3488 {
3489 status = wlan_ftm_stop(pHddCtx);
3490
3491 if (status != VOS_STATUS_SUCCESS)
3492 {
3493 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3494 "FTM Stop Failed");
3495 return VOS_STATUS_E_FAILURE;
3496 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303497 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3498 if (pMsgBuf)
3499 {
3500 vos_mem_free((v_VOID_t * )pMsgBuf);
3501 pMsgBuf = NULL;
3502 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003503 }
3504 return VOS_STATUS_SUCCESS;
3505}
3506
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303507
3508static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3509{
3510 unsigned int *table = NULL;
3511 int index = 0;
3512
3513 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3514 table = valid_channel;
3515 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3516 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3517 table = valid_channel_cb40;
3518 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3519 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3520 table = valid_channel_cb80;
3521
3522 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303523 {
3524 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3525 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303526 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303527 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303528
3529 while (table[index] != 0)
3530 {
3531 if (table[index] == channel)
3532 return VOS_STATUS_SUCCESS;
3533
3534 index++;
3535 }
3536
3537 return VOS_STATUS_E_FAILURE;
3538}
3539
3540
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303541static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3542{
3543 unsigned int primary_channel = center_channel;
3544
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303545 switch (cb)
3546 {
3547 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3548 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3549 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3550 primary_channel -= 2;
3551 break;
3552
3553
3554 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3555 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3556 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3557 primary_channel += 2;
3558 break;
3559
3560 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3561 primary_channel -= 6;
3562 break;
3563
3564 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3565 primary_channel += 6;
3566 break;
3567 }
3568
3569 return primary_channel;
3570
3571}
3572
Jeff Johnson295189b2012-06-20 16:38:30 -07003573/**---------------------------------------------------------------------------
3574
3575 \brief wlan_ftm_priv_set_channel() -
3576
3577 This function is used for setting the channel to the halphy ptt module.
3578
3579 \param - pAdapter - Pointer HDD Context.
3580 - channel - Channel Number 1-14.
3581
3582 \return - 0 for success, non zero for failure
3583
3584 --------------------------------------------------------------------------*/
3585
3586static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3587{
Jeff Johnson295189b2012-06-20 16:38:30 -07003588 uPttMsgs *pMsgBody;
3589 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303590 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003591 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3592
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303593 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003594 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303595 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3596 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003597 return VOS_STATUS_E_FAILURE;
3598 }
3599
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303600 if (NULL == pMsgBuf)
3601 {
3602 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3603 "%s:pMsgBuf is NULL", __func__);
3604 return VOS_STATUS_E_NOMEM;
3605 }
3606
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303607 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003608 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303609 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3610 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003611 return VOS_STATUS_E_FAILURE;
3612 }
3613
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303614 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003615 init_completion(&pHddCtx->ftm.ftm_comp_var);
3616 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3617 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3618
3619 pMsgBody = &pMsgBuf->msgBody;
3620
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303621 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003622
Arif Hussain6d2a3322013-11-17 19:50:10 -08003623 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303624 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003625
3626 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3627
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303628 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003629 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303630 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3631 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003632 status = VOS_STATUS_E_FAILURE;
3633 goto done;
3634
3635 }
c_hpothuffdb5272013-10-02 16:42:35 +05303636 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303637 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303638 if (0 >= ret )
3639 {
3640 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3641 FL("wait on ftm_comp_var failed %ld"), ret);
3642 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003643
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303644 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003645 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303646 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3647 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003648 status = VOS_STATUS_E_FAILURE;
3649 goto done;
3650
3651 }
3652done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003653
3654 return status;
3655}
3656
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05303657static VOS_STATUS wlan_ftm_priv_set_dump(hdd_adapter_t *pAdapter, int *value)
3658{
3659 uPttMsgs *pMsgBody;
3660 VOS_STATUS status;
3661 long ret;
3662 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3663
3664 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3665 {
3666 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3667 "%s:Ftm has not started. Please start the ftm. ", __func__);
3668 return VOS_STATUS_E_FAILURE;
3669 }
3670
3671 if (NULL == pMsgBuf)
3672 {
3673 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3674 "%s:pMsgBuf is NULL", __func__);
3675 return VOS_STATUS_E_NOMEM;
3676 }
3677
3678 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
3679 init_completion(&pHddCtx->ftm.ftm_comp_var);
3680 pMsgBuf->msgId = PTT_MSG_PRIMA_GENERIC_CMD;
3681 pMsgBuf->msgBodyLength = sizeof(tMsgPttPrimaGenericCmd) + PTT_HEADER_LENGTH;
3682
3683 pMsgBody = &pMsgBuf->msgBody;
3684
3685 pMsgBody->PrimaGenericCmd.cmdIdx = value[0];
3686 pMsgBody->PrimaGenericCmd.param1 = value[1];
3687 pMsgBody->PrimaGenericCmd.param2 = value[2];
3688 pMsgBody->PrimaGenericCmd.param3 = value[3];
3689 pMsgBody->PrimaGenericCmd.param4 = value[4];
3690
3691 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3692
3693 if (status != VOS_STATUS_SUCCESS)
3694 {
3695 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3696 "%s:wlan_ftm_postmsg failed", __func__);
3697 status = VOS_STATUS_E_FAILURE;
3698 goto done;
3699 }
3700
3701 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3702 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3703 if (0 >= ret )
3704 {
3705 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3706 FL("wait on ftm_comp_var failed %ld"), ret);
3707 }
3708
3709 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3710 {
3711 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3712 "%s:Ptt response status failed", __func__);
3713 }
3714
3715 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3716 {
3717 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3718 "%s:Ptt response status failed", __func__);
3719 status = VOS_STATUS_E_FAILURE;
3720 goto done;
3721 }
3722
3723done:
3724 return status;
3725}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303726
3727/**---------------------------------------------------------------------------
3728
3729 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3730
3731 This function is used for setting the power control mode for tx.
3732
3733 \param - pAdapter - Pointer HDD Context.
3734 - pwr_mode - power control mode 0-2.
3735
3736 \return - 0 for success, non zero for failure
3737
3738 --------------------------------------------------------------------------*/
3739
3740static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3741 v_U16_t pwr_mode)
3742{
3743 uPttMsgs *pMsgBody;
3744 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303745 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303746 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3747
3748 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3749 {
3750 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3751 "%s:Ftm has not started. Please start the ftm. ", __func__);
3752 return VOS_STATUS_E_FAILURE;
3753 }
3754
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303755 if (NULL == pMsgBuf)
3756 {
3757 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3758 "%s:pMsgBuf is NULL", __func__);
3759 return VOS_STATUS_E_NOMEM;
3760 }
3761
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303762 if (pwr_mode > 2)
3763 {
3764 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3765 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3766 return VOS_STATUS_E_FAILURE;
3767 }
3768
3769 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3770 init_completion(&pHddCtx->ftm.ftm_comp_var);
3771 pMsgBody = &pMsgBuf->msgBody;
3772 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3773 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3774
3775 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3776 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3777
3778 if (status != VOS_STATUS_SUCCESS)
3779 {
3780 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3781 "%s:wlan_ftm_postmsg failed", __func__);
3782 status = VOS_STATUS_E_FAILURE;
3783 goto done;
3784 }
c_hpothuffdb5272013-10-02 16:42:35 +05303785 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303786 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303787 if (0 >= ret )
3788 {
3789 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3790 FL("wait on ftm_comp_var failed %ld"), ret);
3791 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303792
3793 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3794 {
3795 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3796 "%s:Ptt response status failed", __func__);
3797 status = VOS_STATUS_E_FAILURE;
3798 goto done;
3799 }
3800
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303801 ftm_status.powerCtlMode= pwr_mode;
3802
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303803 done:
3804 return status;
3805
3806}
3807
Jeff Johnson295189b2012-06-20 16:38:30 -07003808/**---------------------------------------------------------------------------
3809
3810 \brief wlan_ftm_priv_set_txpower() -
3811
3812 This function is used for setting the txpower to the halphy ptt module.
3813
3814 \param - pAdapter - Pointer HDD Context.
3815 - txpower - txpower Number 1-18.
3816
3817 \return - 0 for success, non zero for failure
3818
3819 --------------------------------------------------------------------------*/
3820
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303821static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3822 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003823{
Jeff Johnson295189b2012-06-20 16:38:30 -07003824 uPttMsgs *pMsgBody;
3825 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303826 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003827 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3828
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303829 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003830 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303831 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3832 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 return VOS_STATUS_E_FAILURE;
3834 }
3835
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303836 if (NULL == pMsgBuf)
3837 {
3838 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3839 "%s:pMsgBuf is NULL", __func__);
3840 return VOS_STATUS_E_NOMEM;
3841 }
3842
Jeff Johnson295189b2012-06-20 16:38:30 -07003843 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3844 * when tx pktgen is enabled
3845 */
3846 if (ftm_status.frameGenEnabled)
3847 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3849 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003850 return VOS_STATUS_E_FAILURE;
3851 }
3852
3853 if(!(txpower >= 9 && txpower <= 24))
3854 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303855 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3856 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003857 return VOS_STATUS_E_FAILURE;
3858 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003859
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303860 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3861 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003862 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003863 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3864 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3865
3866 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3867
3868 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3869
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303870 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003871 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303872 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3873 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003874 status = VOS_STATUS_E_FAILURE;
3875 goto done;
3876 }
c_hpothuffdb5272013-10-02 16:42:35 +05303877 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303878 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303879 if (0 >= ret )
3880 {
3881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3882 FL("wait on ftm_comp_var failed %ld"), ret);
3883 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003884
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303885 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003886 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303887 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3888 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003889 status = VOS_STATUS_E_FAILURE;
3890 goto done;
3891 }
3892
Jeff Johnson295189b2012-06-20 16:38:30 -07003893 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003894
3895 return status;
3896
3897}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303898
3899
3900static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3901 v_U16_t enable)
3902{
3903 tANI_U32 value = 0;
3904 tANI_U32 reg_addr;
3905 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303906
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303907 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3908 {
3909 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3910 "%s:Ftm has not started. Please start the ftm. ", __func__);
3911 return VOS_STATUS_E_FAILURE;
3912 }
3913
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303914 reg_addr = WCNSS_TXFIR_OFFSET;
3915
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303916 wpalReadRegister(reg_addr, &value);
3917 if (enable)
3918 {
3919 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3920 }
3921 else
3922 {
3923 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3924 }
3925
3926 wpalWriteRegister(reg_addr, value);
3927
3928 return VOS_STATUS_SUCCESS;
3929}
3930
3931
Jeff Johnson295189b2012-06-20 16:38:30 -07003932/**---------------------------------------------------------------------------
3933
3934 \brief wlan_ftm_priv_set_txrate() -
3935
3936 This function is used for setting the txrate to the halphy ptt module.
3937 It converts the user input string for txrate to the tx rate index.
3938
3939 \param - pAdapter - Pointer HDD Context.
3940 - txrate - Pointer to the tx rate string.
3941
3942 \return - 0 for success, non zero for failure
3943
3944 --------------------------------------------------------------------------*/
3945
3946static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3947{
3948 int ii;
3949 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3950 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3951 {
3952 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3953 return VOS_STATUS_E_FAILURE;
3954 }
3955
3956 /* do not allow to change setting when tx pktgen is enabled */
3957 if (ftm_status.frameGenEnabled)
3958 {
3959 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3960 return VOS_STATUS_E_FAILURE;
3961 }
3962
3963 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3964 {
3965 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3966 break;
3967 }
3968 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3969 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003970 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003971 return VOS_STATUS_E_FAILURE;
3972 }
3973
3974 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3975 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3976
3977 return VOS_STATUS_SUCCESS;
3978}
3979
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303980
3981
3982static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3983 ePowerTempIndexSource pwr_source)
3984{
3985 uPttMsgs *pMsgBody;
3986 VOS_STATUS status;
3987 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3988
3989 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3990 {
3991 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3992 "%s:Ftm has not started. Please start the ftm. ", __func__);
3993 return VOS_STATUS_E_FAILURE;
3994 }
3995
3996 if (pwr_source > 3)
3997 {
3998 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3999 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
4000 __func__);
4001 return VOS_STATUS_E_FAILURE;
4002 }
4003
4004 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
4005
4006 init_completion(&pHddCtx->ftm.ftm_comp_var);
4007 pMsgBody = &pMsgBuf->msgBody;
4008 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
4009 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
4010
4011 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
4012 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4013
4014 if (status != VOS_STATUS_SUCCESS)
4015 {
4016 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4017 "%s:wlan_ftm_postmsg failed", __func__);
4018 status = VOS_STATUS_E_FAILURE;
4019 goto done;
4020 }
4021 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4022 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4023
4024 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4025 {
4026 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4027 "%s:Ptt response status failed", __func__);
4028 status = VOS_STATUS_E_FAILURE;
4029 goto done;
4030 }
4031
4032done:
4033
4034 return status;
4035}
4036
4037
Jeff Johnson295189b2012-06-20 16:38:30 -07004038/**---------------------------------------------------------------------------
4039
4040 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
4041
4042 This function is used for start/stop the tx packet generation.
4043
4044 \param - pAdapter - Pointer HDD Context.
4045 - startStop - Value( 1/0) start/stop the tx packet generation.
4046
4047 \return - 0 for success, non zero for failure
4048
4049 --------------------------------------------------------------------------*/
4050
4051static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
4052{
Jeff Johnson295189b2012-06-20 16:38:30 -07004053 uPttMsgs *pMsgBody;
4054 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304055 long ret;
4056
Jeff Johnson295189b2012-06-20 16:38:30 -07004057 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4058
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304059 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004060 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304061 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4062 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004063 return VOS_STATUS_E_FAILURE;
4064 }
4065
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304066 if (NULL == pMsgBuf)
4067 {
4068 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4069 "%s:pMsgBuf is NULL", __func__);
4070 return VOS_STATUS_E_NOMEM;
4071 }
4072
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304073 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07004074 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304075 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4076 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004077 return VOS_STATUS_E_FAILURE;
4078 }
4079
4080 if ((ftm_status.frameGenEnabled && startStop == 1) ||
4081 (!ftm_status.frameGenEnabled && startStop == 0))
4082 {
4083 return VOS_STATUS_SUCCESS ;
4084 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304085 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004086
Jeff Johnson295189b2012-06-20 16:38:30 -07004087 if (startStop == 1)
4088 {
4089 init_completion(&pHddCtx->ftm.ftm_comp_var);
4090 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4091 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4092 pMsgBody = &pMsgBuf->msgBody;
4093 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4094
4095 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304096 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004097 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304098 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4099 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004100 status = VOS_STATUS_E_FAILURE;
4101 goto done;
4102 }
4103
c_hpothuffdb5272013-10-02 16:42:35 +05304104 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304105 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304106 if (0 >= ret )
4107 {
4108 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4109 FL("wait on ftm_comp_var failed %ld"), ret);
4110 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304111 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004112 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304113 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4114 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004115 status = VOS_STATUS_E_FAILURE;
4116 goto done;
4117 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304118
4119 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4120 {
4121 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4122 if(status != VOS_STATUS_SUCCESS)
4123 {
4124 goto done;
4125 }
4126 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004127 }
4128
4129 init_completion(&pHddCtx->ftm.ftm_comp_var);
4130 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4131 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4132 pMsgBody = &pMsgBuf->msgBody;
4133 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4134
4135 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4136 if(status != VOS_STATUS_SUCCESS)
4137 {
4138 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4139 status = VOS_STATUS_E_FAILURE;
4140 goto done;
4141 }
4142
c_hpothuffdb5272013-10-02 16:42:35 +05304143 ret = wait_for_completion_interruptible_timeout(
4144 &pHddCtx->ftm.ftm_comp_var,
4145 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4146 if (0 >= ret )
4147 {
4148 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4149 FL("wait on ftm_comp_var failed %ld"), ret);
4150 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004151 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4152 {
4153 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4154 status = VOS_STATUS_E_FAILURE;
4155 goto done;
4156 }
4157
4158done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004159
4160 if (status == VOS_STATUS_SUCCESS)
4161 {
4162 if (startStop == 1)
4163 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304164 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004165 }
4166 else
4167 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304168 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004169 }
4170 }
4171
4172 return status;
4173}
4174
4175
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304176
4177static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4178{
4179
4180 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4181 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4182 {
4183 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4184 "%s:Ftm has not started. Please start the ftm. ", __func__);
4185 return VOS_STATUS_E_FAILURE;
4186 }
4187
4188 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4189 {
4190 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4191 "%s:cb mode value is invalid ", __func__);
4192 return VOS_STATUS_E_FAILURE;
4193 }
4194
4195 ftm_status.cbmode = cbmode;
4196
4197 return VOS_STATUS_SUCCESS;
4198
4199}
4200
Jeff Johnson295189b2012-06-20 16:38:30 -07004201/**---------------------------------------------------------------------------
4202
4203 \brief wlan_ftm_rx_mode() -
4204
4205 This function is used for start/stop the rx packet generation.
4206
4207 \param - pAdapter - Pointer HDD Context.
4208 - rxmode - 0-disable RX.
4209 - 1-rx ALL frames
4210 - 2-rx 11 g/n frames
4211 - 3-rx 11b frames
4212
4213 \return - 0 for success, non zero for failure
4214
4215 --------------------------------------------------------------------------*/
4216
4217static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4218{
Jeff Johnson295189b2012-06-20 16:38:30 -07004219 uPttMsgs *pMsgBody;
4220 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304221 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004222
4223 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304224 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004225 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304226 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4227 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004228 return VOS_STATUS_E_FAILURE;
4229 }
4230
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304231 if (NULL == pMsgBuf)
4232 {
4233 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4234 "%s:pMsgBuf is NULL", __func__);
4235 return VOS_STATUS_E_NOMEM;
4236 }
4237
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304238 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004239 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304240 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4241 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004242 return VOS_STATUS_E_FAILURE;
4243 }
4244
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304245 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004246 init_completion(&pHddCtx->ftm.ftm_comp_var);
4247
4248 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4249 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4250
4251 pMsgBody = &pMsgBuf->msgBody;
4252
4253 switch(rxmode)
4254 {
4255 case RXMODE_DISABLE_ALL:
4256 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4257 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4258 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4259 break;
4260
4261 case RXMODE_ENABLE_ALL:
4262 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4263 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4264 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4265 break;
4266
4267 case RXMODE_ENABLE_11GN:
4268 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4269 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4270 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4271 break;
4272
4273 case RXMODE_ENABLE_11B:
4274 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4275 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4276 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4277 break;
4278
4279 }
4280
4281 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4282
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304283 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004284 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304285 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4286 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004287 status = VOS_STATUS_E_FAILURE;
4288 goto done;
4289 }
c_hpothuffdb5272013-10-02 16:42:35 +05304290 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304291 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304292 if (0 >= ret )
4293 {
4294 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4295 FL(" wait on ftm_comp_var failed %ld"), ret);
4296 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004297
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304298 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004299 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304300 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4301 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004302 status = VOS_STATUS_E_FAILURE;
4303 goto done;
4304 }
4305 ftm_status.rxmode = rxmode ;
4306done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004307
4308 return status;
4309}
4310
4311/**---------------------------------------------------------------------------
4312
4313 \brief wlan_ftm_priv_rx_pkt_clear() -
4314
4315 This function sets the rx pkt count to zero.
4316
4317 \param - pAdapter - Pointer HDD Context.
4318 - rx_pkt_clear - rx_pkt_clear value.
4319
4320 \return - 0 for success, non zero for failure
4321
4322 --------------------------------------------------------------------------*/
4323
4324static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4325{
Jeff Johnson295189b2012-06-20 16:38:30 -07004326 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304327 long ret;
4328
Jeff Johnson295189b2012-06-20 16:38:30 -07004329 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4330
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304331 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004332 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304333 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4334 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004335 return VOS_STATUS_E_FAILURE;
4336 }
4337
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304338 if (NULL == pMsgBuf)
4339 {
4340 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4341 "%s:pMsgBuf is NULL", __func__);
4342 return VOS_STATUS_E_NOMEM;
4343 }
4344
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304345 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004346 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304347 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4348 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004349 return VOS_STATUS_E_FAILURE;
4350 }
4351
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304352 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004353 init_completion(&pHddCtx->ftm.ftm_comp_var);
4354 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304355 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004356
Jeff Johnson295189b2012-06-20 16:38:30 -07004357 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4358
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304359 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004360 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304361 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4362 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004363 status = VOS_STATUS_E_FAILURE;
4364 goto done;
4365 }
c_hpothuffdb5272013-10-02 16:42:35 +05304366 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304367 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304368 if (0 >= ret )
4369 {
4370 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4371 FL("wait on ftm_comp_var failed %ld"), ret);
4372 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004373
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304374 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004375 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304376 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4377 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004378 status = VOS_STATUS_E_FAILURE;
4379 goto done;
4380 }
4381done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004382
4383 return status;
4384}
4385
4386/**---------------------------------------------------------------------------
4387
4388 \brief wlan_ftm_priv_get_channel() -
4389
4390 This function gets the channel number from the halphy ptt module and
4391 returns the channel number to the application.
4392
4393 \param - pAdapter - Pointer HDD Context.
4394 - pChannel - Poniter to get the Channel number.
4395
4396 \return - 0 for success, non zero for failure
4397
4398 --------------------------------------------------------------------------*/
4399
4400static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4401{
Jeff Johnson295189b2012-06-20 16:38:30 -07004402 uPttMsgs *pMsgBody;
4403 VOS_STATUS status;
4404 v_U16_t freq;
c_hpothuffdb5272013-10-02 16:42:35 +05304405 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004406
4407 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304408 v_PVOID_t devHandle = pHddCtx->parent_dev;
4409 struct device *wcnss_device = (struct device *)devHandle;
4410 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304411 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004412 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304413 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4414 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004415 return VOS_STATUS_E_FAILURE;
4416 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304417
4418 if (NULL == pMsgBuf)
4419 {
4420 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4421 "%s:pMsgBuf is NULL", __func__);
4422 return VOS_STATUS_E_NOMEM;
4423 }
4424
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304425 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004426 init_completion(&pHddCtx->ftm.ftm_comp_var);
4427 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4428 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4429
4430 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304431 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4432 if (NULL == wcnss_memory)
4433 {
4434 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4435 "%s: wcnss_memory is NULL", __func__);
4436 return VOS_STATUS_E_NOMEM;
4437 }
4438 else
4439 {
4440 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4441 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4442 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004443 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4444
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304445 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004446 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304447 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4448 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004449 status = VOS_STATUS_E_FAILURE;
4450 goto done;
4451
4452 }
c_hpothuffdb5272013-10-02 16:42:35 +05304453 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304454 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304455 if (0 >= ret )
4456 {
4457 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4458 FL("wait on ftm_comp_var failed %ld"), ret);
4459 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004460
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304461 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004462 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304463 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4464 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004465 status = VOS_STATUS_E_FAILURE;
4466 goto done;
4467 }
4468
4469 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4470
Hanumantha Reddy Pothulae950ada2015-10-13 19:39:35 +05304471 *pChannel = vos_freq_to_chan(freq);
4472 (*pChannel) ? (status = VOS_STATUS_SUCCESS) : (status = VOS_STATUS_E_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004473
Arif Hussain6d2a3322013-11-17 19:50:10 -08004474 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004475 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004476
4477 return status;
4478}
4479
4480/**---------------------------------------------------------------------------
4481
4482 \brief wlan_ftm_priv_get_txpower() -
4483
4484 This function gets the TX power from the halphy ptt module and
4485 returns the TX power to the application.
4486
4487 \param - pAdapter - Pointer HDD Context.
4488 - pTxPwr - Poniter to get the Tx power.
4489
4490 \return - 0 for success, non zero for failure
4491
4492 --------------------------------------------------------------------------*/
4493
4494static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4495{
Jeff Johnson295189b2012-06-20 16:38:30 -07004496 uPttMsgs *pMsgBody;
4497 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304498 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004499 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4500
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304501 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004502 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304503 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4504 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004505 return VOS_STATUS_E_FAILURE;
4506 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304507
4508 if (NULL == pMsgBuf)
4509 {
4510 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4511 "%s:pMsgBuf is NULL", __func__);
4512 return VOS_STATUS_E_NOMEM;
4513 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304514 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004515 init_completion(&pHddCtx->ftm.ftm_comp_var);
4516 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4517 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4518
4519 pMsgBody = &pMsgBuf->msgBody;
4520
4521 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4522
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304523 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004524 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304525 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4526 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004527 status = VOS_STATUS_E_FAILURE;
4528 goto done;
4529 }
c_hpothuffdb5272013-10-02 16:42:35 +05304530 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304531 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304532 if (0 >= ret )
4533 {
4534 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4535 FL("wait on ftm_comp_var failed %ld"), ret);
4536 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004537
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304538 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004539 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304540 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4541 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004542 status = VOS_STATUS_E_FAILURE;
4543 goto done;
4544 }
4545 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4546
4547 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004548
4549 return status;
4550}
4551
4552/**---------------------------------------------------------------------------
4553
Jeff Johnson295189b2012-06-20 16:38:30 -07004554 \brief wlan_ftm_priv_get_txrate() -
4555
4556 This function gets the TX rate from the halphy ptt module and
4557 returns the TX rate to the application.
4558
4559 \param - pAdapter - Pointer HDD Context.
4560 - pTxRate - Poniter to get the Tx rate.
4561
4562 \return - 0 for success, non zero for failure
4563
4564 --------------------------------------------------------------------------*/
4565
4566static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4567{
Jeff Johnson295189b2012-06-20 16:38:30 -07004568 uPttMsgs *pMsgBody;
4569 VOS_STATUS status;
4570 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304571 long ret;
4572
Jeff Johnson295189b2012-06-20 16:38:30 -07004573 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4574
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304575 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004576 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304577 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4578 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004579 return VOS_STATUS_E_FAILURE;
4580 }
4581
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304582 if (NULL == pMsgBuf)
4583 {
4584 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4585 "%s:pMsgBuf is NULL", __func__);
4586 return VOS_STATUS_E_NOMEM;
4587 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304588 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004589 init_completion(&pHddCtx->ftm.ftm_comp_var);
4590 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4591 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4592
4593 pMsgBody = &pMsgBuf->msgBody;
4594
4595 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4596
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304597 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004598 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304599 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4600 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004601 status = VOS_STATUS_E_FAILURE;
4602 goto done;
4603 }
c_hpothuffdb5272013-10-02 16:42:35 +05304604 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304605 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304606 if (0 >= ret )
4607 {
4608 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4609 FL("wait on ftm_comp_var failed %ld"), ret);
4610 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004611
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304612 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004613
4614 rate_index = pMsgBody->GetTxPowerReport.rate;
4615 }
4616 else {
4617 /*Return the default rate*/
4618 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304619 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4620 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004621 status = VOS_STATUS_E_FAILURE;
4622 goto done;
4623 }
4624
4625 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4626 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4627 break;
4628 }
4629 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4630 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004631 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004632 status = VOS_STATUS_E_FAILURE;
4633 goto done;
4634 }
4635 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4636done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004637
4638 return status;
4639
4640}
4641
4642/**---------------------------------------------------------------------------
4643
4644 \brief wlan_ftm_priv_get_rx_pkt_count() -
4645
4646 This function gets the rx pkt count from the halphy ptt module and
4647 returns the rx pkt count to the application.
4648
4649 \param - pAdapter - Pointer HDD Context.
4650 - pRxPktCnt - Poniter to get the rx pkt count.
4651
4652 \return - 0 for success, non zero for failure
4653
4654 --------------------------------------------------------------------------*/
4655
4656static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4657{
Jeff Johnson295189b2012-06-20 16:38:30 -07004658 uPttMsgs *pMsgBody;
4659 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304660 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004661 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4662
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304663 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304665 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4666 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004667 return VOS_STATUS_E_FAILURE;
4668 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304669
4670 if (NULL == pMsgBuf)
4671 {
4672 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4673 "%s:pMsgBuf is NULL", __func__);
4674 return VOS_STATUS_E_NOMEM;
4675 }
4676
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304677 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004678 init_completion(&pHddCtx->ftm.ftm_comp_var);
4679 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4680 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4681
4682 pMsgBody = &pMsgBuf->msgBody;
4683
4684 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4685
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304686 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004687 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304688 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4689 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004690 status = VOS_STATUS_E_FAILURE;
4691 goto done;
4692 }
c_hpothuffdb5272013-10-02 16:42:35 +05304693 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304694 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304695 if (0 >= ret )
4696 {
4697 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4698 FL("wait on ftm_comp_var failed %ld"), ret);
4699 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004700
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304701 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004702 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304703 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4704 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004705 status = VOS_STATUS_E_FAILURE;
4706 goto done;
4707 }
4708 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4709done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004710
4711 return status;
4712}
4713
4714/**---------------------------------------------------------------------------
4715
4716 \brief wlan_ftm_priv_get_rx_rssi() -
4717
4718 This function gets the rx rssi from the halphy ptt module and
4719 returns the rx rssi to the application.
4720
4721 \param - pAdapter - Pointer HDD Context.
4722 - buf - Poniter to get rssi of Rx chains
4723
4724 \return - 0 for success, non zero for failure
4725
4726 --------------------------------------------------------------------------*/
4727
4728static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4729{
Jeff Johnson295189b2012-06-20 16:38:30 -07004730 uPttMsgs *pMsgBody;
4731 VOS_STATUS status;
4732 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304733 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004734
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304735 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004736 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304737 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4738 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004739 return VOS_STATUS_E_FAILURE;
4740 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304741
4742 if (NULL == pMsgBuf)
4743 {
4744 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4745 "%s:pMsgBuf is NULL", __func__);
4746 return VOS_STATUS_E_NOMEM;
4747 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304748 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004749 init_completion(&pHddCtx->ftm.ftm_comp_var);
4750 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4751 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4752
4753 pMsgBody = &pMsgBuf->msgBody;
4754
4755 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4756
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304757 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004758 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4760 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004761 status = VOS_STATUS_E_FAILURE;
4762 goto done;
4763 }
c_hpothuffdb5272013-10-02 16:42:35 +05304764 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304765 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304766 if (0 >= ret )
4767 {
4768 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4769 FL("wait on ftm_comp_var failed %ld"), ret);
4770 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004771
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304772 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004773 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304774 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4775 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004776 status = VOS_STATUS_E_FAILURE;
4777 goto done;
4778 }
4779
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004780 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4781 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004782 pMsgBody->GetRxRssi.rssi.rx[1]);
4783
4784 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4785 {
4786 status = VOS_STATUS_E_FAILURE;
4787 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004788
Jeff Johnson295189b2012-06-20 16:38:30 -07004789done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004790
4791 return status;
4792}
4793
4794/**---------------------------------------------------------------------------
4795
4796 \brief wlan_ftm_priv_get_mac_address() -
4797
4798 This function gets the mac address from the halphy ptt module and
4799 returns the mac address to the application.
4800
4801 \param - pAdapter - Pointer HDD Context.
4802 - buf - Poniter to get the mac address.
4803
4804 \return - 0 for success, non zero for failure
4805
4806 --------------------------------------------------------------------------*/
4807
4808static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4809{
4810 v_BOOL_t itemIsValid = VOS_FALSE;
4811 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4812 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004813
Jeff Johnson295189b2012-06-20 16:38:30 -07004814 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4815
4816 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4817 {
4818 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4819 return VOS_STATUS_E_FAILURE;
4820 }
4821 /*Check the NV FIELD is valid or not*/
4822 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4823 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004824 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004825 {
4826 vos_nv_readMacAddress(macAddr);
4827
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004828 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4829 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004830 MAC_ADDR_ARRAY(macAddr));
4831 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4832 {
4833 return VOS_STATUS_E_FAILURE;
4834 }
4835 }
4836 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004837 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004838 {
4839 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004840 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4841 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004842 MAC_ADDR_ARRAY(macAddr));
4843
4844 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4845 {
4846 return VOS_STATUS_E_FAILURE;
4847 }
4848 }
4849 return VOS_STATUS_SUCCESS;
4850}
4851
4852/**---------------------------------------------------------------------------
4853
4854 \brief wlan_ftm_priv_set_mac_address() -
4855
4856 This function sets the mac address to the halphy ptt module and
4857 sends the netlink message to the ptt socket application which writes
4858 the macaddress to the qcom_wlan_nv.bin file
4859
4860 \param - pAdapter - Pointer HDD Context.
4861 - buf - Poniter to the macaddress.
4862
4863 \return - 0 for success, non zero for failure
4864
4865 --------------------------------------------------------------------------*/
4866
4867static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4868{
Jeff Johnson295189b2012-06-20 16:38:30 -07004869 uPttMsgs *pMsgBody;
4870 VOS_STATUS status;
4871 int macAddr[VOS_MAC_ADDRESS_LEN];
4872 v_U8_t *pMacAddress;
4873 v_U8_t ii;
4874 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304875 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004876
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304877 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004878 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304879 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4880 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004881 return VOS_STATUS_E_FAILURE;
4882 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304883 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004884 init_completion(&pHddCtx->ftm.ftm_comp_var);
4885 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4886 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4887
4888 pMsgBody = &pMsgBuf->msgBody;
4889 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4890
4891 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004892 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]))
4893 {
4894 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4895 "Invalid MacAddress Input %s", buf);
4896 return VOS_STATUS_E_FAILURE;
4897 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004898
Arif Hussain24bafea2013-11-15 15:10:03 -08004899 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4900 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004901
4902
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004903 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004904
4905 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4906 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4907
4908
Arif Hussain24bafea2013-11-15 15:10:03 -08004909 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4910 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004911 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4912
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304913 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304915 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4916 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004917 status = VOS_STATUS_E_FAILURE;
4918 goto done;
4919 }
c_hpothuffdb5272013-10-02 16:42:35 +05304920 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304921 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304922 if (0 >= ret )
4923 {
4924 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4925 FL("wait on ftm_comp_var failed %ld"), ret);
4926 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004927
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304928 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004929 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304930 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4931 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004932 status = VOS_STATUS_E_FAILURE;
4933 goto done;
4934 }
4935
Arif Hussain6d2a3322013-11-17 19:50:10 -08004936 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004937
4938 init_completion(&pHddCtx->ftm.ftm_comp_var);
4939 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4940
4941 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4942 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4943
4944 pMsgBody = &pMsgBuf->msgBody;
4945
4946 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4947
4948 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4949
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304950 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004951 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304952 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4953 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004954 status = VOS_STATUS_E_FAILURE;
4955 goto done;
4956 }
4957
c_hpothuffdb5272013-10-02 16:42:35 +05304958 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304959 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304960 if (0 >= ret )
4961 {
4962 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4963 FL("wait on ftm_comp_var failed %ld"), ret);
4964 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004965done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004966
4967 return VOS_STATUS_SUCCESS;
4968}
4969
4970/* set param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304971static int __iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004972 union iwreq_data *wrqu, char *extra)
4973{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004974 int ret,sub_cmd;
4975 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304976 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004977 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004978 hdd_adapter_t *pAdapter;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304979 hdd_context_t *pHddCtx;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304980 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07004981
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304982 ENTER();
4983
Hanumantha Reddy Pothulac4928592015-10-27 16:49:59 +05304984 if (!capable(CAP_NET_ADMIN))
4985 {
4986 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4987 FL("permission check failed"));
4988 return -EPERM;
4989 }
4990
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004991 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304992 /* helper function to get iwreq_data with compat handling. */
4993 if (hdd_priv_get_data(&s_priv_data, wrqu))
4994 {
4995 return -EINVAL;
4996 }
4997
4998 /* make sure all params are correctly passed to function */
4999 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
5000 {
5001 return -EINVAL;
5002 }
5003
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305004 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
5005 if (NULL == pAdapter)
5006 {
5007 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5008 "%s: Adapter is NULL",__func__);
5009 return -EINVAL;
5010 }
5011 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5012 ret = wlan_hdd_validate_context(pHddCtx);
5013 if (0 != ret)
5014 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305015 return ret;
5016 }
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305017 sub_cmd = s_priv_data.flags;
5018 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005019
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005020 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
5021 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
5022 * odd number which assigns set_args to zero.we assisgn memory using
5023 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005024 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005025 param = kzalloc(length + 1, GFP_KERNEL);
5026 if (!param)
5027 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08005028
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305029 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005030 {
5031 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
5032 "%s:Failed to get user data %s", __func__, param);
5033
5034 ret = -EINVAL;
5035 goto OUT;
5036 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005037
5038 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305039 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005040
5041 switch(sub_cmd)
5042 {
5043 case WE_SET_MAC_ADDRESS:
5044 {
5045
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005046 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005047 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005048
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005049 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005050
5051 if(status != VOS_STATUS_SUCCESS)
5052 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005053 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005054 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005055
Jeff Johnson295189b2012-06-20 16:38:30 -07005056 ret = -EINVAL;
5057 }
5058
Wilson Yang7c471652013-12-20 16:36:44 -08005059 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005060 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005061 case WE_SET_TX_RATE:
5062 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005063 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005064
5065 if(status != VOS_STATUS_SUCCESS)
5066 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005067 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005068 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005069
5070 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005071 }
5072
5073 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005074 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005075 default:
5076 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005077 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005078 ret = -EINVAL;
5079 break;
5080 }
5081 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005082
5083OUT:
5084 kfree(param);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305085 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005086 return ret;
5087}
5088
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305089static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
5090 union iwreq_data *wrqu, char *extra)
5091{
5092 int ret;
5093
5094 vos_ssr_protect(__func__);
5095 ret = __iw_ftm_setchar_getnone(dev, info, wrqu, extra);
5096 vos_ssr_unprotect(__func__);
5097
5098 return ret;
5099}
5100
5101static int __iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005102 union iwreq_data *wrqu, char *extra)
5103{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305104 hdd_adapter_t *pAdapter;
5105 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005106 int *value = (int *)extra;
5107 int sub_cmd = value[0];
5108 int set_value = value[1];
5109 int ret = 0; /* success */
5110 VOS_STATUS status;
5111
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305112 ENTER();
5113
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305114 pAdapter = (netdev_priv(dev));
5115 if (NULL == pAdapter)
5116 {
5117 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5118 return -EINVAL;
5119 }
5120 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5121 ret = wlan_hdd_validate_context(pHddCtx);
5122 if (0 != ret)
5123 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305124 return ret;
5125 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005126 switch(sub_cmd)
5127 {
5128 case WE_FTM_ON_OFF:
5129 {
5130 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5131
5132 if(status != VOS_STATUS_SUCCESS)
5133 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005134 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005135 ret = -EINVAL;
5136 }
5137
5138 break;
5139 }
5140
5141 case WE_TX_PKT_GEN:
5142 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5143
5144 if(status != VOS_STATUS_SUCCESS)
5145 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005146 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005147 ret = -EINVAL;
5148 }
5149 break;
5150
5151 case WE_SET_TX_IFS:
5152 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5153
5154 if(status != VOS_STATUS_SUCCESS)
5155 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005156 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005157 ret = -EINVAL;
5158 }
5159 break;
5160
5161 case WE_SET_TX_PKT_CNT:
5162 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5163
5164 if(status != VOS_STATUS_SUCCESS)
5165 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005166 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005167 ret = -EINVAL;
5168 }
5169 break;
5170
5171 case WE_SET_TX_PKT_LEN:
5172 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5173
5174 if(status != VOS_STATUS_SUCCESS)
5175 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005176 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005177 ret = -EINVAL;
5178 }
5179 break;
5180
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305181 case WE_TX_CW_RF_GEN:
5182 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5183
5184 if(status != VOS_STATUS_SUCCESS)
5185 {
5186 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5187 ret = -EINVAL;
5188 }
5189 break;
5190
Jeff Johnson295189b2012-06-20 16:38:30 -07005191 case WE_SET_CHANNEL:
5192 {
5193 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5194
5195 if(status != VOS_STATUS_SUCCESS)
5196 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005197 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005198 ret = -EINVAL;
5199 }
5200 break;
5201 }
5202 case WE_SET_TX_POWER:
5203 {
5204 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5205
5206 if(status != VOS_STATUS_SUCCESS)
5207 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005208 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005209 ret = -EINVAL;
5210 }
5211 break;
5212 }
5213 case WE_CLEAR_RX_PKT_CNT:
5214 {
5215 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5216
5217 if(status != VOS_STATUS_SUCCESS)
5218 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005219 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005220 ret = -EINVAL;
5221 }
5222 break;
5223 }
5224 case WE_RX:
5225 {
5226 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5227
5228 if(status != VOS_STATUS_SUCCESS)
5229 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005230 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005231 ret = -EINVAL;
5232 }
5233 break;
5234 }
5235 case WE_ENABLE_CHAIN:
5236 {
5237 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5238
5239 if(status != VOS_STATUS_SUCCESS)
5240 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005241 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005242 ret = -EINVAL;
5243 }
5244 break;
5245 }
5246
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305247 case WE_SET_PWR_CNTL_MODE:
5248 {
5249 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5250 if (status != VOS_STATUS_SUCCESS)
5251 {
5252 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5253 status);
5254 ret = -EINVAL;
5255 }
5256 break;
5257 }
5258
5259 case WE_ENABLE_DPD:
5260 {
5261 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5262 if (status != VOS_STATUS_SUCCESS)
5263 {
5264 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5265 ret = -EINVAL;
5266 }
5267 break;
5268 }
5269
5270 case WE_SET_CB:
5271 {
5272 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5273 if (status != VOS_STATUS_SUCCESS)
5274 {
5275 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5276 ret = -EINVAL;
5277 }
5278 break;
5279 }
5280
Jeff Johnson295189b2012-06-20 16:38:30 -07005281 default:
5282 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005283 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005284 sub_cmd, set_value);
5285 break;
5286 }
5287 }
5288
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305289 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005290 return ret;
5291}
5292
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305293static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5294 union iwreq_data *wrqu, char *extra)
5295{
5296 int ret;
5297
5298 vos_ssr_protect(__func__);
5299 ret = __iw_ftm_setint_getnone(dev, info, wrqu, extra);
5300 vos_ssr_unprotect(__func__);
5301
5302 return ret;
5303}
Jeff Johnson295189b2012-06-20 16:38:30 -07005304/* get param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305305static int __iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005306 union iwreq_data *wrqu, char *extra)
5307{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305308 hdd_adapter_t *pAdapter;
5309 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005310 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005311 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005312 VOS_STATUS status;
5313
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305314 ENTER();
5315
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305316 pAdapter = (netdev_priv(dev));
5317 if (NULL == pAdapter)
5318 {
5319 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5320 return -EINVAL;
5321 }
5322 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5323 ret = wlan_hdd_validate_context(pHddCtx);
5324 if (0 != ret)
5325 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305326 return ret;
5327 }
5328
Jeff Johnson295189b2012-06-20 16:38:30 -07005329 switch (value[0])
5330 {
5331 case WE_GET_CHANNEL:
5332 {
5333 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5334
5335 if(status != VOS_STATUS_SUCCESS)
5336 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005337 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005338 ret = -EINVAL;
5339 }
5340 break;
5341 }
5342 case WE_GET_TX_POWER:
5343 {
5344 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5345
5346 if(status != VOS_STATUS_SUCCESS)
5347 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005348 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005349 ret = -EINVAL;
5350 }
5351 break;
5352 }
5353 case WE_GET_RX_PKT_CNT:
5354 {
5355 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5356
5357 if(status != VOS_STATUS_SUCCESS)
5358 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005359 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005360 ret = -EINVAL;
5361 }
5362 break;
5363 }
5364 default:
5365 {
5366 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5367 break;
5368 }
5369 }
5370
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305371 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005372 return ret;
5373}
5374
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305375static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5376 union iwreq_data *wrqu, char *extra)
5377{
5378 int ret;
5379
5380 vos_ssr_protect(__func__);
5381 ret = __iw_ftm_setnone_getint(dev, info, wrqu, extra);
5382 vos_ssr_unprotect(__func__);
5383
5384 return ret;
5385}
5386
5387static int __iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005388 union iwreq_data *wrqu, char *extra)
5389{
5390 int sub_cmd = wrqu->data.flags;
5391 VOS_STATUS status;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305392 hdd_adapter_t *pAdapter;
5393 hdd_context_t *pHddCtx;
5394 int ret = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005395
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305396 ENTER();
5397
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305398 pAdapter = (netdev_priv(dev));
5399 if (NULL == pAdapter)
5400 {
5401 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5402 return -EINVAL;
5403 }
5404 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5405 ret = wlan_hdd_validate_context(pHddCtx);
5406 if (0 != ret)
5407 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305408 return ret;
5409 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005410 switch(sub_cmd)
5411 {
5412 case WE_GET_MAC_ADDRESS:
5413 {
5414 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5415
5416 if(status != VOS_STATUS_SUCCESS)
5417 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005418 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005419 return -EINVAL;
5420 }
5421 wrqu->data.length = strlen(extra)+1;
5422 break;
5423 }
5424 case WE_GET_TX_RATE:
5425 {
5426 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5427
5428 if(status != VOS_STATUS_SUCCESS)
5429 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005430 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005431 return -EINVAL;
5432 }
5433
5434 wrqu->data.length = strlen(extra)+1;
5435 break;
5436 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005437 case WE_GET_FTM_STATUS:
5438 {
5439 status = wlan_ftm_priv_get_status(pAdapter, extra);
5440
5441 if(status != VOS_STATUS_SUCCESS)
5442 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005443 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005444 return -EINVAL;
5445 }
5446
5447 wrqu->data.length = strlen(extra)+1;
5448 break;
5449 }
5450 case WE_GET_RX_RSSI:
5451 {
5452 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5453
5454 if(status != VOS_STATUS_SUCCESS)
5455 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005456 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005457 return -EINVAL;
5458 }
5459
5460 wrqu->data.length = strlen(extra)+1;
5461 break;
5462 }
5463 default:
5464 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005465 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005466 break;
5467 }
5468 }
5469
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305470 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005471 return 0;
5472}
Jeff Johnson295189b2012-06-20 16:38:30 -07005473
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305474static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5475 union iwreq_data *wrqu, char *extra)
5476{
5477 int ret;
5478
5479 vos_ssr_protect(__func__);
5480 ret = __iw_ftm_get_char_setnone(dev, info, wrqu, extra);
5481 vos_ssr_unprotect(__func__);
5482
5483
5484 return ret;
5485}
5486
Jeff Johnson295189b2012-06-20 16:38:30 -07005487VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5488{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005489#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005490 tAniHdr *wmsg = NULL;
5491 v_U8_t *pBuf;
5492 hdd_context_t *pHddCtx = NULL;
5493 v_CONTEXT_t pVosContext= NULL;
5494
5495 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5496 if(pBuf == NULL)
5497 {
5498 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5499 return VOS_STATUS_E_NOMEM;
5500 }
5501 wmsg = (tAniHdr*)pBuf;
5502 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5503 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5504 wmsg->length = FTM_SWAP16(wmsg->length);
5505 pBuf += sizeof(tAniHdr);
5506
5507 /*Get the global context */
5508 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5509
5510 /*Get the Hdd Context */
5511 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5512 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5513
5514 /* EfS command Code */
5515 *(v_U32_t*)pBuf = 0x000000EF;
5516
5517 pBuf += sizeof(v_U32_t);
5518
5519 memcpy(pBuf, pData,data_len);
5520
5521 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305522 if( ptt_sock_send_msg_to_app(wmsg, 0,
5523 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005524
Arif Hussain6d2a3322013-11-17 19:50:10 -08005525 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 -07005526 vos_mem_free((v_VOID_t*)wmsg);
5527 return VOS_STATUS_E_FAILURE;
5528 }
5529 }
5530 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305531 if( ptt_sock_send_msg_to_app(wmsg, 0,
5532 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005533
Arif Hussain6d2a3322013-11-17 19:50:10 -08005534 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 -07005535 vos_mem_free((v_VOID_t*)wmsg);
5536 return VOS_STATUS_E_FAILURE;
5537 }
5538 }
5539
5540 vos_mem_free((v_VOID_t*)wmsg);
5541#endif //FTM and ANDROID
5542
5543 return VOS_STATUS_SUCCESS;
5544}
5545
Jeff Johnson295189b2012-06-20 16:38:30 -07005546/* action sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305547static int __iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005548 union iwreq_data *wrqu, char *extra)
5549{
5550 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005551 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005552
5553 switch (sub_cmd)
5554 {
5555 case WE_SET_NV_DEFAULTS:
5556 {
5557 v_U8_t *pu8buf,*pTempBuf;
5558 v_U16_t size;
5559 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005560 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005561 pu8buf = vos_mem_malloc(size);
5562 if(pu8buf == NULL)
5563 {
5564 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5565 return VOS_STATUS_E_NOMEM;
5566 }
5567 memset(pu8buf,0,size);
5568 pTempBuf = pu8buf;
5569 pTempBuf += sizeof(v_U32_t);
5570 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5571
5572 wlan_write_to_efs(pu8buf,size);
5573 vos_mem_free(pu8buf);
5574 }
5575
5576 default:
5577 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005578 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005579 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5580 break;
5581 }
5582 }
5583
5584 return ret;
5585}
5586
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305587static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5588 union iwreq_data *wrqu, char *extra)
5589{
5590 int ret;
5591
5592 vos_ssr_protect(__func__);
5593 ret = __iw_ftm_setnone_getnone(dev, info, wrqu, extra);
5594 vos_ssr_unprotect(__func__);
5595
5596 return ret;
5597}
5598
5599static int __iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305600 union iwreq_data *wrqu, char *extra)
5601{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305602 hdd_adapter_t *pAdapter;
5603 hdd_context_t *pHddCtx;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305604 int sub_cmd = wrqu->data.flags;
5605 int *value = (int*)wrqu->data.pointer;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305606 int ret = 0;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305607 VOS_STATUS status;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305608
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305609 ENTER();
5610
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305611 if(wrqu->data.length < 2)
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305612 {
Sushant Kaushik87787972015-09-11 16:05:00 +05305613 hddLog(LOGE, "Invalid number of Arguments %d ", wrqu->data.length);
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305614 return -EINVAL;
5615 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305616
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305617 pAdapter = (netdev_priv(dev));
5618 if (NULL == pAdapter)
5619 {
5620 hddLog(VOS_TRACE_LEVEL_ERROR,
5621 "%s: Adapter is NULL",__func__);
5622 return -EINVAL;
5623 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305624
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305625 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5626 ret = wlan_hdd_validate_context(pHddCtx);
5627 if (0 != ret)
5628 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305629 return ret;
5630 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305631
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305632 switch (sub_cmd)
5633 {
5634 case WE_SET_TX_WF_GAIN:
5635 {
5636 v_S15_t dGain = 0;
5637 v_U16_t rfGain = 0;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305638
5639 dGain = *(v_S15_t*) value++;
5640 rfGain = *(v_U16_t*) value;
5641 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5642
5643 if(status != VOS_STATUS_SUCCESS)
5644 {
5645 hddLog(VOS_TRACE_LEVEL_FATAL,
5646 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5647 return -EINVAL;
5648 }
5649 }
5650 break;
5651
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305652 case WE_SET_DUMP:
5653 if (*value == 1)
5654 {
5655 status = wlan_ftm_priv_set_dump(pAdapter, value);
5656 if(status != VOS_STATUS_SUCCESS)
5657 {
5658 hddLog(LOGE, "wlan_ftm_priv_set_dump Failed =%d\n",
5659 status);
5660 ret = -EINVAL;
5661 }
5662 }else
5663 {
5664 hddLog(LOGE, "%s arg[0]: %d expecting arg[0]: 1\n",
5665 __func__, *value);
5666 }
5667 break;
5668
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305669 default:
5670 {
Sushant Kaushik87787972015-09-11 16:05:00 +05305671 hddLog(LOGE, "Invalid IOCTL command %d ", sub_cmd );
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305672 break;
5673 }
5674 }
5675
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305676 EXIT();
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305677 return 0;
5678}
5679
5680
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305681static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5682 union iwreq_data *wrqu, char *extra)
5683{
5684 int ret;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305685 union iwreq_data u_priv_wrqu;
5686 int apps_args[MAX_VAR_ARGS] = {0};
5687 int num_args;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305688
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305689 /* helper function to get iwreq_data with compat handling. */
5690 if (hdd_priv_get_data(&u_priv_wrqu.data, wrqu))
5691 {
5692 return -EINVAL;
5693 }
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305694
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305695 if (NULL == u_priv_wrqu.data.pointer)
5696 {
5697 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5698 "%s: NULL data pointer", __func__);
5699 return -EINVAL;
5700 }
5701
5702 num_args = u_priv_wrqu.data.length;
5703 if (num_args > MAX_VAR_ARGS)
5704 {
5705 num_args = MAX_VAR_ARGS;
5706 }
5707
5708 if (copy_from_user(apps_args, u_priv_wrqu.data.pointer,
5709 (sizeof(int)) * num_args))
5710 {
5711 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5712 "%s: failed to copy data from user buffer", __func__);
5713 return -EFAULT;
5714 }
5715
5716 vos_ssr_protect(__func__);
5717 ret = __iw_ftm_set_var_ints_getnone(dev, info, &u_priv_wrqu,
5718 (char *)&apps_args);
5719 vos_ssr_unprotect(__func__);
5720
5721 return ret;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305722}
5723
Jeff Johnson295189b2012-06-20 16:38:30 -07005724static const iw_handler we_ftm_private[] = {
5725
5726 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5727 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5728 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5729 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5730 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305731 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005732};
5733
5734/*Maximum command length can be only 15 */
5735static const struct iw_priv_args we_ftm_private_args[] = {
5736
5737 /* handlers for main ioctl */
5738 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5739 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5740 0,
5741 "" },
5742
5743 { WE_FTM_ON_OFF,
5744 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5745 0,
5746 "ftm" },
5747
5748 { WE_TX_PKT_GEN,
5749 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5750 0,
5751 "tx" },
5752
5753 { WE_SET_TX_IFS,
5754 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5755 0,
5756 "set_txifs" },
5757
5758 { WE_SET_TX_PKT_CNT,
5759 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5760 0,
5761 "set_txpktcnt" },
5762
5763 { WE_SET_TX_PKT_LEN,
5764 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5765 0,
5766 "set_txpktlen" },
5767
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305768 { WE_SET_TX_WF_GAIN,
5769 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5770 0,
5771 "set_tx_wf_gain" },
5772
5773 { WE_TX_CW_RF_GEN,
5774 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5775 0,
5776 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005777 { WE_SET_CHANNEL,
5778 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5779 0,
5780 "set_channel" },
5781
5782 { WE_SET_TX_POWER,
5783 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5784 0,
5785 "set_txpower" },
5786
5787 { WE_CLEAR_RX_PKT_CNT,
5788 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5789 0,
5790 "clr_rxpktcnt" },
5791
5792 { WE_RX,
5793 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5794 0,
5795 "rx" },
5796
5797 { WE_ENABLE_CHAIN,
5798 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5799 0,
5800 "ena_chain" },
5801
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305802 { WE_SET_PWR_CNTL_MODE,
5803 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5804 0,
5805 "pwr_cntl_mode" },
5806
5807 { WE_ENABLE_DPD,
5808 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5809 0,
5810 "ena_dpd" },
5811
5812 { WE_SET_CB,
5813 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5814 0,
5815 "set_cb" },
5816
Jeff Johnson295189b2012-06-20 16:38:30 -07005817 /* handlers for main ioctl */
5818 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5819 0,
5820 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5821 "" },
5822
5823 { WE_GET_CHANNEL,
5824 0,
5825 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5826 "get_channel" },
5827
5828 { WE_GET_TX_POWER,
5829 0,
5830 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5831 "get_txpower" },
5832
5833 { WE_GET_RX_PKT_CNT,
5834 0,
5835 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5836 "get_rxpktcnt" },
5837
5838 /* handlers for main ioctl */
5839 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5840 IW_PRIV_TYPE_CHAR| 512,
5841 0,
5842 "" },
5843
5844 { WE_SET_MAC_ADDRESS,
5845 IW_PRIV_TYPE_CHAR| 512,
5846 0,
5847 "set_mac_address" },
5848
5849 { WE_SET_TX_RATE,
5850 IW_PRIV_TYPE_CHAR | 512,
5851 0,
5852 "set_txrate" },
5853
5854 /* handlers for main ioctl */
5855 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5856 0,
5857 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5858 "" },
5859
5860 { WE_GET_MAC_ADDRESS,
5861 0,
5862 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5863 "get_mac_address" },
5864
Jeff Johnson295189b2012-06-20 16:38:30 -07005865 { WE_GET_TX_RATE,
5866 0,
5867 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5868 "get_txrate" },
5869
5870 { WE_GET_FTM_STATUS,
5871 0,
5872 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5873 "get_status" },
5874
5875 { WE_GET_RX_RSSI,
5876 0,
5877 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5878 "get_rx_rssi" },
5879
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305880 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5881 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5882 0,
5883 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005884 /* handlers for main ioctl */
5885 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5886 0,
5887 0,
5888 "" },
5889
5890 /* handlers for sub-ioctl */
5891 { WE_SET_NV_DEFAULTS,
5892 0,
5893 0,
5894 "set_nv_defaults" },
5895
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305896 { WE_SET_DUMP,
5897 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5898 0,
5899 "dump" },
5900
Jeff Johnson295189b2012-06-20 16:38:30 -07005901};
5902
5903const struct iw_handler_def we_ftm_handler_def = {
5904 .num_standard = 0,
5905 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5906 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5907
5908 .standard = (iw_handler *)NULL,
5909 .private = (iw_handler *)we_ftm_private,
5910 .private_args = we_ftm_private_args,
5911 .get_wireless_stats = NULL,
5912};
5913
5914static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5915{
5916
5917 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5918
5919 // Zero the memory. This zeros the profile structure.
5920 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005921
Jeff Johnson295189b2012-06-20 16:38:30 -07005922 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5923
5924 return 0;
5925}
5926
Jeff Johnson295189b2012-06-20 16:38:30 -07005927
5928VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5929{
Jeff Johnson295189b2012-06-20 16:38:30 -07005930 ftm_rsp_msg_t *pFtmMsgRsp;
5931
5932 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5933 hdd_context_t *pHddCtx;
5934 v_CONTEXT_t pVosContext= NULL;
5935
5936 ENTER();
5937
5938 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5939
5940 if (!message )
5941 {
5942 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5943 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5944 return VOS_STATUS_E_INVAL;
5945 }
5946 /*Get the global context */
5947 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5948
5949 /*Get the Hdd Context */
5950 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5951
5952 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5953
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305954 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005955 complete(&pHddCtx->ftm.ftm_comp_var);
5956 }
5957 else {
5958 /*Response length to Ptt App*/
5959 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5960
5961 /*Ptt App expects the response length in LE */
5962 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5963
5964 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005965 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005966 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5967
5968 /*Copy the message*/
5969 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5970
5971 /*Update the error code*/
5972 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5973
5974 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5975
5976 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5977 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005978 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005979 return VOS_STATUS_E_FAILURE;
5980 }
5981 }
5982 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005983 return VOS_STATUS_SUCCESS;
5984
5985}