blob: df453875b7950f7233cc296c4f514e98ac4b7bcf [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lamaa8e15a2014-02-11 23:30:06 -08002 * Copyright (c) 2012-2013 Qualcomm Atheros, Inc.
3 * All Rights Reserved.
4 * Qualcomm Atheros Confidential and Proprietary.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08005 */
Jeff Johnson295189b2012-06-20 16:38:30 -07006/**========================================================================
7
8 \file wlan_hdd_ftm.c
9
10 \brief This file contains the WLAN factory test mode implementation
11
12 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
13
14 Qualcomm Confidential and Proprietary.
15
16 ========================================================================*/
17
18/**=========================================================================
19
20 EDIT HISTORY FOR FILE
21
22
23 This section contains comments describing changes made to the module.
24 Notice that changes are listed in reverse chronological order.
25
26
27 $Header:$ $DateTime: $ $Author: $
28
29
30 when who what, where, why
31 -------- --- --------------------------------------------------------
32 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
33 for FTM and mission mode
34 04/5/09 Shailender Created module.
35
36 ==========================================================================*/
37#include <vos_mq.h>
38#include "vos_sched.h"
39#include <vos_api.h>
40#include "sirTypes.h"
41#include "halTypes.h"
42#include "sirApi.h"
43#include "sirMacProtDef.h"
44#include "sme_Api.h"
45#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070046#include "wlan_qct_sys.h"
47#include "wlan_qct_tl.h"
48#include "wlan_hdd_misc.h"
49#include "i_vos_packet.h"
50#include "vos_nvitem.h"
51#include "wlan_hdd_main.h"
52#include "vos_power.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070053#include "qwlan_version.h"
54
Jeff Johnson295189b2012-06-20 16:38:30 -070055#include "wlan_nv.h"
56#include "wlan_qct_wda.h"
57#include "cfgApi.h"
58#include "pttMsgApi.h"
59#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070060
Jeff Johnson295189b2012-06-20 16:38:30 -070061#define RXMODE_DISABLE_ALL 0
62#define RXMODE_ENABLE_ALL 1
63#define RXMODE_ENABLE_11GN 2
64#define RXMODE_ENABLE_11B 3
65
66#define FTM_CHAIN_SEL_NO_RX_TX 0
67#define FTM_CHAIN_SEL_R0_ON 1
68#define FTM_CHAIN_SEL_T0_ON 2
69#define FTM_CHAIN_SEL_R0_T0_ON 3
70#define FTM_CHAIN_SEL_MAX 3
71
Jeff Johnson295189b2012-06-20 16:38:30 -070072#ifndef QWLAN_PHYDBG_BASE
73#define QWLAN_PHYDBG_BASE 0x03004000
74#endif /* QWLAN_PHYDBG_BASE */
75
76#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -080077#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -070078#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
79#endif
80
81#ifndef QWLAN_AGC_BASE
82#define QWLAN_AGC_BASE 0x03013C00
83#endif /* QWLAN_AGC_BASE */
84
85#ifndef QWLAN_AGC_CHANNEL_FREQ_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -080086#define QWLAN_AGC_CHANNEL_FREQ_REG (QWLAN_AGC_BASE + 0x34)
Jeff Johnson295189b2012-06-20 16:38:30 -070087#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
88#endif /* QWLAN_AGC_CHANNEL_FREQ_REG */
89
90#ifndef QWLAN_AGC_SUBBAND_CONFIG_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -080091#define QWLAN_AGC_SUBBAND_CONFIG_REG (QWLAN_AGC_BASE + 0x30)
Jeff Johnson295189b2012-06-20 16:38:30 -070092#define QWLAN_AGC_SUBBAND_CONFIG_STG2_SUBBAND_MASK 0x03
93#endif /* QWLAN_AGC_SUBBAND_CONFIG_REG */
94
95#ifndef QWLAN_RFAPB_BASE
96#define QWLAN_RFAPB_BASE 0x0E02F800
97#endif /* QWLAN_RFAPB_BASE */
98
99#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800100#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700101#endif /* QWLAN_RFAPB_REV_ID_REG */
102
103#ifndef QWLAN_TXCTL_BASE
104#define QWLAN_TXCTL_BASE 0x03012000
105#endif /* QWLAN_TXCTL_BASE */
106
107#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800108#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700109#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
110#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
111#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
112#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
113#endif /* QWLAN_TXCTL_FSHIFT_REG */
114
115/* To set 4MAC addresses from given first MAC address,
116 * Last byte value within given MAC address must less than 0xFF - 3 */
117#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700118#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700119
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530120#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
121
Jeff Johnson295189b2012-06-20 16:38:30 -0700122typedef struct {
123 tANI_U32 tableSize; /* Whole NV Table Size */
124 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
125 eNvTable nvTable;
126 tANI_U8 tableData; /* Filled by host driver */
127} pttGetNvTable;
128
129typedef struct {
130 tANI_U32 tableSize; /* Whole NV Table Size */
131 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
132 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700133 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700134} pttSetNvTable;
135
Jeff Johnson295189b2012-06-20 16:38:30 -0700136
137extern const sHalNv nvDefaults;
138static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700139static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700140VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700141
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700142/* 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 -0700143 Since it is associated to agc.channel_freq register for mapping.
144 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
145*/
146static const freq_chan_t freq_chan_tbl[] = {
147 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
148 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
149};
150
151static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
152{
153 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
154 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
155 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
156 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
157 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
158 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
159 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
160 //Spica_Virgo 11A 20MHz Rates
161 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
162 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
163 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
164 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
165 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
166 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
167 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
168 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
169
170//MCS Index #0-15 (20MHz)
171 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
172 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
173 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
174 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
175 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
176 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
177 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
178 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530179 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_72_2_MBPS"},
180
181//MCS Index #8-15 (40MHz)
182
183 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_B_MBPS" },
184 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
185 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
186 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
187 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
188 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
189 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
190 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
191 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
192 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
193 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
194 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
195 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
196 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
197 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800198 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530199
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800200#ifdef WLAN_FEATURE_11AC
201 /*11AC rate 20MHZ Normal GI*/
202 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
203 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
204 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
205 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
206 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
207 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
208 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
209 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
210 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530211#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800212 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530213#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800214
215 /*11AC rate 20MHZ Short GI*/
216 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
217 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
218 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
219 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
220 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
221 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
222 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
223 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
224 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530225#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800226 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530227#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800228
229 /*11AC rates 40MHZ normal GI*/
230 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
231 "MCS_VHT40_NGI_CB_13_5_MBPS"},
232 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
233 "MCS_VHT40_NGI_CB_27_MBPS"},
234 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
235 "MCS_VHT40_NGI_CB_40_5_MBPS"},
236 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
237 "MCS_VHT40_NGI_CB_54_MBPS"},
238 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
239 "MCS_VHT40_NGI_CB_81_MBPS"},
240 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
241 "MCS_VHT40_NGI_CB_108_MBPS"},
242 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
243 "MCS_VHT40_NGI_CB_121_5_MBPS"},
244 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
245 "MCS_VHT40_NGI_CB_135_MBPS"},
246 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
247 "MCS_VHT40_NGI_CB_162_MBPS"},
248 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
249 "MCS_VHT40_NGI_CB_180_MBPS"},
250
251 /*11AC rates 40MHZ short GI*/
252 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
253 "MCS_VHT40_SGI_CB_15_MBPS"},
254 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
255 "MCS_VHT40_SGI_CB_30_MBPS"},
256 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
257 "MCS_VHT40_SGI_CB_45_MBPS"},
258 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
259 "MCS_VHT40_SGI_CB_60_MBPS"},
260 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
261 "MCS_VHT40_SGI_CB_90_MBPS"},
262 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
263 "MCS_VHT40_SGI_CB_120_MBPS"},
264 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
265 "MCS_VHT40_SGI_CB_135_MBPS"},
266 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
267 "MCS_VHT40_SGI_CB_150_MBPS"},
268 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
269 "MCS_VHT40_SGI_CB_180_MBPS"},
270 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
271 "MCS_VHT40_SGI_CB_200_MBPS"},
272
273 /*11AC rates 80 MHZ normal GI*/
274 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
275 "MCS_VHT80_NGI_CB_29_3_MBPS"},
276 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
277 "MCS_VHT80_NGI_CB_58_5_MBPS"},
278 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
279 "MCS_VHT80_NGI_CB_87_8_MBPS"},
280 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
281 "MCS_VHT80_NGI_CB_117_MBPS"},
282 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
283 "MCS_VHT80_NGI_CB_175_5_MBPS"},
284 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
285 "MCS_VHT80_NGI_CB_234_MBPS"},
286 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
287 "MCS_VHT80_NGI_CB_263_3_MBPS"},
288 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
289 "MCS_VHT80_NGI_CB_292_5_MBPS"},
290 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
291 "MCS_VHT80_NGI_CB_351_MBPS"},
292 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
293 "MCS_VHT80_NGI_CB_390_MBPS"},
294
295 /*11AC rates 80 MHZ short GI*/
296 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
297 "MCS_VHT80_SGI_CB_32_5_MBPS"},
298 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
299 "MCS_VHT80_SGI_CB_65_MBPS"},
300 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
301 "MCS_VHT80_SGI_CB_97_5_MBPS"},
302 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
303 "MCS_VHT80_SGI_CB_130_MBPS"},
304 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
305 "MCS_VHT80_SGI_CB_195_MBPS"},
306 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
307 "MCS_VHT80_SGI_CB_260_MBPS"},
308 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
309 "MCS_VHT80_SGI_CB_292_5_MBPS"},
310 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
311 "MCS_VHT80_SGI_CB_325_MBPS"},
312 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
313 "MCS_VHT80_SGI_CB_390_MBPS"},
314 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
315 "MCS_VHT80_SGI_CB_433_3_MBPS"},
316#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700317};
318
319static rateIndex2Preamble_t rate_index_2_preamble_table[] =
320{
321
322 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
323 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
324 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
325 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
326 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
327 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
328 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
329
Jeff Johnson295189b2012-06-20 16:38:30 -0700330
331 //Spica_Virgo 11A 20MHz Rates
332 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
333 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
334 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
335 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
336 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
337 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
338 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
339 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
340
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530341 // 11A 20MHz Rates
342 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
343 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
344 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
345 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
346 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
347 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
348 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
349 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
350
Jeff Johnson295189b2012-06-20 16:38:30 -0700351 //MCS Index #0-15 (20MHz)
352 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
353 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
354 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
355 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
356 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
357 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
358 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
359 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
360 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
361 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
362 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
363 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
364 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
365 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
366 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
367 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530368
369 //MCS index (40MHz)
370 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
371 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
372 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
373 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
374 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
375 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
376 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
377 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
378 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
379 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
380 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
381 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
382 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
383 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800385 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530386
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800387#ifdef WLAN_FEATURE_11AC
388 /*11AC rate 20MHZ Normal GI*/
389 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
390 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
391 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
392 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
393 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
394 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
395 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
396 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
397 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530398#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800399 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530400#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800401 /*11AC rate 20MHZ Short GI*/
402 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
409 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
410 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530411#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800412 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530413#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800414
415 /*11AC rates 40MHZ normal GI*/
416 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
419 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
420 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
422 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
423 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
424 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
425 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
426
427 /*11AC rates 40MHZ short GI*/
428 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
431 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
432 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
433 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
435 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
436 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
437 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
438
439 /*11AC rates 80 MHZ normal GI*/
440 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
443 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
444 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
445 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
450
451 /*11AC rates 80 MHZ short GI*/
452 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
457 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
458 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
459 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
462#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700463};
464
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530465static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
466 11, 12, 13, 14, 36, 40, 44, 48,
467 52, 56, 60, 64, 100, 104, 108,
468 112, 116, 120, 124, 128, 132,
469 136, 140, 149, 153, 157, 161,
470 165, 208, 212, 216, 240, 244,
471 248, 252, 0 };
472static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
473 42, 46, 50, 54, 58, 62, 102, 106,
474 110, 114, 118, 122, 126, 130, 134,
475 138, 151, 155, 159, 163, 210, 214,
476 242, 246, 250, 0 };
477static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
478 114, 118, 122, 126, 130, 134, 155,
479 159, 246, 0 };
480
Jeff Johnson295189b2012-06-20 16:38:30 -0700481typedef struct
482{
483 tANI_BOOLEAN frameGenEnabled;
484 tANI_BOOLEAN wfmEnabled;
485 sPttFrameGenParams frameParams;
486 v_U16_t txpower;
487 v_U16_t rxmode;
488 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530489 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700490
491} FTM_STATUS ;
492static FTM_STATUS ftm_status;
493
494//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530495static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700496
497static void _ftm_status_init(void)
498{
499 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
500 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
501 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
502
503 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
504 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
505 ftm_status.frameParams.numTestPackets = 0; //Continuous
506 ftm_status.frameParams.interFrameSpace = 10;
507 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
508 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
509 ftm_status.frameParams.payloadLength = 2000;
510 ftm_status.frameParams.payloadFillByte = 0xA5;
511 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
512 ftm_status.frameParams.tx_mode = 0;
513 ftm_status.frameParams.crc = 0;
514 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
515 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
516 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
517 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
518 ftm_status.txpower = 2 ;
519 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
520 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530521 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700522
523 return;
524}
525
526/**---------------------------------------------------------------------------
527
528 \brief wlan_ftm_postmsg() -
529
530 The function used for sending the command to the halphy.
531
532 \param - cmd_ptr - Pointer command buffer.
533
534 \param - cmd_len - Command length.
535
536 \return - 0 for success, non zero for failure
537
538 --------------------------------------------------------------------------*/
539
540static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
541{
542 vos_msg_t *ftmReqMsg;
543 vos_msg_t ftmMsg;
544 ENTER();
545
546 ftmReqMsg = (vos_msg_t *) cmd_ptr;
547
Jeff Johnson295189b2012-06-20 16:38:30 -0700548 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700549 ftmMsg.reserved = 0;
550 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
551 ftmMsg.bodyval = 0;
552
553 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700554 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700555 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700556 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800557 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700558
559 return VOS_STATUS_E_FAILURE;
560 }
561
562 EXIT();
563 return VOS_STATUS_SUCCESS;
564}
565
566/*---------------------------------------------------------------------------
567
568 \brief wlan_ftm_vos_open() - Open the vOSS Module
569
570 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
571 Upon successful initialization:
572
573 - All VOS submodules should have been initialized
574
575 - The VOS scheduler should have opened
576
577 - All the WLAN SW components should have been opened. This include
578 MAC.
579
580
581 \param hddContextSize: Size of the HDD context to allocate.
582
583
584 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
585 is ready to be used.
586
587 VOS_STATUS_E_RESOURCES - System resources (other than memory)
588 are unavailable to initialize the scheduler
589
590
591 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
592
593 \sa wlan_ftm_vos_open()
594
595---------------------------------------------------------------------------*/
596static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_SIZE_t hddContextSize )
597{
598 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
599 int iter = 0;
600 tSirRetStatus sirStatus = eSIR_SUCCESS;
601 tMacOpenParameters macOpenParms;
602 pVosContextType gpVosContext = (pVosContextType)pVosContext;
603
604 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
605 "%s: Opening VOSS", __func__);
606
607 if (NULL == gpVosContext)
608 {
609 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
610 "%s: Trying to open VOSS without a PreOpen",__func__);
611 VOS_ASSERT(0);
612 return VOS_STATUS_E_FAILURE;
613 }
614
615 /* Initialize the probe event */
616 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
617 {
618 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
619 "%s: Unable to init probeEvent",__func__);
620 VOS_ASSERT(0);
621 return VOS_STATUS_E_FAILURE;
622 }
623
Jeff Johnson295189b2012-06-20 16:38:30 -0700624 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
625 {
626 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
627 "%s: Unable to init wdaCompleteEvent",__func__);
628 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700629
Jeff Johnson295189b2012-06-20 16:38:30 -0700630 goto err_probe_event;
631 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700632
633 /* Initialize the free message queue */
634 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
635 if (! VOS_IS_STATUS_SUCCESS(vStatus))
636 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700637 /* Critical Error ... Cannot proceed further */
638 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530639 "%s: Failed to initialize VOS free message queue %d",
640 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700641 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700642 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700643 }
644
645 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
646 {
647 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
648 &(gpVosContext->aMsgBuffers[iter]);
649 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
650 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
651 }
652
653 /* Now Open the VOS Scheduler */
654 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
655 sizeof(VosSchedContext));
656
657 if (!VOS_IS_STATUS_SUCCESS(vStatus))
658 {
659 /* Critical Error ... Cannot proceed further */
660 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530661 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700662 VOS_ASSERT(0);
663 goto err_msg_queue;
664 }
665
666 /* Open the SYS module */
667 vStatus = sysOpen(gpVosContext);
668
669 if (!VOS_IS_STATUS_SUCCESS(vStatus))
670 {
671 /* Critical Error ... Cannot proceed further */
672 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530673 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700674 VOS_ASSERT(0);
675 goto err_sched_close;
676 }
677
Jeff Johnson295189b2012-06-20 16:38:30 -0700678 /*Open the WDA module */
679 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
680 macOpenParms.driverType = eDRIVER_TYPE_MFG;
681 vStatus = WDA_open(gpVosContext, gpVosContext->pHDDContext, &macOpenParms);
682 if (!VOS_IS_STATUS_SUCCESS(vStatus))
683 {
684 /* Critical Error ... Cannot proceed further */
685 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530686 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700687 VOS_ASSERT(0);
688 goto err_sys_close;
689 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700690
691 /* initialize the NV module */
692 vStatus = vos_nv_open();
693 if (!VOS_IS_STATUS_SUCCESS(vStatus))
694 {
695 // NV module cannot be initialized, however the driver is allowed
696 // to proceed
697 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530698 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700699 goto err_wda_close;
700 }
701
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700702 vStatus = vos_nv_get_dictionary_data();
703
704 if (!VOS_IS_STATUS_SUCCESS(vStatus))
705 {
706 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530707 "%s : failed to get dictionary data for NV %d",
708 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700709 goto err_wda_close;
710 }
711
Jeff Johnson295189b2012-06-20 16:38:30 -0700712 /* If we arrive here, both threads dispacthing messages correctly */
713
714 /* Now proceed to open the MAC */
715
716 /* UMA is supported in hardware for performing the
717 frame translation 802.11 <-> 802.3 */
718 macOpenParms.frameTransRequired = 1;
719 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
720 &macOpenParms);
721
722 if (eSIR_SUCCESS != sirStatus)
723 {
724 /* Critical Error ... Cannot proceed further */
725 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530726 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700727 VOS_ASSERT(0);
728 goto err_nv_close;
729 }
730
Jeff Johnson295189b2012-06-20 16:38:30 -0700731 /* Now proceed to open the SME */
732 vStatus = sme_Open(gpVosContext->pMACContext);
733 if (!VOS_IS_STATUS_SUCCESS(vStatus))
734 {
735 /* Critical Error ... Cannot proceed further */
736 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530737 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700738 goto err_mac_close;
739 }
740 return VOS_STATUS_SUCCESS;
741
Jeff Johnson295189b2012-06-20 16:38:30 -0700742
743 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
744 "%s: VOSS successfully Opened",__func__);
745
746 return VOS_STATUS_SUCCESS;
747err_mac_close:
748 macClose(gpVosContext->pMACContext);
749
750err_nv_close:
751 vos_nv_close();
752
753err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700754 WDA_close(gpVosContext);
755
756err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700757 sysClose(gpVosContext);
758
759err_sched_close:
760 vos_sched_close(gpVosContext);
761err_msg_queue:
762 vos_mq_deinit(&gpVosContext->freeVosMq);
763
Jeff Johnson295189b2012-06-20 16:38:30 -0700764err_wda_complete_event:
765 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700766
767err_probe_event:
768 vos_event_destroy(&gpVosContext->ProbeEvent);
769
770 return VOS_STATUS_E_FAILURE;
771
772} /* wlan_ftm_vos_open() */
773
774/*---------------------------------------------------------------------------
775
776 \brief wlan_ftm_vos_close() - Close the vOSS Module
777
778 The \a wlan_ftm_vos_close() function closes the vOSS Module
779
780 \param vosContext context of vos
781
782 \return VOS_STATUS_SUCCESS - successfully closed
783
784 \sa wlan_ftm_vos_close()
785
786---------------------------------------------------------------------------*/
787
788static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
789{
790 VOS_STATUS vosStatus;
791 pVosContextType gpVosContext = (pVosContextType)vosContext;
792
Jeff Johnson295189b2012-06-20 16:38:30 -0700793 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
794 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
795 {
796 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530797 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700798 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
799 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700800
801 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
802 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
803 {
804 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530805 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700806 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
807 }
808
809 ((pVosContextType)vosContext)->pMACContext = NULL;
810
811 vosStatus = vos_nv_close();
812 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
813 {
814 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530815 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700816 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
817 }
818
819
820 vosStatus = sysClose( vosContext );
821 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
822 {
823 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530824 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700825 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
826 }
827
Jeff Johnson295189b2012-06-20 16:38:30 -0700828 vosStatus = WDA_close( vosContext );
829 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
830 {
831 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530832 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700833 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
834 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700835
836 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
837
838 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
839 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
840 {
841 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530842 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700843 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
844 }
845
Jeff Johnson295189b2012-06-20 16:38:30 -0700846 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
847 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
848 {
849 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530850 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
852 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700853
854 return VOS_STATUS_SUCCESS;
855}
856
857/**---------------------------------------------------------------------------
858
859 \brief wlan_ftm_priv_set_txifs() -
860
861 This function is used for
862
863 \param - pAdapter - Pointer HDD Context.
864 - ifs
865
866 \return - 0 for success, non zero for failure
867
868 --------------------------------------------------------------------------*/
869
870
871
872static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
873{
874 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
875 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
876 {
877 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
878 return VOS_STATUS_E_FAILURE;
879 }
880
881 /* do not allow to change setting when tx pktgen is enabled */
882 if (ftm_status.frameGenEnabled)
883 {
884 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
885 return VOS_STATUS_E_FAILURE;
886 }
887
888 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
889 {
c_hpothuffdb5272013-10-02 16:42:35 +0530890 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
891 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700892 return VOS_STATUS_E_FAILURE;
893 }
894
895 ftm_status.frameParams.interFrameSpace = ifs;
896
897 return VOS_STATUS_SUCCESS;
898}
899
900/**---------------------------------------------------------------------------
901
902 \brief wlan_ftm_priv_set_txpktcnt() -
903
904 This function is used for
905
906 \param - pAdapter - Pointer HDD Context.
907 - ifs
908
909 \return - 0 for success, non zero for failure
910
911 --------------------------------------------------------------------------*/
912
913static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
914{
915 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
916 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
917 {
918 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
919 return VOS_STATUS_E_FAILURE;
920 }
921
922 /* do not allow to change setting when tx pktgen is enabled */
923 if (ftm_status.frameGenEnabled)
924 {
925 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
926 return VOS_STATUS_E_FAILURE;
927 }
928
929 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
930 {
c_hpothuffdb5272013-10-02 16:42:35 +0530931 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
932 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700933 return VOS_STATUS_E_FAILURE;
934 }
935
936 ftm_status.frameParams.numTestPackets = cnt;
937
938 return VOS_STATUS_SUCCESS;
939}
940
941static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
942{
943 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
944 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
945 {
946 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
947 return VOS_STATUS_E_FAILURE;
948 }
949
950 /* do not allow to change setting when tx pktgen is enabled */
951 if (ftm_status.frameGenEnabled)
952 {
953 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
954 return VOS_STATUS_E_FAILURE;
955 }
956
957 if (len > 4095) //4096
958 {
c_hpothuffdb5272013-10-02 16:42:35 +0530959 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
960 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700961 return VOS_STATUS_E_FAILURE;
962 }
963
964 ftm_status.frameParams.payloadLength = (tANI_U16)len;
965
966 return VOS_STATUS_SUCCESS;
967}
968
Jeff Johnson295189b2012-06-20 16:38:30 -0700969
970static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
971{
Jeff Johnson295189b2012-06-20 16:38:30 -0700972 uPttMsgs *pMsgBody;
973 VOS_STATUS status;
974 v_U16_t chainSelect_save = chainSelect;
975 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +0530976 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -0700977
978 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
979 {
980 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
981 return VOS_STATUS_E_FAILURE;
982 }
983
984 if (chainSelect > FTM_CHAIN_SEL_MAX)
985 {
c_hpothuffdb5272013-10-02 16:42:35 +0530986 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
987 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -0700988 return VOS_STATUS_E_FAILURE;
989 }
990
991 /* do not allow to change setting when tx pktgen is enabled */
992 if (ftm_status.frameGenEnabled)
993 {
994 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
995 return VOS_STATUS_E_FAILURE;
996 }
997
998 switch (chainSelect)
999 {
1000 case FTM_CHAIN_SEL_NO_RX_TX:
1001 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1002 break;
1003
1004 case FTM_CHAIN_SEL_R0_ON:
1005 chainSelect = PHY_CHAIN_SEL_R0_ON;
1006 break;
1007
1008 case FTM_CHAIN_SEL_T0_ON:
1009 chainSelect = PHY_CHAIN_SEL_T0_ON;
1010 break;
1011 }
1012
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301013 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001014 init_completion(&pHddCtx->ftm.ftm_comp_var);
1015 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1016 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1017
1018 pMsgBody = &pMsgBuf->msgBody;
1019 pMsgBody->EnableChains.chainSelect = chainSelect;
1020
1021 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1022
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301023 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001024 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301025 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1026 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001027 status = VOS_STATUS_E_FAILURE;
1028 goto done;
1029 }
c_hpothuffdb5272013-10-02 16:42:35 +05301030 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301031 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301032 if (0 >= ret)
1033 {
1034 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1035 FL("wait on ftm_comp_var failed %ld"), ret);
1036 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001037
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301038 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001039 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301040 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1041 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001042 status = VOS_STATUS_E_FAILURE;
1043 goto done;
1044 }
1045 ftm_status.chainSelect = chainSelect_save;
1046done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001047
1048 return status;
1049}
1050
1051/**---------------------------------------------------------------------------
1052 --------------------------------------------------------------------------*/
1053static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1054{
1055 int ii;
1056 int lenBuf = WE_FTM_MAX_STR_LEN;
1057 int lenRes = 0;
1058 char *chain[] = {
1059 "None",
1060 "R0,R1",
1061 "R0",
1062 "R1",
1063 "T0",
1064 "R0,R1,T0"
1065 };
1066 char *rx[] = {
1067 "disable",
1068 "11b/g/n",
1069 "11g/n",
1070 "11b"
1071 };
1072 char *tx[] = {
1073 "stopped",
1074 "started",
1075 };
1076 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1077
1078 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1079 {
1080 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1081 return VOS_STATUS_E_FAILURE;
1082 }
1083
1084 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001085 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001086 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1087 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001088 ftm_status.frameParams.interFrameSpace);
1089 if ((lenRes < 0) || (lenRes >= lenBuf))
1090 {
c_hpothuffdb5272013-10-02 16:42:35 +05301091 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1092 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001093 return VOS_STATUS_E_FAILURE;
1094 }
1095
1096 buf += lenRes;
1097 lenBuf -= lenRes;
1098
1099 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1100 {
1101 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1102 break;
1103 }
1104
1105 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1106 {
1107 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1108 }
1109 else
1110 {
1111 lenRes = strlcpy(buf, "invalid", lenBuf);
1112 }
1113 if ((lenRes < 0) || (lenRes >= lenBuf))
1114 {
c_hpothuffdb5272013-10-02 16:42:35 +05301115 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1116 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001117 return VOS_STATUS_E_FAILURE;
1118 }
1119
1120 buf += lenRes;
1121 lenBuf -= lenRes;
1122
Jeff Johnson02797792013-10-26 19:17:13 -07001123 lenRes = snprintf(buf, lenBuf, "\n txpower: %d\n txpktcnt: %d\n "
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001124 "txpktlen: %d\n", ftm_status.txpower,
1125 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001126 ftm_status.frameParams.payloadLength);
1127
1128 if ((lenRes < 0) || (lenRes >= lenBuf))
1129 {
c_hpothuffdb5272013-10-02 16:42:35 +05301130 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1131 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001132 return VOS_STATUS_E_FAILURE;
1133 }
1134
1135 return VOS_STATUS_SUCCESS;
1136}
1137
Jeff Johnson295189b2012-06-20 16:38:30 -07001138
1139void HEXDUMP(char *s0, char *s1, int len)
1140{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301141 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001142 printk(KERN_EMERG "%s\n :", s0);
1143
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301144 if (len > 8)
1145 {
1146 for (j = 0; j < len/8; j++)
1147 {
1148 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1149 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1150 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1151 }
1152 len = len - j*8;
1153 }
1154 for (i = 0; i< len; i++) {
1155 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001156 }
1157 printk("\n");
1158}
1159
Jeff Johnson295189b2012-06-20 16:38:30 -07001160/*---------------------------------------------------------------------------
1161
1162 \brief vos_ftm_preStart() -
1163
1164 The \a vos_ftm_preStart() function to download CFG.
1165 including:
1166 - ccmStart
1167
1168 - WDA: triggers the CFG download
1169
1170
1171 \param pVosContext: The VOS context
1172
1173
1174 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1175 is ready to be used.
1176
1177 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1178 are unavailable to initialize the scheduler
1179
1180
1181 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1182
1183 \sa vos_start
1184
1185---------------------------------------------------------------------------*/
1186VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1187{
1188 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1189 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001190
Jeff Johnson295189b2012-06-20 16:38:30 -07001191 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1192 "vos prestart");
1193
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001194 if (NULL == pVosContext->pWDAContext)
1195 {
1196 VOS_ASSERT(0);
1197 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1198 "%s: WDA NULL context", __func__);
1199 return VOS_STATUS_E_FAILURE;
1200 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001201
1202 /* call macPreStart */
1203 vStatus = macPreStart(pVosContext->pMACContext);
1204 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1205 {
1206 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1207 "Failed at macPreStart ");
1208 return VOS_STATUS_E_FAILURE;
1209 }
1210
1211 /* call ccmStart */
1212 ccmStart(pVosContext->pMACContext);
1213
1214 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001215 vos_event_reset(&pVosContext->wdaCompleteEvent);
1216
Jeff Johnson295189b2012-06-20 16:38:30 -07001217
1218 /*call WDA pre start*/
1219 vStatus = WDA_preStart(pVosContext);
1220 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1221 {
1222 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1223 "Failed to WDA prestart ");
1224 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1225 ccmStop(pVosContext->pMACContext);
1226 VOS_ASSERT(0);
1227 return VOS_STATUS_E_FAILURE;
1228 }
1229
1230 /* Need to update time out of complete */
1231 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1232 if ( vStatus != VOS_STATUS_SUCCESS )
1233 {
1234 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1235 {
1236 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001237 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001238 }
1239 else
1240 {
1241 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001242 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001243 }
1244 VOS_ASSERT( 0 );
1245 return VOS_STATUS_E_FAILURE;
1246 }
1247
1248 return VOS_STATUS_SUCCESS;
1249}
Jeff Johnson295189b2012-06-20 16:38:30 -07001250
1251/**---------------------------------------------------------------------------
1252
1253 \brief wlan_hdd_ftm_open() -
1254
1255 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1256
1257 \param - pAdapter - Pointer HDD Context.
1258
1259 \return - 0 for success, non zero for failure
1260
1261 --------------------------------------------------------------------------*/
1262
1263int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1264{
1265 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1266 pVosContextType pVosContext= NULL;
1267 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001268
Jeff Johnson295189b2012-06-20 16:38:30 -07001269 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1270 "%s: Opening VOSS", __func__);
1271
1272 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1273
1274 if (NULL == pVosContext)
1275 {
1276 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301277 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001278 VOS_ASSERT(0);
1279 goto err_vos_status_failure;
1280 }
1281
1282 // Open VOSS
1283 vStatus = wlan_ftm_vos_open( pVosContext, 0);
1284
1285 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1286 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301287 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001288 goto err_vos_status_failure;
1289 }
1290
Jeff Johnson295189b2012-06-20 16:38:30 -07001291 /*
1292 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1293 */
1294 /* Save the hal context in Adapter */
1295 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001296
1297 if ( NULL == pHddCtx->hHal )
1298 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301299 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001300 goto err_sal_close;
1301 }
1302
1303 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1304 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1305 if( NULL == pAdapter )
1306 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301307 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001308 goto err_adapter_open_failure;
1309 }
1310
1311 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1312 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301313 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001314 goto err_sal_close;
1315 }
1316
1317 //Initialize the nlink service
1318 if(nl_srv_init() != 0)
1319 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301320 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001321 goto err_ftm_register_wext_close;
1322 }
1323
Leo Chang9e646082013-08-02 11:20:21 -07001324#ifdef WLAN_KD_READY_NOTIFIER
1325 pHddCtx->kd_nl_init = 1;
1326#endif /* WLAN_KD_READY_NOTIFIER */
1327
Jeff Johnson295189b2012-06-20 16:38:30 -07001328#ifdef PTT_SOCK_SVC_ENABLE
1329 //Initialize the PTT service
1330 if(ptt_sock_activate_svc(pHddCtx) != 0)
1331 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301332 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001333 goto err_nl_srv_init;
1334 }
1335#endif
1336 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1337 {
1338 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1339 goto err_nl_srv_init;
1340 }
1341#ifdef HDD_SESSIONIZE
1342 //Turn off carrier state
1343 netif_carrier_off(pAdapter->dev);
1344
1345 //Stop the Interface TX queue. Just being safe
1346 netif_tx_disable(pAdapter->dev);
1347#endif
1348
Jeff Johnson295189b2012-06-20 16:38:30 -07001349 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1350 pHddCtx->ftm.targetNVTableSize = 0;
1351 pHddCtx->ftm.targetNVTablePointer = NULL;
1352 pHddCtx->ftm.processedNVTableSize = 0;
1353 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1354 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1355 {
1356 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301357 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001358 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001359 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001360 }
1361 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001362
1363 _ftm_status_init();
1364 /* Initialize the ftm vos event */
1365 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1366 {
1367 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301368 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001369 VOS_ASSERT(0);
1370 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1371 goto err_nl_srv_init;
1372 }
1373
1374 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1375
1376 return VOS_STATUS_SUCCESS;
1377
1378err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001379#ifdef WLAN_KD_READY_NOTIFIER
1380nl_srv_exit(pHddCtx->ptt_pid);
1381#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001382nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001383#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001384err_ftm_register_wext_close:
1385hdd_UnregisterWext(pAdapter->dev);
1386
1387err_adapter_open_failure:
1388hdd_close_all_adapters( pHddCtx );
1389
1390err_sal_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001391
1392err_vos_status_failure:
1393
1394 return VOS_STATUS_E_FAILURE;
1395}
1396
1397
1398
1399int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1400{
1401 VOS_STATUS vosStatus;
1402 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1403
1404 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1405 ENTER();
1406 if(pAdapter == NULL)
1407 {
1408 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1409 return VOS_STATUS_E_NOMEM;
1410 }
1411
Leo Chang4e8183f2013-05-31 15:38:34 -07001412 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1413 {
1414 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1415 "%s: Ftm has been started. stopping ftm", __func__);
1416 wlan_ftm_stop(pHddCtx);
1417 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001418
1419 //Assert Deep sleep signal now to put Libra HW in lowest power state
1420 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301421 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1422 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1423 "%s: Failed to assert deep sleep signal", __func__);
1424 VOS_ASSERT( 0 );
1425 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001426
1427 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301428 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1429 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1430 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1431 "%s: Failed to put HW into low power", __func__);
1432 VOS_ASSERT( 0 );
1433 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001434
1435 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1436
Leo Chang59cdc7e2013-07-10 10:08:21 -07001437#ifdef WLAN_KD_READY_NOTIFIER
1438 nl_srv_exit(pHddCtx->ptt_pid);
1439#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001440 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001441#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001442 //TODO----------
1443 //Deregister the device with the kernel
1444 hdd_UnregisterWext(pAdapter->dev);
1445
1446 hdd_close_all_adapters( pHddCtx );
1447#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001448 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001449 {
1450 unregister_netdev(pAdapter->dev);
1451 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1452 }
1453#endif
1454 //-----------------
1455
1456 vosStatus = vos_sched_close( vosContext );
1457 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1458 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1459 "%s: Failed to close VOSS Scheduler",__func__);
1460 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1461 }
1462
1463 //Close VOSS
1464 wlan_ftm_vos_close(vosContext);
1465
1466
1467 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1468 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1469 {
1470 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1471 "%s: Failed to destroy ftm_vos Event",__func__);
1472 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1473 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001474 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001475
1476 //Free up dynamically allocated members inside HDD Adapter
1477 kfree(pHddCtx->cfg_ini);
1478 pHddCtx->cfg_ini= NULL;
1479
1480 return 0;
1481
1482}
1483
1484/**---------------------------------------------------------------------------
1485
1486 \brief wlan_ftm_send_response() -
1487
1488 The function sends the response to the ptt socket application running in user space.
1489
1490 \param - pAdapter - Pointer HDD Context.
1491
1492 \return - 0 for success, non zero for failure
1493
1494 --------------------------------------------------------------------------*/
1495
1496static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1497
1498 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
1499
Arif Hussain6d2a3322013-11-17 19:50:10 -08001500 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 -07001501 return VOS_STATUS_E_FAILURE;
1502 }
1503 return VOS_STATUS_SUCCESS;
1504}
1505
1506/**---------------------------------------------------------------------------
1507
1508 \brief wlan_hdd_ftm_start() -
1509
1510 This function gets called when the FTM start commands received from the ptt socket application and
1511 it starts the following modules.
1512 1) SAL Start.
1513 2) BAL Start.
1514 3) MAC Start to download the firmware.
1515
1516
1517 \param - pAdapter - Pointer HDD Context.
1518
1519 \return - 0 for success, non zero for failure
1520
1521 --------------------------------------------------------------------------*/
1522
1523static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1524{
1525 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1526 tSirRetStatus sirStatus = eSIR_SUCCESS;
1527 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1528 tHalMacStartParameters halStartParams;
1529
1530 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1531 {
1532 return VOS_STATUS_SUCCESS;
1533 }
1534
1535 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1536 "%s: Starting Libra SW", __func__);
1537
1538 /* We support only one instance for now ...*/
1539 if (pVosContext == NULL)
1540 {
1541 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001542 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001543 goto err_status_failure;
1544 }
1545
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001546
Jeff Johnson295189b2012-06-20 16:38:30 -07001547 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001548 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001550 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001551 goto err_status_failure;
1552 }
1553
Jeff Johnson295189b2012-06-20 16:38:30 -07001554 /*
1555 Prima needs to start the WDA correctly instead of BAL and SAL
1556 */
1557
1558 /* Vos preStart is calling */
1559 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1560 {
1561 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1562 goto err_status_failure;
1563 }
1564
1565
1566 vStatus = WDA_NVDownload_Start(pVosContext);
1567
1568 if ( vStatus != VOS_STATUS_SUCCESS )
1569 {
1570 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1571 "%s: Failed to start NV Download",__func__);
1572 return VOS_STATUS_E_FAILURE;
1573 }
1574
1575 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1576
1577 if ( vStatus != VOS_STATUS_SUCCESS )
1578 {
1579 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1580 {
1581 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001582 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001583 }
1584 else
1585 {
1586 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001587 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001588 }
1589 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301590 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001591 }
1592
1593 vStatus = WDA_start(pVosContext);
1594 if (vStatus != VOS_STATUS_SUCCESS)
1595 {
1596 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1597 "%s: Failed to start WDA",__func__);
1598 goto err_status_failure;
1599 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001600
Jeff Johnson295189b2012-06-20 16:38:30 -07001601
1602 /* Start the MAC */
1603 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1604
Jeff Johnson295189b2012-06-20 16:38:30 -07001605
1606 halStartParams.driverType = eDRIVER_TYPE_MFG;
1607
1608 /* Start the MAC */
1609 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1610
Jeff Johnson295189b2012-06-20 16:38:30 -07001611
1612 if (eSIR_SUCCESS != sirStatus)
1613 {
1614 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1615 "%s: Failed to start MAC", __func__);
1616
Jeff Johnson295189b2012-06-20 16:38:30 -07001617 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001618 }
1619
1620 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1621 "%s: MAC correctly started",__func__);
1622
Jeff Johnson295189b2012-06-20 16:38:30 -07001623
1624 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1625
1626 return VOS_STATUS_SUCCESS;
1627
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001628err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001629 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1630 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1631 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1632 if(vStatus != VOS_STATUS_SUCCESS)
1633 {
1634 if(vStatus == VOS_STATUS_E_TIMEOUT)
1635 {
1636 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001637 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001638
1639 }
1640 else
1641 {
1642 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001643 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001644 }
1645 VOS_ASSERT(0);
1646 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001647
1648err_status_failure:
1649
1650 return VOS_STATUS_E_FAILURE;
1651
1652}
1653
1654
1655static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1656{
1657 VOS_STATUS vosStatus;
1658
1659 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1660 {
1661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1662 return VOS_STATUS_E_FAILURE;
1663 }
1664
1665 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1666 {
1667 /* STOP MAC only */
1668 v_VOID_t *hHal;
1669 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1670 if (NULL == hHal)
1671 {
1672 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1673 "%s: NULL hHal", __func__);
1674 }
1675 else
1676 {
1677 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1678 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1679 {
1680 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1681 "%s: Failed to stop SYS", __func__);
1682 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1683 }
1684 }
1685
Jeff Johnson295189b2012-06-20 16:38:30 -07001686
Jeff Johnson295189b2012-06-20 16:38:30 -07001687 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001688
1689 }
1690 return WLAN_FTM_SUCCESS;
1691}
1692
Jeff Johnson295189b2012-06-20 16:38:30 -07001693/**---------------------------------------------------------------------------
1694
1695 \brief wlan_hdd_ftm_get_nv_table() -
1696 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001697 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001698
1699 \param - ftmCmd - Pointer FTM Commad Buffer
1700
1701 \return - int
1702 -1, Process Host command fail, vail out
1703 1, Process Host command success
1704
1705 --------------------------------------------------------------------------*/
1706int wlan_hdd_ftm_get_nv_table
1707(
1708 hdd_context_t *pHddCtx,
1709 tPttMsgbuffer *ftmCmd
1710)
1711{
1712 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1713 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1714 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001715 sHalNvV2 *nvContents = NULL;
1716 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001717
Jeff Johnson295189b2012-06-20 16:38:30 -07001718 if (NULL == pHddCtx)
1719 {
1720 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1721 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001722 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001723 }
1724
Leo Chang80de3c22013-11-26 10:52:12 -08001725 nvVersion = vos_nv_getNvVersion();
1726 if (E_NV_V2 != nvVersion)
1727 {
1728 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1729 "%s : Not valid NV Version %d", __func__, nvVersion);
1730 return -EINVAL;
1731 }
1732
Jeff Johnson295189b2012-06-20 16:38:30 -07001733 /* Test first chunk of NV table */
1734 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1735 (0 == pHddCtx->ftm.processedNVTableSize))
1736 {
1737 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1738 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1739 {
c_hpothuffdb5272013-10-02 16:42:35 +05301740 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1741 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001742 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001743 }
1744
1745 switch (nvTable->nvTable)
1746 {
1747 case NV_TABLE_RATE_POWER_SETTINGS:
1748 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1749 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1750 break;
1751
1752 case NV_TABLE_REGULATORY_DOMAINS:
1753 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1754 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1755 break;
1756
1757 case NV_TABLE_DEFAULT_COUNTRY:
1758 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1759 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1760 break;
1761
1762 case NV_TABLE_TPC_POWER_TABLE:
1763 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1764 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1765 break;
1766
1767 case NV_TABLE_TPC_PDADC_OFFSETS:
1768 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1769 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1770 break;
1771
1772 case NV_TABLE_VIRTUAL_RATE:
1773 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1774 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1775 break;
1776
1777 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1778 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1779 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1780 break;
1781
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001782 case NV_TABLE_HW_CAL_VALUES:
1783 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1784 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1785 break;
1786
1787 case NV_TABLE_FW_CONFIG:
1788 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1789 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001790 break;
1791
1792 case NV_TABLE_ANTENNA_PATH_LOSS:
1793 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1794 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1795 break;
1796
1797 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1798 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1799 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1800 break;
1801
1802 default:
1803 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1804 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001805 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001806 break;
1807 }
1808
1809 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1810 {
1811 /* Invalid table size, discard and initialize data */
1812 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001813 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001814 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001815 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001816 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1817 pHddCtx->ftm.targetNVTableSize = 0;
1818 pHddCtx->ftm.processedNVTableSize = 0;
1819 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001820 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001821 }
1822
1823 /* Set Current Processing NV table type */
1824 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1825 /* Copy target NV table value into temp context buffer */
1826 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1827 pHddCtx->ftm.targetNVTablePointer,
1828 pHddCtx->ftm.targetNVTableSize);
1829
1830 }
1831
1832 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1833 {
1834 /* Invalid table type */
1835 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1836 "Invalid NV Table, now Processing %d, not %d",
1837 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1838 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1839 pHddCtx->ftm.targetNVTableSize = 0;
1840 pHddCtx->ftm.processedNVTableSize = 0;
1841 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001842
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001843 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001844 }
1845
1846 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001847 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001848 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1849 nvTable->chunkSize);
1850 /* Update processed pointer to prepare next chunk copy */
1851 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1852
1853 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1854 {
1855 /* Finished to process last chunk of data, initialize buffer */
1856 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1857 pHddCtx->ftm.targetNVTableSize = 0;
1858 pHddCtx->ftm.processedNVTableSize = 0;
1859 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1860 }
1861
1862 return 1;
1863}
1864
1865/**---------------------------------------------------------------------------
1866
1867 \brief wlan_hdd_ftm_set_nv_table() -
1868 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08001869 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001870
1871 \param - ftmCmd - Pointer FTM Commad Buffer
1872
1873 \return - int
1874 -1, Process Host command fail, vail out
1875 1, Process Host command success
1876
1877 --------------------------------------------------------------------------*/
1878int wlan_hdd_ftm_set_nv_table
1879(
1880 hdd_context_t *pHddCtx,
1881 tPttMsgbuffer *ftmCmd
1882)
1883{
1884 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1885 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1886 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001887 sHalNvV2 *nvContents = NULL;
1888 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001889
1890 if (NULL == pHddCtx)
1891 {
1892 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1893 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001894 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001895 }
1896
Leo Chang80de3c22013-11-26 10:52:12 -08001897 nvVersion = vos_nv_getNvVersion();
1898 if (E_NV_V2 != nvVersion)
1899 {
1900 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1901 "%s : Not valid NV Version %d", __func__, nvVersion);
1902 return -EINVAL;
1903 }
1904
Jeff Johnson295189b2012-06-20 16:38:30 -07001905 /* Test first chunk of NV table */
1906 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1907 (0 == pHddCtx->ftm.processedNVTableSize))
1908 {
1909 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1910 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1911 {
c_hpothuffdb5272013-10-02 16:42:35 +05301912 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1913 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001914 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001915 }
1916
1917 switch (nvTable->nvTable)
1918 {
1919 case NV_TABLE_RATE_POWER_SETTINGS:
1920 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1921 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1922 break;
1923
1924 case NV_TABLE_REGULATORY_DOMAINS:
1925 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1926 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1927 break;
1928
1929 case NV_TABLE_DEFAULT_COUNTRY:
1930 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1931 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1932 break;
1933
1934 case NV_TABLE_TPC_POWER_TABLE:
1935 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1936 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1937 break;
1938
1939 case NV_TABLE_TPC_PDADC_OFFSETS:
1940 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1941 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1942 break;
1943
1944 case NV_TABLE_VIRTUAL_RATE:
1945 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1946 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1947 break;
1948
1949 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1950 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1951 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1952 break;
1953
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001954 case NV_TABLE_HW_CAL_VALUES:
1955 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1956 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1957 break;
1958
1959 case NV_TABLE_FW_CONFIG:
1960 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1961 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001962 break;
1963
1964 case NV_TABLE_ANTENNA_PATH_LOSS:
1965 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1966 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1967 break;
1968
1969 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1970 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1971 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1972 break;
1973
1974 default:
1975 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1976 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001977 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001978 break;
1979 }
1980
1981 /* Set Current Processing NV table type */
1982 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1983 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1984 {
1985 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1986 "Invalid Table Size %d", nvTable->tableSize);
1987 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1988 pHddCtx->ftm.targetNVTableSize = 0;
1989 pHddCtx->ftm.processedNVTableSize = 0;
1990 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001991 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001992 }
1993 }
1994
1995 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1996 {
1997 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1998 "Invalid NV Table, now Processing %d, not %d",
1999 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2000 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2001 pHddCtx->ftm.targetNVTableSize = 0;
2002 pHddCtx->ftm.processedNVTableSize = 0;
2003 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002004 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002005 }
2006 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002007 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002008 nvTable->chunkSize);
2009
2010 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2011 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2012 {
2013 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2014 pHddCtx->ftm.tempNVTableBuffer,
2015 pHddCtx->ftm.targetNVTableSize);
2016 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2017 pHddCtx->ftm.targetNVTableSize = 0;
2018 pHddCtx->ftm.processedNVTableSize = 0;
2019 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2020 }
2021
2022 return 1;
2023}
2024
2025/**---------------------------------------------------------------------------
2026
2027 \brief wlan_hdd_ftm_blank_nv() -
2028 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002029 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002030
2031 \param - ftmCmd - Pointer FTM Commad Buffer
2032
2033 \return - int
2034 -1, Process Host command fail, vail out
2035 0, Process Host command success
2036
2037 --------------------------------------------------------------------------*/
2038int wlan_hdd_ftm_blank_nv_table
2039(
2040 tPttMsgbuffer *ftmCmd
2041)
2042{
Leo Chang80de3c22013-11-26 10:52:12 -08002043 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002044 v_SIZE_t nvSize;
2045 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002046 sHalNvV2 *nvContents = NULL;
2047 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002048
2049 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2050 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2051 {
c_hpothuffdb5272013-10-02 16:42:35 +05302052 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2053 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002054 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002055 }
2056
Leo Chang80de3c22013-11-26 10:52:12 -08002057 nvVersion = vos_nv_getNvVersion();
2058 if (E_NV_V2 != nvVersion)
2059 {
2060 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2061 "%s : Not valid NV Version %d", __func__, nvVersion);
2062 return -EINVAL;
2063 }
2064
Jeff Johnson295189b2012-06-20 16:38:30 -07002065 itemSize = sizeof(nvContents->tables.pwrOptimum);
2066 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002067 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002068 itemSize);
2069
2070 itemSize = sizeof(nvContents->tables.regDomains);
2071 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002072 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002073 itemSize);
2074
2075 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2076 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002077 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002078 itemSize);
2079
2080 itemSize = sizeof(nvContents->tables.plutCharacterized);
2081 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002082 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002083 itemSize);
2084
2085 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2086 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002087 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 itemSize);
2089
2090 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2091 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002092 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002093 itemSize);
2094
2095 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2096 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002097 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002098 itemSize);
2099
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002100 itemSize = sizeof(nvContents->tables.hwCalValues);
2101 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002102 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002103 itemSize);
2104
2105 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2106 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002107 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 itemSize);
2109
2110 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2111 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002112 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002113 itemSize);
2114
2115 return 1;
2116}
2117
2118/**---------------------------------------------------------------------------
2119
2120 \brief wlan_hdd_ftm_delete_nv_table() -
2121 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002122 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002123
2124 \param - ftmCmd - Pointer FTM Commad Buffer
2125
2126 \return - int
2127 -1, Process Host command fail, vail out
2128 1, Process Host command success
2129
2130 --------------------------------------------------------------------------*/
2131int wlan_hdd_ftm_delete_nv_table
2132(
2133 tPttMsgbuffer *ftmCmd
2134)
2135{
Leo Chang80de3c22013-11-26 10:52:12 -08002136 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002137 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2138 v_SIZE_t nvSize;
2139 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002140 sHalNvV2 *nvContents = NULL;
2141 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002142
2143 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2144 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2145 {
c_hpothuffdb5272013-10-02 16:42:35 +05302146 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2147 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002148 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002149 }
2150
Leo Chang80de3c22013-11-26 10:52:12 -08002151 nvVersion = vos_nv_getNvVersion();
2152 if (E_NV_V2 != nvVersion)
2153 {
2154 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2155 "%s : Not valid NV Version %d", __func__, nvVersion);
2156 return -EINVAL;
2157 }
2158
Jeff Johnson295189b2012-06-20 16:38:30 -07002159 switch (nvTable->nvTable)
2160 {
2161 case NV_TABLE_RATE_POWER_SETTINGS:
2162 itemSize = sizeof(nvContents->tables.pwrOptimum);
2163 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002164 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002165 itemSize);
2166 break;
2167
2168 case NV_TABLE_REGULATORY_DOMAINS:
2169 itemSize = sizeof(nvContents->tables.regDomains);
2170 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002171 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002172 itemSize);
2173 break;
2174
2175 case NV_TABLE_DEFAULT_COUNTRY:
2176 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2177 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002178 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002179 itemSize);
2180 break;
2181
2182 case NV_TABLE_TPC_POWER_TABLE:
2183 itemSize = sizeof(nvContents->tables.plutCharacterized);
2184 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002185 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002186 itemSize);
2187 break;
2188
2189 case NV_TABLE_TPC_PDADC_OFFSETS:
2190 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2191 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002192 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002193 itemSize);
2194 break;
2195
2196 case NV_TABLE_VIRTUAL_RATE:
2197 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2198 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002199 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002200 itemSize);
2201 break;
2202
2203 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2204 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2205 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002206 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002207 itemSize);
2208 break;
2209
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002210 case NV_TABLE_HW_CAL_VALUES:
2211 itemSize = sizeof(nvContents->tables.hwCalValues);
2212 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002213 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002214 itemSize);
2215 break;
2216
2217 case NV_TABLE_FW_CONFIG:
2218 itemSize = sizeof(nvContents->tables.fwConfig);
2219 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002220 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002221 itemSize);
2222 break;
2223
2224 case NV_TABLE_ANTENNA_PATH_LOSS:
2225 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2226 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002227 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002228 itemSize);
2229 break;
2230
2231 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2232 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2233 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002234 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002235 itemSize);
2236 break;
2237
2238 default:
2239 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2240 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002241 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002242 break;
2243 }
2244
2245 return 1;
2246}
2247
2248/**---------------------------------------------------------------------------
2249
2250 \brief wlan_hdd_ftm_get_nv_field() -
2251 Get Specific NV field
2252
2253 \param - ftmCmd - Pointer FTM Commad Buffer
2254
2255 \return - int
2256 -1, Process Host command fail, vail out
2257 1, Process Host command success
2258
2259 --------------------------------------------------------------------------*/
2260int wlan_hdd_ftm_get_nv_field
2261(
2262 tPttMsgbuffer *ftmCmd
2263)
2264{
2265 sNvFields nvFieldDataBuffer;
2266 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2267 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2268 sHalNv *nvContents = NULL;
2269 v_SIZE_t nvSize;
2270
2271 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2272 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2273 {
c_hpothuffdb5272013-10-02 16:42:35 +05302274 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2275 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002276 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002277 }
2278 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2279
2280 switch (nvField->nvField)
2281 {
2282 case NV_COMMON_PRODUCT_ID:
2283 memcpy((void *)&nvField->fieldData,
2284 &nvFieldDataBuffer.productId,
2285 sizeof(nvFieldDataBuffer.productId));
2286 break;
2287
2288 case NV_COMMON_PRODUCT_BANDS:
2289 memcpy((void *)&nvField->fieldData,
2290 &nvFieldDataBuffer.productBands,
2291 sizeof(nvFieldDataBuffer.productBands));
2292 break;
2293
2294 case NV_COMMON_NUM_OF_TX_CHAINS:
2295 memcpy((void *)&nvField->fieldData,
2296 &nvFieldDataBuffer.numOfTxChains,
2297 sizeof(nvFieldDataBuffer.numOfTxChains));
2298 break;
2299
2300 case NV_COMMON_NUM_OF_RX_CHAINS:
2301 memcpy((void *)&nvField->fieldData,
2302 &nvFieldDataBuffer.numOfRxChains,
2303 sizeof(nvFieldDataBuffer.numOfRxChains));
2304 break;
2305
2306 case NV_COMMON_MAC_ADDR:
2307 memcpy((void *)&nvField->fieldData,
2308 &nvFieldDataBuffer.macAddr[0],
2309 NV_FIELD_MAC_ADDR_SIZE);
2310 break;
2311
2312 case NV_COMMON_MFG_SERIAL_NUMBER:
2313 memcpy((void *)&nvField->fieldData,
2314 &nvFieldDataBuffer.mfgSN[0],
2315 NV_FIELD_MFG_SN_SIZE);
2316 break;
2317
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002318 case NV_COMMON_WLAN_NV_REV_ID:
2319 memcpy((void *)&nvField->fieldData,
2320 &nvFieldDataBuffer.wlanNvRevId,
2321 sizeof(nvFieldDataBuffer.wlanNvRevId));
2322 break;
2323
Jeff Johnson295189b2012-06-20 16:38:30 -07002324 case NV_COMMON_COUPLER_TYPE:
2325 memcpy((void *)&nvField->fieldData,
2326 &nvFieldDataBuffer.couplerType,
2327 sizeof(nvFieldDataBuffer.couplerType));
2328 break;
2329
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002330 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002331 {
2332 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2333 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2334
2335 nvEmbededStatus = vos_nv_isEmbeddedNV();
2336
2337 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2338 {
2339 // High bit is set to indicate embedded NV..
2340 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2341 }
2342
2343 memcpy((void *)&nvField->fieldData,
2344 &nvVersion,
2345 sizeof(nvFieldDataBuffer.nvVersion));
2346 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002347 break;
2348
Jeff Johnson295189b2012-06-20 16:38:30 -07002349 default:
2350 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2351 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002352 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002353 break;
2354 }
2355
2356 return 1;
2357}
2358
2359/**---------------------------------------------------------------------------
2360
2361 \brief wlan_hdd_ftm_set_nv_field() -
2362 Set Specific NV field
2363
2364 \param - ftmCmd - Pointer FTM Commad Buffer
2365
2366 \return - int
2367 -1, Process Host command fail, vail out
2368 1, Process Host command success
2369
2370 --------------------------------------------------------------------------*/
2371int wlan_hdd_ftm_set_nv_field
2372(
2373 tPttMsgbuffer *ftmCmd
2374)
2375{
2376 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2377 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2378 v_SIZE_t nvSize;
2379 sHalNv *nvContents = NULL;
2380 v_U8_t macLoop;
2381 v_U8_t *pNVMac;
2382 v_U8_t lastByteMAC;
2383
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002384
Jeff Johnson295189b2012-06-20 16:38:30 -07002385 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2386 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2387 {
c_hpothuffdb5272013-10-02 16:42:35 +05302388 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2389 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002390 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002391 }
2392
2393 switch (nvField->nvField)
2394 {
2395 case NV_COMMON_PRODUCT_ID:
2396 memcpy(&nvContents->fields.productId,
2397 &nvField->fieldData,
2398 sizeof(nvContents->fields.productId));
2399 break;
2400
2401 case NV_COMMON_PRODUCT_BANDS:
2402 memcpy(&nvContents->fields.productBands,
2403 &nvField->fieldData,
2404 sizeof(nvContents->fields.productBands));
2405 break;
2406
2407 case NV_COMMON_NUM_OF_TX_CHAINS:
2408 memcpy(&nvContents->fields.numOfTxChains,
2409 &nvField->fieldData,
2410 sizeof(nvContents->fields.numOfTxChains));
2411 break;
2412
2413 case NV_COMMON_NUM_OF_RX_CHAINS:
2414 memcpy(&nvContents->fields.numOfRxChains,
2415 &nvField->fieldData,
2416 sizeof(nvContents->fields.numOfRxChains));
2417 break;
2418
2419 case NV_COMMON_MAC_ADDR:
2420 /* If Last byte is larger than 252 (0xFC), return Error,
2421 * Since 3MACs should be derived from first MAC */
2422 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002423 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002424 {
2425 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2426 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002427 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002428 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002429 }
2430
2431 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002432 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002433 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2434 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002435 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002436 lastByteMAC + macLoop;
2437 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002438 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002439 NV_FIELD_MAC_ADDR_SIZE);
2440 }
2441 break;
2442
2443 case NV_COMMON_MFG_SERIAL_NUMBER:
2444 memcpy(&nvContents->fields.mfgSN[0],
2445 &nvField->fieldData,
2446 NV_FIELD_MFG_SN_SIZE);
2447 break;
2448
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002449 case NV_COMMON_WLAN_NV_REV_ID:
2450 memcpy(&nvContents->fields.wlanNvRevId,
2451 &nvField->fieldData,
2452 sizeof(nvContents->fields.wlanNvRevId));
2453 break;
2454
Jeff Johnson295189b2012-06-20 16:38:30 -07002455 case NV_COMMON_COUPLER_TYPE:
2456 memcpy(&nvContents->fields.couplerType,
2457 &nvField->fieldData,
2458 sizeof(nvContents->fields.couplerType));
2459 break;
2460
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002461 case NV_COMMON_NV_VERSION:
2462 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2463 "Cannot modify NV version field %d", nvField->nvField);
2464 return -EIO;
2465 break;
2466
Jeff Johnson295189b2012-06-20 16:38:30 -07002467 default:
2468 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2469 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002470 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002471 break;
2472 }
2473
2474 return 1;
2475}
2476
2477/**---------------------------------------------------------------------------
2478
2479 \brief wlan_hdd_ftm_store_nv_table() -
2480 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002481 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002482
2483 \param - ftmCmd - Pointer FTM Commad Buffer
2484
2485 \return - int
2486 -1, Process Host command fail, vail out
2487 0, Process Host command success
2488
2489 --------------------------------------------------------------------------*/
2490int wlan_hdd_ftm_store_nv_table
2491(
2492 tPttMsgbuffer *ftmCmd
2493)
2494{
2495 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2496 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002497 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2498 void *tablePtr = NULL;
2499 unsigned int tableSize = 0;
2500 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002501 sHalNvV2 *nvContents = NULL;
2502 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002503
2504 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2505 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2506 {
c_hpothuffdb5272013-10-02 16:42:35 +05302507 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2508 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002509 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002510 }
2511
Leo Chang80de3c22013-11-26 10:52:12 -08002512 nvVersion = vos_nv_getNvVersion();
2513 if (E_NV_V2 != nvVersion)
2514 {
2515 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2516 "%s : Not valid NV Version %d", __func__, nvVersion);
2517 return -EINVAL;
2518 }
2519
Jeff Johnson295189b2012-06-20 16:38:30 -07002520 /* Set Platform type as PRIMA */
2521 nvContents->fields.wlanNvRevId = 2;
2522
2523 switch(nvTable->nvTable)
2524 {
2525 case NV_FIELDS_IMAGE:
2526 tablePtr = (void *)&nvContents->fields;
2527 tableSize = sizeof(nvContents->fields);
2528 tableVNVType = VNV_FIELD_IMAGE;
2529 break;
2530
2531 case NV_TABLE_RATE_POWER_SETTINGS:
2532 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2533 tableSize = sizeof(nvContents->tables.pwrOptimum);
2534 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2535 break;
2536
2537 case NV_TABLE_REGULATORY_DOMAINS:
2538 tablePtr = (void *)&nvContents->tables.regDomains[0];
2539 tableSize = sizeof(nvContents->tables.regDomains);
2540 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2541 break;
2542
2543 case NV_TABLE_DEFAULT_COUNTRY:
2544 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2545 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2546 tableVNVType = VNV_DEFAULT_LOCATION;
2547 break;
2548
2549 case NV_TABLE_TPC_POWER_TABLE:
2550 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2551 tableSize = sizeof(nvContents->tables.plutCharacterized);
2552 tableVNVType = VNV_TPC_POWER_TABLE;
2553 break;
2554
2555 case NV_TABLE_TPC_PDADC_OFFSETS:
2556 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2557 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2558 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2559 break;
2560
2561 case NV_TABLE_VIRTUAL_RATE:
2562 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2563 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2564 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2565 break;
2566
2567 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2568 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2569 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2570 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2571 break;
2572
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002573 case NV_TABLE_HW_CAL_VALUES:
2574 tablePtr = (void *)&nvContents->tables.hwCalValues;
2575 tableSize = sizeof(nvContents->tables.hwCalValues);
2576 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002577 break;
2578
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002579 case NV_TABLE_FW_CONFIG:
2580 tablePtr = (void *)&nvContents->tables.fwConfig;
2581 tableSize = sizeof(nvContents->tables.fwConfig);
2582 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002583 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002584
Jeff Johnson295189b2012-06-20 16:38:30 -07002585 case NV_TABLE_ANTENNA_PATH_LOSS:
2586 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2587 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2588 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2589 break;
2590
2591 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2592 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2593 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2594 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2595 break;
2596
2597 default:
2598 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2599 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002600 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002601 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002602
Jeff Johnson295189b2012-06-20 16:38:30 -07002603 }
2604
2605 nvStatus = vos_nv_write(tableVNVType,
2606 tablePtr,
2607 tableSize);
2608 if(VOS_STATUS_SUCCESS != nvStatus)
2609 {
c_hpothuffdb5272013-10-02 16:42:35 +05302610 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2611 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002612 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002613 }
2614
2615 return 1;
2616}
2617
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002618/* --------------------------------------------------------------------------
2619 \brief wlan_hdd_ftm_get_nv_bin() -
2620 Get NV bin read from Flash Memory, file
2621
2622 \param - ftmCmd - Pointer FTM Commad Buffer
2623
2624 \return - int
2625 -1, Process Host command fail, vail out
2626 0, Process Host command success
2627--------------------------------------------------------------------------*/
2628
2629static int wlan_hdd_ftm_get_nv_bin
2630(
2631 v_U16_t msgId,
2632 hdd_context_t *pHddCtx,
2633 tPttMsgbuffer *ftmCmd
2634)
2635{
2636 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2637 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2638 v_SIZE_t nvSize;
2639 v_U8_t *nvContents;
2640 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002641 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002642
Leo Chang80de3c22013-11-26 10:52:12 -08002643 nvVersion = vos_nv_getNvVersion();
2644 if (E_NV_V3 != nvVersion)
2645 {
2646 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2647 "%s : Not valid NV Version %d", __func__, nvVersion);
2648 return -EINVAL;
2649 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002650
2651 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2652 (0 == pHddCtx->ftm.processedNVTableSize))
2653 {
2654 if ( msgId == PTT_MSG_GET_NV_BIN )
2655 {
2656 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2657 }
2658 else
2659 {
2660 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2661 }
2662
2663 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2664 {
c_hpothuffdb5272013-10-02 16:42:35 +05302665 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2666 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002667 return -EIO;
2668 }
2669
2670 switch (nvTable->nvTable)
2671 {
2672 case NV_BINARY_IMAGE:
2673 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2674 break;
2675 default:
2676 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2677 "Not Valid NV Table %d", nvTable->nvTable);
2678 return -EIO;
2679 break;
2680 }
2681
2682 /* Set Current Processing NV table type */
2683 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2684 if ( msgId == PTT_MSG_GET_NV_BIN )
2685 {
2686 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2687 /* Validity Period */
2688 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2689 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2690 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2691 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2692 offset = sizeof(v_U32_t);
2693 }
2694 else
2695 {
2696 pHddCtx->ftm.targetNVTableSize = nvSize;
2697 offset = 0;
2698 }
2699
2700 /* Copy target NV table value into temp context buffer */
2701 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2702 pHddCtx->ftm.targetNVTablePointer,
2703 pHddCtx->ftm.targetNVTableSize);
2704 }
2705
2706
2707 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2708 {
2709 /* Invalid table type */
2710 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2711 "Invalid NV Table, now Processing %d, not %d",
2712 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2713
2714 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2715 pHddCtx->ftm.targetNVTableSize = 0;
2716 pHddCtx->ftm.processedNVTableSize = 0;
2717 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2718
2719 return -EINVAL;
2720 }
2721
2722 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2723
2724 /* Update processed pointer to prepare next chunk copy */
2725 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2726 pHddCtx->ftm.targetNVTableSize )
2727 {
2728 nvTable->chunkSize =
2729 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2730 }
2731
2732 /* Copy next chunk of NV table value into response buffer */
2733 vos_mem_copy(
2734 &nvTable->tableData,
2735 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2736 nvTable->chunkSize);
2737
2738 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2739
2740 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2741 {
2742 /* Finished to process last chunk of data, initialize buffer */
2743 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2744 pHddCtx->ftm.targetNVTableSize = 0;
2745 pHddCtx->ftm.processedNVTableSize = 0;
2746 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2747 }
2748
2749 return 1;
2750}
2751
2752/**---------------------------------------------------------------------------
2753
2754 \brief wlan_hdd_ftm_set_nv_bin() -
2755 Set NV bin to Flash Memory, file
2756
2757 \param - ftmCmd - Pointer FTM Commad Buffer
2758
2759 \return - int
2760 -1, Process Host command fail, vail out
2761 0, Process Host command success
2762
2763+----------------------------------------------------------------------------*/
2764
2765static int wlan_hdd_ftm_set_nv_bin
2766(
2767 hdd_context_t *pHddCtx,
2768 tPttMsgbuffer *ftmCmd
2769)
2770{
2771 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2772 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002773 eNvVersionType nvVersion;
2774
2775 nvVersion = vos_nv_getNvVersion();
2776 if (E_NV_V3 != nvVersion)
2777 {
2778 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2779 "%s : Not valid NV Version %d", __func__, nvVersion);
2780 return -EINVAL;
2781 }
2782
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002783
2784 /* Test first chunk of NV table */
2785 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2786 (0 == pHddCtx->ftm.processedNVTableSize))
2787 {
2788 switch (nvTable->nvTable)
2789 {
2790 case NV_BINARY_IMAGE:
2791 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2792 break;
2793 default:
2794 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2795 "Not Valid NV Table %d", nvTable->nvTable);
2796 return -EIO;
2797 break;
2798 }
2799
2800 /* Set Current Processing NV table type */
2801 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2802 pHddCtx->ftm.processedNVTableSize = 0;
2803
2804 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2805 {
2806 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2807 "Invalid Table Size %d", nvTable->tableSize);
2808 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2809 pHddCtx->ftm.targetNVTableSize = 0;
2810 pHddCtx->ftm.processedNVTableSize = 0;
2811 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2812 return -EINVAL;
2813 }
2814 }
2815
2816 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2817 {
2818 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2819 "Invalid NV Table, now Processing %d, not %d",
2820 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2821 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2822 pHddCtx->ftm.targetNVTableSize = 0;
2823 pHddCtx->ftm.processedNVTableSize = 0;
2824 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2825 return -EINVAL;
2826 }
2827
2828 vos_mem_copy(
2829 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2830 &nvTable->tableData,
2831 nvTable->chunkSize);
2832
2833 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2834
2835 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2836 {
2837 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2838 "Processing Done!! write encoded Buffer %d",
2839 pHddCtx->ftm.targetNVTableSize);
2840
2841 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2842 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2843
2844 if ((VOS_STATUS_SUCCESS != nvStatus))
2845 {
2846 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2847 "Fail to set NV Binary %d", nvStatus);
2848 return -EIO;
2849 }
2850
2851 nvStatus = vos_nv_setNVEncodedBuffer(
2852 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2853 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
2854
2855 if ((VOS_STATUS_SUCCESS != nvStatus))
2856 {
2857 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2858 "Fail to set NV Binary %d", nvStatus);
2859 return -EIO;
2860 }
2861
2862 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2863 pHddCtx->ftm.targetNVTableSize = 0;
2864 pHddCtx->ftm.processedNVTableSize = 0;
2865 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2866 }
2867
2868 return 1;
2869}
2870
Jeff Johnson295189b2012-06-20 16:38:30 -07002871/**---------------------------------------------------------------------------
2872
2873 \brief wlan_hdd_ftm_temp_get_rel_num() -
2874 Get internal release number
2875
2876 \param - ftmCmd - Pointer FTM Commad Buffer
2877
2878 \return - int
2879 -1, Process Host command fail, vail out
2880 0, Process Host command success
2881
2882 --------------------------------------------------------------------------*/
2883int wlan_hdd_ftm_temp_get_rel_num
2884(
2885 tPttMsgbuffer *ftmCmd
2886)
2887{
2888 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2889
2890 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2891 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2892 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2893 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2894 relNum->relParams.pttMax = 10;
2895 relNum->relParams.pttMin = 1;
2896
2897 return 1;
2898}
2899
2900/**---------------------------------------------------------------------------
2901
2902 \brief wlan_hdd_process_ftm_host_cmd() -
2903 process any command should be handled within host.
2904 decide any command should be send to HAL or not
2905
2906 \param - ftmCmd - Pointer FTM Commad Buffer
2907
2908 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002909 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002910 0, Process Host command success, not need to send CMD to HAL
2911 1, Process Host command success, need to send CMD to HAL
2912
2913 --------------------------------------------------------------------------*/
2914int wlan_hdd_process_ftm_host_cmd
2915(
2916 hdd_context_t *pHddCtx,
2917 void *ftmCmd
2918)
2919{
2920 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2921 int needToRouteHal = 1;
2922 int hostState = 1;
2923
2924 switch(pFTMCmd->msgId)
2925 {
2926 case PTT_MSG_GET_NV_TABLE:
2927 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2928 needToRouteHal = 0;
2929 break;
2930
2931 case PTT_MSG_SET_NV_TABLE:
2932 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2933 /* Temp NV Operation will be isolated to host
2934 needToRouteHal = 1; */
2935 needToRouteHal = 0;
2936 break;
2937
2938 case PTT_MSG_BLANK_NV:
2939 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2940 needToRouteHal = 1;
2941 break;
2942
2943 case PTT_MSG_DEL_NV_TABLE:
2944 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2945 needToRouteHal = 1;
2946 break;
2947
2948 case PTT_MSG_GET_NV_FIELD:
2949 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2950 needToRouteHal = 0;
2951 break;
2952
2953 case PTT_MSG_SET_NV_FIELD:
2954 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2955 needToRouteHal = 0;
2956 break;
2957
2958 case PTT_MSG_STORE_NV_TABLE:
2959 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2960 needToRouteHal = 0;
2961 break;
2962
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002963 case PTT_MSG_GET_NV_BIN:
2964 case PTT_MSG_GET_DICTIONARY:
2965 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
2966 needToRouteHal = 0;
2967 break;
2968
2969 case PTT_MSG_SET_NV_BIN:
2970 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
2971 needToRouteHal = 0;
2972 break;
2973
Jeff Johnson295189b2012-06-20 16:38:30 -07002974 case PTT_MSG_DBG_READ_REGISTER:
2975 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
2976 &pFTMCmd->msgBody.DbgReadRegister.regValue);
2977 needToRouteHal = 0;
2978 break;
2979
2980 case PTT_MSG_DBG_WRITE_REGISTER:
2981 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
2982 pFTMCmd->msgBody.DbgWriteRegister.regValue);
2983 needToRouteHal = 0;
2984 break;
2985
2986 case PTT_MSG_DBG_READ_MEMORY:
2987 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
2988 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
2989 pFTMCmd->msgBody.DbgReadMemory.nBytes);
2990 needToRouteHal = 0;
2991 break;
2992
2993 case PTT_MSG_DBG_WRITE_MEMORY:
2994 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
2995 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
2996 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
2997 needToRouteHal = 0;
2998 break;
2999
3000 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3001 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3002 needToRouteHal = 0;
3003 break;
3004
3005 default:
3006 needToRouteHal = 1;
3007 break;
3008 }
3009
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003010 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003011 {
3012 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3013 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003014 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003015 }
3016
3017 return needToRouteHal;
3018}
Jeff Johnson295189b2012-06-20 16:38:30 -07003019
3020/**---------------------------------------------------------------------------
3021
3022 \brief wlan_hdd_process_ftm_cmd() -
3023
3024 This function process the commands received from the ptt socket application.
3025
3026 \param - pAdapter - Pointer HDD Context.
3027
3028 \param - wnl - Pointer to the ANI netlink header.
3029
3030 \return - none
3031
3032 --------------------------------------------------------------------------*/
3033
3034void wlan_hdd_process_ftm_cmd
3035(
3036 hdd_context_t *pHddCtx,
3037 tAniNlHdr *wnl
3038)
3039{
3040 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3041 v_U16_t cmd_len;
3042 v_U8_t *pftm_data;
3043 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003044 int hostState;
3045 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003046
3047 ENTER();
3048
Jeff Johnsone7245742012-09-05 17:12:55 -07003049 //Delay to fix NV write failure on JB
3050 vos_busy_wait(10000); //10ms
3051
Jeff Johnson295189b2012-06-20 16:38:30 -07003052 if (!pRequestBuf) {
3053
Arif Hussain6d2a3322013-11-17 19:50:10 -08003054 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003055 return ;
3056 }
3057 /*Save the received request*/
3058 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3059
3060 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3061 /*Save the received request netlink header used for sending the response*/
3062 pHddCtx->ftm.wnl = wnl;
3063 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3064
Arif Hussain6d2a3322013-11-17 19:50:10 -08003065 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003066
3067 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3068 wlan_ftm_send_response(pHddCtx);
3069 return ;
3070 }
3071
3072 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3073 {
3074 case WLAN_FTM_START:
3075 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3076
Arif Hussain6d2a3322013-11-17 19:50:10 -08003077 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003078 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3079 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3080 wlan_ftm_send_response(pHddCtx);
3081 return;
3082 }
3083
3084 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3085 {
3086 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3087 ,__func__);
3088 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3089 wlan_ftm_send_response(pHddCtx);
3090 return;
3091 }
3092 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3093 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3094 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3095 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3096
3097 wlan_ftm_send_response(pHddCtx);
3098
3099 break;
3100
3101 case WLAN_FTM_STOP:
3102 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3103
Arif Hussain6d2a3322013-11-17 19:50:10 -08003104 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003105 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3106 wlan_ftm_send_response(pHddCtx);
3107 return;
3108 }
3109
3110 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3111
3112 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3113 wlan_ftm_send_response(pHddCtx);
3114 return;
3115 }
3116
3117 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3118 /* This would send back the Command Success Status */
3119 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3120
3121 wlan_ftm_send_response(pHddCtx);
3122
3123 break;
3124
3125 case WLAN_FTM_CMD:
3126 /* if it is regular FTM command, pass it to HAL PHY */
3127 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003128 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003129 return;
3130 }
3131 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3132
Arif Hussain6d2a3322013-11-17 19:50:10 -08003133 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003134
3135 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3136 wlan_ftm_send_response(pHddCtx);
3137 return;
3138
3139 }
3140 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3141 cmd_len = pRequestBuf->ftm_hdr.data_len;
3142 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3143 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3144
Jeff Johnson295189b2012-06-20 16:38:30 -07003145 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3146 if (0 == hostState)
3147 {
3148 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3149 if (NULL == tempRspBuffer)
3150 {
3151 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003152 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003153 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3154 wlan_ftm_send_response(pHddCtx);
3155 return;
3156 }
3157 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3158 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3159 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3160 (unsigned char *) tempRspBuffer,
3161 tempRspBuffer->msgBodyLength);
3162 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3163 wlan_ftm_send_response(pHddCtx);
3164 vos_mem_free(tempRspBuffer);
3165 return;
3166 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003167 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003168 {
3169 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3170 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3171 wlan_ftm_send_response(pHddCtx);
3172 return;
3173 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003174
3175 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3176
3177 pHddCtx->ftm.IsCmdPending = TRUE;
3178
3179 /*Post the command to the HAL*/
3180 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3181
Arif Hussain6d2a3322013-11-17 19:50:10 -08003182 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003183 return;
3184
3185 }
3186 /*Wait here until you get the response from HAL*/
3187 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3188 {
3189 hddLog(VOS_TRACE_LEVEL_ERROR,
3190 "%s: vos_wait_single_event failed",__func__);
3191 return;
3192 }
3193
3194 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3195
3196 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3197
3198 wlan_ftm_send_response(pHddCtx);
3199 pHddCtx->ftm.IsCmdPending = FALSE;
3200 break;
3201
3202 default:
3203
Arif Hussain6d2a3322013-11-17 19:50:10 -08003204 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003205 return;
3206 }
3207
3208 EXIT();
3209 return;
3210} /* wlan_adp_ftm_cmd() */
3211
3212/**---------------------------------------------------------------------------
3213
3214 \brief wlan_ftm_priv_start_stop_ftm() -
3215
3216 This function is used for start/stop the ftm driver.
3217
3218 \param - pAdapter - Pointer HDD Context.
3219 - start - 1/0 to start/stop ftm driver.
3220
3221 \return - 0 for success, non zero for failure
3222
3223 --------------------------------------------------------------------------*/
3224
3225static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3226 v_U16_t start)
3227{
3228 VOS_STATUS status;
3229 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3230
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003231 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003232 {
3233 pHddCtx->ftm.cmd_iwpriv = TRUE;
3234 status = wlan_hdd_ftm_start(pHddCtx);
3235
3236 if (status != VOS_STATUS_SUCCESS)
3237 {
3238 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3239 "FTM Start Failed");
3240 return VOS_STATUS_E_FAILURE;
3241 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303242 if (NULL == pMsgBuf)
3243 {
3244 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3245 if (NULL == pMsgBuf)
3246 {
3247 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3248 "%s:pMsgBuf is NULL", __func__);
3249 return VOS_STATUS_E_FAILURE;
3250 }
3251 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003252 }
3253 else
3254 {
3255 status = wlan_ftm_stop(pHddCtx);
3256
3257 if (status != VOS_STATUS_SUCCESS)
3258 {
3259 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3260 "FTM Stop Failed");
3261 return VOS_STATUS_E_FAILURE;
3262 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303263 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3264 if (pMsgBuf)
3265 {
3266 vos_mem_free((v_VOID_t * )pMsgBuf);
3267 pMsgBuf = NULL;
3268 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003269 }
3270 return VOS_STATUS_SUCCESS;
3271}
3272
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303273
3274static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3275{
3276 unsigned int *table = NULL;
3277 int index = 0;
3278
3279 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3280 table = valid_channel;
3281 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3282 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3283 table = valid_channel_cb40;
3284 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3285 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3286 table = valid_channel_cb80;
3287
3288 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303289 {
3290 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3291 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303292 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303293 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303294
3295 while (table[index] != 0)
3296 {
3297 if (table[index] == channel)
3298 return VOS_STATUS_SUCCESS;
3299
3300 index++;
3301 }
3302
3303 return VOS_STATUS_E_FAILURE;
3304}
3305
3306
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303307static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3308{
3309 unsigned int primary_channel = center_channel;
3310
3311 if (center_channel <= 14)
3312 return primary_channel ;
3313
3314 switch (cb)
3315 {
3316 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3317 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3318 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3319 primary_channel -= 2;
3320 break;
3321
3322
3323 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3324 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3325 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3326 primary_channel += 2;
3327 break;
3328
3329 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3330 primary_channel -= 6;
3331 break;
3332
3333 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3334 primary_channel += 6;
3335 break;
3336 }
3337
3338 return primary_channel;
3339
3340}
3341
Jeff Johnson295189b2012-06-20 16:38:30 -07003342/**---------------------------------------------------------------------------
3343
3344 \brief wlan_ftm_priv_set_channel() -
3345
3346 This function is used for setting the channel to the halphy ptt module.
3347
3348 \param - pAdapter - Pointer HDD Context.
3349 - channel - Channel Number 1-14.
3350
3351 \return - 0 for success, non zero for failure
3352
3353 --------------------------------------------------------------------------*/
3354
3355static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3356{
Jeff Johnson295189b2012-06-20 16:38:30 -07003357 uPttMsgs *pMsgBody;
3358 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303359 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003360 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3361
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303362 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003363 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303364 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3365 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003366 return VOS_STATUS_E_FAILURE;
3367 }
3368
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303369 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003370 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303371 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3372 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003373 return VOS_STATUS_E_FAILURE;
3374 }
3375
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303376 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003377 init_completion(&pHddCtx->ftm.ftm_comp_var);
3378 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3379 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3380
3381 pMsgBody = &pMsgBuf->msgBody;
3382
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303383 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003384
Arif Hussain6d2a3322013-11-17 19:50:10 -08003385 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303386 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003387
3388 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3389
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303390 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003391 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303392 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3393 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003394 status = VOS_STATUS_E_FAILURE;
3395 goto done;
3396
3397 }
c_hpothuffdb5272013-10-02 16:42:35 +05303398 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303399 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303400 if (0 >= ret )
3401 {
3402 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3403 FL("wait on ftm_comp_var failed %ld"), ret);
3404 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003405
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303406 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003407 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303408 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3409 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 status = VOS_STATUS_E_FAILURE;
3411 goto done;
3412
3413 }
3414done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003415
3416 return status;
3417}
3418
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303419
3420/**---------------------------------------------------------------------------
3421
3422 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3423
3424 This function is used for setting the power control mode for tx.
3425
3426 \param - pAdapter - Pointer HDD Context.
3427 - pwr_mode - power control mode 0-2.
3428
3429 \return - 0 for success, non zero for failure
3430
3431 --------------------------------------------------------------------------*/
3432
3433static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3434 v_U16_t pwr_mode)
3435{
3436 uPttMsgs *pMsgBody;
3437 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303438 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303439 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3440
3441 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3442 {
3443 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3444 "%s:Ftm has not started. Please start the ftm. ", __func__);
3445 return VOS_STATUS_E_FAILURE;
3446 }
3447
3448 if (pwr_mode > 2)
3449 {
3450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3451 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3452 return VOS_STATUS_E_FAILURE;
3453 }
3454
3455 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3456 init_completion(&pHddCtx->ftm.ftm_comp_var);
3457 pMsgBody = &pMsgBuf->msgBody;
3458 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3459 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3460
3461 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3462 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3463
3464 if (status != VOS_STATUS_SUCCESS)
3465 {
3466 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3467 "%s:wlan_ftm_postmsg failed", __func__);
3468 status = VOS_STATUS_E_FAILURE;
3469 goto done;
3470 }
c_hpothuffdb5272013-10-02 16:42:35 +05303471 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303472 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303473 if (0 >= ret )
3474 {
3475 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3476 FL("wait on ftm_comp_var failed %ld"), ret);
3477 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303478
3479 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3480 {
3481 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3482 "%s:Ptt response status failed", __func__);
3483 status = VOS_STATUS_E_FAILURE;
3484 goto done;
3485 }
3486
3487 done:
3488 return status;
3489
3490}
3491
Jeff Johnson295189b2012-06-20 16:38:30 -07003492/**---------------------------------------------------------------------------
3493
3494 \brief wlan_ftm_priv_set_txpower() -
3495
3496 This function is used for setting the txpower to the halphy ptt module.
3497
3498 \param - pAdapter - Pointer HDD Context.
3499 - txpower - txpower Number 1-18.
3500
3501 \return - 0 for success, non zero for failure
3502
3503 --------------------------------------------------------------------------*/
3504
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303505static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3506 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003507{
Jeff Johnson295189b2012-06-20 16:38:30 -07003508 uPttMsgs *pMsgBody;
3509 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303510 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003511 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3512
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303513 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003514 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303515 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3516 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003517 return VOS_STATUS_E_FAILURE;
3518 }
3519
3520 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3521 * when tx pktgen is enabled
3522 */
3523 if (ftm_status.frameGenEnabled)
3524 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303525 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3526 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003527 return VOS_STATUS_E_FAILURE;
3528 }
3529
3530 if(!(txpower >= 9 && txpower <= 24))
3531 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303532 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3533 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003534 return VOS_STATUS_E_FAILURE;
3535 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003536
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303537 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3538 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003539 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003540 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3541 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3542
3543 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3544
3545 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3546
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303547 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003548 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303549 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3550 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003551 status = VOS_STATUS_E_FAILURE;
3552 goto done;
3553 }
c_hpothuffdb5272013-10-02 16:42:35 +05303554 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303555 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303556 if (0 >= ret )
3557 {
3558 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3559 FL("wait on ftm_comp_var failed %ld"), ret);
3560 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003561
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303562 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003563 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303564 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3565 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003566 status = VOS_STATUS_E_FAILURE;
3567 goto done;
3568 }
3569
3570 ftm_status.txpower = txpower ;
3571 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003572
3573 return status;
3574
3575}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303576
3577
3578static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3579 v_U16_t enable)
3580{
3581 tANI_U32 value = 0;
3582 tANI_U32 reg_addr;
3583 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3584 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3585 {
3586 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3587 "%s:Ftm has not started. Please start the ftm. ", __func__);
3588 return VOS_STATUS_E_FAILURE;
3589 }
3590
3591#ifdef WCN_PRONTO
3592 reg_addr = 0xfb018000;
3593#else
3594 reg_addr = 0x03018000;
3595#endif
3596 wpalReadRegister(reg_addr, &value);
3597 if (enable)
3598 {
3599 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3600 }
3601 else
3602 {
3603 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3604 }
3605
3606 wpalWriteRegister(reg_addr, value);
3607
3608 return VOS_STATUS_SUCCESS;
3609}
3610
3611
Jeff Johnson295189b2012-06-20 16:38:30 -07003612/**---------------------------------------------------------------------------
3613
3614 \brief wlan_ftm_priv_set_txrate() -
3615
3616 This function is used for setting the txrate to the halphy ptt module.
3617 It converts the user input string for txrate to the tx rate index.
3618
3619 \param - pAdapter - Pointer HDD Context.
3620 - txrate - Pointer to the tx rate string.
3621
3622 \return - 0 for success, non zero for failure
3623
3624 --------------------------------------------------------------------------*/
3625
3626static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3627{
3628 int ii;
3629 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3630 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3631 {
3632 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3633 return VOS_STATUS_E_FAILURE;
3634 }
3635
3636 /* do not allow to change setting when tx pktgen is enabled */
3637 if (ftm_status.frameGenEnabled)
3638 {
3639 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3640 return VOS_STATUS_E_FAILURE;
3641 }
3642
3643 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3644 {
3645 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3646 break;
3647 }
3648 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3649 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003650 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003651 return VOS_STATUS_E_FAILURE;
3652 }
3653
3654 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3655 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3656
3657 return VOS_STATUS_SUCCESS;
3658}
3659
3660/**---------------------------------------------------------------------------
3661
3662 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3663
3664 This function is used for start/stop the tx packet generation.
3665
3666 \param - pAdapter - Pointer HDD Context.
3667 - startStop - Value( 1/0) start/stop the tx packet generation.
3668
3669 \return - 0 for success, non zero for failure
3670
3671 --------------------------------------------------------------------------*/
3672
3673static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3674{
Jeff Johnson295189b2012-06-20 16:38:30 -07003675 uPttMsgs *pMsgBody;
3676 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303677 long ret;
3678
Jeff Johnson295189b2012-06-20 16:38:30 -07003679 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3680
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303681 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003682 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303683 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3684 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003685 return VOS_STATUS_E_FAILURE;
3686 }
3687
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303688 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003689 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303690 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3691 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003692 return VOS_STATUS_E_FAILURE;
3693 }
3694
3695 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3696 (!ftm_status.frameGenEnabled && startStop == 0))
3697 {
3698 return VOS_STATUS_SUCCESS ;
3699 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303700 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003701
Jeff Johnson295189b2012-06-20 16:38:30 -07003702 if (startStop == 1)
3703 {
3704 init_completion(&pHddCtx->ftm.ftm_comp_var);
3705 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3706 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3707 pMsgBody = &pMsgBuf->msgBody;
3708 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3709
3710 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303711 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003712 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303713 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3714 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003715 status = VOS_STATUS_E_FAILURE;
3716 goto done;
3717 }
3718
c_hpothuffdb5272013-10-02 16:42:35 +05303719 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303720 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303721 if (0 >= ret )
3722 {
3723 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3724 FL("wait on ftm_comp_var failed %ld"), ret);
3725 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303726 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003727 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303728 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3729 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003730 status = VOS_STATUS_E_FAILURE;
3731 goto done;
3732 }
3733 }
3734
3735 init_completion(&pHddCtx->ftm.ftm_comp_var);
3736 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3737 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3738 pMsgBody = &pMsgBuf->msgBody;
3739 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3740
3741 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3742 if(status != VOS_STATUS_SUCCESS)
3743 {
3744 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3745 status = VOS_STATUS_E_FAILURE;
3746 goto done;
3747 }
3748
c_hpothuffdb5272013-10-02 16:42:35 +05303749 ret = wait_for_completion_interruptible_timeout(
3750 &pHddCtx->ftm.ftm_comp_var,
3751 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3752 if (0 >= ret )
3753 {
3754 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3755 FL("wait on ftm_comp_var failed %ld"), ret);
3756 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003757 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3758 {
3759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3760 status = VOS_STATUS_E_FAILURE;
3761 goto done;
3762 }
3763
3764done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003765
3766 if (status == VOS_STATUS_SUCCESS)
3767 {
3768 if (startStop == 1)
3769 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303770 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 }
3772 else
3773 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303774 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003775 }
3776 }
3777
3778 return status;
3779}
3780
3781
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303782
3783static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3784{
3785
3786 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3787 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3788 {
3789 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3790 "%s:Ftm has not started. Please start the ftm. ", __func__);
3791 return VOS_STATUS_E_FAILURE;
3792 }
3793
3794 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3795 {
3796 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3797 "%s:cb mode value is invalid ", __func__);
3798 return VOS_STATUS_E_FAILURE;
3799 }
3800
3801 ftm_status.cbmode = cbmode;
3802
3803 return VOS_STATUS_SUCCESS;
3804
3805}
3806
Jeff Johnson295189b2012-06-20 16:38:30 -07003807/**---------------------------------------------------------------------------
3808
3809 \brief wlan_ftm_rx_mode() -
3810
3811 This function is used for start/stop the rx packet generation.
3812
3813 \param - pAdapter - Pointer HDD Context.
3814 - rxmode - 0-disable RX.
3815 - 1-rx ALL frames
3816 - 2-rx 11 g/n frames
3817 - 3-rx 11b frames
3818
3819 \return - 0 for success, non zero for failure
3820
3821 --------------------------------------------------------------------------*/
3822
3823static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3824{
Jeff Johnson295189b2012-06-20 16:38:30 -07003825 uPttMsgs *pMsgBody;
3826 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303827 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003828
3829 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303830 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003831 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303832 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3833 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003834 return VOS_STATUS_E_FAILURE;
3835 }
3836
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303837 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003838 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303839 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3840 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003841 return VOS_STATUS_E_FAILURE;
3842 }
3843
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303844 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003845 init_completion(&pHddCtx->ftm.ftm_comp_var);
3846
3847 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3848 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3849
3850 pMsgBody = &pMsgBuf->msgBody;
3851
3852 switch(rxmode)
3853 {
3854 case RXMODE_DISABLE_ALL:
3855 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3856 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3857 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3858 break;
3859
3860 case RXMODE_ENABLE_ALL:
3861 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3862 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3863 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3864 break;
3865
3866 case RXMODE_ENABLE_11GN:
3867 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3868 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3869 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3870 break;
3871
3872 case RXMODE_ENABLE_11B:
3873 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3874 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3875 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3876 break;
3877
3878 }
3879
3880 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3881
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303882 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003883 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303884 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3885 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003886 status = VOS_STATUS_E_FAILURE;
3887 goto done;
3888 }
c_hpothuffdb5272013-10-02 16:42:35 +05303889 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303890 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303891 if (0 >= ret )
3892 {
3893 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3894 FL(" wait on ftm_comp_var failed %ld"), ret);
3895 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003896
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303897 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003898 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303899 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3900 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003901 status = VOS_STATUS_E_FAILURE;
3902 goto done;
3903 }
3904 ftm_status.rxmode = rxmode ;
3905done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003906
3907 return status;
3908}
3909
3910/**---------------------------------------------------------------------------
3911
3912 \brief wlan_ftm_priv_rx_pkt_clear() -
3913
3914 This function sets the rx pkt count to zero.
3915
3916 \param - pAdapter - Pointer HDD Context.
3917 - rx_pkt_clear - rx_pkt_clear value.
3918
3919 \return - 0 for success, non zero for failure
3920
3921 --------------------------------------------------------------------------*/
3922
3923static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3924{
Jeff Johnson295189b2012-06-20 16:38:30 -07003925 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303926 long ret;
3927
Jeff Johnson295189b2012-06-20 16:38:30 -07003928 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3929
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303930 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003931 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303932 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3933 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003934 return VOS_STATUS_E_FAILURE;
3935 }
3936
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303937 if (rx_pkt_clear != 1)
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:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003941 return VOS_STATUS_E_FAILURE;
3942 }
3943
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303944 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003945 init_completion(&pHddCtx->ftm.ftm_comp_var);
3946 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
3947 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
3948
Jeff Johnson295189b2012-06-20 16:38:30 -07003949 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3950
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303951 if (status != VOS_STATUS_SUCCESS)
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:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003955 status = VOS_STATUS_E_FAILURE;
3956 goto done;
3957 }
c_hpothuffdb5272013-10-02 16:42:35 +05303958 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303959 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303960 if (0 >= ret )
3961 {
3962 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3963 FL("wait on ftm_comp_var failed %ld"), ret);
3964 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003965
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303966 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003967 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303968 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3969 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003970 status = VOS_STATUS_E_FAILURE;
3971 goto done;
3972 }
3973done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003974
3975 return status;
3976}
3977
3978/**---------------------------------------------------------------------------
3979
3980 \brief wlan_ftm_priv_get_channel() -
3981
3982 This function gets the channel number from the halphy ptt module and
3983 returns the channel number to the application.
3984
3985 \param - pAdapter - Pointer HDD Context.
3986 - pChannel - Poniter to get the Channel number.
3987
3988 \return - 0 for success, non zero for failure
3989
3990 --------------------------------------------------------------------------*/
3991
3992static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
3993{
Jeff Johnson295189b2012-06-20 16:38:30 -07003994 uPttMsgs *pMsgBody;
3995 VOS_STATUS status;
3996 v_U16_t freq;
3997 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05303998 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003999
4000 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4001
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304002 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004003 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304004 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4005 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004006 return VOS_STATUS_E_FAILURE;
4007 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304008 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004009 init_completion(&pHddCtx->ftm.ftm_comp_var);
4010 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4011 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4012
4013 pMsgBody = &pMsgBuf->msgBody;
4014 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
4015
4016 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4017
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304018 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004019 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304020 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4021 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004022 status = VOS_STATUS_E_FAILURE;
4023 goto done;
4024
4025 }
c_hpothuffdb5272013-10-02 16:42:35 +05304026 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304027 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304028 if (0 >= ret )
4029 {
4030 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4031 FL("wait on ftm_comp_var failed %ld"), ret);
4032 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004033
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304034 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004035 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304036 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4037 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004038 status = VOS_STATUS_E_FAILURE;
4039 goto done;
4040 }
4041
4042 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4043
4044 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4045 indx++;
4046 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4047 {
4048 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4049 status = VOS_STATUS_E_FAILURE;
4050 goto done;
4051 }
4052
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004053 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004054
Arif Hussain6d2a3322013-11-17 19:50:10 -08004055 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004056 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004057
4058 return status;
4059}
4060
4061/**---------------------------------------------------------------------------
4062
4063 \brief wlan_ftm_priv_get_txpower() -
4064
4065 This function gets the TX power from the halphy ptt module and
4066 returns the TX power to the application.
4067
4068 \param - pAdapter - Pointer HDD Context.
4069 - pTxPwr - Poniter to get the Tx power.
4070
4071 \return - 0 for success, non zero for failure
4072
4073 --------------------------------------------------------------------------*/
4074
4075static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4076{
Jeff Johnson295189b2012-06-20 16:38:30 -07004077 uPttMsgs *pMsgBody;
4078 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304079 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004080 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4081
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304082 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004083 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304084 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4085 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004086 return VOS_STATUS_E_FAILURE;
4087 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304088 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004089 init_completion(&pHddCtx->ftm.ftm_comp_var);
4090 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4091 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4092
4093 pMsgBody = &pMsgBuf->msgBody;
4094
4095 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4096
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304097 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004098 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304099 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4100 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004101 status = VOS_STATUS_E_FAILURE;
4102 goto done;
4103 }
c_hpothuffdb5272013-10-02 16:42:35 +05304104 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304105 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304106 if (0 >= ret )
4107 {
4108 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4109 FL("wait on ftm_comp_var failed %ld"), ret);
4110 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004111
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304112 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004113 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304114 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4115 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004116 status = VOS_STATUS_E_FAILURE;
4117 goto done;
4118 }
4119 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4120
4121 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004122
4123 return status;
4124}
4125
4126/**---------------------------------------------------------------------------
4127
4128 \brief wlan_ftm_priv_get_ftm_version() -
4129
4130 This function gets ftm driver and firmware version.
4131
4132 \param - pAdapter - Pointer HDD Context.
4133 - pTxRate - Poniter to get the Tx rate.
4134
4135 \return - 0 for success, non zero for failure
4136
4137 --------------------------------------------------------------------------*/
4138
4139VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4140{
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 uPttMsgs *pMsgBody;
4142 VOS_STATUS status;
4143 v_U32_t reg_val;
4144 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004145 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4146 int lenRes = 0;
4147 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304148 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004149
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304150 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004151 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304152 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4153 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004154 return VOS_STATUS_E_FAILURE;
4155 }
4156
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304157 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004158 init_completion(&pHddCtx->ftm.ftm_comp_var);
4159 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4160 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4161
4162 pMsgBody = &pMsgBuf->msgBody;
4163 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4164
4165 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4166
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304167 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004168 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304169 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4170 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004171 status = VOS_STATUS_E_FAILURE;
4172 goto done;
4173
4174 }
c_hpothuffdb5272013-10-02 16:42:35 +05304175 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304176 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304177 if (0 >= ret )
4178 {
4179 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4180 FL("wait on ftm_comp_var failed %ld"), ret);
4181 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004182
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304183 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004184 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304185 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4186 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004187 status = VOS_STATUS_E_FAILURE;
4188 goto done;
4189 }
4190
4191 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4192
4193 init_completion(&pHddCtx->ftm.ftm_comp_var);
4194
4195 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4196 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4197
4198 pMsgBody = &pMsgBuf->msgBody;
4199
4200 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4201
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304202 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004203 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304204 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4205 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004206 status = VOS_STATUS_E_FAILURE;
4207 goto done;
4208 }
c_hpothuffdb5272013-10-02 16:42:35 +05304209 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304210 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304211 if (0 >= ret )
4212 {
4213 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4214 FL("wait on ftm_comp_var failed %ld"), ret);
4215 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004216
4217 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4218 if(lenRes < 0 || lenRes >= lenBuf)
4219 {
4220 status = VOS_STATUS_E_FAILURE;
4221 goto done;
4222 }
4223
4224 buf += lenRes;
4225 lenBuf -= lenRes;
4226
4227 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004228 lenRes = snprintf(buf, lenBuf, "%x.%x-",(v_U8_t)(reg_val >> 8), (v_U8_t)(reg_val &0x000000FF));
Jeff Johnson295189b2012-06-20 16:38:30 -07004229 if(lenRes < 0 || lenRes >= lenBuf)
4230 {
4231 status = VOS_STATUS_E_FAILURE;
4232 goto done;
4233 }
4234
4235 buf += lenRes;
4236 lenBuf -= lenRes;
4237
4238 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4239 if(lenRes < 0 || lenRes >= lenBuf)
4240 {
4241 status = VOS_STATUS_E_FAILURE;
4242 goto done;
4243 }
4244
4245 buf += lenRes;
4246 lenBuf -= lenRes;
4247
Jeff Johnson295189b2012-06-20 16:38:30 -07004248
4249done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004250
4251 return status;
4252
4253}
4254
4255/**---------------------------------------------------------------------------
4256
4257 \brief wlan_ftm_priv_get_txrate() -
4258
4259 This function gets the TX rate from the halphy ptt module and
4260 returns the TX rate to the application.
4261
4262 \param - pAdapter - Pointer HDD Context.
4263 - pTxRate - Poniter to get the Tx rate.
4264
4265 \return - 0 for success, non zero for failure
4266
4267 --------------------------------------------------------------------------*/
4268
4269static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4270{
Jeff Johnson295189b2012-06-20 16:38:30 -07004271 uPttMsgs *pMsgBody;
4272 VOS_STATUS status;
4273 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304274 long ret;
4275
Jeff Johnson295189b2012-06-20 16:38:30 -07004276 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4277
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304278 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004279 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304280 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4281 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004282 return VOS_STATUS_E_FAILURE;
4283 }
4284
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304285 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004286 init_completion(&pHddCtx->ftm.ftm_comp_var);
4287 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4288 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4289
4290 pMsgBody = &pMsgBuf->msgBody;
4291
4292 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4293
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304294 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004295 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304296 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4297 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004298 status = VOS_STATUS_E_FAILURE;
4299 goto done;
4300 }
c_hpothuffdb5272013-10-02 16:42:35 +05304301 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304302 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304303 if (0 >= ret )
4304 {
4305 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4306 FL("wait on ftm_comp_var failed %ld"), ret);
4307 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004308
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304309 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004310
4311 rate_index = pMsgBody->GetTxPowerReport.rate;
4312 }
4313 else {
4314 /*Return the default rate*/
4315 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304316 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4317 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004318 status = VOS_STATUS_E_FAILURE;
4319 goto done;
4320 }
4321
4322 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4323 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4324 break;
4325 }
4326 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4327 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004328 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004329 status = VOS_STATUS_E_FAILURE;
4330 goto done;
4331 }
4332 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4333done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004334
4335 return status;
4336
4337}
4338
4339/**---------------------------------------------------------------------------
4340
4341 \brief wlan_ftm_priv_get_rx_pkt_count() -
4342
4343 This function gets the rx pkt count from the halphy ptt module and
4344 returns the rx pkt count to the application.
4345
4346 \param - pAdapter - Pointer HDD Context.
4347 - pRxPktCnt - Poniter to get the rx pkt count.
4348
4349 \return - 0 for success, non zero for failure
4350
4351 --------------------------------------------------------------------------*/
4352
4353static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4354{
Jeff Johnson295189b2012-06-20 16:38:30 -07004355 uPttMsgs *pMsgBody;
4356 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304357 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004358 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4359
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304360 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004361 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304362 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4363 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004364 return VOS_STATUS_E_FAILURE;
4365 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304366 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004367 init_completion(&pHddCtx->ftm.ftm_comp_var);
4368 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4369 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4370
4371 pMsgBody = &pMsgBuf->msgBody;
4372
4373 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4374
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304375 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004376 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304377 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4378 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004379 status = VOS_STATUS_E_FAILURE;
4380 goto done;
4381 }
c_hpothuffdb5272013-10-02 16:42:35 +05304382 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304383 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304384 if (0 >= ret )
4385 {
4386 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4387 FL("wait on ftm_comp_var failed %ld"), ret);
4388 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004389
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304390 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004391 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304392 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4393 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004394 status = VOS_STATUS_E_FAILURE;
4395 goto done;
4396 }
4397 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4398done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004399
4400 return status;
4401}
4402
4403/**---------------------------------------------------------------------------
4404
4405 \brief wlan_ftm_priv_get_rx_rssi() -
4406
4407 This function gets the rx rssi from the halphy ptt module and
4408 returns the rx rssi to the application.
4409
4410 \param - pAdapter - Pointer HDD Context.
4411 - buf - Poniter to get rssi of Rx chains
4412
4413 \return - 0 for success, non zero for failure
4414
4415 --------------------------------------------------------------------------*/
4416
4417static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4418{
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 uPttMsgs *pMsgBody;
4420 VOS_STATUS status;
4421 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304422 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004423
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304424 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004425 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304426 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4427 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004428 return VOS_STATUS_E_FAILURE;
4429 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304430 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004431 init_completion(&pHddCtx->ftm.ftm_comp_var);
4432 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4433 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4434
4435 pMsgBody = &pMsgBuf->msgBody;
4436
4437 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4438
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304439 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004440 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304441 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4442 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004443 status = VOS_STATUS_E_FAILURE;
4444 goto done;
4445 }
c_hpothuffdb5272013-10-02 16:42:35 +05304446 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304447 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304448 if (0 >= ret )
4449 {
4450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4451 FL("wait on ftm_comp_var failed %ld"), ret);
4452 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004453
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304454 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004455 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304456 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4457 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004458 status = VOS_STATUS_E_FAILURE;
4459 goto done;
4460 }
4461
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004462 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4463 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004464 pMsgBody->GetRxRssi.rssi.rx[1]);
4465
4466 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4467 {
4468 status = VOS_STATUS_E_FAILURE;
4469 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004470
Jeff Johnson295189b2012-06-20 16:38:30 -07004471done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004472
4473 return status;
4474}
4475
4476/**---------------------------------------------------------------------------
4477
4478 \brief wlan_ftm_priv_get_mac_address() -
4479
4480 This function gets the mac address from the halphy ptt module and
4481 returns the mac address to the application.
4482
4483 \param - pAdapter - Pointer HDD Context.
4484 - buf - Poniter to get the mac address.
4485
4486 \return - 0 for success, non zero for failure
4487
4488 --------------------------------------------------------------------------*/
4489
4490static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4491{
4492 v_BOOL_t itemIsValid = VOS_FALSE;
4493 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4494 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004495
Jeff Johnson295189b2012-06-20 16:38:30 -07004496 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4497
4498 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4499 {
4500 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4501 return VOS_STATUS_E_FAILURE;
4502 }
4503 /*Check the NV FIELD is valid or not*/
4504 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4505 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004506 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004507 {
4508 vos_nv_readMacAddress(macAddr);
4509
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004510 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4511 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004512 MAC_ADDR_ARRAY(macAddr));
4513 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4514 {
4515 return VOS_STATUS_E_FAILURE;
4516 }
4517 }
4518 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004519 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004520 {
4521 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004522 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4523 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004524 MAC_ADDR_ARRAY(macAddr));
4525
4526 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4527 {
4528 return VOS_STATUS_E_FAILURE;
4529 }
4530 }
4531 return VOS_STATUS_SUCCESS;
4532}
4533
4534/**---------------------------------------------------------------------------
4535
4536 \brief wlan_ftm_priv_set_mac_address() -
4537
4538 This function sets the mac address to the halphy ptt module and
4539 sends the netlink message to the ptt socket application which writes
4540 the macaddress to the qcom_wlan_nv.bin file
4541
4542 \param - pAdapter - Pointer HDD Context.
4543 - buf - Poniter to the macaddress.
4544
4545 \return - 0 for success, non zero for failure
4546
4547 --------------------------------------------------------------------------*/
4548
4549static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4550{
Jeff Johnson295189b2012-06-20 16:38:30 -07004551 uPttMsgs *pMsgBody;
4552 VOS_STATUS status;
4553 int macAddr[VOS_MAC_ADDRESS_LEN];
4554 v_U8_t *pMacAddress;
4555 v_U8_t ii;
4556 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304557 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004558
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304559 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004560 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304561 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4562 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004563 return VOS_STATUS_E_FAILURE;
4564 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304565 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004566 init_completion(&pHddCtx->ftm.ftm_comp_var);
4567 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4568 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4569
4570 pMsgBody = &pMsgBuf->msgBody;
4571 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4572
4573 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004574 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]))
4575 {
4576 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4577 "Invalid MacAddress Input %s", buf);
4578 return VOS_STATUS_E_FAILURE;
4579 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004580
Arif Hussain24bafea2013-11-15 15:10:03 -08004581 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4582 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004583
4584
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004585 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004586
4587 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4588 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4589
4590
Arif Hussain24bafea2013-11-15 15:10:03 -08004591 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4592 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004593 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4594
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304595 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004596 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304597 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4598 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004599 status = VOS_STATUS_E_FAILURE;
4600 goto done;
4601 }
c_hpothuffdb5272013-10-02 16:42:35 +05304602 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304603 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304604 if (0 >= ret )
4605 {
4606 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4607 FL("wait on ftm_comp_var failed %ld"), ret);
4608 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004609
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304610 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004611 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304612 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4613 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004614 status = VOS_STATUS_E_FAILURE;
4615 goto done;
4616 }
4617
Arif Hussain6d2a3322013-11-17 19:50:10 -08004618 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004619
4620 init_completion(&pHddCtx->ftm.ftm_comp_var);
4621 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4622
4623 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4624 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4625
4626 pMsgBody = &pMsgBuf->msgBody;
4627
4628 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4629
4630 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4631
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304632 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004633 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4635 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004636 status = VOS_STATUS_E_FAILURE;
4637 goto done;
4638 }
4639
c_hpothuffdb5272013-10-02 16:42:35 +05304640 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304641 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304642 if (0 >= ret )
4643 {
4644 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4645 FL("wait on ftm_comp_var failed %ld"), ret);
4646 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004647done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004648
4649 return VOS_STATUS_SUCCESS;
4650}
4651
4652/* set param sub-ioctls */
4653static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4654 union iwreq_data *wrqu, char *extra)
4655{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004656 int ret,sub_cmd;
4657 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004658 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004659 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004660 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004661
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004662 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004663 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004664 length = wrqu->data.length;
4665 sub_cmd = wrqu->data.flags;
4666 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4667
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004668 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4669 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4670 * odd number which assigns set_args to zero.we assisgn memory using
4671 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004672 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004673 param = kzalloc(length + 1, GFP_KERNEL);
4674 if (!param)
4675 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004676
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004677 if (copy_from_user(param, pointer, length))
4678 {
4679 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4680 "%s:Failed to get user data %s", __func__, param);
4681
4682 ret = -EINVAL;
4683 goto OUT;
4684 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004685
4686 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4687 "%s: Received length %d", __func__, length);
4688
4689 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004690 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004691
4692 switch(sub_cmd)
4693 {
4694 case WE_SET_MAC_ADDRESS:
4695 {
4696
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004697 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004698 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004699
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004700 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004701
4702 if(status != VOS_STATUS_SUCCESS)
4703 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004704 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004705 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004706
Jeff Johnson295189b2012-06-20 16:38:30 -07004707 ret = -EINVAL;
4708 }
4709
Wilson Yang7c471652013-12-20 16:36:44 -08004710 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004711 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004712 case WE_SET_TX_RATE:
4713 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004714 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004715
4716 if(status != VOS_STATUS_SUCCESS)
4717 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004718 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004719 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004720
4721 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004722 }
4723
4724 break;
Wilson Yang7c471652013-12-20 16:36:44 -08004725 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004726 default:
4727 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004728 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004729 ret = -EINVAL;
4730 break;
4731 }
4732 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004733
4734OUT:
4735 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004736 return ret;
4737}
4738
4739static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4740 union iwreq_data *wrqu, char *extra)
4741{
4742 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4743 int *value = (int *)extra;
4744 int sub_cmd = value[0];
4745 int set_value = value[1];
4746 int ret = 0; /* success */
4747 VOS_STATUS status;
4748
4749 switch(sub_cmd)
4750 {
4751 case WE_FTM_ON_OFF:
4752 {
4753 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4754
4755 if(status != VOS_STATUS_SUCCESS)
4756 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004757 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004758 ret = -EINVAL;
4759 }
4760
4761 break;
4762 }
4763
4764 case WE_TX_PKT_GEN:
4765 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4766
4767 if(status != VOS_STATUS_SUCCESS)
4768 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004769 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004770 ret = -EINVAL;
4771 }
4772 break;
4773
4774 case WE_SET_TX_IFS:
4775 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4776
4777 if(status != VOS_STATUS_SUCCESS)
4778 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004779 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004780 ret = -EINVAL;
4781 }
4782 break;
4783
4784 case WE_SET_TX_PKT_CNT:
4785 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4786
4787 if(status != VOS_STATUS_SUCCESS)
4788 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004789 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004790 ret = -EINVAL;
4791 }
4792 break;
4793
4794 case WE_SET_TX_PKT_LEN:
4795 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4796
4797 if(status != VOS_STATUS_SUCCESS)
4798 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004799 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004800 ret = -EINVAL;
4801 }
4802 break;
4803
4804 case WE_SET_CHANNEL:
4805 {
4806 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4807
4808 if(status != VOS_STATUS_SUCCESS)
4809 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004810 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004811 ret = -EINVAL;
4812 }
4813 break;
4814 }
4815 case WE_SET_TX_POWER:
4816 {
4817 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4818
4819 if(status != VOS_STATUS_SUCCESS)
4820 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004821 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004822 ret = -EINVAL;
4823 }
4824 break;
4825 }
4826 case WE_CLEAR_RX_PKT_CNT:
4827 {
4828 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4829
4830 if(status != VOS_STATUS_SUCCESS)
4831 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004832 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004833 ret = -EINVAL;
4834 }
4835 break;
4836 }
4837 case WE_RX:
4838 {
4839 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4840
4841 if(status != VOS_STATUS_SUCCESS)
4842 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004843 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004844 ret = -EINVAL;
4845 }
4846 break;
4847 }
4848 case WE_ENABLE_CHAIN:
4849 {
4850 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4851
4852 if(status != VOS_STATUS_SUCCESS)
4853 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004854 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004855 ret = -EINVAL;
4856 }
4857 break;
4858 }
4859
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304860 case WE_SET_PWR_CNTL_MODE:
4861 {
4862 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4863 if (status != VOS_STATUS_SUCCESS)
4864 {
4865 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4866 status);
4867 ret = -EINVAL;
4868 }
4869 break;
4870 }
4871
4872 case WE_ENABLE_DPD:
4873 {
4874 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4875 if (status != VOS_STATUS_SUCCESS)
4876 {
4877 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4878 ret = -EINVAL;
4879 }
4880 break;
4881 }
4882
4883 case WE_SET_CB:
4884 {
4885 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4886 if (status != VOS_STATUS_SUCCESS)
4887 {
4888 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4889 ret = -EINVAL;
4890 }
4891 break;
4892 }
4893
Jeff Johnson295189b2012-06-20 16:38:30 -07004894 default:
4895 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004896 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004897 sub_cmd, set_value);
4898 break;
4899 }
4900 }
4901
4902 return ret;
4903}
4904
4905/* get param sub-ioctls */
4906static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4907 union iwreq_data *wrqu, char *extra)
4908{
4909 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4910 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004911 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004912 VOS_STATUS status;
4913
4914 switch (value[0])
4915 {
4916 case WE_GET_CHANNEL:
4917 {
4918 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4919
4920 if(status != VOS_STATUS_SUCCESS)
4921 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004922 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004923 ret = -EINVAL;
4924 }
4925 break;
4926 }
4927 case WE_GET_TX_POWER:
4928 {
4929 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4930
4931 if(status != VOS_STATUS_SUCCESS)
4932 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004933 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004934 ret = -EINVAL;
4935 }
4936 break;
4937 }
4938 case WE_GET_RX_PKT_CNT:
4939 {
4940 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4941
4942 if(status != VOS_STATUS_SUCCESS)
4943 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004944 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004945 ret = -EINVAL;
4946 }
4947 break;
4948 }
4949 default:
4950 {
4951 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
4952 break;
4953 }
4954 }
4955
4956 return ret;
4957}
4958
4959static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
4960 union iwreq_data *wrqu, char *extra)
4961{
4962 int sub_cmd = wrqu->data.flags;
4963 VOS_STATUS status;
4964 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4965
4966 switch(sub_cmd)
4967 {
4968 case WE_GET_MAC_ADDRESS:
4969 {
4970 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
4971
4972 if(status != VOS_STATUS_SUCCESS)
4973 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004974 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004975 return -EINVAL;
4976 }
4977 wrqu->data.length = strlen(extra)+1;
4978 break;
4979 }
4980 case WE_GET_TX_RATE:
4981 {
4982 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
4983
4984 if(status != VOS_STATUS_SUCCESS)
4985 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004986 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004987 return -EINVAL;
4988 }
4989
4990 wrqu->data.length = strlen(extra)+1;
4991 break;
4992 }
4993 case WE_GET_FTM_VERSION:
4994 {
4995 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
4996
4997 if(status != VOS_STATUS_SUCCESS)
4998 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004999 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005000 return -EINVAL;
5001 }
5002 wrqu->data.length = strlen(extra)+1;
5003 break;
5004 }
5005 case WE_GET_FTM_STATUS:
5006 {
5007 status = wlan_ftm_priv_get_status(pAdapter, extra);
5008
5009 if(status != VOS_STATUS_SUCCESS)
5010 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005011 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005012 return -EINVAL;
5013 }
5014
5015 wrqu->data.length = strlen(extra)+1;
5016 break;
5017 }
5018 case WE_GET_RX_RSSI:
5019 {
5020 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5021
5022 if(status != VOS_STATUS_SUCCESS)
5023 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005024 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005025 return -EINVAL;
5026 }
5027
5028 wrqu->data.length = strlen(extra)+1;
5029 break;
5030 }
5031 default:
5032 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005033 hddLog(LOGE, "Invalid IOCTL command %d", sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005034 break;
5035 }
5036 }
5037
5038 return 0;
5039}
Jeff Johnson295189b2012-06-20 16:38:30 -07005040
5041VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5042{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005043#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005044 tAniHdr *wmsg = NULL;
5045 v_U8_t *pBuf;
5046 hdd_context_t *pHddCtx = NULL;
5047 v_CONTEXT_t pVosContext= NULL;
5048
5049 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5050 if(pBuf == NULL)
5051 {
5052 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5053 return VOS_STATUS_E_NOMEM;
5054 }
5055 wmsg = (tAniHdr*)pBuf;
5056 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5057 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5058 wmsg->length = FTM_SWAP16(wmsg->length);
5059 pBuf += sizeof(tAniHdr);
5060
5061 /*Get the global context */
5062 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5063
5064 /*Get the Hdd Context */
5065 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5066 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5067
5068 /* EfS command Code */
5069 *(v_U32_t*)pBuf = 0x000000EF;
5070
5071 pBuf += sizeof(v_U32_t);
5072
5073 memcpy(pBuf, pData,data_len);
5074
5075 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
5076 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
5077
Arif Hussain6d2a3322013-11-17 19:50:10 -08005078 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 -07005079 vos_mem_free((v_VOID_t*)wmsg);
5080 return VOS_STATUS_E_FAILURE;
5081 }
5082 }
5083 else {
5084 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
5085
Arif Hussain6d2a3322013-11-17 19:50:10 -08005086 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 -07005087 vos_mem_free((v_VOID_t*)wmsg);
5088 return VOS_STATUS_E_FAILURE;
5089 }
5090 }
5091
5092 vos_mem_free((v_VOID_t*)wmsg);
5093#endif //FTM and ANDROID
5094
5095 return VOS_STATUS_SUCCESS;
5096}
5097
Jeff Johnson295189b2012-06-20 16:38:30 -07005098/* action sub-ioctls */
5099static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5100 union iwreq_data *wrqu, char *extra)
5101{
5102 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005103 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005104
5105 switch (sub_cmd)
5106 {
5107 case WE_SET_NV_DEFAULTS:
5108 {
5109 v_U8_t *pu8buf,*pTempBuf;
5110 v_U16_t size;
5111 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005112 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005113 pu8buf = vos_mem_malloc(size);
5114 if(pu8buf == NULL)
5115 {
5116 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5117 return VOS_STATUS_E_NOMEM;
5118 }
5119 memset(pu8buf,0,size);
5120 pTempBuf = pu8buf;
5121 pTempBuf += sizeof(v_U32_t);
5122 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5123
5124 wlan_write_to_efs(pu8buf,size);
5125 vos_mem_free(pu8buf);
5126 }
5127
5128 default:
5129 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005130 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005131 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5132 break;
5133 }
5134 }
5135
5136 return ret;
5137}
5138
Jeff Johnson295189b2012-06-20 16:38:30 -07005139static const iw_handler we_ftm_private[] = {
5140
5141 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5142 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5143 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5144 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5145 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07005146};
5147
5148/*Maximum command length can be only 15 */
5149static const struct iw_priv_args we_ftm_private_args[] = {
5150
5151 /* handlers for main ioctl */
5152 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5153 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5154 0,
5155 "" },
5156
5157 { WE_FTM_ON_OFF,
5158 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5159 0,
5160 "ftm" },
5161
5162 { WE_TX_PKT_GEN,
5163 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5164 0,
5165 "tx" },
5166
5167 { WE_SET_TX_IFS,
5168 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5169 0,
5170 "set_txifs" },
5171
5172 { WE_SET_TX_PKT_CNT,
5173 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5174 0,
5175 "set_txpktcnt" },
5176
5177 { WE_SET_TX_PKT_LEN,
5178 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5179 0,
5180 "set_txpktlen" },
5181
5182 { WE_SET_CHANNEL,
5183 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5184 0,
5185 "set_channel" },
5186
5187 { WE_SET_TX_POWER,
5188 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5189 0,
5190 "set_txpower" },
5191
5192 { WE_CLEAR_RX_PKT_CNT,
5193 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5194 0,
5195 "clr_rxpktcnt" },
5196
5197 { WE_RX,
5198 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5199 0,
5200 "rx" },
5201
5202 { WE_ENABLE_CHAIN,
5203 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5204 0,
5205 "ena_chain" },
5206
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305207 { WE_SET_PWR_CNTL_MODE,
5208 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5209 0,
5210 "pwr_cntl_mode" },
5211
5212 { WE_ENABLE_DPD,
5213 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5214 0,
5215 "ena_dpd" },
5216
5217 { WE_SET_CB,
5218 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5219 0,
5220 "set_cb" },
5221
Jeff Johnson295189b2012-06-20 16:38:30 -07005222 /* handlers for main ioctl */
5223 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5224 0,
5225 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5226 "" },
5227
5228 { WE_GET_CHANNEL,
5229 0,
5230 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5231 "get_channel" },
5232
5233 { WE_GET_TX_POWER,
5234 0,
5235 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5236 "get_txpower" },
5237
5238 { WE_GET_RX_PKT_CNT,
5239 0,
5240 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5241 "get_rxpktcnt" },
5242
5243 /* handlers for main ioctl */
5244 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5245 IW_PRIV_TYPE_CHAR| 512,
5246 0,
5247 "" },
5248
5249 { WE_SET_MAC_ADDRESS,
5250 IW_PRIV_TYPE_CHAR| 512,
5251 0,
5252 "set_mac_address" },
5253
5254 { WE_SET_TX_RATE,
5255 IW_PRIV_TYPE_CHAR | 512,
5256 0,
5257 "set_txrate" },
5258
5259 /* handlers for main ioctl */
5260 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5261 0,
5262 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5263 "" },
5264
5265 { WE_GET_MAC_ADDRESS,
5266 0,
5267 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5268 "get_mac_address" },
5269
5270 { WE_GET_FTM_VERSION,
5271 0,
5272 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5273 "ftm_version" },
5274
5275 { WE_GET_TX_RATE,
5276 0,
5277 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5278 "get_txrate" },
5279
5280 { WE_GET_FTM_STATUS,
5281 0,
5282 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5283 "get_status" },
5284
5285 { WE_GET_RX_RSSI,
5286 0,
5287 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5288 "get_rx_rssi" },
5289
Jeff Johnson295189b2012-06-20 16:38:30 -07005290 /* handlers for main ioctl */
5291 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5292 0,
5293 0,
5294 "" },
5295
5296 /* handlers for sub-ioctl */
5297 { WE_SET_NV_DEFAULTS,
5298 0,
5299 0,
5300 "set_nv_defaults" },
5301
5302};
5303
5304const struct iw_handler_def we_ftm_handler_def = {
5305 .num_standard = 0,
5306 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5307 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5308
5309 .standard = (iw_handler *)NULL,
5310 .private = (iw_handler *)we_ftm_private,
5311 .private_args = we_ftm_private_args,
5312 .get_wireless_stats = NULL,
5313};
5314
5315static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5316{
5317
5318 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5319
5320 // Zero the memory. This zeros the profile structure.
5321 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005322
Jeff Johnson295189b2012-06-20 16:38:30 -07005323 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5324
5325 return 0;
5326}
5327
Jeff Johnson295189b2012-06-20 16:38:30 -07005328
5329VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5330{
Jeff Johnson295189b2012-06-20 16:38:30 -07005331 ftm_rsp_msg_t *pFtmMsgRsp;
5332
5333 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5334 hdd_context_t *pHddCtx;
5335 v_CONTEXT_t pVosContext= NULL;
5336
5337 ENTER();
5338
5339 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5340
5341 if (!message )
5342 {
5343 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5344 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5345 return VOS_STATUS_E_INVAL;
5346 }
5347 /*Get the global context */
5348 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5349
5350 /*Get the Hdd Context */
5351 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5352
5353 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5354
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305355 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005356 complete(&pHddCtx->ftm.ftm_comp_var);
5357 }
5358 else {
5359 /*Response length to Ptt App*/
5360 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5361
5362 /*Ptt App expects the response length in LE */
5363 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5364
5365 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005366 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005367 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5368
5369 /*Copy the message*/
5370 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5371
5372 /*Update the error code*/
5373 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5374
5375 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5376
5377 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5378 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005379 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005380 return VOS_STATUS_E_FAILURE;
5381 }
5382 }
5383 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 return VOS_STATUS_SUCCESS;
5385
5386}