blob: 08ae2bd7655f5b2cf6acacd3f19f266875c7c31e [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
Girish Gowli32fbe522014-05-08 20:27:04 +0530605 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700606
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---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530620static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700621{
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;
Girish Gowli32fbe522014-05-08 20:27:04 +0530705 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700706 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
Girish Gowli32fbe522014-05-08 20:27:04 +05301307 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001308
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
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301532 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1533 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001534
Arif Hussain6d2a3322013-11-17 19:50:10 -08001535 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 -07001536 return VOS_STATUS_E_FAILURE;
1537 }
1538 return VOS_STATUS_SUCCESS;
1539}
1540
1541/**---------------------------------------------------------------------------
1542
1543 \brief wlan_hdd_ftm_start() -
1544
1545 This function gets called when the FTM start commands received from the ptt socket application and
1546 it starts the following modules.
1547 1) SAL Start.
1548 2) BAL Start.
1549 3) MAC Start to download the firmware.
1550
1551
1552 \param - pAdapter - Pointer HDD Context.
1553
1554 \return - 0 for success, non zero for failure
1555
1556 --------------------------------------------------------------------------*/
1557
1558static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1559{
1560 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1561 tSirRetStatus sirStatus = eSIR_SUCCESS;
1562 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1563 tHalMacStartParameters halStartParams;
1564
1565 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1566 {
1567 return VOS_STATUS_SUCCESS;
1568 }
1569
1570 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1571 "%s: Starting Libra SW", __func__);
1572
1573 /* We support only one instance for now ...*/
1574 if (pVosContext == NULL)
1575 {
1576 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001577 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001578 goto err_status_failure;
1579 }
1580
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001581
Jeff Johnson295189b2012-06-20 16:38:30 -07001582 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001583 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001584 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001585 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001586 goto err_status_failure;
1587 }
1588
Jeff Johnson295189b2012-06-20 16:38:30 -07001589 /*
1590 Prima needs to start the WDA correctly instead of BAL and SAL
1591 */
1592
1593 /* Vos preStart is calling */
1594 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1595 {
1596 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1597 goto err_status_failure;
1598 }
1599
1600
1601 vStatus = WDA_NVDownload_Start(pVosContext);
1602
1603 if ( vStatus != VOS_STATUS_SUCCESS )
1604 {
1605 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1606 "%s: Failed to start NV Download",__func__);
1607 return VOS_STATUS_E_FAILURE;
1608 }
1609
1610 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1611
1612 if ( vStatus != VOS_STATUS_SUCCESS )
1613 {
1614 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1615 {
1616 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001617 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001618 }
1619 else
1620 {
1621 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001622 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001623 }
1624 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301625 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001626 }
1627
1628 vStatus = WDA_start(pVosContext);
1629 if (vStatus != VOS_STATUS_SUCCESS)
1630 {
1631 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1632 "%s: Failed to start WDA",__func__);
1633 goto err_status_failure;
1634 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001635
Jeff Johnson295189b2012-06-20 16:38:30 -07001636
1637 /* Start the MAC */
1638 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1639
Jeff Johnson295189b2012-06-20 16:38:30 -07001640
1641 halStartParams.driverType = eDRIVER_TYPE_MFG;
1642
1643 /* Start the MAC */
1644 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1645
Jeff Johnson295189b2012-06-20 16:38:30 -07001646
1647 if (eSIR_SUCCESS != sirStatus)
1648 {
1649 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1650 "%s: Failed to start MAC", __func__);
1651
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001653 }
1654
1655 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1656 "%s: MAC correctly started",__func__);
1657
Jeff Johnson295189b2012-06-20 16:38:30 -07001658
1659 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1660
1661 return VOS_STATUS_SUCCESS;
1662
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001663err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001664 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1665 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1666 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1667 if(vStatus != VOS_STATUS_SUCCESS)
1668 {
1669 if(vStatus == VOS_STATUS_E_TIMEOUT)
1670 {
1671 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001672 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001673
1674 }
1675 else
1676 {
1677 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001678 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001679 }
1680 VOS_ASSERT(0);
1681 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001682
1683err_status_failure:
1684
1685 return VOS_STATUS_E_FAILURE;
1686
1687}
1688
1689
1690static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1691{
1692 VOS_STATUS vosStatus;
1693
1694 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1695 {
1696 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1697 return VOS_STATUS_E_FAILURE;
1698 }
1699
1700 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1701 {
1702 /* STOP MAC only */
1703 v_VOID_t *hHal;
1704 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1705 if (NULL == hHal)
1706 {
1707 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1708 "%s: NULL hHal", __func__);
1709 }
1710 else
1711 {
1712 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1713 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1714 {
1715 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1716 "%s: Failed to stop SYS", __func__);
1717 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1718 }
1719 }
1720
Jeff Johnson295189b2012-06-20 16:38:30 -07001721
Jeff Johnson295189b2012-06-20 16:38:30 -07001722 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001723
1724 }
1725 return WLAN_FTM_SUCCESS;
1726}
1727
Jeff Johnson295189b2012-06-20 16:38:30 -07001728/**---------------------------------------------------------------------------
1729
1730 \brief wlan_hdd_ftm_get_nv_table() -
1731 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001732 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001733
1734 \param - ftmCmd - Pointer FTM Commad Buffer
1735
1736 \return - int
1737 -1, Process Host command fail, vail out
1738 1, Process Host command success
1739
1740 --------------------------------------------------------------------------*/
1741int wlan_hdd_ftm_get_nv_table
1742(
1743 hdd_context_t *pHddCtx,
1744 tPttMsgbuffer *ftmCmd
1745)
1746{
1747 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1748 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1749 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001750 sHalNvV2 *nvContents = NULL;
1751 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001752
Jeff Johnson295189b2012-06-20 16:38:30 -07001753 if (NULL == pHddCtx)
1754 {
1755 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1756 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001757 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001758 }
1759
Leo Chang80de3c22013-11-26 10:52:12 -08001760 nvVersion = vos_nv_getNvVersion();
1761 if (E_NV_V2 != nvVersion)
1762 {
1763 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1764 "%s : Not valid NV Version %d", __func__, nvVersion);
1765 return -EINVAL;
1766 }
1767
Jeff Johnson295189b2012-06-20 16:38:30 -07001768 /* Test first chunk of NV table */
1769 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1770 (0 == pHddCtx->ftm.processedNVTableSize))
1771 {
1772 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1773 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1774 {
c_hpothuffdb5272013-10-02 16:42:35 +05301775 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1776 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001777 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001778 }
1779
1780 switch (nvTable->nvTable)
1781 {
1782 case NV_TABLE_RATE_POWER_SETTINGS:
1783 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1784 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1785 break;
1786
1787 case NV_TABLE_REGULATORY_DOMAINS:
1788 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1789 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1790 break;
1791
1792 case NV_TABLE_DEFAULT_COUNTRY:
1793 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1794 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1795 break;
1796
1797 case NV_TABLE_TPC_POWER_TABLE:
1798 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1799 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1800 break;
1801
1802 case NV_TABLE_TPC_PDADC_OFFSETS:
1803 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1804 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1805 break;
1806
1807 case NV_TABLE_VIRTUAL_RATE:
1808 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1809 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1810 break;
1811
1812 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1813 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1814 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1815 break;
1816
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001817 case NV_TABLE_HW_CAL_VALUES:
1818 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1819 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1820 break;
1821
1822 case NV_TABLE_FW_CONFIG:
1823 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1824 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001825 break;
1826
1827 case NV_TABLE_ANTENNA_PATH_LOSS:
1828 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1829 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1830 break;
1831
1832 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1833 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1834 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1835 break;
1836
1837 default:
1838 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1839 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001840 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001841 break;
1842 }
1843
1844 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1845 {
1846 /* Invalid table size, discard and initialize data */
1847 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001848 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001849 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001850 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001851 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1852 pHddCtx->ftm.targetNVTableSize = 0;
1853 pHddCtx->ftm.processedNVTableSize = 0;
1854 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001855 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001856 }
1857
1858 /* Set Current Processing NV table type */
1859 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1860 /* Copy target NV table value into temp context buffer */
1861 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1862 pHddCtx->ftm.targetNVTablePointer,
1863 pHddCtx->ftm.targetNVTableSize);
1864
1865 }
1866
1867 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1868 {
1869 /* Invalid table type */
1870 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1871 "Invalid NV Table, now Processing %d, not %d",
1872 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1873 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1874 pHddCtx->ftm.targetNVTableSize = 0;
1875 pHddCtx->ftm.processedNVTableSize = 0;
1876 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001877
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001878 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001879 }
1880
1881 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001882 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001883 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1884 nvTable->chunkSize);
1885 /* Update processed pointer to prepare next chunk copy */
1886 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1887
1888 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1889 {
1890 /* Finished to process last chunk of data, initialize buffer */
1891 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1892 pHddCtx->ftm.targetNVTableSize = 0;
1893 pHddCtx->ftm.processedNVTableSize = 0;
1894 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1895 }
1896
1897 return 1;
1898}
1899
1900/**---------------------------------------------------------------------------
1901
1902 \brief wlan_hdd_ftm_set_nv_table() -
1903 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08001904 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001905
1906 \param - ftmCmd - Pointer FTM Commad Buffer
1907
1908 \return - int
1909 -1, Process Host command fail, vail out
1910 1, Process Host command success
1911
1912 --------------------------------------------------------------------------*/
1913int wlan_hdd_ftm_set_nv_table
1914(
1915 hdd_context_t *pHddCtx,
1916 tPttMsgbuffer *ftmCmd
1917)
1918{
1919 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1920 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1921 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001922 sHalNvV2 *nvContents = NULL;
1923 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001924
1925 if (NULL == pHddCtx)
1926 {
1927 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1928 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001929 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001930 }
1931
Leo Chang80de3c22013-11-26 10:52:12 -08001932 nvVersion = vos_nv_getNvVersion();
1933 if (E_NV_V2 != nvVersion)
1934 {
1935 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1936 "%s : Not valid NV Version %d", __func__, nvVersion);
1937 return -EINVAL;
1938 }
1939
Jeff Johnson295189b2012-06-20 16:38:30 -07001940 /* Test first chunk of NV table */
1941 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1942 (0 == pHddCtx->ftm.processedNVTableSize))
1943 {
1944 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1945 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1946 {
c_hpothuffdb5272013-10-02 16:42:35 +05301947 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1948 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001949 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001950 }
1951
1952 switch (nvTable->nvTable)
1953 {
1954 case NV_TABLE_RATE_POWER_SETTINGS:
1955 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1956 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1957 break;
1958
1959 case NV_TABLE_REGULATORY_DOMAINS:
1960 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1961 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1962 break;
1963
1964 case NV_TABLE_DEFAULT_COUNTRY:
1965 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1966 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1967 break;
1968
1969 case NV_TABLE_TPC_POWER_TABLE:
1970 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1971 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1972 break;
1973
1974 case NV_TABLE_TPC_PDADC_OFFSETS:
1975 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1976 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1977 break;
1978
1979 case NV_TABLE_VIRTUAL_RATE:
1980 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1981 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1982 break;
1983
1984 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1985 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1986 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1987 break;
1988
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001989 case NV_TABLE_HW_CAL_VALUES:
1990 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1991 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1992 break;
1993
1994 case NV_TABLE_FW_CONFIG:
1995 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1996 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001997 break;
1998
1999 case NV_TABLE_ANTENNA_PATH_LOSS:
2000 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2001 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2002 break;
2003
2004 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2005 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2006 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2007 break;
2008
2009 default:
2010 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2011 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002012 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002013 break;
2014 }
2015
2016 /* Set Current Processing NV table type */
2017 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2018 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2019 {
2020 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2021 "Invalid Table Size %d", nvTable->tableSize);
2022 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2023 pHddCtx->ftm.targetNVTableSize = 0;
2024 pHddCtx->ftm.processedNVTableSize = 0;
2025 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002026 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002027 }
2028 }
2029
2030 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2031 {
2032 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2033 "Invalid NV Table, now Processing %d, not %d",
2034 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2035 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2036 pHddCtx->ftm.targetNVTableSize = 0;
2037 pHddCtx->ftm.processedNVTableSize = 0;
2038 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002039 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002040 }
2041 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002042 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002043 nvTable->chunkSize);
2044
2045 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2046 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2047 {
2048 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2049 pHddCtx->ftm.tempNVTableBuffer,
2050 pHddCtx->ftm.targetNVTableSize);
2051 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2052 pHddCtx->ftm.targetNVTableSize = 0;
2053 pHddCtx->ftm.processedNVTableSize = 0;
2054 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2055 }
2056
2057 return 1;
2058}
2059
2060/**---------------------------------------------------------------------------
2061
2062 \brief wlan_hdd_ftm_blank_nv() -
2063 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002064 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002065
2066 \param - ftmCmd - Pointer FTM Commad Buffer
2067
2068 \return - int
2069 -1, Process Host command fail, vail out
2070 0, Process Host command success
2071
2072 --------------------------------------------------------------------------*/
2073int wlan_hdd_ftm_blank_nv_table
2074(
2075 tPttMsgbuffer *ftmCmd
2076)
2077{
Leo Chang80de3c22013-11-26 10:52:12 -08002078 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002079 v_SIZE_t nvSize;
2080 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002081 sHalNvV2 *nvContents = NULL;
2082 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002083
2084 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2085 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2086 {
c_hpothuffdb5272013-10-02 16:42:35 +05302087 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2088 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002089 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002090 }
2091
Leo Chang80de3c22013-11-26 10:52:12 -08002092 nvVersion = vos_nv_getNvVersion();
2093 if (E_NV_V2 != nvVersion)
2094 {
2095 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2096 "%s : Not valid NV Version %d", __func__, nvVersion);
2097 return -EINVAL;
2098 }
2099
Jeff Johnson295189b2012-06-20 16:38:30 -07002100 itemSize = sizeof(nvContents->tables.pwrOptimum);
2101 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002102 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002103 itemSize);
2104
2105 itemSize = sizeof(nvContents->tables.regDomains);
2106 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002107 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 itemSize);
2109
2110 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2111 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002112 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002113 itemSize);
2114
2115 itemSize = sizeof(nvContents->tables.plutCharacterized);
2116 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002117 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002118 itemSize);
2119
2120 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2121 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002122 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002123 itemSize);
2124
2125 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2126 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002127 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002128 itemSize);
2129
2130 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2131 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002132 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002133 itemSize);
2134
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002135 itemSize = sizeof(nvContents->tables.hwCalValues);
2136 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002137 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002138 itemSize);
2139
2140 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2141 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002142 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002143 itemSize);
2144
2145 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2146 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002147 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002148 itemSize);
2149
2150 return 1;
2151}
2152
2153/**---------------------------------------------------------------------------
2154
2155 \brief wlan_hdd_ftm_delete_nv_table() -
2156 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002157 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002158
2159 \param - ftmCmd - Pointer FTM Commad Buffer
2160
2161 \return - int
2162 -1, Process Host command fail, vail out
2163 1, Process Host command success
2164
2165 --------------------------------------------------------------------------*/
2166int wlan_hdd_ftm_delete_nv_table
2167(
2168 tPttMsgbuffer *ftmCmd
2169)
2170{
Leo Chang80de3c22013-11-26 10:52:12 -08002171 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002172 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2173 v_SIZE_t nvSize;
2174 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002175 sHalNvV2 *nvContents = NULL;
2176 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002177
2178 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2179 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2180 {
c_hpothuffdb5272013-10-02 16:42:35 +05302181 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2182 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002183 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 }
2185
Leo Chang80de3c22013-11-26 10:52:12 -08002186 nvVersion = vos_nv_getNvVersion();
2187 if (E_NV_V2 != nvVersion)
2188 {
2189 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2190 "%s : Not valid NV Version %d", __func__, nvVersion);
2191 return -EINVAL;
2192 }
2193
Jeff Johnson295189b2012-06-20 16:38:30 -07002194 switch (nvTable->nvTable)
2195 {
2196 case NV_TABLE_RATE_POWER_SETTINGS:
2197 itemSize = sizeof(nvContents->tables.pwrOptimum);
2198 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002199 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002200 itemSize);
2201 break;
2202
2203 case NV_TABLE_REGULATORY_DOMAINS:
2204 itemSize = sizeof(nvContents->tables.regDomains);
2205 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002206 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002207 itemSize);
2208 break;
2209
2210 case NV_TABLE_DEFAULT_COUNTRY:
2211 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2212 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002213 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002214 itemSize);
2215 break;
2216
2217 case NV_TABLE_TPC_POWER_TABLE:
2218 itemSize = sizeof(nvContents->tables.plutCharacterized);
2219 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002220 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002221 itemSize);
2222 break;
2223
2224 case NV_TABLE_TPC_PDADC_OFFSETS:
2225 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2226 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002227 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002228 itemSize);
2229 break;
2230
2231 case NV_TABLE_VIRTUAL_RATE:
2232 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2233 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002234 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002235 itemSize);
2236 break;
2237
2238 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2239 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2240 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002241 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002242 itemSize);
2243 break;
2244
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002245 case NV_TABLE_HW_CAL_VALUES:
2246 itemSize = sizeof(nvContents->tables.hwCalValues);
2247 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002248 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002249 itemSize);
2250 break;
2251
2252 case NV_TABLE_FW_CONFIG:
2253 itemSize = sizeof(nvContents->tables.fwConfig);
2254 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002255 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002256 itemSize);
2257 break;
2258
2259 case NV_TABLE_ANTENNA_PATH_LOSS:
2260 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2261 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002262 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002263 itemSize);
2264 break;
2265
2266 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2267 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2268 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002269 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002270 itemSize);
2271 break;
2272
2273 default:
2274 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2275 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002276 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002277 break;
2278 }
2279
2280 return 1;
2281}
2282
2283/**---------------------------------------------------------------------------
2284
2285 \brief wlan_hdd_ftm_get_nv_field() -
2286 Get Specific NV field
2287
2288 \param - ftmCmd - Pointer FTM Commad Buffer
2289
2290 \return - int
2291 -1, Process Host command fail, vail out
2292 1, Process Host command success
2293
2294 --------------------------------------------------------------------------*/
2295int wlan_hdd_ftm_get_nv_field
2296(
2297 tPttMsgbuffer *ftmCmd
2298)
2299{
2300 sNvFields nvFieldDataBuffer;
2301 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2302 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2303 sHalNv *nvContents = NULL;
2304 v_SIZE_t nvSize;
2305
2306 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2307 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2308 {
c_hpothuffdb5272013-10-02 16:42:35 +05302309 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2310 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002311 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002312 }
2313 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2314
2315 switch (nvField->nvField)
2316 {
2317 case NV_COMMON_PRODUCT_ID:
2318 memcpy((void *)&nvField->fieldData,
2319 &nvFieldDataBuffer.productId,
2320 sizeof(nvFieldDataBuffer.productId));
2321 break;
2322
2323 case NV_COMMON_PRODUCT_BANDS:
2324 memcpy((void *)&nvField->fieldData,
2325 &nvFieldDataBuffer.productBands,
2326 sizeof(nvFieldDataBuffer.productBands));
2327 break;
2328
2329 case NV_COMMON_NUM_OF_TX_CHAINS:
2330 memcpy((void *)&nvField->fieldData,
2331 &nvFieldDataBuffer.numOfTxChains,
2332 sizeof(nvFieldDataBuffer.numOfTxChains));
2333 break;
2334
2335 case NV_COMMON_NUM_OF_RX_CHAINS:
2336 memcpy((void *)&nvField->fieldData,
2337 &nvFieldDataBuffer.numOfRxChains,
2338 sizeof(nvFieldDataBuffer.numOfRxChains));
2339 break;
2340
2341 case NV_COMMON_MAC_ADDR:
2342 memcpy((void *)&nvField->fieldData,
2343 &nvFieldDataBuffer.macAddr[0],
2344 NV_FIELD_MAC_ADDR_SIZE);
2345 break;
2346
2347 case NV_COMMON_MFG_SERIAL_NUMBER:
2348 memcpy((void *)&nvField->fieldData,
2349 &nvFieldDataBuffer.mfgSN[0],
2350 NV_FIELD_MFG_SN_SIZE);
2351 break;
2352
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002353 case NV_COMMON_WLAN_NV_REV_ID:
2354 memcpy((void *)&nvField->fieldData,
2355 &nvFieldDataBuffer.wlanNvRevId,
2356 sizeof(nvFieldDataBuffer.wlanNvRevId));
2357 break;
2358
Jeff Johnson295189b2012-06-20 16:38:30 -07002359 case NV_COMMON_COUPLER_TYPE:
2360 memcpy((void *)&nvField->fieldData,
2361 &nvFieldDataBuffer.couplerType,
2362 sizeof(nvFieldDataBuffer.couplerType));
2363 break;
2364
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002365 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002366 {
2367 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2368 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2369
2370 nvEmbededStatus = vos_nv_isEmbeddedNV();
2371
2372 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2373 {
2374 // High bit is set to indicate embedded NV..
2375 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2376 }
2377
2378 memcpy((void *)&nvField->fieldData,
2379 &nvVersion,
2380 sizeof(nvFieldDataBuffer.nvVersion));
2381 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002382 break;
2383
Jeff Johnson295189b2012-06-20 16:38:30 -07002384 default:
2385 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2386 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002387 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002388 break;
2389 }
2390
2391 return 1;
2392}
2393
2394/**---------------------------------------------------------------------------
2395
2396 \brief wlan_hdd_ftm_set_nv_field() -
2397 Set Specific NV field
2398
2399 \param - ftmCmd - Pointer FTM Commad Buffer
2400
2401 \return - int
2402 -1, Process Host command fail, vail out
2403 1, Process Host command success
2404
2405 --------------------------------------------------------------------------*/
2406int wlan_hdd_ftm_set_nv_field
2407(
2408 tPttMsgbuffer *ftmCmd
2409)
2410{
2411 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2412 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2413 v_SIZE_t nvSize;
2414 sHalNv *nvContents = NULL;
2415 v_U8_t macLoop;
2416 v_U8_t *pNVMac;
2417 v_U8_t lastByteMAC;
2418
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002419
Jeff Johnson295189b2012-06-20 16:38:30 -07002420 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2421 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2422 {
c_hpothuffdb5272013-10-02 16:42:35 +05302423 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2424 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002425 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002426 }
2427
2428 switch (nvField->nvField)
2429 {
2430 case NV_COMMON_PRODUCT_ID:
2431 memcpy(&nvContents->fields.productId,
2432 &nvField->fieldData,
2433 sizeof(nvContents->fields.productId));
2434 break;
2435
2436 case NV_COMMON_PRODUCT_BANDS:
2437 memcpy(&nvContents->fields.productBands,
2438 &nvField->fieldData,
2439 sizeof(nvContents->fields.productBands));
2440 break;
2441
2442 case NV_COMMON_NUM_OF_TX_CHAINS:
2443 memcpy(&nvContents->fields.numOfTxChains,
2444 &nvField->fieldData,
2445 sizeof(nvContents->fields.numOfTxChains));
2446 break;
2447
2448 case NV_COMMON_NUM_OF_RX_CHAINS:
2449 memcpy(&nvContents->fields.numOfRxChains,
2450 &nvField->fieldData,
2451 sizeof(nvContents->fields.numOfRxChains));
2452 break;
2453
2454 case NV_COMMON_MAC_ADDR:
2455 /* If Last byte is larger than 252 (0xFC), return Error,
2456 * Since 3MACs should be derived from first MAC */
2457 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002458 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002459 {
2460 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2461 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002462 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002463 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002464 }
2465
2466 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002467 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002468 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2469 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002470 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002471 lastByteMAC + macLoop;
2472 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002473 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002474 NV_FIELD_MAC_ADDR_SIZE);
2475 }
2476 break;
2477
2478 case NV_COMMON_MFG_SERIAL_NUMBER:
2479 memcpy(&nvContents->fields.mfgSN[0],
2480 &nvField->fieldData,
2481 NV_FIELD_MFG_SN_SIZE);
2482 break;
2483
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002484 case NV_COMMON_WLAN_NV_REV_ID:
2485 memcpy(&nvContents->fields.wlanNvRevId,
2486 &nvField->fieldData,
2487 sizeof(nvContents->fields.wlanNvRevId));
2488 break;
2489
Jeff Johnson295189b2012-06-20 16:38:30 -07002490 case NV_COMMON_COUPLER_TYPE:
2491 memcpy(&nvContents->fields.couplerType,
2492 &nvField->fieldData,
2493 sizeof(nvContents->fields.couplerType));
2494 break;
2495
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002496 case NV_COMMON_NV_VERSION:
2497 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2498 "Cannot modify NV version field %d", nvField->nvField);
2499 return -EIO;
2500 break;
2501
Jeff Johnson295189b2012-06-20 16:38:30 -07002502 default:
2503 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2504 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002505 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002506 break;
2507 }
2508
2509 return 1;
2510}
2511
2512/**---------------------------------------------------------------------------
2513
2514 \brief wlan_hdd_ftm_store_nv_table() -
2515 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002516 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002517
2518 \param - ftmCmd - Pointer FTM Commad Buffer
2519
2520 \return - int
2521 -1, Process Host command fail, vail out
2522 0, Process Host command success
2523
2524 --------------------------------------------------------------------------*/
2525int wlan_hdd_ftm_store_nv_table
2526(
2527 tPttMsgbuffer *ftmCmd
2528)
2529{
2530 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2531 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002532 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2533 void *tablePtr = NULL;
2534 unsigned int tableSize = 0;
2535 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002536 sHalNvV2 *nvContents = NULL;
2537 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002538
2539 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2540 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2541 {
c_hpothuffdb5272013-10-02 16:42:35 +05302542 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2543 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002544 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002545 }
2546
Leo Chang80de3c22013-11-26 10:52:12 -08002547 nvVersion = vos_nv_getNvVersion();
2548 if (E_NV_V2 != nvVersion)
2549 {
2550 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2551 "%s : Not valid NV Version %d", __func__, nvVersion);
2552 return -EINVAL;
2553 }
2554
Jeff Johnson295189b2012-06-20 16:38:30 -07002555 /* Set Platform type as PRIMA */
2556 nvContents->fields.wlanNvRevId = 2;
2557
2558 switch(nvTable->nvTable)
2559 {
2560 case NV_FIELDS_IMAGE:
2561 tablePtr = (void *)&nvContents->fields;
2562 tableSize = sizeof(nvContents->fields);
2563 tableVNVType = VNV_FIELD_IMAGE;
2564 break;
2565
2566 case NV_TABLE_RATE_POWER_SETTINGS:
2567 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2568 tableSize = sizeof(nvContents->tables.pwrOptimum);
2569 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2570 break;
2571
2572 case NV_TABLE_REGULATORY_DOMAINS:
2573 tablePtr = (void *)&nvContents->tables.regDomains[0];
2574 tableSize = sizeof(nvContents->tables.regDomains);
2575 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2576 break;
2577
2578 case NV_TABLE_DEFAULT_COUNTRY:
2579 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2580 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2581 tableVNVType = VNV_DEFAULT_LOCATION;
2582 break;
2583
2584 case NV_TABLE_TPC_POWER_TABLE:
2585 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2586 tableSize = sizeof(nvContents->tables.plutCharacterized);
2587 tableVNVType = VNV_TPC_POWER_TABLE;
2588 break;
2589
2590 case NV_TABLE_TPC_PDADC_OFFSETS:
2591 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2592 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2593 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2594 break;
2595
2596 case NV_TABLE_VIRTUAL_RATE:
2597 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2598 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2599 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2600 break;
2601
2602 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2603 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2604 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2605 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2606 break;
2607
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002608 case NV_TABLE_HW_CAL_VALUES:
2609 tablePtr = (void *)&nvContents->tables.hwCalValues;
2610 tableSize = sizeof(nvContents->tables.hwCalValues);
2611 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002612 break;
2613
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002614 case NV_TABLE_FW_CONFIG:
2615 tablePtr = (void *)&nvContents->tables.fwConfig;
2616 tableSize = sizeof(nvContents->tables.fwConfig);
2617 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002618 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002619
Jeff Johnson295189b2012-06-20 16:38:30 -07002620 case NV_TABLE_ANTENNA_PATH_LOSS:
2621 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2622 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2623 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2624 break;
2625
2626 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2627 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2628 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2629 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2630 break;
2631
2632 default:
2633 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2634 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002635 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002636 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002637
Jeff Johnson295189b2012-06-20 16:38:30 -07002638 }
2639
2640 nvStatus = vos_nv_write(tableVNVType,
2641 tablePtr,
2642 tableSize);
2643 if(VOS_STATUS_SUCCESS != nvStatus)
2644 {
c_hpothuffdb5272013-10-02 16:42:35 +05302645 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2646 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002647 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002648 }
2649
2650 return 1;
2651}
2652
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002653/* --------------------------------------------------------------------------
2654 \brief wlan_hdd_ftm_get_nv_bin() -
2655 Get NV bin read from Flash Memory, file
2656
2657 \param - ftmCmd - Pointer FTM Commad Buffer
2658
2659 \return - int
2660 -1, Process Host command fail, vail out
2661 0, Process Host command success
2662--------------------------------------------------------------------------*/
2663
2664static int wlan_hdd_ftm_get_nv_bin
2665(
2666 v_U16_t msgId,
2667 hdd_context_t *pHddCtx,
2668 tPttMsgbuffer *ftmCmd
2669)
2670{
2671 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2672 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2673 v_SIZE_t nvSize;
2674 v_U8_t *nvContents;
2675 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002676 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002677
Leo Chang80de3c22013-11-26 10:52:12 -08002678 nvVersion = vos_nv_getNvVersion();
2679 if (E_NV_V3 != nvVersion)
2680 {
2681 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2682 "%s : Not valid NV Version %d", __func__, nvVersion);
2683 return -EINVAL;
2684 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002685
2686 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2687 (0 == pHddCtx->ftm.processedNVTableSize))
2688 {
2689 if ( msgId == PTT_MSG_GET_NV_BIN )
2690 {
2691 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2692 }
2693 else
2694 {
2695 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2696 }
2697
2698 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2699 {
c_hpothuffdb5272013-10-02 16:42:35 +05302700 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2701 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002702 return -EIO;
2703 }
2704
2705 switch (nvTable->nvTable)
2706 {
2707 case NV_BINARY_IMAGE:
2708 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2709 break;
2710 default:
2711 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2712 "Not Valid NV Table %d", nvTable->nvTable);
2713 return -EIO;
2714 break;
2715 }
2716
2717 /* Set Current Processing NV table type */
2718 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2719 if ( msgId == PTT_MSG_GET_NV_BIN )
2720 {
2721 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2722 /* Validity Period */
2723 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2724 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2725 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2726 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2727 offset = sizeof(v_U32_t);
2728 }
2729 else
2730 {
2731 pHddCtx->ftm.targetNVTableSize = nvSize;
2732 offset = 0;
2733 }
2734
2735 /* Copy target NV table value into temp context buffer */
2736 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2737 pHddCtx->ftm.targetNVTablePointer,
2738 pHddCtx->ftm.targetNVTableSize);
2739 }
2740
2741
2742 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2743 {
2744 /* Invalid table type */
2745 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2746 "Invalid NV Table, now Processing %d, not %d",
2747 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2748
2749 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2750 pHddCtx->ftm.targetNVTableSize = 0;
2751 pHddCtx->ftm.processedNVTableSize = 0;
2752 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2753
2754 return -EINVAL;
2755 }
2756
2757 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2758
2759 /* Update processed pointer to prepare next chunk copy */
2760 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2761 pHddCtx->ftm.targetNVTableSize )
2762 {
2763 nvTable->chunkSize =
2764 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2765 }
2766
2767 /* Copy next chunk of NV table value into response buffer */
2768 vos_mem_copy(
2769 &nvTable->tableData,
2770 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2771 nvTable->chunkSize);
2772
2773 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2774
2775 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2776 {
2777 /* Finished to process last chunk of data, initialize buffer */
2778 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2779 pHddCtx->ftm.targetNVTableSize = 0;
2780 pHddCtx->ftm.processedNVTableSize = 0;
2781 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2782 }
2783
2784 return 1;
2785}
2786
2787/**---------------------------------------------------------------------------
2788
2789 \brief wlan_hdd_ftm_set_nv_bin() -
2790 Set NV bin to Flash Memory, file
2791
2792 \param - ftmCmd - Pointer FTM Commad Buffer
2793
2794 \return - int
2795 -1, Process Host command fail, vail out
2796 0, Process Host command success
2797
2798+----------------------------------------------------------------------------*/
2799
2800static int wlan_hdd_ftm_set_nv_bin
2801(
2802 hdd_context_t *pHddCtx,
2803 tPttMsgbuffer *ftmCmd
2804)
2805{
2806 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2807 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002808 eNvVersionType nvVersion;
2809
2810 nvVersion = vos_nv_getNvVersion();
2811 if (E_NV_V3 != nvVersion)
2812 {
2813 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2814 "%s : Not valid NV Version %d", __func__, nvVersion);
2815 return -EINVAL;
2816 }
2817
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002818
2819 /* Test first chunk of NV table */
2820 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2821 (0 == pHddCtx->ftm.processedNVTableSize))
2822 {
2823 switch (nvTable->nvTable)
2824 {
2825 case NV_BINARY_IMAGE:
2826 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2827 break;
2828 default:
2829 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2830 "Not Valid NV Table %d", nvTable->nvTable);
2831 return -EIO;
2832 break;
2833 }
2834
2835 /* Set Current Processing NV table type */
2836 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2837 pHddCtx->ftm.processedNVTableSize = 0;
2838
2839 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2840 {
2841 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2842 "Invalid Table Size %d", nvTable->tableSize);
2843 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2844 pHddCtx->ftm.targetNVTableSize = 0;
2845 pHddCtx->ftm.processedNVTableSize = 0;
2846 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2847 return -EINVAL;
2848 }
2849 }
2850
2851 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2852 {
2853 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2854 "Invalid NV Table, now Processing %d, not %d",
2855 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2856 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2857 pHddCtx->ftm.targetNVTableSize = 0;
2858 pHddCtx->ftm.processedNVTableSize = 0;
2859 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2860 return -EINVAL;
2861 }
2862
2863 vos_mem_copy(
2864 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2865 &nvTable->tableData,
2866 nvTable->chunkSize);
2867
2868 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2869
2870 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2871 {
2872 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2873 "Processing Done!! write encoded Buffer %d",
2874 pHddCtx->ftm.targetNVTableSize);
2875
2876 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2877 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2878
2879 if ((VOS_STATUS_SUCCESS != nvStatus))
2880 {
2881 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2882 "Fail to set NV Binary %d", nvStatus);
2883 return -EIO;
2884 }
2885
2886 nvStatus = vos_nv_setNVEncodedBuffer(
2887 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2888 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
2889
2890 if ((VOS_STATUS_SUCCESS != nvStatus))
2891 {
2892 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2893 "Fail to set NV Binary %d", nvStatus);
2894 return -EIO;
2895 }
2896
2897 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2898 pHddCtx->ftm.targetNVTableSize = 0;
2899 pHddCtx->ftm.processedNVTableSize = 0;
2900 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2901 }
2902
2903 return 1;
2904}
2905
Jeff Johnson295189b2012-06-20 16:38:30 -07002906/**---------------------------------------------------------------------------
2907
2908 \brief wlan_hdd_ftm_temp_get_rel_num() -
2909 Get internal release number
2910
2911 \param - ftmCmd - Pointer FTM Commad Buffer
2912
2913 \return - int
2914 -1, Process Host command fail, vail out
2915 0, Process Host command success
2916
2917 --------------------------------------------------------------------------*/
2918int wlan_hdd_ftm_temp_get_rel_num
2919(
2920 tPttMsgbuffer *ftmCmd
2921)
2922{
2923 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2924
2925 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2926 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2927 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2928 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2929 relNum->relParams.pttMax = 10;
2930 relNum->relParams.pttMin = 1;
2931
2932 return 1;
2933}
2934
2935/**---------------------------------------------------------------------------
2936
2937 \brief wlan_hdd_process_ftm_host_cmd() -
2938 process any command should be handled within host.
2939 decide any command should be send to HAL or not
2940
2941 \param - ftmCmd - Pointer FTM Commad Buffer
2942
2943 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002944 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002945 0, Process Host command success, not need to send CMD to HAL
2946 1, Process Host command success, need to send CMD to HAL
2947
2948 --------------------------------------------------------------------------*/
2949int wlan_hdd_process_ftm_host_cmd
2950(
2951 hdd_context_t *pHddCtx,
2952 void *ftmCmd
2953)
2954{
2955 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2956 int needToRouteHal = 1;
2957 int hostState = 1;
2958
2959 switch(pFTMCmd->msgId)
2960 {
2961 case PTT_MSG_GET_NV_TABLE:
2962 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2963 needToRouteHal = 0;
2964 break;
2965
2966 case PTT_MSG_SET_NV_TABLE:
2967 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2968 /* Temp NV Operation will be isolated to host
2969 needToRouteHal = 1; */
2970 needToRouteHal = 0;
2971 break;
2972
2973 case PTT_MSG_BLANK_NV:
2974 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2975 needToRouteHal = 1;
2976 break;
2977
2978 case PTT_MSG_DEL_NV_TABLE:
2979 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2980 needToRouteHal = 1;
2981 break;
2982
2983 case PTT_MSG_GET_NV_FIELD:
2984 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2985 needToRouteHal = 0;
2986 break;
2987
2988 case PTT_MSG_SET_NV_FIELD:
2989 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2990 needToRouteHal = 0;
2991 break;
2992
2993 case PTT_MSG_STORE_NV_TABLE:
2994 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2995 needToRouteHal = 0;
2996 break;
2997
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002998 case PTT_MSG_GET_NV_BIN:
2999 case PTT_MSG_GET_DICTIONARY:
3000 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3001 needToRouteHal = 0;
3002 break;
3003
3004 case PTT_MSG_SET_NV_BIN:
3005 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3006 needToRouteHal = 0;
3007 break;
3008
Jeff Johnson295189b2012-06-20 16:38:30 -07003009 case PTT_MSG_DBG_READ_REGISTER:
3010 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3011 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3012 needToRouteHal = 0;
3013 break;
3014
3015 case PTT_MSG_DBG_WRITE_REGISTER:
3016 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3017 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3018 needToRouteHal = 0;
3019 break;
3020
3021 case PTT_MSG_DBG_READ_MEMORY:
3022 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3023 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3024 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3025 needToRouteHal = 0;
3026 break;
3027
3028 case PTT_MSG_DBG_WRITE_MEMORY:
3029 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3030 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3031 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3032 needToRouteHal = 0;
3033 break;
3034
3035 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3036 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3037 needToRouteHal = 0;
3038 break;
3039
3040 default:
3041 needToRouteHal = 1;
3042 break;
3043 }
3044
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003045 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003046 {
3047 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3048 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003049 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003050 }
3051
3052 return needToRouteHal;
3053}
Jeff Johnson295189b2012-06-20 16:38:30 -07003054
3055/**---------------------------------------------------------------------------
3056
3057 \brief wlan_hdd_process_ftm_cmd() -
3058
3059 This function process the commands received from the ptt socket application.
3060
3061 \param - pAdapter - Pointer HDD Context.
3062
3063 \param - wnl - Pointer to the ANI netlink header.
3064
3065 \return - none
3066
3067 --------------------------------------------------------------------------*/
3068
3069void wlan_hdd_process_ftm_cmd
3070(
3071 hdd_context_t *pHddCtx,
3072 tAniNlHdr *wnl
3073)
3074{
3075 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3076 v_U16_t cmd_len;
3077 v_U8_t *pftm_data;
3078 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003079 int hostState;
3080 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003081
3082 ENTER();
3083
Jeff Johnsone7245742012-09-05 17:12:55 -07003084 //Delay to fix NV write failure on JB
3085 vos_busy_wait(10000); //10ms
3086
Jeff Johnson295189b2012-06-20 16:38:30 -07003087 if (!pRequestBuf) {
3088
Arif Hussain6d2a3322013-11-17 19:50:10 -08003089 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003090 return ;
3091 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303092
3093 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3094 {
3095 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3096 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3097 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3098 return ;
3099 }
3100
Jeff Johnson295189b2012-06-20 16:38:30 -07003101 /*Save the received request*/
3102 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3103
3104 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3105 /*Save the received request netlink header used for sending the response*/
3106 pHddCtx->ftm.wnl = wnl;
3107 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3108
Arif Hussain6d2a3322013-11-17 19:50:10 -08003109 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003110
3111 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3112 wlan_ftm_send_response(pHddCtx);
3113 return ;
3114 }
3115
3116 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3117 {
3118 case WLAN_FTM_START:
3119 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3120
Arif Hussain6d2a3322013-11-17 19:50:10 -08003121 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003122 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3123 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3124 wlan_ftm_send_response(pHddCtx);
3125 return;
3126 }
3127
3128 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3129 {
3130 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3131 ,__func__);
3132 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3133 wlan_ftm_send_response(pHddCtx);
3134 return;
3135 }
3136 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3137 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3138 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3139 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3140
3141 wlan_ftm_send_response(pHddCtx);
3142
3143 break;
3144
3145 case WLAN_FTM_STOP:
3146 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3147
Arif Hussain6d2a3322013-11-17 19:50:10 -08003148 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003149 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3150 wlan_ftm_send_response(pHddCtx);
3151 return;
3152 }
3153
3154 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3155
3156 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3157 wlan_ftm_send_response(pHddCtx);
3158 return;
3159 }
3160
3161 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3162 /* This would send back the Command Success Status */
3163 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3164
3165 wlan_ftm_send_response(pHddCtx);
3166
3167 break;
3168
3169 case WLAN_FTM_CMD:
3170 /* if it is regular FTM command, pass it to HAL PHY */
3171 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003172 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003173 return;
3174 }
3175 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3176
Arif Hussain6d2a3322013-11-17 19:50:10 -08003177 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003178
3179 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3180 wlan_ftm_send_response(pHddCtx);
3181 return;
3182
3183 }
3184 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3185 cmd_len = pRequestBuf->ftm_hdr.data_len;
3186 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3187 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3188
Jeff Johnson295189b2012-06-20 16:38:30 -07003189 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3190 if (0 == hostState)
3191 {
3192 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3193 if (NULL == tempRspBuffer)
3194 {
3195 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003196 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003197 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3198 wlan_ftm_send_response(pHddCtx);
3199 return;
3200 }
3201 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3202 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3203 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3204 (unsigned char *) tempRspBuffer,
3205 tempRspBuffer->msgBodyLength);
3206 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3207 wlan_ftm_send_response(pHddCtx);
3208 vos_mem_free(tempRspBuffer);
3209 return;
3210 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003211 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003212 {
3213 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3214 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3215 wlan_ftm_send_response(pHddCtx);
3216 return;
3217 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003218
3219 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3220
Jeff Johnson295189b2012-06-20 16:38:30 -07003221
3222 /*Post the command to the HAL*/
3223 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3224
Arif Hussain6d2a3322013-11-17 19:50:10 -08003225 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003226 return;
3227
3228 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303229 /*After successful posting of message the command should be pending*/
3230 pHddCtx->ftm.IsCmdPending = TRUE;
3231
Jeff Johnson295189b2012-06-20 16:38:30 -07003232 /*Wait here until you get the response from HAL*/
3233 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3234 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303235 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3236 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3237 wlan_ftm_send_response(pHddCtx);
3238 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003239 return;
3240 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303241 /*This check will handle the case where the completion is sent by
3242 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3243 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3244 {
3245 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3246 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3247 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3248
3249 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3250 wlan_ftm_send_response(pHddCtx);
3251 pHddCtx->ftm.IsCmdPending = FALSE;
3252 return ;
3253 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003254
3255 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3256
3257 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3258
3259 wlan_ftm_send_response(pHddCtx);
3260 pHddCtx->ftm.IsCmdPending = FALSE;
3261 break;
3262
3263 default:
3264
Arif Hussain6d2a3322013-11-17 19:50:10 -08003265 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003266 return;
3267 }
3268
3269 EXIT();
3270 return;
3271} /* wlan_adp_ftm_cmd() */
3272
3273/**---------------------------------------------------------------------------
3274
3275 \brief wlan_ftm_priv_start_stop_ftm() -
3276
3277 This function is used for start/stop the ftm driver.
3278
3279 \param - pAdapter - Pointer HDD Context.
3280 - start - 1/0 to start/stop ftm driver.
3281
3282 \return - 0 for success, non zero for failure
3283
3284 --------------------------------------------------------------------------*/
3285
3286static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3287 v_U16_t start)
3288{
3289 VOS_STATUS status;
3290 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3291
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003292 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003293 {
3294 pHddCtx->ftm.cmd_iwpriv = TRUE;
3295 status = wlan_hdd_ftm_start(pHddCtx);
3296
3297 if (status != VOS_STATUS_SUCCESS)
3298 {
3299 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3300 "FTM Start Failed");
3301 return VOS_STATUS_E_FAILURE;
3302 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303303 if (NULL == pMsgBuf)
3304 {
3305 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3306 if (NULL == pMsgBuf)
3307 {
3308 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3309 "%s:pMsgBuf is NULL", __func__);
3310 return VOS_STATUS_E_FAILURE;
3311 }
3312 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003313 }
3314 else
3315 {
3316 status = wlan_ftm_stop(pHddCtx);
3317
3318 if (status != VOS_STATUS_SUCCESS)
3319 {
3320 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3321 "FTM Stop Failed");
3322 return VOS_STATUS_E_FAILURE;
3323 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303324 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3325 if (pMsgBuf)
3326 {
3327 vos_mem_free((v_VOID_t * )pMsgBuf);
3328 pMsgBuf = NULL;
3329 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003330 }
3331 return VOS_STATUS_SUCCESS;
3332}
3333
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303334
3335static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3336{
3337 unsigned int *table = NULL;
3338 int index = 0;
3339
3340 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3341 table = valid_channel;
3342 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3343 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3344 table = valid_channel_cb40;
3345 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3346 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3347 table = valid_channel_cb80;
3348
3349 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303350 {
3351 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3352 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303353 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303354 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303355
3356 while (table[index] != 0)
3357 {
3358 if (table[index] == channel)
3359 return VOS_STATUS_SUCCESS;
3360
3361 index++;
3362 }
3363
3364 return VOS_STATUS_E_FAILURE;
3365}
3366
3367
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303368static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3369{
3370 unsigned int primary_channel = center_channel;
3371
3372 if (center_channel <= 14)
3373 return primary_channel ;
3374
3375 switch (cb)
3376 {
3377 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3378 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3379 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3380 primary_channel -= 2;
3381 break;
3382
3383
3384 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3385 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3386 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3387 primary_channel += 2;
3388 break;
3389
3390 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3391 primary_channel -= 6;
3392 break;
3393
3394 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3395 primary_channel += 6;
3396 break;
3397 }
3398
3399 return primary_channel;
3400
3401}
3402
Jeff Johnson295189b2012-06-20 16:38:30 -07003403/**---------------------------------------------------------------------------
3404
3405 \brief wlan_ftm_priv_set_channel() -
3406
3407 This function is used for setting the channel to the halphy ptt module.
3408
3409 \param - pAdapter - Pointer HDD Context.
3410 - channel - Channel Number 1-14.
3411
3412 \return - 0 for success, non zero for failure
3413
3414 --------------------------------------------------------------------------*/
3415
3416static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3417{
Jeff Johnson295189b2012-06-20 16:38:30 -07003418 uPttMsgs *pMsgBody;
3419 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303420 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003421 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3422
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303423 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003424 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303425 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3426 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003427 return VOS_STATUS_E_FAILURE;
3428 }
3429
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303430 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003431 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303432 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3433 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003434 return VOS_STATUS_E_FAILURE;
3435 }
3436
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303437 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003438 init_completion(&pHddCtx->ftm.ftm_comp_var);
3439 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3440 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3441
3442 pMsgBody = &pMsgBuf->msgBody;
3443
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303444 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003445
Arif Hussain6d2a3322013-11-17 19:50:10 -08003446 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303447 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003448
3449 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3450
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303451 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003452 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303453 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3454 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003455 status = VOS_STATUS_E_FAILURE;
3456 goto done;
3457
3458 }
c_hpothuffdb5272013-10-02 16:42:35 +05303459 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303460 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303461 if (0 >= ret )
3462 {
3463 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3464 FL("wait on ftm_comp_var failed %ld"), ret);
3465 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003466
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303467 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003468 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303469 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3470 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003471 status = VOS_STATUS_E_FAILURE;
3472 goto done;
3473
3474 }
3475done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003476
3477 return status;
3478}
3479
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303480
3481/**---------------------------------------------------------------------------
3482
3483 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3484
3485 This function is used for setting the power control mode for tx.
3486
3487 \param - pAdapter - Pointer HDD Context.
3488 - pwr_mode - power control mode 0-2.
3489
3490 \return - 0 for success, non zero for failure
3491
3492 --------------------------------------------------------------------------*/
3493
3494static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3495 v_U16_t pwr_mode)
3496{
3497 uPttMsgs *pMsgBody;
3498 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303499 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303500 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3501
3502 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3503 {
3504 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3505 "%s:Ftm has not started. Please start the ftm. ", __func__);
3506 return VOS_STATUS_E_FAILURE;
3507 }
3508
3509 if (pwr_mode > 2)
3510 {
3511 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3512 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3513 return VOS_STATUS_E_FAILURE;
3514 }
3515
3516 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3517 init_completion(&pHddCtx->ftm.ftm_comp_var);
3518 pMsgBody = &pMsgBuf->msgBody;
3519 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3520 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3521
3522 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3523 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3524
3525 if (status != VOS_STATUS_SUCCESS)
3526 {
3527 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3528 "%s:wlan_ftm_postmsg failed", __func__);
3529 status = VOS_STATUS_E_FAILURE;
3530 goto done;
3531 }
c_hpothuffdb5272013-10-02 16:42:35 +05303532 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303533 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303534 if (0 >= ret )
3535 {
3536 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3537 FL("wait on ftm_comp_var failed %ld"), ret);
3538 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303539
3540 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3541 {
3542 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3543 "%s:Ptt response status failed", __func__);
3544 status = VOS_STATUS_E_FAILURE;
3545 goto done;
3546 }
3547
3548 done:
3549 return status;
3550
3551}
3552
Jeff Johnson295189b2012-06-20 16:38:30 -07003553/**---------------------------------------------------------------------------
3554
3555 \brief wlan_ftm_priv_set_txpower() -
3556
3557 This function is used for setting the txpower to the halphy ptt module.
3558
3559 \param - pAdapter - Pointer HDD Context.
3560 - txpower - txpower Number 1-18.
3561
3562 \return - 0 for success, non zero for failure
3563
3564 --------------------------------------------------------------------------*/
3565
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303566static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3567 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003568{
Jeff Johnson295189b2012-06-20 16:38:30 -07003569 uPttMsgs *pMsgBody;
3570 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303571 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003572 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3573
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303574 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003575 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303576 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3577 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003578 return VOS_STATUS_E_FAILURE;
3579 }
3580
3581 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3582 * when tx pktgen is enabled
3583 */
3584 if (ftm_status.frameGenEnabled)
3585 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303586 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3587 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003588 return VOS_STATUS_E_FAILURE;
3589 }
3590
3591 if(!(txpower >= 9 && txpower <= 24))
3592 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303593 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3594 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003595 return VOS_STATUS_E_FAILURE;
3596 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003597
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303598 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3599 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003601 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3602 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3603
3604 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3605
3606 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3607
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303608 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003609 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303610 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3611 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003612 status = VOS_STATUS_E_FAILURE;
3613 goto done;
3614 }
c_hpothuffdb5272013-10-02 16:42:35 +05303615 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303616 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303617 if (0 >= ret )
3618 {
3619 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3620 FL("wait on ftm_comp_var failed %ld"), ret);
3621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003622
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303623 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003624 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303625 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3626 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003627 status = VOS_STATUS_E_FAILURE;
3628 goto done;
3629 }
3630
3631 ftm_status.txpower = txpower ;
3632 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003633
3634 return status;
3635
3636}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303637
3638
3639static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3640 v_U16_t enable)
3641{
3642 tANI_U32 value = 0;
3643 tANI_U32 reg_addr;
3644 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303645
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303646 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3647 {
3648 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3649 "%s:Ftm has not started. Please start the ftm. ", __func__);
3650 return VOS_STATUS_E_FAILURE;
3651 }
3652
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303653 reg_addr = WCNSS_TXFIR_OFFSET;
3654
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303655 wpalReadRegister(reg_addr, &value);
3656 if (enable)
3657 {
3658 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3659 }
3660 else
3661 {
3662 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3663 }
3664
3665 wpalWriteRegister(reg_addr, value);
3666
3667 return VOS_STATUS_SUCCESS;
3668}
3669
3670
Jeff Johnson295189b2012-06-20 16:38:30 -07003671/**---------------------------------------------------------------------------
3672
3673 \brief wlan_ftm_priv_set_txrate() -
3674
3675 This function is used for setting the txrate to the halphy ptt module.
3676 It converts the user input string for txrate to the tx rate index.
3677
3678 \param - pAdapter - Pointer HDD Context.
3679 - txrate - Pointer to the tx rate string.
3680
3681 \return - 0 for success, non zero for failure
3682
3683 --------------------------------------------------------------------------*/
3684
3685static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3686{
3687 int ii;
3688 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3689 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3690 {
3691 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3692 return VOS_STATUS_E_FAILURE;
3693 }
3694
3695 /* do not allow to change setting when tx pktgen is enabled */
3696 if (ftm_status.frameGenEnabled)
3697 {
3698 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3699 return VOS_STATUS_E_FAILURE;
3700 }
3701
3702 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3703 {
3704 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3705 break;
3706 }
3707 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3708 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003709 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003710 return VOS_STATUS_E_FAILURE;
3711 }
3712
3713 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3714 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3715
3716 return VOS_STATUS_SUCCESS;
3717}
3718
3719/**---------------------------------------------------------------------------
3720
3721 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3722
3723 This function is used for start/stop the tx packet generation.
3724
3725 \param - pAdapter - Pointer HDD Context.
3726 - startStop - Value( 1/0) start/stop the tx packet generation.
3727
3728 \return - 0 for success, non zero for failure
3729
3730 --------------------------------------------------------------------------*/
3731
3732static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3733{
Jeff Johnson295189b2012-06-20 16:38:30 -07003734 uPttMsgs *pMsgBody;
3735 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303736 long ret;
3737
Jeff Johnson295189b2012-06-20 16:38:30 -07003738 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3739
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303740 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003741 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303742 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3743 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003744 return VOS_STATUS_E_FAILURE;
3745 }
3746
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303747 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003748 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303749 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3750 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003751 return VOS_STATUS_E_FAILURE;
3752 }
3753
3754 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3755 (!ftm_status.frameGenEnabled && startStop == 0))
3756 {
3757 return VOS_STATUS_SUCCESS ;
3758 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303759 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003760
Jeff Johnson295189b2012-06-20 16:38:30 -07003761 if (startStop == 1)
3762 {
3763 init_completion(&pHddCtx->ftm.ftm_comp_var);
3764 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3765 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3766 pMsgBody = &pMsgBuf->msgBody;
3767 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3768
3769 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303770 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303772 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3773 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003774 status = VOS_STATUS_E_FAILURE;
3775 goto done;
3776 }
3777
c_hpothuffdb5272013-10-02 16:42:35 +05303778 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303779 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303780 if (0 >= ret )
3781 {
3782 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3783 FL("wait on ftm_comp_var failed %ld"), ret);
3784 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303785 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003786 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303787 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3788 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003789 status = VOS_STATUS_E_FAILURE;
3790 goto done;
3791 }
3792 }
3793
3794 init_completion(&pHddCtx->ftm.ftm_comp_var);
3795 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3796 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3797 pMsgBody = &pMsgBuf->msgBody;
3798 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3799
3800 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3801 if(status != VOS_STATUS_SUCCESS)
3802 {
3803 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3804 status = VOS_STATUS_E_FAILURE;
3805 goto done;
3806 }
3807
c_hpothuffdb5272013-10-02 16:42:35 +05303808 ret = wait_for_completion_interruptible_timeout(
3809 &pHddCtx->ftm.ftm_comp_var,
3810 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3811 if (0 >= ret )
3812 {
3813 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3814 FL("wait on ftm_comp_var failed %ld"), ret);
3815 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003816 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3817 {
3818 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3819 status = VOS_STATUS_E_FAILURE;
3820 goto done;
3821 }
3822
3823done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003824
3825 if (status == VOS_STATUS_SUCCESS)
3826 {
3827 if (startStop == 1)
3828 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303829 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003830 }
3831 else
3832 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303833 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003834 }
3835 }
3836
3837 return status;
3838}
3839
3840
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303841
3842static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3843{
3844
3845 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3846 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3847 {
3848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3849 "%s:Ftm has not started. Please start the ftm. ", __func__);
3850 return VOS_STATUS_E_FAILURE;
3851 }
3852
3853 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3854 {
3855 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3856 "%s:cb mode value is invalid ", __func__);
3857 return VOS_STATUS_E_FAILURE;
3858 }
3859
3860 ftm_status.cbmode = cbmode;
3861
3862 return VOS_STATUS_SUCCESS;
3863
3864}
3865
Jeff Johnson295189b2012-06-20 16:38:30 -07003866/**---------------------------------------------------------------------------
3867
3868 \brief wlan_ftm_rx_mode() -
3869
3870 This function is used for start/stop the rx packet generation.
3871
3872 \param - pAdapter - Pointer HDD Context.
3873 - rxmode - 0-disable RX.
3874 - 1-rx ALL frames
3875 - 2-rx 11 g/n frames
3876 - 3-rx 11b frames
3877
3878 \return - 0 for success, non zero for failure
3879
3880 --------------------------------------------------------------------------*/
3881
3882static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3883{
Jeff Johnson295189b2012-06-20 16:38:30 -07003884 uPttMsgs *pMsgBody;
3885 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303886 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003887
3888 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303889 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003890 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303891 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3892 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003893 return VOS_STATUS_E_FAILURE;
3894 }
3895
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303896 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003897 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303898 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3899 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003900 return VOS_STATUS_E_FAILURE;
3901 }
3902
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303903 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003904 init_completion(&pHddCtx->ftm.ftm_comp_var);
3905
3906 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3907 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3908
3909 pMsgBody = &pMsgBuf->msgBody;
3910
3911 switch(rxmode)
3912 {
3913 case RXMODE_DISABLE_ALL:
3914 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3915 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3916 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3917 break;
3918
3919 case RXMODE_ENABLE_ALL:
3920 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3921 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3922 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3923 break;
3924
3925 case RXMODE_ENABLE_11GN:
3926 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3927 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3928 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3929 break;
3930
3931 case RXMODE_ENABLE_11B:
3932 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3933 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3934 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3935 break;
3936
3937 }
3938
3939 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3940
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303941 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003942 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303943 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3944 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003945 status = VOS_STATUS_E_FAILURE;
3946 goto done;
3947 }
c_hpothuffdb5272013-10-02 16:42:35 +05303948 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303949 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303950 if (0 >= ret )
3951 {
3952 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3953 FL(" wait on ftm_comp_var failed %ld"), ret);
3954 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003955
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303956 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003957 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303958 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3959 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003960 status = VOS_STATUS_E_FAILURE;
3961 goto done;
3962 }
3963 ftm_status.rxmode = rxmode ;
3964done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003965
3966 return status;
3967}
3968
3969/**---------------------------------------------------------------------------
3970
3971 \brief wlan_ftm_priv_rx_pkt_clear() -
3972
3973 This function sets the rx pkt count to zero.
3974
3975 \param - pAdapter - Pointer HDD Context.
3976 - rx_pkt_clear - rx_pkt_clear value.
3977
3978 \return - 0 for success, non zero for failure
3979
3980 --------------------------------------------------------------------------*/
3981
3982static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3983{
Jeff Johnson295189b2012-06-20 16:38:30 -07003984 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303985 long ret;
3986
Jeff Johnson295189b2012-06-20 16:38:30 -07003987 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3988
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303989 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003990 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303991 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3992 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003993 return VOS_STATUS_E_FAILURE;
3994 }
3995
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303996 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07003997 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303998 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3999 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004000 return VOS_STATUS_E_FAILURE;
4001 }
4002
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304003 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004004 init_completion(&pHddCtx->ftm.ftm_comp_var);
4005 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
4006 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
4007
Jeff Johnson295189b2012-06-20 16:38:30 -07004008 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4009
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304010 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004011 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304012 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4013 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004014 status = VOS_STATUS_E_FAILURE;
4015 goto done;
4016 }
c_hpothuffdb5272013-10-02 16:42:35 +05304017 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304018 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304019 if (0 >= ret )
4020 {
4021 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4022 FL("wait on ftm_comp_var failed %ld"), ret);
4023 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004024
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304025 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004026 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304027 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4028 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 status = VOS_STATUS_E_FAILURE;
4030 goto done;
4031 }
4032done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004033
4034 return status;
4035}
4036
4037/**---------------------------------------------------------------------------
4038
4039 \brief wlan_ftm_priv_get_channel() -
4040
4041 This function gets the channel number from the halphy ptt module and
4042 returns the channel number to the application.
4043
4044 \param - pAdapter - Pointer HDD Context.
4045 - pChannel - Poniter to get the Channel number.
4046
4047 \return - 0 for success, non zero for failure
4048
4049 --------------------------------------------------------------------------*/
4050
4051static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4052{
Jeff Johnson295189b2012-06-20 16:38:30 -07004053 uPttMsgs *pMsgBody;
4054 VOS_STATUS status;
4055 v_U16_t freq;
4056 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304057 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004058
4059 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4060
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304061 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004062 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304063 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4064 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004065 return VOS_STATUS_E_FAILURE;
4066 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304067 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004068 init_completion(&pHddCtx->ftm.ftm_comp_var);
4069 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4070 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4071
4072 pMsgBody = &pMsgBuf->msgBody;
4073 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
4074
4075 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4076
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304077 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004078 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304079 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4080 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004081 status = VOS_STATUS_E_FAILURE;
4082 goto done;
4083
4084 }
c_hpothuffdb5272013-10-02 16:42:35 +05304085 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304086 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304087 if (0 >= ret )
4088 {
4089 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4090 FL("wait on ftm_comp_var failed %ld"), ret);
4091 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004092
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304093 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004094 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304095 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4096 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004097 status = VOS_STATUS_E_FAILURE;
4098 goto done;
4099 }
4100
4101 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4102
4103 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4104 indx++;
4105 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4106 {
4107 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4108 status = VOS_STATUS_E_FAILURE;
4109 goto done;
4110 }
4111
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004112 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004113
Arif Hussain6d2a3322013-11-17 19:50:10 -08004114 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004115 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004116
4117 return status;
4118}
4119
4120/**---------------------------------------------------------------------------
4121
4122 \brief wlan_ftm_priv_get_txpower() -
4123
4124 This function gets the TX power from the halphy ptt module and
4125 returns the TX power to the application.
4126
4127 \param - pAdapter - Pointer HDD Context.
4128 - pTxPwr - Poniter to get the Tx power.
4129
4130 \return - 0 for success, non zero for failure
4131
4132 --------------------------------------------------------------------------*/
4133
4134static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4135{
Jeff Johnson295189b2012-06-20 16:38:30 -07004136 uPttMsgs *pMsgBody;
4137 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304138 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004139 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4140
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304141 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004142 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304143 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4144 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004145 return VOS_STATUS_E_FAILURE;
4146 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304147 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 init_completion(&pHddCtx->ftm.ftm_comp_var);
4149 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4150 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4151
4152 pMsgBody = &pMsgBuf->msgBody;
4153
4154 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4155
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304156 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004157 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304158 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4159 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004160 status = VOS_STATUS_E_FAILURE;
4161 goto done;
4162 }
c_hpothuffdb5272013-10-02 16:42:35 +05304163 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304164 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304165 if (0 >= ret )
4166 {
4167 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4168 FL("wait on ftm_comp_var failed %ld"), ret);
4169 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004170
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304171 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004172 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304173 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4174 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004175 status = VOS_STATUS_E_FAILURE;
4176 goto done;
4177 }
4178 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4179
4180 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004181
4182 return status;
4183}
4184
4185/**---------------------------------------------------------------------------
4186
4187 \brief wlan_ftm_priv_get_ftm_version() -
4188
4189 This function gets ftm driver and firmware version.
4190
4191 \param - pAdapter - Pointer HDD Context.
4192 - pTxRate - Poniter to get the Tx rate.
4193
4194 \return - 0 for success, non zero for failure
4195
4196 --------------------------------------------------------------------------*/
4197
4198VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4199{
Jeff Johnson295189b2012-06-20 16:38:30 -07004200 uPttMsgs *pMsgBody;
4201 VOS_STATUS status;
4202 v_U32_t reg_val;
4203 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004204 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4205 int lenRes = 0;
4206 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304207 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004208
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304209 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004210 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304211 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4212 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004213 return VOS_STATUS_E_FAILURE;
4214 }
4215
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304216 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004217 init_completion(&pHddCtx->ftm.ftm_comp_var);
4218 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4219 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4220
4221 pMsgBody = &pMsgBuf->msgBody;
4222 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4223
4224 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4225
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304226 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004227 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304228 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4229 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004230 status = VOS_STATUS_E_FAILURE;
4231 goto done;
4232
4233 }
c_hpothuffdb5272013-10-02 16:42:35 +05304234 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304235 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304236 if (0 >= ret )
4237 {
4238 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4239 FL("wait on ftm_comp_var failed %ld"), ret);
4240 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004241
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304242 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004243 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304244 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4245 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004246 status = VOS_STATUS_E_FAILURE;
4247 goto done;
4248 }
4249
4250 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4251
4252 init_completion(&pHddCtx->ftm.ftm_comp_var);
4253
4254 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4255 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4256
4257 pMsgBody = &pMsgBuf->msgBody;
4258
4259 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4260
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304261 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004262 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304263 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4264 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004265 status = VOS_STATUS_E_FAILURE;
4266 goto done;
4267 }
c_hpothuffdb5272013-10-02 16:42:35 +05304268 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304269 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304270 if (0 >= ret )
4271 {
4272 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4273 FL("wait on ftm_comp_var failed %ld"), ret);
4274 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004275
4276 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4277 if(lenRes < 0 || lenRes >= lenBuf)
4278 {
4279 status = VOS_STATUS_E_FAILURE;
4280 goto done;
4281 }
4282
4283 buf += lenRes;
4284 lenBuf -= lenRes;
4285
4286 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004287 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 -07004288 if(lenRes < 0 || lenRes >= lenBuf)
4289 {
4290 status = VOS_STATUS_E_FAILURE;
4291 goto done;
4292 }
4293
4294 buf += lenRes;
4295 lenBuf -= lenRes;
4296
4297 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4298 if(lenRes < 0 || lenRes >= lenBuf)
4299 {
4300 status = VOS_STATUS_E_FAILURE;
4301 goto done;
4302 }
4303
4304 buf += lenRes;
4305 lenBuf -= lenRes;
4306
Jeff Johnson295189b2012-06-20 16:38:30 -07004307
4308done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004309
4310 return status;
4311
4312}
4313
4314/**---------------------------------------------------------------------------
4315
4316 \brief wlan_ftm_priv_get_txrate() -
4317
4318 This function gets the TX rate from the halphy ptt module and
4319 returns the TX rate to the application.
4320
4321 \param - pAdapter - Pointer HDD Context.
4322 - pTxRate - Poniter to get the Tx rate.
4323
4324 \return - 0 for success, non zero for failure
4325
4326 --------------------------------------------------------------------------*/
4327
4328static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4329{
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 uPttMsgs *pMsgBody;
4331 VOS_STATUS status;
4332 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304333 long ret;
4334
Jeff Johnson295189b2012-06-20 16:38:30 -07004335 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4336
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304337 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004338 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304339 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4340 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004341 return VOS_STATUS_E_FAILURE;
4342 }
4343
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304344 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004345 init_completion(&pHddCtx->ftm.ftm_comp_var);
4346 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4347 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4348
4349 pMsgBody = &pMsgBuf->msgBody;
4350
4351 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4352
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304353 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004354 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304355 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4356 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004357 status = VOS_STATUS_E_FAILURE;
4358 goto done;
4359 }
c_hpothuffdb5272013-10-02 16:42:35 +05304360 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304361 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304362 if (0 >= ret )
4363 {
4364 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4365 FL("wait on ftm_comp_var failed %ld"), ret);
4366 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004367
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304368 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004369
4370 rate_index = pMsgBody->GetTxPowerReport.rate;
4371 }
4372 else {
4373 /*Return the default rate*/
4374 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304375 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4376 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004377 status = VOS_STATUS_E_FAILURE;
4378 goto done;
4379 }
4380
4381 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4382 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4383 break;
4384 }
4385 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4386 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004387 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 status = VOS_STATUS_E_FAILURE;
4389 goto done;
4390 }
4391 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4392done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004393
4394 return status;
4395
4396}
4397
4398/**---------------------------------------------------------------------------
4399
4400 \brief wlan_ftm_priv_get_rx_pkt_count() -
4401
4402 This function gets the rx pkt count from the halphy ptt module and
4403 returns the rx pkt count to the application.
4404
4405 \param - pAdapter - Pointer HDD Context.
4406 - pRxPktCnt - Poniter to get the rx pkt count.
4407
4408 \return - 0 for success, non zero for failure
4409
4410 --------------------------------------------------------------------------*/
4411
4412static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4413{
Jeff Johnson295189b2012-06-20 16:38:30 -07004414 uPttMsgs *pMsgBody;
4415 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304416 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004417 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4418
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304419 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004420 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304421 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4422 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004423 return VOS_STATUS_E_FAILURE;
4424 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304425 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004426 init_completion(&pHddCtx->ftm.ftm_comp_var);
4427 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4428 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4429
4430 pMsgBody = &pMsgBuf->msgBody;
4431
4432 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4433
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304434 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004435 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304436 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4437 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004438 status = VOS_STATUS_E_FAILURE;
4439 goto done;
4440 }
c_hpothuffdb5272013-10-02 16:42:35 +05304441 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304442 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304443 if (0 >= ret )
4444 {
4445 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4446 FL("wait on ftm_comp_var failed %ld"), ret);
4447 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004448
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304449 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004450 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304451 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4452 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004453 status = VOS_STATUS_E_FAILURE;
4454 goto done;
4455 }
4456 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4457done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004458
4459 return status;
4460}
4461
4462/**---------------------------------------------------------------------------
4463
4464 \brief wlan_ftm_priv_get_rx_rssi() -
4465
4466 This function gets the rx rssi from the halphy ptt module and
4467 returns the rx rssi to the application.
4468
4469 \param - pAdapter - Pointer HDD Context.
4470 - buf - Poniter to get rssi of Rx chains
4471
4472 \return - 0 for success, non zero for failure
4473
4474 --------------------------------------------------------------------------*/
4475
4476static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4477{
Jeff Johnson295189b2012-06-20 16:38:30 -07004478 uPttMsgs *pMsgBody;
4479 VOS_STATUS status;
4480 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304481 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004482
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304483 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004484 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304485 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4486 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004487 return VOS_STATUS_E_FAILURE;
4488 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304489 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004490 init_completion(&pHddCtx->ftm.ftm_comp_var);
4491 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4492 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4493
4494 pMsgBody = &pMsgBuf->msgBody;
4495
4496 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4497
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304498 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004499 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304500 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4501 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004502 status = VOS_STATUS_E_FAILURE;
4503 goto done;
4504 }
c_hpothuffdb5272013-10-02 16:42:35 +05304505 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304506 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304507 if (0 >= ret )
4508 {
4509 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4510 FL("wait on ftm_comp_var failed %ld"), ret);
4511 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004512
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304513 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004514 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304515 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4516 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004517 status = VOS_STATUS_E_FAILURE;
4518 goto done;
4519 }
4520
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004521 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4522 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004523 pMsgBody->GetRxRssi.rssi.rx[1]);
4524
4525 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4526 {
4527 status = VOS_STATUS_E_FAILURE;
4528 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004529
Jeff Johnson295189b2012-06-20 16:38:30 -07004530done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004531
4532 return status;
4533}
4534
4535/**---------------------------------------------------------------------------
4536
4537 \brief wlan_ftm_priv_get_mac_address() -
4538
4539 This function gets the mac address from the halphy ptt module and
4540 returns the mac address to the application.
4541
4542 \param - pAdapter - Pointer HDD Context.
4543 - buf - Poniter to get the mac address.
4544
4545 \return - 0 for success, non zero for failure
4546
4547 --------------------------------------------------------------------------*/
4548
4549static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4550{
4551 v_BOOL_t itemIsValid = VOS_FALSE;
4552 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4553 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004554
Jeff Johnson295189b2012-06-20 16:38:30 -07004555 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4556
4557 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4558 {
4559 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4560 return VOS_STATUS_E_FAILURE;
4561 }
4562 /*Check the NV FIELD is valid or not*/
4563 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4564 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004565 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004566 {
4567 vos_nv_readMacAddress(macAddr);
4568
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004569 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4570 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004571 MAC_ADDR_ARRAY(macAddr));
4572 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4573 {
4574 return VOS_STATUS_E_FAILURE;
4575 }
4576 }
4577 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004578 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004579 {
4580 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004581 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4582 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004583 MAC_ADDR_ARRAY(macAddr));
4584
4585 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4586 {
4587 return VOS_STATUS_E_FAILURE;
4588 }
4589 }
4590 return VOS_STATUS_SUCCESS;
4591}
4592
4593/**---------------------------------------------------------------------------
4594
4595 \brief wlan_ftm_priv_set_mac_address() -
4596
4597 This function sets the mac address to the halphy ptt module and
4598 sends the netlink message to the ptt socket application which writes
4599 the macaddress to the qcom_wlan_nv.bin file
4600
4601 \param - pAdapter - Pointer HDD Context.
4602 - buf - Poniter to the macaddress.
4603
4604 \return - 0 for success, non zero for failure
4605
4606 --------------------------------------------------------------------------*/
4607
4608static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4609{
Jeff Johnson295189b2012-06-20 16:38:30 -07004610 uPttMsgs *pMsgBody;
4611 VOS_STATUS status;
4612 int macAddr[VOS_MAC_ADDRESS_LEN];
4613 v_U8_t *pMacAddress;
4614 v_U8_t ii;
4615 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304616 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004617
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304618 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004619 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304620 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4621 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004622 return VOS_STATUS_E_FAILURE;
4623 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304624 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004625 init_completion(&pHddCtx->ftm.ftm_comp_var);
4626 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4627 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4628
4629 pMsgBody = &pMsgBuf->msgBody;
4630 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4631
4632 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004633 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]))
4634 {
4635 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4636 "Invalid MacAddress Input %s", buf);
4637 return VOS_STATUS_E_FAILURE;
4638 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004639
Arif Hussain24bafea2013-11-15 15:10:03 -08004640 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4641 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004642
4643
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004644 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004645
4646 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4647 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4648
4649
Arif Hussain24bafea2013-11-15 15:10:03 -08004650 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4651 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004652 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4653
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304654 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004655 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304656 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4657 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004658 status = VOS_STATUS_E_FAILURE;
4659 goto done;
4660 }
c_hpothuffdb5272013-10-02 16:42:35 +05304661 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304662 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304663 if (0 >= ret )
4664 {
4665 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4666 FL("wait on ftm_comp_var failed %ld"), ret);
4667 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004668
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304669 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004670 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304671 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4672 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004673 status = VOS_STATUS_E_FAILURE;
4674 goto done;
4675 }
4676
Arif Hussain6d2a3322013-11-17 19:50:10 -08004677 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004678
4679 init_completion(&pHddCtx->ftm.ftm_comp_var);
4680 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4681
4682 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4683 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4684
4685 pMsgBody = &pMsgBuf->msgBody;
4686
4687 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4688
4689 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4690
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304691 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004692 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304693 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4694 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004695 status = VOS_STATUS_E_FAILURE;
4696 goto done;
4697 }
4698
c_hpothuffdb5272013-10-02 16:42:35 +05304699 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304700 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304701 if (0 >= ret )
4702 {
4703 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4704 FL("wait on ftm_comp_var failed %ld"), ret);
4705 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004706done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004707
4708 return VOS_STATUS_SUCCESS;
4709}
4710
4711/* set param sub-ioctls */
4712static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4713 union iwreq_data *wrqu, char *extra)
4714{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004715 int ret,sub_cmd;
4716 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004717 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004718 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004719 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004720
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004721 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004722 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004723 length = wrqu->data.length;
4724 sub_cmd = wrqu->data.flags;
4725 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4726
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004727 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4728 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4729 * odd number which assigns set_args to zero.we assisgn memory using
4730 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004731 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004732 param = kzalloc(length + 1, GFP_KERNEL);
4733 if (!param)
4734 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004735
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004736 if (copy_from_user(param, pointer, length))
4737 {
4738 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4739 "%s:Failed to get user data %s", __func__, param);
4740
4741 ret = -EINVAL;
4742 goto OUT;
4743 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004744
4745 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4746 "%s: Received length %d", __func__, length);
4747
4748 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004749 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004750
4751 switch(sub_cmd)
4752 {
4753 case WE_SET_MAC_ADDRESS:
4754 {
4755
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004756 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004757 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004758
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004759 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004760
4761 if(status != VOS_STATUS_SUCCESS)
4762 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004763 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004764 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004765
Jeff Johnson295189b2012-06-20 16:38:30 -07004766 ret = -EINVAL;
4767 }
4768
Wilson Yang7c471652013-12-20 16:36:44 -08004769 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004770 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004771 case WE_SET_TX_RATE:
4772 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004773 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004774
4775 if(status != VOS_STATUS_SUCCESS)
4776 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004777 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004778 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004779
4780 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004781 }
4782
4783 break;
Wilson Yang7c471652013-12-20 16:36:44 -08004784 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004785 default:
4786 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004787 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004788 ret = -EINVAL;
4789 break;
4790 }
4791 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004792
4793OUT:
4794 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004795 return ret;
4796}
4797
4798static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4799 union iwreq_data *wrqu, char *extra)
4800{
4801 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4802 int *value = (int *)extra;
4803 int sub_cmd = value[0];
4804 int set_value = value[1];
4805 int ret = 0; /* success */
4806 VOS_STATUS status;
4807
4808 switch(sub_cmd)
4809 {
4810 case WE_FTM_ON_OFF:
4811 {
4812 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4813
4814 if(status != VOS_STATUS_SUCCESS)
4815 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004816 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004817 ret = -EINVAL;
4818 }
4819
4820 break;
4821 }
4822
4823 case WE_TX_PKT_GEN:
4824 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4825
4826 if(status != VOS_STATUS_SUCCESS)
4827 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004828 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004829 ret = -EINVAL;
4830 }
4831 break;
4832
4833 case WE_SET_TX_IFS:
4834 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4835
4836 if(status != VOS_STATUS_SUCCESS)
4837 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004838 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004839 ret = -EINVAL;
4840 }
4841 break;
4842
4843 case WE_SET_TX_PKT_CNT:
4844 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4845
4846 if(status != VOS_STATUS_SUCCESS)
4847 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004848 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004849 ret = -EINVAL;
4850 }
4851 break;
4852
4853 case WE_SET_TX_PKT_LEN:
4854 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4855
4856 if(status != VOS_STATUS_SUCCESS)
4857 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004858 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004859 ret = -EINVAL;
4860 }
4861 break;
4862
4863 case WE_SET_CHANNEL:
4864 {
4865 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4866
4867 if(status != VOS_STATUS_SUCCESS)
4868 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004869 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004870 ret = -EINVAL;
4871 }
4872 break;
4873 }
4874 case WE_SET_TX_POWER:
4875 {
4876 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4877
4878 if(status != VOS_STATUS_SUCCESS)
4879 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004880 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004881 ret = -EINVAL;
4882 }
4883 break;
4884 }
4885 case WE_CLEAR_RX_PKT_CNT:
4886 {
4887 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4888
4889 if(status != VOS_STATUS_SUCCESS)
4890 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004891 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004892 ret = -EINVAL;
4893 }
4894 break;
4895 }
4896 case WE_RX:
4897 {
4898 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4899
4900 if(status != VOS_STATUS_SUCCESS)
4901 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004902 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004903 ret = -EINVAL;
4904 }
4905 break;
4906 }
4907 case WE_ENABLE_CHAIN:
4908 {
4909 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4910
4911 if(status != VOS_STATUS_SUCCESS)
4912 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004913 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 ret = -EINVAL;
4915 }
4916 break;
4917 }
4918
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304919 case WE_SET_PWR_CNTL_MODE:
4920 {
4921 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4922 if (status != VOS_STATUS_SUCCESS)
4923 {
4924 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4925 status);
4926 ret = -EINVAL;
4927 }
4928 break;
4929 }
4930
4931 case WE_ENABLE_DPD:
4932 {
4933 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4934 if (status != VOS_STATUS_SUCCESS)
4935 {
4936 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4937 ret = -EINVAL;
4938 }
4939 break;
4940 }
4941
4942 case WE_SET_CB:
4943 {
4944 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4945 if (status != VOS_STATUS_SUCCESS)
4946 {
4947 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4948 ret = -EINVAL;
4949 }
4950 break;
4951 }
4952
Jeff Johnson295189b2012-06-20 16:38:30 -07004953 default:
4954 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004955 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004956 sub_cmd, set_value);
4957 break;
4958 }
4959 }
4960
4961 return ret;
4962}
4963
4964/* get param sub-ioctls */
4965static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4966 union iwreq_data *wrqu, char *extra)
4967{
4968 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4969 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004970 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004971 VOS_STATUS status;
4972
4973 switch (value[0])
4974 {
4975 case WE_GET_CHANNEL:
4976 {
4977 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4978
4979 if(status != VOS_STATUS_SUCCESS)
4980 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004981 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004982 ret = -EINVAL;
4983 }
4984 break;
4985 }
4986 case WE_GET_TX_POWER:
4987 {
4988 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4989
4990 if(status != VOS_STATUS_SUCCESS)
4991 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004992 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004993 ret = -EINVAL;
4994 }
4995 break;
4996 }
4997 case WE_GET_RX_PKT_CNT:
4998 {
4999 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5000
5001 if(status != VOS_STATUS_SUCCESS)
5002 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005003 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005004 ret = -EINVAL;
5005 }
5006 break;
5007 }
5008 default:
5009 {
5010 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5011 break;
5012 }
5013 }
5014
5015 return ret;
5016}
5017
5018static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5019 union iwreq_data *wrqu, char *extra)
5020{
5021 int sub_cmd = wrqu->data.flags;
5022 VOS_STATUS status;
5023 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5024
5025 switch(sub_cmd)
5026 {
5027 case WE_GET_MAC_ADDRESS:
5028 {
5029 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5030
5031 if(status != VOS_STATUS_SUCCESS)
5032 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005033 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005034 return -EINVAL;
5035 }
5036 wrqu->data.length = strlen(extra)+1;
5037 break;
5038 }
5039 case WE_GET_TX_RATE:
5040 {
5041 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5042
5043 if(status != VOS_STATUS_SUCCESS)
5044 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005045 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005046 return -EINVAL;
5047 }
5048
5049 wrqu->data.length = strlen(extra)+1;
5050 break;
5051 }
5052 case WE_GET_FTM_VERSION:
5053 {
5054 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5055
5056 if(status != VOS_STATUS_SUCCESS)
5057 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005058 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005059 return -EINVAL;
5060 }
5061 wrqu->data.length = strlen(extra)+1;
5062 break;
5063 }
5064 case WE_GET_FTM_STATUS:
5065 {
5066 status = wlan_ftm_priv_get_status(pAdapter, extra);
5067
5068 if(status != VOS_STATUS_SUCCESS)
5069 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005070 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005071 return -EINVAL;
5072 }
5073
5074 wrqu->data.length = strlen(extra)+1;
5075 break;
5076 }
5077 case WE_GET_RX_RSSI:
5078 {
5079 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5080
5081 if(status != VOS_STATUS_SUCCESS)
5082 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005083 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005084 return -EINVAL;
5085 }
5086
5087 wrqu->data.length = strlen(extra)+1;
5088 break;
5089 }
5090 default:
5091 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005092 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005093 break;
5094 }
5095 }
5096
5097 return 0;
5098}
Jeff Johnson295189b2012-06-20 16:38:30 -07005099
5100VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5101{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005102#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005103 tAniHdr *wmsg = NULL;
5104 v_U8_t *pBuf;
5105 hdd_context_t *pHddCtx = NULL;
5106 v_CONTEXT_t pVosContext= NULL;
5107
5108 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5109 if(pBuf == NULL)
5110 {
5111 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5112 return VOS_STATUS_E_NOMEM;
5113 }
5114 wmsg = (tAniHdr*)pBuf;
5115 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5116 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5117 wmsg->length = FTM_SWAP16(wmsg->length);
5118 pBuf += sizeof(tAniHdr);
5119
5120 /*Get the global context */
5121 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5122
5123 /*Get the Hdd Context */
5124 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5125 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5126
5127 /* EfS command Code */
5128 *(v_U32_t*)pBuf = 0x000000EF;
5129
5130 pBuf += sizeof(v_U32_t);
5131
5132 memcpy(pBuf, pData,data_len);
5133
5134 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305135 if( ptt_sock_send_msg_to_app(wmsg, 0,
5136 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005137
Arif Hussain6d2a3322013-11-17 19:50:10 -08005138 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 -07005139 vos_mem_free((v_VOID_t*)wmsg);
5140 return VOS_STATUS_E_FAILURE;
5141 }
5142 }
5143 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305144 if( ptt_sock_send_msg_to_app(wmsg, 0,
5145 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005146
Arif Hussain6d2a3322013-11-17 19:50:10 -08005147 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 -07005148 vos_mem_free((v_VOID_t*)wmsg);
5149 return VOS_STATUS_E_FAILURE;
5150 }
5151 }
5152
5153 vos_mem_free((v_VOID_t*)wmsg);
5154#endif //FTM and ANDROID
5155
5156 return VOS_STATUS_SUCCESS;
5157}
5158
Jeff Johnson295189b2012-06-20 16:38:30 -07005159/* action sub-ioctls */
5160static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5161 union iwreq_data *wrqu, char *extra)
5162{
5163 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005164 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005165
5166 switch (sub_cmd)
5167 {
5168 case WE_SET_NV_DEFAULTS:
5169 {
5170 v_U8_t *pu8buf,*pTempBuf;
5171 v_U16_t size;
5172 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005173 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005174 pu8buf = vos_mem_malloc(size);
5175 if(pu8buf == NULL)
5176 {
5177 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5178 return VOS_STATUS_E_NOMEM;
5179 }
5180 memset(pu8buf,0,size);
5181 pTempBuf = pu8buf;
5182 pTempBuf += sizeof(v_U32_t);
5183 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5184
5185 wlan_write_to_efs(pu8buf,size);
5186 vos_mem_free(pu8buf);
5187 }
5188
5189 default:
5190 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005191 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005192 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5193 break;
5194 }
5195 }
5196
5197 return ret;
5198}
5199
Jeff Johnson295189b2012-06-20 16:38:30 -07005200static const iw_handler we_ftm_private[] = {
5201
5202 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5203 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5204 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5205 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5206 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07005207};
5208
5209/*Maximum command length can be only 15 */
5210static const struct iw_priv_args we_ftm_private_args[] = {
5211
5212 /* handlers for main ioctl */
5213 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5214 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5215 0,
5216 "" },
5217
5218 { WE_FTM_ON_OFF,
5219 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5220 0,
5221 "ftm" },
5222
5223 { WE_TX_PKT_GEN,
5224 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5225 0,
5226 "tx" },
5227
5228 { WE_SET_TX_IFS,
5229 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5230 0,
5231 "set_txifs" },
5232
5233 { WE_SET_TX_PKT_CNT,
5234 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5235 0,
5236 "set_txpktcnt" },
5237
5238 { WE_SET_TX_PKT_LEN,
5239 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5240 0,
5241 "set_txpktlen" },
5242
5243 { WE_SET_CHANNEL,
5244 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5245 0,
5246 "set_channel" },
5247
5248 { WE_SET_TX_POWER,
5249 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5250 0,
5251 "set_txpower" },
5252
5253 { WE_CLEAR_RX_PKT_CNT,
5254 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5255 0,
5256 "clr_rxpktcnt" },
5257
5258 { WE_RX,
5259 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5260 0,
5261 "rx" },
5262
5263 { WE_ENABLE_CHAIN,
5264 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5265 0,
5266 "ena_chain" },
5267
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305268 { WE_SET_PWR_CNTL_MODE,
5269 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5270 0,
5271 "pwr_cntl_mode" },
5272
5273 { WE_ENABLE_DPD,
5274 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5275 0,
5276 "ena_dpd" },
5277
5278 { WE_SET_CB,
5279 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5280 0,
5281 "set_cb" },
5282
Jeff Johnson295189b2012-06-20 16:38:30 -07005283 /* handlers for main ioctl */
5284 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5285 0,
5286 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5287 "" },
5288
5289 { WE_GET_CHANNEL,
5290 0,
5291 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5292 "get_channel" },
5293
5294 { WE_GET_TX_POWER,
5295 0,
5296 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5297 "get_txpower" },
5298
5299 { WE_GET_RX_PKT_CNT,
5300 0,
5301 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5302 "get_rxpktcnt" },
5303
5304 /* handlers for main ioctl */
5305 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5306 IW_PRIV_TYPE_CHAR| 512,
5307 0,
5308 "" },
5309
5310 { WE_SET_MAC_ADDRESS,
5311 IW_PRIV_TYPE_CHAR| 512,
5312 0,
5313 "set_mac_address" },
5314
5315 { WE_SET_TX_RATE,
5316 IW_PRIV_TYPE_CHAR | 512,
5317 0,
5318 "set_txrate" },
5319
5320 /* handlers for main ioctl */
5321 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5322 0,
5323 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5324 "" },
5325
5326 { WE_GET_MAC_ADDRESS,
5327 0,
5328 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5329 "get_mac_address" },
5330
5331 { WE_GET_FTM_VERSION,
5332 0,
5333 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5334 "ftm_version" },
5335
5336 { WE_GET_TX_RATE,
5337 0,
5338 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5339 "get_txrate" },
5340
5341 { WE_GET_FTM_STATUS,
5342 0,
5343 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5344 "get_status" },
5345
5346 { WE_GET_RX_RSSI,
5347 0,
5348 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5349 "get_rx_rssi" },
5350
Jeff Johnson295189b2012-06-20 16:38:30 -07005351 /* handlers for main ioctl */
5352 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5353 0,
5354 0,
5355 "" },
5356
5357 /* handlers for sub-ioctl */
5358 { WE_SET_NV_DEFAULTS,
5359 0,
5360 0,
5361 "set_nv_defaults" },
5362
5363};
5364
5365const struct iw_handler_def we_ftm_handler_def = {
5366 .num_standard = 0,
5367 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5368 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5369
5370 .standard = (iw_handler *)NULL,
5371 .private = (iw_handler *)we_ftm_private,
5372 .private_args = we_ftm_private_args,
5373 .get_wireless_stats = NULL,
5374};
5375
5376static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5377{
5378
5379 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5380
5381 // Zero the memory. This zeros the profile structure.
5382 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005383
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5385
5386 return 0;
5387}
5388
Jeff Johnson295189b2012-06-20 16:38:30 -07005389
5390VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5391{
Jeff Johnson295189b2012-06-20 16:38:30 -07005392 ftm_rsp_msg_t *pFtmMsgRsp;
5393
5394 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5395 hdd_context_t *pHddCtx;
5396 v_CONTEXT_t pVosContext= NULL;
5397
5398 ENTER();
5399
5400 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5401
5402 if (!message )
5403 {
5404 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5405 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5406 return VOS_STATUS_E_INVAL;
5407 }
5408 /*Get the global context */
5409 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5410
5411 /*Get the Hdd Context */
5412 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5413
5414 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5415
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305416 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005417 complete(&pHddCtx->ftm.ftm_comp_var);
5418 }
5419 else {
5420 /*Response length to Ptt App*/
5421 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5422
5423 /*Ptt App expects the response length in LE */
5424 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5425
5426 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005427 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005428 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5429
5430 /*Copy the message*/
5431 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5432
5433 /*Update the error code*/
5434 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5435
5436 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5437
5438 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5439 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005440 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005441 return VOS_STATUS_E_FAILURE;
5442 }
5443 }
5444 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005445 return VOS_STATUS_SUCCESS;
5446
5447}