blob: e420de8dbb31004c2d983b8e2412b46ad7005402 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**========================================================================
29
30 \file wlan_hdd_ftm.c
31
32 \brief This file contains the WLAN factory test mode implementation
33
Jeff Johnson295189b2012-06-20 16:38:30 -070034
35 ========================================================================*/
36
37/**=========================================================================
38
39 EDIT HISTORY FOR FILE
40
41
42 This section contains comments describing changes made to the module.
43 Notice that changes are listed in reverse chronological order.
44
45
46 $Header:$ $DateTime: $ $Author: $
47
48
49 when who what, where, why
50 -------- --- --------------------------------------------------------
51 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
52 for FTM and mission mode
53 04/5/09 Shailender Created module.
54
55 ==========================================================================*/
56#include <vos_mq.h>
57#include "vos_sched.h"
58#include <vos_api.h>
59#include "sirTypes.h"
60#include "halTypes.h"
61#include "sirApi.h"
62#include "sirMacProtDef.h"
63#include "sme_Api.h"
64#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070065#include "wlan_qct_sys.h"
66#include "wlan_qct_tl.h"
67#include "wlan_hdd_misc.h"
68#include "i_vos_packet.h"
69#include "vos_nvitem.h"
70#include "wlan_hdd_main.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070071#include "qwlan_version.h"
72
Jeff Johnson295189b2012-06-20 16:38:30 -070073#include "wlan_nv.h"
74#include "wlan_qct_wda.h"
75#include "cfgApi.h"
76#include "pttMsgApi.h"
77#include "wlan_qct_pal_device.h"
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053078#include "linux/wcnss_wlan.h"
Anand N Sunkadc05b9c32015-06-18 18:54:53 +053079#include "qc_sap_ioctl.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070080
Jeff Johnson295189b2012-06-20 16:38:30 -070081#define RXMODE_DISABLE_ALL 0
82#define RXMODE_ENABLE_ALL 1
83#define RXMODE_ENABLE_11GN 2
84#define RXMODE_ENABLE_11B 3
85
86#define FTM_CHAIN_SEL_NO_RX_TX 0
87#define FTM_CHAIN_SEL_R0_ON 1
88#define FTM_CHAIN_SEL_T0_ON 2
89#define FTM_CHAIN_SEL_R0_T0_ON 3
mukul sharma0754d6b2015-05-22 18:49:41 +053090#define FTM_CHAIN_SEL_ANTENNA_0 7
91#define FTM_CHAIN_SEL_ANTENNA_1 8
92#define FTM_CHAIN_SEL_MAX 8
Jeff Johnson295189b2012-06-20 16:38:30 -070093
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053094#define WCNSS_TXFIR_OFFSET 0x00018000
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
Jeff Johnson295189b2012-06-20 16:38:30 -070097
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053098#ifndef QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET
99#define QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET 0x00013c34
Jeff Johnson295189b2012-06-20 16:38:30 -0700100#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
Anand N Sunkad5286f8a2014-08-22 14:57:43 +0530101#endif /* QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET */
Jeff Johnson295189b2012-06-20 16:38:30 -0700102
Jeff Johnson295189b2012-06-20 16:38:30 -0700103
Jeff Johnson295189b2012-06-20 16:38:30 -0700104/* To set 4MAC addresses from given first MAC address,
105 * Last byte value within given MAC address must less than 0xFF - 3 */
106#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700107#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700108
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530109#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
110
Jeff Johnson295189b2012-06-20 16:38:30 -0700111typedef struct {
112 tANI_U32 tableSize; /* Whole NV Table Size */
113 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
114 eNvTable nvTable;
115 tANI_U8 tableData; /* Filled by host driver */
116} pttGetNvTable;
117
118typedef struct {
119 tANI_U32 tableSize; /* Whole NV Table Size */
120 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
121 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700122 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700123} pttSetNvTable;
124
Jeff Johnson295189b2012-06-20 16:38:30 -0700125
126extern const sHalNv nvDefaults;
127static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700128static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700129VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700130
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700131/* for PRIMA: all the available frequency, channal pair i the table are defined for channel frequency @ RF center frequency
Jeff Johnson295189b2012-06-20 16:38:30 -0700132 Since it is associated to agc.channel_freq register for mapping.
133 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
134*/
135static const freq_chan_t freq_chan_tbl[] = {
136 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
137 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
138};
139
140static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
141{
142 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
143 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
144 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
145 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
146 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
147 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
148 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
149 //Spica_Virgo 11A 20MHz Rates
150 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
151 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
152 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
153 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
154 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
155 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
156 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
157 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
158
159//MCS Index #0-15 (20MHz)
160 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
161 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
162 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
163 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
164 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
165 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
166 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
167 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530168 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, "MCS_SG_7_2_MBPS"},
169 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS, "MCS_SG_14_4_MBPS"},
170 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS, "MCS_SG_21_7_MBPS"},
171 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS, "MCS_SG_28_9_MBPS"},
172 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS, "MCS_SG_43_3_MBPS"},
173 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS, "MCS_SG_57_8_MBPS"},
174 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, "MCS_SG_65_MBPS"},
175 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_SG_72_2_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530176
177//MCS Index #8-15 (40MHz)
178
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530179 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_5_MBPS" },
180 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
181 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
182 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
183 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
184 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
185 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
186 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530187 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
188 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
189 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
190 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
191 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
192 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
193 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800194 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530195
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800196#ifdef WLAN_FEATURE_11AC
197 /*11AC rate 20MHZ Normal GI*/
198 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
199 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
200 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
201 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
202 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
203 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
204 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
205 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
206 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530207#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800208 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530209#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800210
211 /*11AC rate 20MHZ Short GI*/
212 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
213 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
214 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
215 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
216 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
217 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
218 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
219 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
220 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530221#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800222 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530223#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800224
225 /*11AC rates 40MHZ normal GI*/
226 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
227 "MCS_VHT40_NGI_CB_13_5_MBPS"},
228 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
229 "MCS_VHT40_NGI_CB_27_MBPS"},
230 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
231 "MCS_VHT40_NGI_CB_40_5_MBPS"},
232 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
233 "MCS_VHT40_NGI_CB_54_MBPS"},
234 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
235 "MCS_VHT40_NGI_CB_81_MBPS"},
236 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
237 "MCS_VHT40_NGI_CB_108_MBPS"},
238 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
239 "MCS_VHT40_NGI_CB_121_5_MBPS"},
240 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
241 "MCS_VHT40_NGI_CB_135_MBPS"},
242 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
243 "MCS_VHT40_NGI_CB_162_MBPS"},
244 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
245 "MCS_VHT40_NGI_CB_180_MBPS"},
246
247 /*11AC rates 40MHZ short GI*/
248 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
249 "MCS_VHT40_SGI_CB_15_MBPS"},
250 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
251 "MCS_VHT40_SGI_CB_30_MBPS"},
252 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
253 "MCS_VHT40_SGI_CB_45_MBPS"},
254 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
255 "MCS_VHT40_SGI_CB_60_MBPS"},
256 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
257 "MCS_VHT40_SGI_CB_90_MBPS"},
258 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
259 "MCS_VHT40_SGI_CB_120_MBPS"},
260 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
261 "MCS_VHT40_SGI_CB_135_MBPS"},
262 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
263 "MCS_VHT40_SGI_CB_150_MBPS"},
264 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
265 "MCS_VHT40_SGI_CB_180_MBPS"},
266 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
267 "MCS_VHT40_SGI_CB_200_MBPS"},
268
269 /*11AC rates 80 MHZ normal GI*/
270 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
271 "MCS_VHT80_NGI_CB_29_3_MBPS"},
272 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
273 "MCS_VHT80_NGI_CB_58_5_MBPS"},
274 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
275 "MCS_VHT80_NGI_CB_87_8_MBPS"},
276 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
277 "MCS_VHT80_NGI_CB_117_MBPS"},
278 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
279 "MCS_VHT80_NGI_CB_175_5_MBPS"},
280 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
281 "MCS_VHT80_NGI_CB_234_MBPS"},
282 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
283 "MCS_VHT80_NGI_CB_263_3_MBPS"},
284 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
285 "MCS_VHT80_NGI_CB_292_5_MBPS"},
286 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
287 "MCS_VHT80_NGI_CB_351_MBPS"},
288 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
289 "MCS_VHT80_NGI_CB_390_MBPS"},
290
291 /*11AC rates 80 MHZ short GI*/
292 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
293 "MCS_VHT80_SGI_CB_32_5_MBPS"},
294 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
295 "MCS_VHT80_SGI_CB_65_MBPS"},
296 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
297 "MCS_VHT80_SGI_CB_97_5_MBPS"},
298 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
299 "MCS_VHT80_SGI_CB_130_MBPS"},
300 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
301 "MCS_VHT80_SGI_CB_195_MBPS"},
302 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
303 "MCS_VHT80_SGI_CB_260_MBPS"},
304 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
305 "MCS_VHT80_SGI_CB_292_5_MBPS"},
306 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
307 "MCS_VHT80_SGI_CB_325_MBPS"},
308 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
309 "MCS_VHT80_SGI_CB_390_MBPS"},
310 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
311 "MCS_VHT80_SGI_CB_433_3_MBPS"},
312#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700313};
314
315static rateIndex2Preamble_t rate_index_2_preamble_table[] =
316{
317
318 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
319 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
320 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
321 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
322 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
323 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
324 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
325
Jeff Johnson295189b2012-06-20 16:38:30 -0700326
327 //Spica_Virgo 11A 20MHz Rates
328 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
329 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
330 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
331 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
332 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
333 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
334 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
335 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
336
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530337 // 11A 20MHz Rates
338 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
339 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
340 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
341 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
342 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
343 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
344 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
345 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
346
Jeff Johnson295189b2012-06-20 16:38:30 -0700347 //MCS Index #0-15 (20MHz)
348 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
349 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
350 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
351 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
352 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
353 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
354 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
355 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
356 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
357 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
358 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
359 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
360 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
361 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
362 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
363 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530364
365 //MCS index (40MHz)
366 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
367 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
368 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
369 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
370 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
371 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
372 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
373 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
374 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
375 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
376 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
377 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
378 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
379 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
380 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800381 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530382
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800383#ifdef WLAN_FEATURE_11AC
384 /*11AC rate 20MHZ Normal GI*/
385 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
386 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
387 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
388 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
389 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
390 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
391 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
392 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
393 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530394#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800395 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530396#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800397 /*11AC rate 20MHZ Short GI*/
398 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
399 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
400 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
401 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530407#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800408 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530409#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800410
411 /*11AC rates 40MHZ normal GI*/
412 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
413 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
419 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
420 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
422
423 /*11AC rates 40MHZ short GI*/
424 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
425 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
426 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
431 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
432 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
433 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
434
435 /*11AC rates 80 MHZ normal GI*/
436 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
437 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
438 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
439 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
440 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
443 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
444 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
445 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
446
447 /*11AC rates 80 MHZ short GI*/
448 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
450 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
451 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
452 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
457 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
458#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700459};
460
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530461static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
462 11, 12, 13, 14, 36, 40, 44, 48,
463 52, 56, 60, 64, 100, 104, 108,
464 112, 116, 120, 124, 128, 132,
465 136, 140, 149, 153, 157, 161,
466 165, 208, 212, 216, 240, 244,
467 248, 252, 0 };
468static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
469 42, 46, 50, 54, 58, 62, 102, 106,
470 110, 114, 118, 122, 126, 130, 134,
471 138, 151, 155, 159, 163, 210, 214,
472 242, 246, 250, 0 };
473static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
474 114, 118, 122, 126, 130, 134, 155,
475 159, 246, 0 };
476
Jeff Johnson295189b2012-06-20 16:38:30 -0700477typedef struct
478{
479 tANI_BOOLEAN frameGenEnabled;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530480 tANI_BOOLEAN wfRfGenEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -0700481 tANI_BOOLEAN wfmEnabled;
482 sPttFrameGenParams frameParams;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530483 v_U16_t powerCtlMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700484 v_U16_t rxmode;
485 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530486 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700487
488} FTM_STATUS ;
489static FTM_STATUS ftm_status;
490
491//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530492static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700493
494static void _ftm_status_init(void)
495{
496 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
497 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
498 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
499
500 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
501 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530502 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700503 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530504 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700505 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
506 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530507 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700508 ftm_status.frameParams.payloadFillByte = 0xA5;
509 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
510 ftm_status.frameParams.tx_mode = 0;
511 ftm_status.frameParams.crc = 0;
512 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
513 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
514 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
515 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530516 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700517 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
518 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530519 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700520
521 return;
522}
523
524/**---------------------------------------------------------------------------
525
526 \brief wlan_ftm_postmsg() -
527
528 The function used for sending the command to the halphy.
529
530 \param - cmd_ptr - Pointer command buffer.
531
532 \param - cmd_len - Command length.
533
534 \return - 0 for success, non zero for failure
535
536 --------------------------------------------------------------------------*/
537
538static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
539{
540 vos_msg_t *ftmReqMsg;
541 vos_msg_t ftmMsg;
542 ENTER();
543
544 ftmReqMsg = (vos_msg_t *) cmd_ptr;
545
Jeff Johnson295189b2012-06-20 16:38:30 -0700546 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 ftmMsg.reserved = 0;
548 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
549 ftmMsg.bodyval = 0;
550
551 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700552 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700553 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700554 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800555 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700556
557 return VOS_STATUS_E_FAILURE;
558 }
559
560 EXIT();
561 return VOS_STATUS_SUCCESS;
562}
563
564/*---------------------------------------------------------------------------
565
566 \brief wlan_ftm_vos_open() - Open the vOSS Module
567
568 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
569 Upon successful initialization:
570
571 - All VOS submodules should have been initialized
572
573 - The VOS scheduler should have opened
574
575 - All the WLAN SW components should have been opened. This include
576 MAC.
577
578
Girish Gowli32fbe522014-05-08 20:27:04 +0530579 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700580
581
582 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
583 is ready to be used.
584
585 VOS_STATUS_E_RESOURCES - System resources (other than memory)
586 are unavailable to initialize the scheduler
587
588
589 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
590
591 \sa wlan_ftm_vos_open()
592
593---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530594static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700595{
596 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
597 int iter = 0;
598 tSirRetStatus sirStatus = eSIR_SUCCESS;
599 tMacOpenParameters macOpenParms;
600 pVosContextType gpVosContext = (pVosContextType)pVosContext;
601
602 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
603 "%s: Opening VOSS", __func__);
604
605 if (NULL == gpVosContext)
606 {
607 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
608 "%s: Trying to open VOSS without a PreOpen",__func__);
609 VOS_ASSERT(0);
610 return VOS_STATUS_E_FAILURE;
611 }
612
613 /* Initialize the probe event */
614 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
615 {
616 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
617 "%s: Unable to init probeEvent",__func__);
618 VOS_ASSERT(0);
619 return VOS_STATUS_E_FAILURE;
620 }
621
Jeff Johnson295189b2012-06-20 16:38:30 -0700622 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
623 {
624 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
625 "%s: Unable to init wdaCompleteEvent",__func__);
626 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700627
Jeff Johnson295189b2012-06-20 16:38:30 -0700628 goto err_probe_event;
629 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700630
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530631 if(vos_event_init(&(gpVosContext->fwLogsComplete)) != VOS_STATUS_SUCCESS )
632 {
633 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
634 "%s: Unable to init fwLogsComplete",__func__);
635 VOS_ASSERT(0);
636
637 goto err_wda_complete_event;
638 }
639
Jeff Johnson295189b2012-06-20 16:38:30 -0700640 /* Initialize the free message queue */
641 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
642 if (! VOS_IS_STATUS_SUCCESS(vStatus))
643 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700644 /* Critical Error ... Cannot proceed further */
645 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530646 "%s: Failed to initialize VOS free message queue %d",
647 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700648 VOS_ASSERT(0);
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530649 goto err_fw_logs_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700650 }
651
652 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
653 {
654 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
655 &(gpVosContext->aMsgBuffers[iter]);
656 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
657 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
658 }
659
660 /* Now Open the VOS Scheduler */
661 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
662 sizeof(VosSchedContext));
663
664 if (!VOS_IS_STATUS_SUCCESS(vStatus))
665 {
666 /* Critical Error ... Cannot proceed further */
667 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530668 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700669 VOS_ASSERT(0);
670 goto err_msg_queue;
671 }
672
673 /* Open the SYS module */
674 vStatus = sysOpen(gpVosContext);
675
676 if (!VOS_IS_STATUS_SUCCESS(vStatus))
677 {
678 /* Critical Error ... Cannot proceed further */
679 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530680 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700681 VOS_ASSERT(0);
682 goto err_sched_close;
683 }
684
Jeff Johnson295189b2012-06-20 16:38:30 -0700685 /*Open the WDA module */
686 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
687 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530688 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700689 if (!VOS_IS_STATUS_SUCCESS(vStatus))
690 {
691 /* Critical Error ... Cannot proceed further */
692 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530693 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700694 VOS_ASSERT(0);
695 goto err_sys_close;
696 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700697
698 /* initialize the NV module */
699 vStatus = vos_nv_open();
700 if (!VOS_IS_STATUS_SUCCESS(vStatus))
701 {
702 // NV module cannot be initialized, however the driver is allowed
703 // to proceed
704 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530705 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700706 goto err_wda_close;
707 }
708
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700709 vStatus = vos_nv_get_dictionary_data();
710
711 if (!VOS_IS_STATUS_SUCCESS(vStatus))
712 {
713 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530714 "%s : failed to get dictionary data for NV %d",
715 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700716 goto err_wda_close;
717 }
718
Jeff Johnson295189b2012-06-20 16:38:30 -0700719 /* If we arrive here, both threads dispacthing messages correctly */
720
721 /* Now proceed to open the MAC */
722
723 /* UMA is supported in hardware for performing the
724 frame translation 802.11 <-> 802.3 */
725 macOpenParms.frameTransRequired = 1;
726 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
727 &macOpenParms);
728
729 if (eSIR_SUCCESS != sirStatus)
730 {
731 /* Critical Error ... Cannot proceed further */
732 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530733 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700734 VOS_ASSERT(0);
735 goto err_nv_close;
736 }
737
Jeff Johnson295189b2012-06-20 16:38:30 -0700738 /* Now proceed to open the SME */
739 vStatus = sme_Open(gpVosContext->pMACContext);
740 if (!VOS_IS_STATUS_SUCCESS(vStatus))
741 {
742 /* Critical Error ... Cannot proceed further */
743 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530744 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700745 goto err_mac_close;
746 }
747 return VOS_STATUS_SUCCESS;
748
Jeff Johnson295189b2012-06-20 16:38:30 -0700749
750 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
751 "%s: VOSS successfully Opened",__func__);
752
753 return VOS_STATUS_SUCCESS;
754err_mac_close:
755 macClose(gpVosContext->pMACContext);
756
757err_nv_close:
758 vos_nv_close();
759
760err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700761 WDA_close(gpVosContext);
762
763err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700764 sysClose(gpVosContext);
765
766err_sched_close:
767 vos_sched_close(gpVosContext);
768err_msg_queue:
769 vos_mq_deinit(&gpVosContext->freeVosMq);
770
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530771err_fw_logs_complete_event:
772 vos_event_destroy(&gpVosContext->fwLogsComplete);
773
Jeff Johnson295189b2012-06-20 16:38:30 -0700774err_wda_complete_event:
775 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700776
777err_probe_event:
778 vos_event_destroy(&gpVosContext->ProbeEvent);
779
780 return VOS_STATUS_E_FAILURE;
781
782} /* wlan_ftm_vos_open() */
783
784/*---------------------------------------------------------------------------
785
786 \brief wlan_ftm_vos_close() - Close the vOSS Module
787
788 The \a wlan_ftm_vos_close() function closes the vOSS Module
789
790 \param vosContext context of vos
791
792 \return VOS_STATUS_SUCCESS - successfully closed
793
794 \sa wlan_ftm_vos_close()
795
796---------------------------------------------------------------------------*/
797
798static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
799{
800 VOS_STATUS vosStatus;
801 pVosContextType gpVosContext = (pVosContextType)vosContext;
802
Jeff Johnson295189b2012-06-20 16:38:30 -0700803 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
804 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
805 {
806 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530807 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700808 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
809 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700810
811 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
812 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
813 {
814 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530815 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700816 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
817 }
818
819 ((pVosContextType)vosContext)->pMACContext = NULL;
820
821 vosStatus = vos_nv_close();
822 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
823 {
824 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530825 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700826 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
827 }
828
829
830 vosStatus = sysClose( vosContext );
831 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
832 {
833 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530834 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700835 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
836 }
837
Jeff Johnson295189b2012-06-20 16:38:30 -0700838 vosStatus = WDA_close( vosContext );
839 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
840 {
841 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530842 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700843 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
844 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700845
846 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
847
848 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
849 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
850 {
851 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530852 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700853 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
854 }
855
Jeff Johnson295189b2012-06-20 16:38:30 -0700856 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
857 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
858 {
859 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530860 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700861 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
862 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700863
Sachin Ahuja715aafc2015-07-21 23:35:10 +0530864 vosStatus = vos_event_destroy(&gpVosContext->fwLogsComplete);
865 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
866 {
867 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
868 "%s: Failed to destroy fwLogsComplete %d", __func__, vosStatus);
869 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
870 }
871
Jeff Johnson295189b2012-06-20 16:38:30 -0700872 return VOS_STATUS_SUCCESS;
873}
874
875/**---------------------------------------------------------------------------
876
877 \brief wlan_ftm_priv_set_txifs() -
878
879 This function is used for
880
881 \param - pAdapter - Pointer HDD Context.
882 - ifs
883
884 \return - 0 for success, non zero for failure
885
886 --------------------------------------------------------------------------*/
887
888
889
890static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
891{
892 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
893 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
894 {
895 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
896 return VOS_STATUS_E_FAILURE;
897 }
898
899 /* do not allow to change setting when tx pktgen is enabled */
900 if (ftm_status.frameGenEnabled)
901 {
902 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
903 return VOS_STATUS_E_FAILURE;
904 }
905
906 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
907 {
c_hpothuffdb5272013-10-02 16:42:35 +0530908 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
909 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700910 return VOS_STATUS_E_FAILURE;
911 }
912
913 ftm_status.frameParams.interFrameSpace = ifs;
914
915 return VOS_STATUS_SUCCESS;
916}
917
918/**---------------------------------------------------------------------------
919
920 \brief wlan_ftm_priv_set_txpktcnt() -
921
922 This function is used for
923
924 \param - pAdapter - Pointer HDD Context.
925 - ifs
926
927 \return - 0 for success, non zero for failure
928
929 --------------------------------------------------------------------------*/
930
931static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
932{
933 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
934 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
935 {
936 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
937 return VOS_STATUS_E_FAILURE;
938 }
939
940 /* do not allow to change setting when tx pktgen is enabled */
941 if (ftm_status.frameGenEnabled)
942 {
943 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
944 return VOS_STATUS_E_FAILURE;
945 }
946
947 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
948 {
c_hpothuffdb5272013-10-02 16:42:35 +0530949 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
950 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700951 return VOS_STATUS_E_FAILURE;
952 }
953
954 ftm_status.frameParams.numTestPackets = cnt;
955
956 return VOS_STATUS_SUCCESS;
957}
958
959static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
960{
961 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
962 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
963 {
964 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
965 return VOS_STATUS_E_FAILURE;
966 }
967
968 /* do not allow to change setting when tx pktgen is enabled */
969 if (ftm_status.frameGenEnabled)
970 {
971 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
972 return VOS_STATUS_E_FAILURE;
973 }
974
975 if (len > 4095) //4096
976 {
c_hpothuffdb5272013-10-02 16:42:35 +0530977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
978 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700979 return VOS_STATUS_E_FAILURE;
980 }
981
982 ftm_status.frameParams.payloadLength = (tANI_U16)len;
983
984 return VOS_STATUS_SUCCESS;
985}
986
Jeff Johnson295189b2012-06-20 16:38:30 -0700987
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530988static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
989/**---------------------------------------------------------------------------
990<FTM_Command>set_tx_wf_gain
991<argument> is <n>
992Designates the number of amplitude gain (31 to 255).
993Description
994This command can be set only when Tx CW generation is stopped.
995--------------------------------------------------------------------------*/
996static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
997{
998 uPttMsgs *pMsgBody;
999 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1000 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
1001 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
1002 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1003 "%s:Ftm has not started. Please start the ftm.", __func__);
1004 return VOS_STATUS_E_FAILURE;
1005 }
1006
1007 if (ftm_status.wfRfGenEnabled) {
1008 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1009 "%s:cannot set gain when cwgen is enabled.", __func__);
1010 return VOS_STATUS_E_FAILURE;
1011 }
1012
1013 if (dGain > 24 || dGain <-39) {
1014 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1015 "%s:digital gain value is invalid", __func__);
1016 return VOS_STATUS_E_FAILURE;
1017 }
1018
Anand N Sunkadce9f8012015-04-14 19:24:43 +05301019 if (rfGain > 31) {
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301020 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1021 "%s:rf gain value is invalid", __func__);
1022 return VOS_STATUS_E_FAILURE;
1023 }
1024
1025 if (pMsgBuf == NULL) {
1026 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1027 "%s:pMsgBuf is NULL", __func__);
1028 return VOS_STATUS_E_NOMEM;
1029 }
1030
1031 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1032 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1033
1034 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1035 init_completion(&pHddCtx->ftm.ftm_comp_var);
1036 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1037 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1038 pMsgBody = &pMsgBuf->msgBody;
1039 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1040 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1041 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1042 VOS_STATUS_SUCCESS) {
1043 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1044 "%s:wlan_ftm_postmsg failed",__func__);
1045 return VOS_STATUS_E_FAILURE;
1046 }
1047
1048 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1049 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1050 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1051 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1052 "%s:Ptt response status failed",__func__);
1053 return VOS_STATUS_E_FAILURE;
1054 }
1055 return VOS_STATUS_SUCCESS;
1056}
1057
1058
1059/**---------------------------------------------------------------------------
1060 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1061 <argument> is < 1 | 0 >
1062 1 : Start Tx CW rf generation
1063 0 : Stop Tx CW rf generation
1064 Description
1065 This command starts/stops Tx CW rf generation.
1066--------------------------------------------------------------------------*/
1067static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1068{
1069 uPttMsgs *pMsgBody;
1070 VOS_STATUS status;
1071 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1072
1073 printk(KERN_EMERG "startStop: %02x ", startStop);
1074
1075 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1076 {
1077 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1078 "%s:Ftm has not started. Please start the ftm. ", __func__);
1079 return VOS_STATUS_E_FAILURE;
1080 }
1081
1082 if (startStop != 1 && startStop != 0)
1083 {
1084 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1085 "%s:Tx value is invalid ", __func__);
1086 return VOS_STATUS_E_FAILURE;
1087 }
1088
1089 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1090 (!ftm_status.wfRfGenEnabled && startStop == 0))
1091 {
1092 return VOS_STATUS_SUCCESS;
1093 }
1094
1095 if (pMsgBuf == NULL)
1096 {
1097 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1098 "%s:pMsgBuf is NULL", __func__);
1099 return VOS_STATUS_E_NOMEM;
1100 }
1101 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1102 if (startStop == 1) {
1103 tANI_U16 numSamples = 1;
1104 tANI_BOOLEAN clk80 = TRUE;
1105 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1106
1107 init_completion(&pHddCtx->ftm.ftm_comp_var);
1108 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1109 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1110 pMsgBody = &pMsgBuf->msgBody;
1111
1112 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1113 pMsgBody->SetWaveformRF.numSamples = numSamples;
1114 pMsgBody->SetWaveformRF.clk80 = clk80;
1115 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1116 if (status != VOS_STATUS_SUCCESS) {
1117 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1118 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1119 __func__);
1120 status = VOS_STATUS_E_FAILURE;
1121 goto done;
1122 }
1123 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1124 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1125 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1126 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1127 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1128 status = VOS_STATUS_E_FAILURE;
1129 goto done;
1130 }
1131 } else {
1132 init_completion(&pHddCtx->ftm.ftm_comp_var);
1133 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1134 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1135 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1136 if(status != VOS_STATUS_SUCCESS) {
1137 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1138 "%s:wlan_ftm_postmsg failed", __func__);
1139 status = VOS_STATUS_E_FAILURE;
1140 goto done;
1141 }
1142
1143 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1144 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1145 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1146 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1147 "%s:Ptt response status failed", __func__);
1148 status = VOS_STATUS_E_FAILURE;
1149 }
1150 }
1151done:
1152 if (status == VOS_STATUS_SUCCESS) {
1153 if (startStop == 1)
1154 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1155 else
1156 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1157 }
1158 return status;
1159}
1160
1161
Jeff Johnson295189b2012-06-20 16:38:30 -07001162static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1163{
Jeff Johnson295189b2012-06-20 16:38:30 -07001164 uPttMsgs *pMsgBody;
1165 VOS_STATUS status;
1166 v_U16_t chainSelect_save = chainSelect;
1167 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301168 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001169
1170 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1171 {
1172 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1173 return VOS_STATUS_E_FAILURE;
1174 }
1175
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05301176 if (NULL == pMsgBuf)
1177 {
1178 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1179 "%s:pMsgBuf is NULL", __func__);
1180 return VOS_STATUS_E_NOMEM;
1181 }
1182
Jeff Johnson295189b2012-06-20 16:38:30 -07001183 if (chainSelect > FTM_CHAIN_SEL_MAX)
1184 {
c_hpothuffdb5272013-10-02 16:42:35 +05301185 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1186 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001187 return VOS_STATUS_E_FAILURE;
1188 }
1189
1190 /* do not allow to change setting when tx pktgen is enabled */
1191 if (ftm_status.frameGenEnabled)
1192 {
1193 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1194 return VOS_STATUS_E_FAILURE;
1195 }
1196
1197 switch (chainSelect)
1198 {
1199 case FTM_CHAIN_SEL_NO_RX_TX:
1200 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1201 break;
1202
1203 case FTM_CHAIN_SEL_R0_ON:
1204 chainSelect = PHY_CHAIN_SEL_R0_ON;
1205 break;
1206
1207 case FTM_CHAIN_SEL_T0_ON:
1208 chainSelect = PHY_CHAIN_SEL_T0_ON;
1209 break;
mukul sharma0754d6b2015-05-22 18:49:41 +05301210
1211 case FTM_CHAIN_SEL_ANTENNA_0:
1212 chainSelect = PHY_CHAIN_SEL_ANT_0;
1213 break;
1214
1215 case FTM_CHAIN_SEL_ANTENNA_1:
1216 chainSelect = PHY_CHAIN_SEL_ANT_1;
1217 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07001218 }
1219
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301220 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001221 init_completion(&pHddCtx->ftm.ftm_comp_var);
1222 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1223 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1224
1225 pMsgBody = &pMsgBuf->msgBody;
1226 pMsgBody->EnableChains.chainSelect = chainSelect;
1227
1228 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1229
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301230 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001231 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301232 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1233 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001234 status = VOS_STATUS_E_FAILURE;
1235 goto done;
1236 }
c_hpothuffdb5272013-10-02 16:42:35 +05301237 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301238 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301239 if (0 >= ret)
1240 {
1241 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1242 FL("wait on ftm_comp_var failed %ld"), ret);
1243 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001244
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301245 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001246 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301247 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1248 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001249 status = VOS_STATUS_E_FAILURE;
1250 goto done;
1251 }
1252 ftm_status.chainSelect = chainSelect_save;
1253done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001254
1255 return status;
1256}
1257
1258/**---------------------------------------------------------------------------
1259 --------------------------------------------------------------------------*/
1260static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1261{
1262 int ii;
1263 int lenBuf = WE_FTM_MAX_STR_LEN;
1264 int lenRes = 0;
1265 char *chain[] = {
1266 "None",
1267 "R0,R1",
1268 "R0",
1269 "R1",
1270 "T0",
1271 "R0,R1,T0"
1272 };
1273 char *rx[] = {
1274 "disable",
1275 "11b/g/n",
1276 "11g/n",
1277 "11b"
1278 };
1279 char *tx[] = {
1280 "stopped",
1281 "started",
1282 };
1283 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1284
1285 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1286 {
1287 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1288 return VOS_STATUS_E_FAILURE;
1289 }
1290
1291 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001292 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001293 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1294 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001295 ftm_status.frameParams.interFrameSpace);
1296 if ((lenRes < 0) || (lenRes >= lenBuf))
1297 {
c_hpothuffdb5272013-10-02 16:42:35 +05301298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1299 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001300 return VOS_STATUS_E_FAILURE;
1301 }
1302
1303 buf += lenRes;
1304 lenBuf -= lenRes;
1305
1306 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1307 {
1308 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1309 break;
1310 }
1311
1312 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1313 {
1314 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1315 }
1316 else
1317 {
1318 lenRes = strlcpy(buf, "invalid", lenBuf);
1319 }
1320 if ((lenRes < 0) || (lenRes >= lenBuf))
1321 {
c_hpothuffdb5272013-10-02 16:42:35 +05301322 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1323 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001324 return VOS_STATUS_E_FAILURE;
1325 }
1326
1327 buf += lenRes;
1328 lenBuf -= lenRes;
1329
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301330 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1331 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001332 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001333 ftm_status.frameParams.payloadLength);
1334
1335 if ((lenRes < 0) || (lenRes >= lenBuf))
1336 {
c_hpothuffdb5272013-10-02 16:42:35 +05301337 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1338 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001339 return VOS_STATUS_E_FAILURE;
1340 }
1341
1342 return VOS_STATUS_SUCCESS;
1343}
1344
Jeff Johnson295189b2012-06-20 16:38:30 -07001345
1346void HEXDUMP(char *s0, char *s1, int len)
1347{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301348 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001349 printk(KERN_EMERG "%s\n :", s0);
1350
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301351 if (len > 8)
1352 {
1353 for (j = 0; j < len/8; j++)
1354 {
1355 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1356 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1357 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1358 }
1359 len = len - j*8;
1360 }
1361 for (i = 0; i< len; i++) {
1362 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001363 }
1364 printk("\n");
1365}
1366
Jeff Johnson295189b2012-06-20 16:38:30 -07001367/*---------------------------------------------------------------------------
1368
1369 \brief vos_ftm_preStart() -
1370
1371 The \a vos_ftm_preStart() function to download CFG.
1372 including:
1373 - ccmStart
1374
1375 - WDA: triggers the CFG download
1376
1377
1378 \param pVosContext: The VOS context
1379
1380
1381 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1382 is ready to be used.
1383
1384 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1385 are unavailable to initialize the scheduler
1386
1387
1388 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1389
1390 \sa vos_start
1391
1392---------------------------------------------------------------------------*/
1393VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1394{
1395 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1396 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001397
Jeff Johnson295189b2012-06-20 16:38:30 -07001398 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1399 "vos prestart");
1400
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001401 if (NULL == pVosContext->pWDAContext)
1402 {
1403 VOS_ASSERT(0);
1404 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1405 "%s: WDA NULL context", __func__);
1406 return VOS_STATUS_E_FAILURE;
1407 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001408
1409 /* call macPreStart */
1410 vStatus = macPreStart(pVosContext->pMACContext);
1411 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1412 {
1413 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1414 "Failed at macPreStart ");
1415 return VOS_STATUS_E_FAILURE;
1416 }
1417
1418 /* call ccmStart */
1419 ccmStart(pVosContext->pMACContext);
1420
1421 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001422 vos_event_reset(&pVosContext->wdaCompleteEvent);
1423
Jeff Johnson295189b2012-06-20 16:38:30 -07001424
1425 /*call WDA pre start*/
1426 vStatus = WDA_preStart(pVosContext);
1427 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1428 {
1429 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1430 "Failed to WDA prestart ");
1431 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1432 ccmStop(pVosContext->pMACContext);
1433 VOS_ASSERT(0);
1434 return VOS_STATUS_E_FAILURE;
1435 }
1436
1437 /* Need to update time out of complete */
1438 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1439 if ( vStatus != VOS_STATUS_SUCCESS )
1440 {
1441 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1442 {
1443 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001444 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001445 }
1446 else
1447 {
1448 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001449 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001450 }
1451 VOS_ASSERT( 0 );
1452 return VOS_STATUS_E_FAILURE;
1453 }
1454
1455 return VOS_STATUS_SUCCESS;
1456}
Jeff Johnson295189b2012-06-20 16:38:30 -07001457
1458/**---------------------------------------------------------------------------
1459
1460 \brief wlan_hdd_ftm_open() -
1461
1462 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1463
1464 \param - pAdapter - Pointer HDD Context.
1465
1466 \return - 0 for success, non zero for failure
1467
1468 --------------------------------------------------------------------------*/
1469
1470int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1471{
1472 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1473 pVosContextType pVosContext= NULL;
1474 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001475
Jeff Johnson295189b2012-06-20 16:38:30 -07001476 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1477 "%s: Opening VOSS", __func__);
1478
1479 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1480
1481 if (NULL == pVosContext)
1482 {
1483 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301484 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001485 VOS_ASSERT(0);
1486 goto err_vos_status_failure;
1487 }
1488
1489 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301490 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001491
1492 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1493 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301494 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001495 goto err_vos_status_failure;
1496 }
1497
Jeff Johnson295189b2012-06-20 16:38:30 -07001498 /*
1499 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1500 */
1501 /* Save the hal context in Adapter */
1502 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001503
1504 if ( NULL == pHddCtx->hHal )
1505 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301506 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301507 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001508 }
1509
1510 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1511 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1512 if( NULL == pAdapter )
1513 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301514 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301515 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001516 }
1517
1518 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1519 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301520 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301521 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001522 }
1523
1524 //Initialize the nlink service
1525 if(nl_srv_init() != 0)
1526 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301527 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001528 goto err_ftm_register_wext_close;
1529 }
1530
Leo Chang9e646082013-08-02 11:20:21 -07001531#ifdef WLAN_KD_READY_NOTIFIER
1532 pHddCtx->kd_nl_init = 1;
1533#endif /* WLAN_KD_READY_NOTIFIER */
1534
Jeff Johnson295189b2012-06-20 16:38:30 -07001535#ifdef PTT_SOCK_SVC_ENABLE
1536 //Initialize the PTT service
1537 if(ptt_sock_activate_svc(pHddCtx) != 0)
1538 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301539 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001540 goto err_nl_srv_init;
1541 }
1542#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001543
Jeff Johnson295189b2012-06-20 16:38:30 -07001544 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1545 pHddCtx->ftm.targetNVTableSize = 0;
1546 pHddCtx->ftm.targetNVTablePointer = NULL;
1547 pHddCtx->ftm.processedNVTableSize = 0;
1548 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1549 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1550 {
1551 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301552 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001553 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001554 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001555 }
1556 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001557
1558 _ftm_status_init();
1559 /* Initialize the ftm vos event */
1560 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1561 {
1562 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301563 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001564 VOS_ASSERT(0);
1565 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1566 goto err_nl_srv_init;
1567 }
1568
1569 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301570 init_completion(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07001571
1572 return VOS_STATUS_SUCCESS;
1573
1574err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001575#ifdef WLAN_KD_READY_NOTIFIER
1576nl_srv_exit(pHddCtx->ptt_pid);
1577#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001578nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001579#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001580err_ftm_register_wext_close:
1581hdd_UnregisterWext(pAdapter->dev);
1582
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301583err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001584err_adapter_open_failure:
1585hdd_close_all_adapters( pHddCtx );
1586
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301587err_ftm_vos_close:
1588 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001589err_vos_status_failure:
1590
1591 return VOS_STATUS_E_FAILURE;
1592}
1593
1594
1595
1596int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1597{
1598 VOS_STATUS vosStatus;
1599 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1600
1601 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1602 ENTER();
1603 if(pAdapter == NULL)
1604 {
1605 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1606 return VOS_STATUS_E_NOMEM;
1607 }
1608
Atul Mittalc41126d2014-03-17 15:10:11 +05301609 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1610 if (pHddCtx->ftm.IsCmdPending == TRUE)
1611 {
1612 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1613 {
1614 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1615 "%s: vos_event_set failed", __func__);
1616 }
1617 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001618 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1619 {
1620 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1621 "%s: Ftm has been started. stopping ftm", __func__);
1622 wlan_ftm_stop(pHddCtx);
1623 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001624
Leo Chang59cdc7e2013-07-10 10:08:21 -07001625#ifdef WLAN_KD_READY_NOTIFIER
1626 nl_srv_exit(pHddCtx->ptt_pid);
1627#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001628 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001629#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001630 //TODO----------
1631 //Deregister the device with the kernel
1632 hdd_UnregisterWext(pAdapter->dev);
1633
1634 hdd_close_all_adapters( pHddCtx );
1635#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001636 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001637 {
1638 unregister_netdev(pAdapter->dev);
1639 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1640 }
1641#endif
1642 //-----------------
1643
1644 vosStatus = vos_sched_close( vosContext );
1645 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1646 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1647 "%s: Failed to close VOSS Scheduler",__func__);
1648 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1649 }
1650
1651 //Close VOSS
1652 wlan_ftm_vos_close(vosContext);
1653
1654
1655 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1656 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1657 {
1658 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1659 "%s: Failed to destroy ftm_vos Event",__func__);
1660 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1661 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001662 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001663
Jeff Johnson295189b2012-06-20 16:38:30 -07001664 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001665}
1666
1667/**---------------------------------------------------------------------------
1668
1669 \brief wlan_ftm_send_response() -
1670
1671 The function sends the response to the ptt socket application running in user space.
1672
1673 \param - pAdapter - Pointer HDD Context.
1674
1675 \return - 0 for success, non zero for failure
1676
1677 --------------------------------------------------------------------------*/
1678
1679static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1680
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301681 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1682 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001683
Arif Hussain6d2a3322013-11-17 19:50:10 -08001684 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 -07001685 return VOS_STATUS_E_FAILURE;
1686 }
1687 return VOS_STATUS_SUCCESS;
1688}
1689
1690/**---------------------------------------------------------------------------
1691
1692 \brief wlan_hdd_ftm_start() -
1693
1694 This function gets called when the FTM start commands received from the ptt socket application and
1695 it starts the following modules.
1696 1) SAL Start.
1697 2) BAL Start.
1698 3) MAC Start to download the firmware.
1699
1700
1701 \param - pAdapter - Pointer HDD Context.
1702
1703 \return - 0 for success, non zero for failure
1704
1705 --------------------------------------------------------------------------*/
1706
1707static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1708{
1709 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1710 tSirRetStatus sirStatus = eSIR_SUCCESS;
1711 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1712 tHalMacStartParameters halStartParams;
1713
1714 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1715 {
1716 return VOS_STATUS_SUCCESS;
1717 }
1718
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301719 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTING;
1720
Jeff Johnson295189b2012-06-20 16:38:30 -07001721 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1722 "%s: Starting Libra SW", __func__);
1723
1724 /* We support only one instance for now ...*/
1725 if (pVosContext == NULL)
1726 {
1727 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001728 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001729 goto err_status_failure;
1730 }
1731
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001732
Jeff Johnson295189b2012-06-20 16:38:30 -07001733 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001734 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001735 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001736 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001737 goto err_status_failure;
1738 }
1739
Jeff Johnson295189b2012-06-20 16:38:30 -07001740 /*
1741 Prima needs to start the WDA correctly instead of BAL and SAL
1742 */
1743
1744 /* Vos preStart is calling */
1745 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1746 {
1747 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1748 goto err_status_failure;
1749 }
1750
1751
1752 vStatus = WDA_NVDownload_Start(pVosContext);
1753
1754 if ( vStatus != VOS_STATUS_SUCCESS )
1755 {
1756 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1757 "%s: Failed to start NV Download",__func__);
1758 return VOS_STATUS_E_FAILURE;
1759 }
1760
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301761 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001762
1763 if ( vStatus != VOS_STATUS_SUCCESS )
1764 {
1765 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1766 {
1767 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001768 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001769 }
1770 else
1771 {
1772 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001773 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001774 }
1775 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301776 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001777 }
1778
1779 vStatus = WDA_start(pVosContext);
1780 if (vStatus != VOS_STATUS_SUCCESS)
1781 {
1782 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1783 "%s: Failed to start WDA",__func__);
1784 goto err_status_failure;
1785 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001786
Jeff Johnson295189b2012-06-20 16:38:30 -07001787
1788 /* Start the MAC */
1789 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1790
Jeff Johnson295189b2012-06-20 16:38:30 -07001791
1792 halStartParams.driverType = eDRIVER_TYPE_MFG;
1793
1794 /* Start the MAC */
1795 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1796
Jeff Johnson295189b2012-06-20 16:38:30 -07001797
1798 if (eSIR_SUCCESS != sirStatus)
1799 {
1800 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1801 "%s: Failed to start MAC", __func__);
1802
Jeff Johnson295189b2012-06-20 16:38:30 -07001803 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001804 }
1805
1806 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1807 "%s: MAC correctly started",__func__);
1808
Jeff Johnson295189b2012-06-20 16:38:30 -07001809
1810 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1811
1812 return VOS_STATUS_SUCCESS;
1813
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001814err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001815 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1816 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1817 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1818 if(vStatus != VOS_STATUS_SUCCESS)
1819 {
1820 if(vStatus == VOS_STATUS_E_TIMEOUT)
1821 {
1822 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001823 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001824
1825 }
1826 else
1827 {
1828 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001829 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001830 }
1831 VOS_ASSERT(0);
1832 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001833
1834err_status_failure:
1835
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301836 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001837 return VOS_STATUS_E_FAILURE;
1838
1839}
1840
1841
1842static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1843{
1844 VOS_STATUS vosStatus;
1845
1846 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1847 {
1848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1849 return VOS_STATUS_E_FAILURE;
1850 }
1851
1852 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1853 {
1854 /* STOP MAC only */
1855 v_VOID_t *hHal;
1856 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1857 if (NULL == hHal)
1858 {
1859 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1860 "%s: NULL hHal", __func__);
1861 }
1862 else
1863 {
1864 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1865 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1866 {
1867 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1868 "%s: Failed to stop SYS", __func__);
1869 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1870 }
1871 }
1872
Jeff Johnson295189b2012-06-20 16:38:30 -07001873
Jeff Johnson295189b2012-06-20 16:38:30 -07001874 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001875
1876 }
1877 return WLAN_FTM_SUCCESS;
1878}
1879
Jeff Johnson295189b2012-06-20 16:38:30 -07001880/**---------------------------------------------------------------------------
1881
1882 \brief wlan_hdd_ftm_get_nv_table() -
1883 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001884 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001885
1886 \param - ftmCmd - Pointer FTM Commad Buffer
1887
1888 \return - int
1889 -1, Process Host command fail, vail out
1890 1, Process Host command success
1891
1892 --------------------------------------------------------------------------*/
1893int wlan_hdd_ftm_get_nv_table
1894(
1895 hdd_context_t *pHddCtx,
1896 tPttMsgbuffer *ftmCmd
1897)
1898{
1899 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1900 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1901 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001902 sHalNvV2 *nvContents = NULL;
1903 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001904
Jeff Johnson295189b2012-06-20 16:38:30 -07001905 if (NULL == pHddCtx)
1906 {
1907 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1908 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001909 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001910 }
1911
Leo Chang80de3c22013-11-26 10:52:12 -08001912 nvVersion = vos_nv_getNvVersion();
1913 if (E_NV_V2 != nvVersion)
1914 {
1915 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1916 "%s : Not valid NV Version %d", __func__, nvVersion);
1917 return -EINVAL;
1918 }
1919
Jeff Johnson295189b2012-06-20 16:38:30 -07001920 /* Test first chunk of NV table */
1921 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1922 (0 == pHddCtx->ftm.processedNVTableSize))
1923 {
1924 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1925 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1926 {
c_hpothuffdb5272013-10-02 16:42:35 +05301927 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1928 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001929 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001930 }
1931
1932 switch (nvTable->nvTable)
1933 {
1934 case NV_TABLE_RATE_POWER_SETTINGS:
1935 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1936 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1937 break;
1938
1939 case NV_TABLE_REGULATORY_DOMAINS:
1940 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1941 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1942 break;
1943
1944 case NV_TABLE_DEFAULT_COUNTRY:
1945 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1946 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1947 break;
1948
1949 case NV_TABLE_TPC_POWER_TABLE:
1950 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1951 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1952 break;
1953
1954 case NV_TABLE_TPC_PDADC_OFFSETS:
1955 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1956 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1957 break;
1958
1959 case NV_TABLE_VIRTUAL_RATE:
1960 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1961 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1962 break;
1963
1964 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1965 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1966 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1967 break;
1968
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001969 case NV_TABLE_HW_CAL_VALUES:
1970 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1971 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1972 break;
1973
1974 case NV_TABLE_FW_CONFIG:
1975 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1976 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001977 break;
1978
1979 case NV_TABLE_ANTENNA_PATH_LOSS:
1980 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1981 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1982 break;
1983
1984 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1985 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1986 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1987 break;
1988
1989 default:
1990 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1991 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001992 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001993 break;
1994 }
1995
1996 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1997 {
1998 /* Invalid table size, discard and initialize data */
1999 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002000 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002001 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002002 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002003 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2004 pHddCtx->ftm.targetNVTableSize = 0;
2005 pHddCtx->ftm.processedNVTableSize = 0;
2006 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002007 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002008 }
2009
2010 /* Set Current Processing NV table type */
2011 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2012 /* Copy target NV table value into temp context buffer */
2013 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2014 pHddCtx->ftm.targetNVTablePointer,
2015 pHddCtx->ftm.targetNVTableSize);
2016
2017 }
2018
2019 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2020 {
2021 /* Invalid table type */
2022 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2023 "Invalid NV Table, now Processing %d, not %d",
2024 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2025 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2026 pHddCtx->ftm.targetNVTableSize = 0;
2027 pHddCtx->ftm.processedNVTableSize = 0;
2028 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002029
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002030 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002031 }
2032
2033 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002034 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002035 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2036 nvTable->chunkSize);
2037 /* Update processed pointer to prepare next chunk copy */
2038 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2039
2040 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2041 {
2042 /* Finished to process last chunk of data, initialize buffer */
2043 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2044 pHddCtx->ftm.targetNVTableSize = 0;
2045 pHddCtx->ftm.processedNVTableSize = 0;
2046 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2047 }
2048
2049 return 1;
2050}
2051
2052/**---------------------------------------------------------------------------
2053
2054 \brief wlan_hdd_ftm_set_nv_table() -
2055 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002056 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002057
2058 \param - ftmCmd - Pointer FTM Commad Buffer
2059
2060 \return - int
2061 -1, Process Host command fail, vail out
2062 1, Process Host command success
2063
2064 --------------------------------------------------------------------------*/
2065int wlan_hdd_ftm_set_nv_table
2066(
2067 hdd_context_t *pHddCtx,
2068 tPttMsgbuffer *ftmCmd
2069)
2070{
2071 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2072 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2073 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002074 sHalNvV2 *nvContents = NULL;
2075 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002076
2077 if (NULL == pHddCtx)
2078 {
2079 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2080 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002081 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002082 }
2083
Leo Chang80de3c22013-11-26 10:52:12 -08002084 nvVersion = vos_nv_getNvVersion();
2085 if (E_NV_V2 != nvVersion)
2086 {
2087 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2088 "%s : Not valid NV Version %d", __func__, nvVersion);
2089 return -EINVAL;
2090 }
2091
Jeff Johnson295189b2012-06-20 16:38:30 -07002092 /* Test first chunk of NV table */
2093 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2094 (0 == pHddCtx->ftm.processedNVTableSize))
2095 {
2096 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2097 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2098 {
c_hpothuffdb5272013-10-02 16:42:35 +05302099 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2100 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002101 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 }
2103
2104 switch (nvTable->nvTable)
2105 {
2106 case NV_TABLE_RATE_POWER_SETTINGS:
2107 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2108 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2109 break;
2110
2111 case NV_TABLE_REGULATORY_DOMAINS:
2112 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2113 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2114 break;
2115
2116 case NV_TABLE_DEFAULT_COUNTRY:
2117 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2118 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2119 break;
2120
2121 case NV_TABLE_TPC_POWER_TABLE:
2122 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2123 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2124 break;
2125
2126 case NV_TABLE_TPC_PDADC_OFFSETS:
2127 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2128 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2129 break;
2130
2131 case NV_TABLE_VIRTUAL_RATE:
2132 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2133 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2134 break;
2135
2136 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2137 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2138 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2139 break;
2140
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002141 case NV_TABLE_HW_CAL_VALUES:
2142 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2143 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2144 break;
2145
2146 case NV_TABLE_FW_CONFIG:
2147 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2148 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002149 break;
2150
2151 case NV_TABLE_ANTENNA_PATH_LOSS:
2152 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2153 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2154 break;
2155
2156 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2157 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2158 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2159 break;
2160
2161 default:
2162 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2163 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002164 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002165 break;
2166 }
2167
2168 /* Set Current Processing NV table type */
2169 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2170 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2171 {
2172 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2173 "Invalid Table Size %d", nvTable->tableSize);
2174 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2175 pHddCtx->ftm.targetNVTableSize = 0;
2176 pHddCtx->ftm.processedNVTableSize = 0;
2177 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002178 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002179 }
2180 }
2181
2182 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2183 {
2184 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2185 "Invalid NV Table, now Processing %d, not %d",
2186 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2187 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2188 pHddCtx->ftm.targetNVTableSize = 0;
2189 pHddCtx->ftm.processedNVTableSize = 0;
2190 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002191 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002192 }
2193 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002194 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002195 nvTable->chunkSize);
2196
2197 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2198 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2199 {
2200 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2201 pHddCtx->ftm.tempNVTableBuffer,
2202 pHddCtx->ftm.targetNVTableSize);
2203 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2204 pHddCtx->ftm.targetNVTableSize = 0;
2205 pHddCtx->ftm.processedNVTableSize = 0;
2206 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2207 }
2208
2209 return 1;
2210}
2211
2212/**---------------------------------------------------------------------------
2213
2214 \brief wlan_hdd_ftm_blank_nv() -
2215 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002216 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002217
2218 \param - ftmCmd - Pointer FTM Commad Buffer
2219
2220 \return - int
2221 -1, Process Host command fail, vail out
2222 0, Process Host command success
2223
2224 --------------------------------------------------------------------------*/
2225int wlan_hdd_ftm_blank_nv_table
2226(
2227 tPttMsgbuffer *ftmCmd
2228)
2229{
Leo Chang80de3c22013-11-26 10:52:12 -08002230 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002231 v_SIZE_t nvSize;
2232 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002233 sHalNvV2 *nvContents = NULL;
2234 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002235
2236 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2237 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2238 {
c_hpothuffdb5272013-10-02 16:42:35 +05302239 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2240 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002241 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002242 }
2243
Leo Chang80de3c22013-11-26 10:52:12 -08002244 nvVersion = vos_nv_getNvVersion();
2245 if (E_NV_V2 != nvVersion)
2246 {
2247 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2248 "%s : Not valid NV Version %d", __func__, nvVersion);
2249 return -EINVAL;
2250 }
2251
Jeff Johnson295189b2012-06-20 16:38:30 -07002252 itemSize = sizeof(nvContents->tables.pwrOptimum);
2253 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002254 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002255 itemSize);
2256
2257 itemSize = sizeof(nvContents->tables.regDomains);
2258 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002259 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002260 itemSize);
2261
2262 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2263 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002264 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002265 itemSize);
2266
2267 itemSize = sizeof(nvContents->tables.plutCharacterized);
2268 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002269 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002270 itemSize);
2271
2272 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2273 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002274 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002275 itemSize);
2276
2277 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2278 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002279 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002280 itemSize);
2281
2282 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2283 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002284 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002285 itemSize);
2286
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002287 itemSize = sizeof(nvContents->tables.hwCalValues);
2288 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002289 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002290 itemSize);
2291
2292 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2293 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002294 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002295 itemSize);
2296
2297 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2298 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002299 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002300 itemSize);
2301
2302 return 1;
2303}
2304
2305/**---------------------------------------------------------------------------
2306
2307 \brief wlan_hdd_ftm_delete_nv_table() -
2308 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002309 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002310
2311 \param - ftmCmd - Pointer FTM Commad Buffer
2312
2313 \return - int
2314 -1, Process Host command fail, vail out
2315 1, Process Host command success
2316
2317 --------------------------------------------------------------------------*/
2318int wlan_hdd_ftm_delete_nv_table
2319(
2320 tPttMsgbuffer *ftmCmd
2321)
2322{
Leo Chang80de3c22013-11-26 10:52:12 -08002323 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002324 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2325 v_SIZE_t nvSize;
2326 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002327 sHalNvV2 *nvContents = NULL;
2328 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002329
2330 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2331 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2332 {
c_hpothuffdb5272013-10-02 16:42:35 +05302333 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2334 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002335 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002336 }
2337
Leo Chang80de3c22013-11-26 10:52:12 -08002338 nvVersion = vos_nv_getNvVersion();
2339 if (E_NV_V2 != nvVersion)
2340 {
2341 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2342 "%s : Not valid NV Version %d", __func__, nvVersion);
2343 return -EINVAL;
2344 }
2345
Jeff Johnson295189b2012-06-20 16:38:30 -07002346 switch (nvTable->nvTable)
2347 {
2348 case NV_TABLE_RATE_POWER_SETTINGS:
2349 itemSize = sizeof(nvContents->tables.pwrOptimum);
2350 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002351 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002352 itemSize);
2353 break;
2354
2355 case NV_TABLE_REGULATORY_DOMAINS:
2356 itemSize = sizeof(nvContents->tables.regDomains);
2357 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002358 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002359 itemSize);
2360 break;
2361
2362 case NV_TABLE_DEFAULT_COUNTRY:
2363 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2364 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002365 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002366 itemSize);
2367 break;
2368
2369 case NV_TABLE_TPC_POWER_TABLE:
2370 itemSize = sizeof(nvContents->tables.plutCharacterized);
2371 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002372 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002373 itemSize);
2374 break;
2375
2376 case NV_TABLE_TPC_PDADC_OFFSETS:
2377 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2378 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002379 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002380 itemSize);
2381 break;
2382
2383 case NV_TABLE_VIRTUAL_RATE:
2384 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2385 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002386 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002387 itemSize);
2388 break;
2389
2390 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2391 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2392 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002393 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002394 itemSize);
2395 break;
2396
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002397 case NV_TABLE_HW_CAL_VALUES:
2398 itemSize = sizeof(nvContents->tables.hwCalValues);
2399 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002400 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002401 itemSize);
2402 break;
2403
2404 case NV_TABLE_FW_CONFIG:
2405 itemSize = sizeof(nvContents->tables.fwConfig);
2406 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002407 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002408 itemSize);
2409 break;
2410
2411 case NV_TABLE_ANTENNA_PATH_LOSS:
2412 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2413 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002414 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002415 itemSize);
2416 break;
2417
2418 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2419 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2420 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002421 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002422 itemSize);
2423 break;
2424
2425 default:
2426 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2427 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002428 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002429 break;
2430 }
2431
2432 return 1;
2433}
2434
2435/**---------------------------------------------------------------------------
2436
2437 \brief wlan_hdd_ftm_get_nv_field() -
2438 Get Specific NV field
2439
2440 \param - ftmCmd - Pointer FTM Commad Buffer
2441
2442 \return - int
2443 -1, Process Host command fail, vail out
2444 1, Process Host command success
2445
2446 --------------------------------------------------------------------------*/
2447int wlan_hdd_ftm_get_nv_field
2448(
2449 tPttMsgbuffer *ftmCmd
2450)
2451{
2452 sNvFields nvFieldDataBuffer;
2453 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2454 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2455 sHalNv *nvContents = NULL;
2456 v_SIZE_t nvSize;
2457
2458 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2459 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2460 {
c_hpothuffdb5272013-10-02 16:42:35 +05302461 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2462 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002463 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002464 }
2465 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2466
2467 switch (nvField->nvField)
2468 {
2469 case NV_COMMON_PRODUCT_ID:
2470 memcpy((void *)&nvField->fieldData,
2471 &nvFieldDataBuffer.productId,
2472 sizeof(nvFieldDataBuffer.productId));
2473 break;
2474
2475 case NV_COMMON_PRODUCT_BANDS:
2476 memcpy((void *)&nvField->fieldData,
2477 &nvFieldDataBuffer.productBands,
2478 sizeof(nvFieldDataBuffer.productBands));
2479 break;
2480
2481 case NV_COMMON_NUM_OF_TX_CHAINS:
2482 memcpy((void *)&nvField->fieldData,
2483 &nvFieldDataBuffer.numOfTxChains,
2484 sizeof(nvFieldDataBuffer.numOfTxChains));
2485 break;
2486
2487 case NV_COMMON_NUM_OF_RX_CHAINS:
2488 memcpy((void *)&nvField->fieldData,
2489 &nvFieldDataBuffer.numOfRxChains,
2490 sizeof(nvFieldDataBuffer.numOfRxChains));
2491 break;
2492
2493 case NV_COMMON_MAC_ADDR:
2494 memcpy((void *)&nvField->fieldData,
2495 &nvFieldDataBuffer.macAddr[0],
2496 NV_FIELD_MAC_ADDR_SIZE);
2497 break;
2498
2499 case NV_COMMON_MFG_SERIAL_NUMBER:
2500 memcpy((void *)&nvField->fieldData,
2501 &nvFieldDataBuffer.mfgSN[0],
2502 NV_FIELD_MFG_SN_SIZE);
2503 break;
2504
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002505 case NV_COMMON_WLAN_NV_REV_ID:
2506 memcpy((void *)&nvField->fieldData,
2507 &nvFieldDataBuffer.wlanNvRevId,
2508 sizeof(nvFieldDataBuffer.wlanNvRevId));
2509 break;
2510
Jeff Johnson295189b2012-06-20 16:38:30 -07002511 case NV_COMMON_COUPLER_TYPE:
2512 memcpy((void *)&nvField->fieldData,
2513 &nvFieldDataBuffer.couplerType,
2514 sizeof(nvFieldDataBuffer.couplerType));
2515 break;
2516
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002517 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002518 {
2519 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2520 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2521
2522 nvEmbededStatus = vos_nv_isEmbeddedNV();
2523
2524 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2525 {
2526 // High bit is set to indicate embedded NV..
2527 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2528 }
2529
2530 memcpy((void *)&nvField->fieldData,
2531 &nvVersion,
2532 sizeof(nvFieldDataBuffer.nvVersion));
2533 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002534 break;
2535
Jeff Johnson295189b2012-06-20 16:38:30 -07002536 default:
2537 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2538 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002539 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002540 break;
2541 }
2542
2543 return 1;
2544}
2545
2546/**---------------------------------------------------------------------------
2547
2548 \brief wlan_hdd_ftm_set_nv_field() -
2549 Set Specific NV field
2550
2551 \param - ftmCmd - Pointer FTM Commad Buffer
2552
2553 \return - int
2554 -1, Process Host command fail, vail out
2555 1, Process Host command success
2556
2557 --------------------------------------------------------------------------*/
2558int wlan_hdd_ftm_set_nv_field
2559(
2560 tPttMsgbuffer *ftmCmd
2561)
2562{
2563 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2564 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2565 v_SIZE_t nvSize;
2566 sHalNv *nvContents = NULL;
2567 v_U8_t macLoop;
2568 v_U8_t *pNVMac;
2569 v_U8_t lastByteMAC;
2570
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002571
Jeff Johnson295189b2012-06-20 16:38:30 -07002572 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2573 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2574 {
c_hpothuffdb5272013-10-02 16:42:35 +05302575 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2576 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002577 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002578 }
2579
2580 switch (nvField->nvField)
2581 {
2582 case NV_COMMON_PRODUCT_ID:
2583 memcpy(&nvContents->fields.productId,
2584 &nvField->fieldData,
2585 sizeof(nvContents->fields.productId));
2586 break;
2587
2588 case NV_COMMON_PRODUCT_BANDS:
2589 memcpy(&nvContents->fields.productBands,
2590 &nvField->fieldData,
2591 sizeof(nvContents->fields.productBands));
2592 break;
2593
2594 case NV_COMMON_NUM_OF_TX_CHAINS:
2595 memcpy(&nvContents->fields.numOfTxChains,
2596 &nvField->fieldData,
2597 sizeof(nvContents->fields.numOfTxChains));
2598 break;
2599
2600 case NV_COMMON_NUM_OF_RX_CHAINS:
2601 memcpy(&nvContents->fields.numOfRxChains,
2602 &nvField->fieldData,
2603 sizeof(nvContents->fields.numOfRxChains));
2604 break;
2605
2606 case NV_COMMON_MAC_ADDR:
2607 /* If Last byte is larger than 252 (0xFC), return Error,
2608 * Since 3MACs should be derived from first MAC */
2609 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002610 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002611 {
2612 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2613 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002614 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002615 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002616 }
2617
2618 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002619 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002620 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2621 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002622 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002623 lastByteMAC + macLoop;
2624 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002625 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002626 NV_FIELD_MAC_ADDR_SIZE);
2627 }
2628 break;
2629
2630 case NV_COMMON_MFG_SERIAL_NUMBER:
2631 memcpy(&nvContents->fields.mfgSN[0],
2632 &nvField->fieldData,
2633 NV_FIELD_MFG_SN_SIZE);
2634 break;
2635
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002636 case NV_COMMON_WLAN_NV_REV_ID:
2637 memcpy(&nvContents->fields.wlanNvRevId,
2638 &nvField->fieldData,
2639 sizeof(nvContents->fields.wlanNvRevId));
2640 break;
2641
Jeff Johnson295189b2012-06-20 16:38:30 -07002642 case NV_COMMON_COUPLER_TYPE:
2643 memcpy(&nvContents->fields.couplerType,
2644 &nvField->fieldData,
2645 sizeof(nvContents->fields.couplerType));
2646 break;
2647
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002648 case NV_COMMON_NV_VERSION:
2649 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2650 "Cannot modify NV version field %d", nvField->nvField);
2651 return -EIO;
2652 break;
2653
Jeff Johnson295189b2012-06-20 16:38:30 -07002654 default:
2655 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2656 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002657 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002658 break;
2659 }
2660
2661 return 1;
2662}
2663
2664/**---------------------------------------------------------------------------
2665
2666 \brief wlan_hdd_ftm_store_nv_table() -
2667 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002668 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002669
2670 \param - ftmCmd - Pointer FTM Commad Buffer
2671
2672 \return - int
2673 -1, Process Host command fail, vail out
2674 0, Process Host command success
2675
2676 --------------------------------------------------------------------------*/
2677int wlan_hdd_ftm_store_nv_table
2678(
2679 tPttMsgbuffer *ftmCmd
2680)
2681{
2682 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2683 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002684 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2685 void *tablePtr = NULL;
2686 unsigned int tableSize = 0;
2687 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002688 sHalNvV2 *nvContents = NULL;
2689 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002690
2691 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2692 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2693 {
c_hpothuffdb5272013-10-02 16:42:35 +05302694 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2695 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002696 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002697 }
2698
Leo Chang80de3c22013-11-26 10:52:12 -08002699 nvVersion = vos_nv_getNvVersion();
2700 if (E_NV_V2 != nvVersion)
2701 {
2702 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2703 "%s : Not valid NV Version %d", __func__, nvVersion);
2704 return -EINVAL;
2705 }
2706
Jeff Johnson295189b2012-06-20 16:38:30 -07002707 /* Set Platform type as PRIMA */
2708 nvContents->fields.wlanNvRevId = 2;
2709
2710 switch(nvTable->nvTable)
2711 {
2712 case NV_FIELDS_IMAGE:
2713 tablePtr = (void *)&nvContents->fields;
2714 tableSize = sizeof(nvContents->fields);
2715 tableVNVType = VNV_FIELD_IMAGE;
2716 break;
2717
2718 case NV_TABLE_RATE_POWER_SETTINGS:
2719 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2720 tableSize = sizeof(nvContents->tables.pwrOptimum);
2721 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2722 break;
2723
2724 case NV_TABLE_REGULATORY_DOMAINS:
2725 tablePtr = (void *)&nvContents->tables.regDomains[0];
2726 tableSize = sizeof(nvContents->tables.regDomains);
2727 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2728 break;
2729
2730 case NV_TABLE_DEFAULT_COUNTRY:
2731 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2732 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2733 tableVNVType = VNV_DEFAULT_LOCATION;
2734 break;
2735
2736 case NV_TABLE_TPC_POWER_TABLE:
2737 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2738 tableSize = sizeof(nvContents->tables.plutCharacterized);
2739 tableVNVType = VNV_TPC_POWER_TABLE;
2740 break;
2741
2742 case NV_TABLE_TPC_PDADC_OFFSETS:
2743 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2744 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2745 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2746 break;
2747
2748 case NV_TABLE_VIRTUAL_RATE:
2749 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2750 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2751 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2752 break;
2753
2754 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2755 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2756 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2757 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2758 break;
2759
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002760 case NV_TABLE_HW_CAL_VALUES:
2761 tablePtr = (void *)&nvContents->tables.hwCalValues;
2762 tableSize = sizeof(nvContents->tables.hwCalValues);
2763 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002764 break;
2765
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002766 case NV_TABLE_FW_CONFIG:
2767 tablePtr = (void *)&nvContents->tables.fwConfig;
2768 tableSize = sizeof(nvContents->tables.fwConfig);
2769 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002770 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002771
Jeff Johnson295189b2012-06-20 16:38:30 -07002772 case NV_TABLE_ANTENNA_PATH_LOSS:
2773 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2774 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2775 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2776 break;
2777
2778 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2779 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2780 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2781 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2782 break;
2783
2784 default:
2785 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2786 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002787 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002788 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002789
Jeff Johnson295189b2012-06-20 16:38:30 -07002790 }
2791
2792 nvStatus = vos_nv_write(tableVNVType,
2793 tablePtr,
2794 tableSize);
2795 if(VOS_STATUS_SUCCESS != nvStatus)
2796 {
c_hpothuffdb5272013-10-02 16:42:35 +05302797 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2798 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002799 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002800 }
2801
2802 return 1;
2803}
2804
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002805/* --------------------------------------------------------------------------
2806 \brief wlan_hdd_ftm_get_nv_bin() -
2807 Get NV bin read from Flash Memory, file
2808
2809 \param - ftmCmd - Pointer FTM Commad Buffer
2810
2811 \return - int
2812 -1, Process Host command fail, vail out
2813 0, Process Host command success
2814--------------------------------------------------------------------------*/
2815
2816static int wlan_hdd_ftm_get_nv_bin
2817(
2818 v_U16_t msgId,
2819 hdd_context_t *pHddCtx,
2820 tPttMsgbuffer *ftmCmd
2821)
2822{
2823 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2824 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2825 v_SIZE_t nvSize;
2826 v_U8_t *nvContents;
2827 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002828 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002829
Leo Chang80de3c22013-11-26 10:52:12 -08002830 nvVersion = vos_nv_getNvVersion();
2831 if (E_NV_V3 != nvVersion)
2832 {
2833 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2834 "%s : Not valid NV Version %d", __func__, nvVersion);
2835 return -EINVAL;
2836 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002837
2838 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2839 (0 == pHddCtx->ftm.processedNVTableSize))
2840 {
2841 if ( msgId == PTT_MSG_GET_NV_BIN )
2842 {
2843 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2844 }
2845 else
2846 {
2847 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2848 }
2849
2850 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2851 {
c_hpothuffdb5272013-10-02 16:42:35 +05302852 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2853 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002854 return -EIO;
2855 }
2856
2857 switch (nvTable->nvTable)
2858 {
2859 case NV_BINARY_IMAGE:
2860 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2861 break;
2862 default:
2863 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2864 "Not Valid NV Table %d", nvTable->nvTable);
2865 return -EIO;
2866 break;
2867 }
2868
2869 /* Set Current Processing NV table type */
2870 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2871 if ( msgId == PTT_MSG_GET_NV_BIN )
2872 {
2873 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2874 /* Validity Period */
2875 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2876 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2877 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2878 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2879 offset = sizeof(v_U32_t);
2880 }
2881 else
2882 {
2883 pHddCtx->ftm.targetNVTableSize = nvSize;
2884 offset = 0;
2885 }
2886
2887 /* Copy target NV table value into temp context buffer */
2888 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2889 pHddCtx->ftm.targetNVTablePointer,
2890 pHddCtx->ftm.targetNVTableSize);
2891 }
2892
2893
2894 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2895 {
2896 /* Invalid table type */
2897 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2898 "Invalid NV Table, now Processing %d, not %d",
2899 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2900
2901 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2902 pHddCtx->ftm.targetNVTableSize = 0;
2903 pHddCtx->ftm.processedNVTableSize = 0;
2904 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2905
2906 return -EINVAL;
2907 }
2908
2909 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2910
2911 /* Update processed pointer to prepare next chunk copy */
2912 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2913 pHddCtx->ftm.targetNVTableSize )
2914 {
2915 nvTable->chunkSize =
2916 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2917 }
2918
2919 /* Copy next chunk of NV table value into response buffer */
2920 vos_mem_copy(
2921 &nvTable->tableData,
2922 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2923 nvTable->chunkSize);
2924
2925 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2926
2927 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2928 {
2929 /* Finished to process last chunk of data, initialize buffer */
2930 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2931 pHddCtx->ftm.targetNVTableSize = 0;
2932 pHddCtx->ftm.processedNVTableSize = 0;
2933 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2934 }
2935
2936 return 1;
2937}
2938
2939/**---------------------------------------------------------------------------
2940
2941 \brief wlan_hdd_ftm_set_nv_bin() -
2942 Set NV bin to Flash Memory, file
2943
2944 \param - ftmCmd - Pointer FTM Commad Buffer
2945
2946 \return - int
2947 -1, Process Host command fail, vail out
2948 0, Process Host command success
2949
2950+----------------------------------------------------------------------------*/
2951
2952static int wlan_hdd_ftm_set_nv_bin
2953(
2954 hdd_context_t *pHddCtx,
2955 tPttMsgbuffer *ftmCmd
2956)
2957{
2958 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2959 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002960 eNvVersionType nvVersion;
2961
2962 nvVersion = vos_nv_getNvVersion();
2963 if (E_NV_V3 != nvVersion)
2964 {
2965 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2966 "%s : Not valid NV Version %d", __func__, nvVersion);
2967 return -EINVAL;
2968 }
2969
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002970
2971 /* Test first chunk of NV table */
2972 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2973 (0 == pHddCtx->ftm.processedNVTableSize))
2974 {
2975 switch (nvTable->nvTable)
2976 {
2977 case NV_BINARY_IMAGE:
2978 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2979 break;
2980 default:
2981 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2982 "Not Valid NV Table %d", nvTable->nvTable);
2983 return -EIO;
2984 break;
2985 }
2986
2987 /* Set Current Processing NV table type */
2988 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2989 pHddCtx->ftm.processedNVTableSize = 0;
2990
2991 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2992 {
2993 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2994 "Invalid Table Size %d", nvTable->tableSize);
2995 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2996 pHddCtx->ftm.targetNVTableSize = 0;
2997 pHddCtx->ftm.processedNVTableSize = 0;
2998 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2999 return -EINVAL;
3000 }
3001 }
3002
3003 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3004 {
3005 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3006 "Invalid NV Table, now Processing %d, not %d",
3007 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3008 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3009 pHddCtx->ftm.targetNVTableSize = 0;
3010 pHddCtx->ftm.processedNVTableSize = 0;
3011 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3012 return -EINVAL;
3013 }
3014
3015 vos_mem_copy(
3016 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3017 &nvTable->tableData,
3018 nvTable->chunkSize);
3019
3020 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3021
3022 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3023 {
3024 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3025 "Processing Done!! write encoded Buffer %d",
3026 pHddCtx->ftm.targetNVTableSize);
3027
3028 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3029 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3030
3031 if ((VOS_STATUS_SUCCESS != nvStatus))
3032 {
3033 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3034 "Fail to set NV Binary %d", nvStatus);
3035 return -EIO;
3036 }
3037
3038 nvStatus = vos_nv_setNVEncodedBuffer(
3039 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3040 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3041
3042 if ((VOS_STATUS_SUCCESS != nvStatus))
3043 {
3044 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3045 "Fail to set NV Binary %d", nvStatus);
3046 return -EIO;
3047 }
3048
3049 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3050 pHddCtx->ftm.targetNVTableSize = 0;
3051 pHddCtx->ftm.processedNVTableSize = 0;
3052 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3053 }
3054
3055 return 1;
3056}
3057
Jeff Johnson295189b2012-06-20 16:38:30 -07003058/**---------------------------------------------------------------------------
3059
3060 \brief wlan_hdd_ftm_temp_get_rel_num() -
3061 Get internal release number
3062
3063 \param - ftmCmd - Pointer FTM Commad Buffer
3064
3065 \return - int
3066 -1, Process Host command fail, vail out
3067 0, Process Host command success
3068
3069 --------------------------------------------------------------------------*/
3070int wlan_hdd_ftm_temp_get_rel_num
3071(
3072 tPttMsgbuffer *ftmCmd
3073)
3074{
3075 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3076
3077 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3078 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3079 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3080 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3081 relNum->relParams.pttMax = 10;
3082 relNum->relParams.pttMin = 1;
3083
3084 return 1;
3085}
3086
3087/**---------------------------------------------------------------------------
3088
3089 \brief wlan_hdd_process_ftm_host_cmd() -
3090 process any command should be handled within host.
3091 decide any command should be send to HAL or not
3092
3093 \param - ftmCmd - Pointer FTM Commad Buffer
3094
3095 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003096 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003097 0, Process Host command success, not need to send CMD to HAL
3098 1, Process Host command success, need to send CMD to HAL
3099
3100 --------------------------------------------------------------------------*/
3101int wlan_hdd_process_ftm_host_cmd
3102(
3103 hdd_context_t *pHddCtx,
3104 void *ftmCmd
3105)
3106{
3107 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3108 int needToRouteHal = 1;
3109 int hostState = 1;
3110
3111 switch(pFTMCmd->msgId)
3112 {
3113 case PTT_MSG_GET_NV_TABLE:
3114 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3115 needToRouteHal = 0;
3116 break;
3117
3118 case PTT_MSG_SET_NV_TABLE:
3119 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3120 /* Temp NV Operation will be isolated to host
3121 needToRouteHal = 1; */
3122 needToRouteHal = 0;
3123 break;
3124
3125 case PTT_MSG_BLANK_NV:
3126 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3127 needToRouteHal = 1;
3128 break;
3129
3130 case PTT_MSG_DEL_NV_TABLE:
3131 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3132 needToRouteHal = 1;
3133 break;
3134
3135 case PTT_MSG_GET_NV_FIELD:
3136 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3137 needToRouteHal = 0;
3138 break;
3139
3140 case PTT_MSG_SET_NV_FIELD:
3141 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3142 needToRouteHal = 0;
3143 break;
3144
3145 case PTT_MSG_STORE_NV_TABLE:
3146 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3147 needToRouteHal = 0;
3148 break;
3149
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003150 case PTT_MSG_GET_NV_BIN:
3151 case PTT_MSG_GET_DICTIONARY:
3152 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3153 needToRouteHal = 0;
3154 break;
3155
3156 case PTT_MSG_SET_NV_BIN:
3157 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3158 needToRouteHal = 0;
3159 break;
3160
Jeff Johnson295189b2012-06-20 16:38:30 -07003161 case PTT_MSG_DBG_READ_REGISTER:
3162 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3163 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3164 needToRouteHal = 0;
3165 break;
3166
3167 case PTT_MSG_DBG_WRITE_REGISTER:
3168 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3169 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3170 needToRouteHal = 0;
3171 break;
3172
3173 case PTT_MSG_DBG_READ_MEMORY:
3174 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3175 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3176 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3177 needToRouteHal = 0;
3178 break;
3179
3180 case PTT_MSG_DBG_WRITE_MEMORY:
3181 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3182 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3183 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3184 needToRouteHal = 0;
3185 break;
3186
3187 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3188 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3189 needToRouteHal = 0;
3190 break;
3191
3192 default:
3193 needToRouteHal = 1;
3194 break;
3195 }
3196
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003197 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003198 {
3199 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3200 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003201 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003202 }
3203
3204 return needToRouteHal;
3205}
Jeff Johnson295189b2012-06-20 16:38:30 -07003206
3207/**---------------------------------------------------------------------------
3208
3209 \brief wlan_hdd_process_ftm_cmd() -
3210
3211 This function process the commands received from the ptt socket application.
3212
3213 \param - pAdapter - Pointer HDD Context.
3214
3215 \param - wnl - Pointer to the ANI netlink header.
3216
3217 \return - none
3218
3219 --------------------------------------------------------------------------*/
3220
3221void wlan_hdd_process_ftm_cmd
3222(
3223 hdd_context_t *pHddCtx,
3224 tAniNlHdr *wnl
3225)
3226{
3227 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3228 v_U16_t cmd_len;
3229 v_U8_t *pftm_data;
3230 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003231 int hostState;
3232 tPttMsgbuffer *tempRspBuffer = NULL;
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303233 static int count;
Jeff Johnson295189b2012-06-20 16:38:30 -07003234
3235 ENTER();
3236
Jeff Johnsone7245742012-09-05 17:12:55 -07003237 //Delay to fix NV write failure on JB
3238 vos_busy_wait(10000); //10ms
3239
Jeff Johnson295189b2012-06-20 16:38:30 -07003240 if (!pRequestBuf) {
3241
Arif Hussain6d2a3322013-11-17 19:50:10 -08003242 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003243 return ;
3244 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303245
3246 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3247 {
3248 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3249 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3250 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3251 return ;
3252 }
3253
Jeff Johnson295189b2012-06-20 16:38:30 -07003254 /*Save the received request*/
3255 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3256
3257 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3258 /*Save the received request netlink header used for sending the response*/
3259 pHddCtx->ftm.wnl = wnl;
3260 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3261
Arif Hussain6d2a3322013-11-17 19:50:10 -08003262 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003263
3264 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3265 wlan_ftm_send_response(pHddCtx);
3266 return ;
3267 }
3268
Anand N Sunkad6e3b1b02015-06-17 12:27:38 +05303269 if (VOS_FTM_MODE != hdd_get_conparam())
3270 {
3271 count++;
3272 if (count == 1 || !(count % 10))
3273 {
3274 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Driver not loaded in FTM"
3275 " mode, current mode: %d ",__func__, hdd_get_conparam());
3276 }
3277 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3278 wlan_ftm_send_response(pHddCtx);
3279 return ;
3280 }
3281
Jeff Johnson295189b2012-06-20 16:38:30 -07003282 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3283 {
3284 case WLAN_FTM_START:
3285 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3286
Arif Hussain6d2a3322013-11-17 19:50:10 -08003287 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003288 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3289 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3290 wlan_ftm_send_response(pHddCtx);
3291 return;
3292 }
3293
3294 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3295 {
3296 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3297 ,__func__);
3298 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3299 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303300 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003301 return;
3302 }
3303 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3304 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3305 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3306 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3307
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 break;
3311
3312 case WLAN_FTM_STOP:
3313 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3314
Arif Hussain6d2a3322013-11-17 19:50:10 -08003315 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003316 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3317 wlan_ftm_send_response(pHddCtx);
3318 return;
3319 }
3320
3321 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3322
3323 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3324 wlan_ftm_send_response(pHddCtx);
3325 return;
3326 }
3327
3328 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3329 /* This would send back the Command Success Status */
3330 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3331
3332 wlan_ftm_send_response(pHddCtx);
3333
3334 break;
3335
3336 case WLAN_FTM_CMD:
3337 /* if it is regular FTM command, pass it to HAL PHY */
3338 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003339 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003340 return;
3341 }
3342 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3343
Arif Hussain6d2a3322013-11-17 19:50:10 -08003344 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003345
3346 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3347 wlan_ftm_send_response(pHddCtx);
3348 return;
3349
3350 }
3351 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3352 cmd_len = pRequestBuf->ftm_hdr.data_len;
3353 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3354 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3355
Jeff Johnson295189b2012-06-20 16:38:30 -07003356 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3357 if (0 == hostState)
3358 {
3359 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3360 if (NULL == tempRspBuffer)
3361 {
3362 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003363 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003364 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3365 wlan_ftm_send_response(pHddCtx);
3366 return;
3367 }
3368 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3369 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3370 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3371 (unsigned char *) tempRspBuffer,
3372 tempRspBuffer->msgBodyLength);
3373 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3374 wlan_ftm_send_response(pHddCtx);
3375 vos_mem_free(tempRspBuffer);
3376 return;
3377 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003378 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003379 {
3380 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3381 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3382 wlan_ftm_send_response(pHddCtx);
3383 return;
3384 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003385
3386 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3387
Jeff Johnson295189b2012-06-20 16:38:30 -07003388
3389 /*Post the command to the HAL*/
3390 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3391
Arif Hussain6d2a3322013-11-17 19:50:10 -08003392 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003393 return;
3394
3395 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303396 /*After successful posting of message the command should be pending*/
3397 pHddCtx->ftm.IsCmdPending = TRUE;
3398
Jeff Johnson295189b2012-06-20 16:38:30 -07003399 /*Wait here until you get the response from HAL*/
3400 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3401 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303402 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3403 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3404 wlan_ftm_send_response(pHddCtx);
3405 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003406 return;
3407 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303408 /*This check will handle the case where the completion is sent by
3409 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3410 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3411 {
3412 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3413 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3414 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3415
3416 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3417 wlan_ftm_send_response(pHddCtx);
3418 pHddCtx->ftm.IsCmdPending = FALSE;
3419 return ;
3420 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003421
3422 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3423
3424 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3425
3426 wlan_ftm_send_response(pHddCtx);
3427 pHddCtx->ftm.IsCmdPending = FALSE;
3428 break;
3429
3430 default:
3431
Arif Hussain6d2a3322013-11-17 19:50:10 -08003432 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003433 return;
3434 }
3435
3436 EXIT();
3437 return;
3438} /* wlan_adp_ftm_cmd() */
3439
3440/**---------------------------------------------------------------------------
3441
3442 \brief wlan_ftm_priv_start_stop_ftm() -
3443
3444 This function is used for start/stop the ftm driver.
3445
3446 \param - pAdapter - Pointer HDD Context.
3447 - start - 1/0 to start/stop ftm driver.
3448
3449 \return - 0 for success, non zero for failure
3450
3451 --------------------------------------------------------------------------*/
3452
3453static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3454 v_U16_t start)
3455{
3456 VOS_STATUS status;
3457 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3458
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003459 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003460 {
3461 pHddCtx->ftm.cmd_iwpriv = TRUE;
3462 status = wlan_hdd_ftm_start(pHddCtx);
3463
3464 if (status != VOS_STATUS_SUCCESS)
3465 {
3466 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3467 "FTM Start Failed");
3468 return VOS_STATUS_E_FAILURE;
3469 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303470 if (NULL == pMsgBuf)
3471 {
3472 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3473 if (NULL == pMsgBuf)
3474 {
3475 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3476 "%s:pMsgBuf is NULL", __func__);
3477 return VOS_STATUS_E_FAILURE;
3478 }
3479 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003480 }
3481 else
3482 {
3483 status = wlan_ftm_stop(pHddCtx);
3484
3485 if (status != VOS_STATUS_SUCCESS)
3486 {
3487 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3488 "FTM Stop Failed");
3489 return VOS_STATUS_E_FAILURE;
3490 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303491 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3492 if (pMsgBuf)
3493 {
3494 vos_mem_free((v_VOID_t * )pMsgBuf);
3495 pMsgBuf = NULL;
3496 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003497 }
3498 return VOS_STATUS_SUCCESS;
3499}
3500
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303501
3502static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3503{
3504 unsigned int *table = NULL;
3505 int index = 0;
3506
3507 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3508 table = valid_channel;
3509 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3510 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3511 table = valid_channel_cb40;
3512 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3513 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3514 table = valid_channel_cb80;
3515
3516 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303517 {
3518 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3519 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303520 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303521 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303522
3523 while (table[index] != 0)
3524 {
3525 if (table[index] == channel)
3526 return VOS_STATUS_SUCCESS;
3527
3528 index++;
3529 }
3530
3531 return VOS_STATUS_E_FAILURE;
3532}
3533
3534
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303535static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3536{
3537 unsigned int primary_channel = center_channel;
3538
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303539 switch (cb)
3540 {
3541 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3542 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3543 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3544 primary_channel -= 2;
3545 break;
3546
3547
3548 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3549 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3550 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3551 primary_channel += 2;
3552 break;
3553
3554 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3555 primary_channel -= 6;
3556 break;
3557
3558 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3559 primary_channel += 6;
3560 break;
3561 }
3562
3563 return primary_channel;
3564
3565}
3566
Jeff Johnson295189b2012-06-20 16:38:30 -07003567/**---------------------------------------------------------------------------
3568
3569 \brief wlan_ftm_priv_set_channel() -
3570
3571 This function is used for setting the channel to the halphy ptt module.
3572
3573 \param - pAdapter - Pointer HDD Context.
3574 - channel - Channel Number 1-14.
3575
3576 \return - 0 for success, non zero for failure
3577
3578 --------------------------------------------------------------------------*/
3579
3580static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3581{
Jeff Johnson295189b2012-06-20 16:38:30 -07003582 uPttMsgs *pMsgBody;
3583 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303584 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003585 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3586
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303587 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003588 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303589 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3590 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003591 return VOS_STATUS_E_FAILURE;
3592 }
3593
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303594 if (NULL == pMsgBuf)
3595 {
3596 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3597 "%s:pMsgBuf is NULL", __func__);
3598 return VOS_STATUS_E_NOMEM;
3599 }
3600
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303601 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003602 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303603 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3604 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003605 return VOS_STATUS_E_FAILURE;
3606 }
3607
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303608 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003609 init_completion(&pHddCtx->ftm.ftm_comp_var);
3610 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3611 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3612
3613 pMsgBody = &pMsgBuf->msgBody;
3614
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303615 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003616
Arif Hussain6d2a3322013-11-17 19:50:10 -08003617 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303618 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003619
3620 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303622 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3625 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003626 status = VOS_STATUS_E_FAILURE;
3627 goto done;
3628
3629 }
c_hpothuffdb5272013-10-02 16:42:35 +05303630 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303631 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303632 if (0 >= ret )
3633 {
3634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3635 FL("wait on ftm_comp_var failed %ld"), ret);
3636 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003637
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303638 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003639 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303640 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3641 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003642 status = VOS_STATUS_E_FAILURE;
3643 goto done;
3644
3645 }
3646done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003647
3648 return status;
3649}
3650
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05303651static VOS_STATUS wlan_ftm_priv_set_dump(hdd_adapter_t *pAdapter, int *value)
3652{
3653 uPttMsgs *pMsgBody;
3654 VOS_STATUS status;
3655 long ret;
3656 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3657
3658 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3659 {
3660 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3661 "%s:Ftm has not started. Please start the ftm. ", __func__);
3662 return VOS_STATUS_E_FAILURE;
3663 }
3664
3665 if (NULL == pMsgBuf)
3666 {
3667 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3668 "%s:pMsgBuf is NULL", __func__);
3669 return VOS_STATUS_E_NOMEM;
3670 }
3671
3672 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
3673 init_completion(&pHddCtx->ftm.ftm_comp_var);
3674 pMsgBuf->msgId = PTT_MSG_PRIMA_GENERIC_CMD;
3675 pMsgBuf->msgBodyLength = sizeof(tMsgPttPrimaGenericCmd) + PTT_HEADER_LENGTH;
3676
3677 pMsgBody = &pMsgBuf->msgBody;
3678
3679 pMsgBody->PrimaGenericCmd.cmdIdx = value[0];
3680 pMsgBody->PrimaGenericCmd.param1 = value[1];
3681 pMsgBody->PrimaGenericCmd.param2 = value[2];
3682 pMsgBody->PrimaGenericCmd.param3 = value[3];
3683 pMsgBody->PrimaGenericCmd.param4 = value[4];
3684
3685 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3686
3687 if (status != VOS_STATUS_SUCCESS)
3688 {
3689 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3690 "%s:wlan_ftm_postmsg failed", __func__);
3691 status = VOS_STATUS_E_FAILURE;
3692 goto done;
3693 }
3694
3695 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3696 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3697 if (0 >= ret )
3698 {
3699 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3700 FL("wait on ftm_comp_var failed %ld"), ret);
3701 }
3702
3703 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3704 {
3705 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3706 "%s:Ptt response status failed", __func__);
3707 }
3708
3709 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3710 {
3711 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3712 "%s:Ptt response status failed", __func__);
3713 status = VOS_STATUS_E_FAILURE;
3714 goto done;
3715 }
3716
3717done:
3718 return status;
3719}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303720
3721/**---------------------------------------------------------------------------
3722
3723 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3724
3725 This function is used for setting the power control mode for tx.
3726
3727 \param - pAdapter - Pointer HDD Context.
3728 - pwr_mode - power control mode 0-2.
3729
3730 \return - 0 for success, non zero for failure
3731
3732 --------------------------------------------------------------------------*/
3733
3734static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3735 v_U16_t pwr_mode)
3736{
3737 uPttMsgs *pMsgBody;
3738 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303739 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303740 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3741
3742 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3743 {
3744 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3745 "%s:Ftm has not started. Please start the ftm. ", __func__);
3746 return VOS_STATUS_E_FAILURE;
3747 }
3748
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303749 if (NULL == pMsgBuf)
3750 {
3751 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3752 "%s:pMsgBuf is NULL", __func__);
3753 return VOS_STATUS_E_NOMEM;
3754 }
3755
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303756 if (pwr_mode > 2)
3757 {
3758 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3759 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3760 return VOS_STATUS_E_FAILURE;
3761 }
3762
3763 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3764 init_completion(&pHddCtx->ftm.ftm_comp_var);
3765 pMsgBody = &pMsgBuf->msgBody;
3766 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3767 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3768
3769 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3770 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3771
3772 if (status != VOS_STATUS_SUCCESS)
3773 {
3774 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3775 "%s:wlan_ftm_postmsg failed", __func__);
3776 status = VOS_STATUS_E_FAILURE;
3777 goto done;
3778 }
c_hpothuffdb5272013-10-02 16:42:35 +05303779 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303780 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303781 if (0 >= ret )
3782 {
3783 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3784 FL("wait on ftm_comp_var failed %ld"), ret);
3785 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303786
3787 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3788 {
3789 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3790 "%s:Ptt response status failed", __func__);
3791 status = VOS_STATUS_E_FAILURE;
3792 goto done;
3793 }
3794
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303795 ftm_status.powerCtlMode= pwr_mode;
3796
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303797 done:
3798 return status;
3799
3800}
3801
Jeff Johnson295189b2012-06-20 16:38:30 -07003802/**---------------------------------------------------------------------------
3803
3804 \brief wlan_ftm_priv_set_txpower() -
3805
3806 This function is used for setting the txpower to the halphy ptt module.
3807
3808 \param - pAdapter - Pointer HDD Context.
3809 - txpower - txpower Number 1-18.
3810
3811 \return - 0 for success, non zero for failure
3812
3813 --------------------------------------------------------------------------*/
3814
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303815static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3816 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003817{
Jeff Johnson295189b2012-06-20 16:38:30 -07003818 uPttMsgs *pMsgBody;
3819 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303820 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003821 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3822
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303823 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003824 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303825 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3826 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003827 return VOS_STATUS_E_FAILURE;
3828 }
3829
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303830 if (NULL == pMsgBuf)
3831 {
3832 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3833 "%s:pMsgBuf is NULL", __func__);
3834 return VOS_STATUS_E_NOMEM;
3835 }
3836
Jeff Johnson295189b2012-06-20 16:38:30 -07003837 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3838 * when tx pktgen is enabled
3839 */
3840 if (ftm_status.frameGenEnabled)
3841 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303842 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3843 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003844 return VOS_STATUS_E_FAILURE;
3845 }
3846
3847 if(!(txpower >= 9 && txpower <= 24))
3848 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303849 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3850 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003851 return VOS_STATUS_E_FAILURE;
3852 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003853
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303854 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3855 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003856 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003857 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3858 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3859
3860 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3861
3862 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3863
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303864 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003865 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303866 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3867 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003868 status = VOS_STATUS_E_FAILURE;
3869 goto done;
3870 }
c_hpothuffdb5272013-10-02 16:42:35 +05303871 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303872 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303873 if (0 >= ret )
3874 {
3875 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3876 FL("wait on ftm_comp_var failed %ld"), ret);
3877 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003878
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303879 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3882 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003883 status = VOS_STATUS_E_FAILURE;
3884 goto done;
3885 }
3886
Jeff Johnson295189b2012-06-20 16:38:30 -07003887 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003888
3889 return status;
3890
3891}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303892
3893
3894static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3895 v_U16_t enable)
3896{
3897 tANI_U32 value = 0;
3898 tANI_U32 reg_addr;
3899 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303900
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303901 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3902 {
3903 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3904 "%s:Ftm has not started. Please start the ftm. ", __func__);
3905 return VOS_STATUS_E_FAILURE;
3906 }
3907
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303908 reg_addr = WCNSS_TXFIR_OFFSET;
3909
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303910 wpalReadRegister(reg_addr, &value);
3911 if (enable)
3912 {
3913 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3914 }
3915 else
3916 {
3917 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3918 }
3919
3920 wpalWriteRegister(reg_addr, value);
3921
3922 return VOS_STATUS_SUCCESS;
3923}
3924
3925
Jeff Johnson295189b2012-06-20 16:38:30 -07003926/**---------------------------------------------------------------------------
3927
3928 \brief wlan_ftm_priv_set_txrate() -
3929
3930 This function is used for setting the txrate to the halphy ptt module.
3931 It converts the user input string for txrate to the tx rate index.
3932
3933 \param - pAdapter - Pointer HDD Context.
3934 - txrate - Pointer to the tx rate string.
3935
3936 \return - 0 for success, non zero for failure
3937
3938 --------------------------------------------------------------------------*/
3939
3940static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3941{
3942 int ii;
3943 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3944 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3945 {
3946 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3947 return VOS_STATUS_E_FAILURE;
3948 }
3949
3950 /* do not allow to change setting when tx pktgen is enabled */
3951 if (ftm_status.frameGenEnabled)
3952 {
3953 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3954 return VOS_STATUS_E_FAILURE;
3955 }
3956
3957 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3958 {
3959 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3960 break;
3961 }
3962 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3963 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003964 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003965 return VOS_STATUS_E_FAILURE;
3966 }
3967
3968 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3969 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3970
3971 return VOS_STATUS_SUCCESS;
3972}
3973
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303974
3975
3976static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3977 ePowerTempIndexSource pwr_source)
3978{
3979 uPttMsgs *pMsgBody;
3980 VOS_STATUS status;
3981 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3982
3983 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3984 {
3985 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3986 "%s:Ftm has not started. Please start the ftm. ", __func__);
3987 return VOS_STATUS_E_FAILURE;
3988 }
3989
3990 if (pwr_source > 3)
3991 {
3992 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3993 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3994 __func__);
3995 return VOS_STATUS_E_FAILURE;
3996 }
3997
3998 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3999
4000 init_completion(&pHddCtx->ftm.ftm_comp_var);
4001 pMsgBody = &pMsgBuf->msgBody;
4002 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
4003 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
4004
4005 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
4006 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4007
4008 if (status != VOS_STATUS_SUCCESS)
4009 {
4010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4011 "%s:wlan_ftm_postmsg failed", __func__);
4012 status = VOS_STATUS_E_FAILURE;
4013 goto done;
4014 }
4015 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4016 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4017
4018 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4019 {
4020 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4021 "%s:Ptt response status failed", __func__);
4022 status = VOS_STATUS_E_FAILURE;
4023 goto done;
4024 }
4025
4026done:
4027
4028 return status;
4029}
4030
4031
Jeff Johnson295189b2012-06-20 16:38:30 -07004032/**---------------------------------------------------------------------------
4033
4034 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
4035
4036 This function is used for start/stop the tx packet generation.
4037
4038 \param - pAdapter - Pointer HDD Context.
4039 - startStop - Value( 1/0) start/stop the tx packet generation.
4040
4041 \return - 0 for success, non zero for failure
4042
4043 --------------------------------------------------------------------------*/
4044
4045static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
4046{
Jeff Johnson295189b2012-06-20 16:38:30 -07004047 uPttMsgs *pMsgBody;
4048 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304049 long ret;
4050
Jeff Johnson295189b2012-06-20 16:38:30 -07004051 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4052
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304053 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004054 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304055 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4056 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004057 return VOS_STATUS_E_FAILURE;
4058 }
4059
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304060 if (NULL == pMsgBuf)
4061 {
4062 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4063 "%s:pMsgBuf is NULL", __func__);
4064 return VOS_STATUS_E_NOMEM;
4065 }
4066
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304067 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07004068 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304069 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4070 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004071 return VOS_STATUS_E_FAILURE;
4072 }
4073
4074 if ((ftm_status.frameGenEnabled && startStop == 1) ||
4075 (!ftm_status.frameGenEnabled && startStop == 0))
4076 {
4077 return VOS_STATUS_SUCCESS ;
4078 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304079 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004080
Jeff Johnson295189b2012-06-20 16:38:30 -07004081 if (startStop == 1)
4082 {
4083 init_completion(&pHddCtx->ftm.ftm_comp_var);
4084 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4085 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4086 pMsgBody = &pMsgBuf->msgBody;
4087 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4088
4089 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304090 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004091 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304092 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4093 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004094 status = VOS_STATUS_E_FAILURE;
4095 goto done;
4096 }
4097
c_hpothuffdb5272013-10-02 16:42:35 +05304098 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304099 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304100 if (0 >= ret )
4101 {
4102 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4103 FL("wait on ftm_comp_var failed %ld"), ret);
4104 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304105 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004106 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304107 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4108 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004109 status = VOS_STATUS_E_FAILURE;
4110 goto done;
4111 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304112
4113 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4114 {
4115 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4116 if(status != VOS_STATUS_SUCCESS)
4117 {
4118 goto done;
4119 }
4120 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004121 }
4122
4123 init_completion(&pHddCtx->ftm.ftm_comp_var);
4124 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4125 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4126 pMsgBody = &pMsgBuf->msgBody;
4127 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4128
4129 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4130 if(status != VOS_STATUS_SUCCESS)
4131 {
4132 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4133 status = VOS_STATUS_E_FAILURE;
4134 goto done;
4135 }
4136
c_hpothuffdb5272013-10-02 16:42:35 +05304137 ret = wait_for_completion_interruptible_timeout(
4138 &pHddCtx->ftm.ftm_comp_var,
4139 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4140 if (0 >= ret )
4141 {
4142 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4143 FL("wait on ftm_comp_var failed %ld"), ret);
4144 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004145 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4146 {
4147 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4148 status = VOS_STATUS_E_FAILURE;
4149 goto done;
4150 }
4151
4152done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004153
4154 if (status == VOS_STATUS_SUCCESS)
4155 {
4156 if (startStop == 1)
4157 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304158 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004159 }
4160 else
4161 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304162 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004163 }
4164 }
4165
4166 return status;
4167}
4168
4169
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304170
4171static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4172{
4173
4174 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4175 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4176 {
4177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4178 "%s:Ftm has not started. Please start the ftm. ", __func__);
4179 return VOS_STATUS_E_FAILURE;
4180 }
4181
4182 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4183 {
4184 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4185 "%s:cb mode value is invalid ", __func__);
4186 return VOS_STATUS_E_FAILURE;
4187 }
4188
4189 ftm_status.cbmode = cbmode;
4190
4191 return VOS_STATUS_SUCCESS;
4192
4193}
4194
Jeff Johnson295189b2012-06-20 16:38:30 -07004195/**---------------------------------------------------------------------------
4196
4197 \brief wlan_ftm_rx_mode() -
4198
4199 This function is used for start/stop the rx packet generation.
4200
4201 \param - pAdapter - Pointer HDD Context.
4202 - rxmode - 0-disable RX.
4203 - 1-rx ALL frames
4204 - 2-rx 11 g/n frames
4205 - 3-rx 11b frames
4206
4207 \return - 0 for success, non zero for failure
4208
4209 --------------------------------------------------------------------------*/
4210
4211static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4212{
Jeff Johnson295189b2012-06-20 16:38:30 -07004213 uPttMsgs *pMsgBody;
4214 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304215 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004216
4217 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304218 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004219 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304220 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4221 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004222 return VOS_STATUS_E_FAILURE;
4223 }
4224
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304225 if (NULL == pMsgBuf)
4226 {
4227 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4228 "%s:pMsgBuf is NULL", __func__);
4229 return VOS_STATUS_E_NOMEM;
4230 }
4231
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304232 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004233 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304234 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4235 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004236 return VOS_STATUS_E_FAILURE;
4237 }
4238
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304239 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004240 init_completion(&pHddCtx->ftm.ftm_comp_var);
4241
4242 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4243 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4244
4245 pMsgBody = &pMsgBuf->msgBody;
4246
4247 switch(rxmode)
4248 {
4249 case RXMODE_DISABLE_ALL:
4250 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4251 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4252 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4253 break;
4254
4255 case RXMODE_ENABLE_ALL:
4256 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4257 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4258 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4259 break;
4260
4261 case RXMODE_ENABLE_11GN:
4262 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4263 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4264 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4265 break;
4266
4267 case RXMODE_ENABLE_11B:
4268 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4269 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4270 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4271 break;
4272
4273 }
4274
4275 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4276
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304277 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004278 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304279 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4280 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004281 status = VOS_STATUS_E_FAILURE;
4282 goto done;
4283 }
c_hpothuffdb5272013-10-02 16:42:35 +05304284 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304285 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304286 if (0 >= ret )
4287 {
4288 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4289 FL(" wait on ftm_comp_var failed %ld"), ret);
4290 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004291
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304292 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004293 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304294 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4295 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004296 status = VOS_STATUS_E_FAILURE;
4297 goto done;
4298 }
4299 ftm_status.rxmode = rxmode ;
4300done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004301
4302 return status;
4303}
4304
4305/**---------------------------------------------------------------------------
4306
4307 \brief wlan_ftm_priv_rx_pkt_clear() -
4308
4309 This function sets the rx pkt count to zero.
4310
4311 \param - pAdapter - Pointer HDD Context.
4312 - rx_pkt_clear - rx_pkt_clear value.
4313
4314 \return - 0 for success, non zero for failure
4315
4316 --------------------------------------------------------------------------*/
4317
4318static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4319{
Jeff Johnson295189b2012-06-20 16:38:30 -07004320 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304321 long ret;
4322
Jeff Johnson295189b2012-06-20 16:38:30 -07004323 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4324
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304325 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004326 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304327 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4328 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004329 return VOS_STATUS_E_FAILURE;
4330 }
4331
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304332 if (NULL == pMsgBuf)
4333 {
4334 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4335 "%s:pMsgBuf is NULL", __func__);
4336 return VOS_STATUS_E_NOMEM;
4337 }
4338
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304339 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004340 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304341 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4342 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004343 return VOS_STATUS_E_FAILURE;
4344 }
4345
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304346 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004347 init_completion(&pHddCtx->ftm.ftm_comp_var);
4348 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304349 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004350
Jeff Johnson295189b2012-06-20 16:38:30 -07004351 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4352
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304353 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004354 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304355 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4356 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004357 status = VOS_STATUS_E_FAILURE;
4358 goto done;
4359 }
c_hpothuffdb5272013-10-02 16:42:35 +05304360 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304361 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304362 if (0 >= ret )
4363 {
4364 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4365 FL("wait on ftm_comp_var failed %ld"), ret);
4366 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004367
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304368 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004369 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304370 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4371 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004372 status = VOS_STATUS_E_FAILURE;
4373 goto done;
4374 }
4375done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004376
4377 return status;
4378}
4379
4380/**---------------------------------------------------------------------------
4381
4382 \brief wlan_ftm_priv_get_channel() -
4383
4384 This function gets the channel number from the halphy ptt module and
4385 returns the channel number to the application.
4386
4387 \param - pAdapter - Pointer HDD Context.
4388 - pChannel - Poniter to get the Channel number.
4389
4390 \return - 0 for success, non zero for failure
4391
4392 --------------------------------------------------------------------------*/
4393
4394static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4395{
Jeff Johnson295189b2012-06-20 16:38:30 -07004396 uPttMsgs *pMsgBody;
4397 VOS_STATUS status;
4398 v_U16_t freq;
4399 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304400 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004401
4402 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304403 v_PVOID_t devHandle = pHddCtx->parent_dev;
4404 struct device *wcnss_device = (struct device *)devHandle;
4405 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304406 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004407 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304408 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4409 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004410 return VOS_STATUS_E_FAILURE;
4411 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304412
4413 if (NULL == pMsgBuf)
4414 {
4415 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4416 "%s:pMsgBuf is NULL", __func__);
4417 return VOS_STATUS_E_NOMEM;
4418 }
4419
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304420 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004421 init_completion(&pHddCtx->ftm.ftm_comp_var);
4422 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4423 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4424
4425 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304426 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4427 if (NULL == wcnss_memory)
4428 {
4429 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4430 "%s: wcnss_memory is NULL", __func__);
4431 return VOS_STATUS_E_NOMEM;
4432 }
4433 else
4434 {
4435 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4436 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4437 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004438 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4439
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304440 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004441 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304442 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4443 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004444 status = VOS_STATUS_E_FAILURE;
4445 goto done;
4446
4447 }
c_hpothuffdb5272013-10-02 16:42:35 +05304448 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304449 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304450 if (0 >= ret )
4451 {
4452 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4453 FL("wait on ftm_comp_var failed %ld"), ret);
4454 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004455
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304456 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304458 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4459 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004460 status = VOS_STATUS_E_FAILURE;
4461 goto done;
4462 }
4463
4464 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4465
4466 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4467 indx++;
4468 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4469 {
4470 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4471 status = VOS_STATUS_E_FAILURE;
4472 goto done;
4473 }
4474
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004475 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004476
Arif Hussain6d2a3322013-11-17 19:50:10 -08004477 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004478 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004479
4480 return status;
4481}
4482
4483/**---------------------------------------------------------------------------
4484
4485 \brief wlan_ftm_priv_get_txpower() -
4486
4487 This function gets the TX power from the halphy ptt module and
4488 returns the TX power to the application.
4489
4490 \param - pAdapter - Pointer HDD Context.
4491 - pTxPwr - Poniter to get the Tx power.
4492
4493 \return - 0 for success, non zero for failure
4494
4495 --------------------------------------------------------------------------*/
4496
4497static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4498{
Jeff Johnson295189b2012-06-20 16:38:30 -07004499 uPttMsgs *pMsgBody;
4500 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304501 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004502 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4503
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304504 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004505 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304506 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4507 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004508 return VOS_STATUS_E_FAILURE;
4509 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304510
4511 if (NULL == pMsgBuf)
4512 {
4513 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4514 "%s:pMsgBuf is NULL", __func__);
4515 return VOS_STATUS_E_NOMEM;
4516 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304517 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004518 init_completion(&pHddCtx->ftm.ftm_comp_var);
4519 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4520 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4521
4522 pMsgBody = &pMsgBuf->msgBody;
4523
4524 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4525
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304526 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004527 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304528 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4529 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004530 status = VOS_STATUS_E_FAILURE;
4531 goto done;
4532 }
c_hpothuffdb5272013-10-02 16:42:35 +05304533 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304534 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304535 if (0 >= ret )
4536 {
4537 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4538 FL("wait on ftm_comp_var failed %ld"), ret);
4539 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004540
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304541 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004542 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4544 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004545 status = VOS_STATUS_E_FAILURE;
4546 goto done;
4547 }
4548 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4549
4550 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004551
4552 return status;
4553}
4554
4555/**---------------------------------------------------------------------------
4556
Jeff Johnson295189b2012-06-20 16:38:30 -07004557 \brief wlan_ftm_priv_get_txrate() -
4558
4559 This function gets the TX rate from the halphy ptt module and
4560 returns the TX rate to the application.
4561
4562 \param - pAdapter - Pointer HDD Context.
4563 - pTxRate - Poniter to get the Tx rate.
4564
4565 \return - 0 for success, non zero for failure
4566
4567 --------------------------------------------------------------------------*/
4568
4569static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4570{
Jeff Johnson295189b2012-06-20 16:38:30 -07004571 uPttMsgs *pMsgBody;
4572 VOS_STATUS status;
4573 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304574 long ret;
4575
Jeff Johnson295189b2012-06-20 16:38:30 -07004576 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4577
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304578 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004579 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304580 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4581 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004582 return VOS_STATUS_E_FAILURE;
4583 }
4584
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304585 if (NULL == pMsgBuf)
4586 {
4587 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4588 "%s:pMsgBuf is NULL", __func__);
4589 return VOS_STATUS_E_NOMEM;
4590 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304591 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004592 init_completion(&pHddCtx->ftm.ftm_comp_var);
4593 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4594 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4595
4596 pMsgBody = &pMsgBuf->msgBody;
4597
4598 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4599
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304600 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004601 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304602 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4603 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004604 status = VOS_STATUS_E_FAILURE;
4605 goto done;
4606 }
c_hpothuffdb5272013-10-02 16:42:35 +05304607 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304608 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304609 if (0 >= ret )
4610 {
4611 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4612 FL("wait on ftm_comp_var failed %ld"), ret);
4613 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004614
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304615 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004616
4617 rate_index = pMsgBody->GetTxPowerReport.rate;
4618 }
4619 else {
4620 /*Return the default rate*/
4621 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304622 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4623 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004624 status = VOS_STATUS_E_FAILURE;
4625 goto done;
4626 }
4627
4628 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4629 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4630 break;
4631 }
4632 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4633 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004635 status = VOS_STATUS_E_FAILURE;
4636 goto done;
4637 }
4638 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4639done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004640
4641 return status;
4642
4643}
4644
4645/**---------------------------------------------------------------------------
4646
4647 \brief wlan_ftm_priv_get_rx_pkt_count() -
4648
4649 This function gets the rx pkt count from the halphy ptt module and
4650 returns the rx pkt count to the application.
4651
4652 \param - pAdapter - Pointer HDD Context.
4653 - pRxPktCnt - Poniter to get the rx pkt count.
4654
4655 \return - 0 for success, non zero for failure
4656
4657 --------------------------------------------------------------------------*/
4658
4659static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4660{
Jeff Johnson295189b2012-06-20 16:38:30 -07004661 uPttMsgs *pMsgBody;
4662 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304663 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4665
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304666 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004667 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304668 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4669 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004670 return VOS_STATUS_E_FAILURE;
4671 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304672
4673 if (NULL == pMsgBuf)
4674 {
4675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4676 "%s:pMsgBuf is NULL", __func__);
4677 return VOS_STATUS_E_NOMEM;
4678 }
4679
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304680 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004681 init_completion(&pHddCtx->ftm.ftm_comp_var);
4682 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4683 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4684
4685 pMsgBody = &pMsgBuf->msgBody;
4686
4687 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4688
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304689 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004690 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304691 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4692 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004693 status = VOS_STATUS_E_FAILURE;
4694 goto done;
4695 }
c_hpothuffdb5272013-10-02 16:42:35 +05304696 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304697 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304698 if (0 >= ret )
4699 {
4700 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4701 FL("wait on ftm_comp_var failed %ld"), ret);
4702 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004703
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304704 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004705 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304706 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4707 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004708 status = VOS_STATUS_E_FAILURE;
4709 goto done;
4710 }
4711 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4712done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004713
4714 return status;
4715}
4716
4717/**---------------------------------------------------------------------------
4718
4719 \brief wlan_ftm_priv_get_rx_rssi() -
4720
4721 This function gets the rx rssi from the halphy ptt module and
4722 returns the rx rssi to the application.
4723
4724 \param - pAdapter - Pointer HDD Context.
4725 - buf - Poniter to get rssi of Rx chains
4726
4727 \return - 0 for success, non zero for failure
4728
4729 --------------------------------------------------------------------------*/
4730
4731static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4732{
Jeff Johnson295189b2012-06-20 16:38:30 -07004733 uPttMsgs *pMsgBody;
4734 VOS_STATUS status;
4735 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304736 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004737
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304738 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004739 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304740 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4741 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004742 return VOS_STATUS_E_FAILURE;
4743 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304744
4745 if (NULL == pMsgBuf)
4746 {
4747 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4748 "%s:pMsgBuf is NULL", __func__);
4749 return VOS_STATUS_E_NOMEM;
4750 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304751 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004752 init_completion(&pHddCtx->ftm.ftm_comp_var);
4753 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4754 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4755
4756 pMsgBody = &pMsgBuf->msgBody;
4757
4758 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4759
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304760 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004761 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304762 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4763 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004764 status = VOS_STATUS_E_FAILURE;
4765 goto done;
4766 }
c_hpothuffdb5272013-10-02 16:42:35 +05304767 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304768 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304769 if (0 >= ret )
4770 {
4771 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4772 FL("wait on ftm_comp_var failed %ld"), ret);
4773 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004774
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304775 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004776 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304777 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4778 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004779 status = VOS_STATUS_E_FAILURE;
4780 goto done;
4781 }
4782
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004783 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4784 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004785 pMsgBody->GetRxRssi.rssi.rx[1]);
4786
4787 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4788 {
4789 status = VOS_STATUS_E_FAILURE;
4790 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004791
Jeff Johnson295189b2012-06-20 16:38:30 -07004792done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004793
4794 return status;
4795}
4796
4797/**---------------------------------------------------------------------------
4798
4799 \brief wlan_ftm_priv_get_mac_address() -
4800
4801 This function gets the mac address from the halphy ptt module and
4802 returns the mac address to the application.
4803
4804 \param - pAdapter - Pointer HDD Context.
4805 - buf - Poniter to get the mac address.
4806
4807 \return - 0 for success, non zero for failure
4808
4809 --------------------------------------------------------------------------*/
4810
4811static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4812{
4813 v_BOOL_t itemIsValid = VOS_FALSE;
4814 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4815 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004816
Jeff Johnson295189b2012-06-20 16:38:30 -07004817 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4818
4819 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4820 {
4821 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4822 return VOS_STATUS_E_FAILURE;
4823 }
4824 /*Check the NV FIELD is valid or not*/
4825 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4826 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004827 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004828 {
4829 vos_nv_readMacAddress(macAddr);
4830
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004831 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4832 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004833 MAC_ADDR_ARRAY(macAddr));
4834 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4835 {
4836 return VOS_STATUS_E_FAILURE;
4837 }
4838 }
4839 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004840 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004841 {
4842 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004843 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4844 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004845 MAC_ADDR_ARRAY(macAddr));
4846
4847 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4848 {
4849 return VOS_STATUS_E_FAILURE;
4850 }
4851 }
4852 return VOS_STATUS_SUCCESS;
4853}
4854
4855/**---------------------------------------------------------------------------
4856
4857 \brief wlan_ftm_priv_set_mac_address() -
4858
4859 This function sets the mac address to the halphy ptt module and
4860 sends the netlink message to the ptt socket application which writes
4861 the macaddress to the qcom_wlan_nv.bin file
4862
4863 \param - pAdapter - Pointer HDD Context.
4864 - buf - Poniter to the macaddress.
4865
4866 \return - 0 for success, non zero for failure
4867
4868 --------------------------------------------------------------------------*/
4869
4870static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4871{
Jeff Johnson295189b2012-06-20 16:38:30 -07004872 uPttMsgs *pMsgBody;
4873 VOS_STATUS status;
4874 int macAddr[VOS_MAC_ADDRESS_LEN];
4875 v_U8_t *pMacAddress;
4876 v_U8_t ii;
4877 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304878 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004879
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304880 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004881 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304882 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4883 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004884 return VOS_STATUS_E_FAILURE;
4885 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304886 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004887 init_completion(&pHddCtx->ftm.ftm_comp_var);
4888 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4889 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4890
4891 pMsgBody = &pMsgBuf->msgBody;
4892 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4893
4894 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004895 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]))
4896 {
4897 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4898 "Invalid MacAddress Input %s", buf);
4899 return VOS_STATUS_E_FAILURE;
4900 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004901
Arif Hussain24bafea2013-11-15 15:10:03 -08004902 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4903 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004904
4905
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004906 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004907
4908 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4909 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4910
4911
Arif Hussain24bafea2013-11-15 15:10:03 -08004912 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4913 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4915
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304916 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004917 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304918 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4919 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004920 status = VOS_STATUS_E_FAILURE;
4921 goto done;
4922 }
c_hpothuffdb5272013-10-02 16:42:35 +05304923 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304924 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304925 if (0 >= ret )
4926 {
4927 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4928 FL("wait on ftm_comp_var failed %ld"), ret);
4929 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004930
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304931 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004932 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304933 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4934 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004935 status = VOS_STATUS_E_FAILURE;
4936 goto done;
4937 }
4938
Arif Hussain6d2a3322013-11-17 19:50:10 -08004939 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004940
4941 init_completion(&pHddCtx->ftm.ftm_comp_var);
4942 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4943
4944 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4945 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4946
4947 pMsgBody = &pMsgBuf->msgBody;
4948
4949 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4950
4951 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4952
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304953 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004954 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304955 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4956 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004957 status = VOS_STATUS_E_FAILURE;
4958 goto done;
4959 }
4960
c_hpothuffdb5272013-10-02 16:42:35 +05304961 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304962 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304963 if (0 >= ret )
4964 {
4965 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4966 FL("wait on ftm_comp_var failed %ld"), ret);
4967 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004968done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004969
4970 return VOS_STATUS_SUCCESS;
4971}
4972
4973/* set param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304974static int __iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004975 union iwreq_data *wrqu, char *extra)
4976{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004977 int ret,sub_cmd;
4978 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304979 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004980 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004981 hdd_adapter_t *pAdapter;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304982 hdd_context_t *pHddCtx;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304983 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07004984
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304985 ENTER();
4986
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004987 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304988 /* helper function to get iwreq_data with compat handling. */
4989 if (hdd_priv_get_data(&s_priv_data, wrqu))
4990 {
4991 return -EINVAL;
4992 }
4993
4994 /* make sure all params are correctly passed to function */
4995 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
4996 {
4997 return -EINVAL;
4998 }
4999
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305000 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
5001 if (NULL == pAdapter)
5002 {
5003 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5004 "%s: Adapter is NULL",__func__);
5005 return -EINVAL;
5006 }
5007 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5008 ret = wlan_hdd_validate_context(pHddCtx);
5009 if (0 != ret)
5010 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305011 return ret;
5012 }
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305013 sub_cmd = s_priv_data.flags;
5014 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005015
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005016 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
5017 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
5018 * odd number which assigns set_args to zero.we assisgn memory using
5019 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005020 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005021 param = kzalloc(length + 1, GFP_KERNEL);
5022 if (!param)
5023 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08005024
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305025 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005026 {
5027 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
5028 "%s:Failed to get user data %s", __func__, param);
5029
5030 ret = -EINVAL;
5031 goto OUT;
5032 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005033
5034 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305035 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005036
5037 switch(sub_cmd)
5038 {
5039 case WE_SET_MAC_ADDRESS:
5040 {
5041
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005042 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005043 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005044
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005045 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005046
5047 if(status != VOS_STATUS_SUCCESS)
5048 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005049 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005050 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005051
Jeff Johnson295189b2012-06-20 16:38:30 -07005052 ret = -EINVAL;
5053 }
5054
Wilson Yang7c471652013-12-20 16:36:44 -08005055 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005056 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005057 case WE_SET_TX_RATE:
5058 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005059 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005060
5061 if(status != VOS_STATUS_SUCCESS)
5062 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005063 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005064 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005065
5066 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005067 }
5068
5069 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005070 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005071 default:
5072 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005073 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005074 ret = -EINVAL;
5075 break;
5076 }
5077 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005078
5079OUT:
5080 kfree(param);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305081 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005082 return ret;
5083}
5084
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305085static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
5086 union iwreq_data *wrqu, char *extra)
5087{
5088 int ret;
5089
5090 vos_ssr_protect(__func__);
5091 ret = __iw_ftm_setchar_getnone(dev, info, wrqu, extra);
5092 vos_ssr_unprotect(__func__);
5093
5094 return ret;
5095}
5096
5097static int __iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005098 union iwreq_data *wrqu, char *extra)
5099{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305100 hdd_adapter_t *pAdapter;
5101 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005102 int *value = (int *)extra;
5103 int sub_cmd = value[0];
5104 int set_value = value[1];
5105 int ret = 0; /* success */
5106 VOS_STATUS status;
5107
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305108 ENTER();
5109
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305110 pAdapter = (netdev_priv(dev));
5111 if (NULL == pAdapter)
5112 {
5113 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5114 return -EINVAL;
5115 }
5116 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5117 ret = wlan_hdd_validate_context(pHddCtx);
5118 if (0 != ret)
5119 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305120 return ret;
5121 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005122 switch(sub_cmd)
5123 {
5124 case WE_FTM_ON_OFF:
5125 {
5126 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5127
5128 if(status != VOS_STATUS_SUCCESS)
5129 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005130 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005131 ret = -EINVAL;
5132 }
5133
5134 break;
5135 }
5136
5137 case WE_TX_PKT_GEN:
5138 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5139
5140 if(status != VOS_STATUS_SUCCESS)
5141 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005142 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005143 ret = -EINVAL;
5144 }
5145 break;
5146
5147 case WE_SET_TX_IFS:
5148 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5149
5150 if(status != VOS_STATUS_SUCCESS)
5151 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005152 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005153 ret = -EINVAL;
5154 }
5155 break;
5156
5157 case WE_SET_TX_PKT_CNT:
5158 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5159
5160 if(status != VOS_STATUS_SUCCESS)
5161 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005162 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005163 ret = -EINVAL;
5164 }
5165 break;
5166
5167 case WE_SET_TX_PKT_LEN:
5168 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5169
5170 if(status != VOS_STATUS_SUCCESS)
5171 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005172 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005173 ret = -EINVAL;
5174 }
5175 break;
5176
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305177 case WE_TX_CW_RF_GEN:
5178 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5179
5180 if(status != VOS_STATUS_SUCCESS)
5181 {
5182 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5183 ret = -EINVAL;
5184 }
5185 break;
5186
Jeff Johnson295189b2012-06-20 16:38:30 -07005187 case WE_SET_CHANNEL:
5188 {
5189 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5190
5191 if(status != VOS_STATUS_SUCCESS)
5192 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005193 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005194 ret = -EINVAL;
5195 }
5196 break;
5197 }
5198 case WE_SET_TX_POWER:
5199 {
5200 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5201
5202 if(status != VOS_STATUS_SUCCESS)
5203 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005204 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005205 ret = -EINVAL;
5206 }
5207 break;
5208 }
5209 case WE_CLEAR_RX_PKT_CNT:
5210 {
5211 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5212
5213 if(status != VOS_STATUS_SUCCESS)
5214 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005215 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005216 ret = -EINVAL;
5217 }
5218 break;
5219 }
5220 case WE_RX:
5221 {
5222 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5223
5224 if(status != VOS_STATUS_SUCCESS)
5225 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005226 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005227 ret = -EINVAL;
5228 }
5229 break;
5230 }
5231 case WE_ENABLE_CHAIN:
5232 {
5233 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5234
5235 if(status != VOS_STATUS_SUCCESS)
5236 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005237 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005238 ret = -EINVAL;
5239 }
5240 break;
5241 }
5242
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305243 case WE_SET_PWR_CNTL_MODE:
5244 {
5245 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5246 if (status != VOS_STATUS_SUCCESS)
5247 {
5248 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5249 status);
5250 ret = -EINVAL;
5251 }
5252 break;
5253 }
5254
5255 case WE_ENABLE_DPD:
5256 {
5257 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5258 if (status != VOS_STATUS_SUCCESS)
5259 {
5260 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5261 ret = -EINVAL;
5262 }
5263 break;
5264 }
5265
5266 case WE_SET_CB:
5267 {
5268 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5269 if (status != VOS_STATUS_SUCCESS)
5270 {
5271 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5272 ret = -EINVAL;
5273 }
5274 break;
5275 }
5276
Jeff Johnson295189b2012-06-20 16:38:30 -07005277 default:
5278 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005279 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005280 sub_cmd, set_value);
5281 break;
5282 }
5283 }
5284
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305285 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005286 return ret;
5287}
5288
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305289static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5290 union iwreq_data *wrqu, char *extra)
5291{
5292 int ret;
5293
5294 vos_ssr_protect(__func__);
5295 ret = __iw_ftm_setint_getnone(dev, info, wrqu, extra);
5296 vos_ssr_unprotect(__func__);
5297
5298 return ret;
5299}
Jeff Johnson295189b2012-06-20 16:38:30 -07005300/* get param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305301static int __iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005302 union iwreq_data *wrqu, char *extra)
5303{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305304 hdd_adapter_t *pAdapter;
5305 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005306 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005307 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005308 VOS_STATUS status;
5309
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305310 ENTER();
5311
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305312 pAdapter = (netdev_priv(dev));
5313 if (NULL == pAdapter)
5314 {
5315 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5316 return -EINVAL;
5317 }
5318 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5319 ret = wlan_hdd_validate_context(pHddCtx);
5320 if (0 != ret)
5321 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305322 return ret;
5323 }
5324
Jeff Johnson295189b2012-06-20 16:38:30 -07005325 switch (value[0])
5326 {
5327 case WE_GET_CHANNEL:
5328 {
5329 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5330
5331 if(status != VOS_STATUS_SUCCESS)
5332 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005333 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005334 ret = -EINVAL;
5335 }
5336 break;
5337 }
5338 case WE_GET_TX_POWER:
5339 {
5340 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5341
5342 if(status != VOS_STATUS_SUCCESS)
5343 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005344 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005345 ret = -EINVAL;
5346 }
5347 break;
5348 }
5349 case WE_GET_RX_PKT_CNT:
5350 {
5351 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5352
5353 if(status != VOS_STATUS_SUCCESS)
5354 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005355 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005356 ret = -EINVAL;
5357 }
5358 break;
5359 }
5360 default:
5361 {
5362 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5363 break;
5364 }
5365 }
5366
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305367 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005368 return ret;
5369}
5370
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305371static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5372 union iwreq_data *wrqu, char *extra)
5373{
5374 int ret;
5375
5376 vos_ssr_protect(__func__);
5377 ret = __iw_ftm_setnone_getint(dev, info, wrqu, extra);
5378 vos_ssr_unprotect(__func__);
5379
5380 return ret;
5381}
5382
5383static int __iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 union iwreq_data *wrqu, char *extra)
5385{
5386 int sub_cmd = wrqu->data.flags;
5387 VOS_STATUS status;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305388 hdd_adapter_t *pAdapter;
5389 hdd_context_t *pHddCtx;
5390 int ret = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005391
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305392 ENTER();
5393
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305394 pAdapter = (netdev_priv(dev));
5395 if (NULL == pAdapter)
5396 {
5397 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5398 return -EINVAL;
5399 }
5400 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5401 ret = wlan_hdd_validate_context(pHddCtx);
5402 if (0 != ret)
5403 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305404 return ret;
5405 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005406 switch(sub_cmd)
5407 {
5408 case WE_GET_MAC_ADDRESS:
5409 {
5410 status = wlan_ftm_priv_get_mac_address(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_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005415 return -EINVAL;
5416 }
5417 wrqu->data.length = strlen(extra)+1;
5418 break;
5419 }
5420 case WE_GET_TX_RATE:
5421 {
5422 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5423
5424 if(status != VOS_STATUS_SUCCESS)
5425 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005426 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005427 return -EINVAL;
5428 }
5429
5430 wrqu->data.length = strlen(extra)+1;
5431 break;
5432 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005433 case WE_GET_FTM_STATUS:
5434 {
5435 status = wlan_ftm_priv_get_status(pAdapter, extra);
5436
5437 if(status != VOS_STATUS_SUCCESS)
5438 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005439 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005440 return -EINVAL;
5441 }
5442
5443 wrqu->data.length = strlen(extra)+1;
5444 break;
5445 }
5446 case WE_GET_RX_RSSI:
5447 {
5448 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5449
5450 if(status != VOS_STATUS_SUCCESS)
5451 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005452 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005453 return -EINVAL;
5454 }
5455
5456 wrqu->data.length = strlen(extra)+1;
5457 break;
5458 }
5459 default:
5460 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005461 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005462 break;
5463 }
5464 }
5465
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305466 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005467 return 0;
5468}
Jeff Johnson295189b2012-06-20 16:38:30 -07005469
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305470static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5471 union iwreq_data *wrqu, char *extra)
5472{
5473 int ret;
5474
5475 vos_ssr_protect(__func__);
5476 ret = __iw_ftm_get_char_setnone(dev, info, wrqu, extra);
5477 vos_ssr_unprotect(__func__);
5478
5479
5480 return ret;
5481}
5482
Jeff Johnson295189b2012-06-20 16:38:30 -07005483VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5484{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005485#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005486 tAniHdr *wmsg = NULL;
5487 v_U8_t *pBuf;
5488 hdd_context_t *pHddCtx = NULL;
5489 v_CONTEXT_t pVosContext= NULL;
5490
5491 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5492 if(pBuf == NULL)
5493 {
5494 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5495 return VOS_STATUS_E_NOMEM;
5496 }
5497 wmsg = (tAniHdr*)pBuf;
5498 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5499 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5500 wmsg->length = FTM_SWAP16(wmsg->length);
5501 pBuf += sizeof(tAniHdr);
5502
5503 /*Get the global context */
5504 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5505
5506 /*Get the Hdd Context */
5507 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5508 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5509
5510 /* EfS command Code */
5511 *(v_U32_t*)pBuf = 0x000000EF;
5512
5513 pBuf += sizeof(v_U32_t);
5514
5515 memcpy(pBuf, pData,data_len);
5516
5517 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305518 if( ptt_sock_send_msg_to_app(wmsg, 0,
5519 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005520
Arif Hussain6d2a3322013-11-17 19:50:10 -08005521 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 -07005522 vos_mem_free((v_VOID_t*)wmsg);
5523 return VOS_STATUS_E_FAILURE;
5524 }
5525 }
5526 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305527 if( ptt_sock_send_msg_to_app(wmsg, 0,
5528 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005529
Arif Hussain6d2a3322013-11-17 19:50:10 -08005530 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 -07005531 vos_mem_free((v_VOID_t*)wmsg);
5532 return VOS_STATUS_E_FAILURE;
5533 }
5534 }
5535
5536 vos_mem_free((v_VOID_t*)wmsg);
5537#endif //FTM and ANDROID
5538
5539 return VOS_STATUS_SUCCESS;
5540}
5541
Jeff Johnson295189b2012-06-20 16:38:30 -07005542/* action sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305543static int __iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005544 union iwreq_data *wrqu, char *extra)
5545{
5546 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005547 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005548
5549 switch (sub_cmd)
5550 {
5551 case WE_SET_NV_DEFAULTS:
5552 {
5553 v_U8_t *pu8buf,*pTempBuf;
5554 v_U16_t size;
5555 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005556 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005557 pu8buf = vos_mem_malloc(size);
5558 if(pu8buf == NULL)
5559 {
5560 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5561 return VOS_STATUS_E_NOMEM;
5562 }
5563 memset(pu8buf,0,size);
5564 pTempBuf = pu8buf;
5565 pTempBuf += sizeof(v_U32_t);
5566 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5567
5568 wlan_write_to_efs(pu8buf,size);
5569 vos_mem_free(pu8buf);
5570 }
5571
5572 default:
5573 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005574 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005575 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5576 break;
5577 }
5578 }
5579
5580 return ret;
5581}
5582
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305583static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5584 union iwreq_data *wrqu, char *extra)
5585{
5586 int ret;
5587
5588 vos_ssr_protect(__func__);
5589 ret = __iw_ftm_setnone_getnone(dev, info, wrqu, extra);
5590 vos_ssr_unprotect(__func__);
5591
5592 return ret;
5593}
5594
5595static int __iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305596 union iwreq_data *wrqu, char *extra)
5597{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305598 hdd_adapter_t *pAdapter;
5599 hdd_context_t *pHddCtx;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305600 int sub_cmd = wrqu->data.flags;
5601 int *value = (int*)wrqu->data.pointer;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305602 int ret = 0;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305603 VOS_STATUS status;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305604
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305605 ENTER();
5606
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305607 if(wrqu->data.length < 2)
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305608 {
5609 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5610 return -EINVAL;
5611 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305612
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305613 pAdapter = (netdev_priv(dev));
5614 if (NULL == pAdapter)
5615 {
5616 hddLog(VOS_TRACE_LEVEL_ERROR,
5617 "%s: Adapter is NULL",__func__);
5618 return -EINVAL;
5619 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305620
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305621 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5622 ret = wlan_hdd_validate_context(pHddCtx);
5623 if (0 != ret)
5624 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305625 return ret;
5626 }
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305627
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305628 switch (sub_cmd)
5629 {
5630 case WE_SET_TX_WF_GAIN:
5631 {
5632 v_S15_t dGain = 0;
5633 v_U16_t rfGain = 0;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305634
5635 dGain = *(v_S15_t*) value++;
5636 rfGain = *(v_U16_t*) value;
5637 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5638
5639 if(status != VOS_STATUS_SUCCESS)
5640 {
5641 hddLog(VOS_TRACE_LEVEL_FATAL,
5642 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5643 return -EINVAL;
5644 }
5645 }
5646 break;
5647
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305648 case WE_SET_DUMP:
5649 if (*value == 1)
5650 {
5651 status = wlan_ftm_priv_set_dump(pAdapter, value);
5652 if(status != VOS_STATUS_SUCCESS)
5653 {
5654 hddLog(LOGE, "wlan_ftm_priv_set_dump Failed =%d\n",
5655 status);
5656 ret = -EINVAL;
5657 }
5658 }else
5659 {
5660 hddLog(LOGE, "%s arg[0]: %d expecting arg[0]: 1\n",
5661 __func__, *value);
5662 }
5663 break;
5664
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305665 default:
5666 {
5667 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5668 break;
5669 }
5670 }
5671
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305672 EXIT();
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305673 return 0;
5674}
5675
5676
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305677static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5678 union iwreq_data *wrqu, char *extra)
5679{
5680 int ret;
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305681 union iwreq_data u_priv_wrqu;
5682 int apps_args[MAX_VAR_ARGS] = {0};
5683 int num_args;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305684
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305685 /* helper function to get iwreq_data with compat handling. */
5686 if (hdd_priv_get_data(&u_priv_wrqu.data, wrqu))
5687 {
5688 return -EINVAL;
5689 }
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305690
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305691 if (NULL == u_priv_wrqu.data.pointer)
5692 {
5693 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5694 "%s: NULL data pointer", __func__);
5695 return -EINVAL;
5696 }
5697
5698 num_args = u_priv_wrqu.data.length;
5699 if (num_args > MAX_VAR_ARGS)
5700 {
5701 num_args = MAX_VAR_ARGS;
5702 }
5703
5704 if (copy_from_user(apps_args, u_priv_wrqu.data.pointer,
5705 (sizeof(int)) * num_args))
5706 {
5707 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5708 "%s: failed to copy data from user buffer", __func__);
5709 return -EFAULT;
5710 }
5711
5712 vos_ssr_protect(__func__);
5713 ret = __iw_ftm_set_var_ints_getnone(dev, info, &u_priv_wrqu,
5714 (char *)&apps_args);
5715 vos_ssr_unprotect(__func__);
5716
5717 return ret;
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305718}
5719
Jeff Johnson295189b2012-06-20 16:38:30 -07005720static const iw_handler we_ftm_private[] = {
5721
5722 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5723 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5724 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5725 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5726 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305727 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005728};
5729
5730/*Maximum command length can be only 15 */
5731static const struct iw_priv_args we_ftm_private_args[] = {
5732
5733 /* handlers for main ioctl */
5734 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5735 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5736 0,
5737 "" },
5738
5739 { WE_FTM_ON_OFF,
5740 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5741 0,
5742 "ftm" },
5743
5744 { WE_TX_PKT_GEN,
5745 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5746 0,
5747 "tx" },
5748
5749 { WE_SET_TX_IFS,
5750 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5751 0,
5752 "set_txifs" },
5753
5754 { WE_SET_TX_PKT_CNT,
5755 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5756 0,
5757 "set_txpktcnt" },
5758
5759 { WE_SET_TX_PKT_LEN,
5760 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5761 0,
5762 "set_txpktlen" },
5763
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305764 { WE_SET_TX_WF_GAIN,
5765 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5766 0,
5767 "set_tx_wf_gain" },
5768
5769 { WE_TX_CW_RF_GEN,
5770 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5771 0,
5772 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005773 { WE_SET_CHANNEL,
5774 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5775 0,
5776 "set_channel" },
5777
5778 { WE_SET_TX_POWER,
5779 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5780 0,
5781 "set_txpower" },
5782
5783 { WE_CLEAR_RX_PKT_CNT,
5784 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5785 0,
5786 "clr_rxpktcnt" },
5787
5788 { WE_RX,
5789 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5790 0,
5791 "rx" },
5792
5793 { WE_ENABLE_CHAIN,
5794 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5795 0,
5796 "ena_chain" },
5797
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305798 { WE_SET_PWR_CNTL_MODE,
5799 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5800 0,
5801 "pwr_cntl_mode" },
5802
5803 { WE_ENABLE_DPD,
5804 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5805 0,
5806 "ena_dpd" },
5807
5808 { WE_SET_CB,
5809 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5810 0,
5811 "set_cb" },
5812
Jeff Johnson295189b2012-06-20 16:38:30 -07005813 /* handlers for main ioctl */
5814 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5815 0,
5816 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5817 "" },
5818
5819 { WE_GET_CHANNEL,
5820 0,
5821 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5822 "get_channel" },
5823
5824 { WE_GET_TX_POWER,
5825 0,
5826 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5827 "get_txpower" },
5828
5829 { WE_GET_RX_PKT_CNT,
5830 0,
5831 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5832 "get_rxpktcnt" },
5833
5834 /* handlers for main ioctl */
5835 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5836 IW_PRIV_TYPE_CHAR| 512,
5837 0,
5838 "" },
5839
5840 { WE_SET_MAC_ADDRESS,
5841 IW_PRIV_TYPE_CHAR| 512,
5842 0,
5843 "set_mac_address" },
5844
5845 { WE_SET_TX_RATE,
5846 IW_PRIV_TYPE_CHAR | 512,
5847 0,
5848 "set_txrate" },
5849
5850 /* handlers for main ioctl */
5851 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5852 0,
5853 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5854 "" },
5855
5856 { WE_GET_MAC_ADDRESS,
5857 0,
5858 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5859 "get_mac_address" },
5860
Jeff Johnson295189b2012-06-20 16:38:30 -07005861 { WE_GET_TX_RATE,
5862 0,
5863 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5864 "get_txrate" },
5865
5866 { WE_GET_FTM_STATUS,
5867 0,
5868 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5869 "get_status" },
5870
5871 { WE_GET_RX_RSSI,
5872 0,
5873 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5874 "get_rx_rssi" },
5875
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305876 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5877 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5878 0,
5879 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005880 /* handlers for main ioctl */
5881 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5882 0,
5883 0,
5884 "" },
5885
5886 /* handlers for sub-ioctl */
5887 { WE_SET_NV_DEFAULTS,
5888 0,
5889 0,
5890 "set_nv_defaults" },
5891
Anand N Sunkadc05b9c32015-06-18 18:54:53 +05305892 { WE_SET_DUMP,
5893 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5894 0,
5895 "dump" },
5896
Jeff Johnson295189b2012-06-20 16:38:30 -07005897};
5898
5899const struct iw_handler_def we_ftm_handler_def = {
5900 .num_standard = 0,
5901 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5902 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5903
5904 .standard = (iw_handler *)NULL,
5905 .private = (iw_handler *)we_ftm_private,
5906 .private_args = we_ftm_private_args,
5907 .get_wireless_stats = NULL,
5908};
5909
5910static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5911{
5912
5913 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5914
5915 // Zero the memory. This zeros the profile structure.
5916 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005917
Jeff Johnson295189b2012-06-20 16:38:30 -07005918 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5919
5920 return 0;
5921}
5922
Jeff Johnson295189b2012-06-20 16:38:30 -07005923
5924VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5925{
Jeff Johnson295189b2012-06-20 16:38:30 -07005926 ftm_rsp_msg_t *pFtmMsgRsp;
5927
5928 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5929 hdd_context_t *pHddCtx;
5930 v_CONTEXT_t pVosContext= NULL;
5931
5932 ENTER();
5933
5934 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5935
5936 if (!message )
5937 {
5938 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5939 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5940 return VOS_STATUS_E_INVAL;
5941 }
5942 /*Get the global context */
5943 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5944
5945 /*Get the Hdd Context */
5946 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5947
5948 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5949
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305950 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005951 complete(&pHddCtx->ftm.ftm_comp_var);
5952 }
5953 else {
5954 /*Response length to Ptt App*/
5955 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5956
5957 /*Ptt App expects the response length in LE */
5958 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5959
5960 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005961 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005962 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5963
5964 /*Copy the message*/
5965 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5966
5967 /*Update the error code*/
5968 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5969
5970 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5971
5972 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5973 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005974 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005975 return VOS_STATUS_E_FAILURE;
5976 }
5977 }
5978 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005979 return VOS_STATUS_SUCCESS;
5980
5981}