blob: 47369995b33b7245a36b6299cfbf78d1054f5cc3 [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"
Jeff Johnson295189b2012-06-20 16:38:30 -070079
Jeff Johnson295189b2012-06-20 16:38:30 -070080#define RXMODE_DISABLE_ALL 0
81#define RXMODE_ENABLE_ALL 1
82#define RXMODE_ENABLE_11GN 2
83#define RXMODE_ENABLE_11B 3
84
85#define FTM_CHAIN_SEL_NO_RX_TX 0
86#define FTM_CHAIN_SEL_R0_ON 1
87#define FTM_CHAIN_SEL_T0_ON 2
88#define FTM_CHAIN_SEL_R0_T0_ON 3
89#define FTM_CHAIN_SEL_MAX 3
90
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053091#define WCNSS_TXFIR_OFFSET 0x00018000
92
Jeff Johnson295189b2012-06-20 16:38:30 -070093#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
Jeff Johnson295189b2012-06-20 16:38:30 -070094
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053095#ifndef QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET
96#define QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET 0x00013c34
Jeff Johnson295189b2012-06-20 16:38:30 -070097#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053098#endif /* QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET */
Jeff Johnson295189b2012-06-20 16:38:30 -070099
Jeff Johnson295189b2012-06-20 16:38:30 -0700100
Jeff Johnson295189b2012-06-20 16:38:30 -0700101/* To set 4MAC addresses from given first MAC address,
102 * Last byte value within given MAC address must less than 0xFF - 3 */
103#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700104#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700105
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530106#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
107
Jeff Johnson295189b2012-06-20 16:38:30 -0700108typedef struct {
109 tANI_U32 tableSize; /* Whole NV Table Size */
110 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
111 eNvTable nvTable;
112 tANI_U8 tableData; /* Filled by host driver */
113} pttGetNvTable;
114
115typedef struct {
116 tANI_U32 tableSize; /* Whole NV Table Size */
117 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
118 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700119 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700120} pttSetNvTable;
121
Jeff Johnson295189b2012-06-20 16:38:30 -0700122
123extern const sHalNv nvDefaults;
124static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700125static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700126VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700127
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700128/* 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 -0700129 Since it is associated to agc.channel_freq register for mapping.
130 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
131*/
132static const freq_chan_t freq_chan_tbl[] = {
133 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
134 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
135};
136
137static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
138{
139 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
140 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
141 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
142 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
143 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
144 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
145 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
146 //Spica_Virgo 11A 20MHz Rates
147 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
148 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
149 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
150 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
151 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
152 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
153 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
154 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
155
156//MCS Index #0-15 (20MHz)
157 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
158 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
159 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
160 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
161 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
162 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
163 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
164 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530165 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, "MCS_SG_7_2_MBPS"},
166 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS, "MCS_SG_14_4_MBPS"},
167 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS, "MCS_SG_21_7_MBPS"},
168 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS, "MCS_SG_28_9_MBPS"},
169 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS, "MCS_SG_43_3_MBPS"},
170 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS, "MCS_SG_57_8_MBPS"},
171 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, "MCS_SG_65_MBPS"},
172 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_SG_72_2_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530173
174//MCS Index #8-15 (40MHz)
175
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530176 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_5_MBPS" },
177 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
178 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
179 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
180 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
181 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
182 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
183 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530184 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
185 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
186 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
187 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
188 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
189 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
190 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800191 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530192
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800193#ifdef WLAN_FEATURE_11AC
194 /*11AC rate 20MHZ Normal GI*/
195 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
196 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
197 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
198 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
199 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
200 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
201 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
202 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
203 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530204#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800205 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530206#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800207
208 /*11AC rate 20MHZ Short GI*/
209 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
210 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
211 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
212 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
213 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
214 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
215 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
216 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
217 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530218#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800219 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530220#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800221
222 /*11AC rates 40MHZ normal GI*/
223 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
224 "MCS_VHT40_NGI_CB_13_5_MBPS"},
225 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
226 "MCS_VHT40_NGI_CB_27_MBPS"},
227 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
228 "MCS_VHT40_NGI_CB_40_5_MBPS"},
229 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
230 "MCS_VHT40_NGI_CB_54_MBPS"},
231 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
232 "MCS_VHT40_NGI_CB_81_MBPS"},
233 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
234 "MCS_VHT40_NGI_CB_108_MBPS"},
235 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
236 "MCS_VHT40_NGI_CB_121_5_MBPS"},
237 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
238 "MCS_VHT40_NGI_CB_135_MBPS"},
239 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
240 "MCS_VHT40_NGI_CB_162_MBPS"},
241 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
242 "MCS_VHT40_NGI_CB_180_MBPS"},
243
244 /*11AC rates 40MHZ short GI*/
245 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
246 "MCS_VHT40_SGI_CB_15_MBPS"},
247 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
248 "MCS_VHT40_SGI_CB_30_MBPS"},
249 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
250 "MCS_VHT40_SGI_CB_45_MBPS"},
251 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
252 "MCS_VHT40_SGI_CB_60_MBPS"},
253 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
254 "MCS_VHT40_SGI_CB_90_MBPS"},
255 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
256 "MCS_VHT40_SGI_CB_120_MBPS"},
257 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
258 "MCS_VHT40_SGI_CB_135_MBPS"},
259 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
260 "MCS_VHT40_SGI_CB_150_MBPS"},
261 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
262 "MCS_VHT40_SGI_CB_180_MBPS"},
263 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
264 "MCS_VHT40_SGI_CB_200_MBPS"},
265
266 /*11AC rates 80 MHZ normal GI*/
267 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
268 "MCS_VHT80_NGI_CB_29_3_MBPS"},
269 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
270 "MCS_VHT80_NGI_CB_58_5_MBPS"},
271 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
272 "MCS_VHT80_NGI_CB_87_8_MBPS"},
273 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
274 "MCS_VHT80_NGI_CB_117_MBPS"},
275 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
276 "MCS_VHT80_NGI_CB_175_5_MBPS"},
277 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
278 "MCS_VHT80_NGI_CB_234_MBPS"},
279 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
280 "MCS_VHT80_NGI_CB_263_3_MBPS"},
281 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
282 "MCS_VHT80_NGI_CB_292_5_MBPS"},
283 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
284 "MCS_VHT80_NGI_CB_351_MBPS"},
285 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
286 "MCS_VHT80_NGI_CB_390_MBPS"},
287
288 /*11AC rates 80 MHZ short GI*/
289 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
290 "MCS_VHT80_SGI_CB_32_5_MBPS"},
291 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
292 "MCS_VHT80_SGI_CB_65_MBPS"},
293 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
294 "MCS_VHT80_SGI_CB_97_5_MBPS"},
295 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
296 "MCS_VHT80_SGI_CB_130_MBPS"},
297 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
298 "MCS_VHT80_SGI_CB_195_MBPS"},
299 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
300 "MCS_VHT80_SGI_CB_260_MBPS"},
301 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
302 "MCS_VHT80_SGI_CB_292_5_MBPS"},
303 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
304 "MCS_VHT80_SGI_CB_325_MBPS"},
305 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
306 "MCS_VHT80_SGI_CB_390_MBPS"},
307 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
308 "MCS_VHT80_SGI_CB_433_3_MBPS"},
309#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700310};
311
312static rateIndex2Preamble_t rate_index_2_preamble_table[] =
313{
314
315 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
316 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
317 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
318 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
319 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
320 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
321 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
322
Jeff Johnson295189b2012-06-20 16:38:30 -0700323
324 //Spica_Virgo 11A 20MHz Rates
325 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
326 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
327 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
328 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
329 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
330 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
331 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
332 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
333
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530334 // 11A 20MHz Rates
335 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
336 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
337 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
338 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
339 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
340 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
341 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
342 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
343
Jeff Johnson295189b2012-06-20 16:38:30 -0700344 //MCS Index #0-15 (20MHz)
345 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
346 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
347 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
348 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
349 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
350 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
351 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
352 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
353 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
354 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
355 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
356 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
357 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
358 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
359 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
360 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530361
362 //MCS index (40MHz)
363 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
364 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
365 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
366 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
367 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
368 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
369 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
370 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
371 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
372 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
373 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
374 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
375 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
376 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
377 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800378 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530379
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800380#ifdef WLAN_FEATURE_11AC
381 /*11AC rate 20MHZ Normal GI*/
382 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
383 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
385 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
386 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
387 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
388 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
389 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
390 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530391#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800392 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530393#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800394 /*11AC rate 20MHZ Short GI*/
395 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
396 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
397 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
398 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
399 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
400 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
401 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530404#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800405 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530406#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800407
408 /*11AC rates 40MHZ normal GI*/
409 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
410 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
411 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
412 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
413 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
419
420 /*11AC rates 40MHZ short GI*/
421 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
422 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
423 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
424 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
425 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
426 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
431
432 /*11AC rates 80 MHZ normal GI*/
433 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
435 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
436 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
437 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
438 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
439 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
440 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
443
444 /*11AC rates 80 MHZ short GI*/
445 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
450 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
451 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
452 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
455#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700456};
457
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530458static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
459 11, 12, 13, 14, 36, 40, 44, 48,
460 52, 56, 60, 64, 100, 104, 108,
461 112, 116, 120, 124, 128, 132,
462 136, 140, 149, 153, 157, 161,
463 165, 208, 212, 216, 240, 244,
464 248, 252, 0 };
465static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
466 42, 46, 50, 54, 58, 62, 102, 106,
467 110, 114, 118, 122, 126, 130, 134,
468 138, 151, 155, 159, 163, 210, 214,
469 242, 246, 250, 0 };
470static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
471 114, 118, 122, 126, 130, 134, 155,
472 159, 246, 0 };
473
Jeff Johnson295189b2012-06-20 16:38:30 -0700474typedef struct
475{
476 tANI_BOOLEAN frameGenEnabled;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530477 tANI_BOOLEAN wfRfGenEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -0700478 tANI_BOOLEAN wfmEnabled;
479 sPttFrameGenParams frameParams;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530480 v_U16_t powerCtlMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700481 v_U16_t rxmode;
482 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530483 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700484
485} FTM_STATUS ;
486static FTM_STATUS ftm_status;
487
488//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530489static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700490
491static void _ftm_status_init(void)
492{
493 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
494 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
495 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
496
497 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
498 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530499 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700500 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530501 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700502 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
503 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530504 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700505 ftm_status.frameParams.payloadFillByte = 0xA5;
506 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
507 ftm_status.frameParams.tx_mode = 0;
508 ftm_status.frameParams.crc = 0;
509 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
510 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
511 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
512 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530513 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700514 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
515 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530516 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700517
518 return;
519}
520
521/**---------------------------------------------------------------------------
522
523 \brief wlan_ftm_postmsg() -
524
525 The function used for sending the command to the halphy.
526
527 \param - cmd_ptr - Pointer command buffer.
528
529 \param - cmd_len - Command length.
530
531 \return - 0 for success, non zero for failure
532
533 --------------------------------------------------------------------------*/
534
535static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
536{
537 vos_msg_t *ftmReqMsg;
538 vos_msg_t ftmMsg;
539 ENTER();
540
541 ftmReqMsg = (vos_msg_t *) cmd_ptr;
542
Jeff Johnson295189b2012-06-20 16:38:30 -0700543 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700544 ftmMsg.reserved = 0;
545 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
546 ftmMsg.bodyval = 0;
547
548 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700549 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700550 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700551 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800552 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700553
554 return VOS_STATUS_E_FAILURE;
555 }
556
557 EXIT();
558 return VOS_STATUS_SUCCESS;
559}
560
561/*---------------------------------------------------------------------------
562
563 \brief wlan_ftm_vos_open() - Open the vOSS Module
564
565 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
566 Upon successful initialization:
567
568 - All VOS submodules should have been initialized
569
570 - The VOS scheduler should have opened
571
572 - All the WLAN SW components should have been opened. This include
573 MAC.
574
575
Girish Gowli32fbe522014-05-08 20:27:04 +0530576 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700577
578
579 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
580 is ready to be used.
581
582 VOS_STATUS_E_RESOURCES - System resources (other than memory)
583 are unavailable to initialize the scheduler
584
585
586 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
587
588 \sa wlan_ftm_vos_open()
589
590---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530591static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700592{
593 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
594 int iter = 0;
595 tSirRetStatus sirStatus = eSIR_SUCCESS;
596 tMacOpenParameters macOpenParms;
597 pVosContextType gpVosContext = (pVosContextType)pVosContext;
598
599 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
600 "%s: Opening VOSS", __func__);
601
602 if (NULL == gpVosContext)
603 {
604 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
605 "%s: Trying to open VOSS without a PreOpen",__func__);
606 VOS_ASSERT(0);
607 return VOS_STATUS_E_FAILURE;
608 }
609
610 /* Initialize the probe event */
611 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
612 {
613 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
614 "%s: Unable to init probeEvent",__func__);
615 VOS_ASSERT(0);
616 return VOS_STATUS_E_FAILURE;
617 }
618
Jeff Johnson295189b2012-06-20 16:38:30 -0700619 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
620 {
621 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
622 "%s: Unable to init wdaCompleteEvent",__func__);
623 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700624
Jeff Johnson295189b2012-06-20 16:38:30 -0700625 goto err_probe_event;
626 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700627
628 /* Initialize the free message queue */
629 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
630 if (! VOS_IS_STATUS_SUCCESS(vStatus))
631 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700632 /* Critical Error ... Cannot proceed further */
633 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530634 "%s: Failed to initialize VOS free message queue %d",
635 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700636 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700637 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700638 }
639
640 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
641 {
642 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
643 &(gpVosContext->aMsgBuffers[iter]);
644 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
645 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
646 }
647
648 /* Now Open the VOS Scheduler */
649 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
650 sizeof(VosSchedContext));
651
652 if (!VOS_IS_STATUS_SUCCESS(vStatus))
653 {
654 /* Critical Error ... Cannot proceed further */
655 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530656 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700657 VOS_ASSERT(0);
658 goto err_msg_queue;
659 }
660
661 /* Open the SYS module */
662 vStatus = sysOpen(gpVosContext);
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 SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700669 VOS_ASSERT(0);
670 goto err_sched_close;
671 }
672
Jeff Johnson295189b2012-06-20 16:38:30 -0700673 /*Open the WDA module */
674 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
675 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530676 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700677 if (!VOS_IS_STATUS_SUCCESS(vStatus))
678 {
679 /* Critical Error ... Cannot proceed further */
680 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530681 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700682 VOS_ASSERT(0);
683 goto err_sys_close;
684 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700685
686 /* initialize the NV module */
687 vStatus = vos_nv_open();
688 if (!VOS_IS_STATUS_SUCCESS(vStatus))
689 {
690 // NV module cannot be initialized, however the driver is allowed
691 // to proceed
692 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530693 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700694 goto err_wda_close;
695 }
696
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700697 vStatus = vos_nv_get_dictionary_data();
698
699 if (!VOS_IS_STATUS_SUCCESS(vStatus))
700 {
701 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530702 "%s : failed to get dictionary data for NV %d",
703 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700704 goto err_wda_close;
705 }
706
Jeff Johnson295189b2012-06-20 16:38:30 -0700707 /* If we arrive here, both threads dispacthing messages correctly */
708
709 /* Now proceed to open the MAC */
710
711 /* UMA is supported in hardware for performing the
712 frame translation 802.11 <-> 802.3 */
713 macOpenParms.frameTransRequired = 1;
714 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
715 &macOpenParms);
716
717 if (eSIR_SUCCESS != sirStatus)
718 {
719 /* Critical Error ... Cannot proceed further */
720 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530721 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700722 VOS_ASSERT(0);
723 goto err_nv_close;
724 }
725
Jeff Johnson295189b2012-06-20 16:38:30 -0700726 /* Now proceed to open the SME */
727 vStatus = sme_Open(gpVosContext->pMACContext);
728 if (!VOS_IS_STATUS_SUCCESS(vStatus))
729 {
730 /* Critical Error ... Cannot proceed further */
731 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530732 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700733 goto err_mac_close;
734 }
735 return VOS_STATUS_SUCCESS;
736
Jeff Johnson295189b2012-06-20 16:38:30 -0700737
738 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
739 "%s: VOSS successfully Opened",__func__);
740
741 return VOS_STATUS_SUCCESS;
742err_mac_close:
743 macClose(gpVosContext->pMACContext);
744
745err_nv_close:
746 vos_nv_close();
747
748err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700749 WDA_close(gpVosContext);
750
751err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700752 sysClose(gpVosContext);
753
754err_sched_close:
755 vos_sched_close(gpVosContext);
756err_msg_queue:
757 vos_mq_deinit(&gpVosContext->freeVosMq);
758
Jeff Johnson295189b2012-06-20 16:38:30 -0700759err_wda_complete_event:
760 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700761
762err_probe_event:
763 vos_event_destroy(&gpVosContext->ProbeEvent);
764
765 return VOS_STATUS_E_FAILURE;
766
767} /* wlan_ftm_vos_open() */
768
769/*---------------------------------------------------------------------------
770
771 \brief wlan_ftm_vos_close() - Close the vOSS Module
772
773 The \a wlan_ftm_vos_close() function closes the vOSS Module
774
775 \param vosContext context of vos
776
777 \return VOS_STATUS_SUCCESS - successfully closed
778
779 \sa wlan_ftm_vos_close()
780
781---------------------------------------------------------------------------*/
782
783static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
784{
785 VOS_STATUS vosStatus;
786 pVosContextType gpVosContext = (pVosContextType)vosContext;
787
Jeff Johnson295189b2012-06-20 16:38:30 -0700788 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
789 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
790 {
791 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530792 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700793 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
794 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700795
796 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
797 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
798 {
799 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530800 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700801 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
802 }
803
804 ((pVosContextType)vosContext)->pMACContext = NULL;
805
806 vosStatus = vos_nv_close();
807 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
808 {
809 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530810 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700811 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
812 }
813
814
815 vosStatus = sysClose( vosContext );
816 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
817 {
818 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530819 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700820 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
821 }
822
Jeff Johnson295189b2012-06-20 16:38:30 -0700823 vosStatus = WDA_close( vosContext );
824 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
825 {
826 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530827 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700828 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
829 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700830
831 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
832
833 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
834 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
835 {
836 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530837 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700838 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
839 }
840
Jeff Johnson295189b2012-06-20 16:38:30 -0700841 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
842 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
843 {
844 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530845 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700846 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
847 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700848
849 return VOS_STATUS_SUCCESS;
850}
851
852/**---------------------------------------------------------------------------
853
854 \brief wlan_ftm_priv_set_txifs() -
855
856 This function is used for
857
858 \param - pAdapter - Pointer HDD Context.
859 - ifs
860
861 \return - 0 for success, non zero for failure
862
863 --------------------------------------------------------------------------*/
864
865
866
867static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
868{
869 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
870 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
871 {
872 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
873 return VOS_STATUS_E_FAILURE;
874 }
875
876 /* do not allow to change setting when tx pktgen is enabled */
877 if (ftm_status.frameGenEnabled)
878 {
879 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
880 return VOS_STATUS_E_FAILURE;
881 }
882
883 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
884 {
c_hpothuffdb5272013-10-02 16:42:35 +0530885 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
886 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700887 return VOS_STATUS_E_FAILURE;
888 }
889
890 ftm_status.frameParams.interFrameSpace = ifs;
891
892 return VOS_STATUS_SUCCESS;
893}
894
895/**---------------------------------------------------------------------------
896
897 \brief wlan_ftm_priv_set_txpktcnt() -
898
899 This function is used for
900
901 \param - pAdapter - Pointer HDD Context.
902 - ifs
903
904 \return - 0 for success, non zero for failure
905
906 --------------------------------------------------------------------------*/
907
908static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
909{
910 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
911 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
912 {
913 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
914 return VOS_STATUS_E_FAILURE;
915 }
916
917 /* do not allow to change setting when tx pktgen is enabled */
918 if (ftm_status.frameGenEnabled)
919 {
920 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
921 return VOS_STATUS_E_FAILURE;
922 }
923
924 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
925 {
c_hpothuffdb5272013-10-02 16:42:35 +0530926 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
927 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700928 return VOS_STATUS_E_FAILURE;
929 }
930
931 ftm_status.frameParams.numTestPackets = cnt;
932
933 return VOS_STATUS_SUCCESS;
934}
935
936static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
937{
938 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
939 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
940 {
941 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
942 return VOS_STATUS_E_FAILURE;
943 }
944
945 /* do not allow to change setting when tx pktgen is enabled */
946 if (ftm_status.frameGenEnabled)
947 {
948 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
949 return VOS_STATUS_E_FAILURE;
950 }
951
952 if (len > 4095) //4096
953 {
c_hpothuffdb5272013-10-02 16:42:35 +0530954 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
955 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700956 return VOS_STATUS_E_FAILURE;
957 }
958
959 ftm_status.frameParams.payloadLength = (tANI_U16)len;
960
961 return VOS_STATUS_SUCCESS;
962}
963
Jeff Johnson295189b2012-06-20 16:38:30 -0700964
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530965static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
966/**---------------------------------------------------------------------------
967<FTM_Command>set_tx_wf_gain
968<argument> is <n>
969Designates the number of amplitude gain (31 to 255).
970Description
971This command can be set only when Tx CW generation is stopped.
972--------------------------------------------------------------------------*/
973static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
974{
975 uPttMsgs *pMsgBody;
976 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
977 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
978 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
980 "%s:Ftm has not started. Please start the ftm.", __func__);
981 return VOS_STATUS_E_FAILURE;
982 }
983
984 if (ftm_status.wfRfGenEnabled) {
985 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
986 "%s:cannot set gain when cwgen is enabled.", __func__);
987 return VOS_STATUS_E_FAILURE;
988 }
989
990 if (dGain > 24 || dGain <-39) {
991 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
992 "%s:digital gain value is invalid", __func__);
993 return VOS_STATUS_E_FAILURE;
994 }
995
996 if (rfGain > 31 || rfGain <0) {
997 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
998 "%s:rf gain value is invalid", __func__);
999 return VOS_STATUS_E_FAILURE;
1000 }
1001
1002 if (pMsgBuf == NULL) {
1003 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1004 "%s:pMsgBuf is NULL", __func__);
1005 return VOS_STATUS_E_NOMEM;
1006 }
1007
1008 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1009 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1010
1011 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1012 init_completion(&pHddCtx->ftm.ftm_comp_var);
1013 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1014 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1015 pMsgBody = &pMsgBuf->msgBody;
1016 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1017 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1018 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1019 VOS_STATUS_SUCCESS) {
1020 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1021 "%s:wlan_ftm_postmsg failed",__func__);
1022 return VOS_STATUS_E_FAILURE;
1023 }
1024
1025 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1026 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1027 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1028 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1029 "%s:Ptt response status failed",__func__);
1030 return VOS_STATUS_E_FAILURE;
1031 }
1032 return VOS_STATUS_SUCCESS;
1033}
1034
1035
1036/**---------------------------------------------------------------------------
1037 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1038 <argument> is < 1 | 0 >
1039 1 : Start Tx CW rf generation
1040 0 : Stop Tx CW rf generation
1041 Description
1042 This command starts/stops Tx CW rf generation.
1043--------------------------------------------------------------------------*/
1044static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1045{
1046 uPttMsgs *pMsgBody;
1047 VOS_STATUS status;
1048 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1049
1050 printk(KERN_EMERG "startStop: %02x ", startStop);
1051
1052 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1053 {
1054 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1055 "%s:Ftm has not started. Please start the ftm. ", __func__);
1056 return VOS_STATUS_E_FAILURE;
1057 }
1058
1059 if (startStop != 1 && startStop != 0)
1060 {
1061 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1062 "%s:Tx value is invalid ", __func__);
1063 return VOS_STATUS_E_FAILURE;
1064 }
1065
1066 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1067 (!ftm_status.wfRfGenEnabled && startStop == 0))
1068 {
1069 return VOS_STATUS_SUCCESS;
1070 }
1071
1072 if (pMsgBuf == NULL)
1073 {
1074 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1075 "%s:pMsgBuf is NULL", __func__);
1076 return VOS_STATUS_E_NOMEM;
1077 }
1078 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1079 if (startStop == 1) {
1080 tANI_U16 numSamples = 1;
1081 tANI_BOOLEAN clk80 = TRUE;
1082 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1083
1084 init_completion(&pHddCtx->ftm.ftm_comp_var);
1085 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1086 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1087 pMsgBody = &pMsgBuf->msgBody;
1088
1089 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1090 pMsgBody->SetWaveformRF.numSamples = numSamples;
1091 pMsgBody->SetWaveformRF.clk80 = clk80;
1092 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1093 if (status != VOS_STATUS_SUCCESS) {
1094 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1095 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1096 __func__);
1097 status = VOS_STATUS_E_FAILURE;
1098 goto done;
1099 }
1100 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1101 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1102 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1103 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1104 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1105 status = VOS_STATUS_E_FAILURE;
1106 goto done;
1107 }
1108 } else {
1109 init_completion(&pHddCtx->ftm.ftm_comp_var);
1110 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1111 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1112 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1113 if(status != VOS_STATUS_SUCCESS) {
1114 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1115 "%s:wlan_ftm_postmsg failed", __func__);
1116 status = VOS_STATUS_E_FAILURE;
1117 goto done;
1118 }
1119
1120 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1121 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1122 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1123 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1124 "%s:Ptt response status failed", __func__);
1125 status = VOS_STATUS_E_FAILURE;
1126 }
1127 }
1128done:
1129 if (status == VOS_STATUS_SUCCESS) {
1130 if (startStop == 1)
1131 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1132 else
1133 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1134 }
1135 return status;
1136}
1137
1138
Jeff Johnson295189b2012-06-20 16:38:30 -07001139static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1140{
Jeff Johnson295189b2012-06-20 16:38:30 -07001141 uPttMsgs *pMsgBody;
1142 VOS_STATUS status;
1143 v_U16_t chainSelect_save = chainSelect;
1144 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301145 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001146
1147 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1148 {
1149 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1150 return VOS_STATUS_E_FAILURE;
1151 }
1152
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05301153 if (NULL == pMsgBuf)
1154 {
1155 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1156 "%s:pMsgBuf is NULL", __func__);
1157 return VOS_STATUS_E_NOMEM;
1158 }
1159
Jeff Johnson295189b2012-06-20 16:38:30 -07001160 if (chainSelect > FTM_CHAIN_SEL_MAX)
1161 {
c_hpothuffdb5272013-10-02 16:42:35 +05301162 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1163 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001164 return VOS_STATUS_E_FAILURE;
1165 }
1166
1167 /* do not allow to change setting when tx pktgen is enabled */
1168 if (ftm_status.frameGenEnabled)
1169 {
1170 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1171 return VOS_STATUS_E_FAILURE;
1172 }
1173
1174 switch (chainSelect)
1175 {
1176 case FTM_CHAIN_SEL_NO_RX_TX:
1177 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1178 break;
1179
1180 case FTM_CHAIN_SEL_R0_ON:
1181 chainSelect = PHY_CHAIN_SEL_R0_ON;
1182 break;
1183
1184 case FTM_CHAIN_SEL_T0_ON:
1185 chainSelect = PHY_CHAIN_SEL_T0_ON;
1186 break;
1187 }
1188
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301189 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001190 init_completion(&pHddCtx->ftm.ftm_comp_var);
1191 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1192 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1193
1194 pMsgBody = &pMsgBuf->msgBody;
1195 pMsgBody->EnableChains.chainSelect = chainSelect;
1196
1197 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1198
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301199 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001200 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301201 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1202 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001203 status = VOS_STATUS_E_FAILURE;
1204 goto done;
1205 }
c_hpothuffdb5272013-10-02 16:42:35 +05301206 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301207 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301208 if (0 >= ret)
1209 {
1210 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1211 FL("wait on ftm_comp_var failed %ld"), ret);
1212 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001213
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301214 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001215 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301216 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1217 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001218 status = VOS_STATUS_E_FAILURE;
1219 goto done;
1220 }
1221 ftm_status.chainSelect = chainSelect_save;
1222done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001223
1224 return status;
1225}
1226
1227/**---------------------------------------------------------------------------
1228 --------------------------------------------------------------------------*/
1229static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1230{
1231 int ii;
1232 int lenBuf = WE_FTM_MAX_STR_LEN;
1233 int lenRes = 0;
1234 char *chain[] = {
1235 "None",
1236 "R0,R1",
1237 "R0",
1238 "R1",
1239 "T0",
1240 "R0,R1,T0"
1241 };
1242 char *rx[] = {
1243 "disable",
1244 "11b/g/n",
1245 "11g/n",
1246 "11b"
1247 };
1248 char *tx[] = {
1249 "stopped",
1250 "started",
1251 };
1252 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1253
1254 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1255 {
1256 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1257 return VOS_STATUS_E_FAILURE;
1258 }
1259
1260 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001261 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001262 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1263 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001264 ftm_status.frameParams.interFrameSpace);
1265 if ((lenRes < 0) || (lenRes >= lenBuf))
1266 {
c_hpothuffdb5272013-10-02 16:42:35 +05301267 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1268 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001269 return VOS_STATUS_E_FAILURE;
1270 }
1271
1272 buf += lenRes;
1273 lenBuf -= lenRes;
1274
1275 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1276 {
1277 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1278 break;
1279 }
1280
1281 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1282 {
1283 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1284 }
1285 else
1286 {
1287 lenRes = strlcpy(buf, "invalid", lenBuf);
1288 }
1289 if ((lenRes < 0) || (lenRes >= lenBuf))
1290 {
c_hpothuffdb5272013-10-02 16:42:35 +05301291 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1292 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001293 return VOS_STATUS_E_FAILURE;
1294 }
1295
1296 buf += lenRes;
1297 lenBuf -= lenRes;
1298
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301299 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1300 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001301 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001302 ftm_status.frameParams.payloadLength);
1303
1304 if ((lenRes < 0) || (lenRes >= lenBuf))
1305 {
c_hpothuffdb5272013-10-02 16:42:35 +05301306 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1307 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001308 return VOS_STATUS_E_FAILURE;
1309 }
1310
1311 return VOS_STATUS_SUCCESS;
1312}
1313
Jeff Johnson295189b2012-06-20 16:38:30 -07001314
1315void HEXDUMP(char *s0, char *s1, int len)
1316{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301317 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001318 printk(KERN_EMERG "%s\n :", s0);
1319
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301320 if (len > 8)
1321 {
1322 for (j = 0; j < len/8; j++)
1323 {
1324 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1325 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1326 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1327 }
1328 len = len - j*8;
1329 }
1330 for (i = 0; i< len; i++) {
1331 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001332 }
1333 printk("\n");
1334}
1335
Jeff Johnson295189b2012-06-20 16:38:30 -07001336/*---------------------------------------------------------------------------
1337
1338 \brief vos_ftm_preStart() -
1339
1340 The \a vos_ftm_preStart() function to download CFG.
1341 including:
1342 - ccmStart
1343
1344 - WDA: triggers the CFG download
1345
1346
1347 \param pVosContext: The VOS context
1348
1349
1350 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1351 is ready to be used.
1352
1353 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1354 are unavailable to initialize the scheduler
1355
1356
1357 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1358
1359 \sa vos_start
1360
1361---------------------------------------------------------------------------*/
1362VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1363{
1364 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1365 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001366
Jeff Johnson295189b2012-06-20 16:38:30 -07001367 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1368 "vos prestart");
1369
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001370 if (NULL == pVosContext->pWDAContext)
1371 {
1372 VOS_ASSERT(0);
1373 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1374 "%s: WDA NULL context", __func__);
1375 return VOS_STATUS_E_FAILURE;
1376 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001377
1378 /* call macPreStart */
1379 vStatus = macPreStart(pVosContext->pMACContext);
1380 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1381 {
1382 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1383 "Failed at macPreStart ");
1384 return VOS_STATUS_E_FAILURE;
1385 }
1386
1387 /* call ccmStart */
1388 ccmStart(pVosContext->pMACContext);
1389
1390 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001391 vos_event_reset(&pVosContext->wdaCompleteEvent);
1392
Jeff Johnson295189b2012-06-20 16:38:30 -07001393
1394 /*call WDA pre start*/
1395 vStatus = WDA_preStart(pVosContext);
1396 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1397 {
1398 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1399 "Failed to WDA prestart ");
1400 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1401 ccmStop(pVosContext->pMACContext);
1402 VOS_ASSERT(0);
1403 return VOS_STATUS_E_FAILURE;
1404 }
1405
1406 /* Need to update time out of complete */
1407 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1408 if ( vStatus != VOS_STATUS_SUCCESS )
1409 {
1410 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1411 {
1412 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001413 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001414 }
1415 else
1416 {
1417 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001418 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001419 }
1420 VOS_ASSERT( 0 );
1421 return VOS_STATUS_E_FAILURE;
1422 }
1423
1424 return VOS_STATUS_SUCCESS;
1425}
Jeff Johnson295189b2012-06-20 16:38:30 -07001426
1427/**---------------------------------------------------------------------------
1428
1429 \brief wlan_hdd_ftm_open() -
1430
1431 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1432
1433 \param - pAdapter - Pointer HDD Context.
1434
1435 \return - 0 for success, non zero for failure
1436
1437 --------------------------------------------------------------------------*/
1438
1439int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1440{
1441 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1442 pVosContextType pVosContext= NULL;
1443 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001444
Jeff Johnson295189b2012-06-20 16:38:30 -07001445 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1446 "%s: Opening VOSS", __func__);
1447
1448 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1449
1450 if (NULL == pVosContext)
1451 {
1452 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301453 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001454 VOS_ASSERT(0);
1455 goto err_vos_status_failure;
1456 }
1457
1458 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301459 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001460
1461 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1462 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301463 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001464 goto err_vos_status_failure;
1465 }
1466
Jeff Johnson295189b2012-06-20 16:38:30 -07001467 /*
1468 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1469 */
1470 /* Save the hal context in Adapter */
1471 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001472
1473 if ( NULL == pHddCtx->hHal )
1474 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301475 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301476 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001477 }
1478
1479 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1480 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1481 if( NULL == pAdapter )
1482 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301483 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301484 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001485 }
1486
1487 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1488 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301489 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301490 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001491 }
1492
1493 //Initialize the nlink service
1494 if(nl_srv_init() != 0)
1495 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301496 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001497 goto err_ftm_register_wext_close;
1498 }
1499
Leo Chang9e646082013-08-02 11:20:21 -07001500#ifdef WLAN_KD_READY_NOTIFIER
1501 pHddCtx->kd_nl_init = 1;
1502#endif /* WLAN_KD_READY_NOTIFIER */
1503
Jeff Johnson295189b2012-06-20 16:38:30 -07001504#ifdef PTT_SOCK_SVC_ENABLE
1505 //Initialize the PTT service
1506 if(ptt_sock_activate_svc(pHddCtx) != 0)
1507 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301508 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001509 goto err_nl_srv_init;
1510 }
1511#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001512
Jeff Johnson295189b2012-06-20 16:38:30 -07001513 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1514 pHddCtx->ftm.targetNVTableSize = 0;
1515 pHddCtx->ftm.targetNVTablePointer = NULL;
1516 pHddCtx->ftm.processedNVTableSize = 0;
1517 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1518 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1519 {
1520 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301521 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001522 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001523 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001524 }
1525 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001526
1527 _ftm_status_init();
1528 /* Initialize the ftm vos event */
1529 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1530 {
1531 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301532 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001533 VOS_ASSERT(0);
1534 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1535 goto err_nl_srv_init;
1536 }
1537
1538 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301539 init_completion(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07001540
1541 return VOS_STATUS_SUCCESS;
1542
1543err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001544#ifdef WLAN_KD_READY_NOTIFIER
1545nl_srv_exit(pHddCtx->ptt_pid);
1546#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001547nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001548#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001549err_ftm_register_wext_close:
1550hdd_UnregisterWext(pAdapter->dev);
1551
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301552err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001553err_adapter_open_failure:
1554hdd_close_all_adapters( pHddCtx );
1555
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301556err_ftm_vos_close:
1557 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001558err_vos_status_failure:
1559
1560 return VOS_STATUS_E_FAILURE;
1561}
1562
1563
1564
1565int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1566{
1567 VOS_STATUS vosStatus;
1568 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1569
1570 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1571 ENTER();
1572 if(pAdapter == NULL)
1573 {
1574 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1575 return VOS_STATUS_E_NOMEM;
1576 }
1577
Atul Mittalc41126d2014-03-17 15:10:11 +05301578 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1579 if (pHddCtx->ftm.IsCmdPending == TRUE)
1580 {
1581 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1582 {
1583 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1584 "%s: vos_event_set failed", __func__);
1585 }
1586 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001587 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1588 {
1589 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1590 "%s: Ftm has been started. stopping ftm", __func__);
1591 wlan_ftm_stop(pHddCtx);
1592 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001593
Leo Chang59cdc7e2013-07-10 10:08:21 -07001594#ifdef WLAN_KD_READY_NOTIFIER
1595 nl_srv_exit(pHddCtx->ptt_pid);
1596#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001597 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001598#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001599 //TODO----------
1600 //Deregister the device with the kernel
1601 hdd_UnregisterWext(pAdapter->dev);
1602
1603 hdd_close_all_adapters( pHddCtx );
1604#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001605 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001606 {
1607 unregister_netdev(pAdapter->dev);
1608 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1609 }
1610#endif
1611 //-----------------
1612
1613 vosStatus = vos_sched_close( vosContext );
1614 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1615 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1616 "%s: Failed to close VOSS Scheduler",__func__);
1617 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1618 }
1619
1620 //Close VOSS
1621 wlan_ftm_vos_close(vosContext);
1622
1623
1624 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1625 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1626 {
1627 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1628 "%s: Failed to destroy ftm_vos Event",__func__);
1629 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1630 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001631 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001632
Jeff Johnson295189b2012-06-20 16:38:30 -07001633 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001634}
1635
1636/**---------------------------------------------------------------------------
1637
1638 \brief wlan_ftm_send_response() -
1639
1640 The function sends the response to the ptt socket application running in user space.
1641
1642 \param - pAdapter - Pointer HDD Context.
1643
1644 \return - 0 for success, non zero for failure
1645
1646 --------------------------------------------------------------------------*/
1647
1648static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1649
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301650 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1651 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001652
Arif Hussain6d2a3322013-11-17 19:50:10 -08001653 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 -07001654 return VOS_STATUS_E_FAILURE;
1655 }
1656 return VOS_STATUS_SUCCESS;
1657}
1658
1659/**---------------------------------------------------------------------------
1660
1661 \brief wlan_hdd_ftm_start() -
1662
1663 This function gets called when the FTM start commands received from the ptt socket application and
1664 it starts the following modules.
1665 1) SAL Start.
1666 2) BAL Start.
1667 3) MAC Start to download the firmware.
1668
1669
1670 \param - pAdapter - Pointer HDD Context.
1671
1672 \return - 0 for success, non zero for failure
1673
1674 --------------------------------------------------------------------------*/
1675
1676static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1677{
1678 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1679 tSirRetStatus sirStatus = eSIR_SUCCESS;
1680 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1681 tHalMacStartParameters halStartParams;
1682
1683 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1684 {
1685 return VOS_STATUS_SUCCESS;
1686 }
1687
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301688 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTING;
1689
Jeff Johnson295189b2012-06-20 16:38:30 -07001690 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1691 "%s: Starting Libra SW", __func__);
1692
1693 /* We support only one instance for now ...*/
1694 if (pVosContext == NULL)
1695 {
1696 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001697 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001698 goto err_status_failure;
1699 }
1700
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001701
Jeff Johnson295189b2012-06-20 16:38:30 -07001702 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001703 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001704 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001705 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001706 goto err_status_failure;
1707 }
1708
Jeff Johnson295189b2012-06-20 16:38:30 -07001709 /*
1710 Prima needs to start the WDA correctly instead of BAL and SAL
1711 */
1712
1713 /* Vos preStart is calling */
1714 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1715 {
1716 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1717 goto err_status_failure;
1718 }
1719
1720
1721 vStatus = WDA_NVDownload_Start(pVosContext);
1722
1723 if ( vStatus != VOS_STATUS_SUCCESS )
1724 {
1725 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1726 "%s: Failed to start NV Download",__func__);
1727 return VOS_STATUS_E_FAILURE;
1728 }
1729
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301730 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001731
1732 if ( vStatus != VOS_STATUS_SUCCESS )
1733 {
1734 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1735 {
1736 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001737 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001738 }
1739 else
1740 {
1741 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001742 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001743 }
1744 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301745 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001746 }
1747
1748 vStatus = WDA_start(pVosContext);
1749 if (vStatus != VOS_STATUS_SUCCESS)
1750 {
1751 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1752 "%s: Failed to start WDA",__func__);
1753 goto err_status_failure;
1754 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001755
Jeff Johnson295189b2012-06-20 16:38:30 -07001756
1757 /* Start the MAC */
1758 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1759
Jeff Johnson295189b2012-06-20 16:38:30 -07001760
1761 halStartParams.driverType = eDRIVER_TYPE_MFG;
1762
1763 /* Start the MAC */
1764 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1765
Jeff Johnson295189b2012-06-20 16:38:30 -07001766
1767 if (eSIR_SUCCESS != sirStatus)
1768 {
1769 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1770 "%s: Failed to start MAC", __func__);
1771
Jeff Johnson295189b2012-06-20 16:38:30 -07001772 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001773 }
1774
1775 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1776 "%s: MAC correctly started",__func__);
1777
Jeff Johnson295189b2012-06-20 16:38:30 -07001778
1779 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1780
1781 return VOS_STATUS_SUCCESS;
1782
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001783err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001784 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1785 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1786 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1787 if(vStatus != VOS_STATUS_SUCCESS)
1788 {
1789 if(vStatus == VOS_STATUS_E_TIMEOUT)
1790 {
1791 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001792 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001793
1794 }
1795 else
1796 {
1797 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001798 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001799 }
1800 VOS_ASSERT(0);
1801 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001802
1803err_status_failure:
1804
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05301805 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001806 return VOS_STATUS_E_FAILURE;
1807
1808}
1809
1810
1811static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1812{
1813 VOS_STATUS vosStatus;
1814
1815 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1816 {
1817 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1818 return VOS_STATUS_E_FAILURE;
1819 }
1820
1821 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1822 {
1823 /* STOP MAC only */
1824 v_VOID_t *hHal;
1825 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1826 if (NULL == hHal)
1827 {
1828 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1829 "%s: NULL hHal", __func__);
1830 }
1831 else
1832 {
1833 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1834 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1835 {
1836 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1837 "%s: Failed to stop SYS", __func__);
1838 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1839 }
1840 }
1841
Jeff Johnson295189b2012-06-20 16:38:30 -07001842
Jeff Johnson295189b2012-06-20 16:38:30 -07001843 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001844
1845 }
1846 return WLAN_FTM_SUCCESS;
1847}
1848
Jeff Johnson295189b2012-06-20 16:38:30 -07001849/**---------------------------------------------------------------------------
1850
1851 \brief wlan_hdd_ftm_get_nv_table() -
1852 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001853 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001854
1855 \param - ftmCmd - Pointer FTM Commad Buffer
1856
1857 \return - int
1858 -1, Process Host command fail, vail out
1859 1, Process Host command success
1860
1861 --------------------------------------------------------------------------*/
1862int wlan_hdd_ftm_get_nv_table
1863(
1864 hdd_context_t *pHddCtx,
1865 tPttMsgbuffer *ftmCmd
1866)
1867{
1868 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1869 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1870 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001871 sHalNvV2 *nvContents = NULL;
1872 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001873
Jeff Johnson295189b2012-06-20 16:38:30 -07001874 if (NULL == pHddCtx)
1875 {
1876 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1877 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001878 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001879 }
1880
Leo Chang80de3c22013-11-26 10:52:12 -08001881 nvVersion = vos_nv_getNvVersion();
1882 if (E_NV_V2 != nvVersion)
1883 {
1884 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1885 "%s : Not valid NV Version %d", __func__, nvVersion);
1886 return -EINVAL;
1887 }
1888
Jeff Johnson295189b2012-06-20 16:38:30 -07001889 /* Test first chunk of NV table */
1890 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1891 (0 == pHddCtx->ftm.processedNVTableSize))
1892 {
1893 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1894 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1895 {
c_hpothuffdb5272013-10-02 16:42:35 +05301896 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1897 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001898 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001899 }
1900
1901 switch (nvTable->nvTable)
1902 {
1903 case NV_TABLE_RATE_POWER_SETTINGS:
1904 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1905 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1906 break;
1907
1908 case NV_TABLE_REGULATORY_DOMAINS:
1909 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1910 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1911 break;
1912
1913 case NV_TABLE_DEFAULT_COUNTRY:
1914 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1915 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1916 break;
1917
1918 case NV_TABLE_TPC_POWER_TABLE:
1919 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1920 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1921 break;
1922
1923 case NV_TABLE_TPC_PDADC_OFFSETS:
1924 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1925 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1926 break;
1927
1928 case NV_TABLE_VIRTUAL_RATE:
1929 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1930 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1931 break;
1932
1933 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1934 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1935 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1936 break;
1937
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001938 case NV_TABLE_HW_CAL_VALUES:
1939 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1940 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1941 break;
1942
1943 case NV_TABLE_FW_CONFIG:
1944 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1945 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001946 break;
1947
1948 case NV_TABLE_ANTENNA_PATH_LOSS:
1949 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1950 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1951 break;
1952
1953 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1954 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1955 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1956 break;
1957
1958 default:
1959 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1960 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001961 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001962 break;
1963 }
1964
1965 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1966 {
1967 /* Invalid table size, discard and initialize data */
1968 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001969 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001970 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001971 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001972 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1973 pHddCtx->ftm.targetNVTableSize = 0;
1974 pHddCtx->ftm.processedNVTableSize = 0;
1975 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001976 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001977 }
1978
1979 /* Set Current Processing NV table type */
1980 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1981 /* Copy target NV table value into temp context buffer */
1982 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1983 pHddCtx->ftm.targetNVTablePointer,
1984 pHddCtx->ftm.targetNVTableSize);
1985
1986 }
1987
1988 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1989 {
1990 /* Invalid table type */
1991 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1992 "Invalid NV Table, now Processing %d, not %d",
1993 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1994 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1995 pHddCtx->ftm.targetNVTableSize = 0;
1996 pHddCtx->ftm.processedNVTableSize = 0;
1997 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001998
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001999 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002000 }
2001
2002 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002003 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002004 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2005 nvTable->chunkSize);
2006 /* Update processed pointer to prepare next chunk copy */
2007 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2008
2009 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2010 {
2011 /* Finished to process last chunk of data, initialize buffer */
2012 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2013 pHddCtx->ftm.targetNVTableSize = 0;
2014 pHddCtx->ftm.processedNVTableSize = 0;
2015 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2016 }
2017
2018 return 1;
2019}
2020
2021/**---------------------------------------------------------------------------
2022
2023 \brief wlan_hdd_ftm_set_nv_table() -
2024 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002025 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002026
2027 \param - ftmCmd - Pointer FTM Commad Buffer
2028
2029 \return - int
2030 -1, Process Host command fail, vail out
2031 1, Process Host command success
2032
2033 --------------------------------------------------------------------------*/
2034int wlan_hdd_ftm_set_nv_table
2035(
2036 hdd_context_t *pHddCtx,
2037 tPttMsgbuffer *ftmCmd
2038)
2039{
2040 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2041 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2042 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002043 sHalNvV2 *nvContents = NULL;
2044 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002045
2046 if (NULL == pHddCtx)
2047 {
2048 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2049 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002050 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002051 }
2052
Leo Chang80de3c22013-11-26 10:52:12 -08002053 nvVersion = vos_nv_getNvVersion();
2054 if (E_NV_V2 != nvVersion)
2055 {
2056 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2057 "%s : Not valid NV Version %d", __func__, nvVersion);
2058 return -EINVAL;
2059 }
2060
Jeff Johnson295189b2012-06-20 16:38:30 -07002061 /* Test first chunk of NV table */
2062 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2063 (0 == pHddCtx->ftm.processedNVTableSize))
2064 {
2065 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2066 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2067 {
c_hpothuffdb5272013-10-02 16:42:35 +05302068 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2069 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002070 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002071 }
2072
2073 switch (nvTable->nvTable)
2074 {
2075 case NV_TABLE_RATE_POWER_SETTINGS:
2076 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2077 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2078 break;
2079
2080 case NV_TABLE_REGULATORY_DOMAINS:
2081 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2082 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2083 break;
2084
2085 case NV_TABLE_DEFAULT_COUNTRY:
2086 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2087 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2088 break;
2089
2090 case NV_TABLE_TPC_POWER_TABLE:
2091 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2092 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2093 break;
2094
2095 case NV_TABLE_TPC_PDADC_OFFSETS:
2096 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2097 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2098 break;
2099
2100 case NV_TABLE_VIRTUAL_RATE:
2101 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2102 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2103 break;
2104
2105 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2106 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2107 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2108 break;
2109
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002110 case NV_TABLE_HW_CAL_VALUES:
2111 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2112 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2113 break;
2114
2115 case NV_TABLE_FW_CONFIG:
2116 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2117 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002118 break;
2119
2120 case NV_TABLE_ANTENNA_PATH_LOSS:
2121 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2122 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2123 break;
2124
2125 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2126 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2127 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2128 break;
2129
2130 default:
2131 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2132 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002133 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002134 break;
2135 }
2136
2137 /* Set Current Processing NV table type */
2138 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2139 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2140 {
2141 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2142 "Invalid Table Size %d", nvTable->tableSize);
2143 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2144 pHddCtx->ftm.targetNVTableSize = 0;
2145 pHddCtx->ftm.processedNVTableSize = 0;
2146 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002147 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002148 }
2149 }
2150
2151 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2152 {
2153 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2154 "Invalid NV Table, now Processing %d, not %d",
2155 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2156 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2157 pHddCtx->ftm.targetNVTableSize = 0;
2158 pHddCtx->ftm.processedNVTableSize = 0;
2159 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002160 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002161 }
2162 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002163 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002164 nvTable->chunkSize);
2165
2166 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2167 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2168 {
2169 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2170 pHddCtx->ftm.tempNVTableBuffer,
2171 pHddCtx->ftm.targetNVTableSize);
2172 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2173 pHddCtx->ftm.targetNVTableSize = 0;
2174 pHddCtx->ftm.processedNVTableSize = 0;
2175 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2176 }
2177
2178 return 1;
2179}
2180
2181/**---------------------------------------------------------------------------
2182
2183 \brief wlan_hdd_ftm_blank_nv() -
2184 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002185 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002186
2187 \param - ftmCmd - Pointer FTM Commad Buffer
2188
2189 \return - int
2190 -1, Process Host command fail, vail out
2191 0, Process Host command success
2192
2193 --------------------------------------------------------------------------*/
2194int wlan_hdd_ftm_blank_nv_table
2195(
2196 tPttMsgbuffer *ftmCmd
2197)
2198{
Leo Chang80de3c22013-11-26 10:52:12 -08002199 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002200 v_SIZE_t nvSize;
2201 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002202 sHalNvV2 *nvContents = NULL;
2203 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002204
2205 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2206 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2207 {
c_hpothuffdb5272013-10-02 16:42:35 +05302208 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2209 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002210 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002211 }
2212
Leo Chang80de3c22013-11-26 10:52:12 -08002213 nvVersion = vos_nv_getNvVersion();
2214 if (E_NV_V2 != nvVersion)
2215 {
2216 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2217 "%s : Not valid NV Version %d", __func__, nvVersion);
2218 return -EINVAL;
2219 }
2220
Jeff Johnson295189b2012-06-20 16:38:30 -07002221 itemSize = sizeof(nvContents->tables.pwrOptimum);
2222 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002223 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002224 itemSize);
2225
2226 itemSize = sizeof(nvContents->tables.regDomains);
2227 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002228 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002229 itemSize);
2230
2231 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2232 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002233 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002234 itemSize);
2235
2236 itemSize = sizeof(nvContents->tables.plutCharacterized);
2237 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002238 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002239 itemSize);
2240
2241 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2242 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002243 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002244 itemSize);
2245
2246 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2247 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002248 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002249 itemSize);
2250
2251 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2252 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002253 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002254 itemSize);
2255
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002256 itemSize = sizeof(nvContents->tables.hwCalValues);
2257 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002258 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002259 itemSize);
2260
2261 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2262 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002263 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002264 itemSize);
2265
2266 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2267 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002268 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002269 itemSize);
2270
2271 return 1;
2272}
2273
2274/**---------------------------------------------------------------------------
2275
2276 \brief wlan_hdd_ftm_delete_nv_table() -
2277 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002278 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002279
2280 \param - ftmCmd - Pointer FTM Commad Buffer
2281
2282 \return - int
2283 -1, Process Host command fail, vail out
2284 1, Process Host command success
2285
2286 --------------------------------------------------------------------------*/
2287int wlan_hdd_ftm_delete_nv_table
2288(
2289 tPttMsgbuffer *ftmCmd
2290)
2291{
Leo Chang80de3c22013-11-26 10:52:12 -08002292 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002293 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2294 v_SIZE_t nvSize;
2295 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002296 sHalNvV2 *nvContents = NULL;
2297 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002298
2299 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2300 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2301 {
c_hpothuffdb5272013-10-02 16:42:35 +05302302 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2303 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002304 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002305 }
2306
Leo Chang80de3c22013-11-26 10:52:12 -08002307 nvVersion = vos_nv_getNvVersion();
2308 if (E_NV_V2 != nvVersion)
2309 {
2310 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2311 "%s : Not valid NV Version %d", __func__, nvVersion);
2312 return -EINVAL;
2313 }
2314
Jeff Johnson295189b2012-06-20 16:38:30 -07002315 switch (nvTable->nvTable)
2316 {
2317 case NV_TABLE_RATE_POWER_SETTINGS:
2318 itemSize = sizeof(nvContents->tables.pwrOptimum);
2319 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002320 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 itemSize);
2322 break;
2323
2324 case NV_TABLE_REGULATORY_DOMAINS:
2325 itemSize = sizeof(nvContents->tables.regDomains);
2326 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002327 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002328 itemSize);
2329 break;
2330
2331 case NV_TABLE_DEFAULT_COUNTRY:
2332 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2333 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002334 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002335 itemSize);
2336 break;
2337
2338 case NV_TABLE_TPC_POWER_TABLE:
2339 itemSize = sizeof(nvContents->tables.plutCharacterized);
2340 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002341 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002342 itemSize);
2343 break;
2344
2345 case NV_TABLE_TPC_PDADC_OFFSETS:
2346 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2347 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002348 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002349 itemSize);
2350 break;
2351
2352 case NV_TABLE_VIRTUAL_RATE:
2353 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2354 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002355 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002356 itemSize);
2357 break;
2358
2359 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2360 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2361 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002362 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002363 itemSize);
2364 break;
2365
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002366 case NV_TABLE_HW_CAL_VALUES:
2367 itemSize = sizeof(nvContents->tables.hwCalValues);
2368 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002369 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002370 itemSize);
2371 break;
2372
2373 case NV_TABLE_FW_CONFIG:
2374 itemSize = sizeof(nvContents->tables.fwConfig);
2375 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002376 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002377 itemSize);
2378 break;
2379
2380 case NV_TABLE_ANTENNA_PATH_LOSS:
2381 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2382 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002383 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002384 itemSize);
2385 break;
2386
2387 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2388 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2389 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002390 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002391 itemSize);
2392 break;
2393
2394 default:
2395 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2396 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002397 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002398 break;
2399 }
2400
2401 return 1;
2402}
2403
2404/**---------------------------------------------------------------------------
2405
2406 \brief wlan_hdd_ftm_get_nv_field() -
2407 Get Specific NV field
2408
2409 \param - ftmCmd - Pointer FTM Commad Buffer
2410
2411 \return - int
2412 -1, Process Host command fail, vail out
2413 1, Process Host command success
2414
2415 --------------------------------------------------------------------------*/
2416int wlan_hdd_ftm_get_nv_field
2417(
2418 tPttMsgbuffer *ftmCmd
2419)
2420{
2421 sNvFields nvFieldDataBuffer;
2422 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2423 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2424 sHalNv *nvContents = NULL;
2425 v_SIZE_t nvSize;
2426
2427 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2428 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2429 {
c_hpothuffdb5272013-10-02 16:42:35 +05302430 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2431 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002432 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002433 }
2434 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2435
2436 switch (nvField->nvField)
2437 {
2438 case NV_COMMON_PRODUCT_ID:
2439 memcpy((void *)&nvField->fieldData,
2440 &nvFieldDataBuffer.productId,
2441 sizeof(nvFieldDataBuffer.productId));
2442 break;
2443
2444 case NV_COMMON_PRODUCT_BANDS:
2445 memcpy((void *)&nvField->fieldData,
2446 &nvFieldDataBuffer.productBands,
2447 sizeof(nvFieldDataBuffer.productBands));
2448 break;
2449
2450 case NV_COMMON_NUM_OF_TX_CHAINS:
2451 memcpy((void *)&nvField->fieldData,
2452 &nvFieldDataBuffer.numOfTxChains,
2453 sizeof(nvFieldDataBuffer.numOfTxChains));
2454 break;
2455
2456 case NV_COMMON_NUM_OF_RX_CHAINS:
2457 memcpy((void *)&nvField->fieldData,
2458 &nvFieldDataBuffer.numOfRxChains,
2459 sizeof(nvFieldDataBuffer.numOfRxChains));
2460 break;
2461
2462 case NV_COMMON_MAC_ADDR:
2463 memcpy((void *)&nvField->fieldData,
2464 &nvFieldDataBuffer.macAddr[0],
2465 NV_FIELD_MAC_ADDR_SIZE);
2466 break;
2467
2468 case NV_COMMON_MFG_SERIAL_NUMBER:
2469 memcpy((void *)&nvField->fieldData,
2470 &nvFieldDataBuffer.mfgSN[0],
2471 NV_FIELD_MFG_SN_SIZE);
2472 break;
2473
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002474 case NV_COMMON_WLAN_NV_REV_ID:
2475 memcpy((void *)&nvField->fieldData,
2476 &nvFieldDataBuffer.wlanNvRevId,
2477 sizeof(nvFieldDataBuffer.wlanNvRevId));
2478 break;
2479
Jeff Johnson295189b2012-06-20 16:38:30 -07002480 case NV_COMMON_COUPLER_TYPE:
2481 memcpy((void *)&nvField->fieldData,
2482 &nvFieldDataBuffer.couplerType,
2483 sizeof(nvFieldDataBuffer.couplerType));
2484 break;
2485
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002486 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002487 {
2488 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2489 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2490
2491 nvEmbededStatus = vos_nv_isEmbeddedNV();
2492
2493 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2494 {
2495 // High bit is set to indicate embedded NV..
2496 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2497 }
2498
2499 memcpy((void *)&nvField->fieldData,
2500 &nvVersion,
2501 sizeof(nvFieldDataBuffer.nvVersion));
2502 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002503 break;
2504
Jeff Johnson295189b2012-06-20 16:38:30 -07002505 default:
2506 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2507 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002508 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002509 break;
2510 }
2511
2512 return 1;
2513}
2514
2515/**---------------------------------------------------------------------------
2516
2517 \brief wlan_hdd_ftm_set_nv_field() -
2518 Set Specific NV field
2519
2520 \param - ftmCmd - Pointer FTM Commad Buffer
2521
2522 \return - int
2523 -1, Process Host command fail, vail out
2524 1, Process Host command success
2525
2526 --------------------------------------------------------------------------*/
2527int wlan_hdd_ftm_set_nv_field
2528(
2529 tPttMsgbuffer *ftmCmd
2530)
2531{
2532 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2533 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2534 v_SIZE_t nvSize;
2535 sHalNv *nvContents = NULL;
2536 v_U8_t macLoop;
2537 v_U8_t *pNVMac;
2538 v_U8_t lastByteMAC;
2539
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002540
Jeff Johnson295189b2012-06-20 16:38:30 -07002541 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2542 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2543 {
c_hpothuffdb5272013-10-02 16:42:35 +05302544 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2545 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002546 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002547 }
2548
2549 switch (nvField->nvField)
2550 {
2551 case NV_COMMON_PRODUCT_ID:
2552 memcpy(&nvContents->fields.productId,
2553 &nvField->fieldData,
2554 sizeof(nvContents->fields.productId));
2555 break;
2556
2557 case NV_COMMON_PRODUCT_BANDS:
2558 memcpy(&nvContents->fields.productBands,
2559 &nvField->fieldData,
2560 sizeof(nvContents->fields.productBands));
2561 break;
2562
2563 case NV_COMMON_NUM_OF_TX_CHAINS:
2564 memcpy(&nvContents->fields.numOfTxChains,
2565 &nvField->fieldData,
2566 sizeof(nvContents->fields.numOfTxChains));
2567 break;
2568
2569 case NV_COMMON_NUM_OF_RX_CHAINS:
2570 memcpy(&nvContents->fields.numOfRxChains,
2571 &nvField->fieldData,
2572 sizeof(nvContents->fields.numOfRxChains));
2573 break;
2574
2575 case NV_COMMON_MAC_ADDR:
2576 /* If Last byte is larger than 252 (0xFC), return Error,
2577 * Since 3MACs should be derived from first MAC */
2578 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002579 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002580 {
2581 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2582 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002583 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002584 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002585 }
2586
2587 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002588 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002589 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2590 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002591 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002592 lastByteMAC + macLoop;
2593 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002594 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002595 NV_FIELD_MAC_ADDR_SIZE);
2596 }
2597 break;
2598
2599 case NV_COMMON_MFG_SERIAL_NUMBER:
2600 memcpy(&nvContents->fields.mfgSN[0],
2601 &nvField->fieldData,
2602 NV_FIELD_MFG_SN_SIZE);
2603 break;
2604
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002605 case NV_COMMON_WLAN_NV_REV_ID:
2606 memcpy(&nvContents->fields.wlanNvRevId,
2607 &nvField->fieldData,
2608 sizeof(nvContents->fields.wlanNvRevId));
2609 break;
2610
Jeff Johnson295189b2012-06-20 16:38:30 -07002611 case NV_COMMON_COUPLER_TYPE:
2612 memcpy(&nvContents->fields.couplerType,
2613 &nvField->fieldData,
2614 sizeof(nvContents->fields.couplerType));
2615 break;
2616
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002617 case NV_COMMON_NV_VERSION:
2618 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2619 "Cannot modify NV version field %d", nvField->nvField);
2620 return -EIO;
2621 break;
2622
Jeff Johnson295189b2012-06-20 16:38:30 -07002623 default:
2624 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2625 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002626 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002627 break;
2628 }
2629
2630 return 1;
2631}
2632
2633/**---------------------------------------------------------------------------
2634
2635 \brief wlan_hdd_ftm_store_nv_table() -
2636 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002637 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002638
2639 \param - ftmCmd - Pointer FTM Commad Buffer
2640
2641 \return - int
2642 -1, Process Host command fail, vail out
2643 0, Process Host command success
2644
2645 --------------------------------------------------------------------------*/
2646int wlan_hdd_ftm_store_nv_table
2647(
2648 tPttMsgbuffer *ftmCmd
2649)
2650{
2651 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2652 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002653 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2654 void *tablePtr = NULL;
2655 unsigned int tableSize = 0;
2656 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002657 sHalNvV2 *nvContents = NULL;
2658 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002659
2660 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2661 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2662 {
c_hpothuffdb5272013-10-02 16:42:35 +05302663 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2664 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002665 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002666 }
2667
Leo Chang80de3c22013-11-26 10:52:12 -08002668 nvVersion = vos_nv_getNvVersion();
2669 if (E_NV_V2 != nvVersion)
2670 {
2671 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2672 "%s : Not valid NV Version %d", __func__, nvVersion);
2673 return -EINVAL;
2674 }
2675
Jeff Johnson295189b2012-06-20 16:38:30 -07002676 /* Set Platform type as PRIMA */
2677 nvContents->fields.wlanNvRevId = 2;
2678
2679 switch(nvTable->nvTable)
2680 {
2681 case NV_FIELDS_IMAGE:
2682 tablePtr = (void *)&nvContents->fields;
2683 tableSize = sizeof(nvContents->fields);
2684 tableVNVType = VNV_FIELD_IMAGE;
2685 break;
2686
2687 case NV_TABLE_RATE_POWER_SETTINGS:
2688 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2689 tableSize = sizeof(nvContents->tables.pwrOptimum);
2690 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2691 break;
2692
2693 case NV_TABLE_REGULATORY_DOMAINS:
2694 tablePtr = (void *)&nvContents->tables.regDomains[0];
2695 tableSize = sizeof(nvContents->tables.regDomains);
2696 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2697 break;
2698
2699 case NV_TABLE_DEFAULT_COUNTRY:
2700 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2701 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2702 tableVNVType = VNV_DEFAULT_LOCATION;
2703 break;
2704
2705 case NV_TABLE_TPC_POWER_TABLE:
2706 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2707 tableSize = sizeof(nvContents->tables.plutCharacterized);
2708 tableVNVType = VNV_TPC_POWER_TABLE;
2709 break;
2710
2711 case NV_TABLE_TPC_PDADC_OFFSETS:
2712 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2713 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2714 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2715 break;
2716
2717 case NV_TABLE_VIRTUAL_RATE:
2718 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2719 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2720 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2721 break;
2722
2723 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2724 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2725 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2726 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2727 break;
2728
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002729 case NV_TABLE_HW_CAL_VALUES:
2730 tablePtr = (void *)&nvContents->tables.hwCalValues;
2731 tableSize = sizeof(nvContents->tables.hwCalValues);
2732 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002733 break;
2734
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002735 case NV_TABLE_FW_CONFIG:
2736 tablePtr = (void *)&nvContents->tables.fwConfig;
2737 tableSize = sizeof(nvContents->tables.fwConfig);
2738 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002739 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002740
Jeff Johnson295189b2012-06-20 16:38:30 -07002741 case NV_TABLE_ANTENNA_PATH_LOSS:
2742 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2743 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2744 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2745 break;
2746
2747 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2748 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2749 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2750 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2751 break;
2752
2753 default:
2754 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2755 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002756 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002757 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002758
Jeff Johnson295189b2012-06-20 16:38:30 -07002759 }
2760
2761 nvStatus = vos_nv_write(tableVNVType,
2762 tablePtr,
2763 tableSize);
2764 if(VOS_STATUS_SUCCESS != nvStatus)
2765 {
c_hpothuffdb5272013-10-02 16:42:35 +05302766 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2767 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002768 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002769 }
2770
2771 return 1;
2772}
2773
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002774/* --------------------------------------------------------------------------
2775 \brief wlan_hdd_ftm_get_nv_bin() -
2776 Get NV bin read from Flash Memory, file
2777
2778 \param - ftmCmd - Pointer FTM Commad Buffer
2779
2780 \return - int
2781 -1, Process Host command fail, vail out
2782 0, Process Host command success
2783--------------------------------------------------------------------------*/
2784
2785static int wlan_hdd_ftm_get_nv_bin
2786(
2787 v_U16_t msgId,
2788 hdd_context_t *pHddCtx,
2789 tPttMsgbuffer *ftmCmd
2790)
2791{
2792 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2793 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2794 v_SIZE_t nvSize;
2795 v_U8_t *nvContents;
2796 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002797 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002798
Leo Chang80de3c22013-11-26 10:52:12 -08002799 nvVersion = vos_nv_getNvVersion();
2800 if (E_NV_V3 != nvVersion)
2801 {
2802 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2803 "%s : Not valid NV Version %d", __func__, nvVersion);
2804 return -EINVAL;
2805 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002806
2807 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2808 (0 == pHddCtx->ftm.processedNVTableSize))
2809 {
2810 if ( msgId == PTT_MSG_GET_NV_BIN )
2811 {
2812 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2813 }
2814 else
2815 {
2816 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2817 }
2818
2819 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2820 {
c_hpothuffdb5272013-10-02 16:42:35 +05302821 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2822 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002823 return -EIO;
2824 }
2825
2826 switch (nvTable->nvTable)
2827 {
2828 case NV_BINARY_IMAGE:
2829 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2830 break;
2831 default:
2832 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2833 "Not Valid NV Table %d", nvTable->nvTable);
2834 return -EIO;
2835 break;
2836 }
2837
2838 /* Set Current Processing NV table type */
2839 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2840 if ( msgId == PTT_MSG_GET_NV_BIN )
2841 {
2842 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2843 /* Validity Period */
2844 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2845 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2846 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2847 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2848 offset = sizeof(v_U32_t);
2849 }
2850 else
2851 {
2852 pHddCtx->ftm.targetNVTableSize = nvSize;
2853 offset = 0;
2854 }
2855
2856 /* Copy target NV table value into temp context buffer */
2857 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2858 pHddCtx->ftm.targetNVTablePointer,
2859 pHddCtx->ftm.targetNVTableSize);
2860 }
2861
2862
2863 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2864 {
2865 /* Invalid table type */
2866 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2867 "Invalid NV Table, now Processing %d, not %d",
2868 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2869
2870 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2871 pHddCtx->ftm.targetNVTableSize = 0;
2872 pHddCtx->ftm.processedNVTableSize = 0;
2873 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2874
2875 return -EINVAL;
2876 }
2877
2878 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2879
2880 /* Update processed pointer to prepare next chunk copy */
2881 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2882 pHddCtx->ftm.targetNVTableSize )
2883 {
2884 nvTable->chunkSize =
2885 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2886 }
2887
2888 /* Copy next chunk of NV table value into response buffer */
2889 vos_mem_copy(
2890 &nvTable->tableData,
2891 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2892 nvTable->chunkSize);
2893
2894 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2895
2896 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2897 {
2898 /* Finished to process last chunk of data, initialize buffer */
2899 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2900 pHddCtx->ftm.targetNVTableSize = 0;
2901 pHddCtx->ftm.processedNVTableSize = 0;
2902 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2903 }
2904
2905 return 1;
2906}
2907
2908/**---------------------------------------------------------------------------
2909
2910 \brief wlan_hdd_ftm_set_nv_bin() -
2911 Set NV bin to Flash Memory, file
2912
2913 \param - ftmCmd - Pointer FTM Commad Buffer
2914
2915 \return - int
2916 -1, Process Host command fail, vail out
2917 0, Process Host command success
2918
2919+----------------------------------------------------------------------------*/
2920
2921static int wlan_hdd_ftm_set_nv_bin
2922(
2923 hdd_context_t *pHddCtx,
2924 tPttMsgbuffer *ftmCmd
2925)
2926{
2927 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2928 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002929 eNvVersionType nvVersion;
2930
2931 nvVersion = vos_nv_getNvVersion();
2932 if (E_NV_V3 != nvVersion)
2933 {
2934 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2935 "%s : Not valid NV Version %d", __func__, nvVersion);
2936 return -EINVAL;
2937 }
2938
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002939
2940 /* Test first chunk of NV table */
2941 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2942 (0 == pHddCtx->ftm.processedNVTableSize))
2943 {
2944 switch (nvTable->nvTable)
2945 {
2946 case NV_BINARY_IMAGE:
2947 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2948 break;
2949 default:
2950 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2951 "Not Valid NV Table %d", nvTable->nvTable);
2952 return -EIO;
2953 break;
2954 }
2955
2956 /* Set Current Processing NV table type */
2957 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2958 pHddCtx->ftm.processedNVTableSize = 0;
2959
2960 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2961 {
2962 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2963 "Invalid Table Size %d", nvTable->tableSize);
2964 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2965 pHddCtx->ftm.targetNVTableSize = 0;
2966 pHddCtx->ftm.processedNVTableSize = 0;
2967 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2968 return -EINVAL;
2969 }
2970 }
2971
2972 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2973 {
2974 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2975 "Invalid NV Table, now Processing %d, not %d",
2976 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2977 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2978 pHddCtx->ftm.targetNVTableSize = 0;
2979 pHddCtx->ftm.processedNVTableSize = 0;
2980 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2981 return -EINVAL;
2982 }
2983
2984 vos_mem_copy(
2985 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2986 &nvTable->tableData,
2987 nvTable->chunkSize);
2988
2989 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2990
2991 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2992 {
2993 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2994 "Processing Done!! write encoded Buffer %d",
2995 pHddCtx->ftm.targetNVTableSize);
2996
2997 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2998 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2999
3000 if ((VOS_STATUS_SUCCESS != nvStatus))
3001 {
3002 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3003 "Fail to set NV Binary %d", nvStatus);
3004 return -EIO;
3005 }
3006
3007 nvStatus = vos_nv_setNVEncodedBuffer(
3008 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3009 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3010
3011 if ((VOS_STATUS_SUCCESS != nvStatus))
3012 {
3013 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3014 "Fail to set NV Binary %d", nvStatus);
3015 return -EIO;
3016 }
3017
3018 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3019 pHddCtx->ftm.targetNVTableSize = 0;
3020 pHddCtx->ftm.processedNVTableSize = 0;
3021 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3022 }
3023
3024 return 1;
3025}
3026
Jeff Johnson295189b2012-06-20 16:38:30 -07003027/**---------------------------------------------------------------------------
3028
3029 \brief wlan_hdd_ftm_temp_get_rel_num() -
3030 Get internal release number
3031
3032 \param - ftmCmd - Pointer FTM Commad Buffer
3033
3034 \return - int
3035 -1, Process Host command fail, vail out
3036 0, Process Host command success
3037
3038 --------------------------------------------------------------------------*/
3039int wlan_hdd_ftm_temp_get_rel_num
3040(
3041 tPttMsgbuffer *ftmCmd
3042)
3043{
3044 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3045
3046 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3047 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3048 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3049 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3050 relNum->relParams.pttMax = 10;
3051 relNum->relParams.pttMin = 1;
3052
3053 return 1;
3054}
3055
3056/**---------------------------------------------------------------------------
3057
3058 \brief wlan_hdd_process_ftm_host_cmd() -
3059 process any command should be handled within host.
3060 decide any command should be send to HAL or not
3061
3062 \param - ftmCmd - Pointer FTM Commad Buffer
3063
3064 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003065 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003066 0, Process Host command success, not need to send CMD to HAL
3067 1, Process Host command success, need to send CMD to HAL
3068
3069 --------------------------------------------------------------------------*/
3070int wlan_hdd_process_ftm_host_cmd
3071(
3072 hdd_context_t *pHddCtx,
3073 void *ftmCmd
3074)
3075{
3076 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3077 int needToRouteHal = 1;
3078 int hostState = 1;
3079
3080 switch(pFTMCmd->msgId)
3081 {
3082 case PTT_MSG_GET_NV_TABLE:
3083 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3084 needToRouteHal = 0;
3085 break;
3086
3087 case PTT_MSG_SET_NV_TABLE:
3088 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3089 /* Temp NV Operation will be isolated to host
3090 needToRouteHal = 1; */
3091 needToRouteHal = 0;
3092 break;
3093
3094 case PTT_MSG_BLANK_NV:
3095 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3096 needToRouteHal = 1;
3097 break;
3098
3099 case PTT_MSG_DEL_NV_TABLE:
3100 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3101 needToRouteHal = 1;
3102 break;
3103
3104 case PTT_MSG_GET_NV_FIELD:
3105 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3106 needToRouteHal = 0;
3107 break;
3108
3109 case PTT_MSG_SET_NV_FIELD:
3110 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3111 needToRouteHal = 0;
3112 break;
3113
3114 case PTT_MSG_STORE_NV_TABLE:
3115 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3116 needToRouteHal = 0;
3117 break;
3118
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003119 case PTT_MSG_GET_NV_BIN:
3120 case PTT_MSG_GET_DICTIONARY:
3121 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3122 needToRouteHal = 0;
3123 break;
3124
3125 case PTT_MSG_SET_NV_BIN:
3126 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3127 needToRouteHal = 0;
3128 break;
3129
Jeff Johnson295189b2012-06-20 16:38:30 -07003130 case PTT_MSG_DBG_READ_REGISTER:
3131 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3132 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3133 needToRouteHal = 0;
3134 break;
3135
3136 case PTT_MSG_DBG_WRITE_REGISTER:
3137 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3138 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3139 needToRouteHal = 0;
3140 break;
3141
3142 case PTT_MSG_DBG_READ_MEMORY:
3143 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3144 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3145 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3146 needToRouteHal = 0;
3147 break;
3148
3149 case PTT_MSG_DBG_WRITE_MEMORY:
3150 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3151 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3152 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3153 needToRouteHal = 0;
3154 break;
3155
3156 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3157 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3158 needToRouteHal = 0;
3159 break;
3160
3161 default:
3162 needToRouteHal = 1;
3163 break;
3164 }
3165
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003166 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003167 {
3168 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3169 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003170 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003171 }
3172
3173 return needToRouteHal;
3174}
Jeff Johnson295189b2012-06-20 16:38:30 -07003175
3176/**---------------------------------------------------------------------------
3177
3178 \brief wlan_hdd_process_ftm_cmd() -
3179
3180 This function process the commands received from the ptt socket application.
3181
3182 \param - pAdapter - Pointer HDD Context.
3183
3184 \param - wnl - Pointer to the ANI netlink header.
3185
3186 \return - none
3187
3188 --------------------------------------------------------------------------*/
3189
3190void wlan_hdd_process_ftm_cmd
3191(
3192 hdd_context_t *pHddCtx,
3193 tAniNlHdr *wnl
3194)
3195{
3196 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3197 v_U16_t cmd_len;
3198 v_U8_t *pftm_data;
3199 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003200 int hostState;
3201 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003202
3203 ENTER();
3204
Jeff Johnsone7245742012-09-05 17:12:55 -07003205 //Delay to fix NV write failure on JB
3206 vos_busy_wait(10000); //10ms
3207
Jeff Johnson295189b2012-06-20 16:38:30 -07003208 if (!pRequestBuf) {
3209
Arif Hussain6d2a3322013-11-17 19:50:10 -08003210 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003211 return ;
3212 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303213
3214 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3215 {
3216 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3217 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3218 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3219 return ;
3220 }
3221
Jeff Johnson295189b2012-06-20 16:38:30 -07003222 /*Save the received request*/
3223 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3224
3225 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3226 /*Save the received request netlink header used for sending the response*/
3227 pHddCtx->ftm.wnl = wnl;
3228 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3229
Arif Hussain6d2a3322013-11-17 19:50:10 -08003230 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003231
3232 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3233 wlan_ftm_send_response(pHddCtx);
3234 return ;
3235 }
3236
3237 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3238 {
3239 case WLAN_FTM_START:
3240 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3241
Arif Hussain6d2a3322013-11-17 19:50:10 -08003242 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003243 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3244 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3245 wlan_ftm_send_response(pHddCtx);
3246 return;
3247 }
3248
3249 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3250 {
3251 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3252 ,__func__);
3253 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3254 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303255 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003256 return;
3257 }
3258 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3259 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3260 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3261 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3262
3263 wlan_ftm_send_response(pHddCtx);
Hanumantha Reddy Pothula45af96b2015-02-12 16:07:58 +05303264 complete(&pHddCtx->ftm.startCmpVar);
Jeff Johnson295189b2012-06-20 16:38:30 -07003265 break;
3266
3267 case WLAN_FTM_STOP:
3268 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3269
Arif Hussain6d2a3322013-11-17 19:50:10 -08003270 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003271 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3272 wlan_ftm_send_response(pHddCtx);
3273 return;
3274 }
3275
3276 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3277
3278 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3279 wlan_ftm_send_response(pHddCtx);
3280 return;
3281 }
3282
3283 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3284 /* This would send back the Command Success Status */
3285 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3286
3287 wlan_ftm_send_response(pHddCtx);
3288
3289 break;
3290
3291 case WLAN_FTM_CMD:
3292 /* if it is regular FTM command, pass it to HAL PHY */
3293 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003294 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003295 return;
3296 }
3297 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3298
Arif Hussain6d2a3322013-11-17 19:50:10 -08003299 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003300
3301 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3302 wlan_ftm_send_response(pHddCtx);
3303 return;
3304
3305 }
3306 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3307 cmd_len = pRequestBuf->ftm_hdr.data_len;
3308 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3309 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3310
Jeff Johnson295189b2012-06-20 16:38:30 -07003311 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3312 if (0 == hostState)
3313 {
3314 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3315 if (NULL == tempRspBuffer)
3316 {
3317 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003318 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003319 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3320 wlan_ftm_send_response(pHddCtx);
3321 return;
3322 }
3323 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3324 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3325 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3326 (unsigned char *) tempRspBuffer,
3327 tempRspBuffer->msgBodyLength);
3328 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3329 wlan_ftm_send_response(pHddCtx);
3330 vos_mem_free(tempRspBuffer);
3331 return;
3332 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003333 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003334 {
3335 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3336 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3337 wlan_ftm_send_response(pHddCtx);
3338 return;
3339 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003340
3341 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3342
Jeff Johnson295189b2012-06-20 16:38:30 -07003343
3344 /*Post the command to the HAL*/
3345 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3346
Arif Hussain6d2a3322013-11-17 19:50:10 -08003347 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003348 return;
3349
3350 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303351 /*After successful posting of message the command should be pending*/
3352 pHddCtx->ftm.IsCmdPending = TRUE;
3353
Jeff Johnson295189b2012-06-20 16:38:30 -07003354 /*Wait here until you get the response from HAL*/
3355 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3356 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303357 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3358 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3359 wlan_ftm_send_response(pHddCtx);
3360 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003361 return;
3362 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303363 /*This check will handle the case where the completion is sent by
3364 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3365 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3366 {
3367 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3368 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3369 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3370
3371 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3372 wlan_ftm_send_response(pHddCtx);
3373 pHddCtx->ftm.IsCmdPending = FALSE;
3374 return ;
3375 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003376
3377 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3378
3379 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3380
3381 wlan_ftm_send_response(pHddCtx);
3382 pHddCtx->ftm.IsCmdPending = FALSE;
3383 break;
3384
3385 default:
3386
Arif Hussain6d2a3322013-11-17 19:50:10 -08003387 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003388 return;
3389 }
3390
3391 EXIT();
3392 return;
3393} /* wlan_adp_ftm_cmd() */
3394
3395/**---------------------------------------------------------------------------
3396
3397 \brief wlan_ftm_priv_start_stop_ftm() -
3398
3399 This function is used for start/stop the ftm driver.
3400
3401 \param - pAdapter - Pointer HDD Context.
3402 - start - 1/0 to start/stop ftm driver.
3403
3404 \return - 0 for success, non zero for failure
3405
3406 --------------------------------------------------------------------------*/
3407
3408static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3409 v_U16_t start)
3410{
3411 VOS_STATUS status;
3412 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3413
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003414 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003415 {
3416 pHddCtx->ftm.cmd_iwpriv = TRUE;
3417 status = wlan_hdd_ftm_start(pHddCtx);
3418
3419 if (status != VOS_STATUS_SUCCESS)
3420 {
3421 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3422 "FTM Start Failed");
3423 return VOS_STATUS_E_FAILURE;
3424 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303425 if (NULL == pMsgBuf)
3426 {
3427 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3428 if (NULL == pMsgBuf)
3429 {
3430 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3431 "%s:pMsgBuf is NULL", __func__);
3432 return VOS_STATUS_E_FAILURE;
3433 }
3434 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003435 }
3436 else
3437 {
3438 status = wlan_ftm_stop(pHddCtx);
3439
3440 if (status != VOS_STATUS_SUCCESS)
3441 {
3442 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3443 "FTM Stop Failed");
3444 return VOS_STATUS_E_FAILURE;
3445 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303446 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3447 if (pMsgBuf)
3448 {
3449 vos_mem_free((v_VOID_t * )pMsgBuf);
3450 pMsgBuf = NULL;
3451 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003452 }
3453 return VOS_STATUS_SUCCESS;
3454}
3455
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303456
3457static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3458{
3459 unsigned int *table = NULL;
3460 int index = 0;
3461
3462 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3463 table = valid_channel;
3464 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3465 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3466 table = valid_channel_cb40;
3467 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3468 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3469 table = valid_channel_cb80;
3470
3471 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303472 {
3473 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3474 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303475 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303476 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303477
3478 while (table[index] != 0)
3479 {
3480 if (table[index] == channel)
3481 return VOS_STATUS_SUCCESS;
3482
3483 index++;
3484 }
3485
3486 return VOS_STATUS_E_FAILURE;
3487}
3488
3489
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303490static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3491{
3492 unsigned int primary_channel = center_channel;
3493
3494 if (center_channel <= 14)
3495 return primary_channel ;
3496
3497 switch (cb)
3498 {
3499 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3500 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3501 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3502 primary_channel -= 2;
3503 break;
3504
3505
3506 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3507 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3508 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3509 primary_channel += 2;
3510 break;
3511
3512 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3513 primary_channel -= 6;
3514 break;
3515
3516 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3517 primary_channel += 6;
3518 break;
3519 }
3520
3521 return primary_channel;
3522
3523}
3524
Jeff Johnson295189b2012-06-20 16:38:30 -07003525/**---------------------------------------------------------------------------
3526
3527 \brief wlan_ftm_priv_set_channel() -
3528
3529 This function is used for setting the channel to the halphy ptt module.
3530
3531 \param - pAdapter - Pointer HDD Context.
3532 - channel - Channel Number 1-14.
3533
3534 \return - 0 for success, non zero for failure
3535
3536 --------------------------------------------------------------------------*/
3537
3538static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3539{
Jeff Johnson295189b2012-06-20 16:38:30 -07003540 uPttMsgs *pMsgBody;
3541 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303542 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003543 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3544
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303545 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003546 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303547 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3548 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003549 return VOS_STATUS_E_FAILURE;
3550 }
3551
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303552 if (NULL == pMsgBuf)
3553 {
3554 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3555 "%s:pMsgBuf is NULL", __func__);
3556 return VOS_STATUS_E_NOMEM;
3557 }
3558
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303559 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003560 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303561 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3562 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003563 return VOS_STATUS_E_FAILURE;
3564 }
3565
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303566 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003567 init_completion(&pHddCtx->ftm.ftm_comp_var);
3568 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3569 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3570
3571 pMsgBody = &pMsgBuf->msgBody;
3572
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303573 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003574
Arif Hussain6d2a3322013-11-17 19:50:10 -08003575 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303576 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003577
3578 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3579
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303580 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003581 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303582 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3583 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003584 status = VOS_STATUS_E_FAILURE;
3585 goto done;
3586
3587 }
c_hpothuffdb5272013-10-02 16:42:35 +05303588 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303589 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303590 if (0 >= ret )
3591 {
3592 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3593 FL("wait on ftm_comp_var failed %ld"), ret);
3594 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003595
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303596 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003597 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303598 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3599 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 status = VOS_STATUS_E_FAILURE;
3601 goto done;
3602
3603 }
3604done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003605
3606 return status;
3607}
3608
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303609
3610/**---------------------------------------------------------------------------
3611
3612 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3613
3614 This function is used for setting the power control mode for tx.
3615
3616 \param - pAdapter - Pointer HDD Context.
3617 - pwr_mode - power control mode 0-2.
3618
3619 \return - 0 for success, non zero for failure
3620
3621 --------------------------------------------------------------------------*/
3622
3623static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3624 v_U16_t pwr_mode)
3625{
3626 uPttMsgs *pMsgBody;
3627 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303628 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303629 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3630
3631 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3632 {
3633 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3634 "%s:Ftm has not started. Please start the ftm. ", __func__);
3635 return VOS_STATUS_E_FAILURE;
3636 }
3637
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303638 if (NULL == pMsgBuf)
3639 {
3640 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3641 "%s:pMsgBuf is NULL", __func__);
3642 return VOS_STATUS_E_NOMEM;
3643 }
3644
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303645 if (pwr_mode > 2)
3646 {
3647 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3648 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3649 return VOS_STATUS_E_FAILURE;
3650 }
3651
3652 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3653 init_completion(&pHddCtx->ftm.ftm_comp_var);
3654 pMsgBody = &pMsgBuf->msgBody;
3655 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3656 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3657
3658 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3659 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3660
3661 if (status != VOS_STATUS_SUCCESS)
3662 {
3663 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3664 "%s:wlan_ftm_postmsg failed", __func__);
3665 status = VOS_STATUS_E_FAILURE;
3666 goto done;
3667 }
c_hpothuffdb5272013-10-02 16:42:35 +05303668 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303669 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303670 if (0 >= ret )
3671 {
3672 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3673 FL("wait on ftm_comp_var failed %ld"), ret);
3674 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303675
3676 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3677 {
3678 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3679 "%s:Ptt response status failed", __func__);
3680 status = VOS_STATUS_E_FAILURE;
3681 goto done;
3682 }
3683
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303684 ftm_status.powerCtlMode= pwr_mode;
3685
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303686 done:
3687 return status;
3688
3689}
3690
Jeff Johnson295189b2012-06-20 16:38:30 -07003691/**---------------------------------------------------------------------------
3692
3693 \brief wlan_ftm_priv_set_txpower() -
3694
3695 This function is used for setting the txpower to the halphy ptt module.
3696
3697 \param - pAdapter - Pointer HDD Context.
3698 - txpower - txpower Number 1-18.
3699
3700 \return - 0 for success, non zero for failure
3701
3702 --------------------------------------------------------------------------*/
3703
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303704static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3705 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003706{
Jeff Johnson295189b2012-06-20 16:38:30 -07003707 uPttMsgs *pMsgBody;
3708 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303709 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003710 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3711
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303712 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003713 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303714 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3715 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003716 return VOS_STATUS_E_FAILURE;
3717 }
3718
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303719 if (NULL == pMsgBuf)
3720 {
3721 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3722 "%s:pMsgBuf is NULL", __func__);
3723 return VOS_STATUS_E_NOMEM;
3724 }
3725
Jeff Johnson295189b2012-06-20 16:38:30 -07003726 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3727 * when tx pktgen is enabled
3728 */
3729 if (ftm_status.frameGenEnabled)
3730 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303731 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3732 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003733 return VOS_STATUS_E_FAILURE;
3734 }
3735
3736 if(!(txpower >= 9 && txpower <= 24))
3737 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303738 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3739 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003740 return VOS_STATUS_E_FAILURE;
3741 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003742
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303743 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3744 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003745 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003746 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3747 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3748
3749 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3750
3751 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3752
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303753 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003754 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303755 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3756 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003757 status = VOS_STATUS_E_FAILURE;
3758 goto done;
3759 }
c_hpothuffdb5272013-10-02 16:42:35 +05303760 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303761 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303762 if (0 >= ret )
3763 {
3764 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3765 FL("wait on ftm_comp_var failed %ld"), ret);
3766 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003767
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303768 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003769 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303770 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3771 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003772 status = VOS_STATUS_E_FAILURE;
3773 goto done;
3774 }
3775
Jeff Johnson295189b2012-06-20 16:38:30 -07003776 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003777
3778 return status;
3779
3780}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303781
3782
3783static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3784 v_U16_t enable)
3785{
3786 tANI_U32 value = 0;
3787 tANI_U32 reg_addr;
3788 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303789
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303790 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3791 {
3792 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3793 "%s:Ftm has not started. Please start the ftm. ", __func__);
3794 return VOS_STATUS_E_FAILURE;
3795 }
3796
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303797 reg_addr = WCNSS_TXFIR_OFFSET;
3798
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303799 wpalReadRegister(reg_addr, &value);
3800 if (enable)
3801 {
3802 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3803 }
3804 else
3805 {
3806 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3807 }
3808
3809 wpalWriteRegister(reg_addr, value);
3810
3811 return VOS_STATUS_SUCCESS;
3812}
3813
3814
Jeff Johnson295189b2012-06-20 16:38:30 -07003815/**---------------------------------------------------------------------------
3816
3817 \brief wlan_ftm_priv_set_txrate() -
3818
3819 This function is used for setting the txrate to the halphy ptt module.
3820 It converts the user input string for txrate to the tx rate index.
3821
3822 \param - pAdapter - Pointer HDD Context.
3823 - txrate - Pointer to the tx rate string.
3824
3825 \return - 0 for success, non zero for failure
3826
3827 --------------------------------------------------------------------------*/
3828
3829static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3830{
3831 int ii;
3832 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3833 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3834 {
3835 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3836 return VOS_STATUS_E_FAILURE;
3837 }
3838
3839 /* do not allow to change setting when tx pktgen is enabled */
3840 if (ftm_status.frameGenEnabled)
3841 {
3842 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3843 return VOS_STATUS_E_FAILURE;
3844 }
3845
3846 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3847 {
3848 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3849 break;
3850 }
3851 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3852 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003853 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003854 return VOS_STATUS_E_FAILURE;
3855 }
3856
3857 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3858 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3859
3860 return VOS_STATUS_SUCCESS;
3861}
3862
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303863
3864
3865static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3866 ePowerTempIndexSource pwr_source)
3867{
3868 uPttMsgs *pMsgBody;
3869 VOS_STATUS status;
3870 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3871
3872 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3873 {
3874 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3875 "%s:Ftm has not started. Please start the ftm. ", __func__);
3876 return VOS_STATUS_E_FAILURE;
3877 }
3878
3879 if (pwr_source > 3)
3880 {
3881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3882 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3883 __func__);
3884 return VOS_STATUS_E_FAILURE;
3885 }
3886
3887 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3888
3889 init_completion(&pHddCtx->ftm.ftm_comp_var);
3890 pMsgBody = &pMsgBuf->msgBody;
3891 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3892 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3893
3894 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3895 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3896
3897 if (status != VOS_STATUS_SUCCESS)
3898 {
3899 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3900 "%s:wlan_ftm_postmsg failed", __func__);
3901 status = VOS_STATUS_E_FAILURE;
3902 goto done;
3903 }
3904 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3905 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3906
3907 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3908 {
3909 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3910 "%s:Ptt response status failed", __func__);
3911 status = VOS_STATUS_E_FAILURE;
3912 goto done;
3913 }
3914
3915done:
3916
3917 return status;
3918}
3919
3920
Jeff Johnson295189b2012-06-20 16:38:30 -07003921/**---------------------------------------------------------------------------
3922
3923 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3924
3925 This function is used for start/stop the tx packet generation.
3926
3927 \param - pAdapter - Pointer HDD Context.
3928 - startStop - Value( 1/0) start/stop the tx packet generation.
3929
3930 \return - 0 for success, non zero for failure
3931
3932 --------------------------------------------------------------------------*/
3933
3934static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3935{
Jeff Johnson295189b2012-06-20 16:38:30 -07003936 uPttMsgs *pMsgBody;
3937 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303938 long ret;
3939
Jeff Johnson295189b2012-06-20 16:38:30 -07003940 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3941
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303942 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003943 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303944 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3945 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003946 return VOS_STATUS_E_FAILURE;
3947 }
3948
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303949 if (NULL == pMsgBuf)
3950 {
3951 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3952 "%s:pMsgBuf is NULL", __func__);
3953 return VOS_STATUS_E_NOMEM;
3954 }
3955
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303956 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003957 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303958 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3959 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003960 return VOS_STATUS_E_FAILURE;
3961 }
3962
3963 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3964 (!ftm_status.frameGenEnabled && startStop == 0))
3965 {
3966 return VOS_STATUS_SUCCESS ;
3967 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303968 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003969
Jeff Johnson295189b2012-06-20 16:38:30 -07003970 if (startStop == 1)
3971 {
3972 init_completion(&pHddCtx->ftm.ftm_comp_var);
3973 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3974 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3975 pMsgBody = &pMsgBuf->msgBody;
3976 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3977
3978 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303979 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003980 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303981 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3982 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003983 status = VOS_STATUS_E_FAILURE;
3984 goto done;
3985 }
3986
c_hpothuffdb5272013-10-02 16:42:35 +05303987 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303988 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303989 if (0 >= ret )
3990 {
3991 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3992 FL("wait on ftm_comp_var failed %ld"), ret);
3993 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303994 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003995 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303996 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3997 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003998 status = VOS_STATUS_E_FAILURE;
3999 goto done;
4000 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304001
4002 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4003 {
4004 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4005 if(status != VOS_STATUS_SUCCESS)
4006 {
4007 goto done;
4008 }
4009 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004010 }
4011
4012 init_completion(&pHddCtx->ftm.ftm_comp_var);
4013 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4014 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4015 pMsgBody = &pMsgBuf->msgBody;
4016 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4017
4018 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4019 if(status != VOS_STATUS_SUCCESS)
4020 {
4021 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4022 status = VOS_STATUS_E_FAILURE;
4023 goto done;
4024 }
4025
c_hpothuffdb5272013-10-02 16:42:35 +05304026 ret = wait_for_completion_interruptible_timeout(
4027 &pHddCtx->ftm.ftm_comp_var,
4028 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4029 if (0 >= ret )
4030 {
4031 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4032 FL("wait on ftm_comp_var failed %ld"), ret);
4033 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004034 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4035 {
4036 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4037 status = VOS_STATUS_E_FAILURE;
4038 goto done;
4039 }
4040
4041done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004042
4043 if (status == VOS_STATUS_SUCCESS)
4044 {
4045 if (startStop == 1)
4046 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304047 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004048 }
4049 else
4050 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304051 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004052 }
4053 }
4054
4055 return status;
4056}
4057
4058
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304059
4060static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4061{
4062
4063 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4064 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4065 {
4066 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4067 "%s:Ftm has not started. Please start the ftm. ", __func__);
4068 return VOS_STATUS_E_FAILURE;
4069 }
4070
4071 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4072 {
4073 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4074 "%s:cb mode value is invalid ", __func__);
4075 return VOS_STATUS_E_FAILURE;
4076 }
4077
4078 ftm_status.cbmode = cbmode;
4079
4080 return VOS_STATUS_SUCCESS;
4081
4082}
4083
Jeff Johnson295189b2012-06-20 16:38:30 -07004084/**---------------------------------------------------------------------------
4085
4086 \brief wlan_ftm_rx_mode() -
4087
4088 This function is used for start/stop the rx packet generation.
4089
4090 \param - pAdapter - Pointer HDD Context.
4091 - rxmode - 0-disable RX.
4092 - 1-rx ALL frames
4093 - 2-rx 11 g/n frames
4094 - 3-rx 11b frames
4095
4096 \return - 0 for success, non zero for failure
4097
4098 --------------------------------------------------------------------------*/
4099
4100static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4101{
Jeff Johnson295189b2012-06-20 16:38:30 -07004102 uPttMsgs *pMsgBody;
4103 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304104 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004105
4106 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304107 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304109 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4110 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004111 return VOS_STATUS_E_FAILURE;
4112 }
4113
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304114 if (NULL == pMsgBuf)
4115 {
4116 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4117 "%s:pMsgBuf is NULL", __func__);
4118 return VOS_STATUS_E_NOMEM;
4119 }
4120
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304121 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004122 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304123 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4124 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004125 return VOS_STATUS_E_FAILURE;
4126 }
4127
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304128 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004129 init_completion(&pHddCtx->ftm.ftm_comp_var);
4130
4131 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4132 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4133
4134 pMsgBody = &pMsgBuf->msgBody;
4135
4136 switch(rxmode)
4137 {
4138 case RXMODE_DISABLE_ALL:
4139 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4140 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4141 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4142 break;
4143
4144 case RXMODE_ENABLE_ALL:
4145 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4146 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4147 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4148 break;
4149
4150 case RXMODE_ENABLE_11GN:
4151 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4152 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4153 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4154 break;
4155
4156 case RXMODE_ENABLE_11B:
4157 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4158 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4159 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4160 break;
4161
4162 }
4163
4164 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4165
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304166 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004167 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304168 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4169 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004170 status = VOS_STATUS_E_FAILURE;
4171 goto done;
4172 }
c_hpothuffdb5272013-10-02 16:42:35 +05304173 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304174 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304175 if (0 >= ret )
4176 {
4177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4178 FL(" wait on ftm_comp_var failed %ld"), ret);
4179 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004180
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304181 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004182 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304183 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4184 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004185 status = VOS_STATUS_E_FAILURE;
4186 goto done;
4187 }
4188 ftm_status.rxmode = rxmode ;
4189done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004190
4191 return status;
4192}
4193
4194/**---------------------------------------------------------------------------
4195
4196 \brief wlan_ftm_priv_rx_pkt_clear() -
4197
4198 This function sets the rx pkt count to zero.
4199
4200 \param - pAdapter - Pointer HDD Context.
4201 - rx_pkt_clear - rx_pkt_clear value.
4202
4203 \return - 0 for success, non zero for failure
4204
4205 --------------------------------------------------------------------------*/
4206
4207static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4208{
Jeff Johnson295189b2012-06-20 16:38:30 -07004209 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304210 long ret;
4211
Jeff Johnson295189b2012-06-20 16:38:30 -07004212 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4213
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304214 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004215 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304216 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4217 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004218 return VOS_STATUS_E_FAILURE;
4219 }
4220
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304221 if (NULL == pMsgBuf)
4222 {
4223 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4224 "%s:pMsgBuf is NULL", __func__);
4225 return VOS_STATUS_E_NOMEM;
4226 }
4227
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304228 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004229 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304230 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4231 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004232 return VOS_STATUS_E_FAILURE;
4233 }
4234
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304235 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004236 init_completion(&pHddCtx->ftm.ftm_comp_var);
4237 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304238 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004239
Jeff Johnson295189b2012-06-20 16:38:30 -07004240 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4241
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304242 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004243 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304244 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4245 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004246 status = VOS_STATUS_E_FAILURE;
4247 goto done;
4248 }
c_hpothuffdb5272013-10-02 16:42:35 +05304249 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304250 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304251 if (0 >= ret )
4252 {
4253 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4254 FL("wait on ftm_comp_var failed %ld"), ret);
4255 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004256
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304257 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004258 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304259 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4260 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004261 status = VOS_STATUS_E_FAILURE;
4262 goto done;
4263 }
4264done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004265
4266 return status;
4267}
4268
4269/**---------------------------------------------------------------------------
4270
4271 \brief wlan_ftm_priv_get_channel() -
4272
4273 This function gets the channel number from the halphy ptt module and
4274 returns the channel number to the application.
4275
4276 \param - pAdapter - Pointer HDD Context.
4277 - pChannel - Poniter to get the Channel number.
4278
4279 \return - 0 for success, non zero for failure
4280
4281 --------------------------------------------------------------------------*/
4282
4283static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4284{
Jeff Johnson295189b2012-06-20 16:38:30 -07004285 uPttMsgs *pMsgBody;
4286 VOS_STATUS status;
4287 v_U16_t freq;
4288 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304289 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004290
4291 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304292 v_PVOID_t devHandle = pHddCtx->parent_dev;
4293 struct device *wcnss_device = (struct device *)devHandle;
4294 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304295 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004296 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304297 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4298 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004299 return VOS_STATUS_E_FAILURE;
4300 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304301
4302 if (NULL == pMsgBuf)
4303 {
4304 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4305 "%s:pMsgBuf is NULL", __func__);
4306 return VOS_STATUS_E_NOMEM;
4307 }
4308
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304309 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004310 init_completion(&pHddCtx->ftm.ftm_comp_var);
4311 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4312 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4313
4314 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304315 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4316 if (NULL == wcnss_memory)
4317 {
4318 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4319 "%s: wcnss_memory is NULL", __func__);
4320 return VOS_STATUS_E_NOMEM;
4321 }
4322 else
4323 {
4324 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4325 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4326 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004327 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4328
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304329 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304331 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4332 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004333 status = VOS_STATUS_E_FAILURE;
4334 goto done;
4335
4336 }
c_hpothuffdb5272013-10-02 16:42:35 +05304337 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304338 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304339 if (0 >= ret )
4340 {
4341 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4342 FL("wait on ftm_comp_var failed %ld"), ret);
4343 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004344
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304345 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004346 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304347 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4348 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004349 status = VOS_STATUS_E_FAILURE;
4350 goto done;
4351 }
4352
4353 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4354
4355 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4356 indx++;
4357 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4358 {
4359 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4360 status = VOS_STATUS_E_FAILURE;
4361 goto done;
4362 }
4363
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004364 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004365
Arif Hussain6d2a3322013-11-17 19:50:10 -08004366 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004367 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004368
4369 return status;
4370}
4371
4372/**---------------------------------------------------------------------------
4373
4374 \brief wlan_ftm_priv_get_txpower() -
4375
4376 This function gets the TX power from the halphy ptt module and
4377 returns the TX power to the application.
4378
4379 \param - pAdapter - Pointer HDD Context.
4380 - pTxPwr - Poniter to get the Tx power.
4381
4382 \return - 0 for success, non zero for failure
4383
4384 --------------------------------------------------------------------------*/
4385
4386static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4387{
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 uPttMsgs *pMsgBody;
4389 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304390 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004391 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4392
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304393 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004394 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304395 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4396 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004397 return VOS_STATUS_E_FAILURE;
4398 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304399
4400 if (NULL == pMsgBuf)
4401 {
4402 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4403 "%s:pMsgBuf is NULL", __func__);
4404 return VOS_STATUS_E_NOMEM;
4405 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304406 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004407 init_completion(&pHddCtx->ftm.ftm_comp_var);
4408 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4409 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4410
4411 pMsgBody = &pMsgBuf->msgBody;
4412
4413 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4414
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304415 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004416 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304417 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4418 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 status = VOS_STATUS_E_FAILURE;
4420 goto done;
4421 }
c_hpothuffdb5272013-10-02 16:42:35 +05304422 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304423 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304424 if (0 >= ret )
4425 {
4426 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4427 FL("wait on ftm_comp_var failed %ld"), ret);
4428 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004429
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304430 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004431 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304432 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4433 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004434 status = VOS_STATUS_E_FAILURE;
4435 goto done;
4436 }
4437 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4438
4439 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004440
4441 return status;
4442}
4443
4444/**---------------------------------------------------------------------------
4445
Jeff Johnson295189b2012-06-20 16:38:30 -07004446 \brief wlan_ftm_priv_get_txrate() -
4447
4448 This function gets the TX rate from the halphy ptt module and
4449 returns the TX rate to the application.
4450
4451 \param - pAdapter - Pointer HDD Context.
4452 - pTxRate - Poniter to get the Tx rate.
4453
4454 \return - 0 for success, non zero for failure
4455
4456 --------------------------------------------------------------------------*/
4457
4458static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4459{
Jeff Johnson295189b2012-06-20 16:38:30 -07004460 uPttMsgs *pMsgBody;
4461 VOS_STATUS status;
4462 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304463 long ret;
4464
Jeff Johnson295189b2012-06-20 16:38:30 -07004465 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4466
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304467 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004468 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304469 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4470 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004471 return VOS_STATUS_E_FAILURE;
4472 }
4473
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304474 if (NULL == pMsgBuf)
4475 {
4476 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4477 "%s:pMsgBuf is NULL", __func__);
4478 return VOS_STATUS_E_NOMEM;
4479 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304480 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004481 init_completion(&pHddCtx->ftm.ftm_comp_var);
4482 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4483 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4484
4485 pMsgBody = &pMsgBuf->msgBody;
4486
4487 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4488
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304489 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004490 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304491 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4492 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004493 status = VOS_STATUS_E_FAILURE;
4494 goto done;
4495 }
c_hpothuffdb5272013-10-02 16:42:35 +05304496 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304497 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304498 if (0 >= ret )
4499 {
4500 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4501 FL("wait on ftm_comp_var failed %ld"), ret);
4502 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004503
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304504 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004505
4506 rate_index = pMsgBody->GetTxPowerReport.rate;
4507 }
4508 else {
4509 /*Return the default rate*/
4510 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304511 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4512 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004513 status = VOS_STATUS_E_FAILURE;
4514 goto done;
4515 }
4516
4517 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4518 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4519 break;
4520 }
4521 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4522 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004523 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004524 status = VOS_STATUS_E_FAILURE;
4525 goto done;
4526 }
4527 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4528done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004529
4530 return status;
4531
4532}
4533
4534/**---------------------------------------------------------------------------
4535
4536 \brief wlan_ftm_priv_get_rx_pkt_count() -
4537
4538 This function gets the rx pkt count from the halphy ptt module and
4539 returns the rx pkt count to the application.
4540
4541 \param - pAdapter - Pointer HDD Context.
4542 - pRxPktCnt - Poniter to get the rx pkt count.
4543
4544 \return - 0 for success, non zero for failure
4545
4546 --------------------------------------------------------------------------*/
4547
4548static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4549{
Jeff Johnson295189b2012-06-20 16:38:30 -07004550 uPttMsgs *pMsgBody;
4551 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304552 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004553 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4554
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304555 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004556 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304557 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4558 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004559 return VOS_STATUS_E_FAILURE;
4560 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304561
4562 if (NULL == pMsgBuf)
4563 {
4564 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4565 "%s:pMsgBuf is NULL", __func__);
4566 return VOS_STATUS_E_NOMEM;
4567 }
4568
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304569 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004570 init_completion(&pHddCtx->ftm.ftm_comp_var);
4571 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4572 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4573
4574 pMsgBody = &pMsgBuf->msgBody;
4575
4576 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4577
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304578 if (status != VOS_STATUS_SUCCESS)
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:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004582 status = VOS_STATUS_E_FAILURE;
4583 goto done;
4584 }
c_hpothuffdb5272013-10-02 16:42:35 +05304585 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304586 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304587 if (0 >= ret )
4588 {
4589 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4590 FL("wait on ftm_comp_var failed %ld"), ret);
4591 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004592
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304593 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004594 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304595 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4596 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004597 status = VOS_STATUS_E_FAILURE;
4598 goto done;
4599 }
4600 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4601done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004602
4603 return status;
4604}
4605
4606/**---------------------------------------------------------------------------
4607
4608 \brief wlan_ftm_priv_get_rx_rssi() -
4609
4610 This function gets the rx rssi from the halphy ptt module and
4611 returns the rx rssi to the application.
4612
4613 \param - pAdapter - Pointer HDD Context.
4614 - buf - Poniter to get rssi of Rx chains
4615
4616 \return - 0 for success, non zero for failure
4617
4618 --------------------------------------------------------------------------*/
4619
4620static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4621{
Jeff Johnson295189b2012-06-20 16:38:30 -07004622 uPttMsgs *pMsgBody;
4623 VOS_STATUS status;
4624 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304625 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004626
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304627 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004628 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304629 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4630 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004631 return VOS_STATUS_E_FAILURE;
4632 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304633
4634 if (NULL == pMsgBuf)
4635 {
4636 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4637 "%s:pMsgBuf is NULL", __func__);
4638 return VOS_STATUS_E_NOMEM;
4639 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304640 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004641 init_completion(&pHddCtx->ftm.ftm_comp_var);
4642 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4643 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4644
4645 pMsgBody = &pMsgBuf->msgBody;
4646
4647 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4648
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304649 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004650 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304651 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4652 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004653 status = VOS_STATUS_E_FAILURE;
4654 goto done;
4655 }
c_hpothuffdb5272013-10-02 16:42:35 +05304656 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304657 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304658 if (0 >= ret )
4659 {
4660 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4661 FL("wait on ftm_comp_var failed %ld"), ret);
4662 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004663
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304664 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004665 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304666 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4667 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004668 status = VOS_STATUS_E_FAILURE;
4669 goto done;
4670 }
4671
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004672 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4673 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004674 pMsgBody->GetRxRssi.rssi.rx[1]);
4675
4676 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4677 {
4678 status = VOS_STATUS_E_FAILURE;
4679 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004680
Jeff Johnson295189b2012-06-20 16:38:30 -07004681done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004682
4683 return status;
4684}
4685
4686/**---------------------------------------------------------------------------
4687
4688 \brief wlan_ftm_priv_get_mac_address() -
4689
4690 This function gets the mac address from the halphy ptt module and
4691 returns the mac address to the application.
4692
4693 \param - pAdapter - Pointer HDD Context.
4694 - buf - Poniter to get the mac address.
4695
4696 \return - 0 for success, non zero for failure
4697
4698 --------------------------------------------------------------------------*/
4699
4700static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4701{
4702 v_BOOL_t itemIsValid = VOS_FALSE;
4703 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4704 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004705
Jeff Johnson295189b2012-06-20 16:38:30 -07004706 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4707
4708 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4709 {
4710 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4711 return VOS_STATUS_E_FAILURE;
4712 }
4713 /*Check the NV FIELD is valid or not*/
4714 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4715 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004716 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 {
4718 vos_nv_readMacAddress(macAddr);
4719
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004720 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4721 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004722 MAC_ADDR_ARRAY(macAddr));
4723 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4724 {
4725 return VOS_STATUS_E_FAILURE;
4726 }
4727 }
4728 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004729 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004730 {
4731 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004732 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4733 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004734 MAC_ADDR_ARRAY(macAddr));
4735
4736 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4737 {
4738 return VOS_STATUS_E_FAILURE;
4739 }
4740 }
4741 return VOS_STATUS_SUCCESS;
4742}
4743
4744/**---------------------------------------------------------------------------
4745
4746 \brief wlan_ftm_priv_set_mac_address() -
4747
4748 This function sets the mac address to the halphy ptt module and
4749 sends the netlink message to the ptt socket application which writes
4750 the macaddress to the qcom_wlan_nv.bin file
4751
4752 \param - pAdapter - Pointer HDD Context.
4753 - buf - Poniter to the macaddress.
4754
4755 \return - 0 for success, non zero for failure
4756
4757 --------------------------------------------------------------------------*/
4758
4759static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4760{
Jeff Johnson295189b2012-06-20 16:38:30 -07004761 uPttMsgs *pMsgBody;
4762 VOS_STATUS status;
4763 int macAddr[VOS_MAC_ADDRESS_LEN];
4764 v_U8_t *pMacAddress;
4765 v_U8_t ii;
4766 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304767 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004768
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304769 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004770 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304771 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4772 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004773 return VOS_STATUS_E_FAILURE;
4774 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304775 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004776 init_completion(&pHddCtx->ftm.ftm_comp_var);
4777 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4778 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4779
4780 pMsgBody = &pMsgBuf->msgBody;
4781 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4782
4783 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004784 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]))
4785 {
4786 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4787 "Invalid MacAddress Input %s", buf);
4788 return VOS_STATUS_E_FAILURE;
4789 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004790
Arif Hussain24bafea2013-11-15 15:10:03 -08004791 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4792 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004793
4794
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004795 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004796
4797 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4798 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4799
4800
Arif Hussain24bafea2013-11-15 15:10:03 -08004801 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4802 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004803 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4804
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304805 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004806 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304807 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4808 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004809 status = VOS_STATUS_E_FAILURE;
4810 goto done;
4811 }
c_hpothuffdb5272013-10-02 16:42:35 +05304812 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304813 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304814 if (0 >= ret )
4815 {
4816 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4817 FL("wait on ftm_comp_var failed %ld"), ret);
4818 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004819
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304820 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004821 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304822 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4823 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004824 status = VOS_STATUS_E_FAILURE;
4825 goto done;
4826 }
4827
Arif Hussain6d2a3322013-11-17 19:50:10 -08004828 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004829
4830 init_completion(&pHddCtx->ftm.ftm_comp_var);
4831 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4832
4833 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4834 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4835
4836 pMsgBody = &pMsgBuf->msgBody;
4837
4838 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4839
4840 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4841
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304842 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004843 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304844 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4845 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004846 status = VOS_STATUS_E_FAILURE;
4847 goto done;
4848 }
4849
c_hpothuffdb5272013-10-02 16:42:35 +05304850 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304851 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304852 if (0 >= ret )
4853 {
4854 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4855 FL("wait on ftm_comp_var failed %ld"), ret);
4856 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004857done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004858
4859 return VOS_STATUS_SUCCESS;
4860}
4861
4862/* set param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304863static int __iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004864 union iwreq_data *wrqu, char *extra)
4865{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004866 int ret,sub_cmd;
4867 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304868 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004869 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004870 hdd_adapter_t *pAdapter;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304871 hdd_context_t *pHddCtx;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304872 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07004873
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304874 ENTER();
4875
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004876 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304877 /* helper function to get iwreq_data with compat handling. */
4878 if (hdd_priv_get_data(&s_priv_data, wrqu))
4879 {
4880 return -EINVAL;
4881 }
4882
4883 /* make sure all params are correctly passed to function */
4884 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
4885 {
4886 return -EINVAL;
4887 }
4888
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304889 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4890 if (NULL == pAdapter)
4891 {
4892 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4893 "%s: Adapter is NULL",__func__);
4894 return -EINVAL;
4895 }
4896 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4897 ret = wlan_hdd_validate_context(pHddCtx);
4898 if (0 != ret)
4899 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304900 return ret;
4901 }
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304902 sub_cmd = s_priv_data.flags;
4903 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004904
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004905 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4906 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4907 * odd number which assigns set_args to zero.we assisgn memory using
4908 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004909 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004910 param = kzalloc(length + 1, GFP_KERNEL);
4911 if (!param)
4912 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004913
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304914 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004915 {
4916 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4917 "%s:Failed to get user data %s", __func__, param);
4918
4919 ret = -EINVAL;
4920 goto OUT;
4921 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004922
4923 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304924 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004925
4926 switch(sub_cmd)
4927 {
4928 case WE_SET_MAC_ADDRESS:
4929 {
4930
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004931 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004932 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004933
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004934 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004935
4936 if(status != VOS_STATUS_SUCCESS)
4937 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004938 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004939 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004940
Jeff Johnson295189b2012-06-20 16:38:30 -07004941 ret = -EINVAL;
4942 }
4943
Wilson Yang7c471652013-12-20 16:36:44 -08004944 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004945 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004946 case WE_SET_TX_RATE:
4947 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004948 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004949
4950 if(status != VOS_STATUS_SUCCESS)
4951 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004952 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004953 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004954
4955 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004956 }
4957
4958 break;
Wilson Yang7c471652013-12-20 16:36:44 -08004959 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004960 default:
4961 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004962 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004963 ret = -EINVAL;
4964 break;
4965 }
4966 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004967
4968OUT:
4969 kfree(param);
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304970 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07004971 return ret;
4972}
4973
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304974static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4975 union iwreq_data *wrqu, char *extra)
4976{
4977 int ret;
4978
4979 vos_ssr_protect(__func__);
4980 ret = __iw_ftm_setchar_getnone(dev, info, wrqu, extra);
4981 vos_ssr_unprotect(__func__);
4982
4983 return ret;
4984}
4985
4986static int __iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004987 union iwreq_data *wrqu, char *extra)
4988{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304989 hdd_adapter_t *pAdapter;
4990 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004991 int *value = (int *)extra;
4992 int sub_cmd = value[0];
4993 int set_value = value[1];
4994 int ret = 0; /* success */
4995 VOS_STATUS status;
4996
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05304997 ENTER();
4998
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304999 pAdapter = (netdev_priv(dev));
5000 if (NULL == pAdapter)
5001 {
5002 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5003 return -EINVAL;
5004 }
5005 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5006 ret = wlan_hdd_validate_context(pHddCtx);
5007 if (0 != ret)
5008 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305009 return ret;
5010 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005011 switch(sub_cmd)
5012 {
5013 case WE_FTM_ON_OFF:
5014 {
5015 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5016
5017 if(status != VOS_STATUS_SUCCESS)
5018 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005019 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005020 ret = -EINVAL;
5021 }
5022
5023 break;
5024 }
5025
5026 case WE_TX_PKT_GEN:
5027 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5028
5029 if(status != VOS_STATUS_SUCCESS)
5030 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005031 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005032 ret = -EINVAL;
5033 }
5034 break;
5035
5036 case WE_SET_TX_IFS:
5037 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5038
5039 if(status != VOS_STATUS_SUCCESS)
5040 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005041 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005042 ret = -EINVAL;
5043 }
5044 break;
5045
5046 case WE_SET_TX_PKT_CNT:
5047 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5048
5049 if(status != VOS_STATUS_SUCCESS)
5050 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005051 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005052 ret = -EINVAL;
5053 }
5054 break;
5055
5056 case WE_SET_TX_PKT_LEN:
5057 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5058
5059 if(status != VOS_STATUS_SUCCESS)
5060 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005061 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005062 ret = -EINVAL;
5063 }
5064 break;
5065
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305066 case WE_TX_CW_RF_GEN:
5067 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5068
5069 if(status != VOS_STATUS_SUCCESS)
5070 {
5071 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5072 ret = -EINVAL;
5073 }
5074 break;
5075
Jeff Johnson295189b2012-06-20 16:38:30 -07005076 case WE_SET_CHANNEL:
5077 {
5078 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5079
5080 if(status != VOS_STATUS_SUCCESS)
5081 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005082 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005083 ret = -EINVAL;
5084 }
5085 break;
5086 }
5087 case WE_SET_TX_POWER:
5088 {
5089 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5090
5091 if(status != VOS_STATUS_SUCCESS)
5092 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005093 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005094 ret = -EINVAL;
5095 }
5096 break;
5097 }
5098 case WE_CLEAR_RX_PKT_CNT:
5099 {
5100 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5101
5102 if(status != VOS_STATUS_SUCCESS)
5103 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005104 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005105 ret = -EINVAL;
5106 }
5107 break;
5108 }
5109 case WE_RX:
5110 {
5111 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5112
5113 if(status != VOS_STATUS_SUCCESS)
5114 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005115 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005116 ret = -EINVAL;
5117 }
5118 break;
5119 }
5120 case WE_ENABLE_CHAIN:
5121 {
5122 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5123
5124 if(status != VOS_STATUS_SUCCESS)
5125 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005126 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005127 ret = -EINVAL;
5128 }
5129 break;
5130 }
5131
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305132 case WE_SET_PWR_CNTL_MODE:
5133 {
5134 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5135 if (status != VOS_STATUS_SUCCESS)
5136 {
5137 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5138 status);
5139 ret = -EINVAL;
5140 }
5141 break;
5142 }
5143
5144 case WE_ENABLE_DPD:
5145 {
5146 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5147 if (status != VOS_STATUS_SUCCESS)
5148 {
5149 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5150 ret = -EINVAL;
5151 }
5152 break;
5153 }
5154
5155 case WE_SET_CB:
5156 {
5157 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5158 if (status != VOS_STATUS_SUCCESS)
5159 {
5160 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5161 ret = -EINVAL;
5162 }
5163 break;
5164 }
5165
Jeff Johnson295189b2012-06-20 16:38:30 -07005166 default:
5167 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005168 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005169 sub_cmd, set_value);
5170 break;
5171 }
5172 }
5173
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305174 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005175 return ret;
5176}
5177
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305178static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5179 union iwreq_data *wrqu, char *extra)
5180{
5181 int ret;
5182
5183 vos_ssr_protect(__func__);
5184 ret = __iw_ftm_setint_getnone(dev, info, wrqu, extra);
5185 vos_ssr_unprotect(__func__);
5186
5187 return ret;
5188}
Jeff Johnson295189b2012-06-20 16:38:30 -07005189/* get param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305190static int __iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005191 union iwreq_data *wrqu, char *extra)
5192{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305193 hdd_adapter_t *pAdapter;
5194 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005195 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005196 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005197 VOS_STATUS status;
5198
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305199 ENTER();
5200
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305201 pAdapter = (netdev_priv(dev));
5202 if (NULL == pAdapter)
5203 {
5204 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5205 return -EINVAL;
5206 }
5207 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5208 ret = wlan_hdd_validate_context(pHddCtx);
5209 if (0 != ret)
5210 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305211 return ret;
5212 }
5213
Jeff Johnson295189b2012-06-20 16:38:30 -07005214 switch (value[0])
5215 {
5216 case WE_GET_CHANNEL:
5217 {
5218 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5219
5220 if(status != VOS_STATUS_SUCCESS)
5221 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005222 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005223 ret = -EINVAL;
5224 }
5225 break;
5226 }
5227 case WE_GET_TX_POWER:
5228 {
5229 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5230
5231 if(status != VOS_STATUS_SUCCESS)
5232 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005233 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005234 ret = -EINVAL;
5235 }
5236 break;
5237 }
5238 case WE_GET_RX_PKT_CNT:
5239 {
5240 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5241
5242 if(status != VOS_STATUS_SUCCESS)
5243 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005244 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005245 ret = -EINVAL;
5246 }
5247 break;
5248 }
5249 default:
5250 {
5251 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5252 break;
5253 }
5254 }
5255
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305256 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005257 return ret;
5258}
5259
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305260static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5261 union iwreq_data *wrqu, char *extra)
5262{
5263 int ret;
5264
5265 vos_ssr_protect(__func__);
5266 ret = __iw_ftm_setnone_getint(dev, info, wrqu, extra);
5267 vos_ssr_unprotect(__func__);
5268
5269 return ret;
5270}
5271
5272static int __iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005273 union iwreq_data *wrqu, char *extra)
5274{
5275 int sub_cmd = wrqu->data.flags;
5276 VOS_STATUS status;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305277 hdd_adapter_t *pAdapter;
5278 hdd_context_t *pHddCtx;
5279 int ret = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005280
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305281 ENTER();
5282
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305283 pAdapter = (netdev_priv(dev));
5284 if (NULL == pAdapter)
5285 {
5286 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5287 return -EINVAL;
5288 }
5289 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5290 ret = wlan_hdd_validate_context(pHddCtx);
5291 if (0 != ret)
5292 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305293 return ret;
5294 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005295 switch(sub_cmd)
5296 {
5297 case WE_GET_MAC_ADDRESS:
5298 {
5299 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5300
5301 if(status != VOS_STATUS_SUCCESS)
5302 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005303 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005304 return -EINVAL;
5305 }
5306 wrqu->data.length = strlen(extra)+1;
5307 break;
5308 }
5309 case WE_GET_TX_RATE:
5310 {
5311 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5312
5313 if(status != VOS_STATUS_SUCCESS)
5314 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005315 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005316 return -EINVAL;
5317 }
5318
5319 wrqu->data.length = strlen(extra)+1;
5320 break;
5321 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005322 case WE_GET_FTM_STATUS:
5323 {
5324 status = wlan_ftm_priv_get_status(pAdapter, extra);
5325
5326 if(status != VOS_STATUS_SUCCESS)
5327 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005328 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005329 return -EINVAL;
5330 }
5331
5332 wrqu->data.length = strlen(extra)+1;
5333 break;
5334 }
5335 case WE_GET_RX_RSSI:
5336 {
5337 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5338
5339 if(status != VOS_STATUS_SUCCESS)
5340 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005341 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005342 return -EINVAL;
5343 }
5344
5345 wrqu->data.length = strlen(extra)+1;
5346 break;
5347 }
5348 default:
5349 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005350 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005351 break;
5352 }
5353 }
5354
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305355 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005356 return 0;
5357}
Jeff Johnson295189b2012-06-20 16:38:30 -07005358
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305359static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5360 union iwreq_data *wrqu, char *extra)
5361{
5362 int ret;
5363
5364 vos_ssr_protect(__func__);
5365 ret = __iw_ftm_get_char_setnone(dev, info, wrqu, extra);
5366 vos_ssr_unprotect(__func__);
5367
5368
5369 return ret;
5370}
5371
Jeff Johnson295189b2012-06-20 16:38:30 -07005372VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5373{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005374#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005375 tAniHdr *wmsg = NULL;
5376 v_U8_t *pBuf;
5377 hdd_context_t *pHddCtx = NULL;
5378 v_CONTEXT_t pVosContext= NULL;
5379
5380 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5381 if(pBuf == NULL)
5382 {
5383 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5384 return VOS_STATUS_E_NOMEM;
5385 }
5386 wmsg = (tAniHdr*)pBuf;
5387 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5388 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5389 wmsg->length = FTM_SWAP16(wmsg->length);
5390 pBuf += sizeof(tAniHdr);
5391
5392 /*Get the global context */
5393 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5394
5395 /*Get the Hdd Context */
5396 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5397 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5398
5399 /* EfS command Code */
5400 *(v_U32_t*)pBuf = 0x000000EF;
5401
5402 pBuf += sizeof(v_U32_t);
5403
5404 memcpy(pBuf, pData,data_len);
5405
5406 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305407 if( ptt_sock_send_msg_to_app(wmsg, 0,
5408 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005409
Arif Hussain6d2a3322013-11-17 19:50:10 -08005410 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 -07005411 vos_mem_free((v_VOID_t*)wmsg);
5412 return VOS_STATUS_E_FAILURE;
5413 }
5414 }
5415 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305416 if( ptt_sock_send_msg_to_app(wmsg, 0,
5417 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005418
Arif Hussain6d2a3322013-11-17 19:50:10 -08005419 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 -07005420 vos_mem_free((v_VOID_t*)wmsg);
5421 return VOS_STATUS_E_FAILURE;
5422 }
5423 }
5424
5425 vos_mem_free((v_VOID_t*)wmsg);
5426#endif //FTM and ANDROID
5427
5428 return VOS_STATUS_SUCCESS;
5429}
5430
Jeff Johnson295189b2012-06-20 16:38:30 -07005431/* action sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305432static int __iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005433 union iwreq_data *wrqu, char *extra)
5434{
5435 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005436 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005437
5438 switch (sub_cmd)
5439 {
5440 case WE_SET_NV_DEFAULTS:
5441 {
5442 v_U8_t *pu8buf,*pTempBuf;
5443 v_U16_t size;
5444 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005445 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005446 pu8buf = vos_mem_malloc(size);
5447 if(pu8buf == NULL)
5448 {
5449 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5450 return VOS_STATUS_E_NOMEM;
5451 }
5452 memset(pu8buf,0,size);
5453 pTempBuf = pu8buf;
5454 pTempBuf += sizeof(v_U32_t);
5455 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5456
5457 wlan_write_to_efs(pu8buf,size);
5458 vos_mem_free(pu8buf);
5459 }
5460
5461 default:
5462 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005463 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005464 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5465 break;
5466 }
5467 }
5468
5469 return ret;
5470}
5471
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305472static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5473 union iwreq_data *wrqu, char *extra)
5474{
5475 int ret;
5476
5477 vos_ssr_protect(__func__);
5478 ret = __iw_ftm_setnone_getnone(dev, info, wrqu, extra);
5479 vos_ssr_unprotect(__func__);
5480
5481 return ret;
5482}
5483
5484static int __iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305485 union iwreq_data *wrqu, char *extra)
5486{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305487 hdd_adapter_t *pAdapter;
5488 hdd_context_t *pHddCtx;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305489 int sub_cmd = wrqu->data.flags;
5490 int *value = (int*)wrqu->data.pointer;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305491 int ret = 0;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305492
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305493 ENTER();
5494
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305495 if(wrqu->data.length != 2)
5496 {
5497 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5498 return -EINVAL;
5499 }
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305500 pAdapter = (netdev_priv(dev));
5501 if (NULL == pAdapter)
5502 {
5503 hddLog(VOS_TRACE_LEVEL_ERROR,
5504 "%s: Adapter is NULL",__func__);
5505 return -EINVAL;
5506 }
5507 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5508 ret = wlan_hdd_validate_context(pHddCtx);
5509 if (0 != ret)
5510 {
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305511 return ret;
5512 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305513 switch (sub_cmd)
5514 {
5515 case WE_SET_TX_WF_GAIN:
5516 {
5517 v_S15_t dGain = 0;
5518 v_U16_t rfGain = 0;
5519 VOS_STATUS status;
5520
5521 dGain = *(v_S15_t*) value++;
5522 rfGain = *(v_U16_t*) value;
5523 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5524
5525 if(status != VOS_STATUS_SUCCESS)
5526 {
5527 hddLog(VOS_TRACE_LEVEL_FATAL,
5528 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5529 return -EINVAL;
5530 }
5531 }
5532 break;
5533
5534 default:
5535 {
5536 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5537 break;
5538 }
5539 }
5540
Hanumantha Reddy Pothula7dc0e6c2015-03-06 15:11:16 +05305541 EXIT();
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305542 return 0;
5543}
5544
5545
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305546static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5547 union iwreq_data *wrqu, char *extra)
5548{
5549 int ret;
5550
5551 vos_ssr_protect(__func__);
5552 ret = __iw_ftm_set_var_ints_getnone(dev, info, wrqu, extra);
5553 vos_ssr_unprotect(__func__);
5554
5555 return ret;
5556}
5557
Jeff Johnson295189b2012-06-20 16:38:30 -07005558static const iw_handler we_ftm_private[] = {
5559
5560 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5561 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5562 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5563 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5564 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305565 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005566};
5567
5568/*Maximum command length can be only 15 */
5569static const struct iw_priv_args we_ftm_private_args[] = {
5570
5571 /* handlers for main ioctl */
5572 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5573 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5574 0,
5575 "" },
5576
5577 { WE_FTM_ON_OFF,
5578 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5579 0,
5580 "ftm" },
5581
5582 { WE_TX_PKT_GEN,
5583 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5584 0,
5585 "tx" },
5586
5587 { WE_SET_TX_IFS,
5588 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5589 0,
5590 "set_txifs" },
5591
5592 { WE_SET_TX_PKT_CNT,
5593 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5594 0,
5595 "set_txpktcnt" },
5596
5597 { WE_SET_TX_PKT_LEN,
5598 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5599 0,
5600 "set_txpktlen" },
5601
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305602 { WE_SET_TX_WF_GAIN,
5603 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5604 0,
5605 "set_tx_wf_gain" },
5606
5607 { WE_TX_CW_RF_GEN,
5608 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5609 0,
5610 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005611 { WE_SET_CHANNEL,
5612 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5613 0,
5614 "set_channel" },
5615
5616 { WE_SET_TX_POWER,
5617 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5618 0,
5619 "set_txpower" },
5620
5621 { WE_CLEAR_RX_PKT_CNT,
5622 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5623 0,
5624 "clr_rxpktcnt" },
5625
5626 { WE_RX,
5627 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5628 0,
5629 "rx" },
5630
5631 { WE_ENABLE_CHAIN,
5632 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5633 0,
5634 "ena_chain" },
5635
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305636 { WE_SET_PWR_CNTL_MODE,
5637 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5638 0,
5639 "pwr_cntl_mode" },
5640
5641 { WE_ENABLE_DPD,
5642 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5643 0,
5644 "ena_dpd" },
5645
5646 { WE_SET_CB,
5647 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5648 0,
5649 "set_cb" },
5650
Jeff Johnson295189b2012-06-20 16:38:30 -07005651 /* handlers for main ioctl */
5652 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5653 0,
5654 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5655 "" },
5656
5657 { WE_GET_CHANNEL,
5658 0,
5659 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5660 "get_channel" },
5661
5662 { WE_GET_TX_POWER,
5663 0,
5664 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5665 "get_txpower" },
5666
5667 { WE_GET_RX_PKT_CNT,
5668 0,
5669 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5670 "get_rxpktcnt" },
5671
5672 /* handlers for main ioctl */
5673 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5674 IW_PRIV_TYPE_CHAR| 512,
5675 0,
5676 "" },
5677
5678 { WE_SET_MAC_ADDRESS,
5679 IW_PRIV_TYPE_CHAR| 512,
5680 0,
5681 "set_mac_address" },
5682
5683 { WE_SET_TX_RATE,
5684 IW_PRIV_TYPE_CHAR | 512,
5685 0,
5686 "set_txrate" },
5687
5688 /* handlers for main ioctl */
5689 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5690 0,
5691 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5692 "" },
5693
5694 { WE_GET_MAC_ADDRESS,
5695 0,
5696 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5697 "get_mac_address" },
5698
Jeff Johnson295189b2012-06-20 16:38:30 -07005699 { WE_GET_TX_RATE,
5700 0,
5701 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5702 "get_txrate" },
5703
5704 { WE_GET_FTM_STATUS,
5705 0,
5706 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5707 "get_status" },
5708
5709 { WE_GET_RX_RSSI,
5710 0,
5711 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5712 "get_rx_rssi" },
5713
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305714 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5715 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5716 0,
5717 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005718 /* handlers for main ioctl */
5719 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5720 0,
5721 0,
5722 "" },
5723
5724 /* handlers for sub-ioctl */
5725 { WE_SET_NV_DEFAULTS,
5726 0,
5727 0,
5728 "set_nv_defaults" },
5729
5730};
5731
5732const struct iw_handler_def we_ftm_handler_def = {
5733 .num_standard = 0,
5734 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5735 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5736
5737 .standard = (iw_handler *)NULL,
5738 .private = (iw_handler *)we_ftm_private,
5739 .private_args = we_ftm_private_args,
5740 .get_wireless_stats = NULL,
5741};
5742
5743static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5744{
5745
5746 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5747
5748 // Zero the memory. This zeros the profile structure.
5749 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005750
Jeff Johnson295189b2012-06-20 16:38:30 -07005751 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5752
5753 return 0;
5754}
5755
Jeff Johnson295189b2012-06-20 16:38:30 -07005756
5757VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5758{
Jeff Johnson295189b2012-06-20 16:38:30 -07005759 ftm_rsp_msg_t *pFtmMsgRsp;
5760
5761 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5762 hdd_context_t *pHddCtx;
5763 v_CONTEXT_t pVosContext= NULL;
5764
5765 ENTER();
5766
5767 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5768
5769 if (!message )
5770 {
5771 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5772 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5773 return VOS_STATUS_E_INVAL;
5774 }
5775 /*Get the global context */
5776 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5777
5778 /*Get the Hdd Context */
5779 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5780
5781 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5782
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305783 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005784 complete(&pHddCtx->ftm.ftm_comp_var);
5785 }
5786 else {
5787 /*Response length to Ptt App*/
5788 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5789
5790 /*Ptt App expects the response length in LE */
5791 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5792
5793 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005794 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005795 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5796
5797 /*Copy the message*/
5798 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5799
5800 /*Update the error code*/
5801 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5802
5803 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5804
5805 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5806 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005807 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005808 return VOS_STATUS_E_FAILURE;
5809 }
5810 }
5811 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005812 return VOS_STATUS_SUCCESS;
5813
5814}