blob: ad2acc6cd01bb8e7a203ae8f16b17de86e9d8f4e [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam842dad02014-02-18 18:44:02 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**========================================================================
29
30 \file wlan_hdd_ftm.c
31
32 \brief This file contains the WLAN factory test mode implementation
33
34 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
35
36 Qualcomm Confidential and Proprietary.
37
38 ========================================================================*/
39
40/**=========================================================================
41
42 EDIT HISTORY FOR FILE
43
44
45 This section contains comments describing changes made to the module.
46 Notice that changes are listed in reverse chronological order.
47
48
49 $Header:$ $DateTime: $ $Author: $
50
51
52 when who what, where, why
53 -------- --- --------------------------------------------------------
54 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
55 for FTM and mission mode
56 04/5/09 Shailender Created module.
57
58 ==========================================================================*/
59#include <vos_mq.h>
60#include "vos_sched.h"
61#include <vos_api.h>
62#include "sirTypes.h"
63#include "halTypes.h"
64#include "sirApi.h"
65#include "sirMacProtDef.h"
66#include "sme_Api.h"
67#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070068#include "wlan_qct_sys.h"
69#include "wlan_qct_tl.h"
70#include "wlan_hdd_misc.h"
71#include "i_vos_packet.h"
72#include "vos_nvitem.h"
73#include "wlan_hdd_main.h"
74#include "vos_power.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070075#include "qwlan_version.h"
76
Jeff Johnson295189b2012-06-20 16:38:30 -070077#include "wlan_nv.h"
78#include "wlan_qct_wda.h"
79#include "cfgApi.h"
80#include "pttMsgApi.h"
81#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070082
Jeff Johnson295189b2012-06-20 16:38:30 -070083#define RXMODE_DISABLE_ALL 0
84#define RXMODE_ENABLE_ALL 1
85#define RXMODE_ENABLE_11GN 2
86#define RXMODE_ENABLE_11B 3
87
88#define FTM_CHAIN_SEL_NO_RX_TX 0
89#define FTM_CHAIN_SEL_R0_ON 1
90#define FTM_CHAIN_SEL_T0_ON 2
91#define FTM_CHAIN_SEL_R0_T0_ON 3
92#define FTM_CHAIN_SEL_MAX 3
93
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053094#define WCNSS_TXFIR_OFFSET 0x00018000
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096#ifndef QWLAN_PHYDBG_BASE
97#define QWLAN_PHYDBG_BASE 0x03004000
98#endif /* QWLAN_PHYDBG_BASE */
99
100#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800101#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
103#endif
104
105#ifndef QWLAN_AGC_BASE
106#define QWLAN_AGC_BASE 0x03013C00
107#endif /* QWLAN_AGC_BASE */
108
109#ifndef QWLAN_AGC_CHANNEL_FREQ_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800110#define QWLAN_AGC_CHANNEL_FREQ_REG (QWLAN_AGC_BASE + 0x34)
Jeff Johnson295189b2012-06-20 16:38:30 -0700111#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
112#endif /* QWLAN_AGC_CHANNEL_FREQ_REG */
113
114#ifndef QWLAN_AGC_SUBBAND_CONFIG_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800115#define QWLAN_AGC_SUBBAND_CONFIG_REG (QWLAN_AGC_BASE + 0x30)
Jeff Johnson295189b2012-06-20 16:38:30 -0700116#define QWLAN_AGC_SUBBAND_CONFIG_STG2_SUBBAND_MASK 0x03
117#endif /* QWLAN_AGC_SUBBAND_CONFIG_REG */
118
119#ifndef QWLAN_RFAPB_BASE
120#define QWLAN_RFAPB_BASE 0x0E02F800
121#endif /* QWLAN_RFAPB_BASE */
122
123#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800124#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700125#endif /* QWLAN_RFAPB_REV_ID_REG */
126
127#ifndef QWLAN_TXCTL_BASE
128#define QWLAN_TXCTL_BASE 0x03012000
129#endif /* QWLAN_TXCTL_BASE */
130
131#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800132#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700133#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
134#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
135#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
136#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
137#endif /* QWLAN_TXCTL_FSHIFT_REG */
138
139/* To set 4MAC addresses from given first MAC address,
140 * Last byte value within given MAC address must less than 0xFF - 3 */
141#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700142#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700143
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530144#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
145
Jeff Johnson295189b2012-06-20 16:38:30 -0700146typedef struct {
147 tANI_U32 tableSize; /* Whole NV Table Size */
148 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
149 eNvTable nvTable;
150 tANI_U8 tableData; /* Filled by host driver */
151} pttGetNvTable;
152
153typedef struct {
154 tANI_U32 tableSize; /* Whole NV Table Size */
155 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
156 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700157 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700158} pttSetNvTable;
159
Jeff Johnson295189b2012-06-20 16:38:30 -0700160
161extern const sHalNv nvDefaults;
162static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700163static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700164VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700165
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700166/* 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 -0700167 Since it is associated to agc.channel_freq register for mapping.
168 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
169*/
170static const freq_chan_t freq_chan_tbl[] = {
171 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
172 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
173};
174
175static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
176{
177 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
178 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
179 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
180 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
181 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
182 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
183 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
184 //Spica_Virgo 11A 20MHz Rates
185 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
186 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
187 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
188 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
189 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
190 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
191 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
192 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
193
194//MCS Index #0-15 (20MHz)
195 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
196 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
197 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
198 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
199 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
200 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
201 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
202 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530203 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_72_2_MBPS"},
204
205//MCS Index #8-15 (40MHz)
206
207 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_B_MBPS" },
208 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
209 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
210 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
211 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
212 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
213 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
214 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
215 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
216 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
217 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
218 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
219 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
220 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
221 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800222 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530223
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800224#ifdef WLAN_FEATURE_11AC
225 /*11AC rate 20MHZ Normal GI*/
226 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
227 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
228 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
229 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
230 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
231 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
232 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
233 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
234 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530235#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800236 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530237#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800238
239 /*11AC rate 20MHZ Short GI*/
240 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
241 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
242 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
243 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
244 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
245 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
246 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
247 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
248 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530249#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800250 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530251#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800252
253 /*11AC rates 40MHZ normal GI*/
254 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
255 "MCS_VHT40_NGI_CB_13_5_MBPS"},
256 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
257 "MCS_VHT40_NGI_CB_27_MBPS"},
258 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
259 "MCS_VHT40_NGI_CB_40_5_MBPS"},
260 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
261 "MCS_VHT40_NGI_CB_54_MBPS"},
262 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
263 "MCS_VHT40_NGI_CB_81_MBPS"},
264 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
265 "MCS_VHT40_NGI_CB_108_MBPS"},
266 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
267 "MCS_VHT40_NGI_CB_121_5_MBPS"},
268 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
269 "MCS_VHT40_NGI_CB_135_MBPS"},
270 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
271 "MCS_VHT40_NGI_CB_162_MBPS"},
272 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
273 "MCS_VHT40_NGI_CB_180_MBPS"},
274
275 /*11AC rates 40MHZ short GI*/
276 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
277 "MCS_VHT40_SGI_CB_15_MBPS"},
278 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
279 "MCS_VHT40_SGI_CB_30_MBPS"},
280 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
281 "MCS_VHT40_SGI_CB_45_MBPS"},
282 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
283 "MCS_VHT40_SGI_CB_60_MBPS"},
284 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
285 "MCS_VHT40_SGI_CB_90_MBPS"},
286 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
287 "MCS_VHT40_SGI_CB_120_MBPS"},
288 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
289 "MCS_VHT40_SGI_CB_135_MBPS"},
290 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
291 "MCS_VHT40_SGI_CB_150_MBPS"},
292 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
293 "MCS_VHT40_SGI_CB_180_MBPS"},
294 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
295 "MCS_VHT40_SGI_CB_200_MBPS"},
296
297 /*11AC rates 80 MHZ normal GI*/
298 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
299 "MCS_VHT80_NGI_CB_29_3_MBPS"},
300 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
301 "MCS_VHT80_NGI_CB_58_5_MBPS"},
302 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
303 "MCS_VHT80_NGI_CB_87_8_MBPS"},
304 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
305 "MCS_VHT80_NGI_CB_117_MBPS"},
306 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
307 "MCS_VHT80_NGI_CB_175_5_MBPS"},
308 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
309 "MCS_VHT80_NGI_CB_234_MBPS"},
310 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
311 "MCS_VHT80_NGI_CB_263_3_MBPS"},
312 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
313 "MCS_VHT80_NGI_CB_292_5_MBPS"},
314 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
315 "MCS_VHT80_NGI_CB_351_MBPS"},
316 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
317 "MCS_VHT80_NGI_CB_390_MBPS"},
318
319 /*11AC rates 80 MHZ short GI*/
320 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
321 "MCS_VHT80_SGI_CB_32_5_MBPS"},
322 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
323 "MCS_VHT80_SGI_CB_65_MBPS"},
324 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
325 "MCS_VHT80_SGI_CB_97_5_MBPS"},
326 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
327 "MCS_VHT80_SGI_CB_130_MBPS"},
328 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
329 "MCS_VHT80_SGI_CB_195_MBPS"},
330 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
331 "MCS_VHT80_SGI_CB_260_MBPS"},
332 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
333 "MCS_VHT80_SGI_CB_292_5_MBPS"},
334 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
335 "MCS_VHT80_SGI_CB_325_MBPS"},
336 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
337 "MCS_VHT80_SGI_CB_390_MBPS"},
338 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
339 "MCS_VHT80_SGI_CB_433_3_MBPS"},
340#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700341};
342
343static rateIndex2Preamble_t rate_index_2_preamble_table[] =
344{
345
346 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
347 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
348 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
349 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
350 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
351 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
352 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
353
Jeff Johnson295189b2012-06-20 16:38:30 -0700354
355 //Spica_Virgo 11A 20MHz Rates
356 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
357 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
358 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
359 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
360 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
361 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
362 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
363 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
364
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530365 // 11A 20MHz Rates
366 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
367 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
368 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
369 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
370 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
371 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
372 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
373 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
374
Jeff Johnson295189b2012-06-20 16:38:30 -0700375 //MCS Index #0-15 (20MHz)
376 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
377 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
378 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
379 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
380 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
381 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
382 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
383 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
385 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
386 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
387 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
388 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
389 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
390 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
391 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530392
393 //MCS index (40MHz)
394 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
395 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
396 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
397 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
398 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
399 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
400 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
401 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800409 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530410
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800411#ifdef WLAN_FEATURE_11AC
412 /*11AC rate 20MHZ Normal GI*/
413 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
419 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
420 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530422#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800423 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530424#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800425 /*11AC rate 20MHZ Short GI*/
426 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
431 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
432 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
433 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530435#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800436 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530437#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800438
439 /*11AC rates 40MHZ normal GI*/
440 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
443 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
444 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
445 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
450
451 /*11AC rates 40MHZ short GI*/
452 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
457 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
458 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
459 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
462
463 /*11AC rates 80 MHZ normal GI*/
464 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
465 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
466 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
467 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
468 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
469 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
470 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
471 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
472 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
473 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
474
475 /*11AC rates 80 MHZ short GI*/
476 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
477 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
478 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
479 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
480 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
481 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
482 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
483 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
484 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
485 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
486#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700487};
488
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530489static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
490 11, 12, 13, 14, 36, 40, 44, 48,
491 52, 56, 60, 64, 100, 104, 108,
492 112, 116, 120, 124, 128, 132,
493 136, 140, 149, 153, 157, 161,
494 165, 208, 212, 216, 240, 244,
495 248, 252, 0 };
496static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
497 42, 46, 50, 54, 58, 62, 102, 106,
498 110, 114, 118, 122, 126, 130, 134,
499 138, 151, 155, 159, 163, 210, 214,
500 242, 246, 250, 0 };
501static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
502 114, 118, 122, 126, 130, 134, 155,
503 159, 246, 0 };
504
Jeff Johnson295189b2012-06-20 16:38:30 -0700505typedef struct
506{
507 tANI_BOOLEAN frameGenEnabled;
508 tANI_BOOLEAN wfmEnabled;
509 sPttFrameGenParams frameParams;
510 v_U16_t txpower;
511 v_U16_t rxmode;
512 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530513 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700514
515} FTM_STATUS ;
516static FTM_STATUS ftm_status;
517
518//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530519static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700520
521static void _ftm_status_init(void)
522{
523 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
524 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
525 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
526
527 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
528 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
529 ftm_status.frameParams.numTestPackets = 0; //Continuous
530 ftm_status.frameParams.interFrameSpace = 10;
531 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
532 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
533 ftm_status.frameParams.payloadLength = 2000;
534 ftm_status.frameParams.payloadFillByte = 0xA5;
535 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
536 ftm_status.frameParams.tx_mode = 0;
537 ftm_status.frameParams.crc = 0;
538 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
539 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
540 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
541 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
542 ftm_status.txpower = 2 ;
543 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
544 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530545 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700546
547 return;
548}
549
550/**---------------------------------------------------------------------------
551
552 \brief wlan_ftm_postmsg() -
553
554 The function used for sending the command to the halphy.
555
556 \param - cmd_ptr - Pointer command buffer.
557
558 \param - cmd_len - Command length.
559
560 \return - 0 for success, non zero for failure
561
562 --------------------------------------------------------------------------*/
563
564static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
565{
566 vos_msg_t *ftmReqMsg;
567 vos_msg_t ftmMsg;
568 ENTER();
569
570 ftmReqMsg = (vos_msg_t *) cmd_ptr;
571
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700573 ftmMsg.reserved = 0;
574 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
575 ftmMsg.bodyval = 0;
576
577 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700578 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700579 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700580 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800581 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700582
583 return VOS_STATUS_E_FAILURE;
584 }
585
586 EXIT();
587 return VOS_STATUS_SUCCESS;
588}
589
590/*---------------------------------------------------------------------------
591
592 \brief wlan_ftm_vos_open() - Open the vOSS Module
593
594 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
595 Upon successful initialization:
596
597 - All VOS submodules should have been initialized
598
599 - The VOS scheduler should have opened
600
601 - All the WLAN SW components should have been opened. This include
602 MAC.
603
604
605 \param hddContextSize: Size of the HDD context to allocate.
606
607
608 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
609 is ready to be used.
610
611 VOS_STATUS_E_RESOURCES - System resources (other than memory)
612 are unavailable to initialize the scheduler
613
614
615 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
616
617 \sa wlan_ftm_vos_open()
618
619---------------------------------------------------------------------------*/
620static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_SIZE_t hddContextSize )
621{
622 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
623 int iter = 0;
624 tSirRetStatus sirStatus = eSIR_SUCCESS;
625 tMacOpenParameters macOpenParms;
626 pVosContextType gpVosContext = (pVosContextType)pVosContext;
627
628 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
629 "%s: Opening VOSS", __func__);
630
631 if (NULL == gpVosContext)
632 {
633 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
634 "%s: Trying to open VOSS without a PreOpen",__func__);
635 VOS_ASSERT(0);
636 return VOS_STATUS_E_FAILURE;
637 }
638
639 /* Initialize the probe event */
640 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
641 {
642 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
643 "%s: Unable to init probeEvent",__func__);
644 VOS_ASSERT(0);
645 return VOS_STATUS_E_FAILURE;
646 }
647
Jeff Johnson295189b2012-06-20 16:38:30 -0700648 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
649 {
650 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
651 "%s: Unable to init wdaCompleteEvent",__func__);
652 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700653
Jeff Johnson295189b2012-06-20 16:38:30 -0700654 goto err_probe_event;
655 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700656
657 /* Initialize the free message queue */
658 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
659 if (! VOS_IS_STATUS_SUCCESS(vStatus))
660 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700661 /* Critical Error ... Cannot proceed further */
662 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530663 "%s: Failed to initialize VOS free message queue %d",
664 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700665 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700666 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700667 }
668
669 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
670 {
671 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
672 &(gpVosContext->aMsgBuffers[iter]);
673 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
674 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
675 }
676
677 /* Now Open the VOS Scheduler */
678 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
679 sizeof(VosSchedContext));
680
681 if (!VOS_IS_STATUS_SUCCESS(vStatus))
682 {
683 /* Critical Error ... Cannot proceed further */
684 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530685 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700686 VOS_ASSERT(0);
687 goto err_msg_queue;
688 }
689
690 /* Open the SYS module */
691 vStatus = sysOpen(gpVosContext);
692
693 if (!VOS_IS_STATUS_SUCCESS(vStatus))
694 {
695 /* Critical Error ... Cannot proceed further */
696 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530697 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700698 VOS_ASSERT(0);
699 goto err_sched_close;
700 }
701
Jeff Johnson295189b2012-06-20 16:38:30 -0700702 /*Open the WDA module */
703 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
704 macOpenParms.driverType = eDRIVER_TYPE_MFG;
705 vStatus = WDA_open(gpVosContext, gpVosContext->pHDDContext, &macOpenParms);
706 if (!VOS_IS_STATUS_SUCCESS(vStatus))
707 {
708 /* Critical Error ... Cannot proceed further */
709 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530710 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700711 VOS_ASSERT(0);
712 goto err_sys_close;
713 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700714
715 /* initialize the NV module */
716 vStatus = vos_nv_open();
717 if (!VOS_IS_STATUS_SUCCESS(vStatus))
718 {
719 // NV module cannot be initialized, however the driver is allowed
720 // to proceed
721 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530722 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700723 goto err_wda_close;
724 }
725
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700726 vStatus = vos_nv_get_dictionary_data();
727
728 if (!VOS_IS_STATUS_SUCCESS(vStatus))
729 {
730 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530731 "%s : failed to get dictionary data for NV %d",
732 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700733 goto err_wda_close;
734 }
735
Jeff Johnson295189b2012-06-20 16:38:30 -0700736 /* If we arrive here, both threads dispacthing messages correctly */
737
738 /* Now proceed to open the MAC */
739
740 /* UMA is supported in hardware for performing the
741 frame translation 802.11 <-> 802.3 */
742 macOpenParms.frameTransRequired = 1;
743 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
744 &macOpenParms);
745
746 if (eSIR_SUCCESS != sirStatus)
747 {
748 /* Critical Error ... Cannot proceed further */
749 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530750 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700751 VOS_ASSERT(0);
752 goto err_nv_close;
753 }
754
Jeff Johnson295189b2012-06-20 16:38:30 -0700755 /* Now proceed to open the SME */
756 vStatus = sme_Open(gpVosContext->pMACContext);
757 if (!VOS_IS_STATUS_SUCCESS(vStatus))
758 {
759 /* Critical Error ... Cannot proceed further */
760 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530761 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700762 goto err_mac_close;
763 }
764 return VOS_STATUS_SUCCESS;
765
Jeff Johnson295189b2012-06-20 16:38:30 -0700766
767 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
768 "%s: VOSS successfully Opened",__func__);
769
770 return VOS_STATUS_SUCCESS;
771err_mac_close:
772 macClose(gpVosContext->pMACContext);
773
774err_nv_close:
775 vos_nv_close();
776
777err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700778 WDA_close(gpVosContext);
779
780err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700781 sysClose(gpVosContext);
782
783err_sched_close:
784 vos_sched_close(gpVosContext);
785err_msg_queue:
786 vos_mq_deinit(&gpVosContext->freeVosMq);
787
Jeff Johnson295189b2012-06-20 16:38:30 -0700788err_wda_complete_event:
789 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700790
791err_probe_event:
792 vos_event_destroy(&gpVosContext->ProbeEvent);
793
794 return VOS_STATUS_E_FAILURE;
795
796} /* wlan_ftm_vos_open() */
797
798/*---------------------------------------------------------------------------
799
800 \brief wlan_ftm_vos_close() - Close the vOSS Module
801
802 The \a wlan_ftm_vos_close() function closes the vOSS Module
803
804 \param vosContext context of vos
805
806 \return VOS_STATUS_SUCCESS - successfully closed
807
808 \sa wlan_ftm_vos_close()
809
810---------------------------------------------------------------------------*/
811
812static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
813{
814 VOS_STATUS vosStatus;
815 pVosContextType gpVosContext = (pVosContextType)vosContext;
816
Jeff Johnson295189b2012-06-20 16:38:30 -0700817 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
818 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
819 {
820 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530821 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700822 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
823 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700824
825 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
826 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
827 {
828 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530829 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700830 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
831 }
832
833 ((pVosContextType)vosContext)->pMACContext = NULL;
834
835 vosStatus = vos_nv_close();
836 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
837 {
838 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530839 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700840 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
841 }
842
843
844 vosStatus = sysClose( vosContext );
845 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
846 {
847 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530848 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
850 }
851
Jeff Johnson295189b2012-06-20 16:38:30 -0700852 vosStatus = WDA_close( vosContext );
853 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
854 {
855 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530856 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700857 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
858 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700859
860 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
861
862 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
863 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
864 {
865 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530866 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700867 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
868 }
869
Jeff Johnson295189b2012-06-20 16:38:30 -0700870 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
871 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
872 {
873 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530874 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700875 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
876 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700877
878 return VOS_STATUS_SUCCESS;
879}
880
881/**---------------------------------------------------------------------------
882
883 \brief wlan_ftm_priv_set_txifs() -
884
885 This function is used for
886
887 \param - pAdapter - Pointer HDD Context.
888 - ifs
889
890 \return - 0 for success, non zero for failure
891
892 --------------------------------------------------------------------------*/
893
894
895
896static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
897{
898 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
899 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
900 {
901 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
902 return VOS_STATUS_E_FAILURE;
903 }
904
905 /* do not allow to change setting when tx pktgen is enabled */
906 if (ftm_status.frameGenEnabled)
907 {
908 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
909 return VOS_STATUS_E_FAILURE;
910 }
911
912 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
913 {
c_hpothuffdb5272013-10-02 16:42:35 +0530914 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
915 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700916 return VOS_STATUS_E_FAILURE;
917 }
918
919 ftm_status.frameParams.interFrameSpace = ifs;
920
921 return VOS_STATUS_SUCCESS;
922}
923
924/**---------------------------------------------------------------------------
925
926 \brief wlan_ftm_priv_set_txpktcnt() -
927
928 This function is used for
929
930 \param - pAdapter - Pointer HDD Context.
931 - ifs
932
933 \return - 0 for success, non zero for failure
934
935 --------------------------------------------------------------------------*/
936
937static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
938{
939 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
940 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
941 {
942 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
943 return VOS_STATUS_E_FAILURE;
944 }
945
946 /* do not allow to change setting when tx pktgen is enabled */
947 if (ftm_status.frameGenEnabled)
948 {
949 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
950 return VOS_STATUS_E_FAILURE;
951 }
952
953 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
954 {
c_hpothuffdb5272013-10-02 16:42:35 +0530955 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
956 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700957 return VOS_STATUS_E_FAILURE;
958 }
959
960 ftm_status.frameParams.numTestPackets = cnt;
961
962 return VOS_STATUS_SUCCESS;
963}
964
965static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
966{
967 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
968 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
969 {
970 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
971 return VOS_STATUS_E_FAILURE;
972 }
973
974 /* do not allow to change setting when tx pktgen is enabled */
975 if (ftm_status.frameGenEnabled)
976 {
977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
978 return VOS_STATUS_E_FAILURE;
979 }
980
981 if (len > 4095) //4096
982 {
c_hpothuffdb5272013-10-02 16:42:35 +0530983 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
984 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700985 return VOS_STATUS_E_FAILURE;
986 }
987
988 ftm_status.frameParams.payloadLength = (tANI_U16)len;
989
990 return VOS_STATUS_SUCCESS;
991}
992
Jeff Johnson295189b2012-06-20 16:38:30 -0700993
994static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
995{
Jeff Johnson295189b2012-06-20 16:38:30 -0700996 uPttMsgs *pMsgBody;
997 VOS_STATUS status;
998 v_U16_t chainSelect_save = chainSelect;
999 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301000 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001001
1002 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1003 {
1004 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1005 return VOS_STATUS_E_FAILURE;
1006 }
1007
1008 if (chainSelect > FTM_CHAIN_SEL_MAX)
1009 {
c_hpothuffdb5272013-10-02 16:42:35 +05301010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1011 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001012 return VOS_STATUS_E_FAILURE;
1013 }
1014
1015 /* do not allow to change setting when tx pktgen is enabled */
1016 if (ftm_status.frameGenEnabled)
1017 {
1018 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1019 return VOS_STATUS_E_FAILURE;
1020 }
1021
1022 switch (chainSelect)
1023 {
1024 case FTM_CHAIN_SEL_NO_RX_TX:
1025 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1026 break;
1027
1028 case FTM_CHAIN_SEL_R0_ON:
1029 chainSelect = PHY_CHAIN_SEL_R0_ON;
1030 break;
1031
1032 case FTM_CHAIN_SEL_T0_ON:
1033 chainSelect = PHY_CHAIN_SEL_T0_ON;
1034 break;
1035 }
1036
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301037 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001038 init_completion(&pHddCtx->ftm.ftm_comp_var);
1039 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1040 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1041
1042 pMsgBody = &pMsgBuf->msgBody;
1043 pMsgBody->EnableChains.chainSelect = chainSelect;
1044
1045 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1046
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301047 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001048 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301049 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1050 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001051 status = VOS_STATUS_E_FAILURE;
1052 goto done;
1053 }
c_hpothuffdb5272013-10-02 16:42:35 +05301054 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301055 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301056 if (0 >= ret)
1057 {
1058 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1059 FL("wait on ftm_comp_var failed %ld"), ret);
1060 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001061
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301062 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001063 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301064 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1065 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001066 status = VOS_STATUS_E_FAILURE;
1067 goto done;
1068 }
1069 ftm_status.chainSelect = chainSelect_save;
1070done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001071
1072 return status;
1073}
1074
1075/**---------------------------------------------------------------------------
1076 --------------------------------------------------------------------------*/
1077static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1078{
1079 int ii;
1080 int lenBuf = WE_FTM_MAX_STR_LEN;
1081 int lenRes = 0;
1082 char *chain[] = {
1083 "None",
1084 "R0,R1",
1085 "R0",
1086 "R1",
1087 "T0",
1088 "R0,R1,T0"
1089 };
1090 char *rx[] = {
1091 "disable",
1092 "11b/g/n",
1093 "11g/n",
1094 "11b"
1095 };
1096 char *tx[] = {
1097 "stopped",
1098 "started",
1099 };
1100 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1101
1102 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1103 {
1104 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1105 return VOS_STATUS_E_FAILURE;
1106 }
1107
1108 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001109 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001110 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1111 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001112 ftm_status.frameParams.interFrameSpace);
1113 if ((lenRes < 0) || (lenRes >= lenBuf))
1114 {
c_hpothuffdb5272013-10-02 16:42:35 +05301115 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1116 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001117 return VOS_STATUS_E_FAILURE;
1118 }
1119
1120 buf += lenRes;
1121 lenBuf -= lenRes;
1122
1123 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1124 {
1125 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1126 break;
1127 }
1128
1129 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1130 {
1131 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1132 }
1133 else
1134 {
1135 lenRes = strlcpy(buf, "invalid", lenBuf);
1136 }
1137 if ((lenRes < 0) || (lenRes >= lenBuf))
1138 {
c_hpothuffdb5272013-10-02 16:42:35 +05301139 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1140 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001141 return VOS_STATUS_E_FAILURE;
1142 }
1143
1144 buf += lenRes;
1145 lenBuf -= lenRes;
1146
Jeff Johnson02797792013-10-26 19:17:13 -07001147 lenRes = snprintf(buf, lenBuf, "\n txpower: %d\n txpktcnt: %d\n "
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001148 "txpktlen: %d\n", ftm_status.txpower,
1149 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001150 ftm_status.frameParams.payloadLength);
1151
1152 if ((lenRes < 0) || (lenRes >= lenBuf))
1153 {
c_hpothuffdb5272013-10-02 16:42:35 +05301154 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1155 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001156 return VOS_STATUS_E_FAILURE;
1157 }
1158
1159 return VOS_STATUS_SUCCESS;
1160}
1161
Jeff Johnson295189b2012-06-20 16:38:30 -07001162
1163void HEXDUMP(char *s0, char *s1, int len)
1164{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301165 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001166 printk(KERN_EMERG "%s\n :", s0);
1167
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301168 if (len > 8)
1169 {
1170 for (j = 0; j < len/8; j++)
1171 {
1172 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1173 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1174 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1175 }
1176 len = len - j*8;
1177 }
1178 for (i = 0; i< len; i++) {
1179 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001180 }
1181 printk("\n");
1182}
1183
Jeff Johnson295189b2012-06-20 16:38:30 -07001184/*---------------------------------------------------------------------------
1185
1186 \brief vos_ftm_preStart() -
1187
1188 The \a vos_ftm_preStart() function to download CFG.
1189 including:
1190 - ccmStart
1191
1192 - WDA: triggers the CFG download
1193
1194
1195 \param pVosContext: The VOS context
1196
1197
1198 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1199 is ready to be used.
1200
1201 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1202 are unavailable to initialize the scheduler
1203
1204
1205 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1206
1207 \sa vos_start
1208
1209---------------------------------------------------------------------------*/
1210VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1211{
1212 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1213 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001214
Jeff Johnson295189b2012-06-20 16:38:30 -07001215 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1216 "vos prestart");
1217
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001218 if (NULL == pVosContext->pWDAContext)
1219 {
1220 VOS_ASSERT(0);
1221 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1222 "%s: WDA NULL context", __func__);
1223 return VOS_STATUS_E_FAILURE;
1224 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001225
1226 /* call macPreStart */
1227 vStatus = macPreStart(pVosContext->pMACContext);
1228 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1229 {
1230 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1231 "Failed at macPreStart ");
1232 return VOS_STATUS_E_FAILURE;
1233 }
1234
1235 /* call ccmStart */
1236 ccmStart(pVosContext->pMACContext);
1237
1238 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001239 vos_event_reset(&pVosContext->wdaCompleteEvent);
1240
Jeff Johnson295189b2012-06-20 16:38:30 -07001241
1242 /*call WDA pre start*/
1243 vStatus = WDA_preStart(pVosContext);
1244 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1245 {
1246 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1247 "Failed to WDA prestart ");
1248 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1249 ccmStop(pVosContext->pMACContext);
1250 VOS_ASSERT(0);
1251 return VOS_STATUS_E_FAILURE;
1252 }
1253
1254 /* Need to update time out of complete */
1255 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1256 if ( vStatus != VOS_STATUS_SUCCESS )
1257 {
1258 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1259 {
1260 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001261 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001262 }
1263 else
1264 {
1265 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001266 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001267 }
1268 VOS_ASSERT( 0 );
1269 return VOS_STATUS_E_FAILURE;
1270 }
1271
1272 return VOS_STATUS_SUCCESS;
1273}
Jeff Johnson295189b2012-06-20 16:38:30 -07001274
1275/**---------------------------------------------------------------------------
1276
1277 \brief wlan_hdd_ftm_open() -
1278
1279 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1280
1281 \param - pAdapter - Pointer HDD Context.
1282
1283 \return - 0 for success, non zero for failure
1284
1285 --------------------------------------------------------------------------*/
1286
1287int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1288{
1289 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1290 pVosContextType pVosContext= NULL;
1291 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001292
Jeff Johnson295189b2012-06-20 16:38:30 -07001293 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1294 "%s: Opening VOSS", __func__);
1295
1296 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1297
1298 if (NULL == pVosContext)
1299 {
1300 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301301 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001302 VOS_ASSERT(0);
1303 goto err_vos_status_failure;
1304 }
1305
1306 // Open VOSS
1307 vStatus = wlan_ftm_vos_open( pVosContext, 0);
1308
1309 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1310 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301311 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001312 goto err_vos_status_failure;
1313 }
1314
Jeff Johnson295189b2012-06-20 16:38:30 -07001315 /*
1316 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1317 */
1318 /* Save the hal context in Adapter */
1319 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001320
1321 if ( NULL == pHddCtx->hHal )
1322 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301323 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301324 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001325 }
1326
1327 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1328 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1329 if( NULL == pAdapter )
1330 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301331 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301332 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001333 }
1334
1335 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1336 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301337 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301338 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001339 }
1340
1341 //Initialize the nlink service
1342 if(nl_srv_init() != 0)
1343 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301344 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001345 goto err_ftm_register_wext_close;
1346 }
1347
Leo Chang9e646082013-08-02 11:20:21 -07001348#ifdef WLAN_KD_READY_NOTIFIER
1349 pHddCtx->kd_nl_init = 1;
1350#endif /* WLAN_KD_READY_NOTIFIER */
1351
Jeff Johnson295189b2012-06-20 16:38:30 -07001352#ifdef PTT_SOCK_SVC_ENABLE
1353 //Initialize the PTT service
1354 if(ptt_sock_activate_svc(pHddCtx) != 0)
1355 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301356 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001357 goto err_nl_srv_init;
1358 }
1359#endif
1360 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1361 {
1362 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1363 goto err_nl_srv_init;
1364 }
1365#ifdef HDD_SESSIONIZE
1366 //Turn off carrier state
1367 netif_carrier_off(pAdapter->dev);
1368
1369 //Stop the Interface TX queue. Just being safe
1370 netif_tx_disable(pAdapter->dev);
1371#endif
1372
Jeff Johnson295189b2012-06-20 16:38:30 -07001373 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1374 pHddCtx->ftm.targetNVTableSize = 0;
1375 pHddCtx->ftm.targetNVTablePointer = NULL;
1376 pHddCtx->ftm.processedNVTableSize = 0;
1377 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1378 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1379 {
1380 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301381 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001382 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001383 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001384 }
1385 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001386
1387 _ftm_status_init();
1388 /* Initialize the ftm vos event */
1389 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1390 {
1391 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301392 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001393 VOS_ASSERT(0);
1394 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1395 goto err_nl_srv_init;
1396 }
1397
1398 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1399
1400 return VOS_STATUS_SUCCESS;
1401
1402err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001403#ifdef WLAN_KD_READY_NOTIFIER
1404nl_srv_exit(pHddCtx->ptt_pid);
1405#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001406nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001407#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001408err_ftm_register_wext_close:
1409hdd_UnregisterWext(pAdapter->dev);
1410
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301411err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001412err_adapter_open_failure:
1413hdd_close_all_adapters( pHddCtx );
1414
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301415err_ftm_vos_close:
1416 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001417err_vos_status_failure:
1418
1419 return VOS_STATUS_E_FAILURE;
1420}
1421
1422
1423
1424int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1425{
1426 VOS_STATUS vosStatus;
1427 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1428
1429 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1430 ENTER();
1431 if(pAdapter == NULL)
1432 {
1433 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1434 return VOS_STATUS_E_NOMEM;
1435 }
1436
Atul Mittalc41126d2014-03-17 15:10:11 +05301437 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1438 if (pHddCtx->ftm.IsCmdPending == TRUE)
1439 {
1440 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1441 {
1442 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1443 "%s: vos_event_set failed", __func__);
1444 }
1445 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001446 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1447 {
1448 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1449 "%s: Ftm has been started. stopping ftm", __func__);
1450 wlan_ftm_stop(pHddCtx);
1451 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001452
1453 //Assert Deep sleep signal now to put Libra HW in lowest power state
1454 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301455 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1456 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1457 "%s: Failed to assert deep sleep signal", __func__);
1458 VOS_ASSERT( 0 );
1459 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001460
1461 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301462 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1463 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1464 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1465 "%s: Failed to put HW into low power", __func__);
1466 VOS_ASSERT( 0 );
1467 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001468
1469 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1470
Leo Chang59cdc7e2013-07-10 10:08:21 -07001471#ifdef WLAN_KD_READY_NOTIFIER
1472 nl_srv_exit(pHddCtx->ptt_pid);
1473#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001474 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001475#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001476 //TODO----------
1477 //Deregister the device with the kernel
1478 hdd_UnregisterWext(pAdapter->dev);
1479
1480 hdd_close_all_adapters( pHddCtx );
1481#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001482 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001483 {
1484 unregister_netdev(pAdapter->dev);
1485 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1486 }
1487#endif
1488 //-----------------
1489
1490 vosStatus = vos_sched_close( vosContext );
1491 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1492 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1493 "%s: Failed to close VOSS Scheduler",__func__);
1494 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1495 }
1496
1497 //Close VOSS
1498 wlan_ftm_vos_close(vosContext);
1499
1500
1501 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1502 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1503 {
1504 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1505 "%s: Failed to destroy ftm_vos Event",__func__);
1506 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1507 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001508 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001509
1510 //Free up dynamically allocated members inside HDD Adapter
1511 kfree(pHddCtx->cfg_ini);
1512 pHddCtx->cfg_ini= NULL;
1513
1514 return 0;
1515
1516}
1517
1518/**---------------------------------------------------------------------------
1519
1520 \brief wlan_ftm_send_response() -
1521
1522 The function sends the response to the ptt socket application running in user space.
1523
1524 \param - pAdapter - Pointer HDD Context.
1525
1526 \return - 0 for success, non zero for failure
1527
1528 --------------------------------------------------------------------------*/
1529
1530static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1531
1532 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
1533
Arif Hussain6d2a3322013-11-17 19:50:10 -08001534 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 -07001535 return VOS_STATUS_E_FAILURE;
1536 }
1537 return VOS_STATUS_SUCCESS;
1538}
1539
1540/**---------------------------------------------------------------------------
1541
1542 \brief wlan_hdd_ftm_start() -
1543
1544 This function gets called when the FTM start commands received from the ptt socket application and
1545 it starts the following modules.
1546 1) SAL Start.
1547 2) BAL Start.
1548 3) MAC Start to download the firmware.
1549
1550
1551 \param - pAdapter - Pointer HDD Context.
1552
1553 \return - 0 for success, non zero for failure
1554
1555 --------------------------------------------------------------------------*/
1556
1557static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1558{
1559 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1560 tSirRetStatus sirStatus = eSIR_SUCCESS;
1561 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1562 tHalMacStartParameters halStartParams;
1563
1564 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1565 {
1566 return VOS_STATUS_SUCCESS;
1567 }
1568
1569 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1570 "%s: Starting Libra SW", __func__);
1571
1572 /* We support only one instance for now ...*/
1573 if (pVosContext == NULL)
1574 {
1575 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001576 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001577 goto err_status_failure;
1578 }
1579
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001580
Jeff Johnson295189b2012-06-20 16:38:30 -07001581 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001582 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001583 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001584 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001585 goto err_status_failure;
1586 }
1587
Jeff Johnson295189b2012-06-20 16:38:30 -07001588 /*
1589 Prima needs to start the WDA correctly instead of BAL and SAL
1590 */
1591
1592 /* Vos preStart is calling */
1593 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1594 {
1595 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1596 goto err_status_failure;
1597 }
1598
1599
1600 vStatus = WDA_NVDownload_Start(pVosContext);
1601
1602 if ( vStatus != VOS_STATUS_SUCCESS )
1603 {
1604 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1605 "%s: Failed to start NV Download",__func__);
1606 return VOS_STATUS_E_FAILURE;
1607 }
1608
1609 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1610
1611 if ( vStatus != VOS_STATUS_SUCCESS )
1612 {
1613 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1614 {
1615 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001616 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001617 }
1618 else
1619 {
1620 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001621 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001622 }
1623 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301624 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001625 }
1626
1627 vStatus = WDA_start(pVosContext);
1628 if (vStatus != VOS_STATUS_SUCCESS)
1629 {
1630 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1631 "%s: Failed to start WDA",__func__);
1632 goto err_status_failure;
1633 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001634
Jeff Johnson295189b2012-06-20 16:38:30 -07001635
1636 /* Start the MAC */
1637 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1638
Jeff Johnson295189b2012-06-20 16:38:30 -07001639
1640 halStartParams.driverType = eDRIVER_TYPE_MFG;
1641
1642 /* Start the MAC */
1643 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1644
Jeff Johnson295189b2012-06-20 16:38:30 -07001645
1646 if (eSIR_SUCCESS != sirStatus)
1647 {
1648 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1649 "%s: Failed to start MAC", __func__);
1650
Jeff Johnson295189b2012-06-20 16:38:30 -07001651 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 }
1653
1654 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1655 "%s: MAC correctly started",__func__);
1656
Jeff Johnson295189b2012-06-20 16:38:30 -07001657
1658 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1659
1660 return VOS_STATUS_SUCCESS;
1661
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001662err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001663 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1664 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1665 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1666 if(vStatus != VOS_STATUS_SUCCESS)
1667 {
1668 if(vStatus == VOS_STATUS_E_TIMEOUT)
1669 {
1670 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001671 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001672
1673 }
1674 else
1675 {
1676 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001677 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001678 }
1679 VOS_ASSERT(0);
1680 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001681
1682err_status_failure:
1683
1684 return VOS_STATUS_E_FAILURE;
1685
1686}
1687
1688
1689static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1690{
1691 VOS_STATUS vosStatus;
1692
1693 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1694 {
1695 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1696 return VOS_STATUS_E_FAILURE;
1697 }
1698
1699 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1700 {
1701 /* STOP MAC only */
1702 v_VOID_t *hHal;
1703 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1704 if (NULL == hHal)
1705 {
1706 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1707 "%s: NULL hHal", __func__);
1708 }
1709 else
1710 {
1711 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1712 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1713 {
1714 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1715 "%s: Failed to stop SYS", __func__);
1716 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1717 }
1718 }
1719
Jeff Johnson295189b2012-06-20 16:38:30 -07001720
Jeff Johnson295189b2012-06-20 16:38:30 -07001721 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001722
1723 }
1724 return WLAN_FTM_SUCCESS;
1725}
1726
Jeff Johnson295189b2012-06-20 16:38:30 -07001727/**---------------------------------------------------------------------------
1728
1729 \brief wlan_hdd_ftm_get_nv_table() -
1730 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001731 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001732
1733 \param - ftmCmd - Pointer FTM Commad Buffer
1734
1735 \return - int
1736 -1, Process Host command fail, vail out
1737 1, Process Host command success
1738
1739 --------------------------------------------------------------------------*/
1740int wlan_hdd_ftm_get_nv_table
1741(
1742 hdd_context_t *pHddCtx,
1743 tPttMsgbuffer *ftmCmd
1744)
1745{
1746 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1747 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1748 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001749 sHalNvV2 *nvContents = NULL;
1750 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001751
Jeff Johnson295189b2012-06-20 16:38:30 -07001752 if (NULL == pHddCtx)
1753 {
1754 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1755 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001756 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001757 }
1758
Leo Chang80de3c22013-11-26 10:52:12 -08001759 nvVersion = vos_nv_getNvVersion();
1760 if (E_NV_V2 != nvVersion)
1761 {
1762 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1763 "%s : Not valid NV Version %d", __func__, nvVersion);
1764 return -EINVAL;
1765 }
1766
Jeff Johnson295189b2012-06-20 16:38:30 -07001767 /* Test first chunk of NV table */
1768 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1769 (0 == pHddCtx->ftm.processedNVTableSize))
1770 {
1771 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1772 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1773 {
c_hpothuffdb5272013-10-02 16:42:35 +05301774 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1775 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001776 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001777 }
1778
1779 switch (nvTable->nvTable)
1780 {
1781 case NV_TABLE_RATE_POWER_SETTINGS:
1782 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1783 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1784 break;
1785
1786 case NV_TABLE_REGULATORY_DOMAINS:
1787 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1788 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1789 break;
1790
1791 case NV_TABLE_DEFAULT_COUNTRY:
1792 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1793 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1794 break;
1795
1796 case NV_TABLE_TPC_POWER_TABLE:
1797 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1798 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1799 break;
1800
1801 case NV_TABLE_TPC_PDADC_OFFSETS:
1802 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1803 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1804 break;
1805
1806 case NV_TABLE_VIRTUAL_RATE:
1807 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1808 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1809 break;
1810
1811 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1812 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1813 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1814 break;
1815
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001816 case NV_TABLE_HW_CAL_VALUES:
1817 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1818 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1819 break;
1820
1821 case NV_TABLE_FW_CONFIG:
1822 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1823 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001824 break;
1825
1826 case NV_TABLE_ANTENNA_PATH_LOSS:
1827 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1828 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1829 break;
1830
1831 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1832 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1833 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1834 break;
1835
1836 default:
1837 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1838 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001839 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001840 break;
1841 }
1842
1843 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1844 {
1845 /* Invalid table size, discard and initialize data */
1846 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001847 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001848 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001849 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001850 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1851 pHddCtx->ftm.targetNVTableSize = 0;
1852 pHddCtx->ftm.processedNVTableSize = 0;
1853 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001854 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001855 }
1856
1857 /* Set Current Processing NV table type */
1858 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1859 /* Copy target NV table value into temp context buffer */
1860 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1861 pHddCtx->ftm.targetNVTablePointer,
1862 pHddCtx->ftm.targetNVTableSize);
1863
1864 }
1865
1866 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1867 {
1868 /* Invalid table type */
1869 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1870 "Invalid NV Table, now Processing %d, not %d",
1871 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1872 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1873 pHddCtx->ftm.targetNVTableSize = 0;
1874 pHddCtx->ftm.processedNVTableSize = 0;
1875 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001876
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001877 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001878 }
1879
1880 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001881 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001882 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1883 nvTable->chunkSize);
1884 /* Update processed pointer to prepare next chunk copy */
1885 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1886
1887 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1888 {
1889 /* Finished to process last chunk of data, initialize buffer */
1890 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1891 pHddCtx->ftm.targetNVTableSize = 0;
1892 pHddCtx->ftm.processedNVTableSize = 0;
1893 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1894 }
1895
1896 return 1;
1897}
1898
1899/**---------------------------------------------------------------------------
1900
1901 \brief wlan_hdd_ftm_set_nv_table() -
1902 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08001903 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001904
1905 \param - ftmCmd - Pointer FTM Commad Buffer
1906
1907 \return - int
1908 -1, Process Host command fail, vail out
1909 1, Process Host command success
1910
1911 --------------------------------------------------------------------------*/
1912int wlan_hdd_ftm_set_nv_table
1913(
1914 hdd_context_t *pHddCtx,
1915 tPttMsgbuffer *ftmCmd
1916)
1917{
1918 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1919 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1920 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001921 sHalNvV2 *nvContents = NULL;
1922 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001923
1924 if (NULL == pHddCtx)
1925 {
1926 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1927 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001928 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001929 }
1930
Leo Chang80de3c22013-11-26 10:52:12 -08001931 nvVersion = vos_nv_getNvVersion();
1932 if (E_NV_V2 != nvVersion)
1933 {
1934 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1935 "%s : Not valid NV Version %d", __func__, nvVersion);
1936 return -EINVAL;
1937 }
1938
Jeff Johnson295189b2012-06-20 16:38:30 -07001939 /* Test first chunk of NV table */
1940 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1941 (0 == pHddCtx->ftm.processedNVTableSize))
1942 {
1943 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1944 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1945 {
c_hpothuffdb5272013-10-02 16:42:35 +05301946 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1947 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001948 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001949 }
1950
1951 switch (nvTable->nvTable)
1952 {
1953 case NV_TABLE_RATE_POWER_SETTINGS:
1954 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1955 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1956 break;
1957
1958 case NV_TABLE_REGULATORY_DOMAINS:
1959 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1960 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1961 break;
1962
1963 case NV_TABLE_DEFAULT_COUNTRY:
1964 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1965 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1966 break;
1967
1968 case NV_TABLE_TPC_POWER_TABLE:
1969 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1970 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1971 break;
1972
1973 case NV_TABLE_TPC_PDADC_OFFSETS:
1974 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1975 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1976 break;
1977
1978 case NV_TABLE_VIRTUAL_RATE:
1979 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1980 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1981 break;
1982
1983 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1984 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1985 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1986 break;
1987
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001988 case NV_TABLE_HW_CAL_VALUES:
1989 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1990 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1991 break;
1992
1993 case NV_TABLE_FW_CONFIG:
1994 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1995 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001996 break;
1997
1998 case NV_TABLE_ANTENNA_PATH_LOSS:
1999 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2000 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2001 break;
2002
2003 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2004 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2005 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2006 break;
2007
2008 default:
2009 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2010 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002011 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002012 break;
2013 }
2014
2015 /* Set Current Processing NV table type */
2016 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2017 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2018 {
2019 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2020 "Invalid Table Size %d", nvTable->tableSize);
2021 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2022 pHddCtx->ftm.targetNVTableSize = 0;
2023 pHddCtx->ftm.processedNVTableSize = 0;
2024 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002025 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002026 }
2027 }
2028
2029 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2030 {
2031 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2032 "Invalid NV Table, now Processing %d, not %d",
2033 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2034 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2035 pHddCtx->ftm.targetNVTableSize = 0;
2036 pHddCtx->ftm.processedNVTableSize = 0;
2037 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002038 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002039 }
2040 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002041 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002042 nvTable->chunkSize);
2043
2044 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2045 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2046 {
2047 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2048 pHddCtx->ftm.tempNVTableBuffer,
2049 pHddCtx->ftm.targetNVTableSize);
2050 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2051 pHddCtx->ftm.targetNVTableSize = 0;
2052 pHddCtx->ftm.processedNVTableSize = 0;
2053 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2054 }
2055
2056 return 1;
2057}
2058
2059/**---------------------------------------------------------------------------
2060
2061 \brief wlan_hdd_ftm_blank_nv() -
2062 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002063 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002064
2065 \param - ftmCmd - Pointer FTM Commad Buffer
2066
2067 \return - int
2068 -1, Process Host command fail, vail out
2069 0, Process Host command success
2070
2071 --------------------------------------------------------------------------*/
2072int wlan_hdd_ftm_blank_nv_table
2073(
2074 tPttMsgbuffer *ftmCmd
2075)
2076{
Leo Chang80de3c22013-11-26 10:52:12 -08002077 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002078 v_SIZE_t nvSize;
2079 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002080 sHalNvV2 *nvContents = NULL;
2081 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002082
2083 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2084 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2085 {
c_hpothuffdb5272013-10-02 16:42:35 +05302086 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2087 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002088 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002089 }
2090
Leo Chang80de3c22013-11-26 10:52:12 -08002091 nvVersion = vos_nv_getNvVersion();
2092 if (E_NV_V2 != nvVersion)
2093 {
2094 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2095 "%s : Not valid NV Version %d", __func__, nvVersion);
2096 return -EINVAL;
2097 }
2098
Jeff Johnson295189b2012-06-20 16:38:30 -07002099 itemSize = sizeof(nvContents->tables.pwrOptimum);
2100 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002101 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 itemSize);
2103
2104 itemSize = sizeof(nvContents->tables.regDomains);
2105 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002106 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002107 itemSize);
2108
2109 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2110 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002111 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002112 itemSize);
2113
2114 itemSize = sizeof(nvContents->tables.plutCharacterized);
2115 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002116 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002117 itemSize);
2118
2119 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2120 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002121 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002122 itemSize);
2123
2124 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2125 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002126 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002127 itemSize);
2128
2129 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2130 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002131 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002132 itemSize);
2133
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002134 itemSize = sizeof(nvContents->tables.hwCalValues);
2135 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002136 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002137 itemSize);
2138
2139 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2140 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002141 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002142 itemSize);
2143
2144 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2145 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002146 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002147 itemSize);
2148
2149 return 1;
2150}
2151
2152/**---------------------------------------------------------------------------
2153
2154 \brief wlan_hdd_ftm_delete_nv_table() -
2155 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002156 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002157
2158 \param - ftmCmd - Pointer FTM Commad Buffer
2159
2160 \return - int
2161 -1, Process Host command fail, vail out
2162 1, Process Host command success
2163
2164 --------------------------------------------------------------------------*/
2165int wlan_hdd_ftm_delete_nv_table
2166(
2167 tPttMsgbuffer *ftmCmd
2168)
2169{
Leo Chang80de3c22013-11-26 10:52:12 -08002170 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002171 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2172 v_SIZE_t nvSize;
2173 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002174 sHalNvV2 *nvContents = NULL;
2175 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002176
2177 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2178 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2179 {
c_hpothuffdb5272013-10-02 16:42:35 +05302180 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2181 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002182 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002183 }
2184
Leo Chang80de3c22013-11-26 10:52:12 -08002185 nvVersion = vos_nv_getNvVersion();
2186 if (E_NV_V2 != nvVersion)
2187 {
2188 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2189 "%s : Not valid NV Version %d", __func__, nvVersion);
2190 return -EINVAL;
2191 }
2192
Jeff Johnson295189b2012-06-20 16:38:30 -07002193 switch (nvTable->nvTable)
2194 {
2195 case NV_TABLE_RATE_POWER_SETTINGS:
2196 itemSize = sizeof(nvContents->tables.pwrOptimum);
2197 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002198 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002199 itemSize);
2200 break;
2201
2202 case NV_TABLE_REGULATORY_DOMAINS:
2203 itemSize = sizeof(nvContents->tables.regDomains);
2204 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002205 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002206 itemSize);
2207 break;
2208
2209 case NV_TABLE_DEFAULT_COUNTRY:
2210 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2211 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002212 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002213 itemSize);
2214 break;
2215
2216 case NV_TABLE_TPC_POWER_TABLE:
2217 itemSize = sizeof(nvContents->tables.plutCharacterized);
2218 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002219 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002220 itemSize);
2221 break;
2222
2223 case NV_TABLE_TPC_PDADC_OFFSETS:
2224 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2225 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002226 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002227 itemSize);
2228 break;
2229
2230 case NV_TABLE_VIRTUAL_RATE:
2231 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2232 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002233 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002234 itemSize);
2235 break;
2236
2237 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2238 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2239 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002240 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002241 itemSize);
2242 break;
2243
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002244 case NV_TABLE_HW_CAL_VALUES:
2245 itemSize = sizeof(nvContents->tables.hwCalValues);
2246 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002247 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002248 itemSize);
2249 break;
2250
2251 case NV_TABLE_FW_CONFIG:
2252 itemSize = sizeof(nvContents->tables.fwConfig);
2253 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002254 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002255 itemSize);
2256 break;
2257
2258 case NV_TABLE_ANTENNA_PATH_LOSS:
2259 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2260 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002261 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002262 itemSize);
2263 break;
2264
2265 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2266 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2267 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002268 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002269 itemSize);
2270 break;
2271
2272 default:
2273 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2274 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002275 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002276 break;
2277 }
2278
2279 return 1;
2280}
2281
2282/**---------------------------------------------------------------------------
2283
2284 \brief wlan_hdd_ftm_get_nv_field() -
2285 Get Specific NV field
2286
2287 \param - ftmCmd - Pointer FTM Commad Buffer
2288
2289 \return - int
2290 -1, Process Host command fail, vail out
2291 1, Process Host command success
2292
2293 --------------------------------------------------------------------------*/
2294int wlan_hdd_ftm_get_nv_field
2295(
2296 tPttMsgbuffer *ftmCmd
2297)
2298{
2299 sNvFields nvFieldDataBuffer;
2300 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2301 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2302 sHalNv *nvContents = NULL;
2303 v_SIZE_t nvSize;
2304
2305 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2306 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2307 {
c_hpothuffdb5272013-10-02 16:42:35 +05302308 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2309 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002310 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002311 }
2312 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2313
2314 switch (nvField->nvField)
2315 {
2316 case NV_COMMON_PRODUCT_ID:
2317 memcpy((void *)&nvField->fieldData,
2318 &nvFieldDataBuffer.productId,
2319 sizeof(nvFieldDataBuffer.productId));
2320 break;
2321
2322 case NV_COMMON_PRODUCT_BANDS:
2323 memcpy((void *)&nvField->fieldData,
2324 &nvFieldDataBuffer.productBands,
2325 sizeof(nvFieldDataBuffer.productBands));
2326 break;
2327
2328 case NV_COMMON_NUM_OF_TX_CHAINS:
2329 memcpy((void *)&nvField->fieldData,
2330 &nvFieldDataBuffer.numOfTxChains,
2331 sizeof(nvFieldDataBuffer.numOfTxChains));
2332 break;
2333
2334 case NV_COMMON_NUM_OF_RX_CHAINS:
2335 memcpy((void *)&nvField->fieldData,
2336 &nvFieldDataBuffer.numOfRxChains,
2337 sizeof(nvFieldDataBuffer.numOfRxChains));
2338 break;
2339
2340 case NV_COMMON_MAC_ADDR:
2341 memcpy((void *)&nvField->fieldData,
2342 &nvFieldDataBuffer.macAddr[0],
2343 NV_FIELD_MAC_ADDR_SIZE);
2344 break;
2345
2346 case NV_COMMON_MFG_SERIAL_NUMBER:
2347 memcpy((void *)&nvField->fieldData,
2348 &nvFieldDataBuffer.mfgSN[0],
2349 NV_FIELD_MFG_SN_SIZE);
2350 break;
2351
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002352 case NV_COMMON_WLAN_NV_REV_ID:
2353 memcpy((void *)&nvField->fieldData,
2354 &nvFieldDataBuffer.wlanNvRevId,
2355 sizeof(nvFieldDataBuffer.wlanNvRevId));
2356 break;
2357
Jeff Johnson295189b2012-06-20 16:38:30 -07002358 case NV_COMMON_COUPLER_TYPE:
2359 memcpy((void *)&nvField->fieldData,
2360 &nvFieldDataBuffer.couplerType,
2361 sizeof(nvFieldDataBuffer.couplerType));
2362 break;
2363
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002364 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002365 {
2366 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2367 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2368
2369 nvEmbededStatus = vos_nv_isEmbeddedNV();
2370
2371 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2372 {
2373 // High bit is set to indicate embedded NV..
2374 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2375 }
2376
2377 memcpy((void *)&nvField->fieldData,
2378 &nvVersion,
2379 sizeof(nvFieldDataBuffer.nvVersion));
2380 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002381 break;
2382
Jeff Johnson295189b2012-06-20 16:38:30 -07002383 default:
2384 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2385 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002386 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002387 break;
2388 }
2389
2390 return 1;
2391}
2392
2393/**---------------------------------------------------------------------------
2394
2395 \brief wlan_hdd_ftm_set_nv_field() -
2396 Set Specific NV field
2397
2398 \param - ftmCmd - Pointer FTM Commad Buffer
2399
2400 \return - int
2401 -1, Process Host command fail, vail out
2402 1, Process Host command success
2403
2404 --------------------------------------------------------------------------*/
2405int wlan_hdd_ftm_set_nv_field
2406(
2407 tPttMsgbuffer *ftmCmd
2408)
2409{
2410 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2411 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2412 v_SIZE_t nvSize;
2413 sHalNv *nvContents = NULL;
2414 v_U8_t macLoop;
2415 v_U8_t *pNVMac;
2416 v_U8_t lastByteMAC;
2417
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002418
Jeff Johnson295189b2012-06-20 16:38:30 -07002419 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2420 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2421 {
c_hpothuffdb5272013-10-02 16:42:35 +05302422 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2423 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002424 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002425 }
2426
2427 switch (nvField->nvField)
2428 {
2429 case NV_COMMON_PRODUCT_ID:
2430 memcpy(&nvContents->fields.productId,
2431 &nvField->fieldData,
2432 sizeof(nvContents->fields.productId));
2433 break;
2434
2435 case NV_COMMON_PRODUCT_BANDS:
2436 memcpy(&nvContents->fields.productBands,
2437 &nvField->fieldData,
2438 sizeof(nvContents->fields.productBands));
2439 break;
2440
2441 case NV_COMMON_NUM_OF_TX_CHAINS:
2442 memcpy(&nvContents->fields.numOfTxChains,
2443 &nvField->fieldData,
2444 sizeof(nvContents->fields.numOfTxChains));
2445 break;
2446
2447 case NV_COMMON_NUM_OF_RX_CHAINS:
2448 memcpy(&nvContents->fields.numOfRxChains,
2449 &nvField->fieldData,
2450 sizeof(nvContents->fields.numOfRxChains));
2451 break;
2452
2453 case NV_COMMON_MAC_ADDR:
2454 /* If Last byte is larger than 252 (0xFC), return Error,
2455 * Since 3MACs should be derived from first MAC */
2456 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002457 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002458 {
2459 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2460 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002461 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002462 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002463 }
2464
2465 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002466 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002467 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2468 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002469 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002470 lastByteMAC + macLoop;
2471 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002472 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002473 NV_FIELD_MAC_ADDR_SIZE);
2474 }
2475 break;
2476
2477 case NV_COMMON_MFG_SERIAL_NUMBER:
2478 memcpy(&nvContents->fields.mfgSN[0],
2479 &nvField->fieldData,
2480 NV_FIELD_MFG_SN_SIZE);
2481 break;
2482
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002483 case NV_COMMON_WLAN_NV_REV_ID:
2484 memcpy(&nvContents->fields.wlanNvRevId,
2485 &nvField->fieldData,
2486 sizeof(nvContents->fields.wlanNvRevId));
2487 break;
2488
Jeff Johnson295189b2012-06-20 16:38:30 -07002489 case NV_COMMON_COUPLER_TYPE:
2490 memcpy(&nvContents->fields.couplerType,
2491 &nvField->fieldData,
2492 sizeof(nvContents->fields.couplerType));
2493 break;
2494
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002495 case NV_COMMON_NV_VERSION:
2496 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2497 "Cannot modify NV version field %d", nvField->nvField);
2498 return -EIO;
2499 break;
2500
Jeff Johnson295189b2012-06-20 16:38:30 -07002501 default:
2502 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2503 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002504 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002505 break;
2506 }
2507
2508 return 1;
2509}
2510
2511/**---------------------------------------------------------------------------
2512
2513 \brief wlan_hdd_ftm_store_nv_table() -
2514 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002515 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002516
2517 \param - ftmCmd - Pointer FTM Commad Buffer
2518
2519 \return - int
2520 -1, Process Host command fail, vail out
2521 0, Process Host command success
2522
2523 --------------------------------------------------------------------------*/
2524int wlan_hdd_ftm_store_nv_table
2525(
2526 tPttMsgbuffer *ftmCmd
2527)
2528{
2529 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2530 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002531 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2532 void *tablePtr = NULL;
2533 unsigned int tableSize = 0;
2534 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002535 sHalNvV2 *nvContents = NULL;
2536 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002537
2538 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2539 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2540 {
c_hpothuffdb5272013-10-02 16:42:35 +05302541 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2542 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002543 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002544 }
2545
Leo Chang80de3c22013-11-26 10:52:12 -08002546 nvVersion = vos_nv_getNvVersion();
2547 if (E_NV_V2 != nvVersion)
2548 {
2549 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2550 "%s : Not valid NV Version %d", __func__, nvVersion);
2551 return -EINVAL;
2552 }
2553
Jeff Johnson295189b2012-06-20 16:38:30 -07002554 /* Set Platform type as PRIMA */
2555 nvContents->fields.wlanNvRevId = 2;
2556
2557 switch(nvTable->nvTable)
2558 {
2559 case NV_FIELDS_IMAGE:
2560 tablePtr = (void *)&nvContents->fields;
2561 tableSize = sizeof(nvContents->fields);
2562 tableVNVType = VNV_FIELD_IMAGE;
2563 break;
2564
2565 case NV_TABLE_RATE_POWER_SETTINGS:
2566 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2567 tableSize = sizeof(nvContents->tables.pwrOptimum);
2568 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2569 break;
2570
2571 case NV_TABLE_REGULATORY_DOMAINS:
2572 tablePtr = (void *)&nvContents->tables.regDomains[0];
2573 tableSize = sizeof(nvContents->tables.regDomains);
2574 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2575 break;
2576
2577 case NV_TABLE_DEFAULT_COUNTRY:
2578 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2579 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2580 tableVNVType = VNV_DEFAULT_LOCATION;
2581 break;
2582
2583 case NV_TABLE_TPC_POWER_TABLE:
2584 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2585 tableSize = sizeof(nvContents->tables.plutCharacterized);
2586 tableVNVType = VNV_TPC_POWER_TABLE;
2587 break;
2588
2589 case NV_TABLE_TPC_PDADC_OFFSETS:
2590 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2591 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2592 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2593 break;
2594
2595 case NV_TABLE_VIRTUAL_RATE:
2596 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2597 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2598 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2599 break;
2600
2601 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2602 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2603 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2604 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2605 break;
2606
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002607 case NV_TABLE_HW_CAL_VALUES:
2608 tablePtr = (void *)&nvContents->tables.hwCalValues;
2609 tableSize = sizeof(nvContents->tables.hwCalValues);
2610 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002611 break;
2612
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002613 case NV_TABLE_FW_CONFIG:
2614 tablePtr = (void *)&nvContents->tables.fwConfig;
2615 tableSize = sizeof(nvContents->tables.fwConfig);
2616 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002617 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002618
Jeff Johnson295189b2012-06-20 16:38:30 -07002619 case NV_TABLE_ANTENNA_PATH_LOSS:
2620 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2621 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2622 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2623 break;
2624
2625 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2626 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2627 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2628 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2629 break;
2630
2631 default:
2632 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2633 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002634 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002635 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002636
Jeff Johnson295189b2012-06-20 16:38:30 -07002637 }
2638
2639 nvStatus = vos_nv_write(tableVNVType,
2640 tablePtr,
2641 tableSize);
2642 if(VOS_STATUS_SUCCESS != nvStatus)
2643 {
c_hpothuffdb5272013-10-02 16:42:35 +05302644 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2645 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002646 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002647 }
2648
2649 return 1;
2650}
2651
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002652/* --------------------------------------------------------------------------
2653 \brief wlan_hdd_ftm_get_nv_bin() -
2654 Get NV bin read from Flash Memory, file
2655
2656 \param - ftmCmd - Pointer FTM Commad Buffer
2657
2658 \return - int
2659 -1, Process Host command fail, vail out
2660 0, Process Host command success
2661--------------------------------------------------------------------------*/
2662
2663static int wlan_hdd_ftm_get_nv_bin
2664(
2665 v_U16_t msgId,
2666 hdd_context_t *pHddCtx,
2667 tPttMsgbuffer *ftmCmd
2668)
2669{
2670 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2671 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2672 v_SIZE_t nvSize;
2673 v_U8_t *nvContents;
2674 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002675 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002676
Leo Chang80de3c22013-11-26 10:52:12 -08002677 nvVersion = vos_nv_getNvVersion();
2678 if (E_NV_V3 != nvVersion)
2679 {
2680 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2681 "%s : Not valid NV Version %d", __func__, nvVersion);
2682 return -EINVAL;
2683 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002684
2685 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2686 (0 == pHddCtx->ftm.processedNVTableSize))
2687 {
2688 if ( msgId == PTT_MSG_GET_NV_BIN )
2689 {
2690 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2691 }
2692 else
2693 {
2694 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2695 }
2696
2697 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2698 {
c_hpothuffdb5272013-10-02 16:42:35 +05302699 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2700 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002701 return -EIO;
2702 }
2703
2704 switch (nvTable->nvTable)
2705 {
2706 case NV_BINARY_IMAGE:
2707 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2708 break;
2709 default:
2710 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2711 "Not Valid NV Table %d", nvTable->nvTable);
2712 return -EIO;
2713 break;
2714 }
2715
2716 /* Set Current Processing NV table type */
2717 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2718 if ( msgId == PTT_MSG_GET_NV_BIN )
2719 {
2720 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2721 /* Validity Period */
2722 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2723 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2724 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2725 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2726 offset = sizeof(v_U32_t);
2727 }
2728 else
2729 {
2730 pHddCtx->ftm.targetNVTableSize = nvSize;
2731 offset = 0;
2732 }
2733
2734 /* Copy target NV table value into temp context buffer */
2735 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2736 pHddCtx->ftm.targetNVTablePointer,
2737 pHddCtx->ftm.targetNVTableSize);
2738 }
2739
2740
2741 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2742 {
2743 /* Invalid table type */
2744 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2745 "Invalid NV Table, now Processing %d, not %d",
2746 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2747
2748 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2749 pHddCtx->ftm.targetNVTableSize = 0;
2750 pHddCtx->ftm.processedNVTableSize = 0;
2751 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2752
2753 return -EINVAL;
2754 }
2755
2756 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2757
2758 /* Update processed pointer to prepare next chunk copy */
2759 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2760 pHddCtx->ftm.targetNVTableSize )
2761 {
2762 nvTable->chunkSize =
2763 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2764 }
2765
2766 /* Copy next chunk of NV table value into response buffer */
2767 vos_mem_copy(
2768 &nvTable->tableData,
2769 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2770 nvTable->chunkSize);
2771
2772 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2773
2774 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2775 {
2776 /* Finished to process last chunk of data, initialize buffer */
2777 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2778 pHddCtx->ftm.targetNVTableSize = 0;
2779 pHddCtx->ftm.processedNVTableSize = 0;
2780 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2781 }
2782
2783 return 1;
2784}
2785
2786/**---------------------------------------------------------------------------
2787
2788 \brief wlan_hdd_ftm_set_nv_bin() -
2789 Set NV bin to Flash Memory, file
2790
2791 \param - ftmCmd - Pointer FTM Commad Buffer
2792
2793 \return - int
2794 -1, Process Host command fail, vail out
2795 0, Process Host command success
2796
2797+----------------------------------------------------------------------------*/
2798
2799static int wlan_hdd_ftm_set_nv_bin
2800(
2801 hdd_context_t *pHddCtx,
2802 tPttMsgbuffer *ftmCmd
2803)
2804{
2805 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2806 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002807 eNvVersionType nvVersion;
2808
2809 nvVersion = vos_nv_getNvVersion();
2810 if (E_NV_V3 != nvVersion)
2811 {
2812 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2813 "%s : Not valid NV Version %d", __func__, nvVersion);
2814 return -EINVAL;
2815 }
2816
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002817
2818 /* Test first chunk of NV table */
2819 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2820 (0 == pHddCtx->ftm.processedNVTableSize))
2821 {
2822 switch (nvTable->nvTable)
2823 {
2824 case NV_BINARY_IMAGE:
2825 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2826 break;
2827 default:
2828 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2829 "Not Valid NV Table %d", nvTable->nvTable);
2830 return -EIO;
2831 break;
2832 }
2833
2834 /* Set Current Processing NV table type */
2835 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2836 pHddCtx->ftm.processedNVTableSize = 0;
2837
2838 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2839 {
2840 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2841 "Invalid Table Size %d", nvTable->tableSize);
2842 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2843 pHddCtx->ftm.targetNVTableSize = 0;
2844 pHddCtx->ftm.processedNVTableSize = 0;
2845 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2846 return -EINVAL;
2847 }
2848 }
2849
2850 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2851 {
2852 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2853 "Invalid NV Table, now Processing %d, not %d",
2854 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2855 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2856 pHddCtx->ftm.targetNVTableSize = 0;
2857 pHddCtx->ftm.processedNVTableSize = 0;
2858 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2859 return -EINVAL;
2860 }
2861
2862 vos_mem_copy(
2863 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2864 &nvTable->tableData,
2865 nvTable->chunkSize);
2866
2867 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2868
2869 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2870 {
2871 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2872 "Processing Done!! write encoded Buffer %d",
2873 pHddCtx->ftm.targetNVTableSize);
2874
2875 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2876 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2877
2878 if ((VOS_STATUS_SUCCESS != nvStatus))
2879 {
2880 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2881 "Fail to set NV Binary %d", nvStatus);
2882 return -EIO;
2883 }
2884
2885 nvStatus = vos_nv_setNVEncodedBuffer(
2886 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2887 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
2888
2889 if ((VOS_STATUS_SUCCESS != nvStatus))
2890 {
2891 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2892 "Fail to set NV Binary %d", nvStatus);
2893 return -EIO;
2894 }
2895
2896 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2897 pHddCtx->ftm.targetNVTableSize = 0;
2898 pHddCtx->ftm.processedNVTableSize = 0;
2899 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2900 }
2901
2902 return 1;
2903}
2904
Jeff Johnson295189b2012-06-20 16:38:30 -07002905/**---------------------------------------------------------------------------
2906
2907 \brief wlan_hdd_ftm_temp_get_rel_num() -
2908 Get internal release number
2909
2910 \param - ftmCmd - Pointer FTM Commad Buffer
2911
2912 \return - int
2913 -1, Process Host command fail, vail out
2914 0, Process Host command success
2915
2916 --------------------------------------------------------------------------*/
2917int wlan_hdd_ftm_temp_get_rel_num
2918(
2919 tPttMsgbuffer *ftmCmd
2920)
2921{
2922 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2923
2924 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2925 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2926 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2927 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2928 relNum->relParams.pttMax = 10;
2929 relNum->relParams.pttMin = 1;
2930
2931 return 1;
2932}
2933
2934/**---------------------------------------------------------------------------
2935
2936 \brief wlan_hdd_process_ftm_host_cmd() -
2937 process any command should be handled within host.
2938 decide any command should be send to HAL or not
2939
2940 \param - ftmCmd - Pointer FTM Commad Buffer
2941
2942 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002943 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002944 0, Process Host command success, not need to send CMD to HAL
2945 1, Process Host command success, need to send CMD to HAL
2946
2947 --------------------------------------------------------------------------*/
2948int wlan_hdd_process_ftm_host_cmd
2949(
2950 hdd_context_t *pHddCtx,
2951 void *ftmCmd
2952)
2953{
2954 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2955 int needToRouteHal = 1;
2956 int hostState = 1;
2957
2958 switch(pFTMCmd->msgId)
2959 {
2960 case PTT_MSG_GET_NV_TABLE:
2961 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2962 needToRouteHal = 0;
2963 break;
2964
2965 case PTT_MSG_SET_NV_TABLE:
2966 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2967 /* Temp NV Operation will be isolated to host
2968 needToRouteHal = 1; */
2969 needToRouteHal = 0;
2970 break;
2971
2972 case PTT_MSG_BLANK_NV:
2973 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2974 needToRouteHal = 1;
2975 break;
2976
2977 case PTT_MSG_DEL_NV_TABLE:
2978 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2979 needToRouteHal = 1;
2980 break;
2981
2982 case PTT_MSG_GET_NV_FIELD:
2983 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2984 needToRouteHal = 0;
2985 break;
2986
2987 case PTT_MSG_SET_NV_FIELD:
2988 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2989 needToRouteHal = 0;
2990 break;
2991
2992 case PTT_MSG_STORE_NV_TABLE:
2993 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2994 needToRouteHal = 0;
2995 break;
2996
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002997 case PTT_MSG_GET_NV_BIN:
2998 case PTT_MSG_GET_DICTIONARY:
2999 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3000 needToRouteHal = 0;
3001 break;
3002
3003 case PTT_MSG_SET_NV_BIN:
3004 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3005 needToRouteHal = 0;
3006 break;
3007
Jeff Johnson295189b2012-06-20 16:38:30 -07003008 case PTT_MSG_DBG_READ_REGISTER:
3009 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3010 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3011 needToRouteHal = 0;
3012 break;
3013
3014 case PTT_MSG_DBG_WRITE_REGISTER:
3015 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3016 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3017 needToRouteHal = 0;
3018 break;
3019
3020 case PTT_MSG_DBG_READ_MEMORY:
3021 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3022 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3023 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3024 needToRouteHal = 0;
3025 break;
3026
3027 case PTT_MSG_DBG_WRITE_MEMORY:
3028 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3029 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3030 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3031 needToRouteHal = 0;
3032 break;
3033
3034 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3035 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3036 needToRouteHal = 0;
3037 break;
3038
3039 default:
3040 needToRouteHal = 1;
3041 break;
3042 }
3043
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003044 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003045 {
3046 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3047 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003048 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003049 }
3050
3051 return needToRouteHal;
3052}
Jeff Johnson295189b2012-06-20 16:38:30 -07003053
3054/**---------------------------------------------------------------------------
3055
3056 \brief wlan_hdd_process_ftm_cmd() -
3057
3058 This function process the commands received from the ptt socket application.
3059
3060 \param - pAdapter - Pointer HDD Context.
3061
3062 \param - wnl - Pointer to the ANI netlink header.
3063
3064 \return - none
3065
3066 --------------------------------------------------------------------------*/
3067
3068void wlan_hdd_process_ftm_cmd
3069(
3070 hdd_context_t *pHddCtx,
3071 tAniNlHdr *wnl
3072)
3073{
3074 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3075 v_U16_t cmd_len;
3076 v_U8_t *pftm_data;
3077 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003078 int hostState;
3079 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003080
3081 ENTER();
3082
Jeff Johnsone7245742012-09-05 17:12:55 -07003083 //Delay to fix NV write failure on JB
3084 vos_busy_wait(10000); //10ms
3085
Jeff Johnson295189b2012-06-20 16:38:30 -07003086 if (!pRequestBuf) {
3087
Arif Hussain6d2a3322013-11-17 19:50:10 -08003088 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003089 return ;
3090 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303091
3092 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3093 {
3094 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3095 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3096 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3097 return ;
3098 }
3099
Jeff Johnson295189b2012-06-20 16:38:30 -07003100 /*Save the received request*/
3101 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3102
3103 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3104 /*Save the received request netlink header used for sending the response*/
3105 pHddCtx->ftm.wnl = wnl;
3106 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3107
Arif Hussain6d2a3322013-11-17 19:50:10 -08003108 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003109
3110 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3111 wlan_ftm_send_response(pHddCtx);
3112 return ;
3113 }
3114
3115 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3116 {
3117 case WLAN_FTM_START:
3118 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3119
Arif Hussain6d2a3322013-11-17 19:50:10 -08003120 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003121 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3122 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3123 wlan_ftm_send_response(pHddCtx);
3124 return;
3125 }
3126
3127 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3128 {
3129 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3130 ,__func__);
3131 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3132 wlan_ftm_send_response(pHddCtx);
3133 return;
3134 }
3135 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3136 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3137 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3138 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3139
3140 wlan_ftm_send_response(pHddCtx);
3141
3142 break;
3143
3144 case WLAN_FTM_STOP:
3145 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3146
Arif Hussain6d2a3322013-11-17 19:50:10 -08003147 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003148 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3149 wlan_ftm_send_response(pHddCtx);
3150 return;
3151 }
3152
3153 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3154
3155 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3156 wlan_ftm_send_response(pHddCtx);
3157 return;
3158 }
3159
3160 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3161 /* This would send back the Command Success Status */
3162 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3163
3164 wlan_ftm_send_response(pHddCtx);
3165
3166 break;
3167
3168 case WLAN_FTM_CMD:
3169 /* if it is regular FTM command, pass it to HAL PHY */
3170 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003171 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003172 return;
3173 }
3174 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3175
Arif Hussain6d2a3322013-11-17 19:50:10 -08003176 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003177
3178 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3179 wlan_ftm_send_response(pHddCtx);
3180 return;
3181
3182 }
3183 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3184 cmd_len = pRequestBuf->ftm_hdr.data_len;
3185 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3186 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3187
Jeff Johnson295189b2012-06-20 16:38:30 -07003188 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3189 if (0 == hostState)
3190 {
3191 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3192 if (NULL == tempRspBuffer)
3193 {
3194 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003195 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003196 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3197 wlan_ftm_send_response(pHddCtx);
3198 return;
3199 }
3200 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3201 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3202 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3203 (unsigned char *) tempRspBuffer,
3204 tempRspBuffer->msgBodyLength);
3205 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3206 wlan_ftm_send_response(pHddCtx);
3207 vos_mem_free(tempRspBuffer);
3208 return;
3209 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003210 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003211 {
3212 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3213 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3214 wlan_ftm_send_response(pHddCtx);
3215 return;
3216 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003217
3218 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3219
Jeff Johnson295189b2012-06-20 16:38:30 -07003220
3221 /*Post the command to the HAL*/
3222 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3223
Arif Hussain6d2a3322013-11-17 19:50:10 -08003224 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003225 return;
3226
3227 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303228 /*After successful posting of message the command should be pending*/
3229 pHddCtx->ftm.IsCmdPending = TRUE;
3230
Jeff Johnson295189b2012-06-20 16:38:30 -07003231 /*Wait here until you get the response from HAL*/
3232 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3233 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303234 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3235 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3236 wlan_ftm_send_response(pHddCtx);
3237 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003238 return;
3239 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303240 /*This check will handle the case where the completion is sent by
3241 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3242 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3243 {
3244 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3245 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3246 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3247
3248 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3249 wlan_ftm_send_response(pHddCtx);
3250 pHddCtx->ftm.IsCmdPending = FALSE;
3251 return ;
3252 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003253
3254 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3255
3256 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3257
3258 wlan_ftm_send_response(pHddCtx);
3259 pHddCtx->ftm.IsCmdPending = FALSE;
3260 break;
3261
3262 default:
3263
Arif Hussain6d2a3322013-11-17 19:50:10 -08003264 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003265 return;
3266 }
3267
3268 EXIT();
3269 return;
3270} /* wlan_adp_ftm_cmd() */
3271
3272/**---------------------------------------------------------------------------
3273
3274 \brief wlan_ftm_priv_start_stop_ftm() -
3275
3276 This function is used for start/stop the ftm driver.
3277
3278 \param - pAdapter - Pointer HDD Context.
3279 - start - 1/0 to start/stop ftm driver.
3280
3281 \return - 0 for success, non zero for failure
3282
3283 --------------------------------------------------------------------------*/
3284
3285static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3286 v_U16_t start)
3287{
3288 VOS_STATUS status;
3289 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3290
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003291 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003292 {
3293 pHddCtx->ftm.cmd_iwpriv = TRUE;
3294 status = wlan_hdd_ftm_start(pHddCtx);
3295
3296 if (status != VOS_STATUS_SUCCESS)
3297 {
3298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3299 "FTM Start Failed");
3300 return VOS_STATUS_E_FAILURE;
3301 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303302 if (NULL == pMsgBuf)
3303 {
3304 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3305 if (NULL == pMsgBuf)
3306 {
3307 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3308 "%s:pMsgBuf is NULL", __func__);
3309 return VOS_STATUS_E_FAILURE;
3310 }
3311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003312 }
3313 else
3314 {
3315 status = wlan_ftm_stop(pHddCtx);
3316
3317 if (status != VOS_STATUS_SUCCESS)
3318 {
3319 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3320 "FTM Stop Failed");
3321 return VOS_STATUS_E_FAILURE;
3322 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303323 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3324 if (pMsgBuf)
3325 {
3326 vos_mem_free((v_VOID_t * )pMsgBuf);
3327 pMsgBuf = NULL;
3328 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003329 }
3330 return VOS_STATUS_SUCCESS;
3331}
3332
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303333
3334static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3335{
3336 unsigned int *table = NULL;
3337 int index = 0;
3338
3339 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3340 table = valid_channel;
3341 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3342 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3343 table = valid_channel_cb40;
3344 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3345 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3346 table = valid_channel_cb80;
3347
3348 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303349 {
3350 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3351 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303352 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303353 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303354
3355 while (table[index] != 0)
3356 {
3357 if (table[index] == channel)
3358 return VOS_STATUS_SUCCESS;
3359
3360 index++;
3361 }
3362
3363 return VOS_STATUS_E_FAILURE;
3364}
3365
3366
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303367static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3368{
3369 unsigned int primary_channel = center_channel;
3370
3371 if (center_channel <= 14)
3372 return primary_channel ;
3373
3374 switch (cb)
3375 {
3376 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3377 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3378 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3379 primary_channel -= 2;
3380 break;
3381
3382
3383 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3384 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3385 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3386 primary_channel += 2;
3387 break;
3388
3389 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3390 primary_channel -= 6;
3391 break;
3392
3393 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3394 primary_channel += 6;
3395 break;
3396 }
3397
3398 return primary_channel;
3399
3400}
3401
Jeff Johnson295189b2012-06-20 16:38:30 -07003402/**---------------------------------------------------------------------------
3403
3404 \brief wlan_ftm_priv_set_channel() -
3405
3406 This function is used for setting the channel to the halphy ptt module.
3407
3408 \param - pAdapter - Pointer HDD Context.
3409 - channel - Channel Number 1-14.
3410
3411 \return - 0 for success, non zero for failure
3412
3413 --------------------------------------------------------------------------*/
3414
3415static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3416{
Jeff Johnson295189b2012-06-20 16:38:30 -07003417 uPttMsgs *pMsgBody;
3418 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303419 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003420 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3421
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303422 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003423 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303424 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3425 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003426 return VOS_STATUS_E_FAILURE;
3427 }
3428
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303429 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003430 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303431 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3432 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003433 return VOS_STATUS_E_FAILURE;
3434 }
3435
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303436 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 init_completion(&pHddCtx->ftm.ftm_comp_var);
3438 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3439 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3440
3441 pMsgBody = &pMsgBuf->msgBody;
3442
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303443 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003444
Arif Hussain6d2a3322013-11-17 19:50:10 -08003445 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303446 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003447
3448 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3449
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303450 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003451 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303452 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3453 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003454 status = VOS_STATUS_E_FAILURE;
3455 goto done;
3456
3457 }
c_hpothuffdb5272013-10-02 16:42:35 +05303458 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303459 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303460 if (0 >= ret )
3461 {
3462 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3463 FL("wait on ftm_comp_var failed %ld"), ret);
3464 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003465
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303466 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003467 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303468 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3469 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003470 status = VOS_STATUS_E_FAILURE;
3471 goto done;
3472
3473 }
3474done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003475
3476 return status;
3477}
3478
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303479
3480/**---------------------------------------------------------------------------
3481
3482 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3483
3484 This function is used for setting the power control mode for tx.
3485
3486 \param - pAdapter - Pointer HDD Context.
3487 - pwr_mode - power control mode 0-2.
3488
3489 \return - 0 for success, non zero for failure
3490
3491 --------------------------------------------------------------------------*/
3492
3493static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3494 v_U16_t pwr_mode)
3495{
3496 uPttMsgs *pMsgBody;
3497 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303498 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303499 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3500
3501 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3502 {
3503 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3504 "%s:Ftm has not started. Please start the ftm. ", __func__);
3505 return VOS_STATUS_E_FAILURE;
3506 }
3507
3508 if (pwr_mode > 2)
3509 {
3510 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3511 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3512 return VOS_STATUS_E_FAILURE;
3513 }
3514
3515 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3516 init_completion(&pHddCtx->ftm.ftm_comp_var);
3517 pMsgBody = &pMsgBuf->msgBody;
3518 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3519 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3520
3521 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3522 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3523
3524 if (status != VOS_STATUS_SUCCESS)
3525 {
3526 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3527 "%s:wlan_ftm_postmsg failed", __func__);
3528 status = VOS_STATUS_E_FAILURE;
3529 goto done;
3530 }
c_hpothuffdb5272013-10-02 16:42:35 +05303531 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303532 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303533 if (0 >= ret )
3534 {
3535 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3536 FL("wait on ftm_comp_var failed %ld"), ret);
3537 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303538
3539 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3540 {
3541 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3542 "%s:Ptt response status failed", __func__);
3543 status = VOS_STATUS_E_FAILURE;
3544 goto done;
3545 }
3546
3547 done:
3548 return status;
3549
3550}
3551
Jeff Johnson295189b2012-06-20 16:38:30 -07003552/**---------------------------------------------------------------------------
3553
3554 \brief wlan_ftm_priv_set_txpower() -
3555
3556 This function is used for setting the txpower to the halphy ptt module.
3557
3558 \param - pAdapter - Pointer HDD Context.
3559 - txpower - txpower Number 1-18.
3560
3561 \return - 0 for success, non zero for failure
3562
3563 --------------------------------------------------------------------------*/
3564
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303565static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3566 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003567{
Jeff Johnson295189b2012-06-20 16:38:30 -07003568 uPttMsgs *pMsgBody;
3569 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303570 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003571 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3572
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303573 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003574 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303575 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3576 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003577 return VOS_STATUS_E_FAILURE;
3578 }
3579
3580 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3581 * when tx pktgen is enabled
3582 */
3583 if (ftm_status.frameGenEnabled)
3584 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303585 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3586 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003587 return VOS_STATUS_E_FAILURE;
3588 }
3589
3590 if(!(txpower >= 9 && txpower <= 24))
3591 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303592 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3593 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003594 return VOS_STATUS_E_FAILURE;
3595 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003596
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303597 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3598 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003599 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3601 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3602
3603 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3604
3605 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3606
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303607 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003608 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303609 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3610 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003611 status = VOS_STATUS_E_FAILURE;
3612 goto done;
3613 }
c_hpothuffdb5272013-10-02 16:42:35 +05303614 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303615 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303616 if (0 >= ret )
3617 {
3618 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3619 FL("wait on ftm_comp_var failed %ld"), ret);
3620 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303622 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3625 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003626 status = VOS_STATUS_E_FAILURE;
3627 goto done;
3628 }
3629
3630 ftm_status.txpower = txpower ;
3631 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003632
3633 return status;
3634
3635}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303636
3637
3638static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3639 v_U16_t enable)
3640{
3641 tANI_U32 value = 0;
3642 tANI_U32 reg_addr;
3643 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303644
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303645 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3646 {
3647 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3648 "%s:Ftm has not started. Please start the ftm. ", __func__);
3649 return VOS_STATUS_E_FAILURE;
3650 }
3651
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303652 reg_addr = WCNSS_TXFIR_OFFSET;
3653
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303654 wpalReadRegister(reg_addr, &value);
3655 if (enable)
3656 {
3657 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3658 }
3659 else
3660 {
3661 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3662 }
3663
3664 wpalWriteRegister(reg_addr, value);
3665
3666 return VOS_STATUS_SUCCESS;
3667}
3668
3669
Jeff Johnson295189b2012-06-20 16:38:30 -07003670/**---------------------------------------------------------------------------
3671
3672 \brief wlan_ftm_priv_set_txrate() -
3673
3674 This function is used for setting the txrate to the halphy ptt module.
3675 It converts the user input string for txrate to the tx rate index.
3676
3677 \param - pAdapter - Pointer HDD Context.
3678 - txrate - Pointer to the tx rate string.
3679
3680 \return - 0 for success, non zero for failure
3681
3682 --------------------------------------------------------------------------*/
3683
3684static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3685{
3686 int ii;
3687 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3688 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3689 {
3690 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3691 return VOS_STATUS_E_FAILURE;
3692 }
3693
3694 /* do not allow to change setting when tx pktgen is enabled */
3695 if (ftm_status.frameGenEnabled)
3696 {
3697 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3698 return VOS_STATUS_E_FAILURE;
3699 }
3700
3701 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3702 {
3703 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3704 break;
3705 }
3706 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3707 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003708 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003709 return VOS_STATUS_E_FAILURE;
3710 }
3711
3712 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3713 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3714
3715 return VOS_STATUS_SUCCESS;
3716}
3717
3718/**---------------------------------------------------------------------------
3719
3720 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3721
3722 This function is used for start/stop the tx packet generation.
3723
3724 \param - pAdapter - Pointer HDD Context.
3725 - startStop - Value( 1/0) start/stop the tx packet generation.
3726
3727 \return - 0 for success, non zero for failure
3728
3729 --------------------------------------------------------------------------*/
3730
3731static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3732{
Jeff Johnson295189b2012-06-20 16:38:30 -07003733 uPttMsgs *pMsgBody;
3734 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303735 long ret;
3736
Jeff Johnson295189b2012-06-20 16:38:30 -07003737 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3738
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303739 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003740 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303741 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3742 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003743 return VOS_STATUS_E_FAILURE;
3744 }
3745
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303746 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003747 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303748 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3749 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003750 return VOS_STATUS_E_FAILURE;
3751 }
3752
3753 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3754 (!ftm_status.frameGenEnabled && startStop == 0))
3755 {
3756 return VOS_STATUS_SUCCESS ;
3757 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303758 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003759
Jeff Johnson295189b2012-06-20 16:38:30 -07003760 if (startStop == 1)
3761 {
3762 init_completion(&pHddCtx->ftm.ftm_comp_var);
3763 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3764 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3765 pMsgBody = &pMsgBuf->msgBody;
3766 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3767
3768 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303769 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003770 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303771 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3772 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003773 status = VOS_STATUS_E_FAILURE;
3774 goto done;
3775 }
3776
c_hpothuffdb5272013-10-02 16:42:35 +05303777 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303778 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303779 if (0 >= ret )
3780 {
3781 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3782 FL("wait on ftm_comp_var failed %ld"), ret);
3783 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303784 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003785 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303786 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3787 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003788 status = VOS_STATUS_E_FAILURE;
3789 goto done;
3790 }
3791 }
3792
3793 init_completion(&pHddCtx->ftm.ftm_comp_var);
3794 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3795 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3796 pMsgBody = &pMsgBuf->msgBody;
3797 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3798
3799 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3800 if(status != VOS_STATUS_SUCCESS)
3801 {
3802 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3803 status = VOS_STATUS_E_FAILURE;
3804 goto done;
3805 }
3806
c_hpothuffdb5272013-10-02 16:42:35 +05303807 ret = wait_for_completion_interruptible_timeout(
3808 &pHddCtx->ftm.ftm_comp_var,
3809 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3810 if (0 >= ret )
3811 {
3812 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3813 FL("wait on ftm_comp_var failed %ld"), ret);
3814 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003815 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3816 {
3817 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3818 status = VOS_STATUS_E_FAILURE;
3819 goto done;
3820 }
3821
3822done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003823
3824 if (status == VOS_STATUS_SUCCESS)
3825 {
3826 if (startStop == 1)
3827 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303828 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003829 }
3830 else
3831 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303832 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 }
3834 }
3835
3836 return status;
3837}
3838
3839
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303840
3841static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3842{
3843
3844 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3845 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3846 {
3847 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3848 "%s:Ftm has not started. Please start the ftm. ", __func__);
3849 return VOS_STATUS_E_FAILURE;
3850 }
3851
3852 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3853 {
3854 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3855 "%s:cb mode value is invalid ", __func__);
3856 return VOS_STATUS_E_FAILURE;
3857 }
3858
3859 ftm_status.cbmode = cbmode;
3860
3861 return VOS_STATUS_SUCCESS;
3862
3863}
3864
Jeff Johnson295189b2012-06-20 16:38:30 -07003865/**---------------------------------------------------------------------------
3866
3867 \brief wlan_ftm_rx_mode() -
3868
3869 This function is used for start/stop the rx packet generation.
3870
3871 \param - pAdapter - Pointer HDD Context.
3872 - rxmode - 0-disable RX.
3873 - 1-rx ALL frames
3874 - 2-rx 11 g/n frames
3875 - 3-rx 11b frames
3876
3877 \return - 0 for success, non zero for failure
3878
3879 --------------------------------------------------------------------------*/
3880
3881static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3882{
Jeff Johnson295189b2012-06-20 16:38:30 -07003883 uPttMsgs *pMsgBody;
3884 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303885 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003886
3887 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303888 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003889 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303890 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3891 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003892 return VOS_STATUS_E_FAILURE;
3893 }
3894
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303895 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003896 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303897 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3898 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003899 return VOS_STATUS_E_FAILURE;
3900 }
3901
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303902 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003903 init_completion(&pHddCtx->ftm.ftm_comp_var);
3904
3905 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3906 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3907
3908 pMsgBody = &pMsgBuf->msgBody;
3909
3910 switch(rxmode)
3911 {
3912 case RXMODE_DISABLE_ALL:
3913 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3914 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3915 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3916 break;
3917
3918 case RXMODE_ENABLE_ALL:
3919 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3920 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3921 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3922 break;
3923
3924 case RXMODE_ENABLE_11GN:
3925 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3926 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3927 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3928 break;
3929
3930 case RXMODE_ENABLE_11B:
3931 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3932 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3933 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3934 break;
3935
3936 }
3937
3938 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3939
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303940 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003941 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303942 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3943 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003944 status = VOS_STATUS_E_FAILURE;
3945 goto done;
3946 }
c_hpothuffdb5272013-10-02 16:42:35 +05303947 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303948 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303949 if (0 >= ret )
3950 {
3951 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3952 FL(" wait on ftm_comp_var failed %ld"), ret);
3953 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003954
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303955 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003956 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303957 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3958 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003959 status = VOS_STATUS_E_FAILURE;
3960 goto done;
3961 }
3962 ftm_status.rxmode = rxmode ;
3963done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003964
3965 return status;
3966}
3967
3968/**---------------------------------------------------------------------------
3969
3970 \brief wlan_ftm_priv_rx_pkt_clear() -
3971
3972 This function sets the rx pkt count to zero.
3973
3974 \param - pAdapter - Pointer HDD Context.
3975 - rx_pkt_clear - rx_pkt_clear value.
3976
3977 \return - 0 for success, non zero for failure
3978
3979 --------------------------------------------------------------------------*/
3980
3981static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3982{
Jeff Johnson295189b2012-06-20 16:38:30 -07003983 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303984 long ret;
3985
Jeff Johnson295189b2012-06-20 16:38:30 -07003986 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3987
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303988 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003989 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303990 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3991 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 return VOS_STATUS_E_FAILURE;
3993 }
3994
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303995 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07003996 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303997 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3998 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003999 return VOS_STATUS_E_FAILURE;
4000 }
4001
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304002 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004003 init_completion(&pHddCtx->ftm.ftm_comp_var);
4004 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
4005 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
4006
Jeff Johnson295189b2012-06-20 16:38:30 -07004007 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4008
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304009 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004010 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304011 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4012 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004013 status = VOS_STATUS_E_FAILURE;
4014 goto done;
4015 }
c_hpothuffdb5272013-10-02 16:42:35 +05304016 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304017 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304018 if (0 >= ret )
4019 {
4020 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4021 FL("wait on ftm_comp_var failed %ld"), ret);
4022 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004023
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304024 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004025 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304026 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4027 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004028 status = VOS_STATUS_E_FAILURE;
4029 goto done;
4030 }
4031done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004032
4033 return status;
4034}
4035
4036/**---------------------------------------------------------------------------
4037
4038 \brief wlan_ftm_priv_get_channel() -
4039
4040 This function gets the channel number from the halphy ptt module and
4041 returns the channel number to the application.
4042
4043 \param - pAdapter - Pointer HDD Context.
4044 - pChannel - Poniter to get the Channel number.
4045
4046 \return - 0 for success, non zero for failure
4047
4048 --------------------------------------------------------------------------*/
4049
4050static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4051{
Jeff Johnson295189b2012-06-20 16:38:30 -07004052 uPttMsgs *pMsgBody;
4053 VOS_STATUS status;
4054 v_U16_t freq;
4055 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304056 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004057
4058 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4059
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304060 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004061 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304062 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4063 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004064 return VOS_STATUS_E_FAILURE;
4065 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304066 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004067 init_completion(&pHddCtx->ftm.ftm_comp_var);
4068 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4069 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4070
4071 pMsgBody = &pMsgBuf->msgBody;
4072 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
4073
4074 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4075
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304076 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004077 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304078 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4079 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004080 status = VOS_STATUS_E_FAILURE;
4081 goto done;
4082
4083 }
c_hpothuffdb5272013-10-02 16:42:35 +05304084 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304085 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304086 if (0 >= ret )
4087 {
4088 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4089 FL("wait on ftm_comp_var failed %ld"), ret);
4090 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004091
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304092 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004093 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304094 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4095 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004096 status = VOS_STATUS_E_FAILURE;
4097 goto done;
4098 }
4099
4100 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4101
4102 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4103 indx++;
4104 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4105 {
4106 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4107 status = VOS_STATUS_E_FAILURE;
4108 goto done;
4109 }
4110
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004111 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004112
Arif Hussain6d2a3322013-11-17 19:50:10 -08004113 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004114 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004115
4116 return status;
4117}
4118
4119/**---------------------------------------------------------------------------
4120
4121 \brief wlan_ftm_priv_get_txpower() -
4122
4123 This function gets the TX power from the halphy ptt module and
4124 returns the TX power to the application.
4125
4126 \param - pAdapter - Pointer HDD Context.
4127 - pTxPwr - Poniter to get the Tx power.
4128
4129 \return - 0 for success, non zero for failure
4130
4131 --------------------------------------------------------------------------*/
4132
4133static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4134{
Jeff Johnson295189b2012-06-20 16:38:30 -07004135 uPttMsgs *pMsgBody;
4136 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304137 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004138 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4139
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304140 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304142 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4143 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004144 return VOS_STATUS_E_FAILURE;
4145 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304146 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004147 init_completion(&pHddCtx->ftm.ftm_comp_var);
4148 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4149 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4150
4151 pMsgBody = &pMsgBuf->msgBody;
4152
4153 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4154
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304155 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004156 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304157 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4158 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004159 status = VOS_STATUS_E_FAILURE;
4160 goto done;
4161 }
c_hpothuffdb5272013-10-02 16:42:35 +05304162 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304163 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304164 if (0 >= ret )
4165 {
4166 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4167 FL("wait on ftm_comp_var failed %ld"), ret);
4168 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004169
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304170 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004171 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304172 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4173 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004174 status = VOS_STATUS_E_FAILURE;
4175 goto done;
4176 }
4177 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4178
4179 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004180
4181 return status;
4182}
4183
4184/**---------------------------------------------------------------------------
4185
4186 \brief wlan_ftm_priv_get_ftm_version() -
4187
4188 This function gets ftm driver and firmware version.
4189
4190 \param - pAdapter - Pointer HDD Context.
4191 - pTxRate - Poniter to get the Tx rate.
4192
4193 \return - 0 for success, non zero for failure
4194
4195 --------------------------------------------------------------------------*/
4196
4197VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4198{
Jeff Johnson295189b2012-06-20 16:38:30 -07004199 uPttMsgs *pMsgBody;
4200 VOS_STATUS status;
4201 v_U32_t reg_val;
4202 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004203 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4204 int lenRes = 0;
4205 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304206 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004207
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304208 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004209 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304210 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4211 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004212 return VOS_STATUS_E_FAILURE;
4213 }
4214
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304215 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004216 init_completion(&pHddCtx->ftm.ftm_comp_var);
4217 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4218 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4219
4220 pMsgBody = &pMsgBuf->msgBody;
4221 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4222
4223 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4224
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304225 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004226 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304227 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4228 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004229 status = VOS_STATUS_E_FAILURE;
4230 goto done;
4231
4232 }
c_hpothuffdb5272013-10-02 16:42:35 +05304233 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304234 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304235 if (0 >= ret )
4236 {
4237 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4238 FL("wait on ftm_comp_var failed %ld"), ret);
4239 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004240
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304241 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004242 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304243 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4244 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004245 status = VOS_STATUS_E_FAILURE;
4246 goto done;
4247 }
4248
4249 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4250
4251 init_completion(&pHddCtx->ftm.ftm_comp_var);
4252
4253 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4254 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4255
4256 pMsgBody = &pMsgBuf->msgBody;
4257
4258 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4259
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304260 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004261 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304262 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4263 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004264 status = VOS_STATUS_E_FAILURE;
4265 goto done;
4266 }
c_hpothuffdb5272013-10-02 16:42:35 +05304267 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304268 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304269 if (0 >= ret )
4270 {
4271 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4272 FL("wait on ftm_comp_var failed %ld"), ret);
4273 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004274
4275 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4276 if(lenRes < 0 || lenRes >= lenBuf)
4277 {
4278 status = VOS_STATUS_E_FAILURE;
4279 goto done;
4280 }
4281
4282 buf += lenRes;
4283 lenBuf -= lenRes;
4284
4285 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004286 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 -07004287 if(lenRes < 0 || lenRes >= lenBuf)
4288 {
4289 status = VOS_STATUS_E_FAILURE;
4290 goto done;
4291 }
4292
4293 buf += lenRes;
4294 lenBuf -= lenRes;
4295
4296 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4297 if(lenRes < 0 || lenRes >= lenBuf)
4298 {
4299 status = VOS_STATUS_E_FAILURE;
4300 goto done;
4301 }
4302
4303 buf += lenRes;
4304 lenBuf -= lenRes;
4305
Jeff Johnson295189b2012-06-20 16:38:30 -07004306
4307done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004308
4309 return status;
4310
4311}
4312
4313/**---------------------------------------------------------------------------
4314
4315 \brief wlan_ftm_priv_get_txrate() -
4316
4317 This function gets the TX rate from the halphy ptt module and
4318 returns the TX rate to the application.
4319
4320 \param - pAdapter - Pointer HDD Context.
4321 - pTxRate - Poniter to get the Tx rate.
4322
4323 \return - 0 for success, non zero for failure
4324
4325 --------------------------------------------------------------------------*/
4326
4327static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4328{
Jeff Johnson295189b2012-06-20 16:38:30 -07004329 uPttMsgs *pMsgBody;
4330 VOS_STATUS status;
4331 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304332 long ret;
4333
Jeff Johnson295189b2012-06-20 16:38:30 -07004334 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4335
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304336 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004337 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304338 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4339 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004340 return VOS_STATUS_E_FAILURE;
4341 }
4342
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304343 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004344 init_completion(&pHddCtx->ftm.ftm_comp_var);
4345 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4346 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4347
4348 pMsgBody = &pMsgBuf->msgBody;
4349
4350 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4351
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304352 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004353 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304354 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4355 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004356 status = VOS_STATUS_E_FAILURE;
4357 goto done;
4358 }
c_hpothuffdb5272013-10-02 16:42:35 +05304359 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304360 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304361 if (0 >= ret )
4362 {
4363 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4364 FL("wait on ftm_comp_var failed %ld"), ret);
4365 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004366
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304367 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004368
4369 rate_index = pMsgBody->GetTxPowerReport.rate;
4370 }
4371 else {
4372 /*Return the default rate*/
4373 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304374 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4375 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004376 status = VOS_STATUS_E_FAILURE;
4377 goto done;
4378 }
4379
4380 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4381 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4382 break;
4383 }
4384 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4385 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004386 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004387 status = VOS_STATUS_E_FAILURE;
4388 goto done;
4389 }
4390 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4391done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004392
4393 return status;
4394
4395}
4396
4397/**---------------------------------------------------------------------------
4398
4399 \brief wlan_ftm_priv_get_rx_pkt_count() -
4400
4401 This function gets the rx pkt count from the halphy ptt module and
4402 returns the rx pkt count to the application.
4403
4404 \param - pAdapter - Pointer HDD Context.
4405 - pRxPktCnt - Poniter to get the rx pkt count.
4406
4407 \return - 0 for success, non zero for failure
4408
4409 --------------------------------------------------------------------------*/
4410
4411static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4412{
Jeff Johnson295189b2012-06-20 16:38:30 -07004413 uPttMsgs *pMsgBody;
4414 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304415 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004416 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4417
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304418 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304420 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4421 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004422 return VOS_STATUS_E_FAILURE;
4423 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304424 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004425 init_completion(&pHddCtx->ftm.ftm_comp_var);
4426 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4427 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4428
4429 pMsgBody = &pMsgBuf->msgBody;
4430
4431 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4432
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304433 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004434 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304435 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4436 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004437 status = VOS_STATUS_E_FAILURE;
4438 goto done;
4439 }
c_hpothuffdb5272013-10-02 16:42:35 +05304440 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304441 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304442 if (0 >= ret )
4443 {
4444 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4445 FL("wait on ftm_comp_var failed %ld"), ret);
4446 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004447
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304448 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004449 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4451 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004452 status = VOS_STATUS_E_FAILURE;
4453 goto done;
4454 }
4455 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4456done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004457
4458 return status;
4459}
4460
4461/**---------------------------------------------------------------------------
4462
4463 \brief wlan_ftm_priv_get_rx_rssi() -
4464
4465 This function gets the rx rssi from the halphy ptt module and
4466 returns the rx rssi to the application.
4467
4468 \param - pAdapter - Pointer HDD Context.
4469 - buf - Poniter to get rssi of Rx chains
4470
4471 \return - 0 for success, non zero for failure
4472
4473 --------------------------------------------------------------------------*/
4474
4475static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4476{
Jeff Johnson295189b2012-06-20 16:38:30 -07004477 uPttMsgs *pMsgBody;
4478 VOS_STATUS status;
4479 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304480 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004481
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304482 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004483 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304484 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4485 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004486 return VOS_STATUS_E_FAILURE;
4487 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304488 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004489 init_completion(&pHddCtx->ftm.ftm_comp_var);
4490 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4491 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4492
4493 pMsgBody = &pMsgBuf->msgBody;
4494
4495 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4496
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304497 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004498 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304499 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4500 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004501 status = VOS_STATUS_E_FAILURE;
4502 goto done;
4503 }
c_hpothuffdb5272013-10-02 16:42:35 +05304504 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304505 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304506 if (0 >= ret )
4507 {
4508 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4509 FL("wait on ftm_comp_var failed %ld"), ret);
4510 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004511
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304512 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004513 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304514 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4515 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004516 status = VOS_STATUS_E_FAILURE;
4517 goto done;
4518 }
4519
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004520 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4521 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004522 pMsgBody->GetRxRssi.rssi.rx[1]);
4523
4524 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4525 {
4526 status = VOS_STATUS_E_FAILURE;
4527 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004528
Jeff Johnson295189b2012-06-20 16:38:30 -07004529done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004530
4531 return status;
4532}
4533
4534/**---------------------------------------------------------------------------
4535
4536 \brief wlan_ftm_priv_get_mac_address() -
4537
4538 This function gets the mac address from the halphy ptt module and
4539 returns the mac address to the application.
4540
4541 \param - pAdapter - Pointer HDD Context.
4542 - buf - Poniter to get the mac address.
4543
4544 \return - 0 for success, non zero for failure
4545
4546 --------------------------------------------------------------------------*/
4547
4548static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4549{
4550 v_BOOL_t itemIsValid = VOS_FALSE;
4551 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4552 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004553
Jeff Johnson295189b2012-06-20 16:38:30 -07004554 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4555
4556 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4557 {
4558 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4559 return VOS_STATUS_E_FAILURE;
4560 }
4561 /*Check the NV FIELD is valid or not*/
4562 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4563 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004564 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004565 {
4566 vos_nv_readMacAddress(macAddr);
4567
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004568 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4569 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004570 MAC_ADDR_ARRAY(macAddr));
4571 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4572 {
4573 return VOS_STATUS_E_FAILURE;
4574 }
4575 }
4576 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004577 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004578 {
4579 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004580 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4581 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004582 MAC_ADDR_ARRAY(macAddr));
4583
4584 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4585 {
4586 return VOS_STATUS_E_FAILURE;
4587 }
4588 }
4589 return VOS_STATUS_SUCCESS;
4590}
4591
4592/**---------------------------------------------------------------------------
4593
4594 \brief wlan_ftm_priv_set_mac_address() -
4595
4596 This function sets the mac address to the halphy ptt module and
4597 sends the netlink message to the ptt socket application which writes
4598 the macaddress to the qcom_wlan_nv.bin file
4599
4600 \param - pAdapter - Pointer HDD Context.
4601 - buf - Poniter to the macaddress.
4602
4603 \return - 0 for success, non zero for failure
4604
4605 --------------------------------------------------------------------------*/
4606
4607static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4608{
Jeff Johnson295189b2012-06-20 16:38:30 -07004609 uPttMsgs *pMsgBody;
4610 VOS_STATUS status;
4611 int macAddr[VOS_MAC_ADDRESS_LEN];
4612 v_U8_t *pMacAddress;
4613 v_U8_t ii;
4614 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304615 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004616
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304617 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004618 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304619 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4620 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004621 return VOS_STATUS_E_FAILURE;
4622 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304623 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004624 init_completion(&pHddCtx->ftm.ftm_comp_var);
4625 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4626 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4627
4628 pMsgBody = &pMsgBuf->msgBody;
4629 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4630
4631 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004632 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]))
4633 {
4634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4635 "Invalid MacAddress Input %s", buf);
4636 return VOS_STATUS_E_FAILURE;
4637 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004638
Arif Hussain24bafea2013-11-15 15:10:03 -08004639 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4640 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004641
4642
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004643 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004644
4645 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4646 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4647
4648
Arif Hussain24bafea2013-11-15 15:10:03 -08004649 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4650 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004651 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4652
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304653 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004654 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304655 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4656 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004657 status = VOS_STATUS_E_FAILURE;
4658 goto done;
4659 }
c_hpothuffdb5272013-10-02 16:42:35 +05304660 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304661 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304662 if (0 >= ret )
4663 {
4664 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4665 FL("wait on ftm_comp_var failed %ld"), ret);
4666 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004667
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304668 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004669 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304670 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4671 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004672 status = VOS_STATUS_E_FAILURE;
4673 goto done;
4674 }
4675
Arif Hussain6d2a3322013-11-17 19:50:10 -08004676 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004677
4678 init_completion(&pHddCtx->ftm.ftm_comp_var);
4679 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4680
4681 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4682 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4683
4684 pMsgBody = &pMsgBuf->msgBody;
4685
4686 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4687
4688 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4689
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304690 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004691 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304692 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4693 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004694 status = VOS_STATUS_E_FAILURE;
4695 goto done;
4696 }
4697
c_hpothuffdb5272013-10-02 16:42:35 +05304698 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304699 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304700 if (0 >= ret )
4701 {
4702 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4703 FL("wait on ftm_comp_var failed %ld"), ret);
4704 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004705done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004706
4707 return VOS_STATUS_SUCCESS;
4708}
4709
4710/* set param sub-ioctls */
4711static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4712 union iwreq_data *wrqu, char *extra)
4713{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004714 int ret,sub_cmd;
4715 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004716 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004718 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004719
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004720 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004721 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004722 length = wrqu->data.length;
4723 sub_cmd = wrqu->data.flags;
4724 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4725
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004726 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4727 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4728 * odd number which assigns set_args to zero.we assisgn memory using
4729 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004730 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004731 param = kzalloc(length + 1, GFP_KERNEL);
4732 if (!param)
4733 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004734
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004735 if (copy_from_user(param, pointer, length))
4736 {
4737 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4738 "%s:Failed to get user data %s", __func__, param);
4739
4740 ret = -EINVAL;
4741 goto OUT;
4742 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004743
4744 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4745 "%s: Received length %d", __func__, length);
4746
4747 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004748 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004749
4750 switch(sub_cmd)
4751 {
4752 case WE_SET_MAC_ADDRESS:
4753 {
4754
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004755 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004756 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004757
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004758 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004759
4760 if(status != VOS_STATUS_SUCCESS)
4761 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004762 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004763 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004764
Jeff Johnson295189b2012-06-20 16:38:30 -07004765 ret = -EINVAL;
4766 }
4767
Wilson Yang7c471652013-12-20 16:36:44 -08004768 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004769 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004770 case WE_SET_TX_RATE:
4771 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004772 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004773
4774 if(status != VOS_STATUS_SUCCESS)
4775 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004776 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004777 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004778
4779 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004780 }
4781
4782 break;
Wilson Yang7c471652013-12-20 16:36:44 -08004783 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004784 default:
4785 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004786 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004787 ret = -EINVAL;
4788 break;
4789 }
4790 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004791
4792OUT:
4793 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004794 return ret;
4795}
4796
4797static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4798 union iwreq_data *wrqu, char *extra)
4799{
4800 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4801 int *value = (int *)extra;
4802 int sub_cmd = value[0];
4803 int set_value = value[1];
4804 int ret = 0; /* success */
4805 VOS_STATUS status;
4806
4807 switch(sub_cmd)
4808 {
4809 case WE_FTM_ON_OFF:
4810 {
4811 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4812
4813 if(status != VOS_STATUS_SUCCESS)
4814 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004815 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004816 ret = -EINVAL;
4817 }
4818
4819 break;
4820 }
4821
4822 case WE_TX_PKT_GEN:
4823 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4824
4825 if(status != VOS_STATUS_SUCCESS)
4826 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004827 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004828 ret = -EINVAL;
4829 }
4830 break;
4831
4832 case WE_SET_TX_IFS:
4833 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4834
4835 if(status != VOS_STATUS_SUCCESS)
4836 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004837 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004838 ret = -EINVAL;
4839 }
4840 break;
4841
4842 case WE_SET_TX_PKT_CNT:
4843 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4844
4845 if(status != VOS_STATUS_SUCCESS)
4846 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004847 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004848 ret = -EINVAL;
4849 }
4850 break;
4851
4852 case WE_SET_TX_PKT_LEN:
4853 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4854
4855 if(status != VOS_STATUS_SUCCESS)
4856 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004857 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004858 ret = -EINVAL;
4859 }
4860 break;
4861
4862 case WE_SET_CHANNEL:
4863 {
4864 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4865
4866 if(status != VOS_STATUS_SUCCESS)
4867 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004868 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004869 ret = -EINVAL;
4870 }
4871 break;
4872 }
4873 case WE_SET_TX_POWER:
4874 {
4875 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4876
4877 if(status != VOS_STATUS_SUCCESS)
4878 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004879 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004880 ret = -EINVAL;
4881 }
4882 break;
4883 }
4884 case WE_CLEAR_RX_PKT_CNT:
4885 {
4886 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4887
4888 if(status != VOS_STATUS_SUCCESS)
4889 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004890 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004891 ret = -EINVAL;
4892 }
4893 break;
4894 }
4895 case WE_RX:
4896 {
4897 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4898
4899 if(status != VOS_STATUS_SUCCESS)
4900 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004901 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004902 ret = -EINVAL;
4903 }
4904 break;
4905 }
4906 case WE_ENABLE_CHAIN:
4907 {
4908 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4909
4910 if(status != VOS_STATUS_SUCCESS)
4911 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004912 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004913 ret = -EINVAL;
4914 }
4915 break;
4916 }
4917
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304918 case WE_SET_PWR_CNTL_MODE:
4919 {
4920 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4921 if (status != VOS_STATUS_SUCCESS)
4922 {
4923 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4924 status);
4925 ret = -EINVAL;
4926 }
4927 break;
4928 }
4929
4930 case WE_ENABLE_DPD:
4931 {
4932 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4933 if (status != VOS_STATUS_SUCCESS)
4934 {
4935 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4936 ret = -EINVAL;
4937 }
4938 break;
4939 }
4940
4941 case WE_SET_CB:
4942 {
4943 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4944 if (status != VOS_STATUS_SUCCESS)
4945 {
4946 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4947 ret = -EINVAL;
4948 }
4949 break;
4950 }
4951
Jeff Johnson295189b2012-06-20 16:38:30 -07004952 default:
4953 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004954 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004955 sub_cmd, set_value);
4956 break;
4957 }
4958 }
4959
4960 return ret;
4961}
4962
4963/* get param sub-ioctls */
4964static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4965 union iwreq_data *wrqu, char *extra)
4966{
4967 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4968 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004969 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004970 VOS_STATUS status;
4971
4972 switch (value[0])
4973 {
4974 case WE_GET_CHANNEL:
4975 {
4976 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4977
4978 if(status != VOS_STATUS_SUCCESS)
4979 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004980 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004981 ret = -EINVAL;
4982 }
4983 break;
4984 }
4985 case WE_GET_TX_POWER:
4986 {
4987 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4988
4989 if(status != VOS_STATUS_SUCCESS)
4990 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004991 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004992 ret = -EINVAL;
4993 }
4994 break;
4995 }
4996 case WE_GET_RX_PKT_CNT:
4997 {
4998 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4999
5000 if(status != VOS_STATUS_SUCCESS)
5001 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005002 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005003 ret = -EINVAL;
5004 }
5005 break;
5006 }
5007 default:
5008 {
5009 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5010 break;
5011 }
5012 }
5013
5014 return ret;
5015}
5016
5017static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5018 union iwreq_data *wrqu, char *extra)
5019{
5020 int sub_cmd = wrqu->data.flags;
5021 VOS_STATUS status;
5022 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5023
5024 switch(sub_cmd)
5025 {
5026 case WE_GET_MAC_ADDRESS:
5027 {
5028 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5029
5030 if(status != VOS_STATUS_SUCCESS)
5031 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005032 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005033 return -EINVAL;
5034 }
5035 wrqu->data.length = strlen(extra)+1;
5036 break;
5037 }
5038 case WE_GET_TX_RATE:
5039 {
5040 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5041
5042 if(status != VOS_STATUS_SUCCESS)
5043 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005044 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005045 return -EINVAL;
5046 }
5047
5048 wrqu->data.length = strlen(extra)+1;
5049 break;
5050 }
5051 case WE_GET_FTM_VERSION:
5052 {
5053 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5054
5055 if(status != VOS_STATUS_SUCCESS)
5056 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005057 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005058 return -EINVAL;
5059 }
5060 wrqu->data.length = strlen(extra)+1;
5061 break;
5062 }
5063 case WE_GET_FTM_STATUS:
5064 {
5065 status = wlan_ftm_priv_get_status(pAdapter, extra);
5066
5067 if(status != VOS_STATUS_SUCCESS)
5068 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005069 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005070 return -EINVAL;
5071 }
5072
5073 wrqu->data.length = strlen(extra)+1;
5074 break;
5075 }
5076 case WE_GET_RX_RSSI:
5077 {
5078 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5079
5080 if(status != VOS_STATUS_SUCCESS)
5081 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005082 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005083 return -EINVAL;
5084 }
5085
5086 wrqu->data.length = strlen(extra)+1;
5087 break;
5088 }
5089 default:
5090 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005091 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005092 break;
5093 }
5094 }
5095
5096 return 0;
5097}
Jeff Johnson295189b2012-06-20 16:38:30 -07005098
5099VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5100{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005101#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005102 tAniHdr *wmsg = NULL;
5103 v_U8_t *pBuf;
5104 hdd_context_t *pHddCtx = NULL;
5105 v_CONTEXT_t pVosContext= NULL;
5106
5107 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5108 if(pBuf == NULL)
5109 {
5110 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5111 return VOS_STATUS_E_NOMEM;
5112 }
5113 wmsg = (tAniHdr*)pBuf;
5114 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5115 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5116 wmsg->length = FTM_SWAP16(wmsg->length);
5117 pBuf += sizeof(tAniHdr);
5118
5119 /*Get the global context */
5120 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5121
5122 /*Get the Hdd Context */
5123 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5124 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5125
5126 /* EfS command Code */
5127 *(v_U32_t*)pBuf = 0x000000EF;
5128
5129 pBuf += sizeof(v_U32_t);
5130
5131 memcpy(pBuf, pData,data_len);
5132
5133 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
5134 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
5135
Arif Hussain6d2a3322013-11-17 19:50:10 -08005136 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 -07005137 vos_mem_free((v_VOID_t*)wmsg);
5138 return VOS_STATUS_E_FAILURE;
5139 }
5140 }
5141 else {
5142 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
5143
Arif Hussain6d2a3322013-11-17 19:50:10 -08005144 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 -07005145 vos_mem_free((v_VOID_t*)wmsg);
5146 return VOS_STATUS_E_FAILURE;
5147 }
5148 }
5149
5150 vos_mem_free((v_VOID_t*)wmsg);
5151#endif //FTM and ANDROID
5152
5153 return VOS_STATUS_SUCCESS;
5154}
5155
Jeff Johnson295189b2012-06-20 16:38:30 -07005156/* action sub-ioctls */
5157static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5158 union iwreq_data *wrqu, char *extra)
5159{
5160 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005161 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005162
5163 switch (sub_cmd)
5164 {
5165 case WE_SET_NV_DEFAULTS:
5166 {
5167 v_U8_t *pu8buf,*pTempBuf;
5168 v_U16_t size;
5169 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005170 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005171 pu8buf = vos_mem_malloc(size);
5172 if(pu8buf == NULL)
5173 {
5174 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5175 return VOS_STATUS_E_NOMEM;
5176 }
5177 memset(pu8buf,0,size);
5178 pTempBuf = pu8buf;
5179 pTempBuf += sizeof(v_U32_t);
5180 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5181
5182 wlan_write_to_efs(pu8buf,size);
5183 vos_mem_free(pu8buf);
5184 }
5185
5186 default:
5187 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005188 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005189 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5190 break;
5191 }
5192 }
5193
5194 return ret;
5195}
5196
Jeff Johnson295189b2012-06-20 16:38:30 -07005197static const iw_handler we_ftm_private[] = {
5198
5199 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5200 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5201 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5202 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5203 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07005204};
5205
5206/*Maximum command length can be only 15 */
5207static const struct iw_priv_args we_ftm_private_args[] = {
5208
5209 /* handlers for main ioctl */
5210 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5211 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5212 0,
5213 "" },
5214
5215 { WE_FTM_ON_OFF,
5216 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5217 0,
5218 "ftm" },
5219
5220 { WE_TX_PKT_GEN,
5221 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5222 0,
5223 "tx" },
5224
5225 { WE_SET_TX_IFS,
5226 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5227 0,
5228 "set_txifs" },
5229
5230 { WE_SET_TX_PKT_CNT,
5231 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5232 0,
5233 "set_txpktcnt" },
5234
5235 { WE_SET_TX_PKT_LEN,
5236 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5237 0,
5238 "set_txpktlen" },
5239
5240 { WE_SET_CHANNEL,
5241 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5242 0,
5243 "set_channel" },
5244
5245 { WE_SET_TX_POWER,
5246 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5247 0,
5248 "set_txpower" },
5249
5250 { WE_CLEAR_RX_PKT_CNT,
5251 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5252 0,
5253 "clr_rxpktcnt" },
5254
5255 { WE_RX,
5256 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5257 0,
5258 "rx" },
5259
5260 { WE_ENABLE_CHAIN,
5261 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5262 0,
5263 "ena_chain" },
5264
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305265 { WE_SET_PWR_CNTL_MODE,
5266 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5267 0,
5268 "pwr_cntl_mode" },
5269
5270 { WE_ENABLE_DPD,
5271 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5272 0,
5273 "ena_dpd" },
5274
5275 { WE_SET_CB,
5276 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5277 0,
5278 "set_cb" },
5279
Jeff Johnson295189b2012-06-20 16:38:30 -07005280 /* handlers for main ioctl */
5281 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5282 0,
5283 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5284 "" },
5285
5286 { WE_GET_CHANNEL,
5287 0,
5288 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5289 "get_channel" },
5290
5291 { WE_GET_TX_POWER,
5292 0,
5293 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5294 "get_txpower" },
5295
5296 { WE_GET_RX_PKT_CNT,
5297 0,
5298 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5299 "get_rxpktcnt" },
5300
5301 /* handlers for main ioctl */
5302 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5303 IW_PRIV_TYPE_CHAR| 512,
5304 0,
5305 "" },
5306
5307 { WE_SET_MAC_ADDRESS,
5308 IW_PRIV_TYPE_CHAR| 512,
5309 0,
5310 "set_mac_address" },
5311
5312 { WE_SET_TX_RATE,
5313 IW_PRIV_TYPE_CHAR | 512,
5314 0,
5315 "set_txrate" },
5316
5317 /* handlers for main ioctl */
5318 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5319 0,
5320 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5321 "" },
5322
5323 { WE_GET_MAC_ADDRESS,
5324 0,
5325 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5326 "get_mac_address" },
5327
5328 { WE_GET_FTM_VERSION,
5329 0,
5330 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5331 "ftm_version" },
5332
5333 { WE_GET_TX_RATE,
5334 0,
5335 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5336 "get_txrate" },
5337
5338 { WE_GET_FTM_STATUS,
5339 0,
5340 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5341 "get_status" },
5342
5343 { WE_GET_RX_RSSI,
5344 0,
5345 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5346 "get_rx_rssi" },
5347
Jeff Johnson295189b2012-06-20 16:38:30 -07005348 /* handlers for main ioctl */
5349 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5350 0,
5351 0,
5352 "" },
5353
5354 /* handlers for sub-ioctl */
5355 { WE_SET_NV_DEFAULTS,
5356 0,
5357 0,
5358 "set_nv_defaults" },
5359
5360};
5361
5362const struct iw_handler_def we_ftm_handler_def = {
5363 .num_standard = 0,
5364 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5365 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5366
5367 .standard = (iw_handler *)NULL,
5368 .private = (iw_handler *)we_ftm_private,
5369 .private_args = we_ftm_private_args,
5370 .get_wireless_stats = NULL,
5371};
5372
5373static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5374{
5375
5376 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5377
5378 // Zero the memory. This zeros the profile structure.
5379 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005380
Jeff Johnson295189b2012-06-20 16:38:30 -07005381 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5382
5383 return 0;
5384}
5385
Jeff Johnson295189b2012-06-20 16:38:30 -07005386
5387VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5388{
Jeff Johnson295189b2012-06-20 16:38:30 -07005389 ftm_rsp_msg_t *pFtmMsgRsp;
5390
5391 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5392 hdd_context_t *pHddCtx;
5393 v_CONTEXT_t pVosContext= NULL;
5394
5395 ENTER();
5396
5397 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5398
5399 if (!message )
5400 {
5401 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5402 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5403 return VOS_STATUS_E_INVAL;
5404 }
5405 /*Get the global context */
5406 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5407
5408 /*Get the Hdd Context */
5409 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5410
5411 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5412
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305413 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005414 complete(&pHddCtx->ftm.ftm_comp_var);
5415 }
5416 else {
5417 /*Response length to Ptt App*/
5418 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5419
5420 /*Ptt App expects the response length in LE */
5421 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5422
5423 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005424 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005425 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5426
5427 /*Copy the message*/
5428 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5429
5430 /*Update the error code*/
5431 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5432
5433 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5434
5435 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5436 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005437 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005438 return VOS_STATUS_E_FAILURE;
5439 }
5440 }
5441 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005442 return VOS_STATUS_SUCCESS;
5443
5444}