blob: a7533988e2ed70195c6e1597a3677fc34df6ac64 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Mahesh A Saptasagarc3ed0122016-01-19 16:45:11 +05302 * Copyright (c) 2012-2016 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;
jge24d9bd42016-05-11 14:53:57 +0800478 ePowerTempIndexSource powerIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -0700479
480} FTM_STATUS ;
481static FTM_STATUS ftm_status;
482
483//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530484static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700485
486static void _ftm_status_init(void)
487{
488 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
489 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
490 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
491
492 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
493 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530494 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700495 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530496 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700497 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
498 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530499 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700500 ftm_status.frameParams.payloadFillByte = 0xA5;
501 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
502 ftm_status.frameParams.tx_mode = 0;
503 ftm_status.frameParams.crc = 0;
504 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
505 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
506 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
507 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530508 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700509 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
510 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530511 ftm_status.cbmode = 0 ; //none channel bonding
jge24d9bd42016-05-11 14:53:57 +0800512 ftm_status.powerIndex = FIXED_POWER_DBM;
Jeff Johnson295189b2012-06-20 16:38:30 -0700513
514 return;
515}
516
517/**---------------------------------------------------------------------------
518
519 \brief wlan_ftm_postmsg() -
520
521 The function used for sending the command to the halphy.
522
523 \param - cmd_ptr - Pointer command buffer.
524
525 \param - cmd_len - Command length.
526
527 \return - 0 for success, non zero for failure
528
529 --------------------------------------------------------------------------*/
530
531static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
532{
533 vos_msg_t *ftmReqMsg;
534 vos_msg_t ftmMsg;
535 ENTER();
536
537 ftmReqMsg = (vos_msg_t *) cmd_ptr;
538
Jeff Johnson295189b2012-06-20 16:38:30 -0700539 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700540 ftmMsg.reserved = 0;
541 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
542 ftmMsg.bodyval = 0;
543
544 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700545 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700546 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800548 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700549
550 return VOS_STATUS_E_FAILURE;
551 }
552
553 EXIT();
554 return VOS_STATUS_SUCCESS;
555}
556
557/*---------------------------------------------------------------------------
558
559 \brief wlan_ftm_vos_open() - Open the vOSS Module
560
561 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
562 Upon successful initialization:
563
564 - All VOS submodules should have been initialized
565
566 - The VOS scheduler should have opened
567
568 - All the WLAN SW components should have been opened. This include
569 MAC.
570
571
Girish Gowli32fbe522014-05-08 20:27:04 +0530572 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700573
574
575 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
576 is ready to be used.
577
578 VOS_STATUS_E_RESOURCES - System resources (other than memory)
579 are unavailable to initialize the scheduler
580
581
582 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
583
584 \sa wlan_ftm_vos_open()
585
586---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530587static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700588{
589 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
590 int iter = 0;
591 tSirRetStatus sirStatus = eSIR_SUCCESS;
592 tMacOpenParameters macOpenParms;
593 pVosContextType gpVosContext = (pVosContextType)pVosContext;
594
595 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
596 "%s: Opening VOSS", __func__);
597
598 if (NULL == gpVosContext)
599 {
600 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
601 "%s: Trying to open VOSS without a PreOpen",__func__);
602 VOS_ASSERT(0);
603 return VOS_STATUS_E_FAILURE;
604 }
605
606 /* Initialize the probe event */
607 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
608 {
609 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
610 "%s: Unable to init probeEvent",__func__);
611 VOS_ASSERT(0);
612 return VOS_STATUS_E_FAILURE;
613 }
614
Jeff Johnson295189b2012-06-20 16:38:30 -0700615 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
616 {
617 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
618 "%s: Unable to init wdaCompleteEvent",__func__);
619 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700620
Jeff Johnson295189b2012-06-20 16:38:30 -0700621 goto err_probe_event;
622 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700623
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530624 if(vos_event_init(&(gpVosContext->fwLogsComplete)) != VOS_STATUS_SUCCESS )
625 {
626 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
627 "%s: Unable to init fwLogsComplete",__func__);
628 VOS_ASSERT(0);
629
630 goto err_wda_complete_event;
631 }
632
Jeff Johnson295189b2012-06-20 16:38:30 -0700633 /* Initialize the free message queue */
634 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
635 if (! VOS_IS_STATUS_SUCCESS(vStatus))
636 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700637 /* Critical Error ... Cannot proceed further */
638 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530639 "%s: Failed to initialize VOS free message queue %d",
640 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700641 VOS_ASSERT(0);
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530642 goto err_fw_logs_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700643 }
644
645 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
646 {
647 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
648 &(gpVosContext->aMsgBuffers[iter]);
649 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
650 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
651 }
652
653 /* Now Open the VOS Scheduler */
654 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
655 sizeof(VosSchedContext));
656
657 if (!VOS_IS_STATUS_SUCCESS(vStatus))
658 {
659 /* Critical Error ... Cannot proceed further */
660 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530661 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700662 VOS_ASSERT(0);
663 goto err_msg_queue;
664 }
665
666 /* Open the SYS module */
667 vStatus = sysOpen(gpVosContext);
668
669 if (!VOS_IS_STATUS_SUCCESS(vStatus))
670 {
671 /* Critical Error ... Cannot proceed further */
672 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530673 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700674 VOS_ASSERT(0);
675 goto err_sched_close;
676 }
677
Jeff Johnson295189b2012-06-20 16:38:30 -0700678 /*Open the WDA module */
679 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
680 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530681 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700682 if (!VOS_IS_STATUS_SUCCESS(vStatus))
683 {
684 /* Critical Error ... Cannot proceed further */
685 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530686 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700687 VOS_ASSERT(0);
688 goto err_sys_close;
689 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700690
691 /* initialize the NV module */
692 vStatus = vos_nv_open();
693 if (!VOS_IS_STATUS_SUCCESS(vStatus))
694 {
695 // NV module cannot be initialized, however the driver is allowed
696 // to proceed
697 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530698 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700699 goto err_wda_close;
700 }
701
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700702 vStatus = vos_nv_get_dictionary_data();
703
704 if (!VOS_IS_STATUS_SUCCESS(vStatus))
705 {
706 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530707 "%s : failed to get dictionary data for NV %d",
708 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700709 goto err_wda_close;
710 }
711
Jeff Johnson295189b2012-06-20 16:38:30 -0700712 /* If we arrive here, both threads dispacthing messages correctly */
713
714 /* Now proceed to open the MAC */
715
716 /* UMA is supported in hardware for performing the
717 frame translation 802.11 <-> 802.3 */
718 macOpenParms.frameTransRequired = 1;
719 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
720 &macOpenParms);
721
722 if (eSIR_SUCCESS != sirStatus)
723 {
724 /* Critical Error ... Cannot proceed further */
725 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530726 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700727 VOS_ASSERT(0);
728 goto err_nv_close;
729 }
730
Jeff Johnson295189b2012-06-20 16:38:30 -0700731 /* Now proceed to open the SME */
732 vStatus = sme_Open(gpVosContext->pMACContext);
733 if (!VOS_IS_STATUS_SUCCESS(vStatus))
734 {
735 /* Critical Error ... Cannot proceed further */
736 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530737 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700738 goto err_mac_close;
739 }
740 return VOS_STATUS_SUCCESS;
741
Jeff Johnson295189b2012-06-20 16:38:30 -0700742
743 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
744 "%s: VOSS successfully Opened",__func__);
745
746 return VOS_STATUS_SUCCESS;
747err_mac_close:
748 macClose(gpVosContext->pMACContext);
749
750err_nv_close:
751 vos_nv_close();
752
753err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700754 WDA_close(gpVosContext);
755
756err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700757 sysClose(gpVosContext);
758
759err_sched_close:
760 vos_sched_close(gpVosContext);
761err_msg_queue:
762 vos_mq_deinit(&gpVosContext->freeVosMq);
763
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530764err_fw_logs_complete_event:
765 vos_event_destroy(&gpVosContext->fwLogsComplete);
766
Jeff Johnson295189b2012-06-20 16:38:30 -0700767err_wda_complete_event:
768 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700769
770err_probe_event:
771 vos_event_destroy(&gpVosContext->ProbeEvent);
772
773 return VOS_STATUS_E_FAILURE;
774
775} /* wlan_ftm_vos_open() */
776
777/*---------------------------------------------------------------------------
778
779 \brief wlan_ftm_vos_close() - Close the vOSS Module
780
781 The \a wlan_ftm_vos_close() function closes the vOSS Module
782
783 \param vosContext context of vos
784
785 \return VOS_STATUS_SUCCESS - successfully closed
786
787 \sa wlan_ftm_vos_close()
788
789---------------------------------------------------------------------------*/
790
791static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
792{
793 VOS_STATUS vosStatus;
794 pVosContextType gpVosContext = (pVosContextType)vosContext;
795
Jeff Johnson295189b2012-06-20 16:38:30 -0700796 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
797 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
798 {
799 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530800 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700801 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
802 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700803
804 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
805 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
806 {
807 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530808 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700809 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
810 }
811
812 ((pVosContextType)vosContext)->pMACContext = NULL;
813
814 vosStatus = vos_nv_close();
815 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
816 {
817 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530818 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700819 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
820 }
821
822
823 vosStatus = sysClose( vosContext );
824 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
825 {
826 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530827 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700828 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
829 }
830
Wu Gaoece54202015-09-25 10:46:49 +0800831 if ( TRUE == WDA_needShutdown(vosContext))
Jeff Johnson295189b2012-06-20 16:38:30 -0700832 {
Wu Gaoece54202015-09-25 10:46:49 +0800833 vosStatus = WDA_shutdown(vosContext, VOS_TRUE);
834 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
835 {
836 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
837 "%s: Failed to shutdown WDA %d", __func__, vosStatus);
838 VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus));
839 }
840
841 }
842 else
843 {
844 vosStatus = WDA_close(vosContext);
845 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
846 {
847 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
848 "%s: Failed to close WDA %d", __func__, vosStatus);
849 VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus));
850 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700852
853 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
854
855 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
856 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
857 {
858 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530859 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700860 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
861 }
862
Jeff Johnson295189b2012-06-20 16:38:30 -0700863 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
864 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
865 {
866 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530867 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700868 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
869 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700870
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530871 vosStatus = vos_event_destroy(&gpVosContext->fwLogsComplete);
872 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
873 {
874 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
875 "%s: Failed to destroy fwLogsComplete %d", __func__, vosStatus);
876 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
877 }
878
Jeff Johnson295189b2012-06-20 16:38:30 -0700879 return VOS_STATUS_SUCCESS;
880}
881
882/**---------------------------------------------------------------------------
883
884 \brief wlan_ftm_priv_set_txifs() -
885
886 This function is used for
887
888 \param - pAdapter - Pointer HDD Context.
889 - ifs
890
891 \return - 0 for success, non zero for failure
892
893 --------------------------------------------------------------------------*/
894
895
896
897static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
898{
899 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
900 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
901 {
902 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
903 return VOS_STATUS_E_FAILURE;
904 }
905
906 /* do not allow to change setting when tx pktgen is enabled */
907 if (ftm_status.frameGenEnabled)
908 {
909 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
910 return VOS_STATUS_E_FAILURE;
911 }
912
913 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
914 {
c_hpothuffdb5272013-10-02 16:42:35 +0530915 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
916 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700917 return VOS_STATUS_E_FAILURE;
918 }
919
920 ftm_status.frameParams.interFrameSpace = ifs;
921
922 return VOS_STATUS_SUCCESS;
923}
924
925/**---------------------------------------------------------------------------
926
927 \brief wlan_ftm_priv_set_txpktcnt() -
928
929 This function is used for
930
931 \param - pAdapter - Pointer HDD Context.
932 - ifs
933
934 \return - 0 for success, non zero for failure
935
936 --------------------------------------------------------------------------*/
937
938static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
939{
940 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
941 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
942 {
943 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
944 return VOS_STATUS_E_FAILURE;
945 }
946
947 /* do not allow to change setting when tx pktgen is enabled */
948 if (ftm_status.frameGenEnabled)
949 {
950 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
951 return VOS_STATUS_E_FAILURE;
952 }
953
954 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
955 {
c_hpothuffdb5272013-10-02 16:42:35 +0530956 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
957 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700958 return VOS_STATUS_E_FAILURE;
959 }
960
961 ftm_status.frameParams.numTestPackets = cnt;
962
963 return VOS_STATUS_SUCCESS;
964}
965
966static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
967{
968 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
969 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
970 {
971 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
972 return VOS_STATUS_E_FAILURE;
973 }
974
975 /* do not allow to change setting when tx pktgen is enabled */
976 if (ftm_status.frameGenEnabled)
977 {
978 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
979 return VOS_STATUS_E_FAILURE;
980 }
981
982 if (len > 4095) //4096
983 {
c_hpothuffdb5272013-10-02 16:42:35 +0530984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
985 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700986 return VOS_STATUS_E_FAILURE;
987 }
988
989 ftm_status.frameParams.payloadLength = (tANI_U16)len;
990
991 return VOS_STATUS_SUCCESS;
992}
993
Jeff Johnson295189b2012-06-20 16:38:30 -0700994
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530995static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
996/**---------------------------------------------------------------------------
997<FTM_Command>set_tx_wf_gain
998<argument> is <n>
999Designates the number of amplitude gain (31 to 255).
1000Description
1001This command can be set only when Tx CW generation is stopped.
1002--------------------------------------------------------------------------*/
1003static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
1004{
1005 uPttMsgs *pMsgBody;
1006 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1007 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
1008 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
1009 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1010 "%s:Ftm has not started. Please start the ftm.", __func__);
1011 return VOS_STATUS_E_FAILURE;
1012 }
1013
1014 if (ftm_status.wfRfGenEnabled) {
1015 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1016 "%s:cannot set gain when cwgen is enabled.", __func__);
1017 return VOS_STATUS_E_FAILURE;
1018 }
1019
1020 if (dGain > 24 || dGain <-39) {
1021 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1022 "%s:digital gain value is invalid", __func__);
1023 return VOS_STATUS_E_FAILURE;
1024 }
1025
Anand N Sunkadce9f8012015-04-14 19:24:43 +05301026 if (rfGain > 31) {
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301027 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1028 "%s:rf gain value is invalid", __func__);
1029 return VOS_STATUS_E_FAILURE;
1030 }
1031
1032 if (pMsgBuf == NULL) {
1033 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1034 "%s:pMsgBuf is NULL", __func__);
1035 return VOS_STATUS_E_NOMEM;
1036 }
1037
1038 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1039 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1040
1041 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1042 init_completion(&pHddCtx->ftm.ftm_comp_var);
1043 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1044 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1045 pMsgBody = &pMsgBuf->msgBody;
1046 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1047 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1048 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1049 VOS_STATUS_SUCCESS) {
1050 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1051 "%s:wlan_ftm_postmsg failed",__func__);
1052 return VOS_STATUS_E_FAILURE;
1053 }
1054
1055 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1056 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1057 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1058 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1059 "%s:Ptt response status failed",__func__);
1060 return VOS_STATUS_E_FAILURE;
1061 }
1062 return VOS_STATUS_SUCCESS;
1063}
1064
1065
1066/**---------------------------------------------------------------------------
1067 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1068 <argument> is < 1 | 0 >
1069 1 : Start Tx CW rf generation
1070 0 : Stop Tx CW rf generation
1071 Description
1072 This command starts/stops Tx CW rf generation.
1073--------------------------------------------------------------------------*/
1074static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1075{
1076 uPttMsgs *pMsgBody;
1077 VOS_STATUS status;
1078 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1079
1080 printk(KERN_EMERG "startStop: %02x ", startStop);
1081
1082 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1083 {
1084 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1085 "%s:Ftm has not started. Please start the ftm. ", __func__);
1086 return VOS_STATUS_E_FAILURE;
1087 }
1088
1089 if (startStop != 1 && startStop != 0)
1090 {
1091 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1092 "%s:Tx value is invalid ", __func__);
1093 return VOS_STATUS_E_FAILURE;
1094 }
1095
1096 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1097 (!ftm_status.wfRfGenEnabled && startStop == 0))
1098 {
1099 return VOS_STATUS_SUCCESS;
1100 }
1101
1102 if (pMsgBuf == NULL)
1103 {
1104 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1105 "%s:pMsgBuf is NULL", __func__);
1106 return VOS_STATUS_E_NOMEM;
1107 }
1108 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1109 if (startStop == 1) {
1110 tANI_U16 numSamples = 1;
1111 tANI_BOOLEAN clk80 = TRUE;
1112 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1113
1114 init_completion(&pHddCtx->ftm.ftm_comp_var);
1115 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1116 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1117 pMsgBody = &pMsgBuf->msgBody;
1118
1119 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1120 pMsgBody->SetWaveformRF.numSamples = numSamples;
1121 pMsgBody->SetWaveformRF.clk80 = clk80;
1122 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1123 if (status != VOS_STATUS_SUCCESS) {
1124 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1125 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1126 __func__);
1127 status = VOS_STATUS_E_FAILURE;
1128 goto done;
1129 }
1130 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1131 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1132 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1133 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1134 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1135 status = VOS_STATUS_E_FAILURE;
1136 goto done;
1137 }
1138 } else {
1139 init_completion(&pHddCtx->ftm.ftm_comp_var);
1140 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1141 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1142 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1143 if(status != VOS_STATUS_SUCCESS) {
1144 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1145 "%s:wlan_ftm_postmsg failed", __func__);
1146 status = VOS_STATUS_E_FAILURE;
1147 goto done;
1148 }
1149
1150 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1151 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1152 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1153 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1154 "%s:Ptt response status failed", __func__);
1155 status = VOS_STATUS_E_FAILURE;
1156 }
1157 }
1158done:
1159 if (status == VOS_STATUS_SUCCESS) {
1160 if (startStop == 1)
1161 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1162 else
1163 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1164 }
1165 return status;
1166}
1167
1168
Jeff Johnson295189b2012-06-20 16:38:30 -07001169static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1170{
Jeff Johnson295189b2012-06-20 16:38:30 -07001171 uPttMsgs *pMsgBody;
1172 VOS_STATUS status;
1173 v_U16_t chainSelect_save = chainSelect;
1174 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301175 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001176
1177 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1178 {
1179 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1180 return VOS_STATUS_E_FAILURE;
1181 }
1182
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05301183 if (NULL == pMsgBuf)
1184 {
1185 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1186 "%s:pMsgBuf is NULL", __func__);
1187 return VOS_STATUS_E_NOMEM;
1188 }
1189
Jeff Johnson295189b2012-06-20 16:38:30 -07001190 if (chainSelect > FTM_CHAIN_SEL_MAX)
1191 {
c_hpothuffdb5272013-10-02 16:42:35 +05301192 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1193 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001194 return VOS_STATUS_E_FAILURE;
1195 }
1196
1197 /* do not allow to change setting when tx pktgen is enabled */
1198 if (ftm_status.frameGenEnabled)
1199 {
1200 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1201 return VOS_STATUS_E_FAILURE;
1202 }
1203
1204 switch (chainSelect)
1205 {
1206 case FTM_CHAIN_SEL_NO_RX_TX:
1207 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1208 break;
1209
1210 case FTM_CHAIN_SEL_R0_ON:
1211 chainSelect = PHY_CHAIN_SEL_R0_ON;
1212 break;
1213
1214 case FTM_CHAIN_SEL_T0_ON:
1215 chainSelect = PHY_CHAIN_SEL_T0_ON;
1216 break;
mukul sharma0754d6b2015-05-22 18:49:41 +05301217
1218 case FTM_CHAIN_SEL_ANTENNA_0:
1219 chainSelect = PHY_CHAIN_SEL_ANT_0;
1220 break;
1221
1222 case FTM_CHAIN_SEL_ANTENNA_1:
1223 chainSelect = PHY_CHAIN_SEL_ANT_1;
1224 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07001225 }
1226
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301227 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001228 init_completion(&pHddCtx->ftm.ftm_comp_var);
1229 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1230 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1231
1232 pMsgBody = &pMsgBuf->msgBody;
1233 pMsgBody->EnableChains.chainSelect = chainSelect;
1234
1235 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1236
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301237 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001238 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301239 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1240 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001241 status = VOS_STATUS_E_FAILURE;
1242 goto done;
1243 }
c_hpothuffdb5272013-10-02 16:42:35 +05301244 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301245 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301246 if (0 >= ret)
1247 {
1248 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1249 FL("wait on ftm_comp_var failed %ld"), ret);
1250 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001251
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301252 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001253 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301254 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1255 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001256 status = VOS_STATUS_E_FAILURE;
1257 goto done;
1258 }
1259 ftm_status.chainSelect = chainSelect_save;
1260done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001261
1262 return status;
1263}
1264
1265/**---------------------------------------------------------------------------
1266 --------------------------------------------------------------------------*/
1267static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1268{
1269 int ii;
1270 int lenBuf = WE_FTM_MAX_STR_LEN;
1271 int lenRes = 0;
1272 char *chain[] = {
1273 "None",
1274 "R0,R1",
1275 "R0",
1276 "R1",
1277 "T0",
1278 "R0,R1,T0"
1279 };
1280 char *rx[] = {
1281 "disable",
1282 "11b/g/n",
1283 "11g/n",
1284 "11b"
1285 };
1286 char *tx[] = {
1287 "stopped",
1288 "started",
1289 };
1290 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1291
1292 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1293 {
1294 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1295 return VOS_STATUS_E_FAILURE;
1296 }
1297
1298 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001299 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001300 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1301 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001302 ftm_status.frameParams.interFrameSpace);
1303 if ((lenRes < 0) || (lenRes >= lenBuf))
1304 {
c_hpothuffdb5272013-10-02 16:42:35 +05301305 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1306 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001307 return VOS_STATUS_E_FAILURE;
1308 }
1309
1310 buf += lenRes;
1311 lenBuf -= lenRes;
1312
1313 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1314 {
1315 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1316 break;
1317 }
1318
1319 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1320 {
1321 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1322 }
1323 else
1324 {
1325 lenRes = strlcpy(buf, "invalid", lenBuf);
1326 }
1327 if ((lenRes < 0) || (lenRes >= lenBuf))
1328 {
c_hpothuffdb5272013-10-02 16:42:35 +05301329 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1330 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001331 return VOS_STATUS_E_FAILURE;
1332 }
1333
1334 buf += lenRes;
1335 lenBuf -= lenRes;
1336
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301337 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1338 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001339 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001340 ftm_status.frameParams.payloadLength);
1341
1342 if ((lenRes < 0) || (lenRes >= lenBuf))
1343 {
c_hpothuffdb5272013-10-02 16:42:35 +05301344 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1345 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001346 return VOS_STATUS_E_FAILURE;
1347 }
1348
1349 return VOS_STATUS_SUCCESS;
1350}
1351
Jeff Johnson295189b2012-06-20 16:38:30 -07001352
1353void HEXDUMP(char *s0, char *s1, int len)
1354{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301355 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001356 printk(KERN_EMERG "%s\n :", s0);
1357
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301358 if (len > 8)
1359 {
1360 for (j = 0; j < len/8; j++)
1361 {
1362 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1363 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1364 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1365 }
1366 len = len - j*8;
1367 }
1368 for (i = 0; i< len; i++) {
1369 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001370 }
1371 printk("\n");
1372}
1373
Jeff Johnson295189b2012-06-20 16:38:30 -07001374/*---------------------------------------------------------------------------
1375
1376 \brief vos_ftm_preStart() -
1377
1378 The \a vos_ftm_preStart() function to download CFG.
1379 including:
1380 - ccmStart
1381
1382 - WDA: triggers the CFG download
1383
1384
1385 \param pVosContext: The VOS context
1386
1387
1388 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1389 is ready to be used.
1390
1391 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1392 are unavailable to initialize the scheduler
1393
1394
1395 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1396
1397 \sa vos_start
1398
1399---------------------------------------------------------------------------*/
1400VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1401{
1402 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1403 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001404
Jeff Johnson295189b2012-06-20 16:38:30 -07001405 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1406 "vos prestart");
1407
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001408 if (NULL == pVosContext->pWDAContext)
1409 {
1410 VOS_ASSERT(0);
1411 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1412 "%s: WDA NULL context", __func__);
1413 return VOS_STATUS_E_FAILURE;
1414 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001415
1416 /* call macPreStart */
1417 vStatus = macPreStart(pVosContext->pMACContext);
1418 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1419 {
1420 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1421 "Failed at macPreStart ");
1422 return VOS_STATUS_E_FAILURE;
1423 }
1424
1425 /* call ccmStart */
1426 ccmStart(pVosContext->pMACContext);
1427
1428 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001429 vos_event_reset(&pVosContext->wdaCompleteEvent);
1430
Jeff Johnson295189b2012-06-20 16:38:30 -07001431
1432 /*call WDA pre start*/
1433 vStatus = WDA_preStart(pVosContext);
1434 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1435 {
1436 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1437 "Failed to WDA prestart ");
1438 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1439 ccmStop(pVosContext->pMACContext);
1440 VOS_ASSERT(0);
1441 return VOS_STATUS_E_FAILURE;
1442 }
1443
1444 /* Need to update time out of complete */
1445 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1446 if ( vStatus != VOS_STATUS_SUCCESS )
1447 {
1448 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1449 {
1450 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001451 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001452 }
1453 else
1454 {
1455 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001456 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001457 }
1458 VOS_ASSERT( 0 );
1459 return VOS_STATUS_E_FAILURE;
1460 }
1461
1462 return VOS_STATUS_SUCCESS;
1463}
Jeff Johnson295189b2012-06-20 16:38:30 -07001464
1465/**---------------------------------------------------------------------------
1466
1467 \brief wlan_hdd_ftm_open() -
1468
1469 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1470
1471 \param - pAdapter - Pointer HDD Context.
1472
1473 \return - 0 for success, non zero for failure
1474
1475 --------------------------------------------------------------------------*/
1476
1477int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1478{
1479 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1480 pVosContextType pVosContext= NULL;
1481 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001482
Jeff Johnson295189b2012-06-20 16:38:30 -07001483 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1484 "%s: Opening VOSS", __func__);
1485
1486 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1487
1488 if (NULL == pVosContext)
1489 {
1490 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301491 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001492 VOS_ASSERT(0);
1493 goto err_vos_status_failure;
1494 }
1495
1496 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301497 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001498
1499 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1500 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301501 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001502 goto err_vos_status_failure;
1503 }
1504
Jeff Johnson295189b2012-06-20 16:38:30 -07001505 /*
1506 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1507 */
1508 /* Save the hal context in Adapter */
1509 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001510
1511 if ( NULL == pHddCtx->hHal )
1512 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301513 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301514 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001515 }
1516
1517 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1518 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1519 if( NULL == pAdapter )
1520 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301521 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301522 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001523 }
1524
1525 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1526 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301527 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301528 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001529 }
1530
1531 //Initialize the nlink service
1532 if(nl_srv_init() != 0)
1533 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301534 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001535 goto err_ftm_register_wext_close;
1536 }
1537
Leo Chang9e646082013-08-02 11:20:21 -07001538#ifdef WLAN_KD_READY_NOTIFIER
1539 pHddCtx->kd_nl_init = 1;
1540#endif /* WLAN_KD_READY_NOTIFIER */
1541
Jeff Johnson295189b2012-06-20 16:38:30 -07001542#ifdef PTT_SOCK_SVC_ENABLE
1543 //Initialize the PTT service
1544 if(ptt_sock_activate_svc(pHddCtx) != 0)
1545 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301546 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001547 goto err_nl_srv_init;
1548 }
1549#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001550
Jeff Johnson295189b2012-06-20 16:38:30 -07001551 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1552 pHddCtx->ftm.targetNVTableSize = 0;
1553 pHddCtx->ftm.targetNVTablePointer = NULL;
1554 pHddCtx->ftm.processedNVTableSize = 0;
1555 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1556 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1557 {
1558 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301559 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001560 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001561 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001562 }
1563 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001564
1565 _ftm_status_init();
1566 /* Initialize the ftm vos event */
1567 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1568 {
1569 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301570 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001571 VOS_ASSERT(0);
1572 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1573 goto err_nl_srv_init;
1574 }
1575
1576 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301577 init_completion(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07001578
1579 return VOS_STATUS_SUCCESS;
1580
1581err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001582#ifdef WLAN_KD_READY_NOTIFIER
1583nl_srv_exit(pHddCtx->ptt_pid);
1584#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001585nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001586#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001587err_ftm_register_wext_close:
1588hdd_UnregisterWext(pAdapter->dev);
1589
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301590err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001591err_adapter_open_failure:
1592hdd_close_all_adapters( pHddCtx );
1593
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301594err_ftm_vos_close:
1595 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001596err_vos_status_failure:
1597
1598 return VOS_STATUS_E_FAILURE;
1599}
1600
1601
1602
1603int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1604{
1605 VOS_STATUS vosStatus;
1606 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1607
1608 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1609 ENTER();
1610 if(pAdapter == NULL)
1611 {
1612 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1613 return VOS_STATUS_E_NOMEM;
1614 }
1615
Atul Mittalc41126d2014-03-17 15:10:11 +05301616 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1617 if (pHddCtx->ftm.IsCmdPending == TRUE)
1618 {
1619 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1620 {
1621 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1622 "%s: vos_event_set failed", __func__);
1623 }
1624 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001625 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1626 {
1627 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1628 "%s: Ftm has been started. stopping ftm", __func__);
1629 wlan_ftm_stop(pHddCtx);
1630 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001631
Jeff Johnson295189b2012-06-20 16:38:30 -07001632 //TODO----------
1633 //Deregister the device with the kernel
1634 hdd_UnregisterWext(pAdapter->dev);
1635
Jeff Johnson295189b2012-06-20 16:38:30 -07001636#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001637 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001638 {
1639 unregister_netdev(pAdapter->dev);
1640 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1641 }
1642#endif
1643 //-----------------
1644
1645 vosStatus = vos_sched_close( vosContext );
1646 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1647 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1648 "%s: Failed to close VOSS Scheduler",__func__);
1649 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1650 }
1651
1652 //Close VOSS
1653 wlan_ftm_vos_close(vosContext);
1654
Mahesh A Saptasagarc3ed0122016-01-19 16:45:11 +05301655#ifdef WLAN_KD_READY_NOTIFIER
1656 nl_srv_exit(pHddCtx->ptt_pid);
1657#else
1658 nl_srv_exit();
1659#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001660
Mahesh A Saptasagarc3ed0122016-01-19 16:45:11 +05301661 hdd_close_all_adapters( pHddCtx );
Jeff Johnson295189b2012-06-20 16:38:30 -07001662 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1663 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1664 {
1665 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1666 "%s: Failed to destroy ftm_vos Event",__func__);
1667 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1668 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001669 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001670
Jeff Johnson295189b2012-06-20 16:38:30 -07001671 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001672}
1673
1674/**---------------------------------------------------------------------------
1675
1676 \brief wlan_ftm_send_response() -
1677
1678 The function sends the response to the ptt socket application running in user space.
1679
1680 \param - pAdapter - Pointer HDD Context.
1681
1682 \return - 0 for success, non zero for failure
1683
1684 --------------------------------------------------------------------------*/
1685
1686static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1687
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301688 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1689 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001690
Arif Hussain6d2a3322013-11-17 19:50:10 -08001691 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 -07001692 return VOS_STATUS_E_FAILURE;
1693 }
1694 return VOS_STATUS_SUCCESS;
1695}
1696
1697/**---------------------------------------------------------------------------
1698
1699 \brief wlan_hdd_ftm_start() -
1700
1701 This function gets called when the FTM start commands received from the ptt socket application and
1702 it starts the following modules.
1703 1) SAL Start.
1704 2) BAL Start.
1705 3) MAC Start to download the firmware.
1706
1707
1708 \param - pAdapter - Pointer HDD Context.
1709
1710 \return - 0 for success, non zero for failure
1711
1712 --------------------------------------------------------------------------*/
1713
1714static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1715{
1716 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1717 tSirRetStatus sirStatus = eSIR_SUCCESS;
1718 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1719 tHalMacStartParameters halStartParams;
1720
1721 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1722 {
1723 return VOS_STATUS_SUCCESS;
1724 }
1725
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301726 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTING;
1727
Jeff Johnson295189b2012-06-20 16:38:30 -07001728 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1729 "%s: Starting Libra SW", __func__);
1730
1731 /* We support only one instance for now ...*/
1732 if (pVosContext == NULL)
1733 {
1734 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001735 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001736 goto err_status_failure;
1737 }
1738
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001739
Jeff Johnson295189b2012-06-20 16:38:30 -07001740 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001741 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001742 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001743 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001744 goto err_status_failure;
1745 }
1746
Jeff Johnson295189b2012-06-20 16:38:30 -07001747 /*
1748 Prima needs to start the WDA correctly instead of BAL and SAL
1749 */
1750
1751 /* Vos preStart is calling */
1752 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1753 {
1754 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1755 goto err_status_failure;
1756 }
1757
1758
1759 vStatus = WDA_NVDownload_Start(pVosContext);
1760
1761 if ( vStatus != VOS_STATUS_SUCCESS )
1762 {
1763 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1764 "%s: Failed to start NV Download",__func__);
1765 return VOS_STATUS_E_FAILURE;
1766 }
1767
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301768 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001769
1770 if ( vStatus != VOS_STATUS_SUCCESS )
1771 {
1772 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1773 {
1774 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001775 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001776 }
1777 else
1778 {
1779 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001780 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001781 }
1782 VOS_ASSERT(0);
Wu Gaoece54202015-09-25 10:46:49 +08001783 WDA_setNeedShutdown(pHddCtx->pvosContext);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301784 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001785 }
1786
1787 vStatus = WDA_start(pVosContext);
1788 if (vStatus != VOS_STATUS_SUCCESS)
1789 {
1790 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1791 "%s: Failed to start WDA",__func__);
1792 goto err_status_failure;
1793 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001794
Jeff Johnson295189b2012-06-20 16:38:30 -07001795
1796 /* Start the MAC */
1797 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1798
Jeff Johnson295189b2012-06-20 16:38:30 -07001799
1800 halStartParams.driverType = eDRIVER_TYPE_MFG;
1801
1802 /* Start the MAC */
1803 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1804
Jeff Johnson295189b2012-06-20 16:38:30 -07001805
1806 if (eSIR_SUCCESS != sirStatus)
1807 {
1808 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1809 "%s: Failed to start MAC", __func__);
1810
Jeff Johnson295189b2012-06-20 16:38:30 -07001811 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001812 }
1813
1814 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1815 "%s: MAC correctly started",__func__);
1816
Jeff Johnson295189b2012-06-20 16:38:30 -07001817
1818 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1819
1820 return VOS_STATUS_SUCCESS;
1821
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001822err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001823 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1824 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1825 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1826 if(vStatus != VOS_STATUS_SUCCESS)
1827 {
1828 if(vStatus == VOS_STATUS_E_TIMEOUT)
1829 {
1830 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001831 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001832
1833 }
1834 else
1835 {
1836 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001837 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001838 }
1839 VOS_ASSERT(0);
1840 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001841
1842err_status_failure:
1843
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301844 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001845 return VOS_STATUS_E_FAILURE;
1846
1847}
1848
1849
1850static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1851{
1852 VOS_STATUS vosStatus;
1853
1854 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1855 {
1856 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1857 return VOS_STATUS_E_FAILURE;
1858 }
1859
1860 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1861 {
1862 /* STOP MAC only */
1863 v_VOID_t *hHal;
1864 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1865 if (NULL == hHal)
1866 {
1867 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1868 "%s: NULL hHal", __func__);
1869 }
1870 else
1871 {
1872 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1873 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1874 {
1875 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1876 "%s: Failed to stop SYS", __func__);
1877 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1878 }
1879 }
1880
Jeff Johnson295189b2012-06-20 16:38:30 -07001881
Jeff Johnson295189b2012-06-20 16:38:30 -07001882 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001883
1884 }
1885 return WLAN_FTM_SUCCESS;
1886}
1887
Jeff Johnson295189b2012-06-20 16:38:30 -07001888/**---------------------------------------------------------------------------
1889
1890 \brief wlan_hdd_ftm_get_nv_table() -
1891 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001892 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001893
1894 \param - ftmCmd - Pointer FTM Commad Buffer
1895
1896 \return - int
1897 -1, Process Host command fail, vail out
1898 1, Process Host command success
1899
1900 --------------------------------------------------------------------------*/
1901int wlan_hdd_ftm_get_nv_table
1902(
1903 hdd_context_t *pHddCtx,
1904 tPttMsgbuffer *ftmCmd
1905)
1906{
1907 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1908 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1909 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001910 sHalNvV2 *nvContents = NULL;
1911 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001912
Jeff Johnson295189b2012-06-20 16:38:30 -07001913 if (NULL == pHddCtx)
1914 {
1915 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1916 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001917 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001918 }
1919
Leo Chang80de3c22013-11-26 10:52:12 -08001920 nvVersion = vos_nv_getNvVersion();
1921 if (E_NV_V2 != nvVersion)
1922 {
1923 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1924 "%s : Not valid NV Version %d", __func__, nvVersion);
1925 return -EINVAL;
1926 }
1927
Jeff Johnson295189b2012-06-20 16:38:30 -07001928 /* Test first chunk of NV table */
1929 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1930 (0 == pHddCtx->ftm.processedNVTableSize))
1931 {
1932 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1933 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1934 {
c_hpothuffdb5272013-10-02 16:42:35 +05301935 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1936 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001937 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001938 }
1939
1940 switch (nvTable->nvTable)
1941 {
1942 case NV_TABLE_RATE_POWER_SETTINGS:
1943 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1944 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1945 break;
1946
1947 case NV_TABLE_REGULATORY_DOMAINS:
1948 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1949 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1950 break;
1951
1952 case NV_TABLE_DEFAULT_COUNTRY:
1953 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1954 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1955 break;
1956
1957 case NV_TABLE_TPC_POWER_TABLE:
1958 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1959 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1960 break;
1961
1962 case NV_TABLE_TPC_PDADC_OFFSETS:
1963 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1964 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1965 break;
1966
1967 case NV_TABLE_VIRTUAL_RATE:
1968 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1969 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1970 break;
1971
1972 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1973 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1974 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1975 break;
1976
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001977 case NV_TABLE_HW_CAL_VALUES:
1978 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1979 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1980 break;
1981
1982 case NV_TABLE_FW_CONFIG:
1983 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1984 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001985 break;
1986
1987 case NV_TABLE_ANTENNA_PATH_LOSS:
1988 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1989 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1990 break;
1991
1992 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1993 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1994 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1995 break;
1996
1997 default:
1998 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1999 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002000 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002001 break;
2002 }
2003
2004 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2005 {
2006 /* Invalid table size, discard and initialize data */
2007 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002008 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002009 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002010 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002011 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2012 pHddCtx->ftm.targetNVTableSize = 0;
2013 pHddCtx->ftm.processedNVTableSize = 0;
2014 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002015 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002016 }
2017
2018 /* Set Current Processing NV table type */
2019 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2020 /* Copy target NV table value into temp context buffer */
2021 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2022 pHddCtx->ftm.targetNVTablePointer,
2023 pHddCtx->ftm.targetNVTableSize);
2024
2025 }
2026
2027 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2028 {
2029 /* Invalid table type */
2030 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2031 "Invalid NV Table, now Processing %d, not %d",
2032 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2033 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2034 pHddCtx->ftm.targetNVTableSize = 0;
2035 pHddCtx->ftm.processedNVTableSize = 0;
2036 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002037
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002038 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002039 }
2040
2041 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002042 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002043 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2044 nvTable->chunkSize);
2045 /* Update processed pointer to prepare next chunk copy */
2046 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2047
2048 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2049 {
2050 /* Finished to process last chunk of data, initialize buffer */
2051 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2052 pHddCtx->ftm.targetNVTableSize = 0;
2053 pHddCtx->ftm.processedNVTableSize = 0;
2054 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2055 }
2056
2057 return 1;
2058}
2059
2060/**---------------------------------------------------------------------------
2061
2062 \brief wlan_hdd_ftm_set_nv_table() -
2063 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002064 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002065
2066 \param - ftmCmd - Pointer FTM Commad Buffer
2067
2068 \return - int
2069 -1, Process Host command fail, vail out
2070 1, Process Host command success
2071
2072 --------------------------------------------------------------------------*/
2073int wlan_hdd_ftm_set_nv_table
2074(
2075 hdd_context_t *pHddCtx,
2076 tPttMsgbuffer *ftmCmd
2077)
2078{
2079 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2080 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2081 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002082 sHalNvV2 *nvContents = NULL;
2083 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002084
2085 if (NULL == pHddCtx)
2086 {
2087 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2088 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002089 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002090 }
2091
Leo Chang80de3c22013-11-26 10:52:12 -08002092 nvVersion = vos_nv_getNvVersion();
2093 if (E_NV_V2 != nvVersion)
2094 {
2095 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2096 "%s : Not valid NV Version %d", __func__, nvVersion);
2097 return -EINVAL;
2098 }
2099
Jeff Johnson295189b2012-06-20 16:38:30 -07002100 /* Test first chunk of NV table */
2101 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2102 (0 == pHddCtx->ftm.processedNVTableSize))
2103 {
2104 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2105 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2106 {
c_hpothuffdb5272013-10-02 16:42:35 +05302107 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2108 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002109 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002110 }
2111
2112 switch (nvTable->nvTable)
2113 {
2114 case NV_TABLE_RATE_POWER_SETTINGS:
2115 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2116 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2117 break;
2118
2119 case NV_TABLE_REGULATORY_DOMAINS:
2120 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2121 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2122 break;
2123
2124 case NV_TABLE_DEFAULT_COUNTRY:
2125 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2126 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2127 break;
2128
2129 case NV_TABLE_TPC_POWER_TABLE:
2130 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2131 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2132 break;
2133
2134 case NV_TABLE_TPC_PDADC_OFFSETS:
2135 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2136 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2137 break;
2138
2139 case NV_TABLE_VIRTUAL_RATE:
2140 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2141 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2142 break;
2143
2144 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2145 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2146 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2147 break;
2148
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002149 case NV_TABLE_HW_CAL_VALUES:
2150 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2151 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2152 break;
2153
2154 case NV_TABLE_FW_CONFIG:
2155 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2156 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002157 break;
2158
2159 case NV_TABLE_ANTENNA_PATH_LOSS:
2160 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2161 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2162 break;
2163
2164 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2165 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2166 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2167 break;
2168
2169 default:
2170 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2171 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002172 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002173 break;
2174 }
2175
2176 /* Set Current Processing NV table type */
2177 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2178 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2179 {
2180 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2181 "Invalid Table Size %d", nvTable->tableSize);
2182 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2183 pHddCtx->ftm.targetNVTableSize = 0;
2184 pHddCtx->ftm.processedNVTableSize = 0;
2185 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002186 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002187 }
2188 }
2189
2190 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2191 {
2192 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2193 "Invalid NV Table, now Processing %d, not %d",
2194 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2195 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2196 pHddCtx->ftm.targetNVTableSize = 0;
2197 pHddCtx->ftm.processedNVTableSize = 0;
2198 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002199 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002200 }
2201 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002202 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002203 nvTable->chunkSize);
2204
2205 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2206 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2207 {
2208 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2209 pHddCtx->ftm.tempNVTableBuffer,
2210 pHddCtx->ftm.targetNVTableSize);
2211 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2212 pHddCtx->ftm.targetNVTableSize = 0;
2213 pHddCtx->ftm.processedNVTableSize = 0;
2214 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2215 }
2216
2217 return 1;
2218}
2219
2220/**---------------------------------------------------------------------------
2221
2222 \brief wlan_hdd_ftm_blank_nv() -
2223 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002224 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002225
2226 \param - ftmCmd - Pointer FTM Commad Buffer
2227
2228 \return - int
2229 -1, Process Host command fail, vail out
2230 0, Process Host command success
2231
2232 --------------------------------------------------------------------------*/
2233int wlan_hdd_ftm_blank_nv_table
2234(
2235 tPttMsgbuffer *ftmCmd
2236)
2237{
Leo Chang80de3c22013-11-26 10:52:12 -08002238 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002239 v_SIZE_t nvSize;
2240 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002241 sHalNvV2 *nvContents = NULL;
2242 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002243
2244 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2245 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2246 {
c_hpothuffdb5272013-10-02 16:42:35 +05302247 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2248 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002249 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002250 }
2251
Leo Chang80de3c22013-11-26 10:52:12 -08002252 nvVersion = vos_nv_getNvVersion();
2253 if (E_NV_V2 != nvVersion)
2254 {
2255 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2256 "%s : Not valid NV Version %d", __func__, nvVersion);
2257 return -EINVAL;
2258 }
2259
Jeff Johnson295189b2012-06-20 16:38:30 -07002260 itemSize = sizeof(nvContents->tables.pwrOptimum);
2261 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002262 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002263 itemSize);
2264
2265 itemSize = sizeof(nvContents->tables.regDomains);
2266 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002267 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002268 itemSize);
2269
2270 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2271 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002272 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002273 itemSize);
2274
2275 itemSize = sizeof(nvContents->tables.plutCharacterized);
2276 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002277 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002278 itemSize);
2279
2280 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2281 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002282 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002283 itemSize);
2284
2285 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2286 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002287 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002288 itemSize);
2289
2290 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2291 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002292 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002293 itemSize);
2294
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002295 itemSize = sizeof(nvContents->tables.hwCalValues);
2296 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002297 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002298 itemSize);
2299
2300 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2301 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002302 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002303 itemSize);
2304
2305 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2306 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002307 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002308 itemSize);
2309
2310 return 1;
2311}
2312
2313/**---------------------------------------------------------------------------
2314
2315 \brief wlan_hdd_ftm_delete_nv_table() -
2316 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002317 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002318
2319 \param - ftmCmd - Pointer FTM Commad Buffer
2320
2321 \return - int
2322 -1, Process Host command fail, vail out
2323 1, Process Host command success
2324
2325 --------------------------------------------------------------------------*/
2326int wlan_hdd_ftm_delete_nv_table
2327(
2328 tPttMsgbuffer *ftmCmd
2329)
2330{
Leo Chang80de3c22013-11-26 10:52:12 -08002331 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002332 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2333 v_SIZE_t nvSize;
2334 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002335 sHalNvV2 *nvContents = NULL;
2336 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002337
2338 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2339 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2340 {
c_hpothuffdb5272013-10-02 16:42:35 +05302341 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2342 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002343 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002344 }
2345
Leo Chang80de3c22013-11-26 10:52:12 -08002346 nvVersion = vos_nv_getNvVersion();
2347 if (E_NV_V2 != nvVersion)
2348 {
2349 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2350 "%s : Not valid NV Version %d", __func__, nvVersion);
2351 return -EINVAL;
2352 }
2353
Jeff Johnson295189b2012-06-20 16:38:30 -07002354 switch (nvTable->nvTable)
2355 {
2356 case NV_TABLE_RATE_POWER_SETTINGS:
2357 itemSize = sizeof(nvContents->tables.pwrOptimum);
2358 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002359 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002360 itemSize);
2361 break;
2362
2363 case NV_TABLE_REGULATORY_DOMAINS:
2364 itemSize = sizeof(nvContents->tables.regDomains);
2365 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002366 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002367 itemSize);
2368 break;
2369
2370 case NV_TABLE_DEFAULT_COUNTRY:
2371 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2372 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002373 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002374 itemSize);
2375 break;
2376
2377 case NV_TABLE_TPC_POWER_TABLE:
2378 itemSize = sizeof(nvContents->tables.plutCharacterized);
2379 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002380 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002381 itemSize);
2382 break;
2383
2384 case NV_TABLE_TPC_PDADC_OFFSETS:
2385 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2386 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002387 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002388 itemSize);
2389 break;
2390
2391 case NV_TABLE_VIRTUAL_RATE:
2392 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2393 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002394 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002395 itemSize);
2396 break;
2397
2398 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2399 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2400 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002401 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002402 itemSize);
2403 break;
2404
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002405 case NV_TABLE_HW_CAL_VALUES:
2406 itemSize = sizeof(nvContents->tables.hwCalValues);
2407 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002408 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002409 itemSize);
2410 break;
2411
2412 case NV_TABLE_FW_CONFIG:
2413 itemSize = sizeof(nvContents->tables.fwConfig);
2414 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002415 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002416 itemSize);
2417 break;
2418
2419 case NV_TABLE_ANTENNA_PATH_LOSS:
2420 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2421 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002422 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002423 itemSize);
2424 break;
2425
2426 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2427 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2428 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002429 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002430 itemSize);
2431 break;
2432
2433 default:
2434 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2435 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002436 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002437 break;
2438 }
2439
2440 return 1;
2441}
2442
2443/**---------------------------------------------------------------------------
2444
2445 \brief wlan_hdd_ftm_get_nv_field() -
2446 Get Specific NV field
2447
2448 \param - ftmCmd - Pointer FTM Commad Buffer
2449
2450 \return - int
2451 -1, Process Host command fail, vail out
2452 1, Process Host command success
2453
2454 --------------------------------------------------------------------------*/
2455int wlan_hdd_ftm_get_nv_field
2456(
2457 tPttMsgbuffer *ftmCmd
2458)
2459{
2460 sNvFields nvFieldDataBuffer;
2461 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2462 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2463 sHalNv *nvContents = NULL;
2464 v_SIZE_t nvSize;
2465
2466 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2467 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2468 {
c_hpothuffdb5272013-10-02 16:42:35 +05302469 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2470 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002471 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002472 }
2473 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2474
2475 switch (nvField->nvField)
2476 {
2477 case NV_COMMON_PRODUCT_ID:
2478 memcpy((void *)&nvField->fieldData,
2479 &nvFieldDataBuffer.productId,
2480 sizeof(nvFieldDataBuffer.productId));
2481 break;
2482
2483 case NV_COMMON_PRODUCT_BANDS:
2484 memcpy((void *)&nvField->fieldData,
2485 &nvFieldDataBuffer.productBands,
2486 sizeof(nvFieldDataBuffer.productBands));
2487 break;
2488
2489 case NV_COMMON_NUM_OF_TX_CHAINS:
2490 memcpy((void *)&nvField->fieldData,
2491 &nvFieldDataBuffer.numOfTxChains,
2492 sizeof(nvFieldDataBuffer.numOfTxChains));
2493 break;
2494
2495 case NV_COMMON_NUM_OF_RX_CHAINS:
2496 memcpy((void *)&nvField->fieldData,
2497 &nvFieldDataBuffer.numOfRxChains,
2498 sizeof(nvFieldDataBuffer.numOfRxChains));
2499 break;
2500
2501 case NV_COMMON_MAC_ADDR:
2502 memcpy((void *)&nvField->fieldData,
2503 &nvFieldDataBuffer.macAddr[0],
2504 NV_FIELD_MAC_ADDR_SIZE);
2505 break;
2506
2507 case NV_COMMON_MFG_SERIAL_NUMBER:
2508 memcpy((void *)&nvField->fieldData,
2509 &nvFieldDataBuffer.mfgSN[0],
2510 NV_FIELD_MFG_SN_SIZE);
2511 break;
2512
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002513 case NV_COMMON_WLAN_NV_REV_ID:
2514 memcpy((void *)&nvField->fieldData,
2515 &nvFieldDataBuffer.wlanNvRevId,
2516 sizeof(nvFieldDataBuffer.wlanNvRevId));
2517 break;
2518
Jeff Johnson295189b2012-06-20 16:38:30 -07002519 case NV_COMMON_COUPLER_TYPE:
2520 memcpy((void *)&nvField->fieldData,
2521 &nvFieldDataBuffer.couplerType,
2522 sizeof(nvFieldDataBuffer.couplerType));
2523 break;
2524
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002525 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002526 {
2527 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2528 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2529
2530 nvEmbededStatus = vos_nv_isEmbeddedNV();
2531
2532 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2533 {
2534 // High bit is set to indicate embedded NV..
2535 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2536 }
2537
2538 memcpy((void *)&nvField->fieldData,
2539 &nvVersion,
2540 sizeof(nvFieldDataBuffer.nvVersion));
2541 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002542 break;
2543
Jeff Johnson295189b2012-06-20 16:38:30 -07002544 default:
2545 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2546 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002547 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002548 break;
2549 }
2550
2551 return 1;
2552}
2553
2554/**---------------------------------------------------------------------------
2555
2556 \brief wlan_hdd_ftm_set_nv_field() -
2557 Set Specific NV field
2558
2559 \param - ftmCmd - Pointer FTM Commad Buffer
2560
2561 \return - int
2562 -1, Process Host command fail, vail out
2563 1, Process Host command success
2564
2565 --------------------------------------------------------------------------*/
2566int wlan_hdd_ftm_set_nv_field
2567(
2568 tPttMsgbuffer *ftmCmd
2569)
2570{
2571 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2572 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2573 v_SIZE_t nvSize;
2574 sHalNv *nvContents = NULL;
2575 v_U8_t macLoop;
2576 v_U8_t *pNVMac;
2577 v_U8_t lastByteMAC;
2578
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002579
Jeff Johnson295189b2012-06-20 16:38:30 -07002580 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2581 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2582 {
c_hpothuffdb5272013-10-02 16:42:35 +05302583 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2584 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002585 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002586 }
2587
2588 switch (nvField->nvField)
2589 {
2590 case NV_COMMON_PRODUCT_ID:
2591 memcpy(&nvContents->fields.productId,
2592 &nvField->fieldData,
2593 sizeof(nvContents->fields.productId));
2594 break;
2595
2596 case NV_COMMON_PRODUCT_BANDS:
2597 memcpy(&nvContents->fields.productBands,
2598 &nvField->fieldData,
2599 sizeof(nvContents->fields.productBands));
2600 break;
2601
2602 case NV_COMMON_NUM_OF_TX_CHAINS:
2603 memcpy(&nvContents->fields.numOfTxChains,
2604 &nvField->fieldData,
2605 sizeof(nvContents->fields.numOfTxChains));
2606 break;
2607
2608 case NV_COMMON_NUM_OF_RX_CHAINS:
2609 memcpy(&nvContents->fields.numOfRxChains,
2610 &nvField->fieldData,
2611 sizeof(nvContents->fields.numOfRxChains));
2612 break;
2613
2614 case NV_COMMON_MAC_ADDR:
2615 /* If Last byte is larger than 252 (0xFC), return Error,
2616 * Since 3MACs should be derived from first MAC */
2617 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002618 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002619 {
2620 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2621 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002622 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002623 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002624 }
2625
2626 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002627 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002628 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2629 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002630 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002631 lastByteMAC + macLoop;
2632 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002633 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002634 NV_FIELD_MAC_ADDR_SIZE);
2635 }
2636 break;
2637
2638 case NV_COMMON_MFG_SERIAL_NUMBER:
2639 memcpy(&nvContents->fields.mfgSN[0],
2640 &nvField->fieldData,
2641 NV_FIELD_MFG_SN_SIZE);
2642 break;
2643
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002644 case NV_COMMON_WLAN_NV_REV_ID:
2645 memcpy(&nvContents->fields.wlanNvRevId,
2646 &nvField->fieldData,
2647 sizeof(nvContents->fields.wlanNvRevId));
2648 break;
2649
Jeff Johnson295189b2012-06-20 16:38:30 -07002650 case NV_COMMON_COUPLER_TYPE:
2651 memcpy(&nvContents->fields.couplerType,
2652 &nvField->fieldData,
2653 sizeof(nvContents->fields.couplerType));
2654 break;
2655
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002656 case NV_COMMON_NV_VERSION:
2657 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2658 "Cannot modify NV version field %d", nvField->nvField);
2659 return -EIO;
2660 break;
2661
Jeff Johnson295189b2012-06-20 16:38:30 -07002662 default:
2663 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2664 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002665 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002666 break;
2667 }
2668
2669 return 1;
2670}
2671
2672/**---------------------------------------------------------------------------
2673
2674 \brief wlan_hdd_ftm_store_nv_table() -
2675 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002676 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002677
2678 \param - ftmCmd - Pointer FTM Commad Buffer
2679
2680 \return - int
2681 -1, Process Host command fail, vail out
2682 0, Process Host command success
2683
2684 --------------------------------------------------------------------------*/
2685int wlan_hdd_ftm_store_nv_table
2686(
2687 tPttMsgbuffer *ftmCmd
2688)
2689{
2690 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2691 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002692 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2693 void *tablePtr = NULL;
2694 unsigned int tableSize = 0;
2695 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002696 sHalNvV2 *nvContents = NULL;
2697 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002698
2699 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2700 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2701 {
c_hpothuffdb5272013-10-02 16:42:35 +05302702 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2703 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002704 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002705 }
2706
Leo Chang80de3c22013-11-26 10:52:12 -08002707 nvVersion = vos_nv_getNvVersion();
2708 if (E_NV_V2 != nvVersion)
2709 {
2710 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2711 "%s : Not valid NV Version %d", __func__, nvVersion);
2712 return -EINVAL;
2713 }
2714
Jeff Johnson295189b2012-06-20 16:38:30 -07002715 /* Set Platform type as PRIMA */
2716 nvContents->fields.wlanNvRevId = 2;
2717
2718 switch(nvTable->nvTable)
2719 {
2720 case NV_FIELDS_IMAGE:
2721 tablePtr = (void *)&nvContents->fields;
2722 tableSize = sizeof(nvContents->fields);
2723 tableVNVType = VNV_FIELD_IMAGE;
2724 break;
2725
2726 case NV_TABLE_RATE_POWER_SETTINGS:
2727 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2728 tableSize = sizeof(nvContents->tables.pwrOptimum);
2729 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2730 break;
2731
2732 case NV_TABLE_REGULATORY_DOMAINS:
2733 tablePtr = (void *)&nvContents->tables.regDomains[0];
2734 tableSize = sizeof(nvContents->tables.regDomains);
2735 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2736 break;
2737
2738 case NV_TABLE_DEFAULT_COUNTRY:
2739 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2740 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2741 tableVNVType = VNV_DEFAULT_LOCATION;
2742 break;
2743
2744 case NV_TABLE_TPC_POWER_TABLE:
2745 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2746 tableSize = sizeof(nvContents->tables.plutCharacterized);
2747 tableVNVType = VNV_TPC_POWER_TABLE;
2748 break;
2749
2750 case NV_TABLE_TPC_PDADC_OFFSETS:
2751 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2752 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2753 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2754 break;
2755
2756 case NV_TABLE_VIRTUAL_RATE:
2757 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2758 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2759 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2760 break;
2761
2762 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2763 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2764 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2765 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2766 break;
2767
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002768 case NV_TABLE_HW_CAL_VALUES:
2769 tablePtr = (void *)&nvContents->tables.hwCalValues;
2770 tableSize = sizeof(nvContents->tables.hwCalValues);
2771 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002772 break;
2773
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002774 case NV_TABLE_FW_CONFIG:
2775 tablePtr = (void *)&nvContents->tables.fwConfig;
2776 tableSize = sizeof(nvContents->tables.fwConfig);
2777 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002778 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002779
Jeff Johnson295189b2012-06-20 16:38:30 -07002780 case NV_TABLE_ANTENNA_PATH_LOSS:
2781 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2782 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2783 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2784 break;
2785
2786 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2787 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2788 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2789 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2790 break;
2791
2792 default:
2793 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2794 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002795 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002796 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002797
Jeff Johnson295189b2012-06-20 16:38:30 -07002798 }
2799
2800 nvStatus = vos_nv_write(tableVNVType,
2801 tablePtr,
2802 tableSize);
2803 if(VOS_STATUS_SUCCESS != nvStatus)
2804 {
c_hpothuffdb5272013-10-02 16:42:35 +05302805 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2806 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002807 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002808 }
2809
2810 return 1;
2811}
2812
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002813/* --------------------------------------------------------------------------
2814 \brief wlan_hdd_ftm_get_nv_bin() -
2815 Get NV bin read from Flash Memory, file
2816
2817 \param - ftmCmd - Pointer FTM Commad Buffer
2818
2819 \return - int
2820 -1, Process Host command fail, vail out
2821 0, Process Host command success
2822--------------------------------------------------------------------------*/
2823
2824static int wlan_hdd_ftm_get_nv_bin
2825(
2826 v_U16_t msgId,
2827 hdd_context_t *pHddCtx,
2828 tPttMsgbuffer *ftmCmd
2829)
2830{
2831 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2832 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2833 v_SIZE_t nvSize;
2834 v_U8_t *nvContents;
2835 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002836 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002837
Leo Chang80de3c22013-11-26 10:52:12 -08002838 nvVersion = vos_nv_getNvVersion();
2839 if (E_NV_V3 != nvVersion)
2840 {
2841 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2842 "%s : Not valid NV Version %d", __func__, nvVersion);
2843 return -EINVAL;
2844 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002845
2846 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2847 (0 == pHddCtx->ftm.processedNVTableSize))
2848 {
2849 if ( msgId == PTT_MSG_GET_NV_BIN )
2850 {
2851 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2852 }
2853 else
2854 {
2855 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2856 }
2857
2858 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2859 {
c_hpothuffdb5272013-10-02 16:42:35 +05302860 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2861 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002862 return -EIO;
2863 }
2864
2865 switch (nvTable->nvTable)
2866 {
2867 case NV_BINARY_IMAGE:
2868 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2869 break;
2870 default:
2871 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2872 "Not Valid NV Table %d", nvTable->nvTable);
2873 return -EIO;
2874 break;
2875 }
2876
2877 /* Set Current Processing NV table type */
2878 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2879 if ( msgId == PTT_MSG_GET_NV_BIN )
2880 {
2881 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2882 /* Validity Period */
2883 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2884 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2885 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2886 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2887 offset = sizeof(v_U32_t);
2888 }
2889 else
2890 {
2891 pHddCtx->ftm.targetNVTableSize = nvSize;
2892 offset = 0;
2893 }
2894
2895 /* Copy target NV table value into temp context buffer */
2896 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2897 pHddCtx->ftm.targetNVTablePointer,
2898 pHddCtx->ftm.targetNVTableSize);
2899 }
2900
2901
2902 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2903 {
2904 /* Invalid table type */
2905 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2906 "Invalid NV Table, now Processing %d, not %d",
2907 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2908
2909 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2910 pHddCtx->ftm.targetNVTableSize = 0;
2911 pHddCtx->ftm.processedNVTableSize = 0;
2912 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2913
2914 return -EINVAL;
2915 }
2916
2917 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2918
2919 /* Update processed pointer to prepare next chunk copy */
2920 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2921 pHddCtx->ftm.targetNVTableSize )
2922 {
2923 nvTable->chunkSize =
2924 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2925 }
2926
2927 /* Copy next chunk of NV table value into response buffer */
2928 vos_mem_copy(
2929 &nvTable->tableData,
2930 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2931 nvTable->chunkSize);
2932
2933 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2934
2935 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2936 {
2937 /* Finished to process last chunk of data, initialize buffer */
2938 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2939 pHddCtx->ftm.targetNVTableSize = 0;
2940 pHddCtx->ftm.processedNVTableSize = 0;
2941 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2942 }
2943
2944 return 1;
2945}
2946
2947/**---------------------------------------------------------------------------
2948
2949 \brief wlan_hdd_ftm_set_nv_bin() -
2950 Set NV bin to Flash Memory, file
2951
2952 \param - ftmCmd - Pointer FTM Commad Buffer
2953
2954 \return - int
2955 -1, Process Host command fail, vail out
2956 0, Process Host command success
2957
2958+----------------------------------------------------------------------------*/
2959
2960static int wlan_hdd_ftm_set_nv_bin
2961(
2962 hdd_context_t *pHddCtx,
2963 tPttMsgbuffer *ftmCmd
2964)
2965{
2966 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2967 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002968 eNvVersionType nvVersion;
2969
2970 nvVersion = vos_nv_getNvVersion();
2971 if (E_NV_V3 != nvVersion)
2972 {
2973 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2974 "%s : Not valid NV Version %d", __func__, nvVersion);
2975 return -EINVAL;
2976 }
2977
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002978
2979 /* Test first chunk of NV table */
2980 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2981 (0 == pHddCtx->ftm.processedNVTableSize))
2982 {
2983 switch (nvTable->nvTable)
2984 {
2985 case NV_BINARY_IMAGE:
2986 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2987 break;
2988 default:
2989 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2990 "Not Valid NV Table %d", nvTable->nvTable);
2991 return -EIO;
2992 break;
2993 }
2994
2995 /* Set Current Processing NV table type */
2996 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2997 pHddCtx->ftm.processedNVTableSize = 0;
2998
2999 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
3000 {
3001 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3002 "Invalid Table Size %d", nvTable->tableSize);
3003 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3004 pHddCtx->ftm.targetNVTableSize = 0;
3005 pHddCtx->ftm.processedNVTableSize = 0;
3006 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3007 return -EINVAL;
3008 }
3009 }
3010
3011 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3012 {
3013 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3014 "Invalid NV Table, now Processing %d, not %d",
3015 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3016 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3017 pHddCtx->ftm.targetNVTableSize = 0;
3018 pHddCtx->ftm.processedNVTableSize = 0;
3019 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3020 return -EINVAL;
3021 }
3022
3023 vos_mem_copy(
3024 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3025 &nvTable->tableData,
3026 nvTable->chunkSize);
3027
3028 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3029
3030 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3031 {
3032 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3033 "Processing Done!! write encoded Buffer %d",
3034 pHddCtx->ftm.targetNVTableSize);
3035
3036 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3037 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3038
3039 if ((VOS_STATUS_SUCCESS != nvStatus))
3040 {
3041 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3042 "Fail to set NV Binary %d", nvStatus);
3043 return -EIO;
3044 }
3045
3046 nvStatus = vos_nv_setNVEncodedBuffer(
3047 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3048 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3049
3050 if ((VOS_STATUS_SUCCESS != nvStatus))
3051 {
3052 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3053 "Fail to set NV Binary %d", nvStatus);
3054 return -EIO;
3055 }
3056
3057 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3058 pHddCtx->ftm.targetNVTableSize = 0;
3059 pHddCtx->ftm.processedNVTableSize = 0;
3060 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3061 }
3062
3063 return 1;
3064}
3065
Jeff Johnson295189b2012-06-20 16:38:30 -07003066/**---------------------------------------------------------------------------
3067
3068 \brief wlan_hdd_ftm_temp_get_rel_num() -
3069 Get internal release number
3070
3071 \param - ftmCmd - Pointer FTM Commad Buffer
3072
3073 \return - int
3074 -1, Process Host command fail, vail out
3075 0, Process Host command success
3076
3077 --------------------------------------------------------------------------*/
3078int wlan_hdd_ftm_temp_get_rel_num
3079(
3080 tPttMsgbuffer *ftmCmd
3081)
3082{
3083 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3084
3085 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3086 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3087 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3088 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3089 relNum->relParams.pttMax = 10;
3090 relNum->relParams.pttMin = 1;
3091
3092 return 1;
3093}
3094
3095/**---------------------------------------------------------------------------
3096
3097 \brief wlan_hdd_process_ftm_host_cmd() -
3098 process any command should be handled within host.
3099 decide any command should be send to HAL or not
3100
3101 \param - ftmCmd - Pointer FTM Commad Buffer
3102
3103 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003104 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003105 0, Process Host command success, not need to send CMD to HAL
3106 1, Process Host command success, need to send CMD to HAL
3107
3108 --------------------------------------------------------------------------*/
3109int wlan_hdd_process_ftm_host_cmd
3110(
3111 hdd_context_t *pHddCtx,
3112 void *ftmCmd
3113)
3114{
3115 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3116 int needToRouteHal = 1;
3117 int hostState = 1;
3118
3119 switch(pFTMCmd->msgId)
3120 {
3121 case PTT_MSG_GET_NV_TABLE:
3122 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3123 needToRouteHal = 0;
3124 break;
3125
3126 case PTT_MSG_SET_NV_TABLE:
3127 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3128 /* Temp NV Operation will be isolated to host
3129 needToRouteHal = 1; */
3130 needToRouteHal = 0;
3131 break;
3132
3133 case PTT_MSG_BLANK_NV:
3134 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3135 needToRouteHal = 1;
3136 break;
3137
3138 case PTT_MSG_DEL_NV_TABLE:
3139 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3140 needToRouteHal = 1;
3141 break;
3142
3143 case PTT_MSG_GET_NV_FIELD:
3144 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3145 needToRouteHal = 0;
3146 break;
3147
3148 case PTT_MSG_SET_NV_FIELD:
3149 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3150 needToRouteHal = 0;
3151 break;
3152
3153 case PTT_MSG_STORE_NV_TABLE:
3154 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3155 needToRouteHal = 0;
3156 break;
3157
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003158 case PTT_MSG_GET_NV_BIN:
3159 case PTT_MSG_GET_DICTIONARY:
3160 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3161 needToRouteHal = 0;
3162 break;
3163
3164 case PTT_MSG_SET_NV_BIN:
3165 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3166 needToRouteHal = 0;
3167 break;
3168
Jeff Johnson295189b2012-06-20 16:38:30 -07003169 case PTT_MSG_DBG_READ_REGISTER:
3170 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3171 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3172 needToRouteHal = 0;
3173 break;
3174
3175 case PTT_MSG_DBG_WRITE_REGISTER:
3176 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3177 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3178 needToRouteHal = 0;
3179 break;
3180
3181 case PTT_MSG_DBG_READ_MEMORY:
3182 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3183 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3184 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3185 needToRouteHal = 0;
3186 break;
3187
3188 case PTT_MSG_DBG_WRITE_MEMORY:
3189 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3190 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3191 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3192 needToRouteHal = 0;
3193 break;
3194
3195 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3196 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3197 needToRouteHal = 0;
3198 break;
3199
3200 default:
3201 needToRouteHal = 1;
3202 break;
3203 }
3204
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003205 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003206 {
3207 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3208 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003209 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003210 }
3211
3212 return needToRouteHal;
3213}
Jeff Johnson295189b2012-06-20 16:38:30 -07003214
3215/**---------------------------------------------------------------------------
3216
3217 \brief wlan_hdd_process_ftm_cmd() -
3218
3219 This function process the commands received from the ptt socket application.
3220
3221 \param - pAdapter - Pointer HDD Context.
3222
3223 \param - wnl - Pointer to the ANI netlink header.
3224
3225 \return - none
3226
3227 --------------------------------------------------------------------------*/
3228
3229void wlan_hdd_process_ftm_cmd
3230(
3231 hdd_context_t *pHddCtx,
3232 tAniNlHdr *wnl
3233)
3234{
3235 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3236 v_U16_t cmd_len;
3237 v_U8_t *pftm_data;
3238 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003239 int hostState;
3240 tPttMsgbuffer *tempRspBuffer = NULL;
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303241 static int count;
Jeff Johnson295189b2012-06-20 16:38:30 -07003242
3243 ENTER();
3244
Jeff Johnsone7245742012-09-05 17:12:55 -07003245 //Delay to fix NV write failure on JB
3246 vos_busy_wait(10000); //10ms
3247
Jeff Johnson295189b2012-06-20 16:38:30 -07003248 if (!pRequestBuf) {
3249
Arif Hussain6d2a3322013-11-17 19:50:10 -08003250 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003251 return ;
3252 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303253
3254 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3255 {
3256 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3257 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3258 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3259 return ;
3260 }
3261
Jeff Johnson295189b2012-06-20 16:38:30 -07003262 /*Save the received request*/
3263 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3264
3265 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3266 /*Save the received request netlink header used for sending the response*/
3267 pHddCtx->ftm.wnl = wnl;
3268 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3269
Arif Hussain6d2a3322013-11-17 19:50:10 -08003270 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003271
3272 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3273 wlan_ftm_send_response(pHddCtx);
3274 return ;
3275 }
3276
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303277 if (VOS_FTM_MODE != hdd_get_conparam())
3278 {
3279 count++;
3280 if (count == 1 || !(count % 10))
3281 {
3282 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Driver not loaded in FTM"
3283 " mode, current mode: %d ",__func__, hdd_get_conparam());
3284 }
3285 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3286 wlan_ftm_send_response(pHddCtx);
3287 return ;
3288 }
3289
Jeff Johnson295189b2012-06-20 16:38:30 -07003290 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3291 {
3292 case WLAN_FTM_START:
3293 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3294
Arif Hussain6d2a3322013-11-17 19:50:10 -08003295 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003296 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3297 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3298 wlan_ftm_send_response(pHddCtx);
3299 return;
3300 }
3301
3302 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3303 {
3304 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3305 ,__func__);
3306 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3307 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303308 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003309 return;
3310 }
3311 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3312 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3313 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3314 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3315
3316 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303317 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003318 break;
3319
3320 case WLAN_FTM_STOP:
3321 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3322
Arif Hussain6d2a3322013-11-17 19:50:10 -08003323 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003324 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3325 wlan_ftm_send_response(pHddCtx);
3326 return;
3327 }
3328
3329 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3330
3331 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3332 wlan_ftm_send_response(pHddCtx);
3333 return;
3334 }
3335
3336 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3337 /* This would send back the Command Success Status */
3338 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3339
3340 wlan_ftm_send_response(pHddCtx);
3341
3342 break;
3343
3344 case WLAN_FTM_CMD:
3345 /* if it is regular FTM command, pass it to HAL PHY */
3346 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003347 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003348 return;
3349 }
3350 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3351
Arif Hussain6d2a3322013-11-17 19:50:10 -08003352 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003353
3354 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3355 wlan_ftm_send_response(pHddCtx);
3356 return;
3357
3358 }
3359 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3360 cmd_len = pRequestBuf->ftm_hdr.data_len;
3361 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3362 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3363
Jeff Johnson295189b2012-06-20 16:38:30 -07003364 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3365 if (0 == hostState)
3366 {
3367 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3368 if (NULL == tempRspBuffer)
3369 {
3370 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003371 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003372 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3373 wlan_ftm_send_response(pHddCtx);
3374 return;
3375 }
3376 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3377 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3378 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3379 (unsigned char *) tempRspBuffer,
3380 tempRspBuffer->msgBodyLength);
3381 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3382 wlan_ftm_send_response(pHddCtx);
3383 vos_mem_free(tempRspBuffer);
3384 return;
3385 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003386 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003387 {
3388 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3389 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3390 wlan_ftm_send_response(pHddCtx);
3391 return;
3392 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003393
3394 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3395
Jeff Johnson295189b2012-06-20 16:38:30 -07003396
3397 /*Post the command to the HAL*/
3398 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3399
Arif Hussain6d2a3322013-11-17 19:50:10 -08003400 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003401 return;
3402
3403 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303404 /*After successful posting of message the command should be pending*/
3405 pHddCtx->ftm.IsCmdPending = TRUE;
3406
Jeff Johnson295189b2012-06-20 16:38:30 -07003407 /*Wait here until you get the response from HAL*/
3408 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3409 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303410 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3411 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3412 wlan_ftm_send_response(pHddCtx);
3413 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003414 return;
3415 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303416 /*This check will handle the case where the completion is sent by
3417 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3418 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3419 {
3420 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3421 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3422 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3423
3424 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3425 wlan_ftm_send_response(pHddCtx);
3426 pHddCtx->ftm.IsCmdPending = FALSE;
3427 return ;
3428 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003429
3430 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3431
3432 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3433
3434 wlan_ftm_send_response(pHddCtx);
3435 pHddCtx->ftm.IsCmdPending = FALSE;
3436 break;
3437
3438 default:
3439
Arif Hussain6d2a3322013-11-17 19:50:10 -08003440 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003441 return;
3442 }
3443
3444 EXIT();
3445 return;
3446} /* wlan_adp_ftm_cmd() */
3447
3448/**---------------------------------------------------------------------------
3449
3450 \brief wlan_ftm_priv_start_stop_ftm() -
3451
3452 This function is used for start/stop the ftm driver.
3453
3454 \param - pAdapter - Pointer HDD Context.
3455 - start - 1/0 to start/stop ftm driver.
3456
3457 \return - 0 for success, non zero for failure
3458
3459 --------------------------------------------------------------------------*/
3460
3461static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3462 v_U16_t start)
3463{
3464 VOS_STATUS status;
3465 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3466
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003467 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003468 {
3469 pHddCtx->ftm.cmd_iwpriv = TRUE;
3470 status = wlan_hdd_ftm_start(pHddCtx);
3471
3472 if (status != VOS_STATUS_SUCCESS)
3473 {
3474 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3475 "FTM Start Failed");
3476 return VOS_STATUS_E_FAILURE;
3477 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303478 if (NULL == pMsgBuf)
3479 {
3480 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3481 if (NULL == pMsgBuf)
3482 {
3483 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3484 "%s:pMsgBuf is NULL", __func__);
3485 return VOS_STATUS_E_FAILURE;
3486 }
3487 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003488 }
3489 else
3490 {
3491 status = wlan_ftm_stop(pHddCtx);
3492
3493 if (status != VOS_STATUS_SUCCESS)
3494 {
3495 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3496 "FTM Stop Failed");
3497 return VOS_STATUS_E_FAILURE;
3498 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303499 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3500 if (pMsgBuf)
3501 {
3502 vos_mem_free((v_VOID_t * )pMsgBuf);
3503 pMsgBuf = NULL;
3504 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003505 }
3506 return VOS_STATUS_SUCCESS;
3507}
3508
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303509
3510static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3511{
3512 unsigned int *table = NULL;
3513 int index = 0;
3514
3515 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3516 table = valid_channel;
3517 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3518 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3519 table = valid_channel_cb40;
3520 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3521 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3522 table = valid_channel_cb80;
3523
3524 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303525 {
3526 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3527 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303528 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303529 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303530
3531 while (table[index] != 0)
3532 {
3533 if (table[index] == channel)
3534 return VOS_STATUS_SUCCESS;
3535
3536 index++;
3537 }
3538
3539 return VOS_STATUS_E_FAILURE;
3540}
3541
3542
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303543static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3544{
3545 unsigned int primary_channel = center_channel;
3546
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303547 switch (cb)
3548 {
3549 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3550 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3551 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3552 primary_channel -= 2;
3553 break;
3554
3555
3556 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3557 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3558 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3559 primary_channel += 2;
3560 break;
3561
3562 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3563 primary_channel -= 6;
3564 break;
3565
3566 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3567 primary_channel += 6;
3568 break;
3569 }
3570
3571 return primary_channel;
3572
3573}
3574
Jeff Johnson295189b2012-06-20 16:38:30 -07003575/**---------------------------------------------------------------------------
3576
3577 \brief wlan_ftm_priv_set_channel() -
3578
3579 This function is used for setting the channel to the halphy ptt module.
3580
3581 \param - pAdapter - Pointer HDD Context.
3582 - channel - Channel Number 1-14.
3583
3584 \return - 0 for success, non zero for failure
3585
3586 --------------------------------------------------------------------------*/
3587
3588static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3589{
Jeff Johnson295189b2012-06-20 16:38:30 -07003590 uPttMsgs *pMsgBody;
3591 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303592 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003593 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3594
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303595 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003596 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303597 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3598 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003599 return VOS_STATUS_E_FAILURE;
3600 }
3601
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303602 if (NULL == pMsgBuf)
3603 {
3604 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3605 "%s:pMsgBuf is NULL", __func__);
3606 return VOS_STATUS_E_NOMEM;
3607 }
3608
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303609 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003610 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303611 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3612 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003613 return VOS_STATUS_E_FAILURE;
3614 }
3615
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303616 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003617 init_completion(&pHddCtx->ftm.ftm_comp_var);
3618 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3619 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3620
3621 pMsgBody = &pMsgBuf->msgBody;
3622
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303623 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003624
Arif Hussain6d2a3322013-11-17 19:50:10 -08003625 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303626 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003627
3628 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3629
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303630 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003631 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303632 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3633 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003634 status = VOS_STATUS_E_FAILURE;
3635 goto done;
3636
3637 }
c_hpothuffdb5272013-10-02 16:42:35 +05303638 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303639 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303640 if (0 >= ret )
3641 {
3642 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3643 FL("wait on ftm_comp_var failed %ld"), ret);
3644 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003645
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303646 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003647 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303648 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3649 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003650 status = VOS_STATUS_E_FAILURE;
3651 goto done;
3652
3653 }
3654done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003655
3656 return status;
3657}
3658
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05303659static VOS_STATUS wlan_ftm_priv_set_dump(hdd_adapter_t *pAdapter, int *value)
3660{
3661 uPttMsgs *pMsgBody;
3662 VOS_STATUS status;
3663 long ret;
3664 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3665
3666 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3667 {
3668 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3669 "%s:Ftm has not started. Please start the ftm. ", __func__);
3670 return VOS_STATUS_E_FAILURE;
3671 }
3672
3673 if (NULL == pMsgBuf)
3674 {
3675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3676 "%s:pMsgBuf is NULL", __func__);
3677 return VOS_STATUS_E_NOMEM;
3678 }
3679
3680 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
3681 init_completion(&pHddCtx->ftm.ftm_comp_var);
3682 pMsgBuf->msgId = PTT_MSG_PRIMA_GENERIC_CMD;
3683 pMsgBuf->msgBodyLength = sizeof(tMsgPttPrimaGenericCmd) + PTT_HEADER_LENGTH;
3684
3685 pMsgBody = &pMsgBuf->msgBody;
3686
3687 pMsgBody->PrimaGenericCmd.cmdIdx = value[0];
3688 pMsgBody->PrimaGenericCmd.param1 = value[1];
3689 pMsgBody->PrimaGenericCmd.param2 = value[2];
3690 pMsgBody->PrimaGenericCmd.param3 = value[3];
3691 pMsgBody->PrimaGenericCmd.param4 = value[4];
3692
3693 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3694
3695 if (status != VOS_STATUS_SUCCESS)
3696 {
3697 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3698 "%s:wlan_ftm_postmsg failed", __func__);
3699 status = VOS_STATUS_E_FAILURE;
3700 goto done;
3701 }
3702
3703 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3704 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3705 if (0 >= ret )
3706 {
3707 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3708 FL("wait on ftm_comp_var failed %ld"), ret);
3709 }
3710
3711 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3712 {
3713 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3714 "%s:Ptt response status failed", __func__);
3715 }
3716
3717 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3718 {
3719 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3720 "%s:Ptt response status failed", __func__);
3721 status = VOS_STATUS_E_FAILURE;
3722 goto done;
3723 }
3724
3725done:
3726 return status;
3727}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303728
3729/**---------------------------------------------------------------------------
3730
3731 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3732
3733 This function is used for setting the power control mode for tx.
3734
3735 \param - pAdapter - Pointer HDD Context.
3736 - pwr_mode - power control mode 0-2.
3737
3738 \return - 0 for success, non zero for failure
3739
3740 --------------------------------------------------------------------------*/
3741
3742static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3743 v_U16_t pwr_mode)
3744{
3745 uPttMsgs *pMsgBody;
3746 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303747 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303748 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3749
3750 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3751 {
3752 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3753 "%s:Ftm has not started. Please start the ftm. ", __func__);
3754 return VOS_STATUS_E_FAILURE;
3755 }
3756
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303757 if (NULL == pMsgBuf)
3758 {
3759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3760 "%s:pMsgBuf is NULL", __func__);
3761 return VOS_STATUS_E_NOMEM;
3762 }
3763
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303764 if (pwr_mode > 2)
3765 {
3766 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3767 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3768 return VOS_STATUS_E_FAILURE;
3769 }
3770
3771 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3772 init_completion(&pHddCtx->ftm.ftm_comp_var);
3773 pMsgBody = &pMsgBuf->msgBody;
3774 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3775 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3776
3777 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3778 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3779
3780 if (status != VOS_STATUS_SUCCESS)
3781 {
3782 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3783 "%s:wlan_ftm_postmsg failed", __func__);
3784 status = VOS_STATUS_E_FAILURE;
3785 goto done;
3786 }
c_hpothuffdb5272013-10-02 16:42:35 +05303787 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303788 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303789 if (0 >= ret )
3790 {
3791 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3792 FL("wait on ftm_comp_var failed %ld"), ret);
3793 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794
3795 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3796 {
3797 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3798 "%s:Ptt response status failed", __func__);
3799 status = VOS_STATUS_E_FAILURE;
3800 goto done;
3801 }
3802
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303803 ftm_status.powerCtlMode= pwr_mode;
3804
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303805 done:
3806 return status;
3807
3808}
3809
Jeff Johnson295189b2012-06-20 16:38:30 -07003810/**---------------------------------------------------------------------------
3811
3812 \brief wlan_ftm_priv_set_txpower() -
3813
3814 This function is used for setting the txpower to the halphy ptt module.
3815
3816 \param - pAdapter - Pointer HDD Context.
3817 - txpower - txpower Number 1-18.
3818
3819 \return - 0 for success, non zero for failure
3820
3821 --------------------------------------------------------------------------*/
3822
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303823static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3824 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003825{
Jeff Johnson295189b2012-06-20 16:38:30 -07003826 uPttMsgs *pMsgBody;
3827 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303828 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003829 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3830
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303831 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003832 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303833 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3834 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003835 return VOS_STATUS_E_FAILURE;
3836 }
3837
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303838 if (NULL == pMsgBuf)
3839 {
3840 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3841 "%s:pMsgBuf is NULL", __func__);
3842 return VOS_STATUS_E_NOMEM;
3843 }
3844
Jeff Johnson295189b2012-06-20 16:38:30 -07003845 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3846 * when tx pktgen is enabled
3847 */
3848 if (ftm_status.frameGenEnabled)
3849 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303850 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3851 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003852 return VOS_STATUS_E_FAILURE;
3853 }
3854
3855 if(!(txpower >= 9 && txpower <= 24))
3856 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303857 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3858 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003859 return VOS_STATUS_E_FAILURE;
3860 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003861
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303862 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3863 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003864 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003865 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3866 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3867
3868 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3869
3870 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3871
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303872 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003873 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303874 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3875 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003876 status = VOS_STATUS_E_FAILURE;
3877 goto done;
3878 }
c_hpothuffdb5272013-10-02 16:42:35 +05303879 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303880 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303881 if (0 >= ret )
3882 {
3883 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3884 FL("wait on ftm_comp_var failed %ld"), ret);
3885 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003886
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303887 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003888 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303889 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3890 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003891 status = VOS_STATUS_E_FAILURE;
3892 goto done;
3893 }
3894
Jeff Johnson295189b2012-06-20 16:38:30 -07003895 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003896
3897 return status;
3898
3899}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303900
3901
3902static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3903 v_U16_t enable)
3904{
3905 tANI_U32 value = 0;
3906 tANI_U32 reg_addr;
3907 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303908
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303909 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3910 {
3911 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3912 "%s:Ftm has not started. Please start the ftm. ", __func__);
3913 return VOS_STATUS_E_FAILURE;
3914 }
3915
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303916 reg_addr = WCNSS_TXFIR_OFFSET;
3917
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303918 wpalReadRegister(reg_addr, &value);
3919 if (enable)
3920 {
3921 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3922 }
3923 else
3924 {
3925 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3926 }
3927
3928 wpalWriteRegister(reg_addr, value);
3929
3930 return VOS_STATUS_SUCCESS;
3931}
3932
3933
Jeff Johnson295189b2012-06-20 16:38:30 -07003934/**---------------------------------------------------------------------------
3935
3936 \brief wlan_ftm_priv_set_txrate() -
3937
3938 This function is used for setting the txrate to the halphy ptt module.
3939 It converts the user input string for txrate to the tx rate index.
3940
3941 \param - pAdapter - Pointer HDD Context.
3942 - txrate - Pointer to the tx rate string.
3943
3944 \return - 0 for success, non zero for failure
3945
3946 --------------------------------------------------------------------------*/
3947
3948static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3949{
3950 int ii;
3951 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3952 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3953 {
3954 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3955 return VOS_STATUS_E_FAILURE;
3956 }
3957
3958 /* do not allow to change setting when tx pktgen is enabled */
3959 if (ftm_status.frameGenEnabled)
3960 {
3961 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3962 return VOS_STATUS_E_FAILURE;
3963 }
3964
3965 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3966 {
3967 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3968 break;
3969 }
3970 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3971 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003972 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003973 return VOS_STATUS_E_FAILURE;
3974 }
3975
3976 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3977 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3978
3979 return VOS_STATUS_SUCCESS;
3980}
3981
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303982
3983
3984static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3985 ePowerTempIndexSource pwr_source)
3986{
3987 uPttMsgs *pMsgBody;
3988 VOS_STATUS status;
3989 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3990
3991 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3992 {
3993 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3994 "%s:Ftm has not started. Please start the ftm. ", __func__);
3995 return VOS_STATUS_E_FAILURE;
3996 }
3997
3998 if (pwr_source > 3)
3999 {
4000 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
jge24d9bd42016-05-11 14:53:57 +08004001 "%s:invalid power index source. valid mode is 0, 1, 2, 3. ",
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304002 __func__);
4003 return VOS_STATUS_E_FAILURE;
4004 }
4005
4006 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
4007
4008 init_completion(&pHddCtx->ftm.ftm_comp_var);
4009 pMsgBody = &pMsgBuf->msgBody;
4010 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
4011 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
4012
4013 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
4014 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4015
4016 if (status != VOS_STATUS_SUCCESS)
4017 {
4018 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4019 "%s:wlan_ftm_postmsg failed", __func__);
4020 status = VOS_STATUS_E_FAILURE;
4021 goto done;
4022 }
4023 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4024 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4025
4026 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4027 {
4028 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4029 "%s:Ptt response status failed", __func__);
4030 status = VOS_STATUS_E_FAILURE;
4031 goto done;
4032 }
4033
jge24d9bd42016-05-11 14:53:57 +08004034 ftm_status.powerIndex = pwr_source;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304035done:
4036
4037 return status;
4038}
4039
4040
Jeff Johnson295189b2012-06-20 16:38:30 -07004041/**---------------------------------------------------------------------------
4042
4043 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
4044
4045 This function is used for start/stop the tx packet generation.
4046
4047 \param - pAdapter - Pointer HDD Context.
4048 - startStop - Value( 1/0) start/stop the tx packet generation.
4049
4050 \return - 0 for success, non zero for failure
4051
4052 --------------------------------------------------------------------------*/
4053
4054static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
4055{
Jeff Johnson295189b2012-06-20 16:38:30 -07004056 uPttMsgs *pMsgBody;
4057 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304058 long ret;
4059
Jeff Johnson295189b2012-06-20 16:38:30 -07004060 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4061
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304062 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004063 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304064 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4065 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004066 return VOS_STATUS_E_FAILURE;
4067 }
4068
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304069 if (NULL == pMsgBuf)
4070 {
4071 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4072 "%s:pMsgBuf is NULL", __func__);
4073 return VOS_STATUS_E_NOMEM;
4074 }
4075
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304076 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07004077 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304078 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4079 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004080 return VOS_STATUS_E_FAILURE;
4081 }
4082
4083 if ((ftm_status.frameGenEnabled && startStop == 1) ||
4084 (!ftm_status.frameGenEnabled && startStop == 0))
4085 {
4086 return VOS_STATUS_SUCCESS ;
4087 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304088 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004089
Jeff Johnson295189b2012-06-20 16:38:30 -07004090 if (startStop == 1)
4091 {
4092 init_completion(&pHddCtx->ftm.ftm_comp_var);
4093 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4094 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4095 pMsgBody = &pMsgBuf->msgBody;
4096 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4097
4098 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304099 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004100 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304101 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4102 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004103 status = VOS_STATUS_E_FAILURE;
4104 goto done;
4105 }
4106
c_hpothuffdb5272013-10-02 16:42:35 +05304107 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304108 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304109 if (0 >= ret )
4110 {
4111 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4112 FL("wait on ftm_comp_var failed %ld"), ret);
4113 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304114 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004115 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304116 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4117 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004118 status = VOS_STATUS_E_FAILURE;
4119 goto done;
4120 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304121
4122 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4123 {
jge24d9bd42016-05-11 14:53:57 +08004124 status = wlan_ftm_priv_set_power_index(pAdapter,
4125 ftm_status.powerIndex);
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304126 if(status != VOS_STATUS_SUCCESS)
4127 {
4128 goto done;
4129 }
4130 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004131 }
4132
4133 init_completion(&pHddCtx->ftm.ftm_comp_var);
4134 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4135 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4136 pMsgBody = &pMsgBuf->msgBody;
4137 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4138
4139 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4140 if(status != VOS_STATUS_SUCCESS)
4141 {
4142 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4143 status = VOS_STATUS_E_FAILURE;
4144 goto done;
4145 }
4146
c_hpothuffdb5272013-10-02 16:42:35 +05304147 ret = wait_for_completion_interruptible_timeout(
4148 &pHddCtx->ftm.ftm_comp_var,
4149 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4150 if (0 >= ret )
4151 {
4152 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4153 FL("wait on ftm_comp_var failed %ld"), ret);
4154 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004155 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4156 {
4157 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4158 status = VOS_STATUS_E_FAILURE;
4159 goto done;
4160 }
4161
4162done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004163
4164 if (status == VOS_STATUS_SUCCESS)
4165 {
4166 if (startStop == 1)
4167 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304168 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004169 }
4170 else
4171 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304172 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004173 }
4174 }
4175
4176 return status;
4177}
4178
4179
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304180
4181static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4182{
4183
4184 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4185 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4186 {
4187 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4188 "%s:Ftm has not started. Please start the ftm. ", __func__);
4189 return VOS_STATUS_E_FAILURE;
4190 }
4191
4192 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4193 {
4194 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4195 "%s:cb mode value is invalid ", __func__);
4196 return VOS_STATUS_E_FAILURE;
4197 }
4198
4199 ftm_status.cbmode = cbmode;
4200
4201 return VOS_STATUS_SUCCESS;
4202
4203}
4204
Jeff Johnson295189b2012-06-20 16:38:30 -07004205/**---------------------------------------------------------------------------
4206
4207 \brief wlan_ftm_rx_mode() -
4208
4209 This function is used for start/stop the rx packet generation.
4210
4211 \param - pAdapter - Pointer HDD Context.
4212 - rxmode - 0-disable RX.
4213 - 1-rx ALL frames
4214 - 2-rx 11 g/n frames
4215 - 3-rx 11b frames
4216
4217 \return - 0 for success, non zero for failure
4218
4219 --------------------------------------------------------------------------*/
4220
4221static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4222{
Jeff Johnson295189b2012-06-20 16:38:30 -07004223 uPttMsgs *pMsgBody;
4224 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304225 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004226
4227 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304228 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004229 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304230 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4231 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004232 return VOS_STATUS_E_FAILURE;
4233 }
4234
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304235 if (NULL == pMsgBuf)
4236 {
4237 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4238 "%s:pMsgBuf is NULL", __func__);
4239 return VOS_STATUS_E_NOMEM;
4240 }
4241
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304242 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004243 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304244 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4245 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004246 return VOS_STATUS_E_FAILURE;
4247 }
4248
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304249 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004250 init_completion(&pHddCtx->ftm.ftm_comp_var);
4251
4252 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4253 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4254
4255 pMsgBody = &pMsgBuf->msgBody;
4256
4257 switch(rxmode)
4258 {
4259 case RXMODE_DISABLE_ALL:
4260 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4261 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4262 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4263 break;
4264
4265 case RXMODE_ENABLE_ALL:
4266 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4267 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4268 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4269 break;
4270
4271 case RXMODE_ENABLE_11GN:
4272 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4273 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4274 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4275 break;
4276
4277 case RXMODE_ENABLE_11B:
4278 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4279 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4280 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4281 break;
4282
4283 }
4284
4285 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4286
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304287 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004288 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304289 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4290 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004291 status = VOS_STATUS_E_FAILURE;
4292 goto done;
4293 }
c_hpothuffdb5272013-10-02 16:42:35 +05304294 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304295 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304296 if (0 >= ret )
4297 {
4298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4299 FL(" wait on ftm_comp_var failed %ld"), ret);
4300 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004301
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304302 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004303 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304304 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4305 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004306 status = VOS_STATUS_E_FAILURE;
4307 goto done;
4308 }
4309 ftm_status.rxmode = rxmode ;
4310done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004311
4312 return status;
4313}
4314
4315/**---------------------------------------------------------------------------
4316
4317 \brief wlan_ftm_priv_rx_pkt_clear() -
4318
4319 This function sets the rx pkt count to zero.
4320
4321 \param - pAdapter - Pointer HDD Context.
4322 - rx_pkt_clear - rx_pkt_clear value.
4323
4324 \return - 0 for success, non zero for failure
4325
4326 --------------------------------------------------------------------------*/
4327
4328static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4329{
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304331 long ret;
4332
Jeff Johnson295189b2012-06-20 16:38:30 -07004333 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4334
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304335 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004336 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304337 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4338 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004339 return VOS_STATUS_E_FAILURE;
4340 }
4341
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304342 if (NULL == pMsgBuf)
4343 {
4344 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4345 "%s:pMsgBuf is NULL", __func__);
4346 return VOS_STATUS_E_NOMEM;
4347 }
4348
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304349 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004350 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304351 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4352 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004353 return VOS_STATUS_E_FAILURE;
4354 }
4355
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304356 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004357 init_completion(&pHddCtx->ftm.ftm_comp_var);
4358 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304359 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004360
Jeff Johnson295189b2012-06-20 16:38:30 -07004361 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4362
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304363 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004364 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304365 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4366 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004367 status = VOS_STATUS_E_FAILURE;
4368 goto done;
4369 }
c_hpothuffdb5272013-10-02 16:42:35 +05304370 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304371 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304372 if (0 >= ret )
4373 {
4374 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4375 FL("wait on ftm_comp_var failed %ld"), ret);
4376 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004377
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304378 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004379 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304380 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4381 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004382 status = VOS_STATUS_E_FAILURE;
4383 goto done;
4384 }
4385done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004386
4387 return status;
4388}
4389
4390/**---------------------------------------------------------------------------
4391
4392 \brief wlan_ftm_priv_get_channel() -
4393
4394 This function gets the channel number from the halphy ptt module and
4395 returns the channel number to the application.
4396
4397 \param - pAdapter - Pointer HDD Context.
4398 - pChannel - Poniter to get the Channel number.
4399
4400 \return - 0 for success, non zero for failure
4401
4402 --------------------------------------------------------------------------*/
4403
4404static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4405{
Jeff Johnson295189b2012-06-20 16:38:30 -07004406 uPttMsgs *pMsgBody;
4407 VOS_STATUS status;
4408 v_U16_t freq;
c_hpothuffdb5272013-10-02 16:42:35 +05304409 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004410
4411 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304412 v_PVOID_t devHandle = pHddCtx->parent_dev;
4413 struct device *wcnss_device = (struct device *)devHandle;
4414 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304415 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004416 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304417 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4418 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 return VOS_STATUS_E_FAILURE;
4420 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304421
4422 if (NULL == pMsgBuf)
4423 {
4424 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4425 "%s:pMsgBuf is NULL", __func__);
4426 return VOS_STATUS_E_NOMEM;
4427 }
4428
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304429 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 init_completion(&pHddCtx->ftm.ftm_comp_var);
4431 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4432 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4433
4434 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304435 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4436 if (NULL == wcnss_memory)
4437 {
4438 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4439 "%s: wcnss_memory is NULL", __func__);
4440 return VOS_STATUS_E_NOMEM;
4441 }
4442 else
4443 {
4444 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4445 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4446 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004447 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4448
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304449 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004450 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304451 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4452 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004453 status = VOS_STATUS_E_FAILURE;
4454 goto done;
4455
4456 }
c_hpothuffdb5272013-10-02 16:42:35 +05304457 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304458 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304459 if (0 >= ret )
4460 {
4461 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4462 FL("wait on ftm_comp_var failed %ld"), ret);
4463 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004464
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304465 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004466 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304467 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4468 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004469 status = VOS_STATUS_E_FAILURE;
4470 goto done;
4471 }
4472
4473 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4474
Hanumantha Reddy Pothulae950ada2015-10-13 19:39:35 +05304475 *pChannel = vos_freq_to_chan(freq);
4476 (*pChannel) ? (status = VOS_STATUS_SUCCESS) : (status = VOS_STATUS_E_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004477
Arif Hussain6d2a3322013-11-17 19:50:10 -08004478 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004479 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004480
4481 return status;
4482}
4483
4484/**---------------------------------------------------------------------------
4485
4486 \brief wlan_ftm_priv_get_txpower() -
4487
4488 This function gets the TX power from the halphy ptt module and
4489 returns the TX power to the application.
4490
4491 \param - pAdapter - Pointer HDD Context.
4492 - pTxPwr - Poniter to get the Tx power.
4493
4494 \return - 0 for success, non zero for failure
4495
4496 --------------------------------------------------------------------------*/
4497
4498static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4499{
Jeff Johnson295189b2012-06-20 16:38:30 -07004500 uPttMsgs *pMsgBody;
4501 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304502 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004503 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4504
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304505 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004506 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304507 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4508 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004509 return VOS_STATUS_E_FAILURE;
4510 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304511
4512 if (NULL == pMsgBuf)
4513 {
4514 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4515 "%s:pMsgBuf is NULL", __func__);
4516 return VOS_STATUS_E_NOMEM;
4517 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304518 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 init_completion(&pHddCtx->ftm.ftm_comp_var);
4520 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4521 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4522
4523 pMsgBody = &pMsgBuf->msgBody;
4524
4525 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4526
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304527 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004528 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304529 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4530 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004531 status = VOS_STATUS_E_FAILURE;
4532 goto done;
4533 }
c_hpothuffdb5272013-10-02 16:42:35 +05304534 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304535 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304536 if (0 >= ret )
4537 {
4538 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4539 FL("wait on ftm_comp_var failed %ld"), ret);
4540 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004541
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304542 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004543 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304544 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4545 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004546 status = VOS_STATUS_E_FAILURE;
4547 goto done;
4548 }
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304549 *pTxPwr = pMsgBody->GetTxPowerReport.pwrTemplateIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004550
4551 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004552
4553 return status;
4554}
4555
4556/**---------------------------------------------------------------------------
4557
Jeff Johnson295189b2012-06-20 16:38:30 -07004558 \brief wlan_ftm_priv_get_txrate() -
4559
4560 This function gets the TX rate from the halphy ptt module and
4561 returns the TX rate to the application.
4562
4563 \param - pAdapter - Pointer HDD Context.
4564 - pTxRate - Poniter to get the Tx rate.
4565
4566 \return - 0 for success, non zero for failure
4567
4568 --------------------------------------------------------------------------*/
4569
4570static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4571{
Hanumantha Reddy Pothula203a3942015-11-27 11:41:42 +05304572 VOS_STATUS status = VOS_STATUS_SUCCESS;
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304573 v_U16_t ii;
Jeff Johnson295189b2012-06-20 16:38:30 -07004574 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4575
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304576 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004577 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304578 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4579 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004580 return VOS_STATUS_E_FAILURE;
4581 }
4582
Jeff Johnson295189b2012-06-20 16:38:30 -07004583 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304584 if(rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
Jeff Johnson295189b2012-06-20 16:38:30 -07004585 break;
4586 }
4587 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4588 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004589 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004590 status = VOS_STATUS_E_FAILURE;
4591 goto done;
4592 }
4593 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
Jeff Johnson295189b2012-06-20 16:38:30 -07004594
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304595done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004596 return status;
4597
4598}
4599
4600/**---------------------------------------------------------------------------
4601
4602 \brief wlan_ftm_priv_get_rx_pkt_count() -
4603
4604 This function gets the rx pkt count from the halphy ptt module and
4605 returns the rx pkt count to the application.
4606
4607 \param - pAdapter - Pointer HDD Context.
4608 - pRxPktCnt - Poniter to get the rx pkt count.
4609
4610 \return - 0 for success, non zero for failure
4611
4612 --------------------------------------------------------------------------*/
4613
4614static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4615{
Jeff Johnson295189b2012-06-20 16:38:30 -07004616 uPttMsgs *pMsgBody;
4617 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304618 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004619 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4620
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304621 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004622 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304623 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4624 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004625 return VOS_STATUS_E_FAILURE;
4626 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304627
4628 if (NULL == pMsgBuf)
4629 {
4630 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4631 "%s:pMsgBuf is NULL", __func__);
4632 return VOS_STATUS_E_NOMEM;
4633 }
4634
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304635 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004636 init_completion(&pHddCtx->ftm.ftm_comp_var);
4637 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4638 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4639
4640 pMsgBody = &pMsgBuf->msgBody;
4641
4642 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4643
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304644 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004645 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304646 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4647 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004648 status = VOS_STATUS_E_FAILURE;
4649 goto done;
4650 }
c_hpothuffdb5272013-10-02 16:42:35 +05304651 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304652 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304653 if (0 >= ret )
4654 {
4655 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4656 FL("wait on ftm_comp_var failed %ld"), ret);
4657 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004658
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304659 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004660 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4662 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004663 status = VOS_STATUS_E_FAILURE;
4664 goto done;
4665 }
4666 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4667done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004668
4669 return status;
4670}
4671
4672/**---------------------------------------------------------------------------
4673
4674 \brief wlan_ftm_priv_get_rx_rssi() -
4675
4676 This function gets the rx rssi from the halphy ptt module and
4677 returns the rx rssi to the application.
4678
4679 \param - pAdapter - Pointer HDD Context.
4680 - buf - Poniter to get rssi of Rx chains
4681
4682 \return - 0 for success, non zero for failure
4683
4684 --------------------------------------------------------------------------*/
4685
4686static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4687{
Jeff Johnson295189b2012-06-20 16:38:30 -07004688 uPttMsgs *pMsgBody;
4689 VOS_STATUS status;
4690 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304691 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004692
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304693 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004694 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304695 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4696 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004697 return VOS_STATUS_E_FAILURE;
4698 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304699
4700 if (NULL == pMsgBuf)
4701 {
4702 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4703 "%s:pMsgBuf is NULL", __func__);
4704 return VOS_STATUS_E_NOMEM;
4705 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304706 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004707 init_completion(&pHddCtx->ftm.ftm_comp_var);
4708 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4709 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4710
4711 pMsgBody = &pMsgBuf->msgBody;
4712
4713 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4714
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304715 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004716 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304717 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4718 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004719 status = VOS_STATUS_E_FAILURE;
4720 goto done;
4721 }
c_hpothuffdb5272013-10-02 16:42:35 +05304722 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304723 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304724 if (0 >= ret )
4725 {
4726 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4727 FL("wait on ftm_comp_var failed %ld"), ret);
4728 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004729
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304730 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004731 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304732 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4733 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004734 status = VOS_STATUS_E_FAILURE;
4735 goto done;
4736 }
4737
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004738 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4739 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004740 pMsgBody->GetRxRssi.rssi.rx[1]);
4741
4742 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4743 {
4744 status = VOS_STATUS_E_FAILURE;
4745 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004746
Jeff Johnson295189b2012-06-20 16:38:30 -07004747done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004748
4749 return status;
4750}
4751
4752/**---------------------------------------------------------------------------
4753
4754 \brief wlan_ftm_priv_get_mac_address() -
4755
4756 This function gets the mac address from the halphy ptt module and
4757 returns the mac address to the application.
4758
4759 \param - pAdapter - Pointer HDD Context.
4760 - buf - Poniter to get the mac address.
4761
4762 \return - 0 for success, non zero for failure
4763
4764 --------------------------------------------------------------------------*/
4765
4766static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4767{
4768 v_BOOL_t itemIsValid = VOS_FALSE;
4769 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4770 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004771
Jeff Johnson295189b2012-06-20 16:38:30 -07004772 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4773
4774 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4775 {
4776 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4777 return VOS_STATUS_E_FAILURE;
4778 }
4779 /*Check the NV FIELD is valid or not*/
4780 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4781 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004782 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004783 {
4784 vos_nv_readMacAddress(macAddr);
4785
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004786 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4787 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004788 MAC_ADDR_ARRAY(macAddr));
4789 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4790 {
4791 return VOS_STATUS_E_FAILURE;
4792 }
4793 }
4794 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004795 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004796 {
4797 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004798 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4799 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004800 MAC_ADDR_ARRAY(macAddr));
4801
4802 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4803 {
4804 return VOS_STATUS_E_FAILURE;
4805 }
4806 }
4807 return VOS_STATUS_SUCCESS;
4808}
4809
4810/**---------------------------------------------------------------------------
4811
4812 \brief wlan_ftm_priv_set_mac_address() -
4813
4814 This function sets the mac address to the halphy ptt module and
4815 sends the netlink message to the ptt socket application which writes
4816 the macaddress to the qcom_wlan_nv.bin file
4817
4818 \param - pAdapter - Pointer HDD Context.
4819 - buf - Poniter to the macaddress.
4820
4821 \return - 0 for success, non zero for failure
4822
4823 --------------------------------------------------------------------------*/
4824
4825static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4826{
Jeff Johnson295189b2012-06-20 16:38:30 -07004827 uPttMsgs *pMsgBody;
4828 VOS_STATUS status;
4829 int macAddr[VOS_MAC_ADDRESS_LEN];
4830 v_U8_t *pMacAddress;
4831 v_U8_t ii;
4832 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304833 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004834
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304835 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004836 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304837 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4838 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004839 return VOS_STATUS_E_FAILURE;
4840 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304841 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004842 init_completion(&pHddCtx->ftm.ftm_comp_var);
4843 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4844 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4845
4846 pMsgBody = &pMsgBuf->msgBody;
4847 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4848
4849 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004850 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]))
4851 {
4852 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4853 "Invalid MacAddress Input %s", buf);
4854 return VOS_STATUS_E_FAILURE;
4855 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004856
Arif Hussain24bafea2013-11-15 15:10:03 -08004857 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4858 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004859
4860
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004861 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004862
4863 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4864 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4865
4866
Arif Hussain24bafea2013-11-15 15:10:03 -08004867 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4868 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004869 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4870
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304871 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004872 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304873 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4874 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004875 status = VOS_STATUS_E_FAILURE;
4876 goto done;
4877 }
c_hpothuffdb5272013-10-02 16:42:35 +05304878 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304879 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304880 if (0 >= ret )
4881 {
4882 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4883 FL("wait on ftm_comp_var failed %ld"), ret);
4884 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004885
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304886 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004887 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304888 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4889 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004890 status = VOS_STATUS_E_FAILURE;
4891 goto done;
4892 }
4893
Arif Hussain6d2a3322013-11-17 19:50:10 -08004894 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004895
4896 init_completion(&pHddCtx->ftm.ftm_comp_var);
4897 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4898
4899 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4900 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4901
4902 pMsgBody = &pMsgBuf->msgBody;
4903
4904 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4905
4906 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4907
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304908 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004909 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304910 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4911 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004912 status = VOS_STATUS_E_FAILURE;
4913 goto done;
4914 }
4915
c_hpothuffdb5272013-10-02 16:42:35 +05304916 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304917 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304918 if (0 >= ret )
4919 {
4920 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4921 FL("wait on ftm_comp_var failed %ld"), ret);
4922 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004923done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004924
4925 return VOS_STATUS_SUCCESS;
4926}
4927
4928/* set param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304929static int __iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004930 union iwreq_data *wrqu, char *extra)
4931{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004932 int ret,sub_cmd;
4933 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304934 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004935 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004936 hdd_adapter_t *pAdapter;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304937 hdd_context_t *pHddCtx;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304938 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07004939
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304940 ENTER();
4941
Hanumantha Reddy Pothulac4928592015-10-27 16:49:59 +05304942 if (!capable(CAP_NET_ADMIN))
4943 {
4944 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4945 FL("permission check failed"));
4946 return -EPERM;
4947 }
4948
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004949 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304950 /* helper function to get iwreq_data with compat handling. */
4951 if (hdd_priv_get_data(&s_priv_data, wrqu))
4952 {
4953 return -EINVAL;
4954 }
4955
4956 /* make sure all params are correctly passed to function */
4957 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
4958 {
4959 return -EINVAL;
4960 }
4961
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304962 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4963 if (NULL == pAdapter)
4964 {
4965 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4966 "%s: Adapter is NULL",__func__);
4967 return -EINVAL;
4968 }
4969 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4970 ret = wlan_hdd_validate_context(pHddCtx);
4971 if (0 != ret)
4972 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304973 return ret;
4974 }
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304975 sub_cmd = s_priv_data.flags;
4976 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004977
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004978 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4979 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4980 * odd number which assigns set_args to zero.we assisgn memory using
4981 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004982 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004983 param = kzalloc(length + 1, GFP_KERNEL);
4984 if (!param)
4985 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004986
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304987 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004988 {
4989 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4990 "%s:Failed to get user data %s", __func__, param);
4991
4992 ret = -EINVAL;
4993 goto OUT;
4994 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004995
4996 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304997 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004998
4999 switch(sub_cmd)
5000 {
5001 case WE_SET_MAC_ADDRESS:
5002 {
5003
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005004 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005005 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005006
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005007 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005008
5009 if(status != VOS_STATUS_SUCCESS)
5010 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005011 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005012 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005013
Jeff Johnson295189b2012-06-20 16:38:30 -07005014 ret = -EINVAL;
5015 }
5016
Wilson Yang7c471652013-12-20 16:36:44 -08005017 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005018 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005019 case WE_SET_TX_RATE:
5020 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005021 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005022
5023 if(status != VOS_STATUS_SUCCESS)
5024 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005025 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005026 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005027
5028 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005029 }
5030
5031 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005032 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005033 default:
5034 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005035 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005036 ret = -EINVAL;
5037 break;
5038 }
5039 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005040
5041OUT:
5042 kfree(param);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305043 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005044 return ret;
5045}
5046
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305047static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
5048 union iwreq_data *wrqu, char *extra)
5049{
5050 int ret;
5051
5052 vos_ssr_protect(__func__);
5053 ret = __iw_ftm_setchar_getnone(dev, info, wrqu, extra);
5054 vos_ssr_unprotect(__func__);
5055
5056 return ret;
5057}
5058
5059static int __iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005060 union iwreq_data *wrqu, char *extra)
5061{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305062 hdd_adapter_t *pAdapter;
5063 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005064 int *value = (int *)extra;
5065 int sub_cmd = value[0];
5066 int set_value = value[1];
5067 int ret = 0; /* success */
5068 VOS_STATUS status;
5069
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305070 ENTER();
5071
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305072 pAdapter = (netdev_priv(dev));
5073 if (NULL == pAdapter)
5074 {
5075 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5076 return -EINVAL;
5077 }
5078 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5079 ret = wlan_hdd_validate_context(pHddCtx);
5080 if (0 != ret)
5081 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305082 return ret;
5083 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005084 switch(sub_cmd)
5085 {
5086 case WE_FTM_ON_OFF:
5087 {
5088 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5089
5090 if(status != VOS_STATUS_SUCCESS)
5091 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005092 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005093 ret = -EINVAL;
5094 }
5095
5096 break;
5097 }
5098
5099 case WE_TX_PKT_GEN:
5100 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5101
5102 if(status != VOS_STATUS_SUCCESS)
5103 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005104 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005105 ret = -EINVAL;
5106 }
5107 break;
5108
5109 case WE_SET_TX_IFS:
5110 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5111
5112 if(status != VOS_STATUS_SUCCESS)
5113 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005114 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005115 ret = -EINVAL;
5116 }
5117 break;
5118
5119 case WE_SET_TX_PKT_CNT:
5120 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5121
5122 if(status != VOS_STATUS_SUCCESS)
5123 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005124 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005125 ret = -EINVAL;
5126 }
5127 break;
5128
5129 case WE_SET_TX_PKT_LEN:
5130 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5131
5132 if(status != VOS_STATUS_SUCCESS)
5133 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005134 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005135 ret = -EINVAL;
5136 }
5137 break;
5138
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305139 case WE_TX_CW_RF_GEN:
5140 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5141
5142 if(status != VOS_STATUS_SUCCESS)
5143 {
5144 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5145 ret = -EINVAL;
5146 }
5147 break;
5148
Jeff Johnson295189b2012-06-20 16:38:30 -07005149 case WE_SET_CHANNEL:
5150 {
5151 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5152
5153 if(status != VOS_STATUS_SUCCESS)
5154 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005155 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005156 ret = -EINVAL;
5157 }
5158 break;
5159 }
5160 case WE_SET_TX_POWER:
5161 {
5162 status = wlan_ftm_priv_set_txpower(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_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005167 ret = -EINVAL;
5168 }
5169 break;
5170 }
5171 case WE_CLEAR_RX_PKT_CNT:
5172 {
5173 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5174
5175 if(status != VOS_STATUS_SUCCESS)
5176 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005177 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005178 ret = -EINVAL;
5179 }
5180 break;
5181 }
5182 case WE_RX:
5183 {
5184 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5185
5186 if(status != VOS_STATUS_SUCCESS)
5187 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005188 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005189 ret = -EINVAL;
5190 }
5191 break;
5192 }
5193 case WE_ENABLE_CHAIN:
5194 {
5195 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5196
5197 if(status != VOS_STATUS_SUCCESS)
5198 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005199 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005200 ret = -EINVAL;
5201 }
5202 break;
5203 }
5204
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305205 case WE_SET_PWR_CNTL_MODE:
5206 {
5207 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5208 if (status != VOS_STATUS_SUCCESS)
5209 {
5210 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5211 status);
5212 ret = -EINVAL;
5213 }
5214 break;
5215 }
5216
5217 case WE_ENABLE_DPD:
5218 {
5219 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5220 if (status != VOS_STATUS_SUCCESS)
5221 {
5222 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5223 ret = -EINVAL;
5224 }
5225 break;
5226 }
5227
5228 case WE_SET_CB:
5229 {
5230 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5231 if (status != VOS_STATUS_SUCCESS)
5232 {
5233 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5234 ret = -EINVAL;
5235 }
5236 break;
5237 }
5238
jge24d9bd42016-05-11 14:53:57 +08005239 case WE_SET_POWER_INDEX:
5240 {
5241 status = wlan_ftm_priv_set_power_index(pAdapter, set_value);
5242 if (status != VOS_STATUS_SUCCESS)
5243 {
5244 hddLog(VOS_TRACE_LEVEL_ERROR, "set power index failed = %d",
5245 status);
5246 ret = -EINVAL;
5247 }
5248 break;
5249 }
5250
Jeff Johnson295189b2012-06-20 16:38:30 -07005251 default:
5252 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005253 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005254 sub_cmd, set_value);
5255 break;
5256 }
5257 }
5258
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305259 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005260 return ret;
5261}
5262
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305263static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5264 union iwreq_data *wrqu, char *extra)
5265{
5266 int ret;
5267
5268 vos_ssr_protect(__func__);
5269 ret = __iw_ftm_setint_getnone(dev, info, wrqu, extra);
5270 vos_ssr_unprotect(__func__);
5271
5272 return ret;
5273}
Jeff Johnson295189b2012-06-20 16:38:30 -07005274/* get param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305275static int __iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005276 union iwreq_data *wrqu, char *extra)
5277{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305278 hdd_adapter_t *pAdapter;
5279 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005280 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005281 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005282 VOS_STATUS status;
5283
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305284 ENTER();
5285
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305286 pAdapter = (netdev_priv(dev));
5287 if (NULL == pAdapter)
5288 {
5289 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5290 return -EINVAL;
5291 }
5292 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5293 ret = wlan_hdd_validate_context(pHddCtx);
5294 if (0 != ret)
5295 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305296 return ret;
5297 }
5298
Jeff Johnson295189b2012-06-20 16:38:30 -07005299 switch (value[0])
5300 {
5301 case WE_GET_CHANNEL:
5302 {
5303 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5304
5305 if(status != VOS_STATUS_SUCCESS)
5306 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005307 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005308 ret = -EINVAL;
5309 }
5310 break;
5311 }
5312 case WE_GET_TX_POWER:
5313 {
5314 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5315
5316 if(status != VOS_STATUS_SUCCESS)
5317 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005318 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005319 ret = -EINVAL;
5320 }
5321 break;
5322 }
5323 case WE_GET_RX_PKT_CNT:
5324 {
5325 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5326
5327 if(status != VOS_STATUS_SUCCESS)
5328 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005329 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005330 ret = -EINVAL;
5331 }
5332 break;
5333 }
5334 default:
5335 {
5336 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5337 break;
5338 }
5339 }
5340
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305341 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005342 return ret;
5343}
5344
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305345static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5346 union iwreq_data *wrqu, char *extra)
5347{
5348 int ret;
5349
5350 vos_ssr_protect(__func__);
5351 ret = __iw_ftm_setnone_getint(dev, info, wrqu, extra);
5352 vos_ssr_unprotect(__func__);
5353
5354 return ret;
5355}
5356
5357static int __iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005358 union iwreq_data *wrqu, char *extra)
5359{
5360 int sub_cmd = wrqu->data.flags;
5361 VOS_STATUS status;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305362 hdd_adapter_t *pAdapter;
5363 hdd_context_t *pHddCtx;
5364 int ret = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005365
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305366 ENTER();
5367
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305368 pAdapter = (netdev_priv(dev));
5369 if (NULL == pAdapter)
5370 {
5371 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5372 return -EINVAL;
5373 }
5374 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5375 ret = wlan_hdd_validate_context(pHddCtx);
5376 if (0 != ret)
5377 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305378 return ret;
5379 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005380 switch(sub_cmd)
5381 {
5382 case WE_GET_MAC_ADDRESS:
5383 {
5384 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5385
5386 if(status != VOS_STATUS_SUCCESS)
5387 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005388 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005389 return -EINVAL;
5390 }
5391 wrqu->data.length = strlen(extra)+1;
5392 break;
5393 }
5394 case WE_GET_TX_RATE:
5395 {
5396 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5397
5398 if(status != VOS_STATUS_SUCCESS)
5399 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005400 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005401 return -EINVAL;
5402 }
5403
5404 wrqu->data.length = strlen(extra)+1;
5405 break;
5406 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005407 case WE_GET_FTM_STATUS:
5408 {
5409 status = wlan_ftm_priv_get_status(pAdapter, extra);
5410
5411 if(status != VOS_STATUS_SUCCESS)
5412 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005413 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005414 return -EINVAL;
5415 }
5416
5417 wrqu->data.length = strlen(extra)+1;
5418 break;
5419 }
5420 case WE_GET_RX_RSSI:
5421 {
5422 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5423
5424 if(status != VOS_STATUS_SUCCESS)
5425 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005426 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005427 return -EINVAL;
5428 }
5429
5430 wrqu->data.length = strlen(extra)+1;
5431 break;
5432 }
5433 default:
5434 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005435 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005436 break;
5437 }
5438 }
5439
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305440 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005441 return 0;
5442}
Jeff Johnson295189b2012-06-20 16:38:30 -07005443
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305444static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5445 union iwreq_data *wrqu, char *extra)
5446{
5447 int ret;
5448
5449 vos_ssr_protect(__func__);
5450 ret = __iw_ftm_get_char_setnone(dev, info, wrqu, extra);
5451 vos_ssr_unprotect(__func__);
5452
5453
5454 return ret;
5455}
5456
Jeff Johnson295189b2012-06-20 16:38:30 -07005457VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5458{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005459#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005460 tAniHdr *wmsg = NULL;
5461 v_U8_t *pBuf;
5462 hdd_context_t *pHddCtx = NULL;
5463 v_CONTEXT_t pVosContext= NULL;
5464
5465 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5466 if(pBuf == NULL)
5467 {
5468 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5469 return VOS_STATUS_E_NOMEM;
5470 }
5471 wmsg = (tAniHdr*)pBuf;
5472 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5473 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5474 wmsg->length = FTM_SWAP16(wmsg->length);
5475 pBuf += sizeof(tAniHdr);
5476
5477 /*Get the global context */
5478 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5479
5480 /*Get the Hdd Context */
5481 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5482 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5483
5484 /* EfS command Code */
5485 *(v_U32_t*)pBuf = 0x000000EF;
5486
5487 pBuf += sizeof(v_U32_t);
5488
5489 memcpy(pBuf, pData,data_len);
5490
5491 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305492 if( ptt_sock_send_msg_to_app(wmsg, 0,
5493 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005494
Arif Hussain6d2a3322013-11-17 19:50:10 -08005495 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 -07005496 vos_mem_free((v_VOID_t*)wmsg);
5497 return VOS_STATUS_E_FAILURE;
5498 }
5499 }
5500 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305501 if( ptt_sock_send_msg_to_app(wmsg, 0,
5502 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005503
Arif Hussain6d2a3322013-11-17 19:50:10 -08005504 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 -07005505 vos_mem_free((v_VOID_t*)wmsg);
5506 return VOS_STATUS_E_FAILURE;
5507 }
5508 }
5509
5510 vos_mem_free((v_VOID_t*)wmsg);
5511#endif //FTM and ANDROID
5512
5513 return VOS_STATUS_SUCCESS;
5514}
5515
Jeff Johnson295189b2012-06-20 16:38:30 -07005516/* action sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305517static int __iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005518 union iwreq_data *wrqu, char *extra)
5519{
5520 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005521 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005522
5523 switch (sub_cmd)
5524 {
5525 case WE_SET_NV_DEFAULTS:
5526 {
5527 v_U8_t *pu8buf,*pTempBuf;
5528 v_U16_t size;
5529 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005530 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005531 pu8buf = vos_mem_malloc(size);
5532 if(pu8buf == NULL)
5533 {
5534 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5535 return VOS_STATUS_E_NOMEM;
5536 }
5537 memset(pu8buf,0,size);
5538 pTempBuf = pu8buf;
5539 pTempBuf += sizeof(v_U32_t);
5540 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5541
5542 wlan_write_to_efs(pu8buf,size);
5543 vos_mem_free(pu8buf);
5544 }
5545
5546 default:
5547 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005548 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005549 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5550 break;
5551 }
5552 }
5553
5554 return ret;
5555}
5556
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305557static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5558 union iwreq_data *wrqu, char *extra)
5559{
5560 int ret;
5561
5562 vos_ssr_protect(__func__);
5563 ret = __iw_ftm_setnone_getnone(dev, info, wrqu, extra);
5564 vos_ssr_unprotect(__func__);
5565
5566 return ret;
5567}
5568
5569static int __iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305570 union iwreq_data *wrqu, char *extra)
5571{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305572 hdd_adapter_t *pAdapter;
5573 hdd_context_t *pHddCtx;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305574 int sub_cmd = wrqu->data.flags;
5575 int *value = (int*)wrqu->data.pointer;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305576 int ret = 0;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305577 VOS_STATUS status;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305578
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305579 ENTER();
5580
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305581 if(wrqu->data.length < 2)
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305582 {
Sushant Kaushik87787972015-09-11 16:05:00 +05305583 hddLog(LOGE, "Invalid number of Arguments %d ", wrqu->data.length);
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305584 return -EINVAL;
5585 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305586
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305587 pAdapter = (netdev_priv(dev));
5588 if (NULL == pAdapter)
5589 {
5590 hddLog(VOS_TRACE_LEVEL_ERROR,
5591 "%s: Adapter is NULL",__func__);
5592 return -EINVAL;
5593 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305594
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305595 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5596 ret = wlan_hdd_validate_context(pHddCtx);
5597 if (0 != ret)
5598 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305599 return ret;
5600 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305601
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305602 switch (sub_cmd)
5603 {
5604 case WE_SET_TX_WF_GAIN:
5605 {
5606 v_S15_t dGain = 0;
5607 v_U16_t rfGain = 0;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305608
5609 dGain = *(v_S15_t*) value++;
5610 rfGain = *(v_U16_t*) value;
5611 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5612
5613 if(status != VOS_STATUS_SUCCESS)
5614 {
5615 hddLog(VOS_TRACE_LEVEL_FATAL,
5616 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5617 return -EINVAL;
5618 }
5619 }
5620 break;
5621
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305622 case WE_SET_DUMP:
5623 if (*value == 1)
5624 {
5625 status = wlan_ftm_priv_set_dump(pAdapter, value);
5626 if(status != VOS_STATUS_SUCCESS)
5627 {
5628 hddLog(LOGE, "wlan_ftm_priv_set_dump Failed =%d\n",
5629 status);
5630 ret = -EINVAL;
5631 }
5632 }else
5633 {
5634 hddLog(LOGE, "%s arg[0]: %d expecting arg[0]: 1\n",
5635 __func__, *value);
5636 }
5637 break;
5638
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305639 default:
5640 {
Sushant Kaushik87787972015-09-11 16:05:00 +05305641 hddLog(LOGE, "Invalid IOCTL command %d ", sub_cmd );
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305642 break;
5643 }
5644 }
5645
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305646 EXIT();
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305647 return 0;
5648}
5649
5650
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305651static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5652 union iwreq_data *wrqu, char *extra)
5653{
5654 int ret;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305655 union iwreq_data u_priv_wrqu;
5656 int apps_args[MAX_VAR_ARGS] = {0};
5657 int num_args;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305658
Mukul Sharma188c67a2015-10-27 23:08:35 +05305659 if (!capable(CAP_NET_ADMIN))
5660 {
5661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5662 FL("permission check failed"));
5663 return -EPERM;
5664 }
5665
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305666 /* helper function to get iwreq_data with compat handling. */
5667 if (hdd_priv_get_data(&u_priv_wrqu.data, wrqu))
5668 {
5669 return -EINVAL;
5670 }
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305671
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305672 if (NULL == u_priv_wrqu.data.pointer)
5673 {
5674 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5675 "%s: NULL data pointer", __func__);
5676 return -EINVAL;
5677 }
5678
5679 num_args = u_priv_wrqu.data.length;
5680 if (num_args > MAX_VAR_ARGS)
5681 {
5682 num_args = MAX_VAR_ARGS;
5683 }
5684
5685 if (copy_from_user(apps_args, u_priv_wrqu.data.pointer,
5686 (sizeof(int)) * num_args))
5687 {
5688 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5689 "%s: failed to copy data from user buffer", __func__);
5690 return -EFAULT;
5691 }
5692
5693 vos_ssr_protect(__func__);
5694 ret = __iw_ftm_set_var_ints_getnone(dev, info, &u_priv_wrqu,
5695 (char *)&apps_args);
5696 vos_ssr_unprotect(__func__);
5697
5698 return ret;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305699}
5700
Jeff Johnson295189b2012-06-20 16:38:30 -07005701static const iw_handler we_ftm_private[] = {
5702
5703 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5704 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5705 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5706 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5707 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305708 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005709};
5710
5711/*Maximum command length can be only 15 */
5712static const struct iw_priv_args we_ftm_private_args[] = {
5713
5714 /* handlers for main ioctl */
5715 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5716 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5717 0,
5718 "" },
5719
5720 { WE_FTM_ON_OFF,
5721 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5722 0,
5723 "ftm" },
5724
5725 { WE_TX_PKT_GEN,
5726 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5727 0,
5728 "tx" },
5729
5730 { WE_SET_TX_IFS,
5731 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5732 0,
5733 "set_txifs" },
5734
5735 { WE_SET_TX_PKT_CNT,
5736 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5737 0,
5738 "set_txpktcnt" },
5739
5740 { WE_SET_TX_PKT_LEN,
5741 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5742 0,
5743 "set_txpktlen" },
5744
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305745 { WE_SET_TX_WF_GAIN,
5746 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5747 0,
5748 "set_tx_wf_gain" },
5749
5750 { WE_TX_CW_RF_GEN,
5751 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5752 0,
5753 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005754 { WE_SET_CHANNEL,
5755 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5756 0,
5757 "set_channel" },
5758
5759 { WE_SET_TX_POWER,
5760 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5761 0,
5762 "set_txpower" },
5763
5764 { WE_CLEAR_RX_PKT_CNT,
5765 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5766 0,
5767 "clr_rxpktcnt" },
5768
5769 { WE_RX,
5770 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5771 0,
5772 "rx" },
5773
5774 { WE_ENABLE_CHAIN,
5775 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5776 0,
5777 "ena_chain" },
5778
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305779 { WE_SET_PWR_CNTL_MODE,
5780 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5781 0,
5782 "pwr_cntl_mode" },
5783
5784 { WE_ENABLE_DPD,
5785 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5786 0,
5787 "ena_dpd" },
5788
5789 { WE_SET_CB,
5790 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5791 0,
5792 "set_cb" },
5793
jge24d9bd42016-05-11 14:53:57 +08005794 { WE_SET_POWER_INDEX,
5795 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5796 0,
5797 "set_power_index" },
5798
Jeff Johnson295189b2012-06-20 16:38:30 -07005799 /* handlers for main ioctl */
5800 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5801 0,
5802 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5803 "" },
5804
5805 { WE_GET_CHANNEL,
5806 0,
5807 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5808 "get_channel" },
5809
5810 { WE_GET_TX_POWER,
5811 0,
5812 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5813 "get_txpower" },
5814
5815 { WE_GET_RX_PKT_CNT,
5816 0,
5817 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5818 "get_rxpktcnt" },
5819
5820 /* handlers for main ioctl */
5821 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5822 IW_PRIV_TYPE_CHAR| 512,
5823 0,
5824 "" },
5825
5826 { WE_SET_MAC_ADDRESS,
5827 IW_PRIV_TYPE_CHAR| 512,
5828 0,
5829 "set_mac_address" },
5830
5831 { WE_SET_TX_RATE,
5832 IW_PRIV_TYPE_CHAR | 512,
5833 0,
5834 "set_txrate" },
5835
5836 /* handlers for main ioctl */
5837 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5838 0,
5839 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5840 "" },
5841
5842 { WE_GET_MAC_ADDRESS,
5843 0,
5844 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5845 "get_mac_address" },
5846
Jeff Johnson295189b2012-06-20 16:38:30 -07005847 { WE_GET_TX_RATE,
5848 0,
5849 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5850 "get_txrate" },
5851
5852 { WE_GET_FTM_STATUS,
5853 0,
5854 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5855 "get_status" },
5856
5857 { WE_GET_RX_RSSI,
5858 0,
5859 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5860 "get_rx_rssi" },
5861
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305862 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5863 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5864 0,
5865 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005866 /* handlers for main ioctl */
5867 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5868 0,
5869 0,
5870 "" },
5871
5872 /* handlers for sub-ioctl */
5873 { WE_SET_NV_DEFAULTS,
5874 0,
5875 0,
5876 "set_nv_defaults" },
5877
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305878 { WE_SET_DUMP,
5879 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5880 0,
5881 "dump" },
5882
Jeff Johnson295189b2012-06-20 16:38:30 -07005883};
5884
5885const struct iw_handler_def we_ftm_handler_def = {
5886 .num_standard = 0,
5887 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5888 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5889
5890 .standard = (iw_handler *)NULL,
5891 .private = (iw_handler *)we_ftm_private,
5892 .private_args = we_ftm_private_args,
5893 .get_wireless_stats = NULL,
5894};
5895
5896static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5897{
5898
5899 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5900
5901 // Zero the memory. This zeros the profile structure.
5902 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005903
Jeff Johnson295189b2012-06-20 16:38:30 -07005904 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5905
5906 return 0;
5907}
5908
Jeff Johnson295189b2012-06-20 16:38:30 -07005909
5910VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5911{
Jeff Johnson295189b2012-06-20 16:38:30 -07005912 ftm_rsp_msg_t *pFtmMsgRsp;
5913
5914 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5915 hdd_context_t *pHddCtx;
5916 v_CONTEXT_t pVosContext= NULL;
5917
5918 ENTER();
5919
5920 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5921
5922 if (!message )
5923 {
5924 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5925 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5926 return VOS_STATUS_E_INVAL;
5927 }
5928 /*Get the global context */
5929 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5930
5931 /*Get the Hdd Context */
5932 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5933
5934 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5935
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305936 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005937 complete(&pHddCtx->ftm.ftm_comp_var);
5938 }
5939 else {
5940 /*Response length to Ptt App*/
5941 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5942
5943 /*Ptt App expects the response length in LE */
5944 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5945
5946 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005947 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005948 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5949
5950 /*Copy the message*/
5951 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5952
5953 /*Update the error code*/
5954 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5955
5956 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5957
5958 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5959 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005960 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005961 return VOS_STATUS_E_FAILURE;
5962 }
5963 }
5964 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005965 return VOS_STATUS_SUCCESS;
5966
5967}