blob: b2eec59b1e8cb29d3ed1510da99b65ee54365e70 [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)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800400 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700401
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,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001058 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001059 }
1060 else
1061 {
1062 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001063 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001064 }
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
Arif Hussain6d2a3322013-11-17 19:50:10 -08001312 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001313 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,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001394 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001395 }
1396 else
1397 {
1398 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001399 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001400 }
1401 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301402 goto err_status_failure;
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,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001449 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001450
1451 }
1452 else
1453 {
1454 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001455 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001456 }
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"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001617 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001618 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
Arif Hussain6d2a3322013-11-17 19:50:10 -08002795 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002796 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
Arif Hussain6d2a3322013-11-17 19:50:10 -08002806 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07002807
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
Arif Hussain6d2a3322013-11-17 19:50:10 -08002818 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07002819 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
Arif Hussain6d2a3322013-11-17 19:50:10 -08002845 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002846 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) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08002869 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002870 return;
2871 }
2872 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
2873
Arif Hussain6d2a3322013-11-17 19:50:10 -08002874 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002875
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,
Arif Hussain6d2a3322013-11-17 19:50:10 -08002893 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002894 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
Arif Hussain6d2a3322013-11-17 19:50:10 -08002923 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002924 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
Arif Hussain6d2a3322013-11-17 19:50:10 -08002945 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002946 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
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303044static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3045{
3046 unsigned int primary_channel = center_channel;
3047
3048 if (center_channel <= 14)
3049 return primary_channel ;
3050
3051 switch (cb)
3052 {
3053 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3054 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3055 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3056 primary_channel -= 2;
3057 break;
3058
3059
3060 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3061 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3062 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3063 primary_channel += 2;
3064 break;
3065
3066 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3067 primary_channel -= 6;
3068 break;
3069
3070 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3071 primary_channel += 6;
3072 break;
3073 }
3074
3075 return primary_channel;
3076
3077}
3078
Jeff Johnson295189b2012-06-20 16:38:30 -07003079/**---------------------------------------------------------------------------
3080
3081 \brief wlan_ftm_priv_set_channel() -
3082
3083 This function is used for setting the channel to the halphy ptt module.
3084
3085 \param - pAdapter - Pointer HDD Context.
3086 - channel - Channel Number 1-14.
3087
3088 \return - 0 for success, non zero for failure
3089
3090 --------------------------------------------------------------------------*/
3091
3092static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3093{
Jeff Johnson295189b2012-06-20 16:38:30 -07003094 uPttMsgs *pMsgBody;
3095 VOS_STATUS status;
3096 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3097
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303098 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003099 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303100 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3101 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003102 return VOS_STATUS_E_FAILURE;
3103 }
3104
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303105 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003106 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303107 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3108 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003109 return VOS_STATUS_E_FAILURE;
3110 }
3111
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303112 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003113 init_completion(&pHddCtx->ftm.ftm_comp_var);
3114 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3115 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3116
3117 pMsgBody = &pMsgBuf->msgBody;
3118
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303119 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003120
Arif Hussain6d2a3322013-11-17 19:50:10 -08003121 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303122 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003123
3124 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3125
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303126 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003127 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303128 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3129 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003130 status = VOS_STATUS_E_FAILURE;
3131 goto done;
3132
3133 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303134 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3135 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003136
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303137 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003138 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303139 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3140 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003141 status = VOS_STATUS_E_FAILURE;
3142 goto done;
3143
3144 }
3145done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003146
3147 return status;
3148}
3149
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303150
3151/**---------------------------------------------------------------------------
3152
3153 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3154
3155 This function is used for setting the power control mode for tx.
3156
3157 \param - pAdapter - Pointer HDD Context.
3158 - pwr_mode - power control mode 0-2.
3159
3160 \return - 0 for success, non zero for failure
3161
3162 --------------------------------------------------------------------------*/
3163
3164static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3165 v_U16_t pwr_mode)
3166{
3167 uPttMsgs *pMsgBody;
3168 VOS_STATUS status;
3169 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3170
3171 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3172 {
3173 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3174 "%s:Ftm has not started. Please start the ftm. ", __func__);
3175 return VOS_STATUS_E_FAILURE;
3176 }
3177
3178 if (pwr_mode > 2)
3179 {
3180 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3181 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3182 return VOS_STATUS_E_FAILURE;
3183 }
3184
3185 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3186 init_completion(&pHddCtx->ftm.ftm_comp_var);
3187 pMsgBody = &pMsgBuf->msgBody;
3188 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3189 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3190
3191 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3192 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3193
3194 if (status != VOS_STATUS_SUCCESS)
3195 {
3196 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3197 "%s:wlan_ftm_postmsg failed", __func__);
3198 status = VOS_STATUS_E_FAILURE;
3199 goto done;
3200 }
3201 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3202 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3203
3204 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3205 {
3206 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3207 "%s:Ptt response status failed", __func__);
3208 status = VOS_STATUS_E_FAILURE;
3209 goto done;
3210 }
3211
3212 done:
3213 return status;
3214
3215}
3216
Jeff Johnson295189b2012-06-20 16:38:30 -07003217/**---------------------------------------------------------------------------
3218
3219 \brief wlan_ftm_priv_set_txpower() -
3220
3221 This function is used for setting the txpower to the halphy ptt module.
3222
3223 \param - pAdapter - Pointer HDD Context.
3224 - txpower - txpower Number 1-18.
3225
3226 \return - 0 for success, non zero for failure
3227
3228 --------------------------------------------------------------------------*/
3229
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303230static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3231 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003232{
Jeff Johnson295189b2012-06-20 16:38:30 -07003233 uPttMsgs *pMsgBody;
3234 VOS_STATUS status;
3235 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3236
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303237 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003238 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303239 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3240 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003241 return VOS_STATUS_E_FAILURE;
3242 }
3243
3244 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3245 * when tx pktgen is enabled
3246 */
3247 if (ftm_status.frameGenEnabled)
3248 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303249 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3250 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003251 return VOS_STATUS_E_FAILURE;
3252 }
3253
3254 if(!(txpower >= 9 && txpower <= 24))
3255 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303256 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3257 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003258 return VOS_STATUS_E_FAILURE;
3259 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003260
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303261 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3262 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003263 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003264 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3265 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3266
3267 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3268
3269 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3270
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303271 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003272 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303273 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3274 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003275 status = VOS_STATUS_E_FAILURE;
3276 goto done;
3277 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303278 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3279 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003280
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303281 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003282 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303283 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3284 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003285 status = VOS_STATUS_E_FAILURE;
3286 goto done;
3287 }
3288
3289 ftm_status.txpower = txpower ;
3290 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003291
3292 return status;
3293
3294}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303295
3296
3297static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3298 v_U16_t enable)
3299{
3300 tANI_U32 value = 0;
3301 tANI_U32 reg_addr;
3302 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3303 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3304 {
3305 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3306 "%s:Ftm has not started. Please start the ftm. ", __func__);
3307 return VOS_STATUS_E_FAILURE;
3308 }
3309
3310#ifdef WCN_PRONTO
3311 reg_addr = 0xfb018000;
3312#else
3313 reg_addr = 0x03018000;
3314#endif
3315 wpalReadRegister(reg_addr, &value);
3316 if (enable)
3317 {
3318 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3319 }
3320 else
3321 {
3322 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3323 }
3324
3325 wpalWriteRegister(reg_addr, value);
3326
3327 return VOS_STATUS_SUCCESS;
3328}
3329
3330
Jeff Johnson295189b2012-06-20 16:38:30 -07003331/**---------------------------------------------------------------------------
3332
3333 \brief wlan_ftm_priv_set_txrate() -
3334
3335 This function is used for setting the txrate to the halphy ptt module.
3336 It converts the user input string for txrate to the tx rate index.
3337
3338 \param - pAdapter - Pointer HDD Context.
3339 - txrate - Pointer to the tx rate string.
3340
3341 \return - 0 for success, non zero for failure
3342
3343 --------------------------------------------------------------------------*/
3344
3345static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3346{
3347 int ii;
3348 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3349 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3350 {
3351 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3352 return VOS_STATUS_E_FAILURE;
3353 }
3354
3355 /* do not allow to change setting when tx pktgen is enabled */
3356 if (ftm_status.frameGenEnabled)
3357 {
3358 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3359 return VOS_STATUS_E_FAILURE;
3360 }
3361
3362 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3363 {
3364 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3365 break;
3366 }
3367 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3368 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003369 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003370 return VOS_STATUS_E_FAILURE;
3371 }
3372
3373 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3374 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3375
3376 return VOS_STATUS_SUCCESS;
3377}
3378
3379/**---------------------------------------------------------------------------
3380
3381 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3382
3383 This function is used for start/stop the tx packet generation.
3384
3385 \param - pAdapter - Pointer HDD Context.
3386 - startStop - Value( 1/0) start/stop the tx packet generation.
3387
3388 \return - 0 for success, non zero for failure
3389
3390 --------------------------------------------------------------------------*/
3391
3392static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3393{
Jeff Johnson295189b2012-06-20 16:38:30 -07003394 uPttMsgs *pMsgBody;
3395 VOS_STATUS status;
3396 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3397
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303398 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003399 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303400 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3401 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003402 return VOS_STATUS_E_FAILURE;
3403 }
3404
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303405 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003406 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303407 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3408 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003409 return VOS_STATUS_E_FAILURE;
3410 }
3411
3412 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3413 (!ftm_status.frameGenEnabled && startStop == 0))
3414 {
3415 return VOS_STATUS_SUCCESS ;
3416 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303417 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003418
Jeff Johnson295189b2012-06-20 16:38:30 -07003419 if (startStop == 1)
3420 {
3421 init_completion(&pHddCtx->ftm.ftm_comp_var);
3422 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3423 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3424 pMsgBody = &pMsgBuf->msgBody;
3425 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3426
3427 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303428 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003429 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303430 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3431 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003432 status = VOS_STATUS_E_FAILURE;
3433 goto done;
3434 }
3435
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303436 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3437 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3438 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003439 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303440 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3441 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003442 status = VOS_STATUS_E_FAILURE;
3443 goto done;
3444 }
3445 }
3446
3447 init_completion(&pHddCtx->ftm.ftm_comp_var);
3448 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3449 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3450 pMsgBody = &pMsgBuf->msgBody;
3451 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3452
3453 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3454 if(status != VOS_STATUS_SUCCESS)
3455 {
3456 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3457 status = VOS_STATUS_E_FAILURE;
3458 goto done;
3459 }
3460
3461 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var, msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3462 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3463 {
3464 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3465 status = VOS_STATUS_E_FAILURE;
3466 goto done;
3467 }
3468
3469done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003470
3471 if (status == VOS_STATUS_SUCCESS)
3472 {
3473 if (startStop == 1)
3474 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303475 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003476 }
3477 else
3478 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303479 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003480 }
3481 }
3482
3483 return status;
3484}
3485
3486
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303487
3488static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3489{
3490
3491 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3492 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3493 {
3494 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3495 "%s:Ftm has not started. Please start the ftm. ", __func__);
3496 return VOS_STATUS_E_FAILURE;
3497 }
3498
3499 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3500 {
3501 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3502 "%s:cb mode value is invalid ", __func__);
3503 return VOS_STATUS_E_FAILURE;
3504 }
3505
3506 ftm_status.cbmode = cbmode;
3507
3508 return VOS_STATUS_SUCCESS;
3509
3510}
3511
Jeff Johnson295189b2012-06-20 16:38:30 -07003512/**---------------------------------------------------------------------------
3513
3514 \brief wlan_ftm_rx_mode() -
3515
3516 This function is used for start/stop the rx packet generation.
3517
3518 \param - pAdapter - Pointer HDD Context.
3519 - rxmode - 0-disable RX.
3520 - 1-rx ALL frames
3521 - 2-rx 11 g/n frames
3522 - 3-rx 11b frames
3523
3524 \return - 0 for success, non zero for failure
3525
3526 --------------------------------------------------------------------------*/
3527
3528static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3529{
Jeff Johnson295189b2012-06-20 16:38:30 -07003530 uPttMsgs *pMsgBody;
3531 VOS_STATUS status;
3532
3533 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303534 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003535 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303536 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3537 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003538 return VOS_STATUS_E_FAILURE;
3539 }
3540
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303541 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003542 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3544 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003545 return VOS_STATUS_E_FAILURE;
3546 }
3547
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303548 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003549 init_completion(&pHddCtx->ftm.ftm_comp_var);
3550
3551 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3552 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3553
3554 pMsgBody = &pMsgBuf->msgBody;
3555
3556 switch(rxmode)
3557 {
3558 case RXMODE_DISABLE_ALL:
3559 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3560 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3561 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3562 break;
3563
3564 case RXMODE_ENABLE_ALL:
3565 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3566 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3567 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3568 break;
3569
3570 case RXMODE_ENABLE_11GN:
3571 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3572 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3573 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3574 break;
3575
3576 case RXMODE_ENABLE_11B:
3577 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3578 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3579 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3580 break;
3581
3582 }
3583
3584 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3585
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303586 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003587 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303588 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3589 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003590 status = VOS_STATUS_E_FAILURE;
3591 goto done;
3592 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303593 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3594 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003595
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303596 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003597 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303598 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3599 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 status = VOS_STATUS_E_FAILURE;
3601 goto done;
3602 }
3603 ftm_status.rxmode = rxmode ;
3604done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003605
3606 return status;
3607}
3608
3609/**---------------------------------------------------------------------------
3610
3611 \brief wlan_ftm_priv_rx_pkt_clear() -
3612
3613 This function sets the rx pkt count to zero.
3614
3615 \param - pAdapter - Pointer HDD Context.
3616 - rx_pkt_clear - rx_pkt_clear value.
3617
3618 \return - 0 for success, non zero for failure
3619
3620 --------------------------------------------------------------------------*/
3621
3622static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3623{
Jeff Johnson295189b2012-06-20 16:38:30 -07003624 VOS_STATUS status;
3625 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3626
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303627 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003628 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303629 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3630 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003631 return VOS_STATUS_E_FAILURE;
3632 }
3633
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303634 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07003635 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303636 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3637 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003638 return VOS_STATUS_E_FAILURE;
3639 }
3640
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303641 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003642 init_completion(&pHddCtx->ftm.ftm_comp_var);
3643 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
3644 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
3645
Jeff Johnson295189b2012-06-20 16:38:30 -07003646 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3647
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303648 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003649 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303650 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3651 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003652 status = VOS_STATUS_E_FAILURE;
3653 goto done;
3654 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303655 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3656 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003657
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303658 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
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:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003662 status = VOS_STATUS_E_FAILURE;
3663 goto done;
3664 }
3665done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003666
3667 return status;
3668}
3669
3670/**---------------------------------------------------------------------------
3671
3672 \brief wlan_ftm_priv_get_channel() -
3673
3674 This function gets the channel number from the halphy ptt module and
3675 returns the channel number to the application.
3676
3677 \param - pAdapter - Pointer HDD Context.
3678 - pChannel - Poniter to get the Channel number.
3679
3680 \return - 0 for success, non zero for failure
3681
3682 --------------------------------------------------------------------------*/
3683
3684static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
3685{
Jeff Johnson295189b2012-06-20 16:38:30 -07003686 uPttMsgs *pMsgBody;
3687 VOS_STATUS status;
3688 v_U16_t freq;
3689 v_U8_t indx=0;
3690
3691 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3692
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303693 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003694 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303695 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3696 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 return VOS_STATUS_E_FAILURE;
3698 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303699 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003700 init_completion(&pHddCtx->ftm.ftm_comp_var);
3701 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3702 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3703
3704 pMsgBody = &pMsgBuf->msgBody;
3705 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
3706
3707 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3708
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303709 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003710 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303711 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3712 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003713 status = VOS_STATUS_E_FAILURE;
3714 goto done;
3715
3716 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303717 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3718 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003719
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303720 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003721 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303722 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3723 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003724 status = VOS_STATUS_E_FAILURE;
3725 goto done;
3726 }
3727
3728 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
3729
3730 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
3731 indx++;
3732 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
3733 {
3734 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
3735 status = VOS_STATUS_E_FAILURE;
3736 goto done;
3737 }
3738
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003739 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07003740
Arif Hussain6d2a3322013-11-17 19:50:10 -08003741 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003742 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003743
3744 return status;
3745}
3746
3747/**---------------------------------------------------------------------------
3748
3749 \brief wlan_ftm_priv_get_txpower() -
3750
3751 This function gets the TX power from the halphy ptt module and
3752 returns the TX power to the application.
3753
3754 \param - pAdapter - Pointer HDD Context.
3755 - pTxPwr - Poniter to get the Tx power.
3756
3757 \return - 0 for success, non zero for failure
3758
3759 --------------------------------------------------------------------------*/
3760
3761static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
3762{
Jeff Johnson295189b2012-06-20 16:38:30 -07003763 uPttMsgs *pMsgBody;
3764 VOS_STATUS status;
3765 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3766
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303767 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003768 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303769 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3770 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 return VOS_STATUS_E_FAILURE;
3772 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303773 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003774 init_completion(&pHddCtx->ftm.ftm_comp_var);
3775 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
3776 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
3777
3778 pMsgBody = &pMsgBuf->msgBody;
3779
3780 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3781
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303782 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003783 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303784 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3785 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003786 status = VOS_STATUS_E_FAILURE;
3787 goto done;
3788 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303789 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3790 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003791
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303792 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003793 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3795 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003796 status = VOS_STATUS_E_FAILURE;
3797 goto done;
3798 }
3799 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
3800
3801 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003802
3803 return status;
3804}
3805
3806/**---------------------------------------------------------------------------
3807
3808 \brief wlan_ftm_priv_get_ftm_version() -
3809
3810 This function gets ftm driver and firmware version.
3811
3812 \param - pAdapter - Pointer HDD Context.
3813 - pTxRate - Poniter to get the Tx rate.
3814
3815 \return - 0 for success, non zero for failure
3816
3817 --------------------------------------------------------------------------*/
3818
3819VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
3820{
Jeff Johnson295189b2012-06-20 16:38:30 -07003821 uPttMsgs *pMsgBody;
3822 VOS_STATUS status;
3823 v_U32_t reg_val;
3824 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07003825 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3826 int lenRes = 0;
3827 int lenBuf = WE_FTM_MAX_STR_LEN;
3828
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303829 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003830 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303831 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3832 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 return VOS_STATUS_E_FAILURE;
3834 }
3835
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303836 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003837 init_completion(&pHddCtx->ftm.ftm_comp_var);
3838 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
3839 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
3840
3841 pMsgBody = &pMsgBuf->msgBody;
3842 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
3843
3844 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3845
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303846 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003847 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3849 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003850 status = VOS_STATUS_E_FAILURE;
3851 goto done;
3852
3853 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303854 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3855 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003856
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303857 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003858 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303859 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3860 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003861 status = VOS_STATUS_E_FAILURE;
3862 goto done;
3863 }
3864
3865 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
3866
3867 init_completion(&pHddCtx->ftm.ftm_comp_var);
3868
3869 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
3870 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
3871
3872 pMsgBody = &pMsgBuf->msgBody;
3873
3874 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3875
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303876 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003877 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303878 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3879 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 status = VOS_STATUS_E_FAILURE;
3881 goto done;
3882 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303883 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3884 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003885
3886
3887 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
3888 if(lenRes < 0 || lenRes >= lenBuf)
3889 {
3890 status = VOS_STATUS_E_FAILURE;
3891 goto done;
3892 }
3893
3894 buf += lenRes;
3895 lenBuf -= lenRes;
3896
3897 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003898 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 -07003899 if(lenRes < 0 || lenRes >= lenBuf)
3900 {
3901 status = VOS_STATUS_E_FAILURE;
3902 goto done;
3903 }
3904
3905 buf += lenRes;
3906 lenBuf -= lenRes;
3907
3908 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
3909 if(lenRes < 0 || lenRes >= lenBuf)
3910 {
3911 status = VOS_STATUS_E_FAILURE;
3912 goto done;
3913 }
3914
3915 buf += lenRes;
3916 lenBuf -= lenRes;
3917
Jeff Johnson295189b2012-06-20 16:38:30 -07003918
3919done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003920
3921 return status;
3922
3923}
3924
3925/**---------------------------------------------------------------------------
3926
3927 \brief wlan_ftm_priv_get_txrate() -
3928
3929 This function gets the TX rate from the halphy ptt module and
3930 returns the TX rate to the application.
3931
3932 \param - pAdapter - Pointer HDD Context.
3933 - pTxRate - Poniter to get the Tx rate.
3934
3935 \return - 0 for success, non zero for failure
3936
3937 --------------------------------------------------------------------------*/
3938
3939static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
3940{
Jeff Johnson295189b2012-06-20 16:38:30 -07003941 uPttMsgs *pMsgBody;
3942 VOS_STATUS status;
3943 v_U16_t rate_index,ii;
3944 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3945
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303946 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003947 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303948 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3949 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003950 return VOS_STATUS_E_FAILURE;
3951 }
3952
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303953 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003954 init_completion(&pHddCtx->ftm.ftm_comp_var);
3955 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
3956 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
3957
3958 pMsgBody = &pMsgBuf->msgBody;
3959
3960 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3961
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303962 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003963 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303964 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3965 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003966 status = VOS_STATUS_E_FAILURE;
3967 goto done;
3968 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303969 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3970 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07003971
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303972 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003973
3974 rate_index = pMsgBody->GetTxPowerReport.rate;
3975 }
3976 else {
3977 /*Return the default rate*/
3978 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3980 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003981 status = VOS_STATUS_E_FAILURE;
3982 goto done;
3983 }
3984
3985 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
3986 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
3987 break;
3988 }
3989 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3990 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003991 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 status = VOS_STATUS_E_FAILURE;
3993 goto done;
3994 }
3995 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
3996done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003997
3998 return status;
3999
4000}
4001
4002/**---------------------------------------------------------------------------
4003
4004 \brief wlan_ftm_priv_get_rx_pkt_count() -
4005
4006 This function gets the rx pkt count from the halphy ptt module and
4007 returns the rx pkt count to the application.
4008
4009 \param - pAdapter - Pointer HDD Context.
4010 - pRxPktCnt - Poniter to get the rx pkt count.
4011
4012 \return - 0 for success, non zero for failure
4013
4014 --------------------------------------------------------------------------*/
4015
4016static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4017{
Jeff Johnson295189b2012-06-20 16:38:30 -07004018 uPttMsgs *pMsgBody;
4019 VOS_STATUS status;
4020 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4021
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304022 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004023 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304024 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4025 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004026 return VOS_STATUS_E_FAILURE;
4027 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304028 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 init_completion(&pHddCtx->ftm.ftm_comp_var);
4030 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4031 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4032
4033 pMsgBody = &pMsgBuf->msgBody;
4034
4035 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4036
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304037 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004038 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304039 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4040 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 status = VOS_STATUS_E_FAILURE;
4042 goto done;
4043 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304044 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4045 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004046
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304047 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004048 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304049 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4050 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004051 status = VOS_STATUS_E_FAILURE;
4052 goto done;
4053 }
4054 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4055done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004056
4057 return status;
4058}
4059
4060/**---------------------------------------------------------------------------
4061
4062 \brief wlan_ftm_priv_get_rx_rssi() -
4063
4064 This function gets the rx rssi from the halphy ptt module and
4065 returns the rx rssi to the application.
4066
4067 \param - pAdapter - Pointer HDD Context.
4068 - buf - Poniter to get rssi of Rx chains
4069
4070 \return - 0 for success, non zero for failure
4071
4072 --------------------------------------------------------------------------*/
4073
4074static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4075{
Jeff Johnson295189b2012-06-20 16:38:30 -07004076 uPttMsgs *pMsgBody;
4077 VOS_STATUS status;
4078 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4079 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004080
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304081 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004082 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304083 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4084 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004085 return VOS_STATUS_E_FAILURE;
4086 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304087 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004088 init_completion(&pHddCtx->ftm.ftm_comp_var);
4089 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4090 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4091
4092 pMsgBody = &pMsgBuf->msgBody;
4093
4094 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4095
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304096 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004097 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304098 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4099 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004100 status = VOS_STATUS_E_FAILURE;
4101 goto done;
4102 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304103 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4104 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004105
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304106 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004107 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304108 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4109 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004110 status = VOS_STATUS_E_FAILURE;
4111 goto done;
4112 }
4113
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004114 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4115 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004116 pMsgBody->GetRxRssi.rssi.rx[1]);
4117
4118 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4119 {
4120 status = VOS_STATUS_E_FAILURE;
4121 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004122
Jeff Johnson295189b2012-06-20 16:38:30 -07004123done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004124
4125 return status;
4126}
4127
4128/**---------------------------------------------------------------------------
4129
4130 \brief wlan_ftm_priv_get_mac_address() -
4131
4132 This function gets the mac address from the halphy ptt module and
4133 returns the mac address to the application.
4134
4135 \param - pAdapter - Pointer HDD Context.
4136 - buf - Poniter to get the mac address.
4137
4138 \return - 0 for success, non zero for failure
4139
4140 --------------------------------------------------------------------------*/
4141
4142static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4143{
4144 v_BOOL_t itemIsValid = VOS_FALSE;
4145 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4146 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004147
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4149
4150 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4151 {
4152 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4153 return VOS_STATUS_E_FAILURE;
4154 }
4155 /*Check the NV FIELD is valid or not*/
4156 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4157 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004158 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004159 {
4160 vos_nv_readMacAddress(macAddr);
4161
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004162 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4163 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004164 MAC_ADDR_ARRAY(macAddr));
4165 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4166 {
4167 return VOS_STATUS_E_FAILURE;
4168 }
4169 }
4170 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004171 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004172 {
4173 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004174 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4175 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004176 MAC_ADDR_ARRAY(macAddr));
4177
4178 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4179 {
4180 return VOS_STATUS_E_FAILURE;
4181 }
4182 }
4183 return VOS_STATUS_SUCCESS;
4184}
4185
4186/**---------------------------------------------------------------------------
4187
4188 \brief wlan_ftm_priv_set_mac_address() -
4189
4190 This function sets the mac address to the halphy ptt module and
4191 sends the netlink message to the ptt socket application which writes
4192 the macaddress to the qcom_wlan_nv.bin file
4193
4194 \param - pAdapter - Pointer HDD Context.
4195 - buf - Poniter to the macaddress.
4196
4197 \return - 0 for success, non zero for failure
4198
4199 --------------------------------------------------------------------------*/
4200
4201static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4202{
Jeff Johnson295189b2012-06-20 16:38:30 -07004203 uPttMsgs *pMsgBody;
4204 VOS_STATUS status;
4205 int macAddr[VOS_MAC_ADDRESS_LEN];
4206 v_U8_t *pMacAddress;
4207 v_U8_t ii;
4208 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4209
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304210 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004211 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304212 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4213 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004214 return VOS_STATUS_E_FAILURE;
4215 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304216 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004217 init_completion(&pHddCtx->ftm.ftm_comp_var);
4218 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4219 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4220
4221 pMsgBody = &pMsgBuf->msgBody;
4222 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4223
4224 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004225 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]))
4226 {
4227 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4228 "Invalid MacAddress Input %s", buf);
4229 return VOS_STATUS_E_FAILURE;
4230 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004231
Arif Hussain24bafea2013-11-15 15:10:03 -08004232 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4233 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004234
4235
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004236 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004237
4238 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4239 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4240
4241
Arif Hussain24bafea2013-11-15 15:10:03 -08004242 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4243 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004244 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4245
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304246 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004247 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304248 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4249 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004250 status = VOS_STATUS_E_FAILURE;
4251 goto done;
4252 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304253 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4254 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004255
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304256 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004257 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304258 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4259 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004260 status = VOS_STATUS_E_FAILURE;
4261 goto done;
4262 }
4263
Arif Hussain6d2a3322013-11-17 19:50:10 -08004264 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004265
4266 init_completion(&pHddCtx->ftm.ftm_comp_var);
4267 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4268
4269 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4270 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4271
4272 pMsgBody = &pMsgBuf->msgBody;
4273
4274 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4275
4276 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4277
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304278 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004279 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304280 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4281 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004282 status = VOS_STATUS_E_FAILURE;
4283 goto done;
4284 }
4285
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304286 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
4287 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
Jeff Johnson295189b2012-06-20 16:38:30 -07004288done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004289
4290 return VOS_STATUS_SUCCESS;
4291}
4292
4293/* set param sub-ioctls */
4294static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4295 union iwreq_data *wrqu, char *extra)
4296{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004297 int ret,sub_cmd;
4298 unsigned int length;
Jeff Johnson295189b2012-06-20 16:38:30 -07004299 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004300 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004301
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004302 ret =0;
4303 length = wrqu->data.length;
4304 sub_cmd = wrqu->data.flags;
4305 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4306
4307 /*we can only accept input falling between 1 and length bytes,
4308 *and ensure extra is null delimited string
4309 */
4310 if (wrqu->data.length>=512)
4311 return -EINVAL;
4312 vos_mem_zero(extra + length,512 - length);
4313
4314 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4315 "%s: Received length %d", __func__, length);
4316
4317 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4318 "%s: Received data %s", __func__, extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07004319
4320 switch(sub_cmd)
4321 {
4322 case WE_SET_MAC_ADDRESS:
4323 {
4324
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004325 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004326 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004327
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004328 status = wlan_ftm_priv_set_mac_address(pAdapter,extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07004329
4330 if(status != VOS_STATUS_SUCCESS)
4331 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004332 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004333 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004334
Jeff Johnson295189b2012-06-20 16:38:30 -07004335 ret = -EINVAL;
4336 }
4337
4338 }
4339 break;
4340 case WE_SET_TX_RATE:
4341 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004342 status = wlan_ftm_priv_set_txrate(pAdapter,extra);
Jeff Johnson295189b2012-06-20 16:38:30 -07004343
4344 if(status != VOS_STATUS_SUCCESS)
4345 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004346 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004347 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004348
4349 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004350 }
4351
4352 break;
4353 }
4354 default:
4355 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004356 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004357 ret = -EINVAL;
4358 break;
4359 }
4360 }
4361 return ret;
4362}
4363
4364static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4365 union iwreq_data *wrqu, char *extra)
4366{
4367 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4368 int *value = (int *)extra;
4369 int sub_cmd = value[0];
4370 int set_value = value[1];
4371 int ret = 0; /* success */
4372 VOS_STATUS status;
4373
4374 switch(sub_cmd)
4375 {
4376 case WE_FTM_ON_OFF:
4377 {
4378 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4379
4380 if(status != VOS_STATUS_SUCCESS)
4381 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004382 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004383 ret = -EINVAL;
4384 }
4385
4386 break;
4387 }
4388
4389 case WE_TX_PKT_GEN:
4390 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4391
4392 if(status != VOS_STATUS_SUCCESS)
4393 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004394 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004395 ret = -EINVAL;
4396 }
4397 break;
4398
4399 case WE_SET_TX_IFS:
4400 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4401
4402 if(status != VOS_STATUS_SUCCESS)
4403 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004404 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004405 ret = -EINVAL;
4406 }
4407 break;
4408
4409 case WE_SET_TX_PKT_CNT:
4410 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4411
4412 if(status != VOS_STATUS_SUCCESS)
4413 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004414 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004415 ret = -EINVAL;
4416 }
4417 break;
4418
4419 case WE_SET_TX_PKT_LEN:
4420 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4421
4422 if(status != VOS_STATUS_SUCCESS)
4423 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004424 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004425 ret = -EINVAL;
4426 }
4427 break;
4428
4429 case WE_SET_CHANNEL:
4430 {
4431 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4432
4433 if(status != VOS_STATUS_SUCCESS)
4434 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004435 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004436 ret = -EINVAL;
4437 }
4438 break;
4439 }
4440 case WE_SET_TX_POWER:
4441 {
4442 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4443
4444 if(status != VOS_STATUS_SUCCESS)
4445 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004446 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004447 ret = -EINVAL;
4448 }
4449 break;
4450 }
4451 case WE_CLEAR_RX_PKT_CNT:
4452 {
4453 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4454
4455 if(status != VOS_STATUS_SUCCESS)
4456 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004457 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004458 ret = -EINVAL;
4459 }
4460 break;
4461 }
4462 case WE_RX:
4463 {
4464 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4465
4466 if(status != VOS_STATUS_SUCCESS)
4467 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004468 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004469 ret = -EINVAL;
4470 }
4471 break;
4472 }
4473 case WE_ENABLE_CHAIN:
4474 {
4475 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4476
4477 if(status != VOS_STATUS_SUCCESS)
4478 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004479 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004480 ret = -EINVAL;
4481 }
4482 break;
4483 }
4484
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304485 case WE_SET_PWR_CNTL_MODE:
4486 {
4487 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4488 if (status != VOS_STATUS_SUCCESS)
4489 {
4490 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4491 status);
4492 ret = -EINVAL;
4493 }
4494 break;
4495 }
4496
4497 case WE_ENABLE_DPD:
4498 {
4499 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4500 if (status != VOS_STATUS_SUCCESS)
4501 {
4502 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4503 ret = -EINVAL;
4504 }
4505 break;
4506 }
4507
4508 case WE_SET_CB:
4509 {
4510 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4511 if (status != VOS_STATUS_SUCCESS)
4512 {
4513 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4514 ret = -EINVAL;
4515 }
4516 break;
4517 }
4518
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 default:
4520 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004521 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004522 sub_cmd, set_value);
4523 break;
4524 }
4525 }
4526
4527 return ret;
4528}
4529
4530/* get param sub-ioctls */
4531static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4532 union iwreq_data *wrqu, char *extra)
4533{
4534 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4535 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004536 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004537 VOS_STATUS status;
4538
4539 switch (value[0])
4540 {
4541 case WE_GET_CHANNEL:
4542 {
4543 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4544
4545 if(status != VOS_STATUS_SUCCESS)
4546 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004547 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004548 ret = -EINVAL;
4549 }
4550 break;
4551 }
4552 case WE_GET_TX_POWER:
4553 {
4554 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4555
4556 if(status != VOS_STATUS_SUCCESS)
4557 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004558 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004559 ret = -EINVAL;
4560 }
4561 break;
4562 }
4563 case WE_GET_RX_PKT_CNT:
4564 {
4565 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4566
4567 if(status != VOS_STATUS_SUCCESS)
4568 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004569 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004570 ret = -EINVAL;
4571 }
4572 break;
4573 }
4574 default:
4575 {
4576 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
4577 break;
4578 }
4579 }
4580
4581 return ret;
4582}
4583
4584static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
4585 union iwreq_data *wrqu, char *extra)
4586{
4587 int sub_cmd = wrqu->data.flags;
4588 VOS_STATUS status;
4589 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4590
4591 switch(sub_cmd)
4592 {
4593 case WE_GET_MAC_ADDRESS:
4594 {
4595 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
4596
4597 if(status != VOS_STATUS_SUCCESS)
4598 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004599 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004600 return -EINVAL;
4601 }
4602 wrqu->data.length = strlen(extra)+1;
4603 break;
4604 }
4605 case WE_GET_TX_RATE:
4606 {
4607 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
4608
4609 if(status != VOS_STATUS_SUCCESS)
4610 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004611 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004612 return -EINVAL;
4613 }
4614
4615 wrqu->data.length = strlen(extra)+1;
4616 break;
4617 }
4618 case WE_GET_FTM_VERSION:
4619 {
4620 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
4621
4622 if(status != VOS_STATUS_SUCCESS)
4623 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004624 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004625 return -EINVAL;
4626 }
4627 wrqu->data.length = strlen(extra)+1;
4628 break;
4629 }
4630 case WE_GET_FTM_STATUS:
4631 {
4632 status = wlan_ftm_priv_get_status(pAdapter, extra);
4633
4634 if(status != VOS_STATUS_SUCCESS)
4635 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004636 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004637 return -EINVAL;
4638 }
4639
4640 wrqu->data.length = strlen(extra)+1;
4641 break;
4642 }
4643 case WE_GET_RX_RSSI:
4644 {
4645 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
4646
4647 if(status != VOS_STATUS_SUCCESS)
4648 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004649 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004650 return -EINVAL;
4651 }
4652
4653 wrqu->data.length = strlen(extra)+1;
4654 break;
4655 }
4656 default:
4657 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004658 hddLog(LOGE, "Invalid IOCTL command %d", sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07004659 break;
4660 }
4661 }
4662
4663 return 0;
4664}
Jeff Johnson295189b2012-06-20 16:38:30 -07004665
4666VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
4667{
Jeff Johnson88ba7742013-02-27 14:36:02 -08004668#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07004669 tAniHdr *wmsg = NULL;
4670 v_U8_t *pBuf;
4671 hdd_context_t *pHddCtx = NULL;
4672 v_CONTEXT_t pVosContext= NULL;
4673
4674 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
4675 if(pBuf == NULL)
4676 {
4677 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
4678 return VOS_STATUS_E_NOMEM;
4679 }
4680 wmsg = (tAniHdr*)pBuf;
4681 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
4682 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
4683 wmsg->length = FTM_SWAP16(wmsg->length);
4684 pBuf += sizeof(tAniHdr);
4685
4686 /*Get the global context */
4687 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4688
4689 /*Get the Hdd Context */
4690 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
4691 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
4692
4693 /* EfS command Code */
4694 *(v_U32_t*)pBuf = 0x000000EF;
4695
4696 pBuf += sizeof(v_U32_t);
4697
4698 memcpy(pBuf, pData,data_len);
4699
4700 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
4701 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
4702
Arif Hussain6d2a3322013-11-17 19:50:10 -08004703 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004704 vos_mem_free((v_VOID_t*)wmsg);
4705 return VOS_STATUS_E_FAILURE;
4706 }
4707 }
4708 else {
4709 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
4710
Arif Hussain6d2a3322013-11-17 19:50:10 -08004711 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004712 vos_mem_free((v_VOID_t*)wmsg);
4713 return VOS_STATUS_E_FAILURE;
4714 }
4715 }
4716
4717 vos_mem_free((v_VOID_t*)wmsg);
4718#endif //FTM and ANDROID
4719
4720 return VOS_STATUS_SUCCESS;
4721}
4722
Jeff Johnson295189b2012-06-20 16:38:30 -07004723/* action sub-ioctls */
4724static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
4725 union iwreq_data *wrqu, char *extra)
4726{
4727 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004728 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004729
4730 switch (sub_cmd)
4731 {
4732 case WE_SET_NV_DEFAULTS:
4733 {
4734 v_U8_t *pu8buf,*pTempBuf;
4735 v_U16_t size;
4736 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08004737 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07004738 pu8buf = vos_mem_malloc(size);
4739 if(pu8buf == NULL)
4740 {
4741 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
4742 return VOS_STATUS_E_NOMEM;
4743 }
4744 memset(pu8buf,0,size);
4745 pTempBuf = pu8buf;
4746 pTempBuf += sizeof(v_U32_t);
4747 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
4748
4749 wlan_write_to_efs(pu8buf,size);
4750 vos_mem_free(pu8buf);
4751 }
4752
4753 default:
4754 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004755 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004756 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
4757 break;
4758 }
4759 }
4760
4761 return ret;
4762}
4763
Jeff Johnson295189b2012-06-20 16:38:30 -07004764static const iw_handler we_ftm_private[] = {
4765
4766 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
4767 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
4768 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
4769 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
4770 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07004771};
4772
4773/*Maximum command length can be only 15 */
4774static const struct iw_priv_args we_ftm_private_args[] = {
4775
4776 /* handlers for main ioctl */
4777 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
4778 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4779 0,
4780 "" },
4781
4782 { WE_FTM_ON_OFF,
4783 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4784 0,
4785 "ftm" },
4786
4787 { WE_TX_PKT_GEN,
4788 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4789 0,
4790 "tx" },
4791
4792 { WE_SET_TX_IFS,
4793 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4794 0,
4795 "set_txifs" },
4796
4797 { WE_SET_TX_PKT_CNT,
4798 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4799 0,
4800 "set_txpktcnt" },
4801
4802 { WE_SET_TX_PKT_LEN,
4803 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4804 0,
4805 "set_txpktlen" },
4806
4807 { WE_SET_CHANNEL,
4808 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4809 0,
4810 "set_channel" },
4811
4812 { WE_SET_TX_POWER,
4813 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4814 0,
4815 "set_txpower" },
4816
4817 { WE_CLEAR_RX_PKT_CNT,
4818 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4819 0,
4820 "clr_rxpktcnt" },
4821
4822 { WE_RX,
4823 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4824 0,
4825 "rx" },
4826
4827 { WE_ENABLE_CHAIN,
4828 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4829 0,
4830 "ena_chain" },
4831
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304832 { WE_SET_PWR_CNTL_MODE,
4833 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4834 0,
4835 "pwr_cntl_mode" },
4836
4837 { WE_ENABLE_DPD,
4838 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4839 0,
4840 "ena_dpd" },
4841
4842 { WE_SET_CB,
4843 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4844 0,
4845 "set_cb" },
4846
Jeff Johnson295189b2012-06-20 16:38:30 -07004847 /* handlers for main ioctl */
4848 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
4849 0,
4850 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4851 "" },
4852
4853 { WE_GET_CHANNEL,
4854 0,
4855 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4856 "get_channel" },
4857
4858 { WE_GET_TX_POWER,
4859 0,
4860 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4861 "get_txpower" },
4862
4863 { WE_GET_RX_PKT_CNT,
4864 0,
4865 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
4866 "get_rxpktcnt" },
4867
4868 /* handlers for main ioctl */
4869 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
4870 IW_PRIV_TYPE_CHAR| 512,
4871 0,
4872 "" },
4873
4874 { WE_SET_MAC_ADDRESS,
4875 IW_PRIV_TYPE_CHAR| 512,
4876 0,
4877 "set_mac_address" },
4878
4879 { WE_SET_TX_RATE,
4880 IW_PRIV_TYPE_CHAR | 512,
4881 0,
4882 "set_txrate" },
4883
4884 /* handlers for main ioctl */
4885 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
4886 0,
4887 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4888 "" },
4889
4890 { WE_GET_MAC_ADDRESS,
4891 0,
4892 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4893 "get_mac_address" },
4894
4895 { WE_GET_FTM_VERSION,
4896 0,
4897 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4898 "ftm_version" },
4899
4900 { WE_GET_TX_RATE,
4901 0,
4902 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4903 "get_txrate" },
4904
4905 { WE_GET_FTM_STATUS,
4906 0,
4907 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4908 "get_status" },
4909
4910 { WE_GET_RX_RSSI,
4911 0,
4912 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
4913 "get_rx_rssi" },
4914
Jeff Johnson295189b2012-06-20 16:38:30 -07004915 /* handlers for main ioctl */
4916 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
4917 0,
4918 0,
4919 "" },
4920
4921 /* handlers for sub-ioctl */
4922 { WE_SET_NV_DEFAULTS,
4923 0,
4924 0,
4925 "set_nv_defaults" },
4926
4927};
4928
4929const struct iw_handler_def we_ftm_handler_def = {
4930 .num_standard = 0,
4931 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
4932 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
4933
4934 .standard = (iw_handler *)NULL,
4935 .private = (iw_handler *)we_ftm_private,
4936 .private_args = we_ftm_private_args,
4937 .get_wireless_stats = NULL,
4938};
4939
4940static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
4941{
4942
4943 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4944
4945 // Zero the memory. This zeros the profile structure.
4946 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004947
Jeff Johnson295189b2012-06-20 16:38:30 -07004948 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
4949
4950 return 0;
4951}
4952
Jeff Johnson295189b2012-06-20 16:38:30 -07004953
4954VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
4955{
Jeff Johnson295189b2012-06-20 16:38:30 -07004956 ftm_rsp_msg_t *pFtmMsgRsp;
4957
4958 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
4959 hdd_context_t *pHddCtx;
4960 v_CONTEXT_t pVosContext= NULL;
4961
4962 ENTER();
4963
4964 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
4965
4966 if (!message )
4967 {
4968 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
4969 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
4970 return VOS_STATUS_E_INVAL;
4971 }
4972 /*Get the global context */
4973 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
4974
4975 /*Get the Hdd Context */
4976 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
4977
4978 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
4979
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304980 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07004981 complete(&pHddCtx->ftm.ftm_comp_var);
4982 }
4983 else {
4984 /*Response length to Ptt App*/
4985 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
4986
4987 /*Ptt App expects the response length in LE */
4988 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
4989
4990 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004991 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07004992 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
4993
4994 /*Copy the message*/
4995 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
4996
4997 /*Update the error code*/
4998 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
4999
5000 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5001
5002 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5003 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005004 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005005 return VOS_STATUS_E_FAILURE;
5006 }
5007 }
5008 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005009 return VOS_STATUS_SUCCESS;
5010
5011}