blob: 6c1ab43c48de6f8ca18e81619fa5ce2eabfb7b3d [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 */
Abhishek Singh5ff2ff62016-05-17 13:40:13 +05301587ptt_sock_deactivate_svc(pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001588err_ftm_register_wext_close:
1589hdd_UnregisterWext(pAdapter->dev);
1590
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301591err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001592err_adapter_open_failure:
1593hdd_close_all_adapters( pHddCtx );
1594
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301595err_ftm_vos_close:
1596 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001597err_vos_status_failure:
1598
1599 return VOS_STATUS_E_FAILURE;
1600}
1601
1602
1603
1604int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1605{
1606 VOS_STATUS vosStatus;
1607 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1608
1609 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1610 ENTER();
1611 if(pAdapter == NULL)
1612 {
1613 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1614 return VOS_STATUS_E_NOMEM;
1615 }
1616
Atul Mittalc41126d2014-03-17 15:10:11 +05301617 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1618 if (pHddCtx->ftm.IsCmdPending == TRUE)
1619 {
1620 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1621 {
1622 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1623 "%s: vos_event_set failed", __func__);
1624 }
1625 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001626 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1627 {
1628 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1629 "%s: Ftm has been started. stopping ftm", __func__);
1630 wlan_ftm_stop(pHddCtx);
Vignesh Viswanathan7febd492018-10-30 17:59:12 +05301631 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
Leo Chang4e8183f2013-05-31 15:38:34 -07001632 }
Abhishek Singh5ff2ff62016-05-17 13:40:13 +05301633#ifdef WLAN_KD_READY_NOTIFIER
1634 nl_srv_exit(pHddCtx->ptt_pid);
1635#else
1636 nl_srv_exit();
1637#endif /* WLAN_KD_READY_NOTIFIER */
1638 ptt_sock_deactivate_svc(pHddCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001639
Jeff Johnson295189b2012-06-20 16:38:30 -07001640 //TODO----------
1641 //Deregister the device with the kernel
1642 hdd_UnregisterWext(pAdapter->dev);
1643
Jeff Johnson295189b2012-06-20 16:38:30 -07001644#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001645 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001646 {
1647 unregister_netdev(pAdapter->dev);
1648 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1649 }
1650#endif
1651 //-----------------
1652
1653 vosStatus = vos_sched_close( vosContext );
1654 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1655 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1656 "%s: Failed to close VOSS Scheduler",__func__);
1657 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1658 }
1659
1660 //Close VOSS
1661 wlan_ftm_vos_close(vosContext);
Mahesh A Saptasagarc3ed0122016-01-19 16:45:11 +05301662 hdd_close_all_adapters( pHddCtx );
Jeff Johnson295189b2012-06-20 16:38:30 -07001663 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1664 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1665 {
1666 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1667 "%s: Failed to destroy ftm_vos Event",__func__);
1668 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1669 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001670 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001671
Jeff Johnson295189b2012-06-20 16:38:30 -07001672 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001673}
1674
1675/**---------------------------------------------------------------------------
1676
1677 \brief wlan_ftm_send_response() -
1678
1679 The function sends the response to the ptt socket application running in user space.
1680
1681 \param - pAdapter - Pointer HDD Context.
1682
1683 \return - 0 for success, non zero for failure
1684
1685 --------------------------------------------------------------------------*/
1686
1687static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1688
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301689 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1690 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001691
Arif Hussain6d2a3322013-11-17 19:50:10 -08001692 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 -07001693 return VOS_STATUS_E_FAILURE;
1694 }
1695 return VOS_STATUS_SUCCESS;
1696}
1697
1698/**---------------------------------------------------------------------------
1699
1700 \brief wlan_hdd_ftm_start() -
1701
1702 This function gets called when the FTM start commands received from the ptt socket application and
1703 it starts the following modules.
1704 1) SAL Start.
1705 2) BAL Start.
1706 3) MAC Start to download the firmware.
1707
1708
1709 \param - pAdapter - Pointer HDD Context.
1710
1711 \return - 0 for success, non zero for failure
1712
1713 --------------------------------------------------------------------------*/
1714
1715static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1716{
1717 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1718 tSirRetStatus sirStatus = eSIR_SUCCESS;
1719 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1720 tHalMacStartParameters halStartParams;
1721
1722 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1723 {
1724 return VOS_STATUS_SUCCESS;
1725 }
1726
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301727 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTING;
1728
Jeff Johnson295189b2012-06-20 16:38:30 -07001729 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1730 "%s: Starting Libra SW", __func__);
1731
1732 /* We support only one instance for now ...*/
1733 if (pVosContext == NULL)
1734 {
1735 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001736 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001737 goto err_status_failure;
1738 }
1739
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001740
Jeff Johnson295189b2012-06-20 16:38:30 -07001741 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001742 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001743 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001744 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001745 goto err_status_failure;
1746 }
1747
Jeff Johnson295189b2012-06-20 16:38:30 -07001748 /*
1749 Prima needs to start the WDA correctly instead of BAL and SAL
1750 */
1751
1752 /* Vos preStart is calling */
1753 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1754 {
1755 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1756 goto err_status_failure;
1757 }
1758
1759
1760 vStatus = WDA_NVDownload_Start(pVosContext);
1761
1762 if ( vStatus != VOS_STATUS_SUCCESS )
1763 {
1764 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1765 "%s: Failed to start NV Download",__func__);
1766 return VOS_STATUS_E_FAILURE;
1767 }
1768
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301769 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001770
1771 if ( vStatus != VOS_STATUS_SUCCESS )
1772 {
1773 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1774 {
1775 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001776 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001777 }
1778 else
1779 {
1780 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001781 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001782 }
1783 VOS_ASSERT(0);
Wu Gaoece54202015-09-25 10:46:49 +08001784 WDA_setNeedShutdown(pHddCtx->pvosContext);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301785 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001786 }
1787
1788 vStatus = WDA_start(pVosContext);
1789 if (vStatus != VOS_STATUS_SUCCESS)
1790 {
1791 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1792 "%s: Failed to start WDA",__func__);
1793 goto err_status_failure;
1794 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001795
Jeff Johnson295189b2012-06-20 16:38:30 -07001796
1797 /* Start the MAC */
1798 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1799
Jeff Johnson295189b2012-06-20 16:38:30 -07001800
1801 halStartParams.driverType = eDRIVER_TYPE_MFG;
1802
1803 /* Start the MAC */
1804 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1805
Jeff Johnson295189b2012-06-20 16:38:30 -07001806
1807 if (eSIR_SUCCESS != sirStatus)
1808 {
1809 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1810 "%s: Failed to start MAC", __func__);
1811
Jeff Johnson295189b2012-06-20 16:38:30 -07001812 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001813 }
1814
1815 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1816 "%s: MAC correctly started",__func__);
1817
Jeff Johnson295189b2012-06-20 16:38:30 -07001818
1819 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1820
1821 return VOS_STATUS_SUCCESS;
1822
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001823err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001824 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1825 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1826 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1827 if(vStatus != VOS_STATUS_SUCCESS)
1828 {
1829 if(vStatus == VOS_STATUS_E_TIMEOUT)
1830 {
1831 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001832 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001833
1834 }
1835 else
1836 {
1837 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001838 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001839 }
1840 VOS_ASSERT(0);
1841 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001842
1843err_status_failure:
1844
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301845 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001846 return VOS_STATUS_E_FAILURE;
1847
1848}
1849
1850
1851static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1852{
1853 VOS_STATUS vosStatus;
1854
1855 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1856 {
1857 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1858 return VOS_STATUS_E_FAILURE;
1859 }
1860
1861 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1862 {
1863 /* STOP MAC only */
1864 v_VOID_t *hHal;
1865 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1866 if (NULL == hHal)
1867 {
1868 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1869 "%s: NULL hHal", __func__);
1870 }
1871 else
1872 {
1873 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1874 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1875 {
1876 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1877 "%s: Failed to stop SYS", __func__);
1878 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1879 }
1880 }
1881
Jeff Johnson295189b2012-06-20 16:38:30 -07001882
Jeff Johnson295189b2012-06-20 16:38:30 -07001883 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001884
1885 }
1886 return WLAN_FTM_SUCCESS;
1887}
1888
Jeff Johnson295189b2012-06-20 16:38:30 -07001889/**---------------------------------------------------------------------------
1890
1891 \brief wlan_hdd_ftm_get_nv_table() -
1892 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001893 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001894
1895 \param - ftmCmd - Pointer FTM Commad Buffer
1896
1897 \return - int
1898 -1, Process Host command fail, vail out
1899 1, Process Host command success
1900
1901 --------------------------------------------------------------------------*/
1902int wlan_hdd_ftm_get_nv_table
1903(
1904 hdd_context_t *pHddCtx,
1905 tPttMsgbuffer *ftmCmd
1906)
1907{
1908 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1909 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1910 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001911 sHalNvV2 *nvContents = NULL;
1912 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001913
Jeff Johnson295189b2012-06-20 16:38:30 -07001914 if (NULL == pHddCtx)
1915 {
1916 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1917 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001918 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001919 }
1920
Leo Chang80de3c22013-11-26 10:52:12 -08001921 nvVersion = vos_nv_getNvVersion();
1922 if (E_NV_V2 != nvVersion)
1923 {
1924 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1925 "%s : Not valid NV Version %d", __func__, nvVersion);
1926 return -EINVAL;
1927 }
1928
Jeff Johnson295189b2012-06-20 16:38:30 -07001929 /* Test first chunk of NV table */
1930 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1931 (0 == pHddCtx->ftm.processedNVTableSize))
1932 {
1933 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1934 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1935 {
c_hpothuffdb5272013-10-02 16:42:35 +05301936 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1937 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001938 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001939 }
1940
1941 switch (nvTable->nvTable)
1942 {
1943 case NV_TABLE_RATE_POWER_SETTINGS:
1944 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1945 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1946 break;
1947
1948 case NV_TABLE_REGULATORY_DOMAINS:
1949 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1950 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1951 break;
1952
1953 case NV_TABLE_DEFAULT_COUNTRY:
1954 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1955 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1956 break;
1957
1958 case NV_TABLE_TPC_POWER_TABLE:
1959 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1960 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1961 break;
1962
1963 case NV_TABLE_TPC_PDADC_OFFSETS:
1964 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1965 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1966 break;
1967
1968 case NV_TABLE_VIRTUAL_RATE:
1969 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1970 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1971 break;
1972
1973 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1974 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1975 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1976 break;
1977
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001978 case NV_TABLE_HW_CAL_VALUES:
1979 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1980 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1981 break;
1982
1983 case NV_TABLE_FW_CONFIG:
1984 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1985 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001986 break;
1987
1988 case NV_TABLE_ANTENNA_PATH_LOSS:
1989 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1990 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1991 break;
1992
1993 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1994 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1995 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1996 break;
1997
1998 default:
1999 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2000 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002001 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002002 break;
2003 }
2004
2005 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2006 {
2007 /* Invalid table size, discard and initialize data */
2008 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002009 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002010 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002011 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002012 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2013 pHddCtx->ftm.targetNVTableSize = 0;
2014 pHddCtx->ftm.processedNVTableSize = 0;
2015 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002016 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002017 }
2018
2019 /* Set Current Processing NV table type */
2020 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2021 /* Copy target NV table value into temp context buffer */
2022 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2023 pHddCtx->ftm.targetNVTablePointer,
2024 pHddCtx->ftm.targetNVTableSize);
2025
2026 }
2027
2028 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2029 {
2030 /* Invalid table type */
2031 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2032 "Invalid NV Table, now Processing %d, not %d",
2033 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2034 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2035 pHddCtx->ftm.targetNVTableSize = 0;
2036 pHddCtx->ftm.processedNVTableSize = 0;
2037 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002038
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002039 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002040 }
2041
2042 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002043 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002044 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2045 nvTable->chunkSize);
2046 /* Update processed pointer to prepare next chunk copy */
2047 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2048
2049 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2050 {
2051 /* Finished to process last chunk of data, initialize buffer */
2052 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2053 pHddCtx->ftm.targetNVTableSize = 0;
2054 pHddCtx->ftm.processedNVTableSize = 0;
2055 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2056 }
2057
2058 return 1;
2059}
2060
2061/**---------------------------------------------------------------------------
2062
2063 \brief wlan_hdd_ftm_set_nv_table() -
2064 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002065 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002066
2067 \param - ftmCmd - Pointer FTM Commad Buffer
2068
2069 \return - int
2070 -1, Process Host command fail, vail out
2071 1, Process Host command success
2072
2073 --------------------------------------------------------------------------*/
2074int wlan_hdd_ftm_set_nv_table
2075(
2076 hdd_context_t *pHddCtx,
2077 tPttMsgbuffer *ftmCmd
2078)
2079{
2080 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2081 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2082 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002083 sHalNvV2 *nvContents = NULL;
2084 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002085
2086 if (NULL == pHddCtx)
2087 {
2088 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2089 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002090 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002091 }
2092
Leo Chang80de3c22013-11-26 10:52:12 -08002093 nvVersion = vos_nv_getNvVersion();
2094 if (E_NV_V2 != nvVersion)
2095 {
2096 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2097 "%s : Not valid NV Version %d", __func__, nvVersion);
2098 return -EINVAL;
2099 }
2100
Jeff Johnson295189b2012-06-20 16:38:30 -07002101 /* Test first chunk of NV table */
2102 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2103 (0 == pHddCtx->ftm.processedNVTableSize))
2104 {
2105 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2106 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2107 {
c_hpothuffdb5272013-10-02 16:42:35 +05302108 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2109 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002110 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002111 }
2112
2113 switch (nvTable->nvTable)
2114 {
2115 case NV_TABLE_RATE_POWER_SETTINGS:
2116 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2117 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2118 break;
2119
2120 case NV_TABLE_REGULATORY_DOMAINS:
2121 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2122 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2123 break;
2124
2125 case NV_TABLE_DEFAULT_COUNTRY:
2126 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2127 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2128 break;
2129
2130 case NV_TABLE_TPC_POWER_TABLE:
2131 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2132 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2133 break;
2134
2135 case NV_TABLE_TPC_PDADC_OFFSETS:
2136 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2137 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2138 break;
2139
2140 case NV_TABLE_VIRTUAL_RATE:
2141 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2142 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2143 break;
2144
2145 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2146 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2147 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2148 break;
2149
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002150 case NV_TABLE_HW_CAL_VALUES:
2151 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2152 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2153 break;
2154
2155 case NV_TABLE_FW_CONFIG:
2156 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2157 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002158 break;
2159
2160 case NV_TABLE_ANTENNA_PATH_LOSS:
2161 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2162 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2163 break;
2164
2165 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2166 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2167 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2168 break;
2169
2170 default:
2171 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2172 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002173 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002174 break;
2175 }
2176
2177 /* Set Current Processing NV table type */
2178 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2179 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2180 {
2181 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2182 "Invalid Table Size %d", nvTable->tableSize);
2183 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2184 pHddCtx->ftm.targetNVTableSize = 0;
2185 pHddCtx->ftm.processedNVTableSize = 0;
2186 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002187 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002188 }
2189 }
2190
2191 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2192 {
2193 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2194 "Invalid NV Table, now Processing %d, not %d",
2195 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2196 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2197 pHddCtx->ftm.targetNVTableSize = 0;
2198 pHddCtx->ftm.processedNVTableSize = 0;
2199 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002200 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002201 }
2202 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002203 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002204 nvTable->chunkSize);
2205
2206 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2207 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2208 {
2209 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2210 pHddCtx->ftm.tempNVTableBuffer,
2211 pHddCtx->ftm.targetNVTableSize);
2212 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2213 pHddCtx->ftm.targetNVTableSize = 0;
2214 pHddCtx->ftm.processedNVTableSize = 0;
2215 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2216 }
2217
2218 return 1;
2219}
2220
2221/**---------------------------------------------------------------------------
2222
2223 \brief wlan_hdd_ftm_blank_nv() -
2224 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002225 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002226
2227 \param - ftmCmd - Pointer FTM Commad Buffer
2228
2229 \return - int
2230 -1, Process Host command fail, vail out
2231 0, Process Host command success
2232
2233 --------------------------------------------------------------------------*/
2234int wlan_hdd_ftm_blank_nv_table
2235(
2236 tPttMsgbuffer *ftmCmd
2237)
2238{
Leo Chang80de3c22013-11-26 10:52:12 -08002239 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 v_SIZE_t nvSize;
2241 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002242 sHalNvV2 *nvContents = NULL;
2243 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002244
2245 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2246 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2247 {
c_hpothuffdb5272013-10-02 16:42:35 +05302248 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2249 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002250 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002251 }
2252
Leo Chang80de3c22013-11-26 10:52:12 -08002253 nvVersion = vos_nv_getNvVersion();
2254 if (E_NV_V2 != nvVersion)
2255 {
2256 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2257 "%s : Not valid NV Version %d", __func__, nvVersion);
2258 return -EINVAL;
2259 }
2260
Jeff Johnson295189b2012-06-20 16:38:30 -07002261 itemSize = sizeof(nvContents->tables.pwrOptimum);
2262 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002263 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002264 itemSize);
2265
2266 itemSize = sizeof(nvContents->tables.regDomains);
2267 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002268 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002269 itemSize);
2270
2271 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2272 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002273 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002274 itemSize);
2275
2276 itemSize = sizeof(nvContents->tables.plutCharacterized);
2277 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002278 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002279 itemSize);
2280
2281 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2282 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002283 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002284 itemSize);
2285
2286 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2287 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002288 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002289 itemSize);
2290
2291 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2292 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002293 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002294 itemSize);
2295
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002296 itemSize = sizeof(nvContents->tables.hwCalValues);
2297 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002298 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002299 itemSize);
2300
2301 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2302 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002303 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002304 itemSize);
2305
2306 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2307 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002308 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002309 itemSize);
2310
2311 return 1;
2312}
2313
2314/**---------------------------------------------------------------------------
2315
2316 \brief wlan_hdd_ftm_delete_nv_table() -
2317 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002318 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002319
2320 \param - ftmCmd - Pointer FTM Commad Buffer
2321
2322 \return - int
2323 -1, Process Host command fail, vail out
2324 1, Process Host command success
2325
2326 --------------------------------------------------------------------------*/
2327int wlan_hdd_ftm_delete_nv_table
2328(
2329 tPttMsgbuffer *ftmCmd
2330)
2331{
Leo Chang80de3c22013-11-26 10:52:12 -08002332 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002333 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2334 v_SIZE_t nvSize;
2335 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002336 sHalNvV2 *nvContents = NULL;
2337 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002338
2339 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2340 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2341 {
c_hpothuffdb5272013-10-02 16:42:35 +05302342 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2343 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002344 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002345 }
2346
Leo Chang80de3c22013-11-26 10:52:12 -08002347 nvVersion = vos_nv_getNvVersion();
2348 if (E_NV_V2 != nvVersion)
2349 {
2350 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2351 "%s : Not valid NV Version %d", __func__, nvVersion);
2352 return -EINVAL;
2353 }
2354
Jeff Johnson295189b2012-06-20 16:38:30 -07002355 switch (nvTable->nvTable)
2356 {
2357 case NV_TABLE_RATE_POWER_SETTINGS:
2358 itemSize = sizeof(nvContents->tables.pwrOptimum);
2359 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002360 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002361 itemSize);
2362 break;
2363
2364 case NV_TABLE_REGULATORY_DOMAINS:
2365 itemSize = sizeof(nvContents->tables.regDomains);
2366 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002367 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002368 itemSize);
2369 break;
2370
2371 case NV_TABLE_DEFAULT_COUNTRY:
2372 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2373 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002374 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002375 itemSize);
2376 break;
2377
2378 case NV_TABLE_TPC_POWER_TABLE:
2379 itemSize = sizeof(nvContents->tables.plutCharacterized);
2380 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002381 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002382 itemSize);
2383 break;
2384
2385 case NV_TABLE_TPC_PDADC_OFFSETS:
2386 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2387 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002388 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002389 itemSize);
2390 break;
2391
2392 case NV_TABLE_VIRTUAL_RATE:
2393 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2394 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002395 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002396 itemSize);
2397 break;
2398
2399 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2400 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2401 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002402 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002403 itemSize);
2404 break;
2405
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002406 case NV_TABLE_HW_CAL_VALUES:
2407 itemSize = sizeof(nvContents->tables.hwCalValues);
2408 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002409 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002410 itemSize);
2411 break;
2412
2413 case NV_TABLE_FW_CONFIG:
2414 itemSize = sizeof(nvContents->tables.fwConfig);
2415 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002416 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002417 itemSize);
2418 break;
2419
2420 case NV_TABLE_ANTENNA_PATH_LOSS:
2421 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2422 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002423 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002424 itemSize);
2425 break;
2426
2427 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2428 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2429 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002430 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002431 itemSize);
2432 break;
2433
2434 default:
2435 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2436 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002437 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002438 break;
2439 }
2440
2441 return 1;
2442}
2443
2444/**---------------------------------------------------------------------------
2445
2446 \brief wlan_hdd_ftm_get_nv_field() -
2447 Get Specific NV field
2448
2449 \param - ftmCmd - Pointer FTM Commad Buffer
2450
2451 \return - int
2452 -1, Process Host command fail, vail out
2453 1, Process Host command success
2454
2455 --------------------------------------------------------------------------*/
2456int wlan_hdd_ftm_get_nv_field
2457(
2458 tPttMsgbuffer *ftmCmd
2459)
2460{
2461 sNvFields nvFieldDataBuffer;
2462 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2463 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2464 sHalNv *nvContents = NULL;
2465 v_SIZE_t nvSize;
2466
2467 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2468 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2469 {
c_hpothuffdb5272013-10-02 16:42:35 +05302470 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2471 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002472 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002473 }
2474 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2475
2476 switch (nvField->nvField)
2477 {
2478 case NV_COMMON_PRODUCT_ID:
2479 memcpy((void *)&nvField->fieldData,
2480 &nvFieldDataBuffer.productId,
2481 sizeof(nvFieldDataBuffer.productId));
2482 break;
2483
2484 case NV_COMMON_PRODUCT_BANDS:
2485 memcpy((void *)&nvField->fieldData,
2486 &nvFieldDataBuffer.productBands,
2487 sizeof(nvFieldDataBuffer.productBands));
2488 break;
2489
2490 case NV_COMMON_NUM_OF_TX_CHAINS:
2491 memcpy((void *)&nvField->fieldData,
2492 &nvFieldDataBuffer.numOfTxChains,
2493 sizeof(nvFieldDataBuffer.numOfTxChains));
2494 break;
2495
2496 case NV_COMMON_NUM_OF_RX_CHAINS:
2497 memcpy((void *)&nvField->fieldData,
2498 &nvFieldDataBuffer.numOfRxChains,
2499 sizeof(nvFieldDataBuffer.numOfRxChains));
2500 break;
2501
2502 case NV_COMMON_MAC_ADDR:
2503 memcpy((void *)&nvField->fieldData,
2504 &nvFieldDataBuffer.macAddr[0],
2505 NV_FIELD_MAC_ADDR_SIZE);
2506 break;
2507
2508 case NV_COMMON_MFG_SERIAL_NUMBER:
2509 memcpy((void *)&nvField->fieldData,
2510 &nvFieldDataBuffer.mfgSN[0],
2511 NV_FIELD_MFG_SN_SIZE);
2512 break;
2513
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002514 case NV_COMMON_WLAN_NV_REV_ID:
2515 memcpy((void *)&nvField->fieldData,
2516 &nvFieldDataBuffer.wlanNvRevId,
2517 sizeof(nvFieldDataBuffer.wlanNvRevId));
2518 break;
2519
Jeff Johnson295189b2012-06-20 16:38:30 -07002520 case NV_COMMON_COUPLER_TYPE:
2521 memcpy((void *)&nvField->fieldData,
2522 &nvFieldDataBuffer.couplerType,
2523 sizeof(nvFieldDataBuffer.couplerType));
2524 break;
2525
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002526 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002527 {
2528 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2529 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2530
2531 nvEmbededStatus = vos_nv_isEmbeddedNV();
2532
2533 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2534 {
2535 // High bit is set to indicate embedded NV..
2536 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2537 }
2538
2539 memcpy((void *)&nvField->fieldData,
2540 &nvVersion,
2541 sizeof(nvFieldDataBuffer.nvVersion));
2542 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002543 break;
2544
Jeff Johnson295189b2012-06-20 16:38:30 -07002545 default:
2546 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2547 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002548 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002549 break;
2550 }
2551
2552 return 1;
2553}
2554
2555/**---------------------------------------------------------------------------
2556
2557 \brief wlan_hdd_ftm_set_nv_field() -
2558 Set Specific NV field
2559
2560 \param - ftmCmd - Pointer FTM Commad Buffer
2561
2562 \return - int
2563 -1, Process Host command fail, vail out
2564 1, Process Host command success
2565
2566 --------------------------------------------------------------------------*/
2567int wlan_hdd_ftm_set_nv_field
2568(
2569 tPttMsgbuffer *ftmCmd
2570)
2571{
2572 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2573 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2574 v_SIZE_t nvSize;
2575 sHalNv *nvContents = NULL;
2576 v_U8_t macLoop;
2577 v_U8_t *pNVMac;
2578 v_U8_t lastByteMAC;
2579
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002580
Jeff Johnson295189b2012-06-20 16:38:30 -07002581 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2582 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2583 {
c_hpothuffdb5272013-10-02 16:42:35 +05302584 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2585 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002586 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002587 }
2588
2589 switch (nvField->nvField)
2590 {
2591 case NV_COMMON_PRODUCT_ID:
2592 memcpy(&nvContents->fields.productId,
2593 &nvField->fieldData,
2594 sizeof(nvContents->fields.productId));
2595 break;
2596
2597 case NV_COMMON_PRODUCT_BANDS:
2598 memcpy(&nvContents->fields.productBands,
2599 &nvField->fieldData,
2600 sizeof(nvContents->fields.productBands));
2601 break;
2602
2603 case NV_COMMON_NUM_OF_TX_CHAINS:
2604 memcpy(&nvContents->fields.numOfTxChains,
2605 &nvField->fieldData,
2606 sizeof(nvContents->fields.numOfTxChains));
2607 break;
2608
2609 case NV_COMMON_NUM_OF_RX_CHAINS:
2610 memcpy(&nvContents->fields.numOfRxChains,
2611 &nvField->fieldData,
2612 sizeof(nvContents->fields.numOfRxChains));
2613 break;
2614
2615 case NV_COMMON_MAC_ADDR:
2616 /* If Last byte is larger than 252 (0xFC), return Error,
2617 * Since 3MACs should be derived from first MAC */
2618 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002619 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002620 {
2621 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2622 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002623 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002624 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002625 }
2626
2627 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002628 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002629 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2630 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002631 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002632 lastByteMAC + macLoop;
2633 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002634 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002635 NV_FIELD_MAC_ADDR_SIZE);
2636 }
2637 break;
2638
2639 case NV_COMMON_MFG_SERIAL_NUMBER:
2640 memcpy(&nvContents->fields.mfgSN[0],
2641 &nvField->fieldData,
2642 NV_FIELD_MFG_SN_SIZE);
2643 break;
2644
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002645 case NV_COMMON_WLAN_NV_REV_ID:
2646 memcpy(&nvContents->fields.wlanNvRevId,
2647 &nvField->fieldData,
2648 sizeof(nvContents->fields.wlanNvRevId));
2649 break;
2650
Jeff Johnson295189b2012-06-20 16:38:30 -07002651 case NV_COMMON_COUPLER_TYPE:
2652 memcpy(&nvContents->fields.couplerType,
2653 &nvField->fieldData,
2654 sizeof(nvContents->fields.couplerType));
2655 break;
2656
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002657 case NV_COMMON_NV_VERSION:
2658 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2659 "Cannot modify NV version field %d", nvField->nvField);
2660 return -EIO;
2661 break;
2662
Jeff Johnson295189b2012-06-20 16:38:30 -07002663 default:
2664 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2665 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002666 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002667 break;
2668 }
2669
2670 return 1;
2671}
2672
2673/**---------------------------------------------------------------------------
2674
2675 \brief wlan_hdd_ftm_store_nv_table() -
2676 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002677 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002678
2679 \param - ftmCmd - Pointer FTM Commad Buffer
2680
2681 \return - int
2682 -1, Process Host command fail, vail out
2683 0, Process Host command success
2684
2685 --------------------------------------------------------------------------*/
2686int wlan_hdd_ftm_store_nv_table
2687(
2688 tPttMsgbuffer *ftmCmd
2689)
2690{
2691 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2692 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002693 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2694 void *tablePtr = NULL;
2695 unsigned int tableSize = 0;
2696 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002697 sHalNvV2 *nvContents = NULL;
2698 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002699
2700 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2701 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2702 {
c_hpothuffdb5272013-10-02 16:42:35 +05302703 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2704 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002705 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002706 }
2707
Leo Chang80de3c22013-11-26 10:52:12 -08002708 nvVersion = vos_nv_getNvVersion();
2709 if (E_NV_V2 != nvVersion)
2710 {
2711 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2712 "%s : Not valid NV Version %d", __func__, nvVersion);
2713 return -EINVAL;
2714 }
2715
Jeff Johnson295189b2012-06-20 16:38:30 -07002716 /* Set Platform type as PRIMA */
2717 nvContents->fields.wlanNvRevId = 2;
2718
2719 switch(nvTable->nvTable)
2720 {
2721 case NV_FIELDS_IMAGE:
2722 tablePtr = (void *)&nvContents->fields;
2723 tableSize = sizeof(nvContents->fields);
2724 tableVNVType = VNV_FIELD_IMAGE;
2725 break;
2726
2727 case NV_TABLE_RATE_POWER_SETTINGS:
2728 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2729 tableSize = sizeof(nvContents->tables.pwrOptimum);
2730 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2731 break;
2732
2733 case NV_TABLE_REGULATORY_DOMAINS:
2734 tablePtr = (void *)&nvContents->tables.regDomains[0];
2735 tableSize = sizeof(nvContents->tables.regDomains);
2736 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2737 break;
2738
2739 case NV_TABLE_DEFAULT_COUNTRY:
2740 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2741 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2742 tableVNVType = VNV_DEFAULT_LOCATION;
2743 break;
2744
2745 case NV_TABLE_TPC_POWER_TABLE:
2746 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2747 tableSize = sizeof(nvContents->tables.plutCharacterized);
2748 tableVNVType = VNV_TPC_POWER_TABLE;
2749 break;
2750
2751 case NV_TABLE_TPC_PDADC_OFFSETS:
2752 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2753 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2754 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2755 break;
2756
2757 case NV_TABLE_VIRTUAL_RATE:
2758 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2759 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2760 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2761 break;
2762
2763 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2764 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2765 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2766 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2767 break;
2768
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002769 case NV_TABLE_HW_CAL_VALUES:
2770 tablePtr = (void *)&nvContents->tables.hwCalValues;
2771 tableSize = sizeof(nvContents->tables.hwCalValues);
2772 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002773 break;
2774
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002775 case NV_TABLE_FW_CONFIG:
2776 tablePtr = (void *)&nvContents->tables.fwConfig;
2777 tableSize = sizeof(nvContents->tables.fwConfig);
2778 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002779 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002780
Jeff Johnson295189b2012-06-20 16:38:30 -07002781 case NV_TABLE_ANTENNA_PATH_LOSS:
2782 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2783 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2784 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2785 break;
2786
2787 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2788 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2789 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2790 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2791 break;
2792
2793 default:
2794 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2795 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002796 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002797 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002798
Jeff Johnson295189b2012-06-20 16:38:30 -07002799 }
2800
2801 nvStatus = vos_nv_write(tableVNVType,
2802 tablePtr,
2803 tableSize);
2804 if(VOS_STATUS_SUCCESS != nvStatus)
2805 {
c_hpothuffdb5272013-10-02 16:42:35 +05302806 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2807 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002808 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002809 }
2810
2811 return 1;
2812}
2813
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002814/* --------------------------------------------------------------------------
2815 \brief wlan_hdd_ftm_get_nv_bin() -
2816 Get NV bin read from Flash Memory, file
2817
2818 \param - ftmCmd - Pointer FTM Commad Buffer
2819
2820 \return - int
2821 -1, Process Host command fail, vail out
2822 0, Process Host command success
2823--------------------------------------------------------------------------*/
2824
2825static int wlan_hdd_ftm_get_nv_bin
2826(
2827 v_U16_t msgId,
2828 hdd_context_t *pHddCtx,
2829 tPttMsgbuffer *ftmCmd
2830)
2831{
2832 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2833 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2834 v_SIZE_t nvSize;
2835 v_U8_t *nvContents;
2836 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002837 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002838
Leo Chang80de3c22013-11-26 10:52:12 -08002839 nvVersion = vos_nv_getNvVersion();
2840 if (E_NV_V3 != nvVersion)
2841 {
2842 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2843 "%s : Not valid NV Version %d", __func__, nvVersion);
2844 return -EINVAL;
2845 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002846
2847 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2848 (0 == pHddCtx->ftm.processedNVTableSize))
2849 {
2850 if ( msgId == PTT_MSG_GET_NV_BIN )
2851 {
2852 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2853 }
2854 else
2855 {
2856 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2857 }
2858
2859 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2860 {
c_hpothuffdb5272013-10-02 16:42:35 +05302861 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2862 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002863 return -EIO;
2864 }
2865
2866 switch (nvTable->nvTable)
2867 {
2868 case NV_BINARY_IMAGE:
2869 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2870 break;
2871 default:
2872 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2873 "Not Valid NV Table %d", nvTable->nvTable);
2874 return -EIO;
2875 break;
2876 }
2877
2878 /* Set Current Processing NV table type */
2879 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2880 if ( msgId == PTT_MSG_GET_NV_BIN )
2881 {
2882 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2883 /* Validity Period */
2884 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2885 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2886 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2887 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2888 offset = sizeof(v_U32_t);
2889 }
2890 else
2891 {
2892 pHddCtx->ftm.targetNVTableSize = nvSize;
2893 offset = 0;
2894 }
2895
2896 /* Copy target NV table value into temp context buffer */
2897 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2898 pHddCtx->ftm.targetNVTablePointer,
2899 pHddCtx->ftm.targetNVTableSize);
2900 }
2901
2902
2903 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2904 {
2905 /* Invalid table type */
2906 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2907 "Invalid NV Table, now Processing %d, not %d",
2908 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2909
2910 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2911 pHddCtx->ftm.targetNVTableSize = 0;
2912 pHddCtx->ftm.processedNVTableSize = 0;
2913 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2914
2915 return -EINVAL;
2916 }
2917
2918 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2919
2920 /* Update processed pointer to prepare next chunk copy */
2921 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2922 pHddCtx->ftm.targetNVTableSize )
2923 {
2924 nvTable->chunkSize =
2925 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2926 }
2927
2928 /* Copy next chunk of NV table value into response buffer */
2929 vos_mem_copy(
2930 &nvTable->tableData,
2931 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2932 nvTable->chunkSize);
2933
2934 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2935
2936 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2937 {
2938 /* Finished to process last chunk of data, initialize buffer */
2939 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2940 pHddCtx->ftm.targetNVTableSize = 0;
2941 pHddCtx->ftm.processedNVTableSize = 0;
2942 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2943 }
2944
2945 return 1;
2946}
2947
2948/**---------------------------------------------------------------------------
2949
2950 \brief wlan_hdd_ftm_set_nv_bin() -
2951 Set NV bin to Flash Memory, file
2952
2953 \param - ftmCmd - Pointer FTM Commad Buffer
2954
2955 \return - int
2956 -1, Process Host command fail, vail out
2957 0, Process Host command success
2958
2959+----------------------------------------------------------------------------*/
2960
2961static int wlan_hdd_ftm_set_nv_bin
2962(
2963 hdd_context_t *pHddCtx,
2964 tPttMsgbuffer *ftmCmd
2965)
2966{
2967 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2968 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002969 eNvVersionType nvVersion;
2970
2971 nvVersion = vos_nv_getNvVersion();
2972 if (E_NV_V3 != nvVersion)
2973 {
2974 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2975 "%s : Not valid NV Version %d", __func__, nvVersion);
2976 return -EINVAL;
2977 }
2978
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002979
2980 /* Test first chunk of NV table */
2981 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2982 (0 == pHddCtx->ftm.processedNVTableSize))
2983 {
2984 switch (nvTable->nvTable)
2985 {
2986 case NV_BINARY_IMAGE:
2987 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2988 break;
2989 default:
2990 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2991 "Not Valid NV Table %d", nvTable->nvTable);
2992 return -EIO;
2993 break;
2994 }
2995
2996 /* Set Current Processing NV table type */
2997 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2998 pHddCtx->ftm.processedNVTableSize = 0;
2999
3000 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
3001 {
3002 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3003 "Invalid Table Size %d", nvTable->tableSize);
3004 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3005 pHddCtx->ftm.targetNVTableSize = 0;
3006 pHddCtx->ftm.processedNVTableSize = 0;
3007 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3008 return -EINVAL;
3009 }
3010 }
3011
3012 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3013 {
3014 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3015 "Invalid NV Table, now Processing %d, not %d",
3016 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3017 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3018 pHddCtx->ftm.targetNVTableSize = 0;
3019 pHddCtx->ftm.processedNVTableSize = 0;
3020 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3021 return -EINVAL;
3022 }
3023
3024 vos_mem_copy(
3025 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3026 &nvTable->tableData,
3027 nvTable->chunkSize);
3028
3029 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3030
3031 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3032 {
3033 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3034 "Processing Done!! write encoded Buffer %d",
3035 pHddCtx->ftm.targetNVTableSize);
3036
3037 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3038 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3039
3040 if ((VOS_STATUS_SUCCESS != nvStatus))
3041 {
3042 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3043 "Fail to set NV Binary %d", nvStatus);
3044 return -EIO;
3045 }
3046
3047 nvStatus = vos_nv_setNVEncodedBuffer(
3048 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3049 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3050
3051 if ((VOS_STATUS_SUCCESS != nvStatus))
3052 {
3053 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3054 "Fail to set NV Binary %d", nvStatus);
3055 return -EIO;
3056 }
3057
3058 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3059 pHddCtx->ftm.targetNVTableSize = 0;
3060 pHddCtx->ftm.processedNVTableSize = 0;
3061 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3062 }
3063
3064 return 1;
3065}
3066
Jeff Johnson295189b2012-06-20 16:38:30 -07003067/**---------------------------------------------------------------------------
3068
3069 \brief wlan_hdd_ftm_temp_get_rel_num() -
3070 Get internal release number
3071
3072 \param - ftmCmd - Pointer FTM Commad Buffer
3073
3074 \return - int
3075 -1, Process Host command fail, vail out
3076 0, Process Host command success
3077
3078 --------------------------------------------------------------------------*/
3079int wlan_hdd_ftm_temp_get_rel_num
3080(
3081 tPttMsgbuffer *ftmCmd
3082)
3083{
3084 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3085
3086 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3087 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3088 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3089 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3090 relNum->relParams.pttMax = 10;
3091 relNum->relParams.pttMin = 1;
3092
3093 return 1;
3094}
3095
3096/**---------------------------------------------------------------------------
3097
3098 \brief wlan_hdd_process_ftm_host_cmd() -
3099 process any command should be handled within host.
3100 decide any command should be send to HAL or not
3101
3102 \param - ftmCmd - Pointer FTM Commad Buffer
3103
3104 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003105 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003106 0, Process Host command success, not need to send CMD to HAL
3107 1, Process Host command success, need to send CMD to HAL
3108
3109 --------------------------------------------------------------------------*/
3110int wlan_hdd_process_ftm_host_cmd
3111(
3112 hdd_context_t *pHddCtx,
3113 void *ftmCmd
3114)
3115{
3116 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3117 int needToRouteHal = 1;
3118 int hostState = 1;
3119
3120 switch(pFTMCmd->msgId)
3121 {
3122 case PTT_MSG_GET_NV_TABLE:
3123 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3124 needToRouteHal = 0;
3125 break;
3126
3127 case PTT_MSG_SET_NV_TABLE:
3128 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3129 /* Temp NV Operation will be isolated to host
3130 needToRouteHal = 1; */
3131 needToRouteHal = 0;
3132 break;
3133
3134 case PTT_MSG_BLANK_NV:
3135 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3136 needToRouteHal = 1;
3137 break;
3138
3139 case PTT_MSG_DEL_NV_TABLE:
3140 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3141 needToRouteHal = 1;
3142 break;
3143
3144 case PTT_MSG_GET_NV_FIELD:
3145 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3146 needToRouteHal = 0;
3147 break;
3148
3149 case PTT_MSG_SET_NV_FIELD:
3150 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3151 needToRouteHal = 0;
3152 break;
3153
3154 case PTT_MSG_STORE_NV_TABLE:
3155 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3156 needToRouteHal = 0;
3157 break;
3158
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003159 case PTT_MSG_GET_NV_BIN:
3160 case PTT_MSG_GET_DICTIONARY:
3161 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3162 needToRouteHal = 0;
3163 break;
3164
3165 case PTT_MSG_SET_NV_BIN:
3166 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3167 needToRouteHal = 0;
3168 break;
3169
Jeff Johnson295189b2012-06-20 16:38:30 -07003170 case PTT_MSG_DBG_READ_REGISTER:
3171 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3172 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3173 needToRouteHal = 0;
3174 break;
3175
3176 case PTT_MSG_DBG_WRITE_REGISTER:
3177 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3178 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3179 needToRouteHal = 0;
3180 break;
3181
3182 case PTT_MSG_DBG_READ_MEMORY:
3183 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3184 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3185 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3186 needToRouteHal = 0;
3187 break;
3188
3189 case PTT_MSG_DBG_WRITE_MEMORY:
3190 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3191 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3192 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3193 needToRouteHal = 0;
3194 break;
3195
3196 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3197 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3198 needToRouteHal = 0;
3199 break;
3200
3201 default:
3202 needToRouteHal = 1;
3203 break;
3204 }
3205
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003206 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003207 {
3208 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3209 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003210 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003211 }
3212
3213 return needToRouteHal;
3214}
Jeff Johnson295189b2012-06-20 16:38:30 -07003215
3216/**---------------------------------------------------------------------------
3217
3218 \brief wlan_hdd_process_ftm_cmd() -
3219
3220 This function process the commands received from the ptt socket application.
3221
3222 \param - pAdapter - Pointer HDD Context.
3223
3224 \param - wnl - Pointer to the ANI netlink header.
3225
3226 \return - none
3227
3228 --------------------------------------------------------------------------*/
3229
3230void wlan_hdd_process_ftm_cmd
3231(
3232 hdd_context_t *pHddCtx,
3233 tAniNlHdr *wnl
3234)
3235{
3236 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3237 v_U16_t cmd_len;
3238 v_U8_t *pftm_data;
3239 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003240 int hostState;
3241 tPttMsgbuffer *tempRspBuffer = NULL;
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303242 static int count;
Jeff Johnson295189b2012-06-20 16:38:30 -07003243
3244 ENTER();
3245
Jeff Johnsone7245742012-09-05 17:12:55 -07003246 //Delay to fix NV write failure on JB
3247 vos_busy_wait(10000); //10ms
3248
Jeff Johnson295189b2012-06-20 16:38:30 -07003249 if (!pRequestBuf) {
3250
Arif Hussain6d2a3322013-11-17 19:50:10 -08003251 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003252 return ;
3253 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303254
3255 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3256 {
3257 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3258 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3259 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3260 return ;
3261 }
3262
Jeff Johnson295189b2012-06-20 16:38:30 -07003263 /*Save the received request*/
3264 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3265
3266 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3267 /*Save the received request netlink header used for sending the response*/
3268 pHddCtx->ftm.wnl = wnl;
3269 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3270
Arif Hussain6d2a3322013-11-17 19:50:10 -08003271 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003272
3273 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3274 wlan_ftm_send_response(pHddCtx);
3275 return ;
3276 }
3277
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303278 if (VOS_FTM_MODE != hdd_get_conparam())
3279 {
3280 count++;
3281 if (count == 1 || !(count % 10))
3282 {
3283 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Driver not loaded in FTM"
3284 " mode, current mode: %d ",__func__, hdd_get_conparam());
3285 }
3286 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3287 wlan_ftm_send_response(pHddCtx);
3288 return ;
3289 }
3290
Jeff Johnson295189b2012-06-20 16:38:30 -07003291 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3292 {
3293 case WLAN_FTM_START:
3294 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3295
Arif Hussain6d2a3322013-11-17 19:50:10 -08003296 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003297 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3298 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3299 wlan_ftm_send_response(pHddCtx);
3300 return;
3301 }
3302
3303 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3304 {
3305 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3306 ,__func__);
3307 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3308 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303309 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003310 return;
3311 }
3312 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3313 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3314 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3315 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3316
3317 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303318 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003319 break;
3320
3321 case WLAN_FTM_STOP:
3322 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3323
Arif Hussain6d2a3322013-11-17 19:50:10 -08003324 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003325 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3326 wlan_ftm_send_response(pHddCtx);
3327 return;
3328 }
3329
3330 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3331
3332 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3333 wlan_ftm_send_response(pHddCtx);
3334 return;
3335 }
3336
3337 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3338 /* This would send back the Command Success Status */
3339 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3340
3341 wlan_ftm_send_response(pHddCtx);
3342
3343 break;
3344
3345 case WLAN_FTM_CMD:
3346 /* if it is regular FTM command, pass it to HAL PHY */
3347 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003348 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003349 return;
3350 }
3351 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3352
Arif Hussain6d2a3322013-11-17 19:50:10 -08003353 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003354
3355 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3356 wlan_ftm_send_response(pHddCtx);
3357 return;
3358
3359 }
3360 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3361 cmd_len = pRequestBuf->ftm_hdr.data_len;
3362 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3363 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3364
Jeff Johnson295189b2012-06-20 16:38:30 -07003365 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3366 if (0 == hostState)
3367 {
3368 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3369 if (NULL == tempRspBuffer)
3370 {
3371 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003372 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003373 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3374 wlan_ftm_send_response(pHddCtx);
3375 return;
3376 }
3377 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3378 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3379 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3380 (unsigned char *) tempRspBuffer,
3381 tempRspBuffer->msgBodyLength);
3382 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3383 wlan_ftm_send_response(pHddCtx);
3384 vos_mem_free(tempRspBuffer);
3385 return;
3386 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003387 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003388 {
3389 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3390 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3391 wlan_ftm_send_response(pHddCtx);
3392 return;
3393 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003394
3395 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3396
Jeff Johnson295189b2012-06-20 16:38:30 -07003397
3398 /*Post the command to the HAL*/
3399 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3400
Arif Hussain6d2a3322013-11-17 19:50:10 -08003401 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003402 return;
3403
3404 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303405 /*After successful posting of message the command should be pending*/
3406 pHddCtx->ftm.IsCmdPending = TRUE;
3407
Jeff Johnson295189b2012-06-20 16:38:30 -07003408 /*Wait here until you get the response from HAL*/
3409 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3410 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303411 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3412 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3413 wlan_ftm_send_response(pHddCtx);
3414 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003415 return;
3416 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303417 /*This check will handle the case where the completion is sent by
3418 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3419 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3420 {
3421 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3422 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3423 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3424
3425 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3426 wlan_ftm_send_response(pHddCtx);
3427 pHddCtx->ftm.IsCmdPending = FALSE;
3428 return ;
3429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003430
3431 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3432
3433 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3434
3435 wlan_ftm_send_response(pHddCtx);
3436 pHddCtx->ftm.IsCmdPending = FALSE;
3437 break;
3438
3439 default:
3440
Arif Hussain6d2a3322013-11-17 19:50:10 -08003441 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003442 return;
3443 }
3444
3445 EXIT();
3446 return;
3447} /* wlan_adp_ftm_cmd() */
3448
3449/**---------------------------------------------------------------------------
3450
3451 \brief wlan_ftm_priv_start_stop_ftm() -
3452
3453 This function is used for start/stop the ftm driver.
3454
3455 \param - pAdapter - Pointer HDD Context.
3456 - start - 1/0 to start/stop ftm driver.
3457
3458 \return - 0 for success, non zero for failure
3459
3460 --------------------------------------------------------------------------*/
3461
3462static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3463 v_U16_t start)
3464{
3465 VOS_STATUS status;
3466 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3467
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003468 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003469 {
3470 pHddCtx->ftm.cmd_iwpriv = TRUE;
3471 status = wlan_hdd_ftm_start(pHddCtx);
3472
3473 if (status != VOS_STATUS_SUCCESS)
3474 {
3475 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3476 "FTM Start Failed");
3477 return VOS_STATUS_E_FAILURE;
3478 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303479 if (NULL == pMsgBuf)
3480 {
3481 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3482 if (NULL == pMsgBuf)
3483 {
3484 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3485 "%s:pMsgBuf is NULL", __func__);
3486 return VOS_STATUS_E_FAILURE;
3487 }
3488 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003489 }
3490 else
3491 {
3492 status = wlan_ftm_stop(pHddCtx);
3493
3494 if (status != VOS_STATUS_SUCCESS)
3495 {
3496 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3497 "FTM Stop Failed");
3498 return VOS_STATUS_E_FAILURE;
3499 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303500 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3501 if (pMsgBuf)
3502 {
3503 vos_mem_free((v_VOID_t * )pMsgBuf);
3504 pMsgBuf = NULL;
3505 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003506 }
3507 return VOS_STATUS_SUCCESS;
3508}
3509
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303510
3511static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3512{
3513 unsigned int *table = NULL;
3514 int index = 0;
3515
3516 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3517 table = valid_channel;
3518 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3519 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3520 table = valid_channel_cb40;
3521 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3522 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3523 table = valid_channel_cb80;
3524
3525 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303526 {
3527 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3528 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303529 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303530 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303531
3532 while (table[index] != 0)
3533 {
3534 if (table[index] == channel)
3535 return VOS_STATUS_SUCCESS;
3536
3537 index++;
3538 }
3539
3540 return VOS_STATUS_E_FAILURE;
3541}
3542
3543
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303544static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3545{
3546 unsigned int primary_channel = center_channel;
3547
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303548 switch (cb)
3549 {
3550 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3551 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3552 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3553 primary_channel -= 2;
3554 break;
3555
3556
3557 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3558 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3559 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3560 primary_channel += 2;
3561 break;
3562
3563 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3564 primary_channel -= 6;
3565 break;
3566
3567 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3568 primary_channel += 6;
3569 break;
3570 }
3571
3572 return primary_channel;
3573
3574}
3575
Jeff Johnson295189b2012-06-20 16:38:30 -07003576/**---------------------------------------------------------------------------
3577
3578 \brief wlan_ftm_priv_set_channel() -
3579
3580 This function is used for setting the channel to the halphy ptt module.
3581
3582 \param - pAdapter - Pointer HDD Context.
3583 - channel - Channel Number 1-14.
3584
3585 \return - 0 for success, non zero for failure
3586
3587 --------------------------------------------------------------------------*/
3588
3589static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3590{
Jeff Johnson295189b2012-06-20 16:38:30 -07003591 uPttMsgs *pMsgBody;
3592 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303593 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003594 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3595
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303596 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003597 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303598 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3599 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 return VOS_STATUS_E_FAILURE;
3601 }
3602
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303603 if (NULL == pMsgBuf)
3604 {
3605 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3606 "%s:pMsgBuf is NULL", __func__);
3607 return VOS_STATUS_E_NOMEM;
3608 }
3609
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303610 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003611 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303612 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3613 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003614 return VOS_STATUS_E_FAILURE;
3615 }
3616
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303617 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003618 init_completion(&pHddCtx->ftm.ftm_comp_var);
3619 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3620 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3621
3622 pMsgBody = &pMsgBuf->msgBody;
3623
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303624 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003625
Arif Hussain6d2a3322013-11-17 19:50:10 -08003626 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303627 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003628
3629 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3630
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303631 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003632 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303633 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3634 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003635 status = VOS_STATUS_E_FAILURE;
3636 goto done;
3637
3638 }
c_hpothuffdb5272013-10-02 16:42:35 +05303639 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303640 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303641 if (0 >= ret )
3642 {
3643 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3644 FL("wait on ftm_comp_var failed %ld"), ret);
3645 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003646
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303647 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003648 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303649 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3650 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003651 status = VOS_STATUS_E_FAILURE;
3652 goto done;
3653
3654 }
3655done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003656
3657 return status;
3658}
3659
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05303660static VOS_STATUS wlan_ftm_priv_set_dump(hdd_adapter_t *pAdapter, int *value)
3661{
3662 uPttMsgs *pMsgBody;
3663 VOS_STATUS status;
3664 long ret;
3665 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3666
3667 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3668 {
3669 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3670 "%s:Ftm has not started. Please start the ftm. ", __func__);
3671 return VOS_STATUS_E_FAILURE;
3672 }
3673
3674 if (NULL == pMsgBuf)
3675 {
3676 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3677 "%s:pMsgBuf is NULL", __func__);
3678 return VOS_STATUS_E_NOMEM;
3679 }
3680
3681 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
3682 init_completion(&pHddCtx->ftm.ftm_comp_var);
3683 pMsgBuf->msgId = PTT_MSG_PRIMA_GENERIC_CMD;
3684 pMsgBuf->msgBodyLength = sizeof(tMsgPttPrimaGenericCmd) + PTT_HEADER_LENGTH;
3685
3686 pMsgBody = &pMsgBuf->msgBody;
3687
3688 pMsgBody->PrimaGenericCmd.cmdIdx = value[0];
3689 pMsgBody->PrimaGenericCmd.param1 = value[1];
3690 pMsgBody->PrimaGenericCmd.param2 = value[2];
3691 pMsgBody->PrimaGenericCmd.param3 = value[3];
3692 pMsgBody->PrimaGenericCmd.param4 = value[4];
3693
3694 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3695
3696 if (status != VOS_STATUS_SUCCESS)
3697 {
3698 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3699 "%s:wlan_ftm_postmsg failed", __func__);
3700 status = VOS_STATUS_E_FAILURE;
3701 goto done;
3702 }
3703
3704 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3705 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3706 if (0 >= ret )
3707 {
3708 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3709 FL("wait on ftm_comp_var failed %ld"), ret);
3710 }
3711
3712 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3713 {
3714 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3715 "%s:Ptt response status failed", __func__);
3716 }
3717
3718 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3719 {
3720 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3721 "%s:Ptt response status failed", __func__);
3722 status = VOS_STATUS_E_FAILURE;
3723 goto done;
3724 }
3725
3726done:
3727 return status;
3728}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303729
3730/**---------------------------------------------------------------------------
3731
3732 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3733
3734 This function is used for setting the power control mode for tx.
3735
3736 \param - pAdapter - Pointer HDD Context.
3737 - pwr_mode - power control mode 0-2.
3738
3739 \return - 0 for success, non zero for failure
3740
3741 --------------------------------------------------------------------------*/
3742
3743static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3744 v_U16_t pwr_mode)
3745{
3746 uPttMsgs *pMsgBody;
3747 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303748 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303749 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3750
3751 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3752 {
3753 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3754 "%s:Ftm has not started. Please start the ftm. ", __func__);
3755 return VOS_STATUS_E_FAILURE;
3756 }
3757
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303758 if (NULL == pMsgBuf)
3759 {
3760 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3761 "%s:pMsgBuf is NULL", __func__);
3762 return VOS_STATUS_E_NOMEM;
3763 }
3764
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303765 if (pwr_mode > 2)
3766 {
3767 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3768 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3769 return VOS_STATUS_E_FAILURE;
3770 }
3771
3772 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3773 init_completion(&pHddCtx->ftm.ftm_comp_var);
3774 pMsgBody = &pMsgBuf->msgBody;
3775 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3776 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3777
3778 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3779 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3780
3781 if (status != VOS_STATUS_SUCCESS)
3782 {
3783 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3784 "%s:wlan_ftm_postmsg failed", __func__);
3785 status = VOS_STATUS_E_FAILURE;
3786 goto done;
3787 }
c_hpothuffdb5272013-10-02 16:42:35 +05303788 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303789 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303790 if (0 >= ret )
3791 {
3792 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3793 FL("wait on ftm_comp_var failed %ld"), ret);
3794 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303795
3796 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3797 {
3798 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3799 "%s:Ptt response status failed", __func__);
3800 status = VOS_STATUS_E_FAILURE;
3801 goto done;
3802 }
3803
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303804 ftm_status.powerCtlMode= pwr_mode;
3805
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303806 done:
3807 return status;
3808
3809}
3810
Jeff Johnson295189b2012-06-20 16:38:30 -07003811/**---------------------------------------------------------------------------
3812
3813 \brief wlan_ftm_priv_set_txpower() -
3814
3815 This function is used for setting the txpower to the halphy ptt module.
3816
3817 \param - pAdapter - Pointer HDD Context.
3818 - txpower - txpower Number 1-18.
3819
3820 \return - 0 for success, non zero for failure
3821
3822 --------------------------------------------------------------------------*/
3823
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303824static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3825 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003826{
Jeff Johnson295189b2012-06-20 16:38:30 -07003827 uPttMsgs *pMsgBody;
3828 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303829 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003830 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3831
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303832 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303834 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3835 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003836 return VOS_STATUS_E_FAILURE;
3837 }
3838
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303839 if (NULL == pMsgBuf)
3840 {
3841 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3842 "%s:pMsgBuf is NULL", __func__);
3843 return VOS_STATUS_E_NOMEM;
3844 }
3845
Jeff Johnson295189b2012-06-20 16:38:30 -07003846 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3847 * when tx pktgen is enabled
3848 */
3849 if (ftm_status.frameGenEnabled)
3850 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303851 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3852 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003853 return VOS_STATUS_E_FAILURE;
3854 }
3855
3856 if(!(txpower >= 9 && txpower <= 24))
3857 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303858 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3859 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003860 return VOS_STATUS_E_FAILURE;
3861 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003862
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303863 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3864 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003865 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003866 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3867 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3868
3869 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3870
3871 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3872
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303873 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003874 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303875 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3876 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003877 status = VOS_STATUS_E_FAILURE;
3878 goto done;
3879 }
c_hpothuffdb5272013-10-02 16:42:35 +05303880 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303881 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303882 if (0 >= ret )
3883 {
3884 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3885 FL("wait on ftm_comp_var failed %ld"), ret);
3886 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003887
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303888 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003889 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303890 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3891 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003892 status = VOS_STATUS_E_FAILURE;
3893 goto done;
3894 }
3895
Jeff Johnson295189b2012-06-20 16:38:30 -07003896 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003897
3898 return status;
3899
3900}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303901
3902
3903static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3904 v_U16_t enable)
3905{
3906 tANI_U32 value = 0;
3907 tANI_U32 reg_addr;
3908 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303909
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303910 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3911 {
3912 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3913 "%s:Ftm has not started. Please start the ftm. ", __func__);
3914 return VOS_STATUS_E_FAILURE;
3915 }
3916
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303917 reg_addr = WCNSS_TXFIR_OFFSET;
3918
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303919 wpalReadRegister(reg_addr, &value);
3920 if (enable)
3921 {
3922 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3923 }
3924 else
3925 {
3926 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3927 }
3928
3929 wpalWriteRegister(reg_addr, value);
3930
3931 return VOS_STATUS_SUCCESS;
3932}
3933
3934
Jeff Johnson295189b2012-06-20 16:38:30 -07003935/**---------------------------------------------------------------------------
3936
3937 \brief wlan_ftm_priv_set_txrate() -
3938
3939 This function is used for setting the txrate to the halphy ptt module.
3940 It converts the user input string for txrate to the tx rate index.
3941
3942 \param - pAdapter - Pointer HDD Context.
3943 - txrate - Pointer to the tx rate string.
3944
3945 \return - 0 for success, non zero for failure
3946
3947 --------------------------------------------------------------------------*/
3948
3949static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3950{
3951 int ii;
3952 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3953 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3954 {
3955 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3956 return VOS_STATUS_E_FAILURE;
3957 }
3958
3959 /* do not allow to change setting when tx pktgen is enabled */
3960 if (ftm_status.frameGenEnabled)
3961 {
3962 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3963 return VOS_STATUS_E_FAILURE;
3964 }
3965
3966 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3967 {
3968 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3969 break;
3970 }
3971 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3972 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003973 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003974 return VOS_STATUS_E_FAILURE;
3975 }
3976
3977 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3978 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3979
3980 return VOS_STATUS_SUCCESS;
3981}
3982
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303983
3984
3985static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3986 ePowerTempIndexSource pwr_source)
3987{
3988 uPttMsgs *pMsgBody;
3989 VOS_STATUS status;
3990 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3991
3992 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3993 {
3994 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3995 "%s:Ftm has not started. Please start the ftm. ", __func__);
3996 return VOS_STATUS_E_FAILURE;
3997 }
3998
3999 if (pwr_source > 3)
4000 {
4001 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
jge24d9bd42016-05-11 14:53:57 +08004002 "%s:invalid power index source. valid mode is 0, 1, 2, 3. ",
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304003 __func__);
4004 return VOS_STATUS_E_FAILURE;
4005 }
4006
4007 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
4008
4009 init_completion(&pHddCtx->ftm.ftm_comp_var);
4010 pMsgBody = &pMsgBuf->msgBody;
4011 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
4012 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
4013
4014 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
4015 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4016
4017 if (status != VOS_STATUS_SUCCESS)
4018 {
4019 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4020 "%s:wlan_ftm_postmsg failed", __func__);
4021 status = VOS_STATUS_E_FAILURE;
4022 goto done;
4023 }
4024 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4025 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4026
4027 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4028 {
4029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4030 "%s:Ptt response status failed", __func__);
4031 status = VOS_STATUS_E_FAILURE;
4032 goto done;
4033 }
4034
jge24d9bd42016-05-11 14:53:57 +08004035 ftm_status.powerIndex = pwr_source;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304036done:
4037
4038 return status;
4039}
4040
4041
Jeff Johnson295189b2012-06-20 16:38:30 -07004042/**---------------------------------------------------------------------------
4043
4044 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
4045
4046 This function is used for start/stop the tx packet generation.
4047
4048 \param - pAdapter - Pointer HDD Context.
4049 - startStop - Value( 1/0) start/stop the tx packet generation.
4050
4051 \return - 0 for success, non zero for failure
4052
4053 --------------------------------------------------------------------------*/
4054
4055static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
4056{
Jeff Johnson295189b2012-06-20 16:38:30 -07004057 uPttMsgs *pMsgBody;
4058 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304059 long ret;
4060
Jeff Johnson295189b2012-06-20 16:38:30 -07004061 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4062
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304063 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004064 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304065 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4066 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004067 return VOS_STATUS_E_FAILURE;
4068 }
4069
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304070 if (NULL == pMsgBuf)
4071 {
4072 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4073 "%s:pMsgBuf is NULL", __func__);
4074 return VOS_STATUS_E_NOMEM;
4075 }
4076
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304077 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07004078 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304079 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4080 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004081 return VOS_STATUS_E_FAILURE;
4082 }
4083
4084 if ((ftm_status.frameGenEnabled && startStop == 1) ||
4085 (!ftm_status.frameGenEnabled && startStop == 0))
4086 {
4087 return VOS_STATUS_SUCCESS ;
4088 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304089 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004090
Jeff Johnson295189b2012-06-20 16:38:30 -07004091 if (startStop == 1)
4092 {
4093 init_completion(&pHddCtx->ftm.ftm_comp_var);
4094 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4095 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4096 pMsgBody = &pMsgBuf->msgBody;
4097 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4098
4099 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304100 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004101 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304102 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4103 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004104 status = VOS_STATUS_E_FAILURE;
4105 goto done;
4106 }
4107
c_hpothuffdb5272013-10-02 16:42:35 +05304108 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304109 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304110 if (0 >= ret )
4111 {
4112 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4113 FL("wait on ftm_comp_var failed %ld"), ret);
4114 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304115 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004116 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304117 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4118 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004119 status = VOS_STATUS_E_FAILURE;
4120 goto done;
4121 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304122
4123 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4124 {
jge24d9bd42016-05-11 14:53:57 +08004125 status = wlan_ftm_priv_set_power_index(pAdapter,
4126 ftm_status.powerIndex);
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304127 if(status != VOS_STATUS_SUCCESS)
4128 {
4129 goto done;
4130 }
4131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004132 }
4133
4134 init_completion(&pHddCtx->ftm.ftm_comp_var);
4135 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4136 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4137 pMsgBody = &pMsgBuf->msgBody;
4138 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4139
4140 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4141 if(status != VOS_STATUS_SUCCESS)
4142 {
4143 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4144 status = VOS_STATUS_E_FAILURE;
4145 goto done;
4146 }
4147
c_hpothuffdb5272013-10-02 16:42:35 +05304148 ret = wait_for_completion_interruptible_timeout(
4149 &pHddCtx->ftm.ftm_comp_var,
4150 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4151 if (0 >= ret )
4152 {
4153 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4154 FL("wait on ftm_comp_var failed %ld"), ret);
4155 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004156 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4157 {
4158 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4159 status = VOS_STATUS_E_FAILURE;
4160 goto done;
4161 }
4162
4163done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004164
4165 if (status == VOS_STATUS_SUCCESS)
4166 {
4167 if (startStop == 1)
4168 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304169 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004170 }
4171 else
4172 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304173 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004174 }
4175 }
4176
4177 return status;
4178}
4179
4180
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304181
4182static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4183{
4184
4185 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4186 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4187 {
4188 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4189 "%s:Ftm has not started. Please start the ftm. ", __func__);
4190 return VOS_STATUS_E_FAILURE;
4191 }
4192
4193 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4194 {
4195 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4196 "%s:cb mode value is invalid ", __func__);
4197 return VOS_STATUS_E_FAILURE;
4198 }
4199
4200 ftm_status.cbmode = cbmode;
4201
4202 return VOS_STATUS_SUCCESS;
4203
4204}
4205
Jeff Johnson295189b2012-06-20 16:38:30 -07004206/**---------------------------------------------------------------------------
4207
4208 \brief wlan_ftm_rx_mode() -
4209
4210 This function is used for start/stop the rx packet generation.
4211
4212 \param - pAdapter - Pointer HDD Context.
4213 - rxmode - 0-disable RX.
4214 - 1-rx ALL frames
4215 - 2-rx 11 g/n frames
4216 - 3-rx 11b frames
4217
4218 \return - 0 for success, non zero for failure
4219
4220 --------------------------------------------------------------------------*/
4221
4222static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4223{
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 uPttMsgs *pMsgBody;
4225 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304226 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004227
4228 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304229 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004230 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304231 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4232 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004233 return VOS_STATUS_E_FAILURE;
4234 }
4235
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304236 if (NULL == pMsgBuf)
4237 {
4238 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4239 "%s:pMsgBuf is NULL", __func__);
4240 return VOS_STATUS_E_NOMEM;
4241 }
4242
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304243 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004244 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304245 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4246 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004247 return VOS_STATUS_E_FAILURE;
4248 }
4249
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304250 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004251 init_completion(&pHddCtx->ftm.ftm_comp_var);
4252
4253 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4254 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4255
4256 pMsgBody = &pMsgBuf->msgBody;
4257
4258 switch(rxmode)
4259 {
4260 case RXMODE_DISABLE_ALL:
4261 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4262 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4263 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4264 break;
4265
4266 case RXMODE_ENABLE_ALL:
4267 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4268 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4269 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4270 break;
4271
4272 case RXMODE_ENABLE_11GN:
4273 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4274 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4275 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4276 break;
4277
4278 case RXMODE_ENABLE_11B:
4279 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4280 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4281 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4282 break;
4283
4284 }
4285
4286 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4287
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304288 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004289 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304290 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4291 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004292 status = VOS_STATUS_E_FAILURE;
4293 goto done;
4294 }
c_hpothuffdb5272013-10-02 16:42:35 +05304295 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304296 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304297 if (0 >= ret )
4298 {
4299 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4300 FL(" wait on ftm_comp_var failed %ld"), ret);
4301 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004302
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304303 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004304 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304305 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4306 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004307 status = VOS_STATUS_E_FAILURE;
4308 goto done;
4309 }
4310 ftm_status.rxmode = rxmode ;
4311done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004312
4313 return status;
4314}
4315
4316/**---------------------------------------------------------------------------
4317
4318 \brief wlan_ftm_priv_rx_pkt_clear() -
4319
4320 This function sets the rx pkt count to zero.
4321
4322 \param - pAdapter - Pointer HDD Context.
4323 - rx_pkt_clear - rx_pkt_clear value.
4324
4325 \return - 0 for success, non zero for failure
4326
4327 --------------------------------------------------------------------------*/
4328
4329static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4330{
Jeff Johnson295189b2012-06-20 16:38:30 -07004331 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304332 long ret;
4333
Jeff Johnson295189b2012-06-20 16:38:30 -07004334 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4335
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304336 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004337 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304338 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4339 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004340 return VOS_STATUS_E_FAILURE;
4341 }
4342
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304343 if (NULL == pMsgBuf)
4344 {
4345 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4346 "%s:pMsgBuf is NULL", __func__);
4347 return VOS_STATUS_E_NOMEM;
4348 }
4349
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304350 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004351 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304352 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4353 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004354 return VOS_STATUS_E_FAILURE;
4355 }
4356
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304357 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004358 init_completion(&pHddCtx->ftm.ftm_comp_var);
4359 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304360 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004361
Jeff Johnson295189b2012-06-20 16:38:30 -07004362 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4363
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304364 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004365 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304366 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4367 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004368 status = VOS_STATUS_E_FAILURE;
4369 goto done;
4370 }
c_hpothuffdb5272013-10-02 16:42:35 +05304371 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304372 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304373 if (0 >= ret )
4374 {
4375 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4376 FL("wait on ftm_comp_var failed %ld"), ret);
4377 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004378
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304379 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004380 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304381 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4382 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004383 status = VOS_STATUS_E_FAILURE;
4384 goto done;
4385 }
4386done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004387
4388 return status;
4389}
4390
4391/**---------------------------------------------------------------------------
4392
4393 \brief wlan_ftm_priv_get_channel() -
4394
4395 This function gets the channel number from the halphy ptt module and
4396 returns the channel number to the application.
4397
4398 \param - pAdapter - Pointer HDD Context.
4399 - pChannel - Poniter to get the Channel number.
4400
4401 \return - 0 for success, non zero for failure
4402
4403 --------------------------------------------------------------------------*/
4404
4405static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4406{
Jeff Johnson295189b2012-06-20 16:38:30 -07004407 uPttMsgs *pMsgBody;
4408 VOS_STATUS status;
4409 v_U16_t freq;
c_hpothuffdb5272013-10-02 16:42:35 +05304410 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004411
4412 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304413 v_PVOID_t devHandle = pHddCtx->parent_dev;
4414 struct device *wcnss_device = (struct device *)devHandle;
4415 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304416 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004417 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304418 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4419 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004420 return VOS_STATUS_E_FAILURE;
4421 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304422
4423 if (NULL == pMsgBuf)
4424 {
4425 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4426 "%s:pMsgBuf is NULL", __func__);
4427 return VOS_STATUS_E_NOMEM;
4428 }
4429
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304430 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004431 init_completion(&pHddCtx->ftm.ftm_comp_var);
4432 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4433 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4434
4435 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304436 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4437 if (NULL == wcnss_memory)
4438 {
4439 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4440 "%s: wcnss_memory is NULL", __func__);
4441 return VOS_STATUS_E_NOMEM;
4442 }
4443 else
4444 {
4445 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4446 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4447 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004448 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4449
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304450 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004451 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304452 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4453 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004454 status = VOS_STATUS_E_FAILURE;
4455 goto done;
4456
4457 }
c_hpothuffdb5272013-10-02 16:42:35 +05304458 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304459 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304460 if (0 >= ret )
4461 {
4462 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4463 FL("wait on ftm_comp_var failed %ld"), ret);
4464 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004465
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304466 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004467 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304468 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4469 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004470 status = VOS_STATUS_E_FAILURE;
4471 goto done;
4472 }
4473
4474 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4475
Hanumantha Reddy Pothulae950ada2015-10-13 19:39:35 +05304476 *pChannel = vos_freq_to_chan(freq);
4477 (*pChannel) ? (status = VOS_STATUS_SUCCESS) : (status = VOS_STATUS_E_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004478
Arif Hussain6d2a3322013-11-17 19:50:10 -08004479 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004480 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004481
4482 return status;
4483}
4484
4485/**---------------------------------------------------------------------------
4486
4487 \brief wlan_ftm_priv_get_txpower() -
4488
4489 This function gets the TX power from the halphy ptt module and
4490 returns the TX power to the application.
4491
4492 \param - pAdapter - Pointer HDD Context.
4493 - pTxPwr - Poniter to get the Tx power.
4494
4495 \return - 0 for success, non zero for failure
4496
4497 --------------------------------------------------------------------------*/
4498
4499static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4500{
Jeff Johnson295189b2012-06-20 16:38:30 -07004501 uPttMsgs *pMsgBody;
4502 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304503 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004504 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4505
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304506 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004507 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304508 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4509 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004510 return VOS_STATUS_E_FAILURE;
4511 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304512
4513 if (NULL == pMsgBuf)
4514 {
4515 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4516 "%s:pMsgBuf is NULL", __func__);
4517 return VOS_STATUS_E_NOMEM;
4518 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304519 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004520 init_completion(&pHddCtx->ftm.ftm_comp_var);
4521 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4522 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4523
4524 pMsgBody = &pMsgBuf->msgBody;
4525
4526 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4527
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304528 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004529 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304530 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4531 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004532 status = VOS_STATUS_E_FAILURE;
4533 goto done;
4534 }
c_hpothuffdb5272013-10-02 16:42:35 +05304535 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304536 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304537 if (0 >= ret )
4538 {
4539 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4540 FL("wait on ftm_comp_var failed %ld"), ret);
4541 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004542
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304543 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004544 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304545 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4546 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004547 status = VOS_STATUS_E_FAILURE;
4548 goto done;
4549 }
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304550 *pTxPwr = pMsgBody->GetTxPowerReport.pwrTemplateIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004551
4552 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004553
4554 return status;
4555}
4556
4557/**---------------------------------------------------------------------------
4558
Jeff Johnson295189b2012-06-20 16:38:30 -07004559 \brief wlan_ftm_priv_get_txrate() -
4560
4561 This function gets the TX rate from the halphy ptt module and
4562 returns the TX rate to the application.
4563
4564 \param - pAdapter - Pointer HDD Context.
4565 - pTxRate - Poniter to get the Tx rate.
4566
4567 \return - 0 for success, non zero for failure
4568
4569 --------------------------------------------------------------------------*/
4570
4571static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4572{
Hanumantha Reddy Pothula203a3942015-11-27 11:41:42 +05304573 VOS_STATUS status = VOS_STATUS_SUCCESS;
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304574 v_U16_t ii;
Jeff Johnson295189b2012-06-20 16:38:30 -07004575 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4576
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304577 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004578 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304579 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4580 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004581 return VOS_STATUS_E_FAILURE;
4582 }
4583
Jeff Johnson295189b2012-06-20 16:38:30 -07004584 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304585 if(rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
Jeff Johnson295189b2012-06-20 16:38:30 -07004586 break;
4587 }
4588 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4589 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004590 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004591 status = VOS_STATUS_E_FAILURE;
4592 goto done;
4593 }
4594 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
Jeff Johnson295189b2012-06-20 16:38:30 -07004595
Hanumantha Reddy Pothula6c6b6c12015-11-04 12:10:49 +05304596done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004597 return status;
4598
4599}
4600
4601/**---------------------------------------------------------------------------
4602
4603 \brief wlan_ftm_priv_get_rx_pkt_count() -
4604
4605 This function gets the rx pkt count from the halphy ptt module and
4606 returns the rx pkt count to the application.
4607
4608 \param - pAdapter - Pointer HDD Context.
4609 - pRxPktCnt - Poniter to get the rx pkt count.
4610
4611 \return - 0 for success, non zero for failure
4612
4613 --------------------------------------------------------------------------*/
4614
4615static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4616{
Jeff Johnson295189b2012-06-20 16:38:30 -07004617 uPttMsgs *pMsgBody;
4618 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304619 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004620 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304622 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004623 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4625 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004626 return VOS_STATUS_E_FAILURE;
4627 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304628
4629 if (NULL == pMsgBuf)
4630 {
4631 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4632 "%s:pMsgBuf is NULL", __func__);
4633 return VOS_STATUS_E_NOMEM;
4634 }
4635
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304636 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004637 init_completion(&pHddCtx->ftm.ftm_comp_var);
4638 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4639 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4640
4641 pMsgBody = &pMsgBuf->msgBody;
4642
4643 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4644
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304645 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004646 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304647 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4648 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004649 status = VOS_STATUS_E_FAILURE;
4650 goto done;
4651 }
c_hpothuffdb5272013-10-02 16:42:35 +05304652 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304653 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304654 if (0 >= ret )
4655 {
4656 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4657 FL("wait on ftm_comp_var failed %ld"), ret);
4658 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004659
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304660 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004661 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304662 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4663 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 status = VOS_STATUS_E_FAILURE;
4665 goto done;
4666 }
4667 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4668done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004669
4670 return status;
4671}
4672
4673/**---------------------------------------------------------------------------
4674
4675 \brief wlan_ftm_priv_get_rx_rssi() -
4676
4677 This function gets the rx rssi from the halphy ptt module and
4678 returns the rx rssi to the application.
4679
4680 \param - pAdapter - Pointer HDD Context.
4681 - buf - Poniter to get rssi of Rx chains
4682
4683 \return - 0 for success, non zero for failure
4684
4685 --------------------------------------------------------------------------*/
4686
4687static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4688{
Jeff Johnson295189b2012-06-20 16:38:30 -07004689 uPttMsgs *pMsgBody;
4690 VOS_STATUS status;
4691 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304692 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004693
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304694 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004695 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304696 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4697 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004698 return VOS_STATUS_E_FAILURE;
4699 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304700
4701 if (NULL == pMsgBuf)
4702 {
4703 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4704 "%s:pMsgBuf is NULL", __func__);
4705 return VOS_STATUS_E_NOMEM;
4706 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304707 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004708 init_completion(&pHddCtx->ftm.ftm_comp_var);
4709 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4710 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4711
4712 pMsgBody = &pMsgBuf->msgBody;
4713
4714 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4715
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304716 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304718 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4719 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004720 status = VOS_STATUS_E_FAILURE;
4721 goto done;
4722 }
c_hpothuffdb5272013-10-02 16:42:35 +05304723 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304724 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304725 if (0 >= ret )
4726 {
4727 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4728 FL("wait on ftm_comp_var failed %ld"), ret);
4729 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004730
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304731 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004732 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304733 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4734 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004735 status = VOS_STATUS_E_FAILURE;
4736 goto done;
4737 }
4738
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004739 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4740 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004741 pMsgBody->GetRxRssi.rssi.rx[1]);
4742
4743 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4744 {
4745 status = VOS_STATUS_E_FAILURE;
4746 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004747
Jeff Johnson295189b2012-06-20 16:38:30 -07004748done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004749
4750 return status;
4751}
4752
4753/**---------------------------------------------------------------------------
4754
4755 \brief wlan_ftm_priv_get_mac_address() -
4756
4757 This function gets the mac address from the halphy ptt module and
4758 returns the mac address to the application.
4759
4760 \param - pAdapter - Pointer HDD Context.
4761 - buf - Poniter to get the mac address.
4762
4763 \return - 0 for success, non zero for failure
4764
4765 --------------------------------------------------------------------------*/
4766
4767static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4768{
4769 v_BOOL_t itemIsValid = VOS_FALSE;
4770 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4771 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004772
Jeff Johnson295189b2012-06-20 16:38:30 -07004773 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4774
4775 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4776 {
4777 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4778 return VOS_STATUS_E_FAILURE;
4779 }
4780 /*Check the NV FIELD is valid or not*/
4781 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4782 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004783 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004784 {
4785 vos_nv_readMacAddress(macAddr);
4786
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004787 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4788 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004789 MAC_ADDR_ARRAY(macAddr));
4790 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4791 {
4792 return VOS_STATUS_E_FAILURE;
4793 }
4794 }
4795 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004796 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004797 {
4798 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004799 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4800 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004801 MAC_ADDR_ARRAY(macAddr));
4802
4803 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4804 {
4805 return VOS_STATUS_E_FAILURE;
4806 }
4807 }
4808 return VOS_STATUS_SUCCESS;
4809}
4810
4811/**---------------------------------------------------------------------------
4812
4813 \brief wlan_ftm_priv_set_mac_address() -
4814
4815 This function sets the mac address to the halphy ptt module and
4816 sends the netlink message to the ptt socket application which writes
4817 the macaddress to the qcom_wlan_nv.bin file
4818
4819 \param - pAdapter - Pointer HDD Context.
4820 - buf - Poniter to the macaddress.
4821
4822 \return - 0 for success, non zero for failure
4823
4824 --------------------------------------------------------------------------*/
4825
4826static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4827{
Jeff Johnson295189b2012-06-20 16:38:30 -07004828 uPttMsgs *pMsgBody;
4829 VOS_STATUS status;
4830 int macAddr[VOS_MAC_ADDRESS_LEN];
4831 v_U8_t *pMacAddress;
4832 v_U8_t ii;
4833 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304834 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004835
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304836 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004837 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304838 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4839 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004840 return VOS_STATUS_E_FAILURE;
4841 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304842 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004843 init_completion(&pHddCtx->ftm.ftm_comp_var);
4844 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4845 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4846
4847 pMsgBody = &pMsgBuf->msgBody;
4848 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4849
4850 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004851 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]))
4852 {
4853 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4854 "Invalid MacAddress Input %s", buf);
4855 return VOS_STATUS_E_FAILURE;
4856 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004857
Arif Hussain24bafea2013-11-15 15:10:03 -08004858 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4859 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004860
4861
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004862 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004863
4864 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4865 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4866
4867
Arif Hussain24bafea2013-11-15 15:10:03 -08004868 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4869 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004870 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4871
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304872 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004873 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304874 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4875 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004876 status = VOS_STATUS_E_FAILURE;
4877 goto done;
4878 }
c_hpothuffdb5272013-10-02 16:42:35 +05304879 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304880 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304881 if (0 >= ret )
4882 {
4883 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4884 FL("wait on ftm_comp_var failed %ld"), ret);
4885 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004886
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304887 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004888 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304889 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4890 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004891 status = VOS_STATUS_E_FAILURE;
4892 goto done;
4893 }
4894
Arif Hussain6d2a3322013-11-17 19:50:10 -08004895 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004896
4897 init_completion(&pHddCtx->ftm.ftm_comp_var);
4898 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4899
4900 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4901 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4902
4903 pMsgBody = &pMsgBuf->msgBody;
4904
4905 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4906
4907 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4908
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304909 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004910 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304911 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4912 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004913 status = VOS_STATUS_E_FAILURE;
4914 goto done;
4915 }
4916
c_hpothuffdb5272013-10-02 16:42:35 +05304917 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304918 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304919 if (0 >= ret )
4920 {
4921 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4922 FL("wait on ftm_comp_var failed %ld"), ret);
4923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004924done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004925
4926 return VOS_STATUS_SUCCESS;
4927}
4928
4929/* set param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304930static int __iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004931 union iwreq_data *wrqu, char *extra)
4932{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004933 int ret,sub_cmd;
4934 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304935 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004936 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004937 hdd_adapter_t *pAdapter;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304938 hdd_context_t *pHddCtx;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304939 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07004940
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304941 ENTER();
4942
Hanumantha Reddy Pothulac4928592015-10-27 16:49:59 +05304943 if (!capable(CAP_NET_ADMIN))
4944 {
4945 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4946 FL("permission check failed"));
4947 return -EPERM;
4948 }
4949
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004950 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304951 /* helper function to get iwreq_data with compat handling. */
4952 if (hdd_priv_get_data(&s_priv_data, wrqu))
4953 {
4954 return -EINVAL;
4955 }
4956
4957 /* make sure all params are correctly passed to function */
4958 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
4959 {
4960 return -EINVAL;
4961 }
4962
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304963 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4964 if (NULL == pAdapter)
4965 {
4966 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4967 "%s: Adapter is NULL",__func__);
4968 return -EINVAL;
4969 }
4970 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4971 ret = wlan_hdd_validate_context(pHddCtx);
4972 if (0 != ret)
4973 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304974 return ret;
4975 }
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304976 sub_cmd = s_priv_data.flags;
4977 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004978
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004979 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4980 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4981 * odd number which assigns set_args to zero.we assisgn memory using
4982 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004983 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004984 param = kzalloc(length + 1, GFP_KERNEL);
4985 if (!param)
4986 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004987
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304988 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004989 {
4990 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4991 "%s:Failed to get user data %s", __func__, param);
4992
4993 ret = -EINVAL;
4994 goto OUT;
4995 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004996
4997 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304998 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004999
5000 switch(sub_cmd)
5001 {
5002 case WE_SET_MAC_ADDRESS:
5003 {
5004
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005005 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005006 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005007
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005008 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005009
5010 if(status != VOS_STATUS_SUCCESS)
5011 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005012 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005013 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005014
Jeff Johnson295189b2012-06-20 16:38:30 -07005015 ret = -EINVAL;
5016 }
5017
Wilson Yang7c471652013-12-20 16:36:44 -08005018 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005019 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005020 case WE_SET_TX_RATE:
5021 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005022 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005023
5024 if(status != VOS_STATUS_SUCCESS)
5025 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005026 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005027 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005028
5029 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005030 }
5031
5032 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005033 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005034 default:
5035 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005036 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005037 ret = -EINVAL;
5038 break;
5039 }
5040 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005041
5042OUT:
5043 kfree(param);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305044 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005045 return ret;
5046}
5047
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305048static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
5049 union iwreq_data *wrqu, char *extra)
5050{
5051 int ret;
5052
5053 vos_ssr_protect(__func__);
5054 ret = __iw_ftm_setchar_getnone(dev, info, wrqu, extra);
5055 vos_ssr_unprotect(__func__);
5056
5057 return ret;
5058}
5059
5060static int __iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005061 union iwreq_data *wrqu, char *extra)
5062{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305063 hdd_adapter_t *pAdapter;
5064 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005065 int *value = (int *)extra;
5066 int sub_cmd = value[0];
5067 int set_value = value[1];
5068 int ret = 0; /* success */
5069 VOS_STATUS status;
5070
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305071 ENTER();
5072
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305073 pAdapter = (netdev_priv(dev));
5074 if (NULL == pAdapter)
5075 {
5076 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5077 return -EINVAL;
5078 }
5079 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5080 ret = wlan_hdd_validate_context(pHddCtx);
5081 if (0 != ret)
5082 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305083 return ret;
5084 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005085 switch(sub_cmd)
5086 {
5087 case WE_FTM_ON_OFF:
5088 {
5089 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5090
5091 if(status != VOS_STATUS_SUCCESS)
5092 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005093 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005094 ret = -EINVAL;
5095 }
5096
5097 break;
5098 }
5099
5100 case WE_TX_PKT_GEN:
5101 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5102
5103 if(status != VOS_STATUS_SUCCESS)
5104 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005105 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005106 ret = -EINVAL;
5107 }
5108 break;
5109
5110 case WE_SET_TX_IFS:
5111 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5112
5113 if(status != VOS_STATUS_SUCCESS)
5114 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005115 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005116 ret = -EINVAL;
5117 }
5118 break;
5119
5120 case WE_SET_TX_PKT_CNT:
5121 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5122
5123 if(status != VOS_STATUS_SUCCESS)
5124 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005125 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005126 ret = -EINVAL;
5127 }
5128 break;
5129
5130 case WE_SET_TX_PKT_LEN:
5131 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5132
5133 if(status != VOS_STATUS_SUCCESS)
5134 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005135 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005136 ret = -EINVAL;
5137 }
5138 break;
5139
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305140 case WE_TX_CW_RF_GEN:
5141 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5142
5143 if(status != VOS_STATUS_SUCCESS)
5144 {
5145 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5146 ret = -EINVAL;
5147 }
5148 break;
5149
Jeff Johnson295189b2012-06-20 16:38:30 -07005150 case WE_SET_CHANNEL:
5151 {
5152 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5153
5154 if(status != VOS_STATUS_SUCCESS)
5155 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005156 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005157 ret = -EINVAL;
5158 }
5159 break;
5160 }
5161 case WE_SET_TX_POWER:
5162 {
5163 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5164
5165 if(status != VOS_STATUS_SUCCESS)
5166 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005167 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005168 ret = -EINVAL;
5169 }
5170 break;
5171 }
5172 case WE_CLEAR_RX_PKT_CNT:
5173 {
5174 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5175
5176 if(status != VOS_STATUS_SUCCESS)
5177 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005178 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005179 ret = -EINVAL;
5180 }
5181 break;
5182 }
5183 case WE_RX:
5184 {
5185 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5186
5187 if(status != VOS_STATUS_SUCCESS)
5188 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005189 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005190 ret = -EINVAL;
5191 }
5192 break;
5193 }
5194 case WE_ENABLE_CHAIN:
5195 {
5196 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5197
5198 if(status != VOS_STATUS_SUCCESS)
5199 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005200 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005201 ret = -EINVAL;
5202 }
5203 break;
5204 }
5205
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305206 case WE_SET_PWR_CNTL_MODE:
5207 {
5208 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5209 if (status != VOS_STATUS_SUCCESS)
5210 {
5211 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5212 status);
5213 ret = -EINVAL;
5214 }
5215 break;
5216 }
5217
5218 case WE_ENABLE_DPD:
5219 {
5220 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5221 if (status != VOS_STATUS_SUCCESS)
5222 {
5223 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5224 ret = -EINVAL;
5225 }
5226 break;
5227 }
5228
5229 case WE_SET_CB:
5230 {
5231 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5232 if (status != VOS_STATUS_SUCCESS)
5233 {
5234 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5235 ret = -EINVAL;
5236 }
5237 break;
5238 }
5239
jge24d9bd42016-05-11 14:53:57 +08005240 case WE_SET_POWER_INDEX:
5241 {
5242 status = wlan_ftm_priv_set_power_index(pAdapter, set_value);
5243 if (status != VOS_STATUS_SUCCESS)
5244 {
5245 hddLog(VOS_TRACE_LEVEL_ERROR, "set power index failed = %d",
5246 status);
5247 ret = -EINVAL;
5248 }
5249 break;
5250 }
5251
Jeff Johnson295189b2012-06-20 16:38:30 -07005252 default:
5253 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005254 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005255 sub_cmd, set_value);
5256 break;
5257 }
5258 }
5259
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305260 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005261 return ret;
5262}
5263
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305264static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5265 union iwreq_data *wrqu, char *extra)
5266{
5267 int ret;
5268
5269 vos_ssr_protect(__func__);
5270 ret = __iw_ftm_setint_getnone(dev, info, wrqu, extra);
5271 vos_ssr_unprotect(__func__);
5272
5273 return ret;
5274}
Jeff Johnson295189b2012-06-20 16:38:30 -07005275/* get param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305276static int __iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005277 union iwreq_data *wrqu, char *extra)
5278{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305279 hdd_adapter_t *pAdapter;
5280 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005281 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005282 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005283 VOS_STATUS status;
5284
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305285 ENTER();
5286
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305287 pAdapter = (netdev_priv(dev));
5288 if (NULL == pAdapter)
5289 {
5290 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5291 return -EINVAL;
5292 }
5293 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5294 ret = wlan_hdd_validate_context(pHddCtx);
5295 if (0 != ret)
5296 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305297 return ret;
5298 }
5299
Jeff Johnson295189b2012-06-20 16:38:30 -07005300 switch (value[0])
5301 {
5302 case WE_GET_CHANNEL:
5303 {
5304 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5305
5306 if(status != VOS_STATUS_SUCCESS)
5307 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005308 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005309 ret = -EINVAL;
5310 }
5311 break;
5312 }
5313 case WE_GET_TX_POWER:
5314 {
5315 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5316
5317 if(status != VOS_STATUS_SUCCESS)
5318 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005319 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005320 ret = -EINVAL;
5321 }
5322 break;
5323 }
5324 case WE_GET_RX_PKT_CNT:
5325 {
5326 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5327
5328 if(status != VOS_STATUS_SUCCESS)
5329 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005330 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005331 ret = -EINVAL;
5332 }
5333 break;
5334 }
5335 default:
5336 {
5337 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5338 break;
5339 }
5340 }
5341
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305342 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005343 return ret;
5344}
5345
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305346static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5347 union iwreq_data *wrqu, char *extra)
5348{
5349 int ret;
5350
5351 vos_ssr_protect(__func__);
5352 ret = __iw_ftm_setnone_getint(dev, info, wrqu, extra);
5353 vos_ssr_unprotect(__func__);
5354
5355 return ret;
5356}
5357
5358static int __iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005359 union iwreq_data *wrqu, char *extra)
5360{
5361 int sub_cmd = wrqu->data.flags;
5362 VOS_STATUS status;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305363 hdd_adapter_t *pAdapter;
5364 hdd_context_t *pHddCtx;
5365 int ret = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005366
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305367 ENTER();
5368
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305369 pAdapter = (netdev_priv(dev));
5370 if (NULL == pAdapter)
5371 {
5372 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5373 return -EINVAL;
5374 }
5375 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5376 ret = wlan_hdd_validate_context(pHddCtx);
5377 if (0 != ret)
5378 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305379 return ret;
5380 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005381 switch(sub_cmd)
5382 {
5383 case WE_GET_MAC_ADDRESS:
5384 {
5385 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5386
5387 if(status != VOS_STATUS_SUCCESS)
5388 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005389 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005390 return -EINVAL;
5391 }
5392 wrqu->data.length = strlen(extra)+1;
5393 break;
5394 }
5395 case WE_GET_TX_RATE:
5396 {
5397 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5398
5399 if(status != VOS_STATUS_SUCCESS)
5400 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005401 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005402 return -EINVAL;
5403 }
5404
5405 wrqu->data.length = strlen(extra)+1;
5406 break;
5407 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005408 case WE_GET_FTM_STATUS:
5409 {
5410 status = wlan_ftm_priv_get_status(pAdapter, extra);
5411
5412 if(status != VOS_STATUS_SUCCESS)
5413 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005414 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005415 return -EINVAL;
5416 }
5417
5418 wrqu->data.length = strlen(extra)+1;
5419 break;
5420 }
5421 case WE_GET_RX_RSSI:
5422 {
5423 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5424
5425 if(status != VOS_STATUS_SUCCESS)
5426 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005427 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005428 return -EINVAL;
5429 }
5430
5431 wrqu->data.length = strlen(extra)+1;
5432 break;
5433 }
5434 default:
5435 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005436 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005437 break;
5438 }
5439 }
5440
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305441 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005442 return 0;
5443}
Jeff Johnson295189b2012-06-20 16:38:30 -07005444
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305445static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5446 union iwreq_data *wrqu, char *extra)
5447{
5448 int ret;
5449
5450 vos_ssr_protect(__func__);
5451 ret = __iw_ftm_get_char_setnone(dev, info, wrqu, extra);
5452 vos_ssr_unprotect(__func__);
5453
5454
5455 return ret;
5456}
5457
Jeff Johnson295189b2012-06-20 16:38:30 -07005458VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5459{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005460#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005461 tAniHdr *wmsg = NULL;
5462 v_U8_t *pBuf;
5463 hdd_context_t *pHddCtx = NULL;
5464 v_CONTEXT_t pVosContext= NULL;
5465
5466 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5467 if(pBuf == NULL)
5468 {
5469 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5470 return VOS_STATUS_E_NOMEM;
5471 }
5472 wmsg = (tAniHdr*)pBuf;
5473 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5474 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5475 wmsg->length = FTM_SWAP16(wmsg->length);
5476 pBuf += sizeof(tAniHdr);
5477
5478 /*Get the global context */
5479 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5480
5481 /*Get the Hdd Context */
5482 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5483 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5484
5485 /* EfS command Code */
5486 *(v_U32_t*)pBuf = 0x000000EF;
5487
5488 pBuf += sizeof(v_U32_t);
5489
5490 memcpy(pBuf, pData,data_len);
5491
5492 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305493 if( ptt_sock_send_msg_to_app(wmsg, 0,
5494 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005495
Arif Hussain6d2a3322013-11-17 19:50:10 -08005496 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 -07005497 vos_mem_free((v_VOID_t*)wmsg);
5498 return VOS_STATUS_E_FAILURE;
5499 }
5500 }
5501 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305502 if( ptt_sock_send_msg_to_app(wmsg, 0,
5503 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005504
Arif Hussain6d2a3322013-11-17 19:50:10 -08005505 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 -07005506 vos_mem_free((v_VOID_t*)wmsg);
5507 return VOS_STATUS_E_FAILURE;
5508 }
5509 }
5510
5511 vos_mem_free((v_VOID_t*)wmsg);
5512#endif //FTM and ANDROID
5513
5514 return VOS_STATUS_SUCCESS;
5515}
5516
Jeff Johnson295189b2012-06-20 16:38:30 -07005517/* action sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305518static int __iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005519 union iwreq_data *wrqu, char *extra)
5520{
5521 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005522 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005523
5524 switch (sub_cmd)
5525 {
5526 case WE_SET_NV_DEFAULTS:
5527 {
5528 v_U8_t *pu8buf,*pTempBuf;
5529 v_U16_t size;
5530 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005531 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005532 pu8buf = vos_mem_malloc(size);
5533 if(pu8buf == NULL)
5534 {
5535 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5536 return VOS_STATUS_E_NOMEM;
5537 }
5538 memset(pu8buf,0,size);
5539 pTempBuf = pu8buf;
5540 pTempBuf += sizeof(v_U32_t);
5541 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5542
5543 wlan_write_to_efs(pu8buf,size);
5544 vos_mem_free(pu8buf);
5545 }
5546
5547 default:
5548 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005549 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005550 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5551 break;
5552 }
5553 }
5554
5555 return ret;
5556}
5557
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305558static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5559 union iwreq_data *wrqu, char *extra)
5560{
5561 int ret;
5562
5563 vos_ssr_protect(__func__);
5564 ret = __iw_ftm_setnone_getnone(dev, info, wrqu, extra);
5565 vos_ssr_unprotect(__func__);
5566
5567 return ret;
5568}
5569
5570static int __iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305571 union iwreq_data *wrqu, char *extra)
5572{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305573 hdd_adapter_t *pAdapter;
5574 hdd_context_t *pHddCtx;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305575 int sub_cmd = wrqu->data.flags;
5576 int *value = (int*)wrqu->data.pointer;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305577 int ret = 0;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305578 VOS_STATUS status;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305579
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305580 ENTER();
5581
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305582 if(wrqu->data.length < 2)
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305583 {
Sushant Kaushik87787972015-09-11 16:05:00 +05305584 hddLog(LOGE, "Invalid number of Arguments %d ", wrqu->data.length);
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305585 return -EINVAL;
5586 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305587
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305588 pAdapter = (netdev_priv(dev));
5589 if (NULL == pAdapter)
5590 {
5591 hddLog(VOS_TRACE_LEVEL_ERROR,
5592 "%s: Adapter is NULL",__func__);
5593 return -EINVAL;
5594 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305595
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305596 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5597 ret = wlan_hdd_validate_context(pHddCtx);
5598 if (0 != ret)
5599 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305600 return ret;
5601 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305602
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305603 switch (sub_cmd)
5604 {
5605 case WE_SET_TX_WF_GAIN:
5606 {
5607 v_S15_t dGain = 0;
5608 v_U16_t rfGain = 0;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305609
5610 dGain = *(v_S15_t*) value++;
5611 rfGain = *(v_U16_t*) value;
5612 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5613
5614 if(status != VOS_STATUS_SUCCESS)
5615 {
5616 hddLog(VOS_TRACE_LEVEL_FATAL,
5617 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5618 return -EINVAL;
5619 }
5620 }
5621 break;
5622
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305623 case WE_SET_DUMP:
5624 if (*value == 1)
5625 {
5626 status = wlan_ftm_priv_set_dump(pAdapter, value);
5627 if(status != VOS_STATUS_SUCCESS)
5628 {
5629 hddLog(LOGE, "wlan_ftm_priv_set_dump Failed =%d\n",
5630 status);
5631 ret = -EINVAL;
5632 }
5633 }else
5634 {
5635 hddLog(LOGE, "%s arg[0]: %d expecting arg[0]: 1\n",
5636 __func__, *value);
5637 }
5638 break;
5639
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305640 default:
5641 {
Sushant Kaushik87787972015-09-11 16:05:00 +05305642 hddLog(LOGE, "Invalid IOCTL command %d ", sub_cmd );
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305643 break;
5644 }
5645 }
5646
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305647 EXIT();
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305648 return 0;
5649}
5650
5651
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305652static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5653 union iwreq_data *wrqu, char *extra)
5654{
5655 int ret;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305656 union iwreq_data u_priv_wrqu;
5657 int apps_args[MAX_VAR_ARGS] = {0};
5658 int num_args;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305659
Mukul Sharma188c67a2015-10-27 23:08:35 +05305660 if (!capable(CAP_NET_ADMIN))
5661 {
5662 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5663 FL("permission check failed"));
5664 return -EPERM;
5665 }
5666
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305667 /* helper function to get iwreq_data with compat handling. */
5668 if (hdd_priv_get_data(&u_priv_wrqu.data, wrqu))
5669 {
5670 return -EINVAL;
5671 }
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305672
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305673 if (NULL == u_priv_wrqu.data.pointer)
5674 {
5675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5676 "%s: NULL data pointer", __func__);
5677 return -EINVAL;
5678 }
5679
5680 num_args = u_priv_wrqu.data.length;
5681 if (num_args > MAX_VAR_ARGS)
5682 {
5683 num_args = MAX_VAR_ARGS;
5684 }
5685
5686 if (copy_from_user(apps_args, u_priv_wrqu.data.pointer,
5687 (sizeof(int)) * num_args))
5688 {
5689 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5690 "%s: failed to copy data from user buffer", __func__);
5691 return -EFAULT;
5692 }
5693
5694 vos_ssr_protect(__func__);
5695 ret = __iw_ftm_set_var_ints_getnone(dev, info, &u_priv_wrqu,
5696 (char *)&apps_args);
5697 vos_ssr_unprotect(__func__);
5698
5699 return ret;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305700}
5701
Jeff Johnson295189b2012-06-20 16:38:30 -07005702static const iw_handler we_ftm_private[] = {
5703
5704 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5705 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5706 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5707 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5708 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305709 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005710};
5711
5712/*Maximum command length can be only 15 */
5713static const struct iw_priv_args we_ftm_private_args[] = {
5714
5715 /* handlers for main ioctl */
5716 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5717 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5718 0,
5719 "" },
5720
5721 { WE_FTM_ON_OFF,
5722 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5723 0,
5724 "ftm" },
5725
5726 { WE_TX_PKT_GEN,
5727 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5728 0,
5729 "tx" },
5730
5731 { WE_SET_TX_IFS,
5732 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5733 0,
5734 "set_txifs" },
5735
5736 { WE_SET_TX_PKT_CNT,
5737 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5738 0,
5739 "set_txpktcnt" },
5740
5741 { WE_SET_TX_PKT_LEN,
5742 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5743 0,
5744 "set_txpktlen" },
5745
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305746 { WE_SET_TX_WF_GAIN,
5747 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5748 0,
5749 "set_tx_wf_gain" },
5750
5751 { WE_TX_CW_RF_GEN,
5752 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5753 0,
5754 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005755 { WE_SET_CHANNEL,
5756 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5757 0,
5758 "set_channel" },
5759
5760 { WE_SET_TX_POWER,
5761 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5762 0,
5763 "set_txpower" },
5764
5765 { WE_CLEAR_RX_PKT_CNT,
5766 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5767 0,
5768 "clr_rxpktcnt" },
5769
5770 { WE_RX,
5771 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5772 0,
5773 "rx" },
5774
5775 { WE_ENABLE_CHAIN,
5776 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5777 0,
5778 "ena_chain" },
5779
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305780 { WE_SET_PWR_CNTL_MODE,
5781 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5782 0,
5783 "pwr_cntl_mode" },
5784
5785 { WE_ENABLE_DPD,
5786 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5787 0,
5788 "ena_dpd" },
5789
5790 { WE_SET_CB,
5791 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5792 0,
5793 "set_cb" },
5794
jge24d9bd42016-05-11 14:53:57 +08005795 { WE_SET_POWER_INDEX,
5796 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5797 0,
5798 "set_power_index" },
5799
Jeff Johnson295189b2012-06-20 16:38:30 -07005800 /* handlers for main ioctl */
5801 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5802 0,
5803 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5804 "" },
5805
5806 { WE_GET_CHANNEL,
5807 0,
5808 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5809 "get_channel" },
5810
5811 { WE_GET_TX_POWER,
5812 0,
5813 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5814 "get_txpower" },
5815
5816 { WE_GET_RX_PKT_CNT,
5817 0,
5818 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5819 "get_rxpktcnt" },
5820
5821 /* handlers for main ioctl */
5822 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5823 IW_PRIV_TYPE_CHAR| 512,
5824 0,
5825 "" },
5826
5827 { WE_SET_MAC_ADDRESS,
5828 IW_PRIV_TYPE_CHAR| 512,
5829 0,
5830 "set_mac_address" },
5831
5832 { WE_SET_TX_RATE,
5833 IW_PRIV_TYPE_CHAR | 512,
5834 0,
5835 "set_txrate" },
5836
5837 /* handlers for main ioctl */
5838 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5839 0,
5840 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5841 "" },
5842
5843 { WE_GET_MAC_ADDRESS,
5844 0,
5845 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5846 "get_mac_address" },
5847
Jeff Johnson295189b2012-06-20 16:38:30 -07005848 { WE_GET_TX_RATE,
5849 0,
5850 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5851 "get_txrate" },
5852
5853 { WE_GET_FTM_STATUS,
5854 0,
5855 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5856 "get_status" },
5857
5858 { WE_GET_RX_RSSI,
5859 0,
5860 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5861 "get_rx_rssi" },
5862
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305863 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5864 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5865 0,
5866 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005867 /* handlers for main ioctl */
5868 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5869 0,
5870 0,
5871 "" },
5872
5873 /* handlers for sub-ioctl */
5874 { WE_SET_NV_DEFAULTS,
5875 0,
5876 0,
5877 "set_nv_defaults" },
5878
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305879 { WE_SET_DUMP,
5880 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5881 0,
5882 "dump" },
5883
Jeff Johnson295189b2012-06-20 16:38:30 -07005884};
5885
5886const struct iw_handler_def we_ftm_handler_def = {
5887 .num_standard = 0,
5888 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5889 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5890
5891 .standard = (iw_handler *)NULL,
5892 .private = (iw_handler *)we_ftm_private,
5893 .private_args = we_ftm_private_args,
5894 .get_wireless_stats = NULL,
5895};
5896
5897static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5898{
5899
5900 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5901
5902 // Zero the memory. This zeros the profile structure.
5903 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005904
Jeff Johnson295189b2012-06-20 16:38:30 -07005905 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5906
5907 return 0;
5908}
5909
Jeff Johnson295189b2012-06-20 16:38:30 -07005910
5911VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5912{
Jeff Johnson295189b2012-06-20 16:38:30 -07005913 ftm_rsp_msg_t *pFtmMsgRsp;
5914
5915 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5916 hdd_context_t *pHddCtx;
5917 v_CONTEXT_t pVosContext= NULL;
5918
5919 ENTER();
5920
5921 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5922
5923 if (!message )
5924 {
5925 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5926 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5927 return VOS_STATUS_E_INVAL;
5928 }
5929 /*Get the global context */
5930 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5931
5932 /*Get the Hdd Context */
5933 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5934
5935 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5936
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305937 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005938 complete(&pHddCtx->ftm.ftm_comp_var);
5939 }
5940 else {
5941 /*Response length to Ptt App*/
5942 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5943
5944 /*Ptt App expects the response length in LE */
5945 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5946
5947 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005948 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005949 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5950
5951 /*Copy the message*/
5952 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5953
5954 /*Update the error code*/
5955 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5956
5957 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5958
5959 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5960 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005961 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005962 return VOS_STATUS_E_FAILURE;
5963 }
5964 }
5965 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005966 return VOS_STATUS_SUCCESS;
5967
5968}