blob: 4d50e7965c14231ebf917e721a5d185ba3fc12ee [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42/**========================================================================
43
44 \file wlan_hdd_ftm.c
45
46 \brief This file contains the WLAN factory test mode implementation
47
48 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
49
50 Qualcomm Confidential and Proprietary.
51
52 ========================================================================*/
53
54/**=========================================================================
55
56 EDIT HISTORY FOR FILE
57
58
59 This section contains comments describing changes made to the module.
60 Notice that changes are listed in reverse chronological order.
61
62
63 $Header:$ $DateTime: $ $Author: $
64
65
66 when who what, where, why
67 -------- --- --------------------------------------------------------
68 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
69 for FTM and mission mode
70 04/5/09 Shailender Created module.
71
72 ==========================================================================*/
73#include <vos_mq.h>
74#include "vos_sched.h"
75#include <vos_api.h>
76#include "sirTypes.h"
77#include "halTypes.h"
78#include "sirApi.h"
79#include "sirMacProtDef.h"
80#include "sme_Api.h"
81#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070082#include "wlan_qct_sys.h"
83#include "wlan_qct_tl.h"
84#include "wlan_hdd_misc.h"
85#include "i_vos_packet.h"
86#include "vos_nvitem.h"
87#include "wlan_hdd_main.h"
88#include "vos_power.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070089#include "qwlan_version.h"
90
Jeff Johnson295189b2012-06-20 16:38:30 -070091#include "wlan_nv.h"
92#include "wlan_qct_wda.h"
93#include "cfgApi.h"
94#include "pttMsgApi.h"
95#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070096
Jeff Johnson295189b2012-06-20 16:38:30 -070097#define RXMODE_DISABLE_ALL 0
98#define RXMODE_ENABLE_ALL 1
99#define RXMODE_ENABLE_11GN 2
100#define RXMODE_ENABLE_11B 3
101
102#define FTM_CHAIN_SEL_NO_RX_TX 0
103#define FTM_CHAIN_SEL_R0_ON 1
104#define FTM_CHAIN_SEL_T0_ON 2
105#define FTM_CHAIN_SEL_R0_T0_ON 3
106#define FTM_CHAIN_SEL_MAX 3
107
Jeff Johnson295189b2012-06-20 16:38:30 -0700108#ifndef QWLAN_PHYDBG_BASE
109#define QWLAN_PHYDBG_BASE 0x03004000
110#endif /* QWLAN_PHYDBG_BASE */
111
112#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800113#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700114#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
115#endif
116
117#ifndef QWLAN_AGC_BASE
118#define QWLAN_AGC_BASE 0x03013C00
119#endif /* QWLAN_AGC_BASE */
120
121#ifndef QWLAN_AGC_CHANNEL_FREQ_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800122#define QWLAN_AGC_CHANNEL_FREQ_REG (QWLAN_AGC_BASE + 0x34)
Jeff Johnson295189b2012-06-20 16:38:30 -0700123#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
124#endif /* QWLAN_AGC_CHANNEL_FREQ_REG */
125
126#ifndef QWLAN_AGC_SUBBAND_CONFIG_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800127#define QWLAN_AGC_SUBBAND_CONFIG_REG (QWLAN_AGC_BASE + 0x30)
Jeff Johnson295189b2012-06-20 16:38:30 -0700128#define QWLAN_AGC_SUBBAND_CONFIG_STG2_SUBBAND_MASK 0x03
129#endif /* QWLAN_AGC_SUBBAND_CONFIG_REG */
130
131#ifndef QWLAN_RFAPB_BASE
132#define QWLAN_RFAPB_BASE 0x0E02F800
133#endif /* QWLAN_RFAPB_BASE */
134
135#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800136#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700137#endif /* QWLAN_RFAPB_REV_ID_REG */
138
139#ifndef QWLAN_TXCTL_BASE
140#define QWLAN_TXCTL_BASE 0x03012000
141#endif /* QWLAN_TXCTL_BASE */
142
143#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800144#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700145#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
146#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
147#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
148#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
149#endif /* QWLAN_TXCTL_FSHIFT_REG */
150
151/* To set 4MAC addresses from given first MAC address,
152 * Last byte value within given MAC address must less than 0xFF - 3 */
153#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700154#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700155
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530156#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
157
Jeff Johnson295189b2012-06-20 16:38:30 -0700158typedef struct {
159 tANI_U32 tableSize; /* Whole NV Table Size */
160 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
161 eNvTable nvTable;
162 tANI_U8 tableData; /* Filled by host driver */
163} pttGetNvTable;
164
165typedef struct {
166 tANI_U32 tableSize; /* Whole NV Table Size */
167 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
168 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700169 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700170} pttSetNvTable;
171
Jeff Johnson295189b2012-06-20 16:38:30 -0700172
173extern const sHalNv nvDefaults;
174static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700175static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700176VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700177
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700178/* 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 -0700179 Since it is associated to agc.channel_freq register for mapping.
180 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
181*/
182static const freq_chan_t freq_chan_tbl[] = {
183 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
184 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
185};
186
187static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
188{
189 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
190 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
191 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
192 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
193 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
194 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
195 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
196 //Spica_Virgo 11A 20MHz Rates
197 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
198 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
199 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
200 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
201 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
202 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
203 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
204 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
205
206//MCS Index #0-15 (20MHz)
207 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
208 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
209 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
210 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
211 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
212 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
213 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
214 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530215 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_72_2_MBPS"},
216
217//MCS Index #8-15 (40MHz)
218
219 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_B_MBPS" },
220 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
221 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
222 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
223 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
224 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
225 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
226 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
227 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
228 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
229 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
230 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
231 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
232 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
233 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
234 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"}
235
Jeff Johnson295189b2012-06-20 16:38:30 -0700236};
237
238static rateIndex2Preamble_t rate_index_2_preamble_table[] =
239{
240
241 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
242 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
243 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
244 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
245 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
246 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
247 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
248
Jeff Johnson295189b2012-06-20 16:38:30 -0700249
250 //Spica_Virgo 11A 20MHz Rates
251 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
252 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
253 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
254 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
255 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
256 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
257 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
258 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
259
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530260 // 11A 20MHz Rates
261 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
262 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
263 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
264 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
265 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
266 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
267 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
268 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
269
Jeff Johnson295189b2012-06-20 16:38:30 -0700270 //MCS Index #0-15 (20MHz)
271 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
272 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
273 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
274 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
275 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
276 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
277 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
278 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
279 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
280 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
281 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
282 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
283 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
284 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
285 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
286 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530287
288 //MCS index (40MHz)
289 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
290 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
291 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
292 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
293 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
294 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
295 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
296 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
297 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
298 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
299 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
300 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
301 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
302 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
303 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
304 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED}
305
Jeff Johnson295189b2012-06-20 16:38:30 -0700306};
307
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530308static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
309 11, 12, 13, 14, 36, 40, 44, 48,
310 52, 56, 60, 64, 100, 104, 108,
311 112, 116, 120, 124, 128, 132,
312 136, 140, 149, 153, 157, 161,
313 165, 208, 212, 216, 240, 244,
314 248, 252, 0 };
315static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
316 42, 46, 50, 54, 58, 62, 102, 106,
317 110, 114, 118, 122, 126, 130, 134,
318 138, 151, 155, 159, 163, 210, 214,
319 242, 246, 250, 0 };
320static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
321 114, 118, 122, 126, 130, 134, 155,
322 159, 246, 0 };
323
Jeff Johnson295189b2012-06-20 16:38:30 -0700324typedef struct
325{
326 tANI_BOOLEAN frameGenEnabled;
327 tANI_BOOLEAN wfmEnabled;
328 sPttFrameGenParams frameParams;
329 v_U16_t txpower;
330 v_U16_t rxmode;
331 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530332 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700333
334} FTM_STATUS ;
335static FTM_STATUS ftm_status;
336
337//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530338static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700339
340static void _ftm_status_init(void)
341{
342 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
343 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
344 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
345
346 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
347 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
348 ftm_status.frameParams.numTestPackets = 0; //Continuous
349 ftm_status.frameParams.interFrameSpace = 10;
350 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
351 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
352 ftm_status.frameParams.payloadLength = 2000;
353 ftm_status.frameParams.payloadFillByte = 0xA5;
354 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
355 ftm_status.frameParams.tx_mode = 0;
356 ftm_status.frameParams.crc = 0;
357 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
358 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
359 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
360 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
361 ftm_status.txpower = 2 ;
362 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
363 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530364 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700365
366 return;
367}
368
369/**---------------------------------------------------------------------------
370
371 \brief wlan_ftm_postmsg() -
372
373 The function used for sending the command to the halphy.
374
375 \param - cmd_ptr - Pointer command buffer.
376
377 \param - cmd_len - Command length.
378
379 \return - 0 for success, non zero for failure
380
381 --------------------------------------------------------------------------*/
382
383static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
384{
385 vos_msg_t *ftmReqMsg;
386 vos_msg_t ftmMsg;
387 ENTER();
388
389 ftmReqMsg = (vos_msg_t *) cmd_ptr;
390
Jeff Johnson295189b2012-06-20 16:38:30 -0700391 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700392 ftmMsg.reserved = 0;
393 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
394 ftmMsg.bodyval = 0;
395
396 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700397 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700398 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700399 (vos_msg_t *)&ftmMsg)) {
400 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL\n",__func__);
401
402 return VOS_STATUS_E_FAILURE;
403 }
404
405 EXIT();
406 return VOS_STATUS_SUCCESS;
407}
408
409/*---------------------------------------------------------------------------
410
411 \brief wlan_ftm_vos_open() - Open the vOSS Module
412
413 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
414 Upon successful initialization:
415
416 - All VOS submodules should have been initialized
417
418 - The VOS scheduler should have opened
419
420 - All the WLAN SW components should have been opened. This include
421 MAC.
422
423
424 \param hddContextSize: Size of the HDD context to allocate.
425
426
427 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
428 is ready to be used.
429
430 VOS_STATUS_E_RESOURCES - System resources (other than memory)
431 are unavailable to initialize the scheduler
432
433
434 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
435
436 \sa wlan_ftm_vos_open()
437
438---------------------------------------------------------------------------*/
439static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_SIZE_t hddContextSize )
440{
441 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
442 int iter = 0;
443 tSirRetStatus sirStatus = eSIR_SUCCESS;
444 tMacOpenParameters macOpenParms;
445 pVosContextType gpVosContext = (pVosContextType)pVosContext;
446
447 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
448 "%s: Opening VOSS", __func__);
449
450 if (NULL == gpVosContext)
451 {
452 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
453 "%s: Trying to open VOSS without a PreOpen",__func__);
454 VOS_ASSERT(0);
455 return VOS_STATUS_E_FAILURE;
456 }
457
458 /* Initialize the probe event */
459 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
460 {
461 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
462 "%s: Unable to init probeEvent",__func__);
463 VOS_ASSERT(0);
464 return VOS_STATUS_E_FAILURE;
465 }
466
Jeff Johnson295189b2012-06-20 16:38:30 -0700467 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
468 {
469 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
470 "%s: Unable to init wdaCompleteEvent",__func__);
471 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700472
Jeff Johnson295189b2012-06-20 16:38:30 -0700473 goto err_probe_event;
474 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700475
476 /* Initialize the free message queue */
477 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
478 if (! VOS_IS_STATUS_SUCCESS(vStatus))
479 {
480
481 /* Critical Error ... Cannot proceed further */
482 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
483 "%s: Failed to initialize VOS free message queue",__func__);
484 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700485 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700486 }
487
488 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
489 {
490 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
491 &(gpVosContext->aMsgBuffers[iter]);
492 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
493 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
494 }
495
496 /* Now Open the VOS Scheduler */
497 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
498 sizeof(VosSchedContext));
499
500 if (!VOS_IS_STATUS_SUCCESS(vStatus))
501 {
502 /* Critical Error ... Cannot proceed further */
503 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
504 "%s: Failed to open VOS Scheduler", __func__);
505 VOS_ASSERT(0);
506 goto err_msg_queue;
507 }
508
509 /* Open the SYS module */
510 vStatus = sysOpen(gpVosContext);
511
512 if (!VOS_IS_STATUS_SUCCESS(vStatus))
513 {
514 /* Critical Error ... Cannot proceed further */
515 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
516 "%s: Failed to open SYS module",__func__);
517 VOS_ASSERT(0);
518 goto err_sched_close;
519 }
520
Jeff Johnson295189b2012-06-20 16:38:30 -0700521 /*Open the WDA module */
522 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
523 macOpenParms.driverType = eDRIVER_TYPE_MFG;
524 vStatus = WDA_open(gpVosContext, gpVosContext->pHDDContext, &macOpenParms);
525 if (!VOS_IS_STATUS_SUCCESS(vStatus))
526 {
527 /* Critical Error ... Cannot proceed further */
528 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
529 "%s: Failed to open WDA module",__func__);
530 VOS_ASSERT(0);
531 goto err_sys_close;
532 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700533
534 /* initialize the NV module */
535 vStatus = vos_nv_open();
536 if (!VOS_IS_STATUS_SUCCESS(vStatus))
537 {
538 // NV module cannot be initialized, however the driver is allowed
539 // to proceed
540 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
541 "%s: Failed to initialize the NV module", __func__);
542 goto err_wda_close;
543 }
544
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700545 vStatus = vos_nv_get_dictionary_data();
546
547 if (!VOS_IS_STATUS_SUCCESS(vStatus))
548 {
549 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
550 "%s : failed to get dictionary data for NV", __func__);
551 goto err_wda_close;
552 }
553
Jeff Johnson295189b2012-06-20 16:38:30 -0700554 /* If we arrive here, both threads dispacthing messages correctly */
555
556 /* Now proceed to open the MAC */
557
558 /* UMA is supported in hardware for performing the
559 frame translation 802.11 <-> 802.3 */
560 macOpenParms.frameTransRequired = 1;
561 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
562 &macOpenParms);
563
564 if (eSIR_SUCCESS != sirStatus)
565 {
566 /* Critical Error ... Cannot proceed further */
567 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
568 "%s: Failed to open MAC", __func__);
569 VOS_ASSERT(0);
570 goto err_nv_close;
571 }
572
Jeff Johnson295189b2012-06-20 16:38:30 -0700573 /* Now proceed to open the SME */
574 vStatus = sme_Open(gpVosContext->pMACContext);
575 if (!VOS_IS_STATUS_SUCCESS(vStatus))
576 {
577 /* Critical Error ... Cannot proceed further */
578 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
579 "%s: Failed to open SME",__func__);
580 goto err_mac_close;
581 }
582 return VOS_STATUS_SUCCESS;
583
Jeff Johnson295189b2012-06-20 16:38:30 -0700584
585 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
586 "%s: VOSS successfully Opened",__func__);
587
588 return VOS_STATUS_SUCCESS;
589err_mac_close:
590 macClose(gpVosContext->pMACContext);
591
592err_nv_close:
593 vos_nv_close();
594
595err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700596 WDA_close(gpVosContext);
597
598err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700599 sysClose(gpVosContext);
600
601err_sched_close:
602 vos_sched_close(gpVosContext);
603err_msg_queue:
604 vos_mq_deinit(&gpVosContext->freeVosMq);
605
Jeff Johnson295189b2012-06-20 16:38:30 -0700606err_wda_complete_event:
607 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700608
609err_probe_event:
610 vos_event_destroy(&gpVosContext->ProbeEvent);
611
612 return VOS_STATUS_E_FAILURE;
613
614} /* wlan_ftm_vos_open() */
615
616/*---------------------------------------------------------------------------
617
618 \brief wlan_ftm_vos_close() - Close the vOSS Module
619
620 The \a wlan_ftm_vos_close() function closes the vOSS Module
621
622 \param vosContext context of vos
623
624 \return VOS_STATUS_SUCCESS - successfully closed
625
626 \sa wlan_ftm_vos_close()
627
628---------------------------------------------------------------------------*/
629
630static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
631{
632 VOS_STATUS vosStatus;
633 pVosContextType gpVosContext = (pVosContextType)vosContext;
634
Jeff Johnson295189b2012-06-20 16:38:30 -0700635 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
636 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
637 {
638 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
639 "%s: Failed to close BAL",__func__);
640 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
641 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700642
643 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
644 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
645 {
646 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
647 "%s: Failed to close MAC",__func__);
648 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
649 }
650
651 ((pVosContextType)vosContext)->pMACContext = NULL;
652
653 vosStatus = vos_nv_close();
654 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
655 {
656 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
657 "%s: Failed to close NV",__func__);
658 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
659 }
660
661
662 vosStatus = sysClose( vosContext );
663 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
664 {
665 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
666 "%s: Failed to close SYS",__func__);
667 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
668 }
669
Jeff Johnson295189b2012-06-20 16:38:30 -0700670 vosStatus = WDA_close( vosContext );
671 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
672 {
673 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
674 "%s: Failed to close WDA",__func__);
675 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
676 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700677
678 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
679
680 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
681 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
682 {
683 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
684 "%s: Failed to destroy ProbeEvent",__func__);
685 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
686 }
687
Jeff Johnson295189b2012-06-20 16:38:30 -0700688 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
689 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
690 {
691 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
692 "%s: Failed to destroy wdaCompleteEvent",__func__);
693 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
694 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700695
696 return VOS_STATUS_SUCCESS;
697}
698
699/**---------------------------------------------------------------------------
700
701 \brief wlan_ftm_priv_set_txifs() -
702
703 This function is used for
704
705 \param - pAdapter - Pointer HDD Context.
706 - ifs
707
708 \return - 0 for success, non zero for failure
709
710 --------------------------------------------------------------------------*/
711
712
713
714static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
715{
716 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
717 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
718 {
719 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
720 return VOS_STATUS_E_FAILURE;
721 }
722
723 /* do not allow to change setting when tx pktgen is enabled */
724 if (ftm_status.frameGenEnabled)
725 {
726 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
727 return VOS_STATUS_E_FAILURE;
728 }
729
730 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
731 {
732 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:ifs value is invalid ",__func__);
733 return VOS_STATUS_E_FAILURE;
734 }
735
736 ftm_status.frameParams.interFrameSpace = ifs;
737
738 return VOS_STATUS_SUCCESS;
739}
740
741/**---------------------------------------------------------------------------
742
743 \brief wlan_ftm_priv_set_txpktcnt() -
744
745 This function is used for
746
747 \param - pAdapter - Pointer HDD Context.
748 - ifs
749
750 \return - 0 for success, non zero for failure
751
752 --------------------------------------------------------------------------*/
753
754static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
755{
756 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
757 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
758 {
759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
760 return VOS_STATUS_E_FAILURE;
761 }
762
763 /* do not allow to change setting when tx pktgen is enabled */
764 if (ftm_status.frameGenEnabled)
765 {
766 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
767 return VOS_STATUS_E_FAILURE;
768 }
769
770 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
771 {
772 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pktcnt value is invalid",__func__);
773 return VOS_STATUS_E_FAILURE;
774 }
775
776 ftm_status.frameParams.numTestPackets = cnt;
777
778 return VOS_STATUS_SUCCESS;
779}
780
781static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
782{
783 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
784 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
785 {
786 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
787 return VOS_STATUS_E_FAILURE;
788 }
789
790 /* do not allow to change setting when tx pktgen is enabled */
791 if (ftm_status.frameGenEnabled)
792 {
793 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
794 return VOS_STATUS_E_FAILURE;
795 }
796
797 if (len > 4095) //4096
798 {
799 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:payload len is invalid",__func__);
800 return VOS_STATUS_E_FAILURE;
801 }
802
803 ftm_status.frameParams.payloadLength = (tANI_U16)len;
804
805 return VOS_STATUS_SUCCESS;
806}
807
Jeff Johnson295189b2012-06-20 16:38:30 -0700808
809static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
810{
Jeff Johnson295189b2012-06-20 16:38:30 -0700811 uPttMsgs *pMsgBody;
812 VOS_STATUS status;
813 v_U16_t chainSelect_save = chainSelect;
814 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
815
816 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
817 {
818 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
819 return VOS_STATUS_E_FAILURE;
820 }
821
822 if (chainSelect > FTM_CHAIN_SEL_MAX)
823 {
824 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid chain",__func__);
825 return VOS_STATUS_E_FAILURE;
826 }
827
828 /* do not allow to change setting when tx pktgen is enabled */
829 if (ftm_status.frameGenEnabled)
830 {
831 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
832 return VOS_STATUS_E_FAILURE;
833 }
834
835 switch (chainSelect)
836 {
837 case FTM_CHAIN_SEL_NO_RX_TX:
838 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
839 break;
840
841 case FTM_CHAIN_SEL_R0_ON:
842 chainSelect = PHY_CHAIN_SEL_R0_ON;
843 break;
844
845 case FTM_CHAIN_SEL_T0_ON:
846 chainSelect = PHY_CHAIN_SEL_T0_ON;
847 break;
848 }
849
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530850 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 init_completion(&pHddCtx->ftm.ftm_comp_var);
852 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
853 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
854
855 pMsgBody = &pMsgBuf->msgBody;
856 pMsgBody->EnableChains.chainSelect = chainSelect;
857
858 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
859
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530860 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700861 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530862 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
863 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700864 status = VOS_STATUS_E_FAILURE;
865 goto done;
866 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530867 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
868 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -0700869
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530870 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700871 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530872 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
873 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700874 status = VOS_STATUS_E_FAILURE;
875 goto done;
876 }
877 ftm_status.chainSelect = chainSelect_save;
878done:
Jeff Johnson295189b2012-06-20 16:38:30 -0700879
880 return status;
881}
882
883/**---------------------------------------------------------------------------
884 --------------------------------------------------------------------------*/
885static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
886{
887 int ii;
888 int lenBuf = WE_FTM_MAX_STR_LEN;
889 int lenRes = 0;
890 char *chain[] = {
891 "None",
892 "R0,R1",
893 "R0",
894 "R1",
895 "T0",
896 "R0,R1,T0"
897 };
898 char *rx[] = {
899 "disable",
900 "11b/g/n",
901 "11g/n",
902 "11b"
903 };
904 char *tx[] = {
905 "stopped",
906 "started",
907 };
908 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
909
910 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
911 {
912 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
913 return VOS_STATUS_E_FAILURE;
914 }
915
916 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -0700917 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700918 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
919 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -0700920 ftm_status.frameParams.interFrameSpace);
921 if ((lenRes < 0) || (lenRes >= lenBuf))
922 {
923 return VOS_STATUS_E_FAILURE;
924 }
925
926 buf += lenRes;
927 lenBuf -= lenRes;
928
929 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
930 {
931 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
932 break;
933 }
934
935 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
936 {
937 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
938 }
939 else
940 {
941 lenRes = strlcpy(buf, "invalid", lenBuf);
942 }
943 if ((lenRes < 0) || (lenRes >= lenBuf))
944 {
945 return VOS_STATUS_E_FAILURE;
946 }
947
948 buf += lenRes;
949 lenBuf -= lenRes;
950
Jeff Johnson02797792013-10-26 19:17:13 -0700951 lenRes = snprintf(buf, lenBuf, "\n txpower: %d\n txpktcnt: %d\n "
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700952 "txpktlen: %d\n", ftm_status.txpower,
953 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -0700954 ftm_status.frameParams.payloadLength);
955
956 if ((lenRes < 0) || (lenRes >= lenBuf))
957 {
958 return VOS_STATUS_E_FAILURE;
959 }
960
961 return VOS_STATUS_SUCCESS;
962}
963
Jeff Johnson295189b2012-06-20 16:38:30 -0700964
965void HEXDUMP(char *s0, char *s1, int len)
966{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530967 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700968 printk(KERN_EMERG "%s\n :", s0);
969
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530970 if (len > 8)
971 {
972 for (j = 0; j < len/8; j++)
973 {
974 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
975 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
976 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
977 }
978 len = len - j*8;
979 }
980 for (i = 0; i< len; i++) {
981 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -0700982 }
983 printk("\n");
984}
985
Jeff Johnson295189b2012-06-20 16:38:30 -0700986/*---------------------------------------------------------------------------
987
988 \brief vos_ftm_preStart() -
989
990 The \a vos_ftm_preStart() function to download CFG.
991 including:
992 - ccmStart
993
994 - WDA: triggers the CFG download
995
996
997 \param pVosContext: The VOS context
998
999
1000 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1001 is ready to be used.
1002
1003 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1004 are unavailable to initialize the scheduler
1005
1006
1007 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1008
1009 \sa vos_start
1010
1011---------------------------------------------------------------------------*/
1012VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1013{
1014 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1015 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001016
Jeff Johnson295189b2012-06-20 16:38:30 -07001017 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1018 "vos prestart");
1019
1020
1021 VOS_ASSERT( NULL != pVosContext->pWDAContext);
1022
1023 /* call macPreStart */
1024 vStatus = macPreStart(pVosContext->pMACContext);
1025 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1026 {
1027 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1028 "Failed at macPreStart ");
1029 return VOS_STATUS_E_FAILURE;
1030 }
1031
1032 /* call ccmStart */
1033 ccmStart(pVosContext->pMACContext);
1034
1035 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001036 vos_event_reset(&pVosContext->wdaCompleteEvent);
1037
Jeff Johnson295189b2012-06-20 16:38:30 -07001038
1039 /*call WDA pre start*/
1040 vStatus = WDA_preStart(pVosContext);
1041 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1042 {
1043 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1044 "Failed to WDA prestart ");
1045 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1046 ccmStop(pVosContext->pMACContext);
1047 VOS_ASSERT(0);
1048 return VOS_STATUS_E_FAILURE;
1049 }
1050
1051 /* Need to update time out of complete */
1052 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1053 if ( vStatus != VOS_STATUS_SUCCESS )
1054 {
1055 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1056 {
1057 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1058 "%s: Timeout occurred before WDA complete\n",__func__);
1059 }
1060 else
1061 {
1062 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1063 "%s: WDA_preStart reporting other error \n",__func__);
1064 }
1065 VOS_ASSERT( 0 );
1066 return VOS_STATUS_E_FAILURE;
1067 }
1068
1069 return VOS_STATUS_SUCCESS;
1070}
Jeff Johnson295189b2012-06-20 16:38:30 -07001071
1072/**---------------------------------------------------------------------------
1073
1074 \brief wlan_hdd_ftm_open() -
1075
1076 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1077
1078 \param - pAdapter - Pointer HDD Context.
1079
1080 \return - 0 for success, non zero for failure
1081
1082 --------------------------------------------------------------------------*/
1083
1084int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1085{
1086 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1087 pVosContextType pVosContext= NULL;
1088 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001089
Jeff Johnson295189b2012-06-20 16:38:30 -07001090 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1091 "%s: Opening VOSS", __func__);
1092
1093 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1094
1095 if (NULL == pVosContext)
1096 {
1097 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301098 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001099 VOS_ASSERT(0);
1100 goto err_vos_status_failure;
1101 }
1102
1103 // Open VOSS
1104 vStatus = wlan_ftm_vos_open( pVosContext, 0);
1105
1106 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1107 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301108 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001109 goto err_vos_status_failure;
1110 }
1111
Jeff Johnson295189b2012-06-20 16:38:30 -07001112 /*
1113 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1114 */
1115 /* Save the hal context in Adapter */
1116 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001117
1118 if ( NULL == pHddCtx->hHal )
1119 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301120 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001121 goto err_sal_close;
1122 }
1123
1124 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1125 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1126 if( NULL == pAdapter )
1127 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301128 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001129 goto err_adapter_open_failure;
1130 }
1131
1132 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1133 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301134 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001135 goto err_sal_close;
1136 }
1137
1138 //Initialize the nlink service
1139 if(nl_srv_init() != 0)
1140 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301141 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001142 goto err_ftm_register_wext_close;
1143 }
1144
Leo Chang9e646082013-08-02 11:20:21 -07001145#ifdef WLAN_KD_READY_NOTIFIER
1146 pHddCtx->kd_nl_init = 1;
1147#endif /* WLAN_KD_READY_NOTIFIER */
1148
Jeff Johnson295189b2012-06-20 16:38:30 -07001149#ifdef PTT_SOCK_SVC_ENABLE
1150 //Initialize the PTT service
1151 if(ptt_sock_activate_svc(pHddCtx) != 0)
1152 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301153 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001154 goto err_nl_srv_init;
1155 }
1156#endif
1157 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1158 {
1159 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1160 goto err_nl_srv_init;
1161 }
1162#ifdef HDD_SESSIONIZE
1163 //Turn off carrier state
1164 netif_carrier_off(pAdapter->dev);
1165
1166 //Stop the Interface TX queue. Just being safe
1167 netif_tx_disable(pAdapter->dev);
1168#endif
1169
Jeff Johnson295189b2012-06-20 16:38:30 -07001170 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1171 pHddCtx->ftm.targetNVTableSize = 0;
1172 pHddCtx->ftm.targetNVTablePointer = NULL;
1173 pHddCtx->ftm.processedNVTableSize = 0;
1174 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1175 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1176 {
1177 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301178 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001179 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001180 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001181 }
1182 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001183
1184 _ftm_status_init();
1185 /* Initialize the ftm vos event */
1186 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1187 {
1188 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301189 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001190 VOS_ASSERT(0);
1191 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1192 goto err_nl_srv_init;
1193 }
1194
1195 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1196
1197 return VOS_STATUS_SUCCESS;
1198
1199err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001200#ifdef WLAN_KD_READY_NOTIFIER
1201nl_srv_exit(pHddCtx->ptt_pid);
1202#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001203nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001204#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001205err_ftm_register_wext_close:
1206hdd_UnregisterWext(pAdapter->dev);
1207
1208err_adapter_open_failure:
1209hdd_close_all_adapters( pHddCtx );
1210
1211err_sal_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001212
1213err_vos_status_failure:
1214
1215 return VOS_STATUS_E_FAILURE;
1216}
1217
1218
1219
1220int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1221{
1222 VOS_STATUS vosStatus;
1223 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1224
1225 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1226 ENTER();
1227 if(pAdapter == NULL)
1228 {
1229 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1230 return VOS_STATUS_E_NOMEM;
1231 }
1232
Leo Chang4e8183f2013-05-31 15:38:34 -07001233 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1234 {
1235 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1236 "%s: Ftm has been started. stopping ftm", __func__);
1237 wlan_ftm_stop(pHddCtx);
1238 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001239
1240 //Assert Deep sleep signal now to put Libra HW in lowest power state
1241 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
1242 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1243
1244 //Vote off any PMIC voltage supplies
1245 vos_chipPowerDown(NULL, NULL, NULL);
1246
1247 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1248
Leo Chang59cdc7e2013-07-10 10:08:21 -07001249#ifdef WLAN_KD_READY_NOTIFIER
1250 nl_srv_exit(pHddCtx->ptt_pid);
1251#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001252 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001253#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001254 //TODO----------
1255 //Deregister the device with the kernel
1256 hdd_UnregisterWext(pAdapter->dev);
1257
1258 hdd_close_all_adapters( pHddCtx );
1259#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001260 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001261 {
1262 unregister_netdev(pAdapter->dev);
1263 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1264 }
1265#endif
1266 //-----------------
1267
1268 vosStatus = vos_sched_close( vosContext );
1269 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1270 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1271 "%s: Failed to close VOSS Scheduler",__func__);
1272 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1273 }
1274
1275 //Close VOSS
1276 wlan_ftm_vos_close(vosContext);
1277
1278
1279 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1280 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1281 {
1282 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1283 "%s: Failed to destroy ftm_vos Event",__func__);
1284 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1285 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001286 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001287
1288 //Free up dynamically allocated members inside HDD Adapter
1289 kfree(pHddCtx->cfg_ini);
1290 pHddCtx->cfg_ini= NULL;
1291
1292 return 0;
1293
1294}
1295
1296/**---------------------------------------------------------------------------
1297
1298 \brief wlan_ftm_send_response() -
1299
1300 The function sends the response to the ptt socket application running in user space.
1301
1302 \param - pAdapter - Pointer HDD Context.
1303
1304 \return - 0 for success, non zero for failure
1305
1306 --------------------------------------------------------------------------*/
1307
1308static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1309
1310 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
1311
1312 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!\n"));
1313 return VOS_STATUS_E_FAILURE;
1314 }
1315 return VOS_STATUS_SUCCESS;
1316}
1317
1318/**---------------------------------------------------------------------------
1319
1320 \brief wlan_hdd_ftm_start() -
1321
1322 This function gets called when the FTM start commands received from the ptt socket application and
1323 it starts the following modules.
1324 1) SAL Start.
1325 2) BAL Start.
1326 3) MAC Start to download the firmware.
1327
1328
1329 \param - pAdapter - Pointer HDD Context.
1330
1331 \return - 0 for success, non zero for failure
1332
1333 --------------------------------------------------------------------------*/
1334
1335static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1336{
1337 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1338 tSirRetStatus sirStatus = eSIR_SUCCESS;
1339 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1340 tHalMacStartParameters halStartParams;
1341
1342 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1343 {
1344 return VOS_STATUS_SUCCESS;
1345 }
1346
1347 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1348 "%s: Starting Libra SW", __func__);
1349
1350 /* We support only one instance for now ...*/
1351 if (pVosContext == NULL)
1352 {
1353 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001354 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001355 goto err_status_failure;
1356 }
1357
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001358
Jeff Johnson295189b2012-06-20 16:38:30 -07001359 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001360 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001361 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001362 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001363 goto err_status_failure;
1364 }
1365
Jeff Johnson295189b2012-06-20 16:38:30 -07001366 /*
1367 Prima needs to start the WDA correctly instead of BAL and SAL
1368 */
1369
1370 /* Vos preStart is calling */
1371 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1372 {
1373 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1374 goto err_status_failure;
1375 }
1376
1377
1378 vStatus = WDA_NVDownload_Start(pVosContext);
1379
1380 if ( vStatus != VOS_STATUS_SUCCESS )
1381 {
1382 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1383 "%s: Failed to start NV Download",__func__);
1384 return VOS_STATUS_E_FAILURE;
1385 }
1386
1387 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1388
1389 if ( vStatus != VOS_STATUS_SUCCESS )
1390 {
1391 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1392 {
1393 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1394 "%s: Timeout occurred before WDA_NVDownload_Start complete\n",__func__);
1395 }
1396 else
1397 {
1398 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1399 "%s: WDA_NVDownload_Start reporting other error \n",__func__);
1400 }
1401 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001402 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001403 }
1404
1405 vStatus = WDA_start(pVosContext);
1406 if (vStatus != VOS_STATUS_SUCCESS)
1407 {
1408 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1409 "%s: Failed to start WDA",__func__);
1410 goto err_status_failure;
1411 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001412
Jeff Johnson295189b2012-06-20 16:38:30 -07001413
1414 /* Start the MAC */
1415 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1416
Jeff Johnson295189b2012-06-20 16:38:30 -07001417
1418 halStartParams.driverType = eDRIVER_TYPE_MFG;
1419
1420 /* Start the MAC */
1421 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1422
Jeff Johnson295189b2012-06-20 16:38:30 -07001423
1424 if (eSIR_SUCCESS != sirStatus)
1425 {
1426 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1427 "%s: Failed to start MAC", __func__);
1428
Jeff Johnson295189b2012-06-20 16:38:30 -07001429 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001430 }
1431
1432 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1433 "%s: MAC correctly started",__func__);
1434
Jeff Johnson295189b2012-06-20 16:38:30 -07001435
1436 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1437
1438 return VOS_STATUS_SUCCESS;
1439
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001440err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001441 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1442 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1443 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1444 if(vStatus != VOS_STATUS_SUCCESS)
1445 {
1446 if(vStatus == VOS_STATUS_E_TIMEOUT)
1447 {
1448 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1449 "%s: Timeout occurred before WDA_stop complete\n",__func__);
1450
1451 }
1452 else
1453 {
1454 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1455 "%s: WDA_stop reporting other error \n",__func__);
1456 }
1457 VOS_ASSERT(0);
1458 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001459
1460err_status_failure:
1461
1462 return VOS_STATUS_E_FAILURE;
1463
1464}
1465
1466
1467static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1468{
1469 VOS_STATUS vosStatus;
1470
1471 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1472 {
1473 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1474 return VOS_STATUS_E_FAILURE;
1475 }
1476
1477 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1478 {
1479 /* STOP MAC only */
1480 v_VOID_t *hHal;
1481 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1482 if (NULL == hHal)
1483 {
1484 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1485 "%s: NULL hHal", __func__);
1486 }
1487 else
1488 {
1489 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1490 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1491 {
1492 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1493 "%s: Failed to stop SYS", __func__);
1494 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1495 }
1496 }
1497
Jeff Johnson295189b2012-06-20 16:38:30 -07001498
Jeff Johnson295189b2012-06-20 16:38:30 -07001499 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001500
1501 }
1502 return WLAN_FTM_SUCCESS;
1503}
1504
Jeff Johnson295189b2012-06-20 16:38:30 -07001505/**---------------------------------------------------------------------------
1506
1507 \brief wlan_hdd_ftm_get_nv_table() -
1508 Get Specific NV table
1509
1510 \param - ftmCmd - Pointer FTM Commad Buffer
1511
1512 \return - int
1513 -1, Process Host command fail, vail out
1514 1, Process Host command success
1515
1516 --------------------------------------------------------------------------*/
1517int wlan_hdd_ftm_get_nv_table
1518(
1519 hdd_context_t *pHddCtx,
1520 tPttMsgbuffer *ftmCmd
1521)
1522{
1523 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1524 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1525 v_SIZE_t nvSize;
1526 sHalNv *nvContents = NULL;
1527
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001528
Jeff Johnson295189b2012-06-20 16:38:30 -07001529 if (NULL == pHddCtx)
1530 {
1531 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1532 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001533 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001534 }
1535
1536 /* Test first chunk of NV table */
1537 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1538 (0 == pHddCtx->ftm.processedNVTableSize))
1539 {
1540 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1541 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1542 {
1543 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1544 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001545 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001546 }
1547
1548 switch (nvTable->nvTable)
1549 {
1550 case NV_TABLE_RATE_POWER_SETTINGS:
1551 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1552 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1553 break;
1554
1555 case NV_TABLE_REGULATORY_DOMAINS:
1556 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1557 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1558 break;
1559
1560 case NV_TABLE_DEFAULT_COUNTRY:
1561 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1562 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1563 break;
1564
1565 case NV_TABLE_TPC_POWER_TABLE:
1566 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1567 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1568 break;
1569
1570 case NV_TABLE_TPC_PDADC_OFFSETS:
1571 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1572 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1573 break;
1574
1575 case NV_TABLE_VIRTUAL_RATE:
1576 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1577 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1578 break;
1579
1580 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1581 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1582 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1583 break;
1584
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001585 case NV_TABLE_HW_CAL_VALUES:
1586 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1587 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1588 break;
1589
1590 case NV_TABLE_FW_CONFIG:
1591 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1592 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001593 break;
1594
1595 case NV_TABLE_ANTENNA_PATH_LOSS:
1596 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1597 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1598 break;
1599
1600 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1601 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1602 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1603 break;
1604
1605 default:
1606 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1607 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001608 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001609 break;
1610 }
1611
1612 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1613 {
1614 /* Invalid table size, discard and initialize data */
1615 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001616 "Invalid Table Size %d for Table %d"
1617 " expected size %d\n", nvTable->tableSize, nvTable->nvTable,
1618 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001619 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1620 pHddCtx->ftm.targetNVTableSize = 0;
1621 pHddCtx->ftm.processedNVTableSize = 0;
1622 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001623 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001624 }
1625
1626 /* Set Current Processing NV table type */
1627 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1628 /* Copy target NV table value into temp context buffer */
1629 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1630 pHddCtx->ftm.targetNVTablePointer,
1631 pHddCtx->ftm.targetNVTableSize);
1632
1633 }
1634
1635 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1636 {
1637 /* Invalid table type */
1638 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1639 "Invalid NV Table, now Processing %d, not %d",
1640 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1641 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1642 pHddCtx->ftm.targetNVTableSize = 0;
1643 pHddCtx->ftm.processedNVTableSize = 0;
1644 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001645
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001646 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001647 }
1648
1649 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001650 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001651 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1652 nvTable->chunkSize);
1653 /* Update processed pointer to prepare next chunk copy */
1654 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1655
1656 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1657 {
1658 /* Finished to process last chunk of data, initialize buffer */
1659 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1660 pHddCtx->ftm.targetNVTableSize = 0;
1661 pHddCtx->ftm.processedNVTableSize = 0;
1662 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1663 }
1664
1665 return 1;
1666}
1667
1668/**---------------------------------------------------------------------------
1669
1670 \brief wlan_hdd_ftm_set_nv_table() -
1671 Set Specific NV table as given
1672
1673 \param - ftmCmd - Pointer FTM Commad Buffer
1674
1675 \return - int
1676 -1, Process Host command fail, vail out
1677 1, Process Host command success
1678
1679 --------------------------------------------------------------------------*/
1680int wlan_hdd_ftm_set_nv_table
1681(
1682 hdd_context_t *pHddCtx,
1683 tPttMsgbuffer *ftmCmd
1684)
1685{
1686 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1687 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1688 v_SIZE_t nvSize;
1689 sHalNv *nvContents = NULL;
1690
1691 if (NULL == pHddCtx)
1692 {
1693 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1694 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001695 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001696 }
1697
1698 /* Test first chunk of NV table */
1699 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1700 (0 == pHddCtx->ftm.processedNVTableSize))
1701 {
1702 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1703 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1704 {
1705 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1706 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001707 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001708 }
1709
1710 switch (nvTable->nvTable)
1711 {
1712 case NV_TABLE_RATE_POWER_SETTINGS:
1713 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1714 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1715 break;
1716
1717 case NV_TABLE_REGULATORY_DOMAINS:
1718 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1719 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1720 break;
1721
1722 case NV_TABLE_DEFAULT_COUNTRY:
1723 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1724 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1725 break;
1726
1727 case NV_TABLE_TPC_POWER_TABLE:
1728 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1729 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1730 break;
1731
1732 case NV_TABLE_TPC_PDADC_OFFSETS:
1733 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1734 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1735 break;
1736
1737 case NV_TABLE_VIRTUAL_RATE:
1738 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1739 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1740 break;
1741
1742 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1743 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1744 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1745 break;
1746
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001747 case NV_TABLE_HW_CAL_VALUES:
1748 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1749 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1750 break;
1751
1752 case NV_TABLE_FW_CONFIG:
1753 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1754 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001755 break;
1756
1757 case NV_TABLE_ANTENNA_PATH_LOSS:
1758 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1759 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1760 break;
1761
1762 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1763 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1764 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1765 break;
1766
1767 default:
1768 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1769 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001770 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001771 break;
1772 }
1773
1774 /* Set Current Processing NV table type */
1775 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1776 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1777 {
1778 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1779 "Invalid Table Size %d", nvTable->tableSize);
1780 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1781 pHddCtx->ftm.targetNVTableSize = 0;
1782 pHddCtx->ftm.processedNVTableSize = 0;
1783 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001784 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001785 }
1786 }
1787
1788 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1789 {
1790 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1791 "Invalid NV Table, now Processing %d, not %d",
1792 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1793 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1794 pHddCtx->ftm.targetNVTableSize = 0;
1795 pHddCtx->ftm.processedNVTableSize = 0;
1796 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001797 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001798 }
1799 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001800 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001801 nvTable->chunkSize);
1802
1803 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1804 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1805 {
1806 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
1807 pHddCtx->ftm.tempNVTableBuffer,
1808 pHddCtx->ftm.targetNVTableSize);
1809 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1810 pHddCtx->ftm.targetNVTableSize = 0;
1811 pHddCtx->ftm.processedNVTableSize = 0;
1812 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1813 }
1814
1815 return 1;
1816}
1817
1818/**---------------------------------------------------------------------------
1819
1820 \brief wlan_hdd_ftm_blank_nv() -
1821 Set all NV table value as default
1822
1823 \param - ftmCmd - Pointer FTM Commad Buffer
1824
1825 \return - int
1826 -1, Process Host command fail, vail out
1827 0, Process Host command success
1828
1829 --------------------------------------------------------------------------*/
1830int wlan_hdd_ftm_blank_nv_table
1831(
1832 tPttMsgbuffer *ftmCmd
1833)
1834{
1835 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1836 v_SIZE_t nvSize;
1837 v_SIZE_t itemSize;
1838 sHalNv *nvContents = NULL;
1839
1840 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1841 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1842 {
1843 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
1844 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001845 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001846 }
1847
1848 itemSize = sizeof(nvContents->tables.pwrOptimum);
1849 memcpy(&nvContents->tables.pwrOptimum,
1850 &nvDefaults.tables.pwrOptimum,
1851 itemSize);
1852
1853 itemSize = sizeof(nvContents->tables.regDomains);
1854 memcpy(&nvContents->tables.regDomains,
1855 &nvDefaults.tables.regDomains,
1856 itemSize);
1857
1858 itemSize = sizeof(nvContents->tables.defaultCountryTable);
1859 memcpy(&nvContents->tables.defaultCountryTable,
1860 &nvDefaults.tables.defaultCountryTable,
1861 itemSize);
1862
1863 itemSize = sizeof(nvContents->tables.plutCharacterized);
1864 memcpy(&nvContents->tables.plutCharacterized[0],
1865 &nvDefaults.tables.plutCharacterized[0],
1866 itemSize);
1867
1868 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
1869 memcpy(&nvContents->tables.plutPdadcOffset[0],
1870 &nvDefaults.tables.plutPdadcOffset[0],
1871 itemSize);
1872
1873 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1874 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
1875 &nvDefaults.tables.pwrOptimum_virtualRate[0],
1876 itemSize);
1877
1878 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
1879 memcpy(&nvContents->tables.rssiChanOffsets[0],
1880 &nvDefaults.tables.rssiChanOffsets[0],
1881 itemSize);
1882
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001883 itemSize = sizeof(nvContents->tables.hwCalValues);
1884 memcpy(&nvContents->tables.hwCalValues,
1885 &nvDefaults.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07001886 itemSize);
1887
1888 itemSize = sizeof(nvContents->tables.antennaPathLoss);
1889 memcpy(&nvContents->tables.antennaPathLoss[0],
1890 &nvDefaults.tables.antennaPathLoss[0],
1891 itemSize);
1892
1893 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
1894 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
1895 &nvDefaults.tables.pktTypePwrLimits[0][0],
1896 itemSize);
1897
1898 return 1;
1899}
1900
1901/**---------------------------------------------------------------------------
1902
1903 \brief wlan_hdd_ftm_delete_nv_table() -
1904 Delete Specific NV table
1905
1906 \param - ftmCmd - Pointer FTM Commad Buffer
1907
1908 \return - int
1909 -1, Process Host command fail, vail out
1910 1, Process Host command success
1911
1912 --------------------------------------------------------------------------*/
1913int wlan_hdd_ftm_delete_nv_table
1914(
1915 tPttMsgbuffer *ftmCmd
1916)
1917{
1918 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1919 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
1920 v_SIZE_t nvSize;
1921 v_SIZE_t itemSize;
1922 sHalNv *nvContents = NULL;
1923
1924 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1925 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1926 {
1927 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
1928 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001929 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001930 }
1931
1932 switch (nvTable->nvTable)
1933 {
1934 case NV_TABLE_RATE_POWER_SETTINGS:
1935 itemSize = sizeof(nvContents->tables.pwrOptimum);
1936 memcpy(&nvContents->tables.pwrOptimum,
1937 &nvDefaults.tables.pwrOptimum,
1938 itemSize);
1939 break;
1940
1941 case NV_TABLE_REGULATORY_DOMAINS:
1942 itemSize = sizeof(nvContents->tables.regDomains);
1943 memcpy(&nvContents->tables.regDomains,
1944 &nvDefaults.tables.regDomains,
1945 itemSize);
1946 break;
1947
1948 case NV_TABLE_DEFAULT_COUNTRY:
1949 itemSize = sizeof(nvContents->tables.defaultCountryTable);
1950 memcpy(&nvContents->tables.defaultCountryTable,
1951 &nvDefaults.tables.defaultCountryTable,
1952 itemSize);
1953 break;
1954
1955 case NV_TABLE_TPC_POWER_TABLE:
1956 itemSize = sizeof(nvContents->tables.plutCharacterized);
1957 memcpy(&nvContents->tables.plutCharacterized[0],
1958 &nvDefaults.tables.plutCharacterized[0],
1959 itemSize);
1960 break;
1961
1962 case NV_TABLE_TPC_PDADC_OFFSETS:
1963 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
1964 memcpy(&nvContents->tables.plutPdadcOffset[0],
1965 &nvDefaults.tables.plutPdadcOffset[0],
1966 itemSize);
1967 break;
1968
1969 case NV_TABLE_VIRTUAL_RATE:
1970 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1971 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
1972 &nvDefaults.tables.pwrOptimum_virtualRate[0],
1973 itemSize);
1974 break;
1975
1976 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1977 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
1978 memcpy(&nvContents->tables.rssiChanOffsets[0],
1979 &nvDefaults.tables.rssiChanOffsets[0],
1980 itemSize);
1981 break;
1982
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001983 case NV_TABLE_HW_CAL_VALUES:
1984 itemSize = sizeof(nvContents->tables.hwCalValues);
1985 memcpy(&nvContents->tables.hwCalValues,
1986 &nvDefaults.tables.hwCalValues,
1987 itemSize);
1988 break;
1989
1990 case NV_TABLE_FW_CONFIG:
1991 itemSize = sizeof(nvContents->tables.fwConfig);
1992 memcpy(&nvContents->tables.fwConfig,
1993 &nvDefaults.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07001994 itemSize);
1995 break;
1996
1997 case NV_TABLE_ANTENNA_PATH_LOSS:
1998 itemSize = sizeof(nvContents->tables.antennaPathLoss);
1999 memcpy(&nvContents->tables.antennaPathLoss[0],
2000 &nvDefaults.tables.antennaPathLoss[0],
2001 itemSize);
2002 break;
2003
2004 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2005 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2006 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
2007 &nvDefaults.tables.pktTypePwrLimits[0][0],
2008 itemSize);
2009 break;
2010
2011 default:
2012 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2013 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002014 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002015 break;
2016 }
2017
2018 return 1;
2019}
2020
2021/**---------------------------------------------------------------------------
2022
2023 \brief wlan_hdd_ftm_get_nv_field() -
2024 Get Specific NV field
2025
2026 \param - ftmCmd - Pointer FTM Commad Buffer
2027
2028 \return - int
2029 -1, Process Host command fail, vail out
2030 1, Process Host command success
2031
2032 --------------------------------------------------------------------------*/
2033int wlan_hdd_ftm_get_nv_field
2034(
2035 tPttMsgbuffer *ftmCmd
2036)
2037{
2038 sNvFields nvFieldDataBuffer;
2039 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2040 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2041 sHalNv *nvContents = NULL;
2042 v_SIZE_t nvSize;
2043
2044 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2045 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2046 {
2047 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2048 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002049 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002050 }
2051 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2052
2053 switch (nvField->nvField)
2054 {
2055 case NV_COMMON_PRODUCT_ID:
2056 memcpy((void *)&nvField->fieldData,
2057 &nvFieldDataBuffer.productId,
2058 sizeof(nvFieldDataBuffer.productId));
2059 break;
2060
2061 case NV_COMMON_PRODUCT_BANDS:
2062 memcpy((void *)&nvField->fieldData,
2063 &nvFieldDataBuffer.productBands,
2064 sizeof(nvFieldDataBuffer.productBands));
2065 break;
2066
2067 case NV_COMMON_NUM_OF_TX_CHAINS:
2068 memcpy((void *)&nvField->fieldData,
2069 &nvFieldDataBuffer.numOfTxChains,
2070 sizeof(nvFieldDataBuffer.numOfTxChains));
2071 break;
2072
2073 case NV_COMMON_NUM_OF_RX_CHAINS:
2074 memcpy((void *)&nvField->fieldData,
2075 &nvFieldDataBuffer.numOfRxChains,
2076 sizeof(nvFieldDataBuffer.numOfRxChains));
2077 break;
2078
2079 case NV_COMMON_MAC_ADDR:
2080 memcpy((void *)&nvField->fieldData,
2081 &nvFieldDataBuffer.macAddr[0],
2082 NV_FIELD_MAC_ADDR_SIZE);
2083 break;
2084
2085 case NV_COMMON_MFG_SERIAL_NUMBER:
2086 memcpy((void *)&nvField->fieldData,
2087 &nvFieldDataBuffer.mfgSN[0],
2088 NV_FIELD_MFG_SN_SIZE);
2089 break;
2090
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002091 case NV_COMMON_WLAN_NV_REV_ID:
2092 memcpy((void *)&nvField->fieldData,
2093 &nvFieldDataBuffer.wlanNvRevId,
2094 sizeof(nvFieldDataBuffer.wlanNvRevId));
2095 break;
2096
Jeff Johnson295189b2012-06-20 16:38:30 -07002097 case NV_COMMON_COUPLER_TYPE:
2098 memcpy((void *)&nvField->fieldData,
2099 &nvFieldDataBuffer.couplerType,
2100 sizeof(nvFieldDataBuffer.couplerType));
2101 break;
2102
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002103 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002104 {
2105 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2106 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2107
2108 nvEmbededStatus = vos_nv_isEmbeddedNV();
2109
2110 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2111 {
2112 // High bit is set to indicate embedded NV..
2113 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2114 }
2115
2116 memcpy((void *)&nvField->fieldData,
2117 &nvVersion,
2118 sizeof(nvFieldDataBuffer.nvVersion));
2119 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002120 break;
2121
Jeff Johnson295189b2012-06-20 16:38:30 -07002122 default:
2123 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2124 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002125 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002126 break;
2127 }
2128
2129 return 1;
2130}
2131
2132/**---------------------------------------------------------------------------
2133
2134 \brief wlan_hdd_ftm_set_nv_field() -
2135 Set Specific NV field
2136
2137 \param - ftmCmd - Pointer FTM Commad Buffer
2138
2139 \return - int
2140 -1, Process Host command fail, vail out
2141 1, Process Host command success
2142
2143 --------------------------------------------------------------------------*/
2144int wlan_hdd_ftm_set_nv_field
2145(
2146 tPttMsgbuffer *ftmCmd
2147)
2148{
2149 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2150 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2151 v_SIZE_t nvSize;
2152 sHalNv *nvContents = NULL;
2153 v_U8_t macLoop;
2154 v_U8_t *pNVMac;
2155 v_U8_t lastByteMAC;
2156
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002157
Jeff Johnson295189b2012-06-20 16:38:30 -07002158 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2159 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2160 {
2161 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
2162 "Fail to get cached NV value Status %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002163 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002164 }
2165
2166 switch (nvField->nvField)
2167 {
2168 case NV_COMMON_PRODUCT_ID:
2169 memcpy(&nvContents->fields.productId,
2170 &nvField->fieldData,
2171 sizeof(nvContents->fields.productId));
2172 break;
2173
2174 case NV_COMMON_PRODUCT_BANDS:
2175 memcpy(&nvContents->fields.productBands,
2176 &nvField->fieldData,
2177 sizeof(nvContents->fields.productBands));
2178 break;
2179
2180 case NV_COMMON_NUM_OF_TX_CHAINS:
2181 memcpy(&nvContents->fields.numOfTxChains,
2182 &nvField->fieldData,
2183 sizeof(nvContents->fields.numOfTxChains));
2184 break;
2185
2186 case NV_COMMON_NUM_OF_RX_CHAINS:
2187 memcpy(&nvContents->fields.numOfRxChains,
2188 &nvField->fieldData,
2189 sizeof(nvContents->fields.numOfRxChains));
2190 break;
2191
2192 case NV_COMMON_MAC_ADDR:
2193 /* If Last byte is larger than 252 (0xFC), return Error,
2194 * Since 3MACs should be derived from first MAC */
2195 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002196 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002197 {
2198 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2199 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002200 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002201 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002202 }
2203
2204 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002205 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002206 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2207 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002208 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002209 lastByteMAC + macLoop;
2210 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002211 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002212 NV_FIELD_MAC_ADDR_SIZE);
2213 }
2214 break;
2215
2216 case NV_COMMON_MFG_SERIAL_NUMBER:
2217 memcpy(&nvContents->fields.mfgSN[0],
2218 &nvField->fieldData,
2219 NV_FIELD_MFG_SN_SIZE);
2220 break;
2221
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002222 case NV_COMMON_WLAN_NV_REV_ID:
2223 memcpy(&nvContents->fields.wlanNvRevId,
2224 &nvField->fieldData,
2225 sizeof(nvContents->fields.wlanNvRevId));
2226 break;
2227
Jeff Johnson295189b2012-06-20 16:38:30 -07002228 case NV_COMMON_COUPLER_TYPE:
2229 memcpy(&nvContents->fields.couplerType,
2230 &nvField->fieldData,
2231 sizeof(nvContents->fields.couplerType));
2232 break;
2233
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002234 case NV_COMMON_NV_VERSION:
2235 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2236 "Cannot modify NV version field %d", nvField->nvField);
2237 return -EIO;
2238 break;
2239
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 default:
2241 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2242 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002243 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002244 break;
2245 }
2246
2247 return 1;
2248}
2249
2250/**---------------------------------------------------------------------------
2251
2252 \brief wlan_hdd_ftm_store_nv_table() -
2253 Store Cached NV information into Flash Memory, file
2254
2255 \param - ftmCmd - Pointer FTM Commad Buffer
2256
2257 \return - int
2258 -1, Process Host command fail, vail out
2259 0, Process Host command success
2260
2261 --------------------------------------------------------------------------*/
2262int wlan_hdd_ftm_store_nv_table
2263(
2264 tPttMsgbuffer *ftmCmd
2265)
2266{
2267 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2268 v_SIZE_t nvSize;
2269 sHalNv *nvContents = NULL;
2270 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2271 void *tablePtr = NULL;
2272 unsigned int tableSize = 0;
2273 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
2274
2275 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2276 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2277 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002278 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002279 }
2280
2281 /* Set Platform type as PRIMA */
2282 nvContents->fields.wlanNvRevId = 2;
2283
2284 switch(nvTable->nvTable)
2285 {
2286 case NV_FIELDS_IMAGE:
2287 tablePtr = (void *)&nvContents->fields;
2288 tableSize = sizeof(nvContents->fields);
2289 tableVNVType = VNV_FIELD_IMAGE;
2290 break;
2291
2292 case NV_TABLE_RATE_POWER_SETTINGS:
2293 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2294 tableSize = sizeof(nvContents->tables.pwrOptimum);
2295 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2296 break;
2297
2298 case NV_TABLE_REGULATORY_DOMAINS:
2299 tablePtr = (void *)&nvContents->tables.regDomains[0];
2300 tableSize = sizeof(nvContents->tables.regDomains);
2301 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2302 break;
2303
2304 case NV_TABLE_DEFAULT_COUNTRY:
2305 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2306 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2307 tableVNVType = VNV_DEFAULT_LOCATION;
2308 break;
2309
2310 case NV_TABLE_TPC_POWER_TABLE:
2311 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2312 tableSize = sizeof(nvContents->tables.plutCharacterized);
2313 tableVNVType = VNV_TPC_POWER_TABLE;
2314 break;
2315
2316 case NV_TABLE_TPC_PDADC_OFFSETS:
2317 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2318 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2319 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2320 break;
2321
2322 case NV_TABLE_VIRTUAL_RATE:
2323 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2324 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2325 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2326 break;
2327
2328 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2329 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2330 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2331 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2332 break;
2333
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002334 case NV_TABLE_HW_CAL_VALUES:
2335 tablePtr = (void *)&nvContents->tables.hwCalValues;
2336 tableSize = sizeof(nvContents->tables.hwCalValues);
2337 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002338 break;
2339
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002340 case NV_TABLE_FW_CONFIG:
2341 tablePtr = (void *)&nvContents->tables.fwConfig;
2342 tableSize = sizeof(nvContents->tables.fwConfig);
2343 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002344 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002345
Jeff Johnson295189b2012-06-20 16:38:30 -07002346 case NV_TABLE_ANTENNA_PATH_LOSS:
2347 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2348 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2349 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2350 break;
2351
2352 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2353 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2354 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2355 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2356 break;
2357
2358 default:
2359 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2360 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002361 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002362 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002363
Jeff Johnson295189b2012-06-20 16:38:30 -07002364 }
2365
2366 nvStatus = vos_nv_write(tableVNVType,
2367 tablePtr,
2368 tableSize);
2369 if(VOS_STATUS_SUCCESS != nvStatus)
2370 {
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002371 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002372 }
2373
2374 return 1;
2375}
2376
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002377/* --------------------------------------------------------------------------
2378 \brief wlan_hdd_ftm_get_nv_bin() -
2379 Get NV bin read from Flash Memory, file
2380
2381 \param - ftmCmd - Pointer FTM Commad Buffer
2382
2383 \return - int
2384 -1, Process Host command fail, vail out
2385 0, Process Host command success
2386--------------------------------------------------------------------------*/
2387
2388static int wlan_hdd_ftm_get_nv_bin
2389(
2390 v_U16_t msgId,
2391 hdd_context_t *pHddCtx,
2392 tPttMsgbuffer *ftmCmd
2393)
2394{
2395 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2396 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2397 v_SIZE_t nvSize;
2398 v_U8_t *nvContents;
2399 v_U16_t offset = 0;
2400
2401
2402 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2403 (0 == pHddCtx->ftm.processedNVTableSize))
2404 {
2405 if ( msgId == PTT_MSG_GET_NV_BIN )
2406 {
2407 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2408 }
2409 else
2410 {
2411 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2412 }
2413
2414 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2415 {
2416 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2417 "Fail to get cached NV value Status %d", nvStatus);
2418 return -EIO;
2419 }
2420
2421 switch (nvTable->nvTable)
2422 {
2423 case NV_BINARY_IMAGE:
2424 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2425 break;
2426 default:
2427 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2428 "Not Valid NV Table %d", nvTable->nvTable);
2429 return -EIO;
2430 break;
2431 }
2432
2433 /* Set Current Processing NV table type */
2434 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2435 if ( msgId == PTT_MSG_GET_NV_BIN )
2436 {
2437 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2438 /* Validity Period */
2439 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2440 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2441 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2442 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2443 offset = sizeof(v_U32_t);
2444 }
2445 else
2446 {
2447 pHddCtx->ftm.targetNVTableSize = nvSize;
2448 offset = 0;
2449 }
2450
2451 /* Copy target NV table value into temp context buffer */
2452 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2453 pHddCtx->ftm.targetNVTablePointer,
2454 pHddCtx->ftm.targetNVTableSize);
2455 }
2456
2457
2458 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2459 {
2460 /* Invalid table type */
2461 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2462 "Invalid NV Table, now Processing %d, not %d",
2463 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2464
2465 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2466 pHddCtx->ftm.targetNVTableSize = 0;
2467 pHddCtx->ftm.processedNVTableSize = 0;
2468 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2469
2470 return -EINVAL;
2471 }
2472
2473 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2474
2475 /* Update processed pointer to prepare next chunk copy */
2476 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2477 pHddCtx->ftm.targetNVTableSize )
2478 {
2479 nvTable->chunkSize =
2480 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2481 }
2482
2483 /* Copy next chunk of NV table value into response buffer */
2484 vos_mem_copy(
2485 &nvTable->tableData,
2486 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2487 nvTable->chunkSize);
2488
2489 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2490
2491 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2492 {
2493 /* Finished to process last chunk of data, initialize buffer */
2494 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2495 pHddCtx->ftm.targetNVTableSize = 0;
2496 pHddCtx->ftm.processedNVTableSize = 0;
2497 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2498 }
2499
2500 return 1;
2501}
2502
2503/**---------------------------------------------------------------------------
2504
2505 \brief wlan_hdd_ftm_set_nv_bin() -
2506 Set NV bin to Flash Memory, file
2507
2508 \param - ftmCmd - Pointer FTM Commad Buffer
2509
2510 \return - int
2511 -1, Process Host command fail, vail out
2512 0, Process Host command success
2513
2514+----------------------------------------------------------------------------*/
2515
2516static int wlan_hdd_ftm_set_nv_bin
2517(
2518 hdd_context_t *pHddCtx,
2519 tPttMsgbuffer *ftmCmd
2520)
2521{
2522 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2523 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
2524
2525 /* Test first chunk of NV table */
2526 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2527 (0 == pHddCtx->ftm.processedNVTableSize))
2528 {
2529 switch (nvTable->nvTable)
2530 {
2531 case NV_BINARY_IMAGE:
2532 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2533 break;
2534 default:
2535 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2536 "Not Valid NV Table %d", nvTable->nvTable);
2537 return -EIO;
2538 break;
2539 }
2540
2541 /* Set Current Processing NV table type */
2542 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2543 pHddCtx->ftm.processedNVTableSize = 0;
2544
2545 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2546 {
2547 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2548 "Invalid Table Size %d", nvTable->tableSize);
2549 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2550 pHddCtx->ftm.targetNVTableSize = 0;
2551 pHddCtx->ftm.processedNVTableSize = 0;
2552 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2553 return -EINVAL;
2554 }
2555 }
2556
2557 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2558 {
2559 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2560 "Invalid NV Table, now Processing %d, not %d",
2561 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2562 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2563 pHddCtx->ftm.targetNVTableSize = 0;
2564 pHddCtx->ftm.processedNVTableSize = 0;
2565 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2566 return -EINVAL;
2567 }
2568
2569 vos_mem_copy(
2570 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2571 &nvTable->tableData,
2572 nvTable->chunkSize);
2573
2574 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2575
2576 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2577 {
2578 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2579 "Processing Done!! write encoded Buffer %d",
2580 pHddCtx->ftm.targetNVTableSize);
2581
2582 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2583 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2584
2585 if ((VOS_STATUS_SUCCESS != nvStatus))
2586 {
2587 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2588 "Fail to set NV Binary %d", nvStatus);
2589 return -EIO;
2590 }
2591
2592 nvStatus = vos_nv_setNVEncodedBuffer(
2593 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2594 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
2595
2596 if ((VOS_STATUS_SUCCESS != nvStatus))
2597 {
2598 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2599 "Fail to set NV Binary %d", nvStatus);
2600 return -EIO;
2601 }
2602
2603 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2604 pHddCtx->ftm.targetNVTableSize = 0;
2605 pHddCtx->ftm.processedNVTableSize = 0;
2606 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2607 }
2608
2609 return 1;
2610}
2611
Jeff Johnson295189b2012-06-20 16:38:30 -07002612/**---------------------------------------------------------------------------
2613
2614 \brief wlan_hdd_ftm_temp_get_rel_num() -
2615 Get internal release number
2616
2617 \param - ftmCmd - Pointer FTM Commad Buffer
2618
2619 \return - int
2620 -1, Process Host command fail, vail out
2621 0, Process Host command success
2622
2623 --------------------------------------------------------------------------*/
2624int wlan_hdd_ftm_temp_get_rel_num
2625(
2626 tPttMsgbuffer *ftmCmd
2627)
2628{
2629 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2630
2631 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2632 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2633 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2634 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2635 relNum->relParams.pttMax = 10;
2636 relNum->relParams.pttMin = 1;
2637
2638 return 1;
2639}
2640
2641/**---------------------------------------------------------------------------
2642
2643 \brief wlan_hdd_process_ftm_host_cmd() -
2644 process any command should be handled within host.
2645 decide any command should be send to HAL or not
2646
2647 \param - ftmCmd - Pointer FTM Commad Buffer
2648
2649 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002650 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002651 0, Process Host command success, not need to send CMD to HAL
2652 1, Process Host command success, need to send CMD to HAL
2653
2654 --------------------------------------------------------------------------*/
2655int wlan_hdd_process_ftm_host_cmd
2656(
2657 hdd_context_t *pHddCtx,
2658 void *ftmCmd
2659)
2660{
2661 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2662 int needToRouteHal = 1;
2663 int hostState = 1;
2664
2665 switch(pFTMCmd->msgId)
2666 {
2667 case PTT_MSG_GET_NV_TABLE:
2668 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2669 needToRouteHal = 0;
2670 break;
2671
2672 case PTT_MSG_SET_NV_TABLE:
2673 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2674 /* Temp NV Operation will be isolated to host
2675 needToRouteHal = 1; */
2676 needToRouteHal = 0;
2677 break;
2678
2679 case PTT_MSG_BLANK_NV:
2680 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2681 needToRouteHal = 1;
2682 break;
2683
2684 case PTT_MSG_DEL_NV_TABLE:
2685 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2686 needToRouteHal = 1;
2687 break;
2688
2689 case PTT_MSG_GET_NV_FIELD:
2690 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2691 needToRouteHal = 0;
2692 break;
2693
2694 case PTT_MSG_SET_NV_FIELD:
2695 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2696 needToRouteHal = 0;
2697 break;
2698
2699 case PTT_MSG_STORE_NV_TABLE:
2700 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2701 needToRouteHal = 0;
2702 break;
2703
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002704 case PTT_MSG_GET_NV_BIN:
2705 case PTT_MSG_GET_DICTIONARY:
2706 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
2707 needToRouteHal = 0;
2708 break;
2709
2710 case PTT_MSG_SET_NV_BIN:
2711 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
2712 needToRouteHal = 0;
2713 break;
2714
Jeff Johnson295189b2012-06-20 16:38:30 -07002715 case PTT_MSG_DBG_READ_REGISTER:
2716 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
2717 &pFTMCmd->msgBody.DbgReadRegister.regValue);
2718 needToRouteHal = 0;
2719 break;
2720
2721 case PTT_MSG_DBG_WRITE_REGISTER:
2722 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
2723 pFTMCmd->msgBody.DbgWriteRegister.regValue);
2724 needToRouteHal = 0;
2725 break;
2726
2727 case PTT_MSG_DBG_READ_MEMORY:
2728 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
2729 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
2730 pFTMCmd->msgBody.DbgReadMemory.nBytes);
2731 needToRouteHal = 0;
2732 break;
2733
2734 case PTT_MSG_DBG_WRITE_MEMORY:
2735 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
2736 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
2737 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
2738 needToRouteHal = 0;
2739 break;
2740
2741 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
2742 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
2743 needToRouteHal = 0;
2744 break;
2745
2746 default:
2747 needToRouteHal = 1;
2748 break;
2749 }
2750
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002751 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002752 {
2753 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2754 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002755 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07002756 }
2757
2758 return needToRouteHal;
2759}
Jeff Johnson295189b2012-06-20 16:38:30 -07002760
2761/**---------------------------------------------------------------------------
2762
2763 \brief wlan_hdd_process_ftm_cmd() -
2764
2765 This function process the commands received from the ptt socket application.
2766
2767 \param - pAdapter - Pointer HDD Context.
2768
2769 \param - wnl - Pointer to the ANI netlink header.
2770
2771 \return - none
2772
2773 --------------------------------------------------------------------------*/
2774
2775void wlan_hdd_process_ftm_cmd
2776(
2777 hdd_context_t *pHddCtx,
2778 tAniNlHdr *wnl
2779)
2780{
2781 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
2782 v_U16_t cmd_len;
2783 v_U8_t *pftm_data;
2784 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07002785 int hostState;
2786 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002787
2788 ENTER();
2789
Jeff Johnsone7245742012-09-05 17:12:55 -07002790 //Delay to fix NV write failure on JB
2791 vos_busy_wait(10000); //10ms
2792
Jeff Johnson295189b2012-06-20 16:38:30 -07002793 if (!pRequestBuf) {
2794
2795 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null\n",__func__);
2796 return ;
2797 }
2798 /*Save the received request*/
2799 pHddCtx->ftm.pRequestBuf = pRequestBuf;
2800
2801 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
2802 /*Save the received request netlink header used for sending the response*/
2803 pHddCtx->ftm.wnl = wnl;
2804 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
2805
2806 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d\n",__func__,pRequestBuf->module_type);
2807
2808 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2809 wlan_ftm_send_response(pHddCtx);
2810 return ;
2811 }
2812
2813 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
2814 {
2815 case WLAN_FTM_START:
2816 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
2817
2818 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d\n",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
2819 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
2820 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2821 wlan_ftm_send_response(pHddCtx);
2822 return;
2823 }
2824
2825 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
2826 {
2827 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
2828 ,__func__);
2829 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2830 wlan_ftm_send_response(pHddCtx);
2831 return;
2832 }
2833 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
2834 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
2835 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2836 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
2837
2838 wlan_ftm_send_response(pHddCtx);
2839
2840 break;
2841
2842 case WLAN_FTM_STOP:
2843 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
2844
2845 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started\n",__func__);
2846 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2847 wlan_ftm_send_response(pHddCtx);
2848 return;
2849 }
2850
2851 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
2852
2853 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2854 wlan_ftm_send_response(pHddCtx);
2855 return;
2856 }
2857
2858 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
2859 /* This would send back the Command Success Status */
2860 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2861
2862 wlan_ftm_send_response(pHddCtx);
2863
2864 break;
2865
2866 case WLAN_FTM_CMD:
2867 /* if it is regular FTM command, pass it to HAL PHY */
2868 if(pHddCtx->ftm.IsCmdPending == TRUE) {
2869 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process\n",__func__);
2870 return;
2871 }
2872 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
2873
2874 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started\n",__func__);
2875
2876 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2877 wlan_ftm_send_response(pHddCtx);
2878 return;
2879
2880 }
2881 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
2882 cmd_len = pRequestBuf->ftm_hdr.data_len;
2883 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
2884 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
2885
Jeff Johnson295189b2012-06-20 16:38:30 -07002886 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
2887 if (0 == hostState)
2888 {
2889 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
2890 if (NULL == tempRspBuffer)
2891 {
2892 hddLog(VOS_TRACE_LEVEL_ERROR,
2893 "%s:: temp Mem Alloc Fail\n",__func__);
2894 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2895 wlan_ftm_send_response(pHddCtx);
2896 return;
2897 }
2898 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
2899 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
2900 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
2901 (unsigned char *) tempRspBuffer,
2902 tempRspBuffer->msgBodyLength);
2903 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
2904 wlan_ftm_send_response(pHddCtx);
2905 vos_mem_free(tempRspBuffer);
2906 return;
2907 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002908 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07002909 {
2910 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
2911 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
2912 wlan_ftm_send_response(pHddCtx);
2913 return;
2914 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002915
2916 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
2917
2918 pHddCtx->ftm.IsCmdPending = TRUE;
2919
2920 /*Post the command to the HAL*/
2921 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
2922
2923 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed\n",__func__);
2924 return;
2925
2926 }
2927 /*Wait here until you get the response from HAL*/
2928 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
2929 {
2930 hddLog(VOS_TRACE_LEVEL_ERROR,
2931 "%s: vos_wait_single_event failed",__func__);
2932 return;
2933 }
2934
2935 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
2936
2937 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
2938
2939 wlan_ftm_send_response(pHddCtx);
2940 pHddCtx->ftm.IsCmdPending = FALSE;
2941 break;
2942
2943 default:
2944
2945 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported \n",__func__);
2946 return;
2947 }
2948
2949 EXIT();
2950 return;
2951} /* wlan_adp_ftm_cmd() */
2952
2953/**---------------------------------------------------------------------------
2954
2955 \brief wlan_ftm_priv_start_stop_ftm() -
2956
2957 This function is used for start/stop the ftm driver.
2958
2959 \param - pAdapter - Pointer HDD Context.
2960 - start - 1/0 to start/stop ftm driver.
2961
2962 \return - 0 for success, non zero for failure
2963
2964 --------------------------------------------------------------------------*/
2965
2966static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
2967 v_U16_t start)
2968{
2969 VOS_STATUS status;
2970 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
2971
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002972 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07002973 {
2974 pHddCtx->ftm.cmd_iwpriv = TRUE;
2975 status = wlan_hdd_ftm_start(pHddCtx);
2976
2977 if (status != VOS_STATUS_SUCCESS)
2978 {
2979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
2980 "FTM Start Failed");
2981 return VOS_STATUS_E_FAILURE;
2982 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05302983 if (NULL == pMsgBuf)
2984 {
2985 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
2986 if (NULL == pMsgBuf)
2987 {
2988 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
2989 "%s:pMsgBuf is NULL", __func__);
2990 return VOS_STATUS_E_FAILURE;
2991 }
2992 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002993 }
2994 else
2995 {
2996 status = wlan_ftm_stop(pHddCtx);
2997
2998 if (status != VOS_STATUS_SUCCESS)
2999 {
3000 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3001 "FTM Stop Failed");
3002 return VOS_STATUS_E_FAILURE;
3003 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303004 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3005 if (pMsgBuf)
3006 {
3007 vos_mem_free((v_VOID_t * )pMsgBuf);
3008 pMsgBuf = NULL;
3009 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003010 }
3011 return VOS_STATUS_SUCCESS;
3012}
3013
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303014
3015static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3016{
3017 unsigned int *table = NULL;
3018 int index = 0;
3019
3020 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3021 table = valid_channel;
3022 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3023 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3024 table = valid_channel_cb40;
3025 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3026 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3027 table = valid_channel_cb80;
3028
3029 if (NULL == table)
3030 return VOS_STATUS_E_FAILURE;
3031
3032 while (table[index] != 0)
3033 {
3034 if (table[index] == channel)
3035 return VOS_STATUS_SUCCESS;
3036
3037 index++;
3038 }
3039
3040 return VOS_STATUS_E_FAILURE;
3041}
3042
3043
Jeff Johnson295189b2012-06-20 16:38:30 -07003044/**---------------------------------------------------------------------------
3045
3046 \brief wlan_ftm_priv_set_channel() -
3047
3048 This function is used for setting the channel to the halphy ptt module.
3049
3050 \param - pAdapter - Pointer HDD Context.
3051 - channel - Channel Number 1-14.
3052
3053 \return - 0 for success, non zero for failure
3054
3055 --------------------------------------------------------------------------*/
3056
3057static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3058{
Jeff Johnson295189b2012-06-20 16:38:30 -07003059 uPttMsgs *pMsgBody;
3060 VOS_STATUS status;
3061 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3062
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303063 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003064 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303065 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3066 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003067 return VOS_STATUS_E_FAILURE;
3068 }
3069
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303070 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003071 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303072 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3073 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003074 return VOS_STATUS_E_FAILURE;
3075 }
3076
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303077 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003078 init_completion(&pHddCtx->ftm.ftm_comp_var);
3079 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3080 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3081
3082 pMsgBody = &pMsgBuf->msgBody;
3083
3084 pMsgBody->SetChannel.chId = channel;
3085
3086 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d\n",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303087 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003088
3089 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3090
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303091 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003092 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303093 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3094 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003095 status = VOS_STATUS_E_FAILURE;
3096 goto done;
3097
3098 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303099 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3100 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003101
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303102 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003103 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303104 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3105 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003106 status = VOS_STATUS_E_FAILURE;
3107 goto done;
3108
3109 }
3110done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003111
3112 return status;
3113}
3114
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303115
3116/**---------------------------------------------------------------------------
3117
3118 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3119
3120 This function is used for setting the power control mode for tx.
3121
3122 \param - pAdapter - Pointer HDD Context.
3123 - pwr_mode - power control mode 0-2.
3124
3125 \return - 0 for success, non zero for failure
3126
3127 --------------------------------------------------------------------------*/
3128
3129static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3130 v_U16_t pwr_mode)
3131{
3132 uPttMsgs *pMsgBody;
3133 VOS_STATUS status;
3134 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3135
3136 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3137 {
3138 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3139 "%s:Ftm has not started. Please start the ftm. ", __func__);
3140 return VOS_STATUS_E_FAILURE;
3141 }
3142
3143 if (pwr_mode > 2)
3144 {
3145 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3146 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3147 return VOS_STATUS_E_FAILURE;
3148 }
3149
3150 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3151 init_completion(&pHddCtx->ftm.ftm_comp_var);
3152 pMsgBody = &pMsgBuf->msgBody;
3153 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3154 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3155
3156 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3157 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3158
3159 if (status != VOS_STATUS_SUCCESS)
3160 {
3161 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3162 "%s:wlan_ftm_postmsg failed", __func__);
3163 status = VOS_STATUS_E_FAILURE;
3164 goto done;
3165 }
3166 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3167 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3168
3169 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3170 {
3171 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3172 "%s:Ptt response status failed", __func__);
3173 status = VOS_STATUS_E_FAILURE;
3174 goto done;
3175 }
3176
3177 done:
3178 return status;
3179
3180}
3181
Jeff Johnson295189b2012-06-20 16:38:30 -07003182/**---------------------------------------------------------------------------
3183
3184 \brief wlan_ftm_priv_set_txpower() -
3185
3186 This function is used for setting the txpower to the halphy ptt module.
3187
3188 \param - pAdapter - Pointer HDD Context.
3189 - txpower - txpower Number 1-18.
3190
3191 \return - 0 for success, non zero for failure
3192
3193 --------------------------------------------------------------------------*/
3194
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303195static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3196 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003197{
Jeff Johnson295189b2012-06-20 16:38:30 -07003198 uPttMsgs *pMsgBody;
3199 VOS_STATUS status;
3200 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3201
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303202 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003203 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303204 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3205 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003206 return VOS_STATUS_E_FAILURE;
3207 }
3208
3209 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3210 * when tx pktgen is enabled
3211 */
3212 if (ftm_status.frameGenEnabled)
3213 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303214 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3215 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003216 return VOS_STATUS_E_FAILURE;
3217 }
3218
3219 if(!(txpower >= 9 && txpower <= 24))
3220 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303221 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3222 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003223 return VOS_STATUS_E_FAILURE;
3224 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003225
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303226 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3227 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003228 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003229 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3230 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3231
3232 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3233
3234 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3235
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303236 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003237 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303238 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3239 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003240 status = VOS_STATUS_E_FAILURE;
3241 goto done;
3242 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303243 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3244 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003245
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303246 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003247 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303248 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3249 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003250 status = VOS_STATUS_E_FAILURE;
3251 goto done;
3252 }
3253
3254 ftm_status.txpower = txpower ;
3255 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003256
3257 return status;
3258
3259}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303260
3261
3262static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3263 v_U16_t enable)
3264{
3265 tANI_U32 value = 0;
3266 tANI_U32 reg_addr;
3267 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3268 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3269 {
3270 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3271 "%s:Ftm has not started. Please start the ftm. ", __func__);
3272 return VOS_STATUS_E_FAILURE;
3273 }
3274
3275#ifdef WCN_PRONTO
3276 reg_addr = 0xfb018000;
3277#else
3278 reg_addr = 0x03018000;
3279#endif
3280 wpalReadRegister(reg_addr, &value);
3281 if (enable)
3282 {
3283 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3284 }
3285 else
3286 {
3287 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3288 }
3289
3290 wpalWriteRegister(reg_addr, value);
3291
3292 return VOS_STATUS_SUCCESS;
3293}
3294
3295
Jeff Johnson295189b2012-06-20 16:38:30 -07003296/**---------------------------------------------------------------------------
3297
3298 \brief wlan_ftm_priv_set_txrate() -
3299
3300 This function is used for setting the txrate to the halphy ptt module.
3301 It converts the user input string for txrate to the tx rate index.
3302
3303 \param - pAdapter - Pointer HDD Context.
3304 - txrate - Pointer to the tx rate string.
3305
3306 \return - 0 for success, non zero for failure
3307
3308 --------------------------------------------------------------------------*/
3309
3310static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3311{
3312 int ii;
3313 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3314 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3315 {
3316 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3317 return VOS_STATUS_E_FAILURE;
3318 }
3319
3320 /* do not allow to change setting when tx pktgen is enabled */
3321 if (ftm_status.frameGenEnabled)
3322 {
3323 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3324 return VOS_STATUS_E_FAILURE;
3325 }
3326
3327 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3328 {
3329 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3330 break;
3331 }
3332 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3333 {
3334 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String\n",__func__);
3335 return VOS_STATUS_E_FAILURE;
3336 }
3337
3338 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3339 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3340
3341 return VOS_STATUS_SUCCESS;
3342}
3343
3344/**---------------------------------------------------------------------------
3345
3346 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3347
3348 This function is used for start/stop the tx packet generation.
3349
3350 \param - pAdapter - Pointer HDD Context.
3351 - startStop - Value( 1/0) start/stop the tx packet generation.
3352
3353 \return - 0 for success, non zero for failure
3354
3355 --------------------------------------------------------------------------*/
3356
3357static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3358{
Jeff Johnson295189b2012-06-20 16:38:30 -07003359 uPttMsgs *pMsgBody;
3360 VOS_STATUS status;
3361 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3362
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303363 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003364 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303365 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3366 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003367 return VOS_STATUS_E_FAILURE;
3368 }
3369
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303370 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003371 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303372 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3373 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003374 return VOS_STATUS_E_FAILURE;
3375 }
3376
3377 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3378 (!ftm_status.frameGenEnabled && startStop == 0))
3379 {
3380 return VOS_STATUS_SUCCESS ;
3381 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303382 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003383
Jeff Johnson295189b2012-06-20 16:38:30 -07003384 if (startStop == 1)
3385 {
3386 init_completion(&pHddCtx->ftm.ftm_comp_var);
3387 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3388 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3389 pMsgBody = &pMsgBuf->msgBody;
3390 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3391
3392 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303393 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003394 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303395 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3396 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003397 status = VOS_STATUS_E_FAILURE;
3398 goto done;
3399 }
3400
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303401 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3402 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3403 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003404 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303405 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3406 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003407 status = VOS_STATUS_E_FAILURE;
3408 goto done;
3409 }
3410 }
3411
3412 init_completion(&pHddCtx->ftm.ftm_comp_var);
3413 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3414 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3415 pMsgBody = &pMsgBuf->msgBody;
3416 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3417
3418 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3419 if(status != VOS_STATUS_SUCCESS)
3420 {
3421 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3422 status = VOS_STATUS_E_FAILURE;
3423 goto done;
3424 }
3425
3426 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3427 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3428 {
3429 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3430 status = VOS_STATUS_E_FAILURE;
3431 goto done;
3432 }
3433
3434done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003435
3436 if (status == VOS_STATUS_SUCCESS)
3437 {
3438 if (startStop == 1)
3439 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303440 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003441 }
3442 else
3443 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303444 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003445 }
3446 }
3447
3448 return status;
3449}
3450
3451
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303452
3453static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3454{
3455
3456 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3457 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3458 {
3459 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3460 "%s:Ftm has not started. Please start the ftm. ", __func__);
3461 return VOS_STATUS_E_FAILURE;
3462 }
3463
3464 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3465 {
3466 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3467 "%s:cb mode value is invalid ", __func__);
3468 return VOS_STATUS_E_FAILURE;
3469 }
3470
3471 ftm_status.cbmode = cbmode;
3472
3473 return VOS_STATUS_SUCCESS;
3474
3475}
3476
Jeff Johnson295189b2012-06-20 16:38:30 -07003477/**---------------------------------------------------------------------------
3478
3479 \brief wlan_ftm_rx_mode() -
3480
3481 This function is used for start/stop the rx packet generation.
3482
3483 \param - pAdapter - Pointer HDD Context.
3484 - rxmode - 0-disable RX.
3485 - 1-rx ALL frames
3486 - 2-rx 11 g/n frames
3487 - 3-rx 11b frames
3488
3489 \return - 0 for success, non zero for failure
3490
3491 --------------------------------------------------------------------------*/
3492
3493static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3494{
Jeff Johnson295189b2012-06-20 16:38:30 -07003495 uPttMsgs *pMsgBody;
3496 VOS_STATUS status;
3497
3498 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303499 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003500 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303501 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3502 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003503 return VOS_STATUS_E_FAILURE;
3504 }
3505
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303506 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003507 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303508 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3509 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003510 return VOS_STATUS_E_FAILURE;
3511 }
3512
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303513 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003514 init_completion(&pHddCtx->ftm.ftm_comp_var);
3515
3516 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3517 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3518
3519 pMsgBody = &pMsgBuf->msgBody;
3520
3521 switch(rxmode)
3522 {
3523 case RXMODE_DISABLE_ALL:
3524 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3525 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3526 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3527 break;
3528
3529 case RXMODE_ENABLE_ALL:
3530 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3531 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3532 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3533 break;
3534
3535 case RXMODE_ENABLE_11GN:
3536 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3537 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3538 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3539 break;
3540
3541 case RXMODE_ENABLE_11B:
3542 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3543 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3544 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3545 break;
3546
3547 }
3548
3549 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3550
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303551 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003552 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303553 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3554 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003555 status = VOS_STATUS_E_FAILURE;
3556 goto done;
3557 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303558 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3559 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003560
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303561 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003562 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303563 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3564 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003565 status = VOS_STATUS_E_FAILURE;
3566 goto done;
3567 }
3568 ftm_status.rxmode = rxmode ;
3569done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003570
3571 return status;
3572}
3573
3574/**---------------------------------------------------------------------------
3575
3576 \brief wlan_ftm_priv_rx_pkt_clear() -
3577
3578 This function sets the rx pkt count to zero.
3579
3580 \param - pAdapter - Pointer HDD Context.
3581 - rx_pkt_clear - rx_pkt_clear value.
3582
3583 \return - 0 for success, non zero for failure
3584
3585 --------------------------------------------------------------------------*/
3586
3587static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3588{
Jeff Johnson295189b2012-06-20 16:38:30 -07003589 VOS_STATUS status;
3590 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3591
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303592 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003593 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303594 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3595 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003596 return VOS_STATUS_E_FAILURE;
3597 }
3598
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303599 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303601 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3602 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003603 return VOS_STATUS_E_FAILURE;
3604 }
3605
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303606 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003607 init_completion(&pHddCtx->ftm.ftm_comp_var);
3608 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
3609 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
3610
Jeff Johnson295189b2012-06-20 16:38:30 -07003611 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3612
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303613 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003614 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303615 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3616 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003617 status = VOS_STATUS_E_FAILURE;
3618 goto done;
3619 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303620 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3621 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003622
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303623 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003624 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303625 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3626 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003627 status = VOS_STATUS_E_FAILURE;
3628 goto done;
3629 }
3630done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003631
3632 return status;
3633}
3634
3635/**---------------------------------------------------------------------------
3636
3637 \brief wlan_ftm_priv_get_channel() -
3638
3639 This function gets the channel number from the halphy ptt module and
3640 returns the channel number to the application.
3641
3642 \param - pAdapter - Pointer HDD Context.
3643 - pChannel - Poniter to get the Channel number.
3644
3645 \return - 0 for success, non zero for failure
3646
3647 --------------------------------------------------------------------------*/
3648
3649static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
3650{
Jeff Johnson295189b2012-06-20 16:38:30 -07003651 uPttMsgs *pMsgBody;
3652 VOS_STATUS status;
3653 v_U16_t freq;
3654 v_U8_t indx=0;
3655
3656 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3657
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303658 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003659 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303660 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3661 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003662 return VOS_STATUS_E_FAILURE;
3663 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303664 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003665 init_completion(&pHddCtx->ftm.ftm_comp_var);
3666 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3667 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3668
3669 pMsgBody = &pMsgBuf->msgBody;
3670 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
3671
3672 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3673
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303674 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003675 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303676 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3677 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003678 status = VOS_STATUS_E_FAILURE;
3679 goto done;
3680
3681 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303682 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3683 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003684
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303685 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003686 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303687 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3688 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003689 status = VOS_STATUS_E_FAILURE;
3690 goto done;
3691 }
3692
3693 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
3694
3695 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
3696 indx++;
3697 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
3698 {
3699 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
3700 status = VOS_STATUS_E_FAILURE;
3701 goto done;
3702 }
3703
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003704 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07003705
3706 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d\n",*pChannel, freq);
3707 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003708
3709 return status;
3710}
3711
3712/**---------------------------------------------------------------------------
3713
3714 \brief wlan_ftm_priv_get_txpower() -
3715
3716 This function gets the TX power from the halphy ptt module and
3717 returns the TX power to the application.
3718
3719 \param - pAdapter - Pointer HDD Context.
3720 - pTxPwr - Poniter to get the Tx power.
3721
3722 \return - 0 for success, non zero for failure
3723
3724 --------------------------------------------------------------------------*/
3725
3726static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
3727{
Jeff Johnson295189b2012-06-20 16:38:30 -07003728 uPttMsgs *pMsgBody;
3729 VOS_STATUS status;
3730 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3731
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303732 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003733 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303734 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3735 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003736 return VOS_STATUS_E_FAILURE;
3737 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303738 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003739 init_completion(&pHddCtx->ftm.ftm_comp_var);
3740 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
3741 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
3742
3743 pMsgBody = &pMsgBuf->msgBody;
3744
3745 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3746
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303747 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003748 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303749 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3750 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003751 status = VOS_STATUS_E_FAILURE;
3752 goto done;
3753 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303754 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3755 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003756
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303757 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003758 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3760 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003761 status = VOS_STATUS_E_FAILURE;
3762 goto done;
3763 }
3764 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
3765
3766 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003767
3768 return status;
3769}
3770
3771/**---------------------------------------------------------------------------
3772
3773 \brief wlan_ftm_priv_get_ftm_version() -
3774
3775 This function gets ftm driver and firmware version.
3776
3777 \param - pAdapter - Pointer HDD Context.
3778 - pTxRate - Poniter to get the Tx rate.
3779
3780 \return - 0 for success, non zero for failure
3781
3782 --------------------------------------------------------------------------*/
3783
3784VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
3785{
Jeff Johnson295189b2012-06-20 16:38:30 -07003786 uPttMsgs *pMsgBody;
3787 VOS_STATUS status;
3788 v_U32_t reg_val;
3789 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07003790 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3791 int lenRes = 0;
3792 int lenBuf = WE_FTM_MAX_STR_LEN;
3793
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003795 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303796 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3797 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003798 return VOS_STATUS_E_FAILURE;
3799 }
3800
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303801 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003802 init_completion(&pHddCtx->ftm.ftm_comp_var);
3803 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3804 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3805
3806 pMsgBody = &pMsgBuf->msgBody;
3807 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
3808
3809 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3810
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303811 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003812 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303813 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3814 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003815 status = VOS_STATUS_E_FAILURE;
3816 goto done;
3817
3818 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303819 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3820 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003821
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303822 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003823 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303824 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3825 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003826 status = VOS_STATUS_E_FAILURE;
3827 goto done;
3828 }
3829
3830 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
3831
3832 init_completion(&pHddCtx->ftm.ftm_comp_var);
3833
3834 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
3835 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
3836
3837 pMsgBody = &pMsgBuf->msgBody;
3838
3839 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3840
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303841 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003842 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303843 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3844 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003845 status = VOS_STATUS_E_FAILURE;
3846 goto done;
3847 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303848 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3849 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003850
3851
3852 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
3853 if(lenRes < 0 || lenRes >= lenBuf)
3854 {
3855 status = VOS_STATUS_E_FAILURE;
3856 goto done;
3857 }
3858
3859 buf += lenRes;
3860 lenBuf -= lenRes;
3861
3862 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003863 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 -07003864 if(lenRes < 0 || lenRes >= lenBuf)
3865 {
3866 status = VOS_STATUS_E_FAILURE;
3867 goto done;
3868 }
3869
3870 buf += lenRes;
3871 lenBuf -= lenRes;
3872
3873 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
3874 if(lenRes < 0 || lenRes >= lenBuf)
3875 {
3876 status = VOS_STATUS_E_FAILURE;
3877 goto done;
3878 }
3879
3880 buf += lenRes;
3881 lenBuf -= lenRes;
3882
Jeff Johnson295189b2012-06-20 16:38:30 -07003883
3884done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003885
3886 return status;
3887
3888}
3889
3890/**---------------------------------------------------------------------------
3891
3892 \brief wlan_ftm_priv_get_txrate() -
3893
3894 This function gets the TX rate from the halphy ptt module and
3895 returns the TX rate to the application.
3896
3897 \param - pAdapter - Pointer HDD Context.
3898 - pTxRate - Poniter to get the Tx rate.
3899
3900 \return - 0 for success, non zero for failure
3901
3902 --------------------------------------------------------------------------*/
3903
3904static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
3905{
Jeff Johnson295189b2012-06-20 16:38:30 -07003906 uPttMsgs *pMsgBody;
3907 VOS_STATUS status;
3908 v_U16_t rate_index,ii;
3909 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3910
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303911 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003912 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303913 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3914 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003915 return VOS_STATUS_E_FAILURE;
3916 }
3917
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303918 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003919 init_completion(&pHddCtx->ftm.ftm_comp_var);
3920 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
3921 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
3922
3923 pMsgBody = &pMsgBuf->msgBody;
3924
3925 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3926
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303927 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003928 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303929 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3930 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003931 status = VOS_STATUS_E_FAILURE;
3932 goto done;
3933 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303934 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3935 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003936
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303937 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003938
3939 rate_index = pMsgBody->GetTxPowerReport.rate;
3940 }
3941 else {
3942 /*Return the default rate*/
3943 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303944 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3945 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003946 status = VOS_STATUS_E_FAILURE;
3947 goto done;
3948 }
3949
3950 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
3951 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
3952 break;
3953 }
3954 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3955 {
3956 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index\n",__func__);
3957 status = VOS_STATUS_E_FAILURE;
3958 goto done;
3959 }
3960 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
3961done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003962
3963 return status;
3964
3965}
3966
3967/**---------------------------------------------------------------------------
3968
3969 \brief wlan_ftm_priv_get_rx_pkt_count() -
3970
3971 This function gets the rx pkt count from the halphy ptt module and
3972 returns the rx pkt count to the application.
3973
3974 \param - pAdapter - Pointer HDD Context.
3975 - pRxPktCnt - Poniter to get the rx pkt count.
3976
3977 \return - 0 for success, non zero for failure
3978
3979 --------------------------------------------------------------------------*/
3980
3981static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
3982{
Jeff Johnson295189b2012-06-20 16:38:30 -07003983 uPttMsgs *pMsgBody;
3984 VOS_STATUS status;
3985 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3986
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303987 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003988 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303989 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3990 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003991 return VOS_STATUS_E_FAILURE;
3992 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303993 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003994 init_completion(&pHddCtx->ftm.ftm_comp_var);
3995 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
3996 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
3997
3998 pMsgBody = &pMsgBuf->msgBody;
3999
4000 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4001
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304002 if (status != VOS_STATUS_SUCCESS)
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:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004006 status = VOS_STATUS_E_FAILURE;
4007 goto done;
4008 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304009 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4010 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004011
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304012 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004013 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304014 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4015 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004016 status = VOS_STATUS_E_FAILURE;
4017 goto done;
4018 }
4019 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4020done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004021
4022 return status;
4023}
4024
4025/**---------------------------------------------------------------------------
4026
4027 \brief wlan_ftm_priv_get_rx_rssi() -
4028
4029 This function gets the rx rssi from the halphy ptt module and
4030 returns the rx rssi to the application.
4031
4032 \param - pAdapter - Pointer HDD Context.
4033 - buf - Poniter to get rssi of Rx chains
4034
4035 \return - 0 for success, non zero for failure
4036
4037 --------------------------------------------------------------------------*/
4038
4039static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4040{
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 uPttMsgs *pMsgBody;
4042 VOS_STATUS status;
4043 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4044 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004045
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304046 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004047 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304048 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4049 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004050 return VOS_STATUS_E_FAILURE;
4051 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304052 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004053 init_completion(&pHddCtx->ftm.ftm_comp_var);
4054 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4055 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4056
4057 pMsgBody = &pMsgBuf->msgBody;
4058
4059 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4060
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304061 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004062 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304063 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4064 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004065 status = VOS_STATUS_E_FAILURE;
4066 goto done;
4067 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304068 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4069 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004070
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304071 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004072 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304073 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4074 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004075 status = VOS_STATUS_E_FAILURE;
4076 goto done;
4077 }
4078
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004079 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4080 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004081 pMsgBody->GetRxRssi.rssi.rx[1]);
4082
4083 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4084 {
4085 status = VOS_STATUS_E_FAILURE;
4086 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004087
Jeff Johnson295189b2012-06-20 16:38:30 -07004088done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004089
4090 return status;
4091}
4092
4093/**---------------------------------------------------------------------------
4094
4095 \brief wlan_ftm_priv_get_mac_address() -
4096
4097 This function gets the mac address from the halphy ptt module and
4098 returns the mac address to the application.
4099
4100 \param - pAdapter - Pointer HDD Context.
4101 - buf - Poniter to get the mac address.
4102
4103 \return - 0 for success, non zero for failure
4104
4105 --------------------------------------------------------------------------*/
4106
4107static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4108{
4109 v_BOOL_t itemIsValid = VOS_FALSE;
4110 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4111 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004112
Jeff Johnson295189b2012-06-20 16:38:30 -07004113 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4114
4115 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4116 {
4117 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4118 return VOS_STATUS_E_FAILURE;
4119 }
4120 /*Check the NV FIELD is valid or not*/
4121 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4122 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004123 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004124 {
4125 vos_nv_readMacAddress(macAddr);
4126
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004127 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4128 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004129 MAC_ADDR_ARRAY(macAddr));
4130 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4131 {
4132 return VOS_STATUS_E_FAILURE;
4133 }
4134 }
4135 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004136 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004137 {
4138 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004139 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4140 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 MAC_ADDR_ARRAY(macAddr));
4142
4143 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4144 {
4145 return VOS_STATUS_E_FAILURE;
4146 }
4147 }
4148 return VOS_STATUS_SUCCESS;
4149}
4150
4151/**---------------------------------------------------------------------------
4152
4153 \brief wlan_ftm_priv_set_mac_address() -
4154
4155 This function sets the mac address to the halphy ptt module and
4156 sends the netlink message to the ptt socket application which writes
4157 the macaddress to the qcom_wlan_nv.bin file
4158
4159 \param - pAdapter - Pointer HDD Context.
4160 - buf - Poniter to the macaddress.
4161
4162 \return - 0 for success, non zero for failure
4163
4164 --------------------------------------------------------------------------*/
4165
4166static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4167{
Jeff Johnson295189b2012-06-20 16:38:30 -07004168 uPttMsgs *pMsgBody;
4169 VOS_STATUS status;
4170 int macAddr[VOS_MAC_ADDRESS_LEN];
4171 v_U8_t *pMacAddress;
4172 v_U8_t ii;
4173 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4174
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304175 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004176 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4178 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004179 return VOS_STATUS_E_FAILURE;
4180 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304181 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004182 init_completion(&pHddCtx->ftm.ftm_comp_var);
4183 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4184 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4185
4186 pMsgBody = &pMsgBuf->msgBody;
4187 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4188
4189 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004190 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]))
4191 {
4192 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4193 "Invalid MacAddress Input %s", buf);
4194 return VOS_STATUS_E_FAILURE;
4195 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004196
4197 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "MacAddress = %02x:%02x:%02x:%02x:%02x:%02x",MAC_ADDR_ARRAY(macAddr));
4198
4199
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004200 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004201
4202 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4203 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4204
4205
4206 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "pMacAddress = %02x:%02x:%02x:%02x:%02x:%02x",MAC_ADDR_ARRAY(pMacAddress));
4207 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4208
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304209 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004210 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304211 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4212 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004213 status = VOS_STATUS_E_FAILURE;
4214 goto done;
4215 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304216 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4217 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004218
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304219 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004220 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304221 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4222 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004223 status = VOS_STATUS_E_FAILURE;
4224 goto done;
4225 }
4226
4227 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!\n");
4228
4229 init_completion(&pHddCtx->ftm.ftm_comp_var);
4230 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4231
4232 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4233 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4234
4235 pMsgBody = &pMsgBuf->msgBody;
4236
4237 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4238
4239 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4240
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304241 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004242 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304243 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4244 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004245 status = VOS_STATUS_E_FAILURE;
4246 goto done;
4247 }
4248
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304249 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4250 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004251done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004252
4253 return VOS_STATUS_SUCCESS;
4254}
4255
4256/* set param sub-ioctls */
4257static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4258 union iwreq_data *wrqu, char *extra)
4259{
4260 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004261 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004262 VOS_STATUS status;
4263 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4264
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004265 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Received length %d", __func__, wrqu->data.length);
4266 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Received data %s", __func__, (char*)wrqu->data.pointer);
Jeff Johnson295189b2012-06-20 16:38:30 -07004267
4268 switch(sub_cmd)
4269 {
4270 case WE_SET_MAC_ADDRESS:
4271 {
4272
4273 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "SET MAC ADDRESS\n");
4274
4275 status = wlan_ftm_priv_set_mac_address(pAdapter,(char*)wrqu->data.pointer);
4276
4277 if(status != VOS_STATUS_SUCCESS)
4278 {
4279 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_mac_address Failed =%d\n",status);
4280 ret = -EINVAL;
4281 }
4282
4283 }
4284 break;
4285 case WE_SET_TX_RATE:
4286 {
4287 status = wlan_ftm_priv_set_txrate(pAdapter,(char*)wrqu->data.pointer);
4288
4289 if(status != VOS_STATUS_SUCCESS)
4290 {
4291 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txrate Failed =%d\n",status);
4292 ret = -EINVAL;
4293 }
4294
4295 break;
4296 }
4297 default:
4298 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004299 hddLog(LOGE, "%s: Invalid sub command %d\n",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004300 ret = -EINVAL;
4301 break;
4302 }
4303 }
4304 return ret;
4305}
4306
4307static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4308 union iwreq_data *wrqu, char *extra)
4309{
4310 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4311 int *value = (int *)extra;
4312 int sub_cmd = value[0];
4313 int set_value = value[1];
4314 int ret = 0; /* success */
4315 VOS_STATUS status;
4316
4317 switch(sub_cmd)
4318 {
4319 case WE_FTM_ON_OFF:
4320 {
4321 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4322
4323 if(status != VOS_STATUS_SUCCESS)
4324 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004325 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d\n",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004326 ret = -EINVAL;
4327 }
4328
4329 break;
4330 }
4331
4332 case WE_TX_PKT_GEN:
4333 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4334
4335 if(status != VOS_STATUS_SUCCESS)
4336 {
4337 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d\n",status);
4338 ret = -EINVAL;
4339 }
4340 break;
4341
4342 case WE_SET_TX_IFS:
4343 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4344
4345 if(status != VOS_STATUS_SUCCESS)
4346 {
4347 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d\n",status);
4348 ret = -EINVAL;
4349 }
4350 break;
4351
4352 case WE_SET_TX_PKT_CNT:
4353 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4354
4355 if(status != VOS_STATUS_SUCCESS)
4356 {
4357 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d\n",status);
4358 ret = -EINVAL;
4359 }
4360 break;
4361
4362 case WE_SET_TX_PKT_LEN:
4363 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4364
4365 if(status != VOS_STATUS_SUCCESS)
4366 {
4367 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d\n",status);
4368 ret = -EINVAL;
4369 }
4370 break;
4371
4372 case WE_SET_CHANNEL:
4373 {
4374 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4375
4376 if(status != VOS_STATUS_SUCCESS)
4377 {
4378 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d\n",status);
4379 ret = -EINVAL;
4380 }
4381 break;
4382 }
4383 case WE_SET_TX_POWER:
4384 {
4385 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4386
4387 if(status != VOS_STATUS_SUCCESS)
4388 {
4389 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d\n",status);
4390 ret = -EINVAL;
4391 }
4392 break;
4393 }
4394 case WE_CLEAR_RX_PKT_CNT:
4395 {
4396 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4397
4398 if(status != VOS_STATUS_SUCCESS)
4399 {
4400 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d\n",status);
4401 ret = -EINVAL;
4402 }
4403 break;
4404 }
4405 case WE_RX:
4406 {
4407 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4408
4409 if(status != VOS_STATUS_SUCCESS)
4410 {
4411 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d\n",status);
4412 ret = -EINVAL;
4413 }
4414 break;
4415 }
4416 case WE_ENABLE_CHAIN:
4417 {
4418 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4419
4420 if(status != VOS_STATUS_SUCCESS)
4421 {
4422 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d\n",status);
4423 ret = -EINVAL;
4424 }
4425 break;
4426 }
4427
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304428 case WE_SET_PWR_CNTL_MODE:
4429 {
4430 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4431 if (status != VOS_STATUS_SUCCESS)
4432 {
4433 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4434 status);
4435 ret = -EINVAL;
4436 }
4437 break;
4438 }
4439
4440 case WE_ENABLE_DPD:
4441 {
4442 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4443 if (status != VOS_STATUS_SUCCESS)
4444 {
4445 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4446 ret = -EINVAL;
4447 }
4448 break;
4449 }
4450
4451 case WE_SET_CB:
4452 {
4453 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4454 if (status != VOS_STATUS_SUCCESS)
4455 {
4456 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4457 ret = -EINVAL;
4458 }
4459 break;
4460 }
4461
Jeff Johnson295189b2012-06-20 16:38:30 -07004462 default:
4463 {
4464 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d \n",
4465 sub_cmd, set_value);
4466 break;
4467 }
4468 }
4469
4470 return ret;
4471}
4472
4473/* get param sub-ioctls */
4474static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4475 union iwreq_data *wrqu, char *extra)
4476{
4477 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4478 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004479 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004480 VOS_STATUS status;
4481
4482 switch (value[0])
4483 {
4484 case WE_GET_CHANNEL:
4485 {
4486 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4487
4488 if(status != VOS_STATUS_SUCCESS)
4489 {
4490 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d\n",status);
4491 ret = -EINVAL;
4492 }
4493 break;
4494 }
4495 case WE_GET_TX_POWER:
4496 {
4497 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4498
4499 if(status != VOS_STATUS_SUCCESS)
4500 {
4501 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d\n",status);
4502 ret = -EINVAL;
4503 }
4504 break;
4505 }
4506 case WE_GET_RX_PKT_CNT:
4507 {
4508 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4509
4510 if(status != VOS_STATUS_SUCCESS)
4511 {
4512 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d\n",status);
4513 ret = -EINVAL;
4514 }
4515 break;
4516 }
4517 default:
4518 {
4519 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
4520 break;
4521 }
4522 }
4523
4524 return ret;
4525}
4526
4527static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
4528 union iwreq_data *wrqu, char *extra)
4529{
4530 int sub_cmd = wrqu->data.flags;
4531 VOS_STATUS status;
4532 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4533
4534 switch(sub_cmd)
4535 {
4536 case WE_GET_MAC_ADDRESS:
4537 {
4538 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
4539
4540 if(status != VOS_STATUS_SUCCESS)
4541 {
4542 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d\n",status);
4543 return -EINVAL;
4544 }
4545 wrqu->data.length = strlen(extra)+1;
4546 break;
4547 }
4548 case WE_GET_TX_RATE:
4549 {
4550 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
4551
4552 if(status != VOS_STATUS_SUCCESS)
4553 {
4554 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d\n",status);
4555 return -EINVAL;
4556 }
4557
4558 wrqu->data.length = strlen(extra)+1;
4559 break;
4560 }
4561 case WE_GET_FTM_VERSION:
4562 {
4563 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
4564
4565 if(status != VOS_STATUS_SUCCESS)
4566 {
4567 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d\n",status);
4568 return -EINVAL;
4569 }
4570 wrqu->data.length = strlen(extra)+1;
4571 break;
4572 }
4573 case WE_GET_FTM_STATUS:
4574 {
4575 status = wlan_ftm_priv_get_status(pAdapter, extra);
4576
4577 if(status != VOS_STATUS_SUCCESS)
4578 {
4579 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d\n",status);
4580 return -EINVAL;
4581 }
4582
4583 wrqu->data.length = strlen(extra)+1;
4584 break;
4585 }
4586 case WE_GET_RX_RSSI:
4587 {
4588 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
4589
4590 if(status != VOS_STATUS_SUCCESS)
4591 {
4592 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d\n",status);
4593 return -EINVAL;
4594 }
4595
4596 wrqu->data.length = strlen(extra)+1;
4597 break;
4598 }
4599 default:
4600 {
4601 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
4602 break;
4603 }
4604 }
4605
4606 return 0;
4607}
Jeff Johnson295189b2012-06-20 16:38:30 -07004608
4609VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
4610{
Jeff Johnson88ba7742013-02-27 14:36:02 -08004611#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07004612 tAniHdr *wmsg = NULL;
4613 v_U8_t *pBuf;
4614 hdd_context_t *pHddCtx = NULL;
4615 v_CONTEXT_t pVosContext= NULL;
4616
4617 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
4618 if(pBuf == NULL)
4619 {
4620 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
4621 return VOS_STATUS_E_NOMEM;
4622 }
4623 wmsg = (tAniHdr*)pBuf;
4624 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
4625 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
4626 wmsg->length = FTM_SWAP16(wmsg->length);
4627 pBuf += sizeof(tAniHdr);
4628
4629 /*Get the global context */
4630 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4631
4632 /*Get the Hdd Context */
4633 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
4634 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
4635
4636 /* EfS command Code */
4637 *(v_U32_t*)pBuf = 0x000000EF;
4638
4639 pBuf += sizeof(v_U32_t);
4640
4641 memcpy(pBuf, pData,data_len);
4642
4643 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
4644 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
4645
4646 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!\n"));
4647 vos_mem_free((v_VOID_t*)wmsg);
4648 return VOS_STATUS_E_FAILURE;
4649 }
4650 }
4651 else {
4652 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
4653
4654 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!\n"));
4655 vos_mem_free((v_VOID_t*)wmsg);
4656 return VOS_STATUS_E_FAILURE;
4657 }
4658 }
4659
4660 vos_mem_free((v_VOID_t*)wmsg);
4661#endif //FTM and ANDROID
4662
4663 return VOS_STATUS_SUCCESS;
4664}
4665
Jeff Johnson295189b2012-06-20 16:38:30 -07004666/* action sub-ioctls */
4667static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
4668 union iwreq_data *wrqu, char *extra)
4669{
4670 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004671 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004672
4673 switch (sub_cmd)
4674 {
4675 case WE_SET_NV_DEFAULTS:
4676 {
4677 v_U8_t *pu8buf,*pTempBuf;
4678 v_U16_t size;
4679 size = sizeof(v_U32_t) + sizeof(sHalNv);
4680 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d\n",size);
4681 pu8buf = vos_mem_malloc(size);
4682 if(pu8buf == NULL)
4683 {
4684 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
4685 return VOS_STATUS_E_NOMEM;
4686 }
4687 memset(pu8buf,0,size);
4688 pTempBuf = pu8buf;
4689 pTempBuf += sizeof(v_U32_t);
4690 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
4691
4692 wlan_write_to_efs(pu8buf,size);
4693 vos_mem_free(pu8buf);
4694 }
4695
4696 default:
4697 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004698 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004699 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
4700 break;
4701 }
4702 }
4703
4704 return ret;
4705}
4706
Jeff Johnson295189b2012-06-20 16:38:30 -07004707static const iw_handler we_ftm_private[] = {
4708
4709 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
4710 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
4711 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
4712 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
4713 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07004714};
4715
4716/*Maximum command length can be only 15 */
4717static const struct iw_priv_args we_ftm_private_args[] = {
4718
4719 /* handlers for main ioctl */
4720 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
4721 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4722 0,
4723 "" },
4724
4725 { WE_FTM_ON_OFF,
4726 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4727 0,
4728 "ftm" },
4729
4730 { WE_TX_PKT_GEN,
4731 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4732 0,
4733 "tx" },
4734
4735 { WE_SET_TX_IFS,
4736 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4737 0,
4738 "set_txifs" },
4739
4740 { WE_SET_TX_PKT_CNT,
4741 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4742 0,
4743 "set_txpktcnt" },
4744
4745 { WE_SET_TX_PKT_LEN,
4746 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4747 0,
4748 "set_txpktlen" },
4749
4750 { WE_SET_CHANNEL,
4751 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4752 0,
4753 "set_channel" },
4754
4755 { WE_SET_TX_POWER,
4756 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4757 0,
4758 "set_txpower" },
4759
4760 { WE_CLEAR_RX_PKT_CNT,
4761 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4762 0,
4763 "clr_rxpktcnt" },
4764
4765 { WE_RX,
4766 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4767 0,
4768 "rx" },
4769
4770 { WE_ENABLE_CHAIN,
4771 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4772 0,
4773 "ena_chain" },
4774
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304775 { WE_SET_PWR_CNTL_MODE,
4776 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4777 0,
4778 "pwr_cntl_mode" },
4779
4780 { WE_ENABLE_DPD,
4781 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4782 0,
4783 "ena_dpd" },
4784
4785 { WE_SET_CB,
4786 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4787 0,
4788 "set_cb" },
4789
Jeff Johnson295189b2012-06-20 16:38:30 -07004790 /* handlers for main ioctl */
4791 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
4792 0,
4793 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4794 "" },
4795
4796 { WE_GET_CHANNEL,
4797 0,
4798 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4799 "get_channel" },
4800
4801 { WE_GET_TX_POWER,
4802 0,
4803 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4804 "get_txpower" },
4805
4806 { WE_GET_RX_PKT_CNT,
4807 0,
4808 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4809 "get_rxpktcnt" },
4810
4811 /* handlers for main ioctl */
4812 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
4813 IW_PRIV_TYPE_CHAR| 512,
4814 0,
4815 "" },
4816
4817 { WE_SET_MAC_ADDRESS,
4818 IW_PRIV_TYPE_CHAR| 512,
4819 0,
4820 "set_mac_address" },
4821
4822 { WE_SET_TX_RATE,
4823 IW_PRIV_TYPE_CHAR | 512,
4824 0,
4825 "set_txrate" },
4826
4827 /* handlers for main ioctl */
4828 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
4829 0,
4830 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4831 "" },
4832
4833 { WE_GET_MAC_ADDRESS,
4834 0,
4835 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4836 "get_mac_address" },
4837
4838 { WE_GET_FTM_VERSION,
4839 0,
4840 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4841 "ftm_version" },
4842
4843 { WE_GET_TX_RATE,
4844 0,
4845 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4846 "get_txrate" },
4847
4848 { WE_GET_FTM_STATUS,
4849 0,
4850 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4851 "get_status" },
4852
4853 { WE_GET_RX_RSSI,
4854 0,
4855 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4856 "get_rx_rssi" },
4857
Jeff Johnson295189b2012-06-20 16:38:30 -07004858 /* handlers for main ioctl */
4859 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
4860 0,
4861 0,
4862 "" },
4863
4864 /* handlers for sub-ioctl */
4865 { WE_SET_NV_DEFAULTS,
4866 0,
4867 0,
4868 "set_nv_defaults" },
4869
4870};
4871
4872const struct iw_handler_def we_ftm_handler_def = {
4873 .num_standard = 0,
4874 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
4875 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
4876
4877 .standard = (iw_handler *)NULL,
4878 .private = (iw_handler *)we_ftm_private,
4879 .private_args = we_ftm_private_args,
4880 .get_wireless_stats = NULL,
4881};
4882
4883static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
4884{
4885
4886 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4887
4888 // Zero the memory. This zeros the profile structure.
4889 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004890
Jeff Johnson295189b2012-06-20 16:38:30 -07004891 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
4892
4893 return 0;
4894}
4895
Jeff Johnson295189b2012-06-20 16:38:30 -07004896
4897VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
4898{
Jeff Johnson295189b2012-06-20 16:38:30 -07004899 ftm_rsp_msg_t *pFtmMsgRsp;
4900
4901 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
4902 hdd_context_t *pHddCtx;
4903 v_CONTEXT_t pVosContext= NULL;
4904
4905 ENTER();
4906
4907 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
4908
4909 if (!message )
4910 {
4911 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
4912 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
4913 return VOS_STATUS_E_INVAL;
4914 }
4915 /*Get the global context */
4916 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4917
4918 /*Get the Hdd Context */
4919 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
4920
4921 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
4922
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304923 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004924 complete(&pHddCtx->ftm.ftm_comp_var);
4925 }
4926 else {
4927 /*Response length to Ptt App*/
4928 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
4929
4930 /*Ptt App expects the response length in LE */
4931 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
4932
4933 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004934 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07004935 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
4936
4937 /*Copy the message*/
4938 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
4939
4940 /*Update the error code*/
4941 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
4942
4943 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
4944
4945 if (!VOS_IS_STATUS_SUCCESS(vos_status))
4946 {
4947 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!\n"));
4948 return VOS_STATUS_E_FAILURE;
4949 }
4950 }
4951 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07004952 return VOS_STATUS_SUCCESS;
4953
4954}