blob: 2f730f0e22d1310f94af547e84f04cf42b13b726 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam842dad02014-02-18 18:44:02 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
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;
1539
1540 return VOS_STATUS_SUCCESS;
1541
1542err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001543#ifdef WLAN_KD_READY_NOTIFIER
1544nl_srv_exit(pHddCtx->ptt_pid);
1545#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001546nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001547#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001548err_ftm_register_wext_close:
1549hdd_UnregisterWext(pAdapter->dev);
1550
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301551err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001552err_adapter_open_failure:
1553hdd_close_all_adapters( pHddCtx );
1554
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301555err_ftm_vos_close:
1556 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001557err_vos_status_failure:
1558
1559 return VOS_STATUS_E_FAILURE;
1560}
1561
1562
1563
1564int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1565{
1566 VOS_STATUS vosStatus;
1567 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1568
1569 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1570 ENTER();
1571 if(pAdapter == NULL)
1572 {
1573 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1574 return VOS_STATUS_E_NOMEM;
1575 }
1576
Atul Mittalc41126d2014-03-17 15:10:11 +05301577 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1578 if (pHddCtx->ftm.IsCmdPending == TRUE)
1579 {
1580 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1581 {
1582 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1583 "%s: vos_event_set failed", __func__);
1584 }
1585 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001586 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1587 {
1588 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1589 "%s: Ftm has been started. stopping ftm", __func__);
1590 wlan_ftm_stop(pHddCtx);
1591 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001592
Leo Chang59cdc7e2013-07-10 10:08:21 -07001593#ifdef WLAN_KD_READY_NOTIFIER
1594 nl_srv_exit(pHddCtx->ptt_pid);
1595#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001596 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001597#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001598 //TODO----------
1599 //Deregister the device with the kernel
1600 hdd_UnregisterWext(pAdapter->dev);
1601
1602 hdd_close_all_adapters( pHddCtx );
1603#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001604 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001605 {
1606 unregister_netdev(pAdapter->dev);
1607 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1608 }
1609#endif
1610 //-----------------
1611
1612 vosStatus = vos_sched_close( vosContext );
1613 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1614 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1615 "%s: Failed to close VOSS Scheduler",__func__);
1616 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1617 }
1618
1619 //Close VOSS
1620 wlan_ftm_vos_close(vosContext);
1621
1622
1623 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1624 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1625 {
1626 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1627 "%s: Failed to destroy ftm_vos Event",__func__);
1628 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1629 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001630 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001631
Jeff Johnson295189b2012-06-20 16:38:30 -07001632 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001633}
1634
1635/**---------------------------------------------------------------------------
1636
1637 \brief wlan_ftm_send_response() -
1638
1639 The function sends the response to the ptt socket application running in user space.
1640
1641 \param - pAdapter - Pointer HDD Context.
1642
1643 \return - 0 for success, non zero for failure
1644
1645 --------------------------------------------------------------------------*/
1646
1647static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1648
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301649 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1650 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001651
Arif Hussain6d2a3322013-11-17 19:50:10 -08001652 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 -07001653 return VOS_STATUS_E_FAILURE;
1654 }
1655 return VOS_STATUS_SUCCESS;
1656}
1657
1658/**---------------------------------------------------------------------------
1659
1660 \brief wlan_hdd_ftm_start() -
1661
1662 This function gets called when the FTM start commands received from the ptt socket application and
1663 it starts the following modules.
1664 1) SAL Start.
1665 2) BAL Start.
1666 3) MAC Start to download the firmware.
1667
1668
1669 \param - pAdapter - Pointer HDD Context.
1670
1671 \return - 0 for success, non zero for failure
1672
1673 --------------------------------------------------------------------------*/
1674
1675static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1676{
1677 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1678 tSirRetStatus sirStatus = eSIR_SUCCESS;
1679 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1680 tHalMacStartParameters halStartParams;
1681
1682 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1683 {
1684 return VOS_STATUS_SUCCESS;
1685 }
1686
1687 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1688 "%s: Starting Libra SW", __func__);
1689
1690 /* We support only one instance for now ...*/
1691 if (pVosContext == NULL)
1692 {
1693 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001694 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001695 goto err_status_failure;
1696 }
1697
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001698
Jeff Johnson295189b2012-06-20 16:38:30 -07001699 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001700 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001701 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001702 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001703 goto err_status_failure;
1704 }
1705
Jeff Johnson295189b2012-06-20 16:38:30 -07001706 /*
1707 Prima needs to start the WDA correctly instead of BAL and SAL
1708 */
1709
1710 /* Vos preStart is calling */
1711 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1712 {
1713 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1714 goto err_status_failure;
1715 }
1716
1717
1718 vStatus = WDA_NVDownload_Start(pVosContext);
1719
1720 if ( vStatus != VOS_STATUS_SUCCESS )
1721 {
1722 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1723 "%s: Failed to start NV Download",__func__);
1724 return VOS_STATUS_E_FAILURE;
1725 }
1726
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301727 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001728
1729 if ( vStatus != VOS_STATUS_SUCCESS )
1730 {
1731 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1732 {
1733 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001734 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001735 }
1736 else
1737 {
1738 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001739 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001740 }
1741 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301742 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001743 }
1744
1745 vStatus = WDA_start(pVosContext);
1746 if (vStatus != VOS_STATUS_SUCCESS)
1747 {
1748 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1749 "%s: Failed to start WDA",__func__);
1750 goto err_status_failure;
1751 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001752
Jeff Johnson295189b2012-06-20 16:38:30 -07001753
1754 /* Start the MAC */
1755 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1756
Jeff Johnson295189b2012-06-20 16:38:30 -07001757
1758 halStartParams.driverType = eDRIVER_TYPE_MFG;
1759
1760 /* Start the MAC */
1761 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1762
Jeff Johnson295189b2012-06-20 16:38:30 -07001763
1764 if (eSIR_SUCCESS != sirStatus)
1765 {
1766 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1767 "%s: Failed to start MAC", __func__);
1768
Jeff Johnson295189b2012-06-20 16:38:30 -07001769 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001770 }
1771
1772 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1773 "%s: MAC correctly started",__func__);
1774
Jeff Johnson295189b2012-06-20 16:38:30 -07001775
1776 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1777
1778 return VOS_STATUS_SUCCESS;
1779
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001780err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001781 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1782 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1783 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1784 if(vStatus != VOS_STATUS_SUCCESS)
1785 {
1786 if(vStatus == VOS_STATUS_E_TIMEOUT)
1787 {
1788 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001789 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001790
1791 }
1792 else
1793 {
1794 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001795 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001796 }
1797 VOS_ASSERT(0);
1798 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001799
1800err_status_failure:
1801
1802 return VOS_STATUS_E_FAILURE;
1803
1804}
1805
1806
1807static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1808{
1809 VOS_STATUS vosStatus;
1810
1811 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1812 {
1813 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1814 return VOS_STATUS_E_FAILURE;
1815 }
1816
1817 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1818 {
1819 /* STOP MAC only */
1820 v_VOID_t *hHal;
1821 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1822 if (NULL == hHal)
1823 {
1824 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1825 "%s: NULL hHal", __func__);
1826 }
1827 else
1828 {
1829 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1830 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1831 {
1832 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1833 "%s: Failed to stop SYS", __func__);
1834 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1835 }
1836 }
1837
Jeff Johnson295189b2012-06-20 16:38:30 -07001838
Jeff Johnson295189b2012-06-20 16:38:30 -07001839 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001840
1841 }
1842 return WLAN_FTM_SUCCESS;
1843}
1844
Jeff Johnson295189b2012-06-20 16:38:30 -07001845/**---------------------------------------------------------------------------
1846
1847 \brief wlan_hdd_ftm_get_nv_table() -
1848 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001849 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001850
1851 \param - ftmCmd - Pointer FTM Commad Buffer
1852
1853 \return - int
1854 -1, Process Host command fail, vail out
1855 1, Process Host command success
1856
1857 --------------------------------------------------------------------------*/
1858int wlan_hdd_ftm_get_nv_table
1859(
1860 hdd_context_t *pHddCtx,
1861 tPttMsgbuffer *ftmCmd
1862)
1863{
1864 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1865 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1866 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001867 sHalNvV2 *nvContents = NULL;
1868 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001869
Jeff Johnson295189b2012-06-20 16:38:30 -07001870 if (NULL == pHddCtx)
1871 {
1872 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1873 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001874 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001875 }
1876
Leo Chang80de3c22013-11-26 10:52:12 -08001877 nvVersion = vos_nv_getNvVersion();
1878 if (E_NV_V2 != nvVersion)
1879 {
1880 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1881 "%s : Not valid NV Version %d", __func__, nvVersion);
1882 return -EINVAL;
1883 }
1884
Jeff Johnson295189b2012-06-20 16:38:30 -07001885 /* Test first chunk of NV table */
1886 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1887 (0 == pHddCtx->ftm.processedNVTableSize))
1888 {
1889 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1890 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1891 {
c_hpothuffdb5272013-10-02 16:42:35 +05301892 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1893 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001894 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001895 }
1896
1897 switch (nvTable->nvTable)
1898 {
1899 case NV_TABLE_RATE_POWER_SETTINGS:
1900 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1901 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1902 break;
1903
1904 case NV_TABLE_REGULATORY_DOMAINS:
1905 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1906 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1907 break;
1908
1909 case NV_TABLE_DEFAULT_COUNTRY:
1910 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1911 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1912 break;
1913
1914 case NV_TABLE_TPC_POWER_TABLE:
1915 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1916 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1917 break;
1918
1919 case NV_TABLE_TPC_PDADC_OFFSETS:
1920 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1921 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1922 break;
1923
1924 case NV_TABLE_VIRTUAL_RATE:
1925 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1926 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1927 break;
1928
1929 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1930 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1931 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1932 break;
1933
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001934 case NV_TABLE_HW_CAL_VALUES:
1935 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1936 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1937 break;
1938
1939 case NV_TABLE_FW_CONFIG:
1940 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1941 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001942 break;
1943
1944 case NV_TABLE_ANTENNA_PATH_LOSS:
1945 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1946 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1947 break;
1948
1949 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1950 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1951 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1952 break;
1953
1954 default:
1955 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1956 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001957 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001958 break;
1959 }
1960
1961 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1962 {
1963 /* Invalid table size, discard and initialize data */
1964 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001965 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001966 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001967 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001968 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1969 pHddCtx->ftm.targetNVTableSize = 0;
1970 pHddCtx->ftm.processedNVTableSize = 0;
1971 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001972 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001973 }
1974
1975 /* Set Current Processing NV table type */
1976 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1977 /* Copy target NV table value into temp context buffer */
1978 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1979 pHddCtx->ftm.targetNVTablePointer,
1980 pHddCtx->ftm.targetNVTableSize);
1981
1982 }
1983
1984 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1985 {
1986 /* Invalid table type */
1987 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1988 "Invalid NV Table, now Processing %d, not %d",
1989 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1990 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1991 pHddCtx->ftm.targetNVTableSize = 0;
1992 pHddCtx->ftm.processedNVTableSize = 0;
1993 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001994
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001995 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001996 }
1997
1998 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001999 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002000 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2001 nvTable->chunkSize);
2002 /* Update processed pointer to prepare next chunk copy */
2003 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2004
2005 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2006 {
2007 /* Finished to process last chunk of data, initialize buffer */
2008 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2009 pHddCtx->ftm.targetNVTableSize = 0;
2010 pHddCtx->ftm.processedNVTableSize = 0;
2011 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2012 }
2013
2014 return 1;
2015}
2016
2017/**---------------------------------------------------------------------------
2018
2019 \brief wlan_hdd_ftm_set_nv_table() -
2020 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002021 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002022
2023 \param - ftmCmd - Pointer FTM Commad Buffer
2024
2025 \return - int
2026 -1, Process Host command fail, vail out
2027 1, Process Host command success
2028
2029 --------------------------------------------------------------------------*/
2030int wlan_hdd_ftm_set_nv_table
2031(
2032 hdd_context_t *pHddCtx,
2033 tPttMsgbuffer *ftmCmd
2034)
2035{
2036 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2037 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2038 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002039 sHalNvV2 *nvContents = NULL;
2040 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002041
2042 if (NULL == pHddCtx)
2043 {
2044 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2045 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002046 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002047 }
2048
Leo Chang80de3c22013-11-26 10:52:12 -08002049 nvVersion = vos_nv_getNvVersion();
2050 if (E_NV_V2 != nvVersion)
2051 {
2052 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2053 "%s : Not valid NV Version %d", __func__, nvVersion);
2054 return -EINVAL;
2055 }
2056
Jeff Johnson295189b2012-06-20 16:38:30 -07002057 /* Test first chunk of NV table */
2058 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2059 (0 == pHddCtx->ftm.processedNVTableSize))
2060 {
2061 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2062 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2063 {
c_hpothuffdb5272013-10-02 16:42:35 +05302064 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2065 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002066 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002067 }
2068
2069 switch (nvTable->nvTable)
2070 {
2071 case NV_TABLE_RATE_POWER_SETTINGS:
2072 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2073 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2074 break;
2075
2076 case NV_TABLE_REGULATORY_DOMAINS:
2077 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2078 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2079 break;
2080
2081 case NV_TABLE_DEFAULT_COUNTRY:
2082 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2083 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2084 break;
2085
2086 case NV_TABLE_TPC_POWER_TABLE:
2087 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2088 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2089 break;
2090
2091 case NV_TABLE_TPC_PDADC_OFFSETS:
2092 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2093 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2094 break;
2095
2096 case NV_TABLE_VIRTUAL_RATE:
2097 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2098 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2099 break;
2100
2101 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2102 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2103 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2104 break;
2105
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002106 case NV_TABLE_HW_CAL_VALUES:
2107 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2108 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2109 break;
2110
2111 case NV_TABLE_FW_CONFIG:
2112 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2113 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002114 break;
2115
2116 case NV_TABLE_ANTENNA_PATH_LOSS:
2117 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2118 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2119 break;
2120
2121 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2122 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2123 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2124 break;
2125
2126 default:
2127 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2128 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002129 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002130 break;
2131 }
2132
2133 /* Set Current Processing NV table type */
2134 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2135 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2136 {
2137 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2138 "Invalid Table Size %d", nvTable->tableSize);
2139 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2140 pHddCtx->ftm.targetNVTableSize = 0;
2141 pHddCtx->ftm.processedNVTableSize = 0;
2142 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002143 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002144 }
2145 }
2146
2147 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2148 {
2149 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2150 "Invalid NV Table, now Processing %d, not %d",
2151 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2152 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2153 pHddCtx->ftm.targetNVTableSize = 0;
2154 pHddCtx->ftm.processedNVTableSize = 0;
2155 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002156 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002157 }
2158 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002159 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002160 nvTable->chunkSize);
2161
2162 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2163 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2164 {
2165 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2166 pHddCtx->ftm.tempNVTableBuffer,
2167 pHddCtx->ftm.targetNVTableSize);
2168 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2169 pHddCtx->ftm.targetNVTableSize = 0;
2170 pHddCtx->ftm.processedNVTableSize = 0;
2171 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2172 }
2173
2174 return 1;
2175}
2176
2177/**---------------------------------------------------------------------------
2178
2179 \brief wlan_hdd_ftm_blank_nv() -
2180 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002181 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002182
2183 \param - ftmCmd - Pointer FTM Commad Buffer
2184
2185 \return - int
2186 -1, Process Host command fail, vail out
2187 0, Process Host command success
2188
2189 --------------------------------------------------------------------------*/
2190int wlan_hdd_ftm_blank_nv_table
2191(
2192 tPttMsgbuffer *ftmCmd
2193)
2194{
Leo Chang80de3c22013-11-26 10:52:12 -08002195 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002196 v_SIZE_t nvSize;
2197 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002198 sHalNvV2 *nvContents = NULL;
2199 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002200
2201 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2202 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2203 {
c_hpothuffdb5272013-10-02 16:42:35 +05302204 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2205 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002206 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002207 }
2208
Leo Chang80de3c22013-11-26 10:52:12 -08002209 nvVersion = vos_nv_getNvVersion();
2210 if (E_NV_V2 != nvVersion)
2211 {
2212 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2213 "%s : Not valid NV Version %d", __func__, nvVersion);
2214 return -EINVAL;
2215 }
2216
Jeff Johnson295189b2012-06-20 16:38:30 -07002217 itemSize = sizeof(nvContents->tables.pwrOptimum);
2218 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002219 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002220 itemSize);
2221
2222 itemSize = sizeof(nvContents->tables.regDomains);
2223 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002224 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002225 itemSize);
2226
2227 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2228 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002229 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002230 itemSize);
2231
2232 itemSize = sizeof(nvContents->tables.plutCharacterized);
2233 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002234 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002235 itemSize);
2236
2237 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2238 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002239 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 itemSize);
2241
2242 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2243 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002244 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002245 itemSize);
2246
2247 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2248 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002249 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002250 itemSize);
2251
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002252 itemSize = sizeof(nvContents->tables.hwCalValues);
2253 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002254 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002255 itemSize);
2256
2257 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2258 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002259 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002260 itemSize);
2261
2262 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2263 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002264 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002265 itemSize);
2266
2267 return 1;
2268}
2269
2270/**---------------------------------------------------------------------------
2271
2272 \brief wlan_hdd_ftm_delete_nv_table() -
2273 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002274 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002275
2276 \param - ftmCmd - Pointer FTM Commad Buffer
2277
2278 \return - int
2279 -1, Process Host command fail, vail out
2280 1, Process Host command success
2281
2282 --------------------------------------------------------------------------*/
2283int wlan_hdd_ftm_delete_nv_table
2284(
2285 tPttMsgbuffer *ftmCmd
2286)
2287{
Leo Chang80de3c22013-11-26 10:52:12 -08002288 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002289 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2290 v_SIZE_t nvSize;
2291 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002292 sHalNvV2 *nvContents = NULL;
2293 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002294
2295 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2296 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2297 {
c_hpothuffdb5272013-10-02 16:42:35 +05302298 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2299 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002300 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002301 }
2302
Leo Chang80de3c22013-11-26 10:52:12 -08002303 nvVersion = vos_nv_getNvVersion();
2304 if (E_NV_V2 != nvVersion)
2305 {
2306 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2307 "%s : Not valid NV Version %d", __func__, nvVersion);
2308 return -EINVAL;
2309 }
2310
Jeff Johnson295189b2012-06-20 16:38:30 -07002311 switch (nvTable->nvTable)
2312 {
2313 case NV_TABLE_RATE_POWER_SETTINGS:
2314 itemSize = sizeof(nvContents->tables.pwrOptimum);
2315 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002316 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002317 itemSize);
2318 break;
2319
2320 case NV_TABLE_REGULATORY_DOMAINS:
2321 itemSize = sizeof(nvContents->tables.regDomains);
2322 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002323 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002324 itemSize);
2325 break;
2326
2327 case NV_TABLE_DEFAULT_COUNTRY:
2328 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2329 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002330 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002331 itemSize);
2332 break;
2333
2334 case NV_TABLE_TPC_POWER_TABLE:
2335 itemSize = sizeof(nvContents->tables.plutCharacterized);
2336 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002337 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002338 itemSize);
2339 break;
2340
2341 case NV_TABLE_TPC_PDADC_OFFSETS:
2342 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2343 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002344 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002345 itemSize);
2346 break;
2347
2348 case NV_TABLE_VIRTUAL_RATE:
2349 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2350 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002351 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002352 itemSize);
2353 break;
2354
2355 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2356 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2357 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002358 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002359 itemSize);
2360 break;
2361
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002362 case NV_TABLE_HW_CAL_VALUES:
2363 itemSize = sizeof(nvContents->tables.hwCalValues);
2364 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002365 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002366 itemSize);
2367 break;
2368
2369 case NV_TABLE_FW_CONFIG:
2370 itemSize = sizeof(nvContents->tables.fwConfig);
2371 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002372 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002373 itemSize);
2374 break;
2375
2376 case NV_TABLE_ANTENNA_PATH_LOSS:
2377 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2378 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002379 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002380 itemSize);
2381 break;
2382
2383 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2384 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2385 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002386 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002387 itemSize);
2388 break;
2389
2390 default:
2391 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2392 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002393 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002394 break;
2395 }
2396
2397 return 1;
2398}
2399
2400/**---------------------------------------------------------------------------
2401
2402 \brief wlan_hdd_ftm_get_nv_field() -
2403 Get Specific NV field
2404
2405 \param - ftmCmd - Pointer FTM Commad Buffer
2406
2407 \return - int
2408 -1, Process Host command fail, vail out
2409 1, Process Host command success
2410
2411 --------------------------------------------------------------------------*/
2412int wlan_hdd_ftm_get_nv_field
2413(
2414 tPttMsgbuffer *ftmCmd
2415)
2416{
2417 sNvFields nvFieldDataBuffer;
2418 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2419 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2420 sHalNv *nvContents = NULL;
2421 v_SIZE_t nvSize;
2422
2423 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2424 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2425 {
c_hpothuffdb5272013-10-02 16:42:35 +05302426 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2427 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002428 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002429 }
2430 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2431
2432 switch (nvField->nvField)
2433 {
2434 case NV_COMMON_PRODUCT_ID:
2435 memcpy((void *)&nvField->fieldData,
2436 &nvFieldDataBuffer.productId,
2437 sizeof(nvFieldDataBuffer.productId));
2438 break;
2439
2440 case NV_COMMON_PRODUCT_BANDS:
2441 memcpy((void *)&nvField->fieldData,
2442 &nvFieldDataBuffer.productBands,
2443 sizeof(nvFieldDataBuffer.productBands));
2444 break;
2445
2446 case NV_COMMON_NUM_OF_TX_CHAINS:
2447 memcpy((void *)&nvField->fieldData,
2448 &nvFieldDataBuffer.numOfTxChains,
2449 sizeof(nvFieldDataBuffer.numOfTxChains));
2450 break;
2451
2452 case NV_COMMON_NUM_OF_RX_CHAINS:
2453 memcpy((void *)&nvField->fieldData,
2454 &nvFieldDataBuffer.numOfRxChains,
2455 sizeof(nvFieldDataBuffer.numOfRxChains));
2456 break;
2457
2458 case NV_COMMON_MAC_ADDR:
2459 memcpy((void *)&nvField->fieldData,
2460 &nvFieldDataBuffer.macAddr[0],
2461 NV_FIELD_MAC_ADDR_SIZE);
2462 break;
2463
2464 case NV_COMMON_MFG_SERIAL_NUMBER:
2465 memcpy((void *)&nvField->fieldData,
2466 &nvFieldDataBuffer.mfgSN[0],
2467 NV_FIELD_MFG_SN_SIZE);
2468 break;
2469
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002470 case NV_COMMON_WLAN_NV_REV_ID:
2471 memcpy((void *)&nvField->fieldData,
2472 &nvFieldDataBuffer.wlanNvRevId,
2473 sizeof(nvFieldDataBuffer.wlanNvRevId));
2474 break;
2475
Jeff Johnson295189b2012-06-20 16:38:30 -07002476 case NV_COMMON_COUPLER_TYPE:
2477 memcpy((void *)&nvField->fieldData,
2478 &nvFieldDataBuffer.couplerType,
2479 sizeof(nvFieldDataBuffer.couplerType));
2480 break;
2481
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002482 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002483 {
2484 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2485 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2486
2487 nvEmbededStatus = vos_nv_isEmbeddedNV();
2488
2489 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2490 {
2491 // High bit is set to indicate embedded NV..
2492 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2493 }
2494
2495 memcpy((void *)&nvField->fieldData,
2496 &nvVersion,
2497 sizeof(nvFieldDataBuffer.nvVersion));
2498 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002499 break;
2500
Jeff Johnson295189b2012-06-20 16:38:30 -07002501 default:
2502 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2503 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002504 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002505 break;
2506 }
2507
2508 return 1;
2509}
2510
2511/**---------------------------------------------------------------------------
2512
2513 \brief wlan_hdd_ftm_set_nv_field() -
2514 Set Specific NV field
2515
2516 \param - ftmCmd - Pointer FTM Commad Buffer
2517
2518 \return - int
2519 -1, Process Host command fail, vail out
2520 1, Process Host command success
2521
2522 --------------------------------------------------------------------------*/
2523int wlan_hdd_ftm_set_nv_field
2524(
2525 tPttMsgbuffer *ftmCmd
2526)
2527{
2528 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2529 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2530 v_SIZE_t nvSize;
2531 sHalNv *nvContents = NULL;
2532 v_U8_t macLoop;
2533 v_U8_t *pNVMac;
2534 v_U8_t lastByteMAC;
2535
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002536
Jeff Johnson295189b2012-06-20 16:38:30 -07002537 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2538 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2539 {
c_hpothuffdb5272013-10-02 16:42:35 +05302540 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2541 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002542 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002543 }
2544
2545 switch (nvField->nvField)
2546 {
2547 case NV_COMMON_PRODUCT_ID:
2548 memcpy(&nvContents->fields.productId,
2549 &nvField->fieldData,
2550 sizeof(nvContents->fields.productId));
2551 break;
2552
2553 case NV_COMMON_PRODUCT_BANDS:
2554 memcpy(&nvContents->fields.productBands,
2555 &nvField->fieldData,
2556 sizeof(nvContents->fields.productBands));
2557 break;
2558
2559 case NV_COMMON_NUM_OF_TX_CHAINS:
2560 memcpy(&nvContents->fields.numOfTxChains,
2561 &nvField->fieldData,
2562 sizeof(nvContents->fields.numOfTxChains));
2563 break;
2564
2565 case NV_COMMON_NUM_OF_RX_CHAINS:
2566 memcpy(&nvContents->fields.numOfRxChains,
2567 &nvField->fieldData,
2568 sizeof(nvContents->fields.numOfRxChains));
2569 break;
2570
2571 case NV_COMMON_MAC_ADDR:
2572 /* If Last byte is larger than 252 (0xFC), return Error,
2573 * Since 3MACs should be derived from first MAC */
2574 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002575 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002576 {
2577 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2578 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002579 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002580 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002581 }
2582
2583 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002584 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002585 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2586 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002587 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002588 lastByteMAC + macLoop;
2589 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002590 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002591 NV_FIELD_MAC_ADDR_SIZE);
2592 }
2593 break;
2594
2595 case NV_COMMON_MFG_SERIAL_NUMBER:
2596 memcpy(&nvContents->fields.mfgSN[0],
2597 &nvField->fieldData,
2598 NV_FIELD_MFG_SN_SIZE);
2599 break;
2600
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002601 case NV_COMMON_WLAN_NV_REV_ID:
2602 memcpy(&nvContents->fields.wlanNvRevId,
2603 &nvField->fieldData,
2604 sizeof(nvContents->fields.wlanNvRevId));
2605 break;
2606
Jeff Johnson295189b2012-06-20 16:38:30 -07002607 case NV_COMMON_COUPLER_TYPE:
2608 memcpy(&nvContents->fields.couplerType,
2609 &nvField->fieldData,
2610 sizeof(nvContents->fields.couplerType));
2611 break;
2612
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002613 case NV_COMMON_NV_VERSION:
2614 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2615 "Cannot modify NV version field %d", nvField->nvField);
2616 return -EIO;
2617 break;
2618
Jeff Johnson295189b2012-06-20 16:38:30 -07002619 default:
2620 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2621 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002622 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002623 break;
2624 }
2625
2626 return 1;
2627}
2628
2629/**---------------------------------------------------------------------------
2630
2631 \brief wlan_hdd_ftm_store_nv_table() -
2632 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002633 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002634
2635 \param - ftmCmd - Pointer FTM Commad Buffer
2636
2637 \return - int
2638 -1, Process Host command fail, vail out
2639 0, Process Host command success
2640
2641 --------------------------------------------------------------------------*/
2642int wlan_hdd_ftm_store_nv_table
2643(
2644 tPttMsgbuffer *ftmCmd
2645)
2646{
2647 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2648 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002649 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2650 void *tablePtr = NULL;
2651 unsigned int tableSize = 0;
2652 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002653 sHalNvV2 *nvContents = NULL;
2654 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002655
2656 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2657 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2658 {
c_hpothuffdb5272013-10-02 16:42:35 +05302659 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2660 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002661 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002662 }
2663
Leo Chang80de3c22013-11-26 10:52:12 -08002664 nvVersion = vos_nv_getNvVersion();
2665 if (E_NV_V2 != nvVersion)
2666 {
2667 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2668 "%s : Not valid NV Version %d", __func__, nvVersion);
2669 return -EINVAL;
2670 }
2671
Jeff Johnson295189b2012-06-20 16:38:30 -07002672 /* Set Platform type as PRIMA */
2673 nvContents->fields.wlanNvRevId = 2;
2674
2675 switch(nvTable->nvTable)
2676 {
2677 case NV_FIELDS_IMAGE:
2678 tablePtr = (void *)&nvContents->fields;
2679 tableSize = sizeof(nvContents->fields);
2680 tableVNVType = VNV_FIELD_IMAGE;
2681 break;
2682
2683 case NV_TABLE_RATE_POWER_SETTINGS:
2684 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2685 tableSize = sizeof(nvContents->tables.pwrOptimum);
2686 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2687 break;
2688
2689 case NV_TABLE_REGULATORY_DOMAINS:
2690 tablePtr = (void *)&nvContents->tables.regDomains[0];
2691 tableSize = sizeof(nvContents->tables.regDomains);
2692 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2693 break;
2694
2695 case NV_TABLE_DEFAULT_COUNTRY:
2696 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2697 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2698 tableVNVType = VNV_DEFAULT_LOCATION;
2699 break;
2700
2701 case NV_TABLE_TPC_POWER_TABLE:
2702 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2703 tableSize = sizeof(nvContents->tables.plutCharacterized);
2704 tableVNVType = VNV_TPC_POWER_TABLE;
2705 break;
2706
2707 case NV_TABLE_TPC_PDADC_OFFSETS:
2708 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2709 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2710 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2711 break;
2712
2713 case NV_TABLE_VIRTUAL_RATE:
2714 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2715 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2716 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2717 break;
2718
2719 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2720 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2721 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2722 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2723 break;
2724
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002725 case NV_TABLE_HW_CAL_VALUES:
2726 tablePtr = (void *)&nvContents->tables.hwCalValues;
2727 tableSize = sizeof(nvContents->tables.hwCalValues);
2728 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002729 break;
2730
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002731 case NV_TABLE_FW_CONFIG:
2732 tablePtr = (void *)&nvContents->tables.fwConfig;
2733 tableSize = sizeof(nvContents->tables.fwConfig);
2734 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002735 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002736
Jeff Johnson295189b2012-06-20 16:38:30 -07002737 case NV_TABLE_ANTENNA_PATH_LOSS:
2738 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2739 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2740 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2741 break;
2742
2743 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2744 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2745 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2746 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2747 break;
2748
2749 default:
2750 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2751 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002752 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002753 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002754
Jeff Johnson295189b2012-06-20 16:38:30 -07002755 }
2756
2757 nvStatus = vos_nv_write(tableVNVType,
2758 tablePtr,
2759 tableSize);
2760 if(VOS_STATUS_SUCCESS != nvStatus)
2761 {
c_hpothuffdb5272013-10-02 16:42:35 +05302762 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2763 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002764 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002765 }
2766
2767 return 1;
2768}
2769
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002770/* --------------------------------------------------------------------------
2771 \brief wlan_hdd_ftm_get_nv_bin() -
2772 Get NV bin read from Flash Memory, file
2773
2774 \param - ftmCmd - Pointer FTM Commad Buffer
2775
2776 \return - int
2777 -1, Process Host command fail, vail out
2778 0, Process Host command success
2779--------------------------------------------------------------------------*/
2780
2781static int wlan_hdd_ftm_get_nv_bin
2782(
2783 v_U16_t msgId,
2784 hdd_context_t *pHddCtx,
2785 tPttMsgbuffer *ftmCmd
2786)
2787{
2788 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2789 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2790 v_SIZE_t nvSize;
2791 v_U8_t *nvContents;
2792 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002793 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002794
Leo Chang80de3c22013-11-26 10:52:12 -08002795 nvVersion = vos_nv_getNvVersion();
2796 if (E_NV_V3 != nvVersion)
2797 {
2798 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2799 "%s : Not valid NV Version %d", __func__, nvVersion);
2800 return -EINVAL;
2801 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002802
2803 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2804 (0 == pHddCtx->ftm.processedNVTableSize))
2805 {
2806 if ( msgId == PTT_MSG_GET_NV_BIN )
2807 {
2808 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2809 }
2810 else
2811 {
2812 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2813 }
2814
2815 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2816 {
c_hpothuffdb5272013-10-02 16:42:35 +05302817 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2818 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002819 return -EIO;
2820 }
2821
2822 switch (nvTable->nvTable)
2823 {
2824 case NV_BINARY_IMAGE:
2825 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2826 break;
2827 default:
2828 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2829 "Not Valid NV Table %d", nvTable->nvTable);
2830 return -EIO;
2831 break;
2832 }
2833
2834 /* Set Current Processing NV table type */
2835 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2836 if ( msgId == PTT_MSG_GET_NV_BIN )
2837 {
2838 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2839 /* Validity Period */
2840 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2841 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2842 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2843 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2844 offset = sizeof(v_U32_t);
2845 }
2846 else
2847 {
2848 pHddCtx->ftm.targetNVTableSize = nvSize;
2849 offset = 0;
2850 }
2851
2852 /* Copy target NV table value into temp context buffer */
2853 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2854 pHddCtx->ftm.targetNVTablePointer,
2855 pHddCtx->ftm.targetNVTableSize);
2856 }
2857
2858
2859 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2860 {
2861 /* Invalid table type */
2862 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2863 "Invalid NV Table, now Processing %d, not %d",
2864 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2865
2866 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2867 pHddCtx->ftm.targetNVTableSize = 0;
2868 pHddCtx->ftm.processedNVTableSize = 0;
2869 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2870
2871 return -EINVAL;
2872 }
2873
2874 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2875
2876 /* Update processed pointer to prepare next chunk copy */
2877 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2878 pHddCtx->ftm.targetNVTableSize )
2879 {
2880 nvTable->chunkSize =
2881 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2882 }
2883
2884 /* Copy next chunk of NV table value into response buffer */
2885 vos_mem_copy(
2886 &nvTable->tableData,
2887 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2888 nvTable->chunkSize);
2889
2890 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2891
2892 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2893 {
2894 /* Finished to process last chunk of data, initialize buffer */
2895 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2896 pHddCtx->ftm.targetNVTableSize = 0;
2897 pHddCtx->ftm.processedNVTableSize = 0;
2898 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2899 }
2900
2901 return 1;
2902}
2903
2904/**---------------------------------------------------------------------------
2905
2906 \brief wlan_hdd_ftm_set_nv_bin() -
2907 Set NV bin to Flash Memory, file
2908
2909 \param - ftmCmd - Pointer FTM Commad Buffer
2910
2911 \return - int
2912 -1, Process Host command fail, vail out
2913 0, Process Host command success
2914
2915+----------------------------------------------------------------------------*/
2916
2917static int wlan_hdd_ftm_set_nv_bin
2918(
2919 hdd_context_t *pHddCtx,
2920 tPttMsgbuffer *ftmCmd
2921)
2922{
2923 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2924 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002925 eNvVersionType nvVersion;
2926
2927 nvVersion = vos_nv_getNvVersion();
2928 if (E_NV_V3 != nvVersion)
2929 {
2930 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2931 "%s : Not valid NV Version %d", __func__, nvVersion);
2932 return -EINVAL;
2933 }
2934
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002935
2936 /* Test first chunk of NV table */
2937 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2938 (0 == pHddCtx->ftm.processedNVTableSize))
2939 {
2940 switch (nvTable->nvTable)
2941 {
2942 case NV_BINARY_IMAGE:
2943 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2944 break;
2945 default:
2946 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2947 "Not Valid NV Table %d", nvTable->nvTable);
2948 return -EIO;
2949 break;
2950 }
2951
2952 /* Set Current Processing NV table type */
2953 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2954 pHddCtx->ftm.processedNVTableSize = 0;
2955
2956 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2957 {
2958 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2959 "Invalid Table Size %d", nvTable->tableSize);
2960 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2961 pHddCtx->ftm.targetNVTableSize = 0;
2962 pHddCtx->ftm.processedNVTableSize = 0;
2963 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2964 return -EINVAL;
2965 }
2966 }
2967
2968 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2969 {
2970 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2971 "Invalid NV Table, now Processing %d, not %d",
2972 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2973 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2974 pHddCtx->ftm.targetNVTableSize = 0;
2975 pHddCtx->ftm.processedNVTableSize = 0;
2976 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2977 return -EINVAL;
2978 }
2979
2980 vos_mem_copy(
2981 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2982 &nvTable->tableData,
2983 nvTable->chunkSize);
2984
2985 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2986
2987 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2988 {
2989 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2990 "Processing Done!! write encoded Buffer %d",
2991 pHddCtx->ftm.targetNVTableSize);
2992
2993 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2994 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2995
2996 if ((VOS_STATUS_SUCCESS != nvStatus))
2997 {
2998 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2999 "Fail to set NV Binary %d", nvStatus);
3000 return -EIO;
3001 }
3002
3003 nvStatus = vos_nv_setNVEncodedBuffer(
3004 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3005 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3006
3007 if ((VOS_STATUS_SUCCESS != nvStatus))
3008 {
3009 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3010 "Fail to set NV Binary %d", nvStatus);
3011 return -EIO;
3012 }
3013
3014 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3015 pHddCtx->ftm.targetNVTableSize = 0;
3016 pHddCtx->ftm.processedNVTableSize = 0;
3017 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3018 }
3019
3020 return 1;
3021}
3022
Jeff Johnson295189b2012-06-20 16:38:30 -07003023/**---------------------------------------------------------------------------
3024
3025 \brief wlan_hdd_ftm_temp_get_rel_num() -
3026 Get internal release number
3027
3028 \param - ftmCmd - Pointer FTM Commad Buffer
3029
3030 \return - int
3031 -1, Process Host command fail, vail out
3032 0, Process Host command success
3033
3034 --------------------------------------------------------------------------*/
3035int wlan_hdd_ftm_temp_get_rel_num
3036(
3037 tPttMsgbuffer *ftmCmd
3038)
3039{
3040 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3041
3042 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3043 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3044 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3045 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3046 relNum->relParams.pttMax = 10;
3047 relNum->relParams.pttMin = 1;
3048
3049 return 1;
3050}
3051
3052/**---------------------------------------------------------------------------
3053
3054 \brief wlan_hdd_process_ftm_host_cmd() -
3055 process any command should be handled within host.
3056 decide any command should be send to HAL or not
3057
3058 \param - ftmCmd - Pointer FTM Commad Buffer
3059
3060 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003061 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003062 0, Process Host command success, not need to send CMD to HAL
3063 1, Process Host command success, need to send CMD to HAL
3064
3065 --------------------------------------------------------------------------*/
3066int wlan_hdd_process_ftm_host_cmd
3067(
3068 hdd_context_t *pHddCtx,
3069 void *ftmCmd
3070)
3071{
3072 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3073 int needToRouteHal = 1;
3074 int hostState = 1;
3075
3076 switch(pFTMCmd->msgId)
3077 {
3078 case PTT_MSG_GET_NV_TABLE:
3079 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3080 needToRouteHal = 0;
3081 break;
3082
3083 case PTT_MSG_SET_NV_TABLE:
3084 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3085 /* Temp NV Operation will be isolated to host
3086 needToRouteHal = 1; */
3087 needToRouteHal = 0;
3088 break;
3089
3090 case PTT_MSG_BLANK_NV:
3091 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3092 needToRouteHal = 1;
3093 break;
3094
3095 case PTT_MSG_DEL_NV_TABLE:
3096 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3097 needToRouteHal = 1;
3098 break;
3099
3100 case PTT_MSG_GET_NV_FIELD:
3101 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3102 needToRouteHal = 0;
3103 break;
3104
3105 case PTT_MSG_SET_NV_FIELD:
3106 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3107 needToRouteHal = 0;
3108 break;
3109
3110 case PTT_MSG_STORE_NV_TABLE:
3111 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3112 needToRouteHal = 0;
3113 break;
3114
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003115 case PTT_MSG_GET_NV_BIN:
3116 case PTT_MSG_GET_DICTIONARY:
3117 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3118 needToRouteHal = 0;
3119 break;
3120
3121 case PTT_MSG_SET_NV_BIN:
3122 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3123 needToRouteHal = 0;
3124 break;
3125
Jeff Johnson295189b2012-06-20 16:38:30 -07003126 case PTT_MSG_DBG_READ_REGISTER:
3127 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3128 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3129 needToRouteHal = 0;
3130 break;
3131
3132 case PTT_MSG_DBG_WRITE_REGISTER:
3133 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3134 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3135 needToRouteHal = 0;
3136 break;
3137
3138 case PTT_MSG_DBG_READ_MEMORY:
3139 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3140 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3141 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3142 needToRouteHal = 0;
3143 break;
3144
3145 case PTT_MSG_DBG_WRITE_MEMORY:
3146 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3147 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3148 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3149 needToRouteHal = 0;
3150 break;
3151
3152 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3153 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3154 needToRouteHal = 0;
3155 break;
3156
3157 default:
3158 needToRouteHal = 1;
3159 break;
3160 }
3161
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003162 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003163 {
3164 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3165 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003166 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003167 }
3168
3169 return needToRouteHal;
3170}
Jeff Johnson295189b2012-06-20 16:38:30 -07003171
3172/**---------------------------------------------------------------------------
3173
3174 \brief wlan_hdd_process_ftm_cmd() -
3175
3176 This function process the commands received from the ptt socket application.
3177
3178 \param - pAdapter - Pointer HDD Context.
3179
3180 \param - wnl - Pointer to the ANI netlink header.
3181
3182 \return - none
3183
3184 --------------------------------------------------------------------------*/
3185
3186void wlan_hdd_process_ftm_cmd
3187(
3188 hdd_context_t *pHddCtx,
3189 tAniNlHdr *wnl
3190)
3191{
3192 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3193 v_U16_t cmd_len;
3194 v_U8_t *pftm_data;
3195 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003196 int hostState;
3197 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003198
3199 ENTER();
3200
Jeff Johnsone7245742012-09-05 17:12:55 -07003201 //Delay to fix NV write failure on JB
3202 vos_busy_wait(10000); //10ms
3203
Jeff Johnson295189b2012-06-20 16:38:30 -07003204 if (!pRequestBuf) {
3205
Arif Hussain6d2a3322013-11-17 19:50:10 -08003206 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003207 return ;
3208 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303209
3210 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3211 {
3212 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3213 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3214 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3215 return ;
3216 }
3217
Jeff Johnson295189b2012-06-20 16:38:30 -07003218 /*Save the received request*/
3219 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3220
3221 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3222 /*Save the received request netlink header used for sending the response*/
3223 pHddCtx->ftm.wnl = wnl;
3224 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3225
Arif Hussain6d2a3322013-11-17 19:50:10 -08003226 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003227
3228 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3229 wlan_ftm_send_response(pHddCtx);
3230 return ;
3231 }
3232
3233 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3234 {
3235 case WLAN_FTM_START:
3236 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3237
Arif Hussain6d2a3322013-11-17 19:50:10 -08003238 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003239 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3240 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3241 wlan_ftm_send_response(pHddCtx);
3242 return;
3243 }
3244
3245 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3246 {
3247 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3248 ,__func__);
3249 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3250 wlan_ftm_send_response(pHddCtx);
3251 return;
3252 }
3253 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3254 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3255 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3256 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3257
3258 wlan_ftm_send_response(pHddCtx);
3259
3260 break;
3261
3262 case WLAN_FTM_STOP:
3263 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3264
Arif Hussain6d2a3322013-11-17 19:50:10 -08003265 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003266 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3267 wlan_ftm_send_response(pHddCtx);
3268 return;
3269 }
3270
3271 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3272
3273 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3274 wlan_ftm_send_response(pHddCtx);
3275 return;
3276 }
3277
3278 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3279 /* This would send back the Command Success Status */
3280 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3281
3282 wlan_ftm_send_response(pHddCtx);
3283
3284 break;
3285
3286 case WLAN_FTM_CMD:
3287 /* if it is regular FTM command, pass it to HAL PHY */
3288 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003289 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003290 return;
3291 }
3292 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3293
Arif Hussain6d2a3322013-11-17 19:50:10 -08003294 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003295
3296 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3297 wlan_ftm_send_response(pHddCtx);
3298 return;
3299
3300 }
3301 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3302 cmd_len = pRequestBuf->ftm_hdr.data_len;
3303 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3304 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3305
Jeff Johnson295189b2012-06-20 16:38:30 -07003306 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3307 if (0 == hostState)
3308 {
3309 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3310 if (NULL == tempRspBuffer)
3311 {
3312 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003313 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003314 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3315 wlan_ftm_send_response(pHddCtx);
3316 return;
3317 }
3318 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3319 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3320 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3321 (unsigned char *) tempRspBuffer,
3322 tempRspBuffer->msgBodyLength);
3323 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3324 wlan_ftm_send_response(pHddCtx);
3325 vos_mem_free(tempRspBuffer);
3326 return;
3327 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003328 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003329 {
3330 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3331 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3332 wlan_ftm_send_response(pHddCtx);
3333 return;
3334 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003335
3336 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3337
Jeff Johnson295189b2012-06-20 16:38:30 -07003338
3339 /*Post the command to the HAL*/
3340 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3341
Arif Hussain6d2a3322013-11-17 19:50:10 -08003342 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003343 return;
3344
3345 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303346 /*After successful posting of message the command should be pending*/
3347 pHddCtx->ftm.IsCmdPending = TRUE;
3348
Jeff Johnson295189b2012-06-20 16:38:30 -07003349 /*Wait here until you get the response from HAL*/
3350 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3351 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303352 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3353 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3354 wlan_ftm_send_response(pHddCtx);
3355 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003356 return;
3357 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303358 /*This check will handle the case where the completion is sent by
3359 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3360 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3361 {
3362 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3363 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3364 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3365
3366 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3367 wlan_ftm_send_response(pHddCtx);
3368 pHddCtx->ftm.IsCmdPending = FALSE;
3369 return ;
3370 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003371
3372 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3373
3374 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3375
3376 wlan_ftm_send_response(pHddCtx);
3377 pHddCtx->ftm.IsCmdPending = FALSE;
3378 break;
3379
3380 default:
3381
Arif Hussain6d2a3322013-11-17 19:50:10 -08003382 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003383 return;
3384 }
3385
3386 EXIT();
3387 return;
3388} /* wlan_adp_ftm_cmd() */
3389
3390/**---------------------------------------------------------------------------
3391
3392 \brief wlan_ftm_priv_start_stop_ftm() -
3393
3394 This function is used for start/stop the ftm driver.
3395
3396 \param - pAdapter - Pointer HDD Context.
3397 - start - 1/0 to start/stop ftm driver.
3398
3399 \return - 0 for success, non zero for failure
3400
3401 --------------------------------------------------------------------------*/
3402
3403static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3404 v_U16_t start)
3405{
3406 VOS_STATUS status;
3407 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3408
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003409 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 {
3411 pHddCtx->ftm.cmd_iwpriv = TRUE;
3412 status = wlan_hdd_ftm_start(pHddCtx);
3413
3414 if (status != VOS_STATUS_SUCCESS)
3415 {
3416 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3417 "FTM Start Failed");
3418 return VOS_STATUS_E_FAILURE;
3419 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303420 if (NULL == pMsgBuf)
3421 {
3422 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3423 if (NULL == pMsgBuf)
3424 {
3425 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3426 "%s:pMsgBuf is NULL", __func__);
3427 return VOS_STATUS_E_FAILURE;
3428 }
3429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003430 }
3431 else
3432 {
3433 status = wlan_ftm_stop(pHddCtx);
3434
3435 if (status != VOS_STATUS_SUCCESS)
3436 {
3437 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3438 "FTM Stop Failed");
3439 return VOS_STATUS_E_FAILURE;
3440 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303441 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3442 if (pMsgBuf)
3443 {
3444 vos_mem_free((v_VOID_t * )pMsgBuf);
3445 pMsgBuf = NULL;
3446 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003447 }
3448 return VOS_STATUS_SUCCESS;
3449}
3450
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303451
3452static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3453{
3454 unsigned int *table = NULL;
3455 int index = 0;
3456
3457 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3458 table = valid_channel;
3459 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3460 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3461 table = valid_channel_cb40;
3462 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3463 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3464 table = valid_channel_cb80;
3465
3466 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303467 {
3468 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3469 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303470 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303471 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303472
3473 while (table[index] != 0)
3474 {
3475 if (table[index] == channel)
3476 return VOS_STATUS_SUCCESS;
3477
3478 index++;
3479 }
3480
3481 return VOS_STATUS_E_FAILURE;
3482}
3483
3484
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303485static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3486{
3487 unsigned int primary_channel = center_channel;
3488
3489 if (center_channel <= 14)
3490 return primary_channel ;
3491
3492 switch (cb)
3493 {
3494 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3495 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3496 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3497 primary_channel -= 2;
3498 break;
3499
3500
3501 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3502 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3503 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3504 primary_channel += 2;
3505 break;
3506
3507 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3508 primary_channel -= 6;
3509 break;
3510
3511 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3512 primary_channel += 6;
3513 break;
3514 }
3515
3516 return primary_channel;
3517
3518}
3519
Jeff Johnson295189b2012-06-20 16:38:30 -07003520/**---------------------------------------------------------------------------
3521
3522 \brief wlan_ftm_priv_set_channel() -
3523
3524 This function is used for setting the channel to the halphy ptt module.
3525
3526 \param - pAdapter - Pointer HDD Context.
3527 - channel - Channel Number 1-14.
3528
3529 \return - 0 for success, non zero for failure
3530
3531 --------------------------------------------------------------------------*/
3532
3533static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3534{
Jeff Johnson295189b2012-06-20 16:38:30 -07003535 uPttMsgs *pMsgBody;
3536 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303537 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003538 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3539
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303540 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003541 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303542 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3543 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003544 return VOS_STATUS_E_FAILURE;
3545 }
3546
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303547 if (NULL == pMsgBuf)
3548 {
3549 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3550 "%s:pMsgBuf is NULL", __func__);
3551 return VOS_STATUS_E_NOMEM;
3552 }
3553
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303554 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003555 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303556 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3557 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003558 return VOS_STATUS_E_FAILURE;
3559 }
3560
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303561 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003562 init_completion(&pHddCtx->ftm.ftm_comp_var);
3563 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3564 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3565
3566 pMsgBody = &pMsgBuf->msgBody;
3567
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303568 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003569
Arif Hussain6d2a3322013-11-17 19:50:10 -08003570 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303571 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003572
3573 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3574
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303575 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003576 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303577 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3578 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003579 status = VOS_STATUS_E_FAILURE;
3580 goto done;
3581
3582 }
c_hpothuffdb5272013-10-02 16:42:35 +05303583 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303584 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303585 if (0 >= ret )
3586 {
3587 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3588 FL("wait on ftm_comp_var failed %ld"), ret);
3589 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003590
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303591 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003592 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303593 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3594 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003595 status = VOS_STATUS_E_FAILURE;
3596 goto done;
3597
3598 }
3599done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003600
3601 return status;
3602}
3603
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303604
3605/**---------------------------------------------------------------------------
3606
3607 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3608
3609 This function is used for setting the power control mode for tx.
3610
3611 \param - pAdapter - Pointer HDD Context.
3612 - pwr_mode - power control mode 0-2.
3613
3614 \return - 0 for success, non zero for failure
3615
3616 --------------------------------------------------------------------------*/
3617
3618static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3619 v_U16_t pwr_mode)
3620{
3621 uPttMsgs *pMsgBody;
3622 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303623 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303624 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3625
3626 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3627 {
3628 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3629 "%s:Ftm has not started. Please start the ftm. ", __func__);
3630 return VOS_STATUS_E_FAILURE;
3631 }
3632
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303633 if (NULL == pMsgBuf)
3634 {
3635 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3636 "%s:pMsgBuf is NULL", __func__);
3637 return VOS_STATUS_E_NOMEM;
3638 }
3639
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303640 if (pwr_mode > 2)
3641 {
3642 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3643 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3644 return VOS_STATUS_E_FAILURE;
3645 }
3646
3647 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3648 init_completion(&pHddCtx->ftm.ftm_comp_var);
3649 pMsgBody = &pMsgBuf->msgBody;
3650 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3651 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3652
3653 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3654 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3655
3656 if (status != VOS_STATUS_SUCCESS)
3657 {
3658 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3659 "%s:wlan_ftm_postmsg failed", __func__);
3660 status = VOS_STATUS_E_FAILURE;
3661 goto done;
3662 }
c_hpothuffdb5272013-10-02 16:42:35 +05303663 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303664 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303665 if (0 >= ret )
3666 {
3667 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3668 FL("wait on ftm_comp_var failed %ld"), ret);
3669 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303670
3671 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3672 {
3673 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3674 "%s:Ptt response status failed", __func__);
3675 status = VOS_STATUS_E_FAILURE;
3676 goto done;
3677 }
3678
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303679 ftm_status.powerCtlMode= pwr_mode;
3680
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303681 done:
3682 return status;
3683
3684}
3685
Jeff Johnson295189b2012-06-20 16:38:30 -07003686/**---------------------------------------------------------------------------
3687
3688 \brief wlan_ftm_priv_set_txpower() -
3689
3690 This function is used for setting the txpower to the halphy ptt module.
3691
3692 \param - pAdapter - Pointer HDD Context.
3693 - txpower - txpower Number 1-18.
3694
3695 \return - 0 for success, non zero for failure
3696
3697 --------------------------------------------------------------------------*/
3698
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303699static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3700 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003701{
Jeff Johnson295189b2012-06-20 16:38:30 -07003702 uPttMsgs *pMsgBody;
3703 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303704 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003705 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3706
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303707 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003708 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303709 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3710 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003711 return VOS_STATUS_E_FAILURE;
3712 }
3713
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303714 if (NULL == pMsgBuf)
3715 {
3716 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3717 "%s:pMsgBuf is NULL", __func__);
3718 return VOS_STATUS_E_NOMEM;
3719 }
3720
Jeff Johnson295189b2012-06-20 16:38:30 -07003721 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3722 * when tx pktgen is enabled
3723 */
3724 if (ftm_status.frameGenEnabled)
3725 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303726 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3727 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003728 return VOS_STATUS_E_FAILURE;
3729 }
3730
3731 if(!(txpower >= 9 && txpower <= 24))
3732 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303733 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3734 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003735 return VOS_STATUS_E_FAILURE;
3736 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003737
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303738 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3739 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003740 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003741 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3742 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3743
3744 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3745
3746 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3747
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303748 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003749 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303750 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3751 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003752 status = VOS_STATUS_E_FAILURE;
3753 goto done;
3754 }
c_hpothuffdb5272013-10-02 16:42:35 +05303755 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303756 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303757 if (0 >= ret )
3758 {
3759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3760 FL("wait on ftm_comp_var failed %ld"), ret);
3761 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003762
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303763 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003764 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303765 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3766 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003767 status = VOS_STATUS_E_FAILURE;
3768 goto done;
3769 }
3770
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003772
3773 return status;
3774
3775}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303776
3777
3778static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3779 v_U16_t enable)
3780{
3781 tANI_U32 value = 0;
3782 tANI_U32 reg_addr;
3783 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303784
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303785 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3786 {
3787 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3788 "%s:Ftm has not started. Please start the ftm. ", __func__);
3789 return VOS_STATUS_E_FAILURE;
3790 }
3791
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303792 reg_addr = WCNSS_TXFIR_OFFSET;
3793
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794 wpalReadRegister(reg_addr, &value);
3795 if (enable)
3796 {
3797 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3798 }
3799 else
3800 {
3801 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3802 }
3803
3804 wpalWriteRegister(reg_addr, value);
3805
3806 return VOS_STATUS_SUCCESS;
3807}
3808
3809
Jeff Johnson295189b2012-06-20 16:38:30 -07003810/**---------------------------------------------------------------------------
3811
3812 \brief wlan_ftm_priv_set_txrate() -
3813
3814 This function is used for setting the txrate to the halphy ptt module.
3815 It converts the user input string for txrate to the tx rate index.
3816
3817 \param - pAdapter - Pointer HDD Context.
3818 - txrate - Pointer to the tx rate string.
3819
3820 \return - 0 for success, non zero for failure
3821
3822 --------------------------------------------------------------------------*/
3823
3824static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3825{
3826 int ii;
3827 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3828 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3829 {
3830 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3831 return VOS_STATUS_E_FAILURE;
3832 }
3833
3834 /* do not allow to change setting when tx pktgen is enabled */
3835 if (ftm_status.frameGenEnabled)
3836 {
3837 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3838 return VOS_STATUS_E_FAILURE;
3839 }
3840
3841 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3842 {
3843 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3844 break;
3845 }
3846 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3847 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003849 return VOS_STATUS_E_FAILURE;
3850 }
3851
3852 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3853 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3854
3855 return VOS_STATUS_SUCCESS;
3856}
3857
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303858
3859
3860static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3861 ePowerTempIndexSource pwr_source)
3862{
3863 uPttMsgs *pMsgBody;
3864 VOS_STATUS status;
3865 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3866
3867 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3868 {
3869 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3870 "%s:Ftm has not started. Please start the ftm. ", __func__);
3871 return VOS_STATUS_E_FAILURE;
3872 }
3873
3874 if (pwr_source > 3)
3875 {
3876 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3877 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3878 __func__);
3879 return VOS_STATUS_E_FAILURE;
3880 }
3881
3882 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3883
3884 init_completion(&pHddCtx->ftm.ftm_comp_var);
3885 pMsgBody = &pMsgBuf->msgBody;
3886 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3887 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3888
3889 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3890 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3891
3892 if (status != VOS_STATUS_SUCCESS)
3893 {
3894 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3895 "%s:wlan_ftm_postmsg failed", __func__);
3896 status = VOS_STATUS_E_FAILURE;
3897 goto done;
3898 }
3899 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3900 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3901
3902 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3903 {
3904 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3905 "%s:Ptt response status failed", __func__);
3906 status = VOS_STATUS_E_FAILURE;
3907 goto done;
3908 }
3909
3910done:
3911
3912 return status;
3913}
3914
3915
Jeff Johnson295189b2012-06-20 16:38:30 -07003916/**---------------------------------------------------------------------------
3917
3918 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3919
3920 This function is used for start/stop the tx packet generation.
3921
3922 \param - pAdapter - Pointer HDD Context.
3923 - startStop - Value( 1/0) start/stop the tx packet generation.
3924
3925 \return - 0 for success, non zero for failure
3926
3927 --------------------------------------------------------------------------*/
3928
3929static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3930{
Jeff Johnson295189b2012-06-20 16:38:30 -07003931 uPttMsgs *pMsgBody;
3932 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303933 long ret;
3934
Jeff Johnson295189b2012-06-20 16:38:30 -07003935 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3936
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303937 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003938 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303939 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3940 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003941 return VOS_STATUS_E_FAILURE;
3942 }
3943
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303944 if (NULL == pMsgBuf)
3945 {
3946 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3947 "%s:pMsgBuf is NULL", __func__);
3948 return VOS_STATUS_E_NOMEM;
3949 }
3950
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303951 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003952 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303953 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3954 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003955 return VOS_STATUS_E_FAILURE;
3956 }
3957
3958 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3959 (!ftm_status.frameGenEnabled && startStop == 0))
3960 {
3961 return VOS_STATUS_SUCCESS ;
3962 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303963 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003964
Jeff Johnson295189b2012-06-20 16:38:30 -07003965 if (startStop == 1)
3966 {
3967 init_completion(&pHddCtx->ftm.ftm_comp_var);
3968 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3969 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3970 pMsgBody = &pMsgBuf->msgBody;
3971 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3972
3973 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303974 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003975 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303976 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3977 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003978 status = VOS_STATUS_E_FAILURE;
3979 goto done;
3980 }
3981
c_hpothuffdb5272013-10-02 16:42:35 +05303982 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303983 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303984 if (0 >= ret )
3985 {
3986 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3987 FL("wait on ftm_comp_var failed %ld"), ret);
3988 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303989 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003990 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303991 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3992 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003993 status = VOS_STATUS_E_FAILURE;
3994 goto done;
3995 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303996
3997 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
3998 {
3999 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4000 if(status != VOS_STATUS_SUCCESS)
4001 {
4002 goto done;
4003 }
4004 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004005 }
4006
4007 init_completion(&pHddCtx->ftm.ftm_comp_var);
4008 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4009 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4010 pMsgBody = &pMsgBuf->msgBody;
4011 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4012
4013 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4014 if(status != VOS_STATUS_SUCCESS)
4015 {
4016 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4017 status = VOS_STATUS_E_FAILURE;
4018 goto done;
4019 }
4020
c_hpothuffdb5272013-10-02 16:42:35 +05304021 ret = wait_for_completion_interruptible_timeout(
4022 &pHddCtx->ftm.ftm_comp_var,
4023 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4024 if (0 >= ret )
4025 {
4026 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4027 FL("wait on ftm_comp_var failed %ld"), ret);
4028 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4030 {
4031 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4032 status = VOS_STATUS_E_FAILURE;
4033 goto done;
4034 }
4035
4036done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004037
4038 if (status == VOS_STATUS_SUCCESS)
4039 {
4040 if (startStop == 1)
4041 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304042 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004043 }
4044 else
4045 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304046 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004047 }
4048 }
4049
4050 return status;
4051}
4052
4053
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304054
4055static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4056{
4057
4058 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4059 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4060 {
4061 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4062 "%s:Ftm has not started. Please start the ftm. ", __func__);
4063 return VOS_STATUS_E_FAILURE;
4064 }
4065
4066 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4067 {
4068 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4069 "%s:cb mode value is invalid ", __func__);
4070 return VOS_STATUS_E_FAILURE;
4071 }
4072
4073 ftm_status.cbmode = cbmode;
4074
4075 return VOS_STATUS_SUCCESS;
4076
4077}
4078
Jeff Johnson295189b2012-06-20 16:38:30 -07004079/**---------------------------------------------------------------------------
4080
4081 \brief wlan_ftm_rx_mode() -
4082
4083 This function is used for start/stop the rx packet generation.
4084
4085 \param - pAdapter - Pointer HDD Context.
4086 - rxmode - 0-disable RX.
4087 - 1-rx ALL frames
4088 - 2-rx 11 g/n frames
4089 - 3-rx 11b frames
4090
4091 \return - 0 for success, non zero for failure
4092
4093 --------------------------------------------------------------------------*/
4094
4095static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4096{
Jeff Johnson295189b2012-06-20 16:38:30 -07004097 uPttMsgs *pMsgBody;
4098 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304099 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004100
4101 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304102 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004103 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304104 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4105 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004106 return VOS_STATUS_E_FAILURE;
4107 }
4108
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304109 if (NULL == pMsgBuf)
4110 {
4111 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4112 "%s:pMsgBuf is NULL", __func__);
4113 return VOS_STATUS_E_NOMEM;
4114 }
4115
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304116 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004117 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304118 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4119 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004120 return VOS_STATUS_E_FAILURE;
4121 }
4122
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304123 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004124 init_completion(&pHddCtx->ftm.ftm_comp_var);
4125
4126 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4127 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4128
4129 pMsgBody = &pMsgBuf->msgBody;
4130
4131 switch(rxmode)
4132 {
4133 case RXMODE_DISABLE_ALL:
4134 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4135 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4136 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4137 break;
4138
4139 case RXMODE_ENABLE_ALL:
4140 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4141 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4142 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4143 break;
4144
4145 case RXMODE_ENABLE_11GN:
4146 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4147 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4148 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4149 break;
4150
4151 case RXMODE_ENABLE_11B:
4152 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4153 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4154 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4155 break;
4156
4157 }
4158
4159 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4160
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304161 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004162 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304163 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4164 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004165 status = VOS_STATUS_E_FAILURE;
4166 goto done;
4167 }
c_hpothuffdb5272013-10-02 16:42:35 +05304168 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304169 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304170 if (0 >= ret )
4171 {
4172 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4173 FL(" wait on ftm_comp_var failed %ld"), ret);
4174 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004175
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304176 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004177 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304178 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4179 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004180 status = VOS_STATUS_E_FAILURE;
4181 goto done;
4182 }
4183 ftm_status.rxmode = rxmode ;
4184done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004185
4186 return status;
4187}
4188
4189/**---------------------------------------------------------------------------
4190
4191 \brief wlan_ftm_priv_rx_pkt_clear() -
4192
4193 This function sets the rx pkt count to zero.
4194
4195 \param - pAdapter - Pointer HDD Context.
4196 - rx_pkt_clear - rx_pkt_clear value.
4197
4198 \return - 0 for success, non zero for failure
4199
4200 --------------------------------------------------------------------------*/
4201
4202static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4203{
Jeff Johnson295189b2012-06-20 16:38:30 -07004204 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304205 long ret;
4206
Jeff Johnson295189b2012-06-20 16:38:30 -07004207 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4208
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304209 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004210 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304211 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4212 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004213 return VOS_STATUS_E_FAILURE;
4214 }
4215
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304216 if (NULL == pMsgBuf)
4217 {
4218 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4219 "%s:pMsgBuf is NULL", __func__);
4220 return VOS_STATUS_E_NOMEM;
4221 }
4222
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304223 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304225 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4226 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004227 return VOS_STATUS_E_FAILURE;
4228 }
4229
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304230 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004231 init_completion(&pHddCtx->ftm.ftm_comp_var);
4232 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304233 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004234
Jeff Johnson295189b2012-06-20 16:38:30 -07004235 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4236
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304237 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004238 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304239 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4240 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004241 status = VOS_STATUS_E_FAILURE;
4242 goto done;
4243 }
c_hpothuffdb5272013-10-02 16:42:35 +05304244 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304245 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304246 if (0 >= ret )
4247 {
4248 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4249 FL("wait on ftm_comp_var failed %ld"), ret);
4250 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004251
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304252 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004253 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304254 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4255 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004256 status = VOS_STATUS_E_FAILURE;
4257 goto done;
4258 }
4259done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004260
4261 return status;
4262}
4263
4264/**---------------------------------------------------------------------------
4265
4266 \brief wlan_ftm_priv_get_channel() -
4267
4268 This function gets the channel number from the halphy ptt module and
4269 returns the channel number to the application.
4270
4271 \param - pAdapter - Pointer HDD Context.
4272 - pChannel - Poniter to get the Channel number.
4273
4274 \return - 0 for success, non zero for failure
4275
4276 --------------------------------------------------------------------------*/
4277
4278static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4279{
Jeff Johnson295189b2012-06-20 16:38:30 -07004280 uPttMsgs *pMsgBody;
4281 VOS_STATUS status;
4282 v_U16_t freq;
4283 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304284 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004285
4286 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304287 v_PVOID_t devHandle = pHddCtx->parent_dev;
4288 struct device *wcnss_device = (struct device *)devHandle;
4289 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304290 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004291 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304292 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4293 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004294 return VOS_STATUS_E_FAILURE;
4295 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304296
4297 if (NULL == pMsgBuf)
4298 {
4299 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4300 "%s:pMsgBuf is NULL", __func__);
4301 return VOS_STATUS_E_NOMEM;
4302 }
4303
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304304 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004305 init_completion(&pHddCtx->ftm.ftm_comp_var);
4306 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4307 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4308
4309 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304310 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4311 if (NULL == wcnss_memory)
4312 {
4313 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4314 "%s: wcnss_memory is NULL", __func__);
4315 return VOS_STATUS_E_NOMEM;
4316 }
4317 else
4318 {
4319 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4320 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4321 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004322 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4323
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304324 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004325 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304326 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4327 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004328 status = VOS_STATUS_E_FAILURE;
4329 goto done;
4330
4331 }
c_hpothuffdb5272013-10-02 16:42:35 +05304332 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304333 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304334 if (0 >= ret )
4335 {
4336 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4337 FL("wait on ftm_comp_var failed %ld"), ret);
4338 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004339
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304340 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004341 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304342 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4343 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004344 status = VOS_STATUS_E_FAILURE;
4345 goto done;
4346 }
4347
4348 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4349
4350 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4351 indx++;
4352 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4353 {
4354 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4355 status = VOS_STATUS_E_FAILURE;
4356 goto done;
4357 }
4358
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004359 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004360
Arif Hussain6d2a3322013-11-17 19:50:10 -08004361 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004362 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004363
4364 return status;
4365}
4366
4367/**---------------------------------------------------------------------------
4368
4369 \brief wlan_ftm_priv_get_txpower() -
4370
4371 This function gets the TX power from the halphy ptt module and
4372 returns the TX power to the application.
4373
4374 \param - pAdapter - Pointer HDD Context.
4375 - pTxPwr - Poniter to get the Tx power.
4376
4377 \return - 0 for success, non zero for failure
4378
4379 --------------------------------------------------------------------------*/
4380
4381static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4382{
Jeff Johnson295189b2012-06-20 16:38:30 -07004383 uPttMsgs *pMsgBody;
4384 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304385 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004386 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4387
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304388 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004389 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304390 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4391 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004392 return VOS_STATUS_E_FAILURE;
4393 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304394
4395 if (NULL == pMsgBuf)
4396 {
4397 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4398 "%s:pMsgBuf is NULL", __func__);
4399 return VOS_STATUS_E_NOMEM;
4400 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304401 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004402 init_completion(&pHddCtx->ftm.ftm_comp_var);
4403 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4404 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4405
4406 pMsgBody = &pMsgBuf->msgBody;
4407
4408 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4409
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304410 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004411 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304412 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4413 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004414 status = VOS_STATUS_E_FAILURE;
4415 goto done;
4416 }
c_hpothuffdb5272013-10-02 16:42:35 +05304417 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304418 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304419 if (0 >= ret )
4420 {
4421 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4422 FL("wait on ftm_comp_var failed %ld"), ret);
4423 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004424
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304425 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004426 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304427 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4428 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004429 status = VOS_STATUS_E_FAILURE;
4430 goto done;
4431 }
4432 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4433
4434 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004435
4436 return status;
4437}
4438
4439/**---------------------------------------------------------------------------
4440
Jeff Johnson295189b2012-06-20 16:38:30 -07004441 \brief wlan_ftm_priv_get_txrate() -
4442
4443 This function gets the TX rate from the halphy ptt module and
4444 returns the TX rate to the application.
4445
4446 \param - pAdapter - Pointer HDD Context.
4447 - pTxRate - Poniter to get the Tx rate.
4448
4449 \return - 0 for success, non zero for failure
4450
4451 --------------------------------------------------------------------------*/
4452
4453static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4454{
Jeff Johnson295189b2012-06-20 16:38:30 -07004455 uPttMsgs *pMsgBody;
4456 VOS_STATUS status;
4457 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304458 long ret;
4459
Jeff Johnson295189b2012-06-20 16:38:30 -07004460 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4461
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304462 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004463 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304464 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4465 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004466 return VOS_STATUS_E_FAILURE;
4467 }
4468
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304469 if (NULL == pMsgBuf)
4470 {
4471 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4472 "%s:pMsgBuf is NULL", __func__);
4473 return VOS_STATUS_E_NOMEM;
4474 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304475 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004476 init_completion(&pHddCtx->ftm.ftm_comp_var);
4477 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4478 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4479
4480 pMsgBody = &pMsgBuf->msgBody;
4481
4482 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4483
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304484 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004485 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304486 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4487 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004488 status = VOS_STATUS_E_FAILURE;
4489 goto done;
4490 }
c_hpothuffdb5272013-10-02 16:42:35 +05304491 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304492 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304493 if (0 >= ret )
4494 {
4495 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4496 FL("wait on ftm_comp_var failed %ld"), ret);
4497 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004498
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304499 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004500
4501 rate_index = pMsgBody->GetTxPowerReport.rate;
4502 }
4503 else {
4504 /*Return the default rate*/
4505 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304506 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4507 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004508 status = VOS_STATUS_E_FAILURE;
4509 goto done;
4510 }
4511
4512 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4513 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4514 break;
4515 }
4516 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4517 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004518 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 status = VOS_STATUS_E_FAILURE;
4520 goto done;
4521 }
4522 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4523done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004524
4525 return status;
4526
4527}
4528
4529/**---------------------------------------------------------------------------
4530
4531 \brief wlan_ftm_priv_get_rx_pkt_count() -
4532
4533 This function gets the rx pkt count from the halphy ptt module and
4534 returns the rx pkt count to the application.
4535
4536 \param - pAdapter - Pointer HDD Context.
4537 - pRxPktCnt - Poniter to get the rx pkt count.
4538
4539 \return - 0 for success, non zero for failure
4540
4541 --------------------------------------------------------------------------*/
4542
4543static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4544{
Jeff Johnson295189b2012-06-20 16:38:30 -07004545 uPttMsgs *pMsgBody;
4546 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304547 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004548 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4549
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304550 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004551 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304552 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4553 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004554 return VOS_STATUS_E_FAILURE;
4555 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304556
4557 if (NULL == pMsgBuf)
4558 {
4559 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4560 "%s:pMsgBuf is NULL", __func__);
4561 return VOS_STATUS_E_NOMEM;
4562 }
4563
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304564 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004565 init_completion(&pHddCtx->ftm.ftm_comp_var);
4566 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4567 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4568
4569 pMsgBody = &pMsgBuf->msgBody;
4570
4571 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4572
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304573 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004574 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304575 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4576 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004577 status = VOS_STATUS_E_FAILURE;
4578 goto done;
4579 }
c_hpothuffdb5272013-10-02 16:42:35 +05304580 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304581 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304582 if (0 >= ret )
4583 {
4584 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4585 FL("wait on ftm_comp_var failed %ld"), ret);
4586 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004587
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304588 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004589 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304590 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4591 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004592 status = VOS_STATUS_E_FAILURE;
4593 goto done;
4594 }
4595 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4596done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004597
4598 return status;
4599}
4600
4601/**---------------------------------------------------------------------------
4602
4603 \brief wlan_ftm_priv_get_rx_rssi() -
4604
4605 This function gets the rx rssi from the halphy ptt module and
4606 returns the rx rssi to the application.
4607
4608 \param - pAdapter - Pointer HDD Context.
4609 - buf - Poniter to get rssi of Rx chains
4610
4611 \return - 0 for success, non zero for failure
4612
4613 --------------------------------------------------------------------------*/
4614
4615static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4616{
Jeff Johnson295189b2012-06-20 16:38:30 -07004617 uPttMsgs *pMsgBody;
4618 VOS_STATUS status;
4619 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304620 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304622 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004623 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4625 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004626 return VOS_STATUS_E_FAILURE;
4627 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304628
4629 if (NULL == pMsgBuf)
4630 {
4631 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4632 "%s:pMsgBuf is NULL", __func__);
4633 return VOS_STATUS_E_NOMEM;
4634 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304635 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004636 init_completion(&pHddCtx->ftm.ftm_comp_var);
4637 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4638 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4639
4640 pMsgBody = &pMsgBuf->msgBody;
4641
4642 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4643
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304644 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004645 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304646 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4647 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004648 status = VOS_STATUS_E_FAILURE;
4649 goto done;
4650 }
c_hpothuffdb5272013-10-02 16:42:35 +05304651 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304652 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304653 if (0 >= ret )
4654 {
4655 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4656 FL("wait on ftm_comp_var failed %ld"), ret);
4657 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004658
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304659 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004660 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4662 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004663 status = VOS_STATUS_E_FAILURE;
4664 goto done;
4665 }
4666
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004667 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4668 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004669 pMsgBody->GetRxRssi.rssi.rx[1]);
4670
4671 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4672 {
4673 status = VOS_STATUS_E_FAILURE;
4674 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004675
Jeff Johnson295189b2012-06-20 16:38:30 -07004676done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004677
4678 return status;
4679}
4680
4681/**---------------------------------------------------------------------------
4682
4683 \brief wlan_ftm_priv_get_mac_address() -
4684
4685 This function gets the mac address from the halphy ptt module and
4686 returns the mac address to the application.
4687
4688 \param - pAdapter - Pointer HDD Context.
4689 - buf - Poniter to get the mac address.
4690
4691 \return - 0 for success, non zero for failure
4692
4693 --------------------------------------------------------------------------*/
4694
4695static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4696{
4697 v_BOOL_t itemIsValid = VOS_FALSE;
4698 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4699 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004700
Jeff Johnson295189b2012-06-20 16:38:30 -07004701 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4702
4703 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4704 {
4705 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4706 return VOS_STATUS_E_FAILURE;
4707 }
4708 /*Check the NV FIELD is valid or not*/
4709 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4710 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004711 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004712 {
4713 vos_nv_readMacAddress(macAddr);
4714
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004715 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4716 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 MAC_ADDR_ARRAY(macAddr));
4718 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4719 {
4720 return VOS_STATUS_E_FAILURE;
4721 }
4722 }
4723 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004724 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004725 {
4726 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004727 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4728 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004729 MAC_ADDR_ARRAY(macAddr));
4730
4731 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4732 {
4733 return VOS_STATUS_E_FAILURE;
4734 }
4735 }
4736 return VOS_STATUS_SUCCESS;
4737}
4738
4739/**---------------------------------------------------------------------------
4740
4741 \brief wlan_ftm_priv_set_mac_address() -
4742
4743 This function sets the mac address to the halphy ptt module and
4744 sends the netlink message to the ptt socket application which writes
4745 the macaddress to the qcom_wlan_nv.bin file
4746
4747 \param - pAdapter - Pointer HDD Context.
4748 - buf - Poniter to the macaddress.
4749
4750 \return - 0 for success, non zero for failure
4751
4752 --------------------------------------------------------------------------*/
4753
4754static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4755{
Jeff Johnson295189b2012-06-20 16:38:30 -07004756 uPttMsgs *pMsgBody;
4757 VOS_STATUS status;
4758 int macAddr[VOS_MAC_ADDRESS_LEN];
4759 v_U8_t *pMacAddress;
4760 v_U8_t ii;
4761 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304762 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004763
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304764 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004765 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304766 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4767 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004768 return VOS_STATUS_E_FAILURE;
4769 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304770 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004771 init_completion(&pHddCtx->ftm.ftm_comp_var);
4772 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4773 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4774
4775 pMsgBody = &pMsgBuf->msgBody;
4776 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4777
4778 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004779 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]))
4780 {
4781 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4782 "Invalid MacAddress Input %s", buf);
4783 return VOS_STATUS_E_FAILURE;
4784 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004785
Arif Hussain24bafea2013-11-15 15:10:03 -08004786 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4787 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004788
4789
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004790 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004791
4792 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4793 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4794
4795
Arif Hussain24bafea2013-11-15 15:10:03 -08004796 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4797 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004798 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4799
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304800 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004801 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304802 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4803 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004804 status = VOS_STATUS_E_FAILURE;
4805 goto done;
4806 }
c_hpothuffdb5272013-10-02 16:42:35 +05304807 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304808 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304809 if (0 >= ret )
4810 {
4811 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4812 FL("wait on ftm_comp_var failed %ld"), ret);
4813 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004814
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304815 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004816 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304817 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4818 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004819 status = VOS_STATUS_E_FAILURE;
4820 goto done;
4821 }
4822
Arif Hussain6d2a3322013-11-17 19:50:10 -08004823 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004824
4825 init_completion(&pHddCtx->ftm.ftm_comp_var);
4826 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4827
4828 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4829 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4830
4831 pMsgBody = &pMsgBuf->msgBody;
4832
4833 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4834
4835 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4836
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304837 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004838 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304839 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4840 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004841 status = VOS_STATUS_E_FAILURE;
4842 goto done;
4843 }
4844
c_hpothuffdb5272013-10-02 16:42:35 +05304845 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304846 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304847 if (0 >= ret )
4848 {
4849 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4850 FL("wait on ftm_comp_var failed %ld"), ret);
4851 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004852done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004853
4854 return VOS_STATUS_SUCCESS;
4855}
4856
4857/* set param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304858static int __iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004859 union iwreq_data *wrqu, char *extra)
4860{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004861 int ret,sub_cmd;
4862 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304863 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004864 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004865 hdd_adapter_t *pAdapter;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304866 hdd_context_t *pHddCtx;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304867 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07004868
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004869 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304870 /* helper function to get iwreq_data with compat handling. */
4871 if (hdd_priv_get_data(&s_priv_data, wrqu))
4872 {
4873 return -EINVAL;
4874 }
4875
4876 /* make sure all params are correctly passed to function */
4877 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
4878 {
4879 return -EINVAL;
4880 }
4881
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304882 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4883 if (NULL == pAdapter)
4884 {
4885 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4886 "%s: Adapter is NULL",__func__);
4887 return -EINVAL;
4888 }
4889 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4890 ret = wlan_hdd_validate_context(pHddCtx);
4891 if (0 != ret)
4892 {
4893 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4894 "%s: HDD context is not valid",__func__);
4895 return ret;
4896 }
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304897 sub_cmd = s_priv_data.flags;
4898 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004899
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004900 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4901 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4902 * odd number which assigns set_args to zero.we assisgn memory using
4903 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004904 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004905 param = kzalloc(length + 1, GFP_KERNEL);
4906 if (!param)
4907 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004908
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304909 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004910 {
4911 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4912 "%s:Failed to get user data %s", __func__, param);
4913
4914 ret = -EINVAL;
4915 goto OUT;
4916 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004917
4918 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05304919 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004920
4921 switch(sub_cmd)
4922 {
4923 case WE_SET_MAC_ADDRESS:
4924 {
4925
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004926 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004927 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004928
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004929 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004930
4931 if(status != VOS_STATUS_SUCCESS)
4932 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004933 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004934 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004935
Jeff Johnson295189b2012-06-20 16:38:30 -07004936 ret = -EINVAL;
4937 }
4938
Wilson Yang7c471652013-12-20 16:36:44 -08004939 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004940 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004941 case WE_SET_TX_RATE:
4942 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004943 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004944
4945 if(status != VOS_STATUS_SUCCESS)
4946 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004947 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004948 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004949
4950 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004951 }
4952
4953 break;
Wilson Yang7c471652013-12-20 16:36:44 -08004954 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004955 default:
4956 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004957 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004958 ret = -EINVAL;
4959 break;
4960 }
4961 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004962
4963OUT:
4964 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004965 return ret;
4966}
4967
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05304968static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4969 union iwreq_data *wrqu, char *extra)
4970{
4971 int ret;
4972
4973 vos_ssr_protect(__func__);
4974 ret = __iw_ftm_setchar_getnone(dev, info, wrqu, extra);
4975 vos_ssr_unprotect(__func__);
4976
4977 return ret;
4978}
4979
4980static int __iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07004981 union iwreq_data *wrqu, char *extra)
4982{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304983 hdd_adapter_t *pAdapter;
4984 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004985 int *value = (int *)extra;
4986 int sub_cmd = value[0];
4987 int set_value = value[1];
4988 int ret = 0; /* success */
4989 VOS_STATUS status;
4990
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05304991 pAdapter = (netdev_priv(dev));
4992 if (NULL == pAdapter)
4993 {
4994 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
4995 return -EINVAL;
4996 }
4997 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
4998 ret = wlan_hdd_validate_context(pHddCtx);
4999 if (0 != ret)
5000 {
5001 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: HDD context is not valid",__func__);
5002 return ret;
5003 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005004 switch(sub_cmd)
5005 {
5006 case WE_FTM_ON_OFF:
5007 {
5008 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5009
5010 if(status != VOS_STATUS_SUCCESS)
5011 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005012 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005013 ret = -EINVAL;
5014 }
5015
5016 break;
5017 }
5018
5019 case WE_TX_PKT_GEN:
5020 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5021
5022 if(status != VOS_STATUS_SUCCESS)
5023 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005024 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005025 ret = -EINVAL;
5026 }
5027 break;
5028
5029 case WE_SET_TX_IFS:
5030 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5031
5032 if(status != VOS_STATUS_SUCCESS)
5033 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005034 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005035 ret = -EINVAL;
5036 }
5037 break;
5038
5039 case WE_SET_TX_PKT_CNT:
5040 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5041
5042 if(status != VOS_STATUS_SUCCESS)
5043 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005044 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005045 ret = -EINVAL;
5046 }
5047 break;
5048
5049 case WE_SET_TX_PKT_LEN:
5050 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5051
5052 if(status != VOS_STATUS_SUCCESS)
5053 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005054 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005055 ret = -EINVAL;
5056 }
5057 break;
5058
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305059 case WE_TX_CW_RF_GEN:
5060 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5061
5062 if(status != VOS_STATUS_SUCCESS)
5063 {
5064 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5065 ret = -EINVAL;
5066 }
5067 break;
5068
Jeff Johnson295189b2012-06-20 16:38:30 -07005069 case WE_SET_CHANNEL:
5070 {
5071 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5072
5073 if(status != VOS_STATUS_SUCCESS)
5074 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005075 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005076 ret = -EINVAL;
5077 }
5078 break;
5079 }
5080 case WE_SET_TX_POWER:
5081 {
5082 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5083
5084 if(status != VOS_STATUS_SUCCESS)
5085 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005086 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005087 ret = -EINVAL;
5088 }
5089 break;
5090 }
5091 case WE_CLEAR_RX_PKT_CNT:
5092 {
5093 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5094
5095 if(status != VOS_STATUS_SUCCESS)
5096 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005097 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005098 ret = -EINVAL;
5099 }
5100 break;
5101 }
5102 case WE_RX:
5103 {
5104 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5105
5106 if(status != VOS_STATUS_SUCCESS)
5107 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005108 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005109 ret = -EINVAL;
5110 }
5111 break;
5112 }
5113 case WE_ENABLE_CHAIN:
5114 {
5115 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5116
5117 if(status != VOS_STATUS_SUCCESS)
5118 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005119 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005120 ret = -EINVAL;
5121 }
5122 break;
5123 }
5124
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305125 case WE_SET_PWR_CNTL_MODE:
5126 {
5127 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5128 if (status != VOS_STATUS_SUCCESS)
5129 {
5130 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5131 status);
5132 ret = -EINVAL;
5133 }
5134 break;
5135 }
5136
5137 case WE_ENABLE_DPD:
5138 {
5139 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5140 if (status != VOS_STATUS_SUCCESS)
5141 {
5142 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5143 ret = -EINVAL;
5144 }
5145 break;
5146 }
5147
5148 case WE_SET_CB:
5149 {
5150 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5151 if (status != VOS_STATUS_SUCCESS)
5152 {
5153 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5154 ret = -EINVAL;
5155 }
5156 break;
5157 }
5158
Jeff Johnson295189b2012-06-20 16:38:30 -07005159 default:
5160 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005161 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005162 sub_cmd, set_value);
5163 break;
5164 }
5165 }
5166
5167 return ret;
5168}
5169
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305170static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5171 union iwreq_data *wrqu, char *extra)
5172{
5173 int ret;
5174
5175 vos_ssr_protect(__func__);
5176 ret = __iw_ftm_setint_getnone(dev, info, wrqu, extra);
5177 vos_ssr_unprotect(__func__);
5178
5179 return ret;
5180}
Jeff Johnson295189b2012-06-20 16:38:30 -07005181/* get param sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305182static int __iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005183 union iwreq_data *wrqu, char *extra)
5184{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305185 hdd_adapter_t *pAdapter;
5186 hdd_context_t *pHddCtx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005187 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005188 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005189 VOS_STATUS status;
5190
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305191 pAdapter = (netdev_priv(dev));
5192 if (NULL == pAdapter)
5193 {
5194 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5195 return -EINVAL;
5196 }
5197 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5198 ret = wlan_hdd_validate_context(pHddCtx);
5199 if (0 != ret)
5200 {
5201 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: HDD context is not valid",__func__);
5202 return ret;
5203 }
5204
Jeff Johnson295189b2012-06-20 16:38:30 -07005205 switch (value[0])
5206 {
5207 case WE_GET_CHANNEL:
5208 {
5209 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5210
5211 if(status != VOS_STATUS_SUCCESS)
5212 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005213 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005214 ret = -EINVAL;
5215 }
5216 break;
5217 }
5218 case WE_GET_TX_POWER:
5219 {
5220 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5221
5222 if(status != VOS_STATUS_SUCCESS)
5223 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005224 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005225 ret = -EINVAL;
5226 }
5227 break;
5228 }
5229 case WE_GET_RX_PKT_CNT:
5230 {
5231 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5232
5233 if(status != VOS_STATUS_SUCCESS)
5234 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005235 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005236 ret = -EINVAL;
5237 }
5238 break;
5239 }
5240 default:
5241 {
5242 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5243 break;
5244 }
5245 }
5246
5247 return ret;
5248}
5249
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305250static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5251 union iwreq_data *wrqu, char *extra)
5252{
5253 int ret;
5254
5255 vos_ssr_protect(__func__);
5256 ret = __iw_ftm_setnone_getint(dev, info, wrqu, extra);
5257 vos_ssr_unprotect(__func__);
5258
5259 return ret;
5260}
5261
5262static int __iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005263 union iwreq_data *wrqu, char *extra)
5264{
5265 int sub_cmd = wrqu->data.flags;
5266 VOS_STATUS status;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305267 hdd_adapter_t *pAdapter;
5268 hdd_context_t *pHddCtx;
5269 int ret = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005270
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305271 pAdapter = (netdev_priv(dev));
5272 if (NULL == pAdapter)
5273 {
5274 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Adapter is NULL",__func__);
5275 return -EINVAL;
5276 }
5277 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5278 ret = wlan_hdd_validate_context(pHddCtx);
5279 if (0 != ret)
5280 {
5281 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: HDD context is not valid ",__func__);
5282 return ret;
5283 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005284 switch(sub_cmd)
5285 {
5286 case WE_GET_MAC_ADDRESS:
5287 {
5288 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5289
5290 if(status != VOS_STATUS_SUCCESS)
5291 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005292 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005293 return -EINVAL;
5294 }
5295 wrqu->data.length = strlen(extra)+1;
5296 break;
5297 }
5298 case WE_GET_TX_RATE:
5299 {
5300 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5301
5302 if(status != VOS_STATUS_SUCCESS)
5303 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005304 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005305 return -EINVAL;
5306 }
5307
5308 wrqu->data.length = strlen(extra)+1;
5309 break;
5310 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005311 case WE_GET_FTM_STATUS:
5312 {
5313 status = wlan_ftm_priv_get_status(pAdapter, extra);
5314
5315 if(status != VOS_STATUS_SUCCESS)
5316 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005317 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005318 return -EINVAL;
5319 }
5320
5321 wrqu->data.length = strlen(extra)+1;
5322 break;
5323 }
5324 case WE_GET_RX_RSSI:
5325 {
5326 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5327
5328 if(status != VOS_STATUS_SUCCESS)
5329 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005330 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005331 return -EINVAL;
5332 }
5333
5334 wrqu->data.length = strlen(extra)+1;
5335 break;
5336 }
5337 default:
5338 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005339 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005340 break;
5341 }
5342 }
5343
5344 return 0;
5345}
Jeff Johnson295189b2012-06-20 16:38:30 -07005346
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305347static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5348 union iwreq_data *wrqu, char *extra)
5349{
5350 int ret;
5351
5352 vos_ssr_protect(__func__);
5353 ret = __iw_ftm_get_char_setnone(dev, info, wrqu, extra);
5354 vos_ssr_unprotect(__func__);
5355
5356
5357 return ret;
5358}
5359
Jeff Johnson295189b2012-06-20 16:38:30 -07005360VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5361{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005362#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005363 tAniHdr *wmsg = NULL;
5364 v_U8_t *pBuf;
5365 hdd_context_t *pHddCtx = NULL;
5366 v_CONTEXT_t pVosContext= NULL;
5367
5368 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5369 if(pBuf == NULL)
5370 {
5371 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5372 return VOS_STATUS_E_NOMEM;
5373 }
5374 wmsg = (tAniHdr*)pBuf;
5375 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5376 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5377 wmsg->length = FTM_SWAP16(wmsg->length);
5378 pBuf += sizeof(tAniHdr);
5379
5380 /*Get the global context */
5381 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5382
5383 /*Get the Hdd Context */
5384 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5385 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5386
5387 /* EfS command Code */
5388 *(v_U32_t*)pBuf = 0x000000EF;
5389
5390 pBuf += sizeof(v_U32_t);
5391
5392 memcpy(pBuf, pData,data_len);
5393
5394 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305395 if( ptt_sock_send_msg_to_app(wmsg, 0,
5396 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005397
Arif Hussain6d2a3322013-11-17 19:50:10 -08005398 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 -07005399 vos_mem_free((v_VOID_t*)wmsg);
5400 return VOS_STATUS_E_FAILURE;
5401 }
5402 }
5403 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305404 if( ptt_sock_send_msg_to_app(wmsg, 0,
5405 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005406
Arif Hussain6d2a3322013-11-17 19:50:10 -08005407 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 -07005408 vos_mem_free((v_VOID_t*)wmsg);
5409 return VOS_STATUS_E_FAILURE;
5410 }
5411 }
5412
5413 vos_mem_free((v_VOID_t*)wmsg);
5414#endif //FTM and ANDROID
5415
5416 return VOS_STATUS_SUCCESS;
5417}
5418
Jeff Johnson295189b2012-06-20 16:38:30 -07005419/* action sub-ioctls */
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305420static int __iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
Jeff Johnson295189b2012-06-20 16:38:30 -07005421 union iwreq_data *wrqu, char *extra)
5422{
5423 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005424 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005425
5426 switch (sub_cmd)
5427 {
5428 case WE_SET_NV_DEFAULTS:
5429 {
5430 v_U8_t *pu8buf,*pTempBuf;
5431 v_U16_t size;
5432 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005433 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005434 pu8buf = vos_mem_malloc(size);
5435 if(pu8buf == NULL)
5436 {
5437 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5438 return VOS_STATUS_E_NOMEM;
5439 }
5440 memset(pu8buf,0,size);
5441 pTempBuf = pu8buf;
5442 pTempBuf += sizeof(v_U32_t);
5443 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5444
5445 wlan_write_to_efs(pu8buf,size);
5446 vos_mem_free(pu8buf);
5447 }
5448
5449 default:
5450 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005451 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005452 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5453 break;
5454 }
5455 }
5456
5457 return ret;
5458}
5459
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305460static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5461 union iwreq_data *wrqu, char *extra)
5462{
5463 int ret;
5464
5465 vos_ssr_protect(__func__);
5466 ret = __iw_ftm_setnone_getnone(dev, info, wrqu, extra);
5467 vos_ssr_unprotect(__func__);
5468
5469 return ret;
5470}
5471
5472static int __iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305473 union iwreq_data *wrqu, char *extra)
5474{
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305475 hdd_adapter_t *pAdapter;
5476 hdd_context_t *pHddCtx;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305477 int sub_cmd = wrqu->data.flags;
5478 int *value = (int*)wrqu->data.pointer;
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305479 int ret = 0;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305480
5481 if(wrqu->data.length != 2)
5482 {
5483 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5484 return -EINVAL;
5485 }
Mahesh A Saptasagar74088392015-02-05 17:22:09 +05305486 pAdapter = (netdev_priv(dev));
5487 if (NULL == pAdapter)
5488 {
5489 hddLog(VOS_TRACE_LEVEL_ERROR,
5490 "%s: Adapter is NULL",__func__);
5491 return -EINVAL;
5492 }
5493 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
5494 ret = wlan_hdd_validate_context(pHddCtx);
5495 if (0 != ret)
5496 {
5497 hddLog(VOS_TRACE_LEVEL_ERROR,
5498 "%s: HDD context is not valid",__func__);
5499 return ret;
5500 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305501 switch (sub_cmd)
5502 {
5503 case WE_SET_TX_WF_GAIN:
5504 {
5505 v_S15_t dGain = 0;
5506 v_U16_t rfGain = 0;
5507 VOS_STATUS status;
5508
5509 dGain = *(v_S15_t*) value++;
5510 rfGain = *(v_U16_t*) value;
5511 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5512
5513 if(status != VOS_STATUS_SUCCESS)
5514 {
5515 hddLog(VOS_TRACE_LEVEL_FATAL,
5516 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5517 return -EINVAL;
5518 }
5519 }
5520 break;
5521
5522 default:
5523 {
5524 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5525 break;
5526 }
5527 }
5528
5529 return 0;
5530}
5531
5532
Mahesh A Saptasagard68eb282014-12-17 14:20:19 +05305533static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5534 union iwreq_data *wrqu, char *extra)
5535{
5536 int ret;
5537
5538 vos_ssr_protect(__func__);
5539 ret = __iw_ftm_set_var_ints_getnone(dev, info, wrqu, extra);
5540 vos_ssr_unprotect(__func__);
5541
5542 return ret;
5543}
5544
Jeff Johnson295189b2012-06-20 16:38:30 -07005545static const iw_handler we_ftm_private[] = {
5546
5547 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5548 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5549 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5550 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5551 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305552 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005553};
5554
5555/*Maximum command length can be only 15 */
5556static const struct iw_priv_args we_ftm_private_args[] = {
5557
5558 /* handlers for main ioctl */
5559 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5560 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5561 0,
5562 "" },
5563
5564 { WE_FTM_ON_OFF,
5565 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5566 0,
5567 "ftm" },
5568
5569 { WE_TX_PKT_GEN,
5570 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5571 0,
5572 "tx" },
5573
5574 { WE_SET_TX_IFS,
5575 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5576 0,
5577 "set_txifs" },
5578
5579 { WE_SET_TX_PKT_CNT,
5580 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5581 0,
5582 "set_txpktcnt" },
5583
5584 { WE_SET_TX_PKT_LEN,
5585 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5586 0,
5587 "set_txpktlen" },
5588
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305589 { WE_SET_TX_WF_GAIN,
5590 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5591 0,
5592 "set_tx_wf_gain" },
5593
5594 { WE_TX_CW_RF_GEN,
5595 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5596 0,
5597 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005598 { WE_SET_CHANNEL,
5599 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5600 0,
5601 "set_channel" },
5602
5603 { WE_SET_TX_POWER,
5604 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5605 0,
5606 "set_txpower" },
5607
5608 { WE_CLEAR_RX_PKT_CNT,
5609 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5610 0,
5611 "clr_rxpktcnt" },
5612
5613 { WE_RX,
5614 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5615 0,
5616 "rx" },
5617
5618 { WE_ENABLE_CHAIN,
5619 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5620 0,
5621 "ena_chain" },
5622
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305623 { WE_SET_PWR_CNTL_MODE,
5624 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5625 0,
5626 "pwr_cntl_mode" },
5627
5628 { WE_ENABLE_DPD,
5629 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5630 0,
5631 "ena_dpd" },
5632
5633 { WE_SET_CB,
5634 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5635 0,
5636 "set_cb" },
5637
Jeff Johnson295189b2012-06-20 16:38:30 -07005638 /* handlers for main ioctl */
5639 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5640 0,
5641 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5642 "" },
5643
5644 { WE_GET_CHANNEL,
5645 0,
5646 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5647 "get_channel" },
5648
5649 { WE_GET_TX_POWER,
5650 0,
5651 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5652 "get_txpower" },
5653
5654 { WE_GET_RX_PKT_CNT,
5655 0,
5656 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5657 "get_rxpktcnt" },
5658
5659 /* handlers for main ioctl */
5660 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5661 IW_PRIV_TYPE_CHAR| 512,
5662 0,
5663 "" },
5664
5665 { WE_SET_MAC_ADDRESS,
5666 IW_PRIV_TYPE_CHAR| 512,
5667 0,
5668 "set_mac_address" },
5669
5670 { WE_SET_TX_RATE,
5671 IW_PRIV_TYPE_CHAR | 512,
5672 0,
5673 "set_txrate" },
5674
5675 /* handlers for main ioctl */
5676 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5677 0,
5678 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5679 "" },
5680
5681 { WE_GET_MAC_ADDRESS,
5682 0,
5683 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5684 "get_mac_address" },
5685
Jeff Johnson295189b2012-06-20 16:38:30 -07005686 { WE_GET_TX_RATE,
5687 0,
5688 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5689 "get_txrate" },
5690
5691 { WE_GET_FTM_STATUS,
5692 0,
5693 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5694 "get_status" },
5695
5696 { WE_GET_RX_RSSI,
5697 0,
5698 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5699 "get_rx_rssi" },
5700
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305701 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5702 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5703 0,
5704 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005705 /* handlers for main ioctl */
5706 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5707 0,
5708 0,
5709 "" },
5710
5711 /* handlers for sub-ioctl */
5712 { WE_SET_NV_DEFAULTS,
5713 0,
5714 0,
5715 "set_nv_defaults" },
5716
5717};
5718
5719const struct iw_handler_def we_ftm_handler_def = {
5720 .num_standard = 0,
5721 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5722 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5723
5724 .standard = (iw_handler *)NULL,
5725 .private = (iw_handler *)we_ftm_private,
5726 .private_args = we_ftm_private_args,
5727 .get_wireless_stats = NULL,
5728};
5729
5730static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5731{
5732
5733 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5734
5735 // Zero the memory. This zeros the profile structure.
5736 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005737
Jeff Johnson295189b2012-06-20 16:38:30 -07005738 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5739
5740 return 0;
5741}
5742
Jeff Johnson295189b2012-06-20 16:38:30 -07005743
5744VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5745{
Jeff Johnson295189b2012-06-20 16:38:30 -07005746 ftm_rsp_msg_t *pFtmMsgRsp;
5747
5748 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5749 hdd_context_t *pHddCtx;
5750 v_CONTEXT_t pVosContext= NULL;
5751
5752 ENTER();
5753
5754 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5755
5756 if (!message )
5757 {
5758 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5759 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5760 return VOS_STATUS_E_INVAL;
5761 }
5762 /*Get the global context */
5763 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5764
5765 /*Get the Hdd Context */
5766 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5767
5768 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5769
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305770 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005771 complete(&pHddCtx->ftm.ftm_comp_var);
5772 }
5773 else {
5774 /*Response length to Ptt App*/
5775 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5776
5777 /*Ptt App expects the response length in LE */
5778 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5779
5780 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005781 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005782 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5783
5784 /*Copy the message*/
5785 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5786
5787 /*Update the error code*/
5788 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5789
5790 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5791
5792 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5793 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005794 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005795 return VOS_STATUS_E_FAILURE;
5796 }
5797 }
5798 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005799 return VOS_STATUS_SUCCESS;
5800
5801}