blob: 16b818e401b70fe8ac6b69e148e10d37fb01edb1 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam842dad02014-02-18 18:44:02 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**========================================================================
29
30 \file wlan_hdd_ftm.c
31
32 \brief This file contains the WLAN factory test mode implementation
33
34 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
35
36 Qualcomm Confidential and Proprietary.
37
38 ========================================================================*/
39
40/**=========================================================================
41
42 EDIT HISTORY FOR FILE
43
44
45 This section contains comments describing changes made to the module.
46 Notice that changes are listed in reverse chronological order.
47
48
49 $Header:$ $DateTime: $ $Author: $
50
51
52 when who what, where, why
53 -------- --- --------------------------------------------------------
54 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
55 for FTM and mission mode
56 04/5/09 Shailender Created module.
57
58 ==========================================================================*/
59#include <vos_mq.h>
60#include "vos_sched.h"
61#include <vos_api.h>
62#include "sirTypes.h"
63#include "halTypes.h"
64#include "sirApi.h"
65#include "sirMacProtDef.h"
66#include "sme_Api.h"
67#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070068#include "wlan_qct_sys.h"
69#include "wlan_qct_tl.h"
70#include "wlan_hdd_misc.h"
71#include "i_vos_packet.h"
72#include "vos_nvitem.h"
73#include "wlan_hdd_main.h"
74#include "vos_power.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070075#include "qwlan_version.h"
76
Jeff Johnson295189b2012-06-20 16:38:30 -070077#include "wlan_nv.h"
78#include "wlan_qct_wda.h"
79#include "cfgApi.h"
80#include "pttMsgApi.h"
81#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070082
Jeff Johnson295189b2012-06-20 16:38:30 -070083#define RXMODE_DISABLE_ALL 0
84#define RXMODE_ENABLE_ALL 1
85#define RXMODE_ENABLE_11GN 2
86#define RXMODE_ENABLE_11B 3
87
88#define FTM_CHAIN_SEL_NO_RX_TX 0
89#define FTM_CHAIN_SEL_R0_ON 1
90#define FTM_CHAIN_SEL_T0_ON 2
91#define FTM_CHAIN_SEL_R0_T0_ON 3
92#define FTM_CHAIN_SEL_MAX 3
93
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053094#define WCNSS_TXFIR_OFFSET 0x00018000
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096#ifndef QWLAN_PHYDBG_BASE
97#define QWLAN_PHYDBG_BASE 0x03004000
98#endif /* QWLAN_PHYDBG_BASE */
99
100#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800101#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
103#endif
104
105#ifndef QWLAN_AGC_BASE
106#define QWLAN_AGC_BASE 0x03013C00
107#endif /* QWLAN_AGC_BASE */
108
109#ifndef QWLAN_AGC_CHANNEL_FREQ_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800110#define QWLAN_AGC_CHANNEL_FREQ_REG (QWLAN_AGC_BASE + 0x34)
Jeff Johnson295189b2012-06-20 16:38:30 -0700111#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
112#endif /* QWLAN_AGC_CHANNEL_FREQ_REG */
113
114#ifndef QWLAN_AGC_SUBBAND_CONFIG_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800115#define QWLAN_AGC_SUBBAND_CONFIG_REG (QWLAN_AGC_BASE + 0x30)
Jeff Johnson295189b2012-06-20 16:38:30 -0700116#define QWLAN_AGC_SUBBAND_CONFIG_STG2_SUBBAND_MASK 0x03
117#endif /* QWLAN_AGC_SUBBAND_CONFIG_REG */
118
119#ifndef QWLAN_RFAPB_BASE
120#define QWLAN_RFAPB_BASE 0x0E02F800
121#endif /* QWLAN_RFAPB_BASE */
122
123#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800124#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700125#endif /* QWLAN_RFAPB_REV_ID_REG */
126
127#ifndef QWLAN_TXCTL_BASE
128#define QWLAN_TXCTL_BASE 0x03012000
129#endif /* QWLAN_TXCTL_BASE */
130
131#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800132#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700133#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
134#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
135#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
136#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
137#endif /* QWLAN_TXCTL_FSHIFT_REG */
138
139/* To set 4MAC addresses from given first MAC address,
140 * Last byte value within given MAC address must less than 0xFF - 3 */
141#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700142#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700143
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530144#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
145
Jeff Johnson295189b2012-06-20 16:38:30 -0700146typedef struct {
147 tANI_U32 tableSize; /* Whole NV Table Size */
148 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
149 eNvTable nvTable;
150 tANI_U8 tableData; /* Filled by host driver */
151} pttGetNvTable;
152
153typedef struct {
154 tANI_U32 tableSize; /* Whole NV Table Size */
155 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
156 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700157 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700158} pttSetNvTable;
159
Jeff Johnson295189b2012-06-20 16:38:30 -0700160
161extern const sHalNv nvDefaults;
162static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700163static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700164VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700165
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700166/* for PRIMA: all the available frequency, channal pair i the table are defined for channel frequency @ RF center frequency
Jeff Johnson295189b2012-06-20 16:38:30 -0700167 Since it is associated to agc.channel_freq register for mapping.
168 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
169*/
170static const freq_chan_t freq_chan_tbl[] = {
171 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
172 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
173};
174
175static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
176{
177 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
178 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
179 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
180 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
181 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
182 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
183 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
184 //Spica_Virgo 11A 20MHz Rates
185 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
186 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
187 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
188 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
189 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
190 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
191 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
192 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
193
194//MCS Index #0-15 (20MHz)
195 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
196 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
197 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
198 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
199 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
200 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
201 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
202 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530203 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_72_2_MBPS"},
204
205//MCS Index #8-15 (40MHz)
206
207 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_B_MBPS" },
208 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
209 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
210 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
211 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
212 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
213 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
214 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
215 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
216 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
217 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
218 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
219 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
220 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
221 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800222 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530223
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800224#ifdef WLAN_FEATURE_11AC
225 /*11AC rate 20MHZ Normal GI*/
226 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
227 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
228 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
229 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
230 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
231 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
232 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
233 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
234 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530235#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800236 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530237#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800238
239 /*11AC rate 20MHZ Short GI*/
240 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
241 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
242 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
243 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
244 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
245 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
246 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
247 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
248 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530249#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800250 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530251#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800252
253 /*11AC rates 40MHZ normal GI*/
254 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
255 "MCS_VHT40_NGI_CB_13_5_MBPS"},
256 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
257 "MCS_VHT40_NGI_CB_27_MBPS"},
258 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
259 "MCS_VHT40_NGI_CB_40_5_MBPS"},
260 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
261 "MCS_VHT40_NGI_CB_54_MBPS"},
262 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
263 "MCS_VHT40_NGI_CB_81_MBPS"},
264 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
265 "MCS_VHT40_NGI_CB_108_MBPS"},
266 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
267 "MCS_VHT40_NGI_CB_121_5_MBPS"},
268 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
269 "MCS_VHT40_NGI_CB_135_MBPS"},
270 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
271 "MCS_VHT40_NGI_CB_162_MBPS"},
272 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
273 "MCS_VHT40_NGI_CB_180_MBPS"},
274
275 /*11AC rates 40MHZ short GI*/
276 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
277 "MCS_VHT40_SGI_CB_15_MBPS"},
278 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
279 "MCS_VHT40_SGI_CB_30_MBPS"},
280 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
281 "MCS_VHT40_SGI_CB_45_MBPS"},
282 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
283 "MCS_VHT40_SGI_CB_60_MBPS"},
284 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
285 "MCS_VHT40_SGI_CB_90_MBPS"},
286 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
287 "MCS_VHT40_SGI_CB_120_MBPS"},
288 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
289 "MCS_VHT40_SGI_CB_135_MBPS"},
290 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
291 "MCS_VHT40_SGI_CB_150_MBPS"},
292 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
293 "MCS_VHT40_SGI_CB_180_MBPS"},
294 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
295 "MCS_VHT40_SGI_CB_200_MBPS"},
296
297 /*11AC rates 80 MHZ normal GI*/
298 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
299 "MCS_VHT80_NGI_CB_29_3_MBPS"},
300 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
301 "MCS_VHT80_NGI_CB_58_5_MBPS"},
302 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
303 "MCS_VHT80_NGI_CB_87_8_MBPS"},
304 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
305 "MCS_VHT80_NGI_CB_117_MBPS"},
306 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
307 "MCS_VHT80_NGI_CB_175_5_MBPS"},
308 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
309 "MCS_VHT80_NGI_CB_234_MBPS"},
310 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
311 "MCS_VHT80_NGI_CB_263_3_MBPS"},
312 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
313 "MCS_VHT80_NGI_CB_292_5_MBPS"},
314 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
315 "MCS_VHT80_NGI_CB_351_MBPS"},
316 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
317 "MCS_VHT80_NGI_CB_390_MBPS"},
318
319 /*11AC rates 80 MHZ short GI*/
320 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
321 "MCS_VHT80_SGI_CB_32_5_MBPS"},
322 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
323 "MCS_VHT80_SGI_CB_65_MBPS"},
324 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
325 "MCS_VHT80_SGI_CB_97_5_MBPS"},
326 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
327 "MCS_VHT80_SGI_CB_130_MBPS"},
328 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
329 "MCS_VHT80_SGI_CB_195_MBPS"},
330 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
331 "MCS_VHT80_SGI_CB_260_MBPS"},
332 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
333 "MCS_VHT80_SGI_CB_292_5_MBPS"},
334 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
335 "MCS_VHT80_SGI_CB_325_MBPS"},
336 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
337 "MCS_VHT80_SGI_CB_390_MBPS"},
338 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
339 "MCS_VHT80_SGI_CB_433_3_MBPS"},
340#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700341};
342
343static rateIndex2Preamble_t rate_index_2_preamble_table[] =
344{
345
346 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
347 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
348 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
349 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
350 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
351 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
352 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
353
Jeff Johnson295189b2012-06-20 16:38:30 -0700354
355 //Spica_Virgo 11A 20MHz Rates
356 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
357 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
358 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
359 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
360 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
361 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
362 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
363 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
364
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530365 // 11A 20MHz Rates
366 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
367 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
368 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
369 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
370 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
371 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
372 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
373 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
374
Jeff Johnson295189b2012-06-20 16:38:30 -0700375 //MCS Index #0-15 (20MHz)
376 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
377 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
378 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
379 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
380 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
381 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
382 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
383 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
385 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
386 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
387 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
388 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
389 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
390 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
391 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530392
393 //MCS index (40MHz)
394 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
395 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
396 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
397 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
398 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
399 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
400 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
401 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800409 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530410
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800411#ifdef WLAN_FEATURE_11AC
412 /*11AC rate 20MHZ Normal GI*/
413 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
419 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
420 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530422#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800423 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530424#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800425 /*11AC rate 20MHZ Short GI*/
426 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
431 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
432 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
433 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530435#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800436 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530437#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800438
439 /*11AC rates 40MHZ normal GI*/
440 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
443 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
444 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
445 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
450
451 /*11AC rates 40MHZ short GI*/
452 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
457 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
458 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
459 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
462
463 /*11AC rates 80 MHZ normal GI*/
464 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
465 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
466 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
467 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
468 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
469 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
470 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
471 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
472 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
473 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
474
475 /*11AC rates 80 MHZ short GI*/
476 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
477 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
478 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
479 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
480 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
481 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
482 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
483 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
484 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
485 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
486#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700487};
488
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530489static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
490 11, 12, 13, 14, 36, 40, 44, 48,
491 52, 56, 60, 64, 100, 104, 108,
492 112, 116, 120, 124, 128, 132,
493 136, 140, 149, 153, 157, 161,
494 165, 208, 212, 216, 240, 244,
495 248, 252, 0 };
496static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
497 42, 46, 50, 54, 58, 62, 102, 106,
498 110, 114, 118, 122, 126, 130, 134,
499 138, 151, 155, 159, 163, 210, 214,
500 242, 246, 250, 0 };
501static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
502 114, 118, 122, 126, 130, 134, 155,
503 159, 246, 0 };
504
Jeff Johnson295189b2012-06-20 16:38:30 -0700505typedef struct
506{
507 tANI_BOOLEAN frameGenEnabled;
508 tANI_BOOLEAN wfmEnabled;
509 sPttFrameGenParams frameParams;
510 v_U16_t txpower;
511 v_U16_t rxmode;
512 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530513 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700514
515} FTM_STATUS ;
516static FTM_STATUS ftm_status;
517
518//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530519static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700520
521static void _ftm_status_init(void)
522{
523 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
524 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
525 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
526
527 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
528 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
529 ftm_status.frameParams.numTestPackets = 0; //Continuous
530 ftm_status.frameParams.interFrameSpace = 10;
531 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
532 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
533 ftm_status.frameParams.payloadLength = 2000;
534 ftm_status.frameParams.payloadFillByte = 0xA5;
535 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
536 ftm_status.frameParams.tx_mode = 0;
537 ftm_status.frameParams.crc = 0;
538 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
539 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
540 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
541 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
542 ftm_status.txpower = 2 ;
543 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
544 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530545 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700546
547 return;
548}
549
550/**---------------------------------------------------------------------------
551
552 \brief wlan_ftm_postmsg() -
553
554 The function used for sending the command to the halphy.
555
556 \param - cmd_ptr - Pointer command buffer.
557
558 \param - cmd_len - Command length.
559
560 \return - 0 for success, non zero for failure
561
562 --------------------------------------------------------------------------*/
563
564static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
565{
566 vos_msg_t *ftmReqMsg;
567 vos_msg_t ftmMsg;
568 ENTER();
569
570 ftmReqMsg = (vos_msg_t *) cmd_ptr;
571
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700573 ftmMsg.reserved = 0;
574 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
575 ftmMsg.bodyval = 0;
576
577 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700578 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700579 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700580 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800581 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700582
583 return VOS_STATUS_E_FAILURE;
584 }
585
586 EXIT();
587 return VOS_STATUS_SUCCESS;
588}
589
590/*---------------------------------------------------------------------------
591
592 \brief wlan_ftm_vos_open() - Open the vOSS Module
593
594 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
595 Upon successful initialization:
596
597 - All VOS submodules should have been initialized
598
599 - The VOS scheduler should have opened
600
601 - All the WLAN SW components should have been opened. This include
602 MAC.
603
604
605 \param hddContextSize: Size of the HDD context to allocate.
606
607
608 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
609 is ready to be used.
610
611 VOS_STATUS_E_RESOURCES - System resources (other than memory)
612 are unavailable to initialize the scheduler
613
614
615 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
616
617 \sa wlan_ftm_vos_open()
618
619---------------------------------------------------------------------------*/
620static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_SIZE_t hddContextSize )
621{
622 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
623 int iter = 0;
624 tSirRetStatus sirStatus = eSIR_SUCCESS;
625 tMacOpenParameters macOpenParms;
626 pVosContextType gpVosContext = (pVosContextType)pVosContext;
627
628 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
629 "%s: Opening VOSS", __func__);
630
631 if (NULL == gpVosContext)
632 {
633 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
634 "%s: Trying to open VOSS without a PreOpen",__func__);
635 VOS_ASSERT(0);
636 return VOS_STATUS_E_FAILURE;
637 }
638
639 /* Initialize the probe event */
640 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
641 {
642 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
643 "%s: Unable to init probeEvent",__func__);
644 VOS_ASSERT(0);
645 return VOS_STATUS_E_FAILURE;
646 }
647
Jeff Johnson295189b2012-06-20 16:38:30 -0700648 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
649 {
650 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
651 "%s: Unable to init wdaCompleteEvent",__func__);
652 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700653
Jeff Johnson295189b2012-06-20 16:38:30 -0700654 goto err_probe_event;
655 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700656
657 /* Initialize the free message queue */
658 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
659 if (! VOS_IS_STATUS_SUCCESS(vStatus))
660 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700661 /* Critical Error ... Cannot proceed further */
662 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530663 "%s: Failed to initialize VOS free message queue %d",
664 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700665 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700666 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700667 }
668
669 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
670 {
671 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
672 &(gpVosContext->aMsgBuffers[iter]);
673 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
674 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
675 }
676
677 /* Now Open the VOS Scheduler */
678 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
679 sizeof(VosSchedContext));
680
681 if (!VOS_IS_STATUS_SUCCESS(vStatus))
682 {
683 /* Critical Error ... Cannot proceed further */
684 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530685 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700686 VOS_ASSERT(0);
687 goto err_msg_queue;
688 }
689
690 /* Open the SYS module */
691 vStatus = sysOpen(gpVosContext);
692
693 if (!VOS_IS_STATUS_SUCCESS(vStatus))
694 {
695 /* Critical Error ... Cannot proceed further */
696 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530697 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700698 VOS_ASSERT(0);
699 goto err_sched_close;
700 }
701
Jeff Johnson295189b2012-06-20 16:38:30 -0700702 /*Open the WDA module */
703 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
704 macOpenParms.driverType = eDRIVER_TYPE_MFG;
705 vStatus = WDA_open(gpVosContext, gpVosContext->pHDDContext, &macOpenParms);
706 if (!VOS_IS_STATUS_SUCCESS(vStatus))
707 {
708 /* Critical Error ... Cannot proceed further */
709 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530710 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700711 VOS_ASSERT(0);
712 goto err_sys_close;
713 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700714
715 /* initialize the NV module */
716 vStatus = vos_nv_open();
717 if (!VOS_IS_STATUS_SUCCESS(vStatus))
718 {
719 // NV module cannot be initialized, however the driver is allowed
720 // to proceed
721 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530722 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700723 goto err_wda_close;
724 }
725
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700726 vStatus = vos_nv_get_dictionary_data();
727
728 if (!VOS_IS_STATUS_SUCCESS(vStatus))
729 {
730 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530731 "%s : failed to get dictionary data for NV %d",
732 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700733 goto err_wda_close;
734 }
735
Jeff Johnson295189b2012-06-20 16:38:30 -0700736 /* If we arrive here, both threads dispacthing messages correctly */
737
738 /* Now proceed to open the MAC */
739
740 /* UMA is supported in hardware for performing the
741 frame translation 802.11 <-> 802.3 */
742 macOpenParms.frameTransRequired = 1;
743 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
744 &macOpenParms);
745
746 if (eSIR_SUCCESS != sirStatus)
747 {
748 /* Critical Error ... Cannot proceed further */
749 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530750 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700751 VOS_ASSERT(0);
752 goto err_nv_close;
753 }
754
Jeff Johnson295189b2012-06-20 16:38:30 -0700755 /* Now proceed to open the SME */
756 vStatus = sme_Open(gpVosContext->pMACContext);
757 if (!VOS_IS_STATUS_SUCCESS(vStatus))
758 {
759 /* Critical Error ... Cannot proceed further */
760 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530761 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700762 goto err_mac_close;
763 }
764 return VOS_STATUS_SUCCESS;
765
Jeff Johnson295189b2012-06-20 16:38:30 -0700766
767 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
768 "%s: VOSS successfully Opened",__func__);
769
770 return VOS_STATUS_SUCCESS;
771err_mac_close:
772 macClose(gpVosContext->pMACContext);
773
774err_nv_close:
775 vos_nv_close();
776
777err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700778 WDA_close(gpVosContext);
779
780err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700781 sysClose(gpVosContext);
782
783err_sched_close:
784 vos_sched_close(gpVosContext);
785err_msg_queue:
786 vos_mq_deinit(&gpVosContext->freeVosMq);
787
Jeff Johnson295189b2012-06-20 16:38:30 -0700788err_wda_complete_event:
789 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700790
791err_probe_event:
792 vos_event_destroy(&gpVosContext->ProbeEvent);
793
794 return VOS_STATUS_E_FAILURE;
795
796} /* wlan_ftm_vos_open() */
797
798/*---------------------------------------------------------------------------
799
800 \brief wlan_ftm_vos_close() - Close the vOSS Module
801
802 The \a wlan_ftm_vos_close() function closes the vOSS Module
803
804 \param vosContext context of vos
805
806 \return VOS_STATUS_SUCCESS - successfully closed
807
808 \sa wlan_ftm_vos_close()
809
810---------------------------------------------------------------------------*/
811
812static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
813{
814 VOS_STATUS vosStatus;
815 pVosContextType gpVosContext = (pVosContextType)vosContext;
816
Jeff Johnson295189b2012-06-20 16:38:30 -0700817 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
818 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
819 {
820 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530821 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700822 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
823 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700824
825 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
826 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
827 {
828 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530829 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700830 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
831 }
832
833 ((pVosContextType)vosContext)->pMACContext = NULL;
834
835 vosStatus = vos_nv_close();
836 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
837 {
838 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530839 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700840 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
841 }
842
843
844 vosStatus = sysClose( vosContext );
845 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
846 {
847 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530848 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
850 }
851
Jeff Johnson295189b2012-06-20 16:38:30 -0700852 vosStatus = WDA_close( vosContext );
853 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
854 {
855 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530856 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700857 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
858 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700859
860 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
861
862 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
863 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
864 {
865 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530866 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700867 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
868 }
869
Jeff Johnson295189b2012-06-20 16:38:30 -0700870 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
871 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
872 {
873 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530874 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700875 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
876 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700877
878 return VOS_STATUS_SUCCESS;
879}
880
881/**---------------------------------------------------------------------------
882
883 \brief wlan_ftm_priv_set_txifs() -
884
885 This function is used for
886
887 \param - pAdapter - Pointer HDD Context.
888 - ifs
889
890 \return - 0 for success, non zero for failure
891
892 --------------------------------------------------------------------------*/
893
894
895
896static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
897{
898 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
899 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
900 {
901 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
902 return VOS_STATUS_E_FAILURE;
903 }
904
905 /* do not allow to change setting when tx pktgen is enabled */
906 if (ftm_status.frameGenEnabled)
907 {
908 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
909 return VOS_STATUS_E_FAILURE;
910 }
911
912 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
913 {
c_hpothuffdb5272013-10-02 16:42:35 +0530914 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
915 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700916 return VOS_STATUS_E_FAILURE;
917 }
918
919 ftm_status.frameParams.interFrameSpace = ifs;
920
921 return VOS_STATUS_SUCCESS;
922}
923
924/**---------------------------------------------------------------------------
925
926 \brief wlan_ftm_priv_set_txpktcnt() -
927
928 This function is used for
929
930 \param - pAdapter - Pointer HDD Context.
931 - ifs
932
933 \return - 0 for success, non zero for failure
934
935 --------------------------------------------------------------------------*/
936
937static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
938{
939 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
940 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
941 {
942 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
943 return VOS_STATUS_E_FAILURE;
944 }
945
946 /* do not allow to change setting when tx pktgen is enabled */
947 if (ftm_status.frameGenEnabled)
948 {
949 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
950 return VOS_STATUS_E_FAILURE;
951 }
952
953 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
954 {
c_hpothuffdb5272013-10-02 16:42:35 +0530955 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
956 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700957 return VOS_STATUS_E_FAILURE;
958 }
959
960 ftm_status.frameParams.numTestPackets = cnt;
961
962 return VOS_STATUS_SUCCESS;
963}
964
965static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
966{
967 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
968 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
969 {
970 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
971 return VOS_STATUS_E_FAILURE;
972 }
973
974 /* do not allow to change setting when tx pktgen is enabled */
975 if (ftm_status.frameGenEnabled)
976 {
977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
978 return VOS_STATUS_E_FAILURE;
979 }
980
981 if (len > 4095) //4096
982 {
c_hpothuffdb5272013-10-02 16:42:35 +0530983 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
984 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700985 return VOS_STATUS_E_FAILURE;
986 }
987
988 ftm_status.frameParams.payloadLength = (tANI_U16)len;
989
990 return VOS_STATUS_SUCCESS;
991}
992
Jeff Johnson295189b2012-06-20 16:38:30 -0700993
994static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
995{
Jeff Johnson295189b2012-06-20 16:38:30 -0700996 uPttMsgs *pMsgBody;
997 VOS_STATUS status;
998 v_U16_t chainSelect_save = chainSelect;
999 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301000 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001001
1002 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1003 {
1004 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1005 return VOS_STATUS_E_FAILURE;
1006 }
1007
1008 if (chainSelect > FTM_CHAIN_SEL_MAX)
1009 {
c_hpothuffdb5272013-10-02 16:42:35 +05301010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1011 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001012 return VOS_STATUS_E_FAILURE;
1013 }
1014
1015 /* do not allow to change setting when tx pktgen is enabled */
1016 if (ftm_status.frameGenEnabled)
1017 {
1018 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1019 return VOS_STATUS_E_FAILURE;
1020 }
1021
1022 switch (chainSelect)
1023 {
1024 case FTM_CHAIN_SEL_NO_RX_TX:
1025 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1026 break;
1027
1028 case FTM_CHAIN_SEL_R0_ON:
1029 chainSelect = PHY_CHAIN_SEL_R0_ON;
1030 break;
1031
1032 case FTM_CHAIN_SEL_T0_ON:
1033 chainSelect = PHY_CHAIN_SEL_T0_ON;
1034 break;
1035 }
1036
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301037 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001038 init_completion(&pHddCtx->ftm.ftm_comp_var);
1039 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1040 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1041
1042 pMsgBody = &pMsgBuf->msgBody;
1043 pMsgBody->EnableChains.chainSelect = chainSelect;
1044
1045 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1046
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301047 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001048 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301049 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1050 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001051 status = VOS_STATUS_E_FAILURE;
1052 goto done;
1053 }
c_hpothuffdb5272013-10-02 16:42:35 +05301054 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301055 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301056 if (0 >= ret)
1057 {
1058 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1059 FL("wait on ftm_comp_var failed %ld"), ret);
1060 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001061
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301062 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001063 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301064 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1065 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001066 status = VOS_STATUS_E_FAILURE;
1067 goto done;
1068 }
1069 ftm_status.chainSelect = chainSelect_save;
1070done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001071
1072 return status;
1073}
1074
1075/**---------------------------------------------------------------------------
1076 --------------------------------------------------------------------------*/
1077static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1078{
1079 int ii;
1080 int lenBuf = WE_FTM_MAX_STR_LEN;
1081 int lenRes = 0;
1082 char *chain[] = {
1083 "None",
1084 "R0,R1",
1085 "R0",
1086 "R1",
1087 "T0",
1088 "R0,R1,T0"
1089 };
1090 char *rx[] = {
1091 "disable",
1092 "11b/g/n",
1093 "11g/n",
1094 "11b"
1095 };
1096 char *tx[] = {
1097 "stopped",
1098 "started",
1099 };
1100 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1101
1102 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1103 {
1104 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1105 return VOS_STATUS_E_FAILURE;
1106 }
1107
1108 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001109 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001110 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1111 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001112 ftm_status.frameParams.interFrameSpace);
1113 if ((lenRes < 0) || (lenRes >= lenBuf))
1114 {
c_hpothuffdb5272013-10-02 16:42:35 +05301115 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1116 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001117 return VOS_STATUS_E_FAILURE;
1118 }
1119
1120 buf += lenRes;
1121 lenBuf -= lenRes;
1122
1123 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1124 {
1125 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1126 break;
1127 }
1128
1129 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1130 {
1131 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1132 }
1133 else
1134 {
1135 lenRes = strlcpy(buf, "invalid", lenBuf);
1136 }
1137 if ((lenRes < 0) || (lenRes >= lenBuf))
1138 {
c_hpothuffdb5272013-10-02 16:42:35 +05301139 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1140 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001141 return VOS_STATUS_E_FAILURE;
1142 }
1143
1144 buf += lenRes;
1145 lenBuf -= lenRes;
1146
Jeff Johnson02797792013-10-26 19:17:13 -07001147 lenRes = snprintf(buf, lenBuf, "\n txpower: %d\n txpktcnt: %d\n "
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001148 "txpktlen: %d\n", ftm_status.txpower,
1149 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001150 ftm_status.frameParams.payloadLength);
1151
1152 if ((lenRes < 0) || (lenRes >= lenBuf))
1153 {
c_hpothuffdb5272013-10-02 16:42:35 +05301154 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1155 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001156 return VOS_STATUS_E_FAILURE;
1157 }
1158
1159 return VOS_STATUS_SUCCESS;
1160}
1161
Jeff Johnson295189b2012-06-20 16:38:30 -07001162
1163void HEXDUMP(char *s0, char *s1, int len)
1164{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301165 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001166 printk(KERN_EMERG "%s\n :", s0);
1167
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301168 if (len > 8)
1169 {
1170 for (j = 0; j < len/8; j++)
1171 {
1172 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1173 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1174 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1175 }
1176 len = len - j*8;
1177 }
1178 for (i = 0; i< len; i++) {
1179 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001180 }
1181 printk("\n");
1182}
1183
Jeff Johnson295189b2012-06-20 16:38:30 -07001184/*---------------------------------------------------------------------------
1185
1186 \brief vos_ftm_preStart() -
1187
1188 The \a vos_ftm_preStart() function to download CFG.
1189 including:
1190 - ccmStart
1191
1192 - WDA: triggers the CFG download
1193
1194
1195 \param pVosContext: The VOS context
1196
1197
1198 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1199 is ready to be used.
1200
1201 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1202 are unavailable to initialize the scheduler
1203
1204
1205 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1206
1207 \sa vos_start
1208
1209---------------------------------------------------------------------------*/
1210VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1211{
1212 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1213 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001214
Jeff Johnson295189b2012-06-20 16:38:30 -07001215 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1216 "vos prestart");
1217
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001218 if (NULL == pVosContext->pWDAContext)
1219 {
1220 VOS_ASSERT(0);
1221 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1222 "%s: WDA NULL context", __func__);
1223 return VOS_STATUS_E_FAILURE;
1224 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001225
1226 /* call macPreStart */
1227 vStatus = macPreStart(pVosContext->pMACContext);
1228 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1229 {
1230 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1231 "Failed at macPreStart ");
1232 return VOS_STATUS_E_FAILURE;
1233 }
1234
1235 /* call ccmStart */
1236 ccmStart(pVosContext->pMACContext);
1237
1238 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001239 vos_event_reset(&pVosContext->wdaCompleteEvent);
1240
Jeff Johnson295189b2012-06-20 16:38:30 -07001241
1242 /*call WDA pre start*/
1243 vStatus = WDA_preStart(pVosContext);
1244 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1245 {
1246 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1247 "Failed to WDA prestart ");
1248 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1249 ccmStop(pVosContext->pMACContext);
1250 VOS_ASSERT(0);
1251 return VOS_STATUS_E_FAILURE;
1252 }
1253
1254 /* Need to update time out of complete */
1255 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1256 if ( vStatus != VOS_STATUS_SUCCESS )
1257 {
1258 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1259 {
1260 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001261 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001262 }
1263 else
1264 {
1265 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001266 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001267 }
1268 VOS_ASSERT( 0 );
1269 return VOS_STATUS_E_FAILURE;
1270 }
1271
1272 return VOS_STATUS_SUCCESS;
1273}
Jeff Johnson295189b2012-06-20 16:38:30 -07001274
1275/**---------------------------------------------------------------------------
1276
1277 \brief wlan_hdd_ftm_open() -
1278
1279 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1280
1281 \param - pAdapter - Pointer HDD Context.
1282
1283 \return - 0 for success, non zero for failure
1284
1285 --------------------------------------------------------------------------*/
1286
1287int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1288{
1289 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1290 pVosContextType pVosContext= NULL;
1291 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001292
Jeff Johnson295189b2012-06-20 16:38:30 -07001293 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1294 "%s: Opening VOSS", __func__);
1295
1296 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1297
1298 if (NULL == pVosContext)
1299 {
1300 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301301 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001302 VOS_ASSERT(0);
1303 goto err_vos_status_failure;
1304 }
1305
1306 // Open VOSS
1307 vStatus = wlan_ftm_vos_open( pVosContext, 0);
1308
1309 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1310 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301311 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001312 goto err_vos_status_failure;
1313 }
1314
Jeff Johnson295189b2012-06-20 16:38:30 -07001315 /*
1316 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1317 */
1318 /* Save the hal context in Adapter */
1319 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001320
1321 if ( NULL == pHddCtx->hHal )
1322 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301323 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001324 goto err_sal_close;
1325 }
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__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001332 goto err_adapter_open_failure;
1333 }
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__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001338 goto err_sal_close;
1339 }
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
1411err_adapter_open_failure:
1412hdd_close_all_adapters( pHddCtx );
1413
1414err_sal_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001415
1416err_vos_status_failure:
1417
1418 return VOS_STATUS_E_FAILURE;
1419}
1420
1421
1422
1423int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1424{
1425 VOS_STATUS vosStatus;
1426 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1427
1428 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1429 ENTER();
1430 if(pAdapter == NULL)
1431 {
1432 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1433 return VOS_STATUS_E_NOMEM;
1434 }
1435
Leo Chang4e8183f2013-05-31 15:38:34 -07001436 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1437 {
1438 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1439 "%s: Ftm has been started. stopping ftm", __func__);
1440 wlan_ftm_stop(pHddCtx);
1441 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001442
1443 //Assert Deep sleep signal now to put Libra HW in lowest power state
1444 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301445 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1446 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1447 "%s: Failed to assert deep sleep signal", __func__);
1448 VOS_ASSERT( 0 );
1449 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001450
1451 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301452 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1453 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1454 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1455 "%s: Failed to put HW into low power", __func__);
1456 VOS_ASSERT( 0 );
1457 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001458
1459 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1460
Leo Chang59cdc7e2013-07-10 10:08:21 -07001461#ifdef WLAN_KD_READY_NOTIFIER
1462 nl_srv_exit(pHddCtx->ptt_pid);
1463#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001464 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001465#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001466 //TODO----------
1467 //Deregister the device with the kernel
1468 hdd_UnregisterWext(pAdapter->dev);
1469
1470 hdd_close_all_adapters( pHddCtx );
1471#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001472 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001473 {
1474 unregister_netdev(pAdapter->dev);
1475 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1476 }
1477#endif
1478 //-----------------
1479
1480 vosStatus = vos_sched_close( vosContext );
1481 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1482 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1483 "%s: Failed to close VOSS Scheduler",__func__);
1484 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1485 }
1486
1487 //Close VOSS
1488 wlan_ftm_vos_close(vosContext);
1489
1490
1491 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1492 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1493 {
1494 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1495 "%s: Failed to destroy ftm_vos Event",__func__);
1496 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1497 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001498 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001499
1500 //Free up dynamically allocated members inside HDD Adapter
1501 kfree(pHddCtx->cfg_ini);
1502 pHddCtx->cfg_ini= NULL;
1503
1504 return 0;
1505
1506}
1507
1508/**---------------------------------------------------------------------------
1509
1510 \brief wlan_ftm_send_response() -
1511
1512 The function sends the response to the ptt socket application running in user space.
1513
1514 \param - pAdapter - Pointer HDD Context.
1515
1516 \return - 0 for success, non zero for failure
1517
1518 --------------------------------------------------------------------------*/
1519
1520static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1521
1522 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
1523
Arif Hussain6d2a3322013-11-17 19:50:10 -08001524 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 -07001525 return VOS_STATUS_E_FAILURE;
1526 }
1527 return VOS_STATUS_SUCCESS;
1528}
1529
1530/**---------------------------------------------------------------------------
1531
1532 \brief wlan_hdd_ftm_start() -
1533
1534 This function gets called when the FTM start commands received from the ptt socket application and
1535 it starts the following modules.
1536 1) SAL Start.
1537 2) BAL Start.
1538 3) MAC Start to download the firmware.
1539
1540
1541 \param - pAdapter - Pointer HDD Context.
1542
1543 \return - 0 for success, non zero for failure
1544
1545 --------------------------------------------------------------------------*/
1546
1547static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1548{
1549 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1550 tSirRetStatus sirStatus = eSIR_SUCCESS;
1551 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1552 tHalMacStartParameters halStartParams;
1553
1554 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1555 {
1556 return VOS_STATUS_SUCCESS;
1557 }
1558
1559 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1560 "%s: Starting Libra SW", __func__);
1561
1562 /* We support only one instance for now ...*/
1563 if (pVosContext == NULL)
1564 {
1565 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001566 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001567 goto err_status_failure;
1568 }
1569
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001570
Jeff Johnson295189b2012-06-20 16:38:30 -07001571 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001572 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001573 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001574 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001575 goto err_status_failure;
1576 }
1577
Jeff Johnson295189b2012-06-20 16:38:30 -07001578 /*
1579 Prima needs to start the WDA correctly instead of BAL and SAL
1580 */
1581
1582 /* Vos preStart is calling */
1583 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1584 {
1585 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1586 goto err_status_failure;
1587 }
1588
1589
1590 vStatus = WDA_NVDownload_Start(pVosContext);
1591
1592 if ( vStatus != VOS_STATUS_SUCCESS )
1593 {
1594 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1595 "%s: Failed to start NV Download",__func__);
1596 return VOS_STATUS_E_FAILURE;
1597 }
1598
1599 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1600
1601 if ( vStatus != VOS_STATUS_SUCCESS )
1602 {
1603 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1604 {
1605 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001606 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001607 }
1608 else
1609 {
1610 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001611 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001612 }
1613 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301614 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001615 }
1616
1617 vStatus = WDA_start(pVosContext);
1618 if (vStatus != VOS_STATUS_SUCCESS)
1619 {
1620 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1621 "%s: Failed to start WDA",__func__);
1622 goto err_status_failure;
1623 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001624
Jeff Johnson295189b2012-06-20 16:38:30 -07001625
1626 /* Start the MAC */
1627 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1628
Jeff Johnson295189b2012-06-20 16:38:30 -07001629
1630 halStartParams.driverType = eDRIVER_TYPE_MFG;
1631
1632 /* Start the MAC */
1633 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1634
Jeff Johnson295189b2012-06-20 16:38:30 -07001635
1636 if (eSIR_SUCCESS != sirStatus)
1637 {
1638 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1639 "%s: Failed to start MAC", __func__);
1640
Jeff Johnson295189b2012-06-20 16:38:30 -07001641 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001642 }
1643
1644 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1645 "%s: MAC correctly started",__func__);
1646
Jeff Johnson295189b2012-06-20 16:38:30 -07001647
1648 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1649
1650 return VOS_STATUS_SUCCESS;
1651
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001652err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001653 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1654 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1655 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1656 if(vStatus != VOS_STATUS_SUCCESS)
1657 {
1658 if(vStatus == VOS_STATUS_E_TIMEOUT)
1659 {
1660 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001661 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001662
1663 }
1664 else
1665 {
1666 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001667 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001668 }
1669 VOS_ASSERT(0);
1670 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001671
1672err_status_failure:
1673
1674 return VOS_STATUS_E_FAILURE;
1675
1676}
1677
1678
1679static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1680{
1681 VOS_STATUS vosStatus;
1682
1683 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1684 {
1685 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1686 return VOS_STATUS_E_FAILURE;
1687 }
1688
1689 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1690 {
1691 /* STOP MAC only */
1692 v_VOID_t *hHal;
1693 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1694 if (NULL == hHal)
1695 {
1696 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1697 "%s: NULL hHal", __func__);
1698 }
1699 else
1700 {
1701 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1702 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1703 {
1704 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1705 "%s: Failed to stop SYS", __func__);
1706 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1707 }
1708 }
1709
Jeff Johnson295189b2012-06-20 16:38:30 -07001710
Jeff Johnson295189b2012-06-20 16:38:30 -07001711 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001712
1713 }
1714 return WLAN_FTM_SUCCESS;
1715}
1716
Jeff Johnson295189b2012-06-20 16:38:30 -07001717/**---------------------------------------------------------------------------
1718
1719 \brief wlan_hdd_ftm_get_nv_table() -
1720 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001721 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001722
1723 \param - ftmCmd - Pointer FTM Commad Buffer
1724
1725 \return - int
1726 -1, Process Host command fail, vail out
1727 1, Process Host command success
1728
1729 --------------------------------------------------------------------------*/
1730int wlan_hdd_ftm_get_nv_table
1731(
1732 hdd_context_t *pHddCtx,
1733 tPttMsgbuffer *ftmCmd
1734)
1735{
1736 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1737 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1738 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001739 sHalNvV2 *nvContents = NULL;
1740 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001741
Jeff Johnson295189b2012-06-20 16:38:30 -07001742 if (NULL == pHddCtx)
1743 {
1744 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1745 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001746 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001747 }
1748
Leo Chang80de3c22013-11-26 10:52:12 -08001749 nvVersion = vos_nv_getNvVersion();
1750 if (E_NV_V2 != nvVersion)
1751 {
1752 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1753 "%s : Not valid NV Version %d", __func__, nvVersion);
1754 return -EINVAL;
1755 }
1756
Jeff Johnson295189b2012-06-20 16:38:30 -07001757 /* Test first chunk of NV table */
1758 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1759 (0 == pHddCtx->ftm.processedNVTableSize))
1760 {
1761 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1762 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1763 {
c_hpothuffdb5272013-10-02 16:42:35 +05301764 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1765 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001766 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001767 }
1768
1769 switch (nvTable->nvTable)
1770 {
1771 case NV_TABLE_RATE_POWER_SETTINGS:
1772 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1773 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1774 break;
1775
1776 case NV_TABLE_REGULATORY_DOMAINS:
1777 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1778 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1779 break;
1780
1781 case NV_TABLE_DEFAULT_COUNTRY:
1782 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1783 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1784 break;
1785
1786 case NV_TABLE_TPC_POWER_TABLE:
1787 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1788 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1789 break;
1790
1791 case NV_TABLE_TPC_PDADC_OFFSETS:
1792 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1793 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1794 break;
1795
1796 case NV_TABLE_VIRTUAL_RATE:
1797 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1798 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1799 break;
1800
1801 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1802 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1803 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1804 break;
1805
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001806 case NV_TABLE_HW_CAL_VALUES:
1807 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1808 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1809 break;
1810
1811 case NV_TABLE_FW_CONFIG:
1812 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1813 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001814 break;
1815
1816 case NV_TABLE_ANTENNA_PATH_LOSS:
1817 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1818 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1819 break;
1820
1821 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1822 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1823 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1824 break;
1825
1826 default:
1827 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1828 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001829 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001830 break;
1831 }
1832
1833 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1834 {
1835 /* Invalid table size, discard and initialize data */
1836 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001837 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001838 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001839 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001840 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1841 pHddCtx->ftm.targetNVTableSize = 0;
1842 pHddCtx->ftm.processedNVTableSize = 0;
1843 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001844 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001845 }
1846
1847 /* Set Current Processing NV table type */
1848 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
1849 /* Copy target NV table value into temp context buffer */
1850 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
1851 pHddCtx->ftm.targetNVTablePointer,
1852 pHddCtx->ftm.targetNVTableSize);
1853
1854 }
1855
1856 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
1857 {
1858 /* Invalid table type */
1859 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1860 "Invalid NV Table, now Processing %d, not %d",
1861 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
1862 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1863 pHddCtx->ftm.targetNVTableSize = 0;
1864 pHddCtx->ftm.processedNVTableSize = 0;
1865 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001866
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001867 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001868 }
1869
1870 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001871 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07001872 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
1873 nvTable->chunkSize);
1874 /* Update processed pointer to prepare next chunk copy */
1875 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
1876
1877 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
1878 {
1879 /* Finished to process last chunk of data, initialize buffer */
1880 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1881 pHddCtx->ftm.targetNVTableSize = 0;
1882 pHddCtx->ftm.processedNVTableSize = 0;
1883 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
1884 }
1885
1886 return 1;
1887}
1888
1889/**---------------------------------------------------------------------------
1890
1891 \brief wlan_hdd_ftm_set_nv_table() -
1892 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08001893 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001894
1895 \param - ftmCmd - Pointer FTM Commad Buffer
1896
1897 \return - int
1898 -1, Process Host command fail, vail out
1899 1, Process Host command success
1900
1901 --------------------------------------------------------------------------*/
1902int wlan_hdd_ftm_set_nv_table
1903(
1904 hdd_context_t *pHddCtx,
1905 tPttMsgbuffer *ftmCmd
1906)
1907{
1908 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1909 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
1910 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001911 sHalNvV2 *nvContents = NULL;
1912 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001913
1914 if (NULL == pHddCtx)
1915 {
1916 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1917 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001918 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001919 }
1920
Leo Chang80de3c22013-11-26 10:52:12 -08001921 nvVersion = vos_nv_getNvVersion();
1922 if (E_NV_V2 != nvVersion)
1923 {
1924 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1925 "%s : Not valid NV Version %d", __func__, nvVersion);
1926 return -EINVAL;
1927 }
1928
Jeff Johnson295189b2012-06-20 16:38:30 -07001929 /* Test first chunk of NV table */
1930 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1931 (0 == pHddCtx->ftm.processedNVTableSize))
1932 {
1933 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1934 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1935 {
c_hpothuffdb5272013-10-02 16:42:35 +05301936 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1937 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001938 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001939 }
1940
1941 switch (nvTable->nvTable)
1942 {
1943 case NV_TABLE_RATE_POWER_SETTINGS:
1944 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1945 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1946 break;
1947
1948 case NV_TABLE_REGULATORY_DOMAINS:
1949 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1950 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1951 break;
1952
1953 case NV_TABLE_DEFAULT_COUNTRY:
1954 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1955 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1956 break;
1957
1958 case NV_TABLE_TPC_POWER_TABLE:
1959 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1960 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1961 break;
1962
1963 case NV_TABLE_TPC_PDADC_OFFSETS:
1964 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1965 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1966 break;
1967
1968 case NV_TABLE_VIRTUAL_RATE:
1969 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1970 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1971 break;
1972
1973 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1974 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1975 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1976 break;
1977
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001978 case NV_TABLE_HW_CAL_VALUES:
1979 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1980 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1981 break;
1982
1983 case NV_TABLE_FW_CONFIG:
1984 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1985 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001986 break;
1987
1988 case NV_TABLE_ANTENNA_PATH_LOSS:
1989 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1990 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1991 break;
1992
1993 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1994 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1995 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1996 break;
1997
1998 default:
1999 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2000 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002001 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002002 break;
2003 }
2004
2005 /* Set Current Processing NV table type */
2006 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2007 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2008 {
2009 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2010 "Invalid Table Size %d", nvTable->tableSize);
2011 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2012 pHddCtx->ftm.targetNVTableSize = 0;
2013 pHddCtx->ftm.processedNVTableSize = 0;
2014 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002015 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002016 }
2017 }
2018
2019 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2020 {
2021 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2022 "Invalid NV Table, now Processing %d, not %d",
2023 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2024 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2025 pHddCtx->ftm.targetNVTableSize = 0;
2026 pHddCtx->ftm.processedNVTableSize = 0;
2027 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002028 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002029 }
2030 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002031 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002032 nvTable->chunkSize);
2033
2034 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2035 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2036 {
2037 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2038 pHddCtx->ftm.tempNVTableBuffer,
2039 pHddCtx->ftm.targetNVTableSize);
2040 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2041 pHddCtx->ftm.targetNVTableSize = 0;
2042 pHddCtx->ftm.processedNVTableSize = 0;
2043 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2044 }
2045
2046 return 1;
2047}
2048
2049/**---------------------------------------------------------------------------
2050
2051 \brief wlan_hdd_ftm_blank_nv() -
2052 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002053 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002054
2055 \param - ftmCmd - Pointer FTM Commad Buffer
2056
2057 \return - int
2058 -1, Process Host command fail, vail out
2059 0, Process Host command success
2060
2061 --------------------------------------------------------------------------*/
2062int wlan_hdd_ftm_blank_nv_table
2063(
2064 tPttMsgbuffer *ftmCmd
2065)
2066{
Leo Chang80de3c22013-11-26 10:52:12 -08002067 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002068 v_SIZE_t nvSize;
2069 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002070 sHalNvV2 *nvContents = NULL;
2071 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002072
2073 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2074 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2075 {
c_hpothuffdb5272013-10-02 16:42:35 +05302076 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2077 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002078 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002079 }
2080
Leo Chang80de3c22013-11-26 10:52:12 -08002081 nvVersion = vos_nv_getNvVersion();
2082 if (E_NV_V2 != nvVersion)
2083 {
2084 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2085 "%s : Not valid NV Version %d", __func__, nvVersion);
2086 return -EINVAL;
2087 }
2088
Jeff Johnson295189b2012-06-20 16:38:30 -07002089 itemSize = sizeof(nvContents->tables.pwrOptimum);
2090 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002091 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002092 itemSize);
2093
2094 itemSize = sizeof(nvContents->tables.regDomains);
2095 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002096 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002097 itemSize);
2098
2099 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2100 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002101 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 itemSize);
2103
2104 itemSize = sizeof(nvContents->tables.plutCharacterized);
2105 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002106 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002107 itemSize);
2108
2109 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2110 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002111 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002112 itemSize);
2113
2114 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2115 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002116 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002117 itemSize);
2118
2119 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2120 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002121 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002122 itemSize);
2123
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002124 itemSize = sizeof(nvContents->tables.hwCalValues);
2125 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002126 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002127 itemSize);
2128
2129 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2130 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002131 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002132 itemSize);
2133
2134 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2135 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002136 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002137 itemSize);
2138
2139 return 1;
2140}
2141
2142/**---------------------------------------------------------------------------
2143
2144 \brief wlan_hdd_ftm_delete_nv_table() -
2145 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002146 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002147
2148 \param - ftmCmd - Pointer FTM Commad Buffer
2149
2150 \return - int
2151 -1, Process Host command fail, vail out
2152 1, Process Host command success
2153
2154 --------------------------------------------------------------------------*/
2155int wlan_hdd_ftm_delete_nv_table
2156(
2157 tPttMsgbuffer *ftmCmd
2158)
2159{
Leo Chang80de3c22013-11-26 10:52:12 -08002160 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002161 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2162 v_SIZE_t nvSize;
2163 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002164 sHalNvV2 *nvContents = NULL;
2165 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002166
2167 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2168 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2169 {
c_hpothuffdb5272013-10-02 16:42:35 +05302170 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2171 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002172 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002173 }
2174
Leo Chang80de3c22013-11-26 10:52:12 -08002175 nvVersion = vos_nv_getNvVersion();
2176 if (E_NV_V2 != nvVersion)
2177 {
2178 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2179 "%s : Not valid NV Version %d", __func__, nvVersion);
2180 return -EINVAL;
2181 }
2182
Jeff Johnson295189b2012-06-20 16:38:30 -07002183 switch (nvTable->nvTable)
2184 {
2185 case NV_TABLE_RATE_POWER_SETTINGS:
2186 itemSize = sizeof(nvContents->tables.pwrOptimum);
2187 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002188 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002189 itemSize);
2190 break;
2191
2192 case NV_TABLE_REGULATORY_DOMAINS:
2193 itemSize = sizeof(nvContents->tables.regDomains);
2194 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002195 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002196 itemSize);
2197 break;
2198
2199 case NV_TABLE_DEFAULT_COUNTRY:
2200 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2201 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002202 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002203 itemSize);
2204 break;
2205
2206 case NV_TABLE_TPC_POWER_TABLE:
2207 itemSize = sizeof(nvContents->tables.plutCharacterized);
2208 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002209 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002210 itemSize);
2211 break;
2212
2213 case NV_TABLE_TPC_PDADC_OFFSETS:
2214 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2215 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002216 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002217 itemSize);
2218 break;
2219
2220 case NV_TABLE_VIRTUAL_RATE:
2221 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2222 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002223 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002224 itemSize);
2225 break;
2226
2227 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2228 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2229 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002230 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002231 itemSize);
2232 break;
2233
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002234 case NV_TABLE_HW_CAL_VALUES:
2235 itemSize = sizeof(nvContents->tables.hwCalValues);
2236 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002237 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002238 itemSize);
2239 break;
2240
2241 case NV_TABLE_FW_CONFIG:
2242 itemSize = sizeof(nvContents->tables.fwConfig);
2243 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002244 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002245 itemSize);
2246 break;
2247
2248 case NV_TABLE_ANTENNA_PATH_LOSS:
2249 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2250 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002251 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002252 itemSize);
2253 break;
2254
2255 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2256 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2257 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002258 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002259 itemSize);
2260 break;
2261
2262 default:
2263 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2264 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002265 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002266 break;
2267 }
2268
2269 return 1;
2270}
2271
2272/**---------------------------------------------------------------------------
2273
2274 \brief wlan_hdd_ftm_get_nv_field() -
2275 Get Specific NV field
2276
2277 \param - ftmCmd - Pointer FTM Commad Buffer
2278
2279 \return - int
2280 -1, Process Host command fail, vail out
2281 1, Process Host command success
2282
2283 --------------------------------------------------------------------------*/
2284int wlan_hdd_ftm_get_nv_field
2285(
2286 tPttMsgbuffer *ftmCmd
2287)
2288{
2289 sNvFields nvFieldDataBuffer;
2290 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2291 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2292 sHalNv *nvContents = NULL;
2293 v_SIZE_t nvSize;
2294
2295 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2296 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2297 {
c_hpothuffdb5272013-10-02 16:42:35 +05302298 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2299 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002300 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002301 }
2302 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2303
2304 switch (nvField->nvField)
2305 {
2306 case NV_COMMON_PRODUCT_ID:
2307 memcpy((void *)&nvField->fieldData,
2308 &nvFieldDataBuffer.productId,
2309 sizeof(nvFieldDataBuffer.productId));
2310 break;
2311
2312 case NV_COMMON_PRODUCT_BANDS:
2313 memcpy((void *)&nvField->fieldData,
2314 &nvFieldDataBuffer.productBands,
2315 sizeof(nvFieldDataBuffer.productBands));
2316 break;
2317
2318 case NV_COMMON_NUM_OF_TX_CHAINS:
2319 memcpy((void *)&nvField->fieldData,
2320 &nvFieldDataBuffer.numOfTxChains,
2321 sizeof(nvFieldDataBuffer.numOfTxChains));
2322 break;
2323
2324 case NV_COMMON_NUM_OF_RX_CHAINS:
2325 memcpy((void *)&nvField->fieldData,
2326 &nvFieldDataBuffer.numOfRxChains,
2327 sizeof(nvFieldDataBuffer.numOfRxChains));
2328 break;
2329
2330 case NV_COMMON_MAC_ADDR:
2331 memcpy((void *)&nvField->fieldData,
2332 &nvFieldDataBuffer.macAddr[0],
2333 NV_FIELD_MAC_ADDR_SIZE);
2334 break;
2335
2336 case NV_COMMON_MFG_SERIAL_NUMBER:
2337 memcpy((void *)&nvField->fieldData,
2338 &nvFieldDataBuffer.mfgSN[0],
2339 NV_FIELD_MFG_SN_SIZE);
2340 break;
2341
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002342 case NV_COMMON_WLAN_NV_REV_ID:
2343 memcpy((void *)&nvField->fieldData,
2344 &nvFieldDataBuffer.wlanNvRevId,
2345 sizeof(nvFieldDataBuffer.wlanNvRevId));
2346 break;
2347
Jeff Johnson295189b2012-06-20 16:38:30 -07002348 case NV_COMMON_COUPLER_TYPE:
2349 memcpy((void *)&nvField->fieldData,
2350 &nvFieldDataBuffer.couplerType,
2351 sizeof(nvFieldDataBuffer.couplerType));
2352 break;
2353
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002354 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002355 {
2356 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2357 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2358
2359 nvEmbededStatus = vos_nv_isEmbeddedNV();
2360
2361 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2362 {
2363 // High bit is set to indicate embedded NV..
2364 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2365 }
2366
2367 memcpy((void *)&nvField->fieldData,
2368 &nvVersion,
2369 sizeof(nvFieldDataBuffer.nvVersion));
2370 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002371 break;
2372
Jeff Johnson295189b2012-06-20 16:38:30 -07002373 default:
2374 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2375 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002376 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002377 break;
2378 }
2379
2380 return 1;
2381}
2382
2383/**---------------------------------------------------------------------------
2384
2385 \brief wlan_hdd_ftm_set_nv_field() -
2386 Set Specific NV field
2387
2388 \param - ftmCmd - Pointer FTM Commad Buffer
2389
2390 \return - int
2391 -1, Process Host command fail, vail out
2392 1, Process Host command success
2393
2394 --------------------------------------------------------------------------*/
2395int wlan_hdd_ftm_set_nv_field
2396(
2397 tPttMsgbuffer *ftmCmd
2398)
2399{
2400 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2401 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2402 v_SIZE_t nvSize;
2403 sHalNv *nvContents = NULL;
2404 v_U8_t macLoop;
2405 v_U8_t *pNVMac;
2406 v_U8_t lastByteMAC;
2407
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002408
Jeff Johnson295189b2012-06-20 16:38:30 -07002409 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2410 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2411 {
c_hpothuffdb5272013-10-02 16:42:35 +05302412 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2413 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002414 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002415 }
2416
2417 switch (nvField->nvField)
2418 {
2419 case NV_COMMON_PRODUCT_ID:
2420 memcpy(&nvContents->fields.productId,
2421 &nvField->fieldData,
2422 sizeof(nvContents->fields.productId));
2423 break;
2424
2425 case NV_COMMON_PRODUCT_BANDS:
2426 memcpy(&nvContents->fields.productBands,
2427 &nvField->fieldData,
2428 sizeof(nvContents->fields.productBands));
2429 break;
2430
2431 case NV_COMMON_NUM_OF_TX_CHAINS:
2432 memcpy(&nvContents->fields.numOfTxChains,
2433 &nvField->fieldData,
2434 sizeof(nvContents->fields.numOfTxChains));
2435 break;
2436
2437 case NV_COMMON_NUM_OF_RX_CHAINS:
2438 memcpy(&nvContents->fields.numOfRxChains,
2439 &nvField->fieldData,
2440 sizeof(nvContents->fields.numOfRxChains));
2441 break;
2442
2443 case NV_COMMON_MAC_ADDR:
2444 /* If Last byte is larger than 252 (0xFC), return Error,
2445 * Since 3MACs should be derived from first MAC */
2446 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002447 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002448 {
2449 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2450 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002451 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002452 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002453 }
2454
2455 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002456 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002457 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2458 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002459 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002460 lastByteMAC + macLoop;
2461 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002462 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002463 NV_FIELD_MAC_ADDR_SIZE);
2464 }
2465 break;
2466
2467 case NV_COMMON_MFG_SERIAL_NUMBER:
2468 memcpy(&nvContents->fields.mfgSN[0],
2469 &nvField->fieldData,
2470 NV_FIELD_MFG_SN_SIZE);
2471 break;
2472
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002473 case NV_COMMON_WLAN_NV_REV_ID:
2474 memcpy(&nvContents->fields.wlanNvRevId,
2475 &nvField->fieldData,
2476 sizeof(nvContents->fields.wlanNvRevId));
2477 break;
2478
Jeff Johnson295189b2012-06-20 16:38:30 -07002479 case NV_COMMON_COUPLER_TYPE:
2480 memcpy(&nvContents->fields.couplerType,
2481 &nvField->fieldData,
2482 sizeof(nvContents->fields.couplerType));
2483 break;
2484
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002485 case NV_COMMON_NV_VERSION:
2486 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2487 "Cannot modify NV version field %d", nvField->nvField);
2488 return -EIO;
2489 break;
2490
Jeff Johnson295189b2012-06-20 16:38:30 -07002491 default:
2492 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2493 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002494 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002495 break;
2496 }
2497
2498 return 1;
2499}
2500
2501/**---------------------------------------------------------------------------
2502
2503 \brief wlan_hdd_ftm_store_nv_table() -
2504 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002505 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002506
2507 \param - ftmCmd - Pointer FTM Commad Buffer
2508
2509 \return - int
2510 -1, Process Host command fail, vail out
2511 0, Process Host command success
2512
2513 --------------------------------------------------------------------------*/
2514int wlan_hdd_ftm_store_nv_table
2515(
2516 tPttMsgbuffer *ftmCmd
2517)
2518{
2519 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2520 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002521 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2522 void *tablePtr = NULL;
2523 unsigned int tableSize = 0;
2524 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002525 sHalNvV2 *nvContents = NULL;
2526 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002527
2528 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2529 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2530 {
c_hpothuffdb5272013-10-02 16:42:35 +05302531 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2532 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002533 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002534 }
2535
Leo Chang80de3c22013-11-26 10:52:12 -08002536 nvVersion = vos_nv_getNvVersion();
2537 if (E_NV_V2 != nvVersion)
2538 {
2539 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2540 "%s : Not valid NV Version %d", __func__, nvVersion);
2541 return -EINVAL;
2542 }
2543
Jeff Johnson295189b2012-06-20 16:38:30 -07002544 /* Set Platform type as PRIMA */
2545 nvContents->fields.wlanNvRevId = 2;
2546
2547 switch(nvTable->nvTable)
2548 {
2549 case NV_FIELDS_IMAGE:
2550 tablePtr = (void *)&nvContents->fields;
2551 tableSize = sizeof(nvContents->fields);
2552 tableVNVType = VNV_FIELD_IMAGE;
2553 break;
2554
2555 case NV_TABLE_RATE_POWER_SETTINGS:
2556 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2557 tableSize = sizeof(nvContents->tables.pwrOptimum);
2558 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2559 break;
2560
2561 case NV_TABLE_REGULATORY_DOMAINS:
2562 tablePtr = (void *)&nvContents->tables.regDomains[0];
2563 tableSize = sizeof(nvContents->tables.regDomains);
2564 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2565 break;
2566
2567 case NV_TABLE_DEFAULT_COUNTRY:
2568 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2569 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2570 tableVNVType = VNV_DEFAULT_LOCATION;
2571 break;
2572
2573 case NV_TABLE_TPC_POWER_TABLE:
2574 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2575 tableSize = sizeof(nvContents->tables.plutCharacterized);
2576 tableVNVType = VNV_TPC_POWER_TABLE;
2577 break;
2578
2579 case NV_TABLE_TPC_PDADC_OFFSETS:
2580 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2581 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2582 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2583 break;
2584
2585 case NV_TABLE_VIRTUAL_RATE:
2586 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2587 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2588 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2589 break;
2590
2591 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2592 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2593 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2594 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2595 break;
2596
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002597 case NV_TABLE_HW_CAL_VALUES:
2598 tablePtr = (void *)&nvContents->tables.hwCalValues;
2599 tableSize = sizeof(nvContents->tables.hwCalValues);
2600 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002601 break;
2602
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002603 case NV_TABLE_FW_CONFIG:
2604 tablePtr = (void *)&nvContents->tables.fwConfig;
2605 tableSize = sizeof(nvContents->tables.fwConfig);
2606 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002607 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002608
Jeff Johnson295189b2012-06-20 16:38:30 -07002609 case NV_TABLE_ANTENNA_PATH_LOSS:
2610 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2611 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2612 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2613 break;
2614
2615 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2616 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2617 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2618 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2619 break;
2620
2621 default:
2622 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2623 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002624 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002625 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002626
Jeff Johnson295189b2012-06-20 16:38:30 -07002627 }
2628
2629 nvStatus = vos_nv_write(tableVNVType,
2630 tablePtr,
2631 tableSize);
2632 if(VOS_STATUS_SUCCESS != nvStatus)
2633 {
c_hpothuffdb5272013-10-02 16:42:35 +05302634 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2635 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002636 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002637 }
2638
2639 return 1;
2640}
2641
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002642/* --------------------------------------------------------------------------
2643 \brief wlan_hdd_ftm_get_nv_bin() -
2644 Get NV bin read from Flash Memory, file
2645
2646 \param - ftmCmd - Pointer FTM Commad Buffer
2647
2648 \return - int
2649 -1, Process Host command fail, vail out
2650 0, Process Host command success
2651--------------------------------------------------------------------------*/
2652
2653static int wlan_hdd_ftm_get_nv_bin
2654(
2655 v_U16_t msgId,
2656 hdd_context_t *pHddCtx,
2657 tPttMsgbuffer *ftmCmd
2658)
2659{
2660 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2661 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2662 v_SIZE_t nvSize;
2663 v_U8_t *nvContents;
2664 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002665 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002666
Leo Chang80de3c22013-11-26 10:52:12 -08002667 nvVersion = vos_nv_getNvVersion();
2668 if (E_NV_V3 != nvVersion)
2669 {
2670 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2671 "%s : Not valid NV Version %d", __func__, nvVersion);
2672 return -EINVAL;
2673 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002674
2675 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2676 (0 == pHddCtx->ftm.processedNVTableSize))
2677 {
2678 if ( msgId == PTT_MSG_GET_NV_BIN )
2679 {
2680 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2681 }
2682 else
2683 {
2684 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2685 }
2686
2687 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2688 {
c_hpothuffdb5272013-10-02 16:42:35 +05302689 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2690 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002691 return -EIO;
2692 }
2693
2694 switch (nvTable->nvTable)
2695 {
2696 case NV_BINARY_IMAGE:
2697 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2698 break;
2699 default:
2700 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2701 "Not Valid NV Table %d", nvTable->nvTable);
2702 return -EIO;
2703 break;
2704 }
2705
2706 /* Set Current Processing NV table type */
2707 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2708 if ( msgId == PTT_MSG_GET_NV_BIN )
2709 {
2710 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2711 /* Validity Period */
2712 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2713 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2714 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2715 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2716 offset = sizeof(v_U32_t);
2717 }
2718 else
2719 {
2720 pHddCtx->ftm.targetNVTableSize = nvSize;
2721 offset = 0;
2722 }
2723
2724 /* Copy target NV table value into temp context buffer */
2725 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2726 pHddCtx->ftm.targetNVTablePointer,
2727 pHddCtx->ftm.targetNVTableSize);
2728 }
2729
2730
2731 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2732 {
2733 /* Invalid table type */
2734 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2735 "Invalid NV Table, now Processing %d, not %d",
2736 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2737
2738 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2739 pHddCtx->ftm.targetNVTableSize = 0;
2740 pHddCtx->ftm.processedNVTableSize = 0;
2741 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2742
2743 return -EINVAL;
2744 }
2745
2746 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2747
2748 /* Update processed pointer to prepare next chunk copy */
2749 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2750 pHddCtx->ftm.targetNVTableSize )
2751 {
2752 nvTable->chunkSize =
2753 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2754 }
2755
2756 /* Copy next chunk of NV table value into response buffer */
2757 vos_mem_copy(
2758 &nvTable->tableData,
2759 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2760 nvTable->chunkSize);
2761
2762 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2763
2764 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2765 {
2766 /* Finished to process last chunk of data, initialize buffer */
2767 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2768 pHddCtx->ftm.targetNVTableSize = 0;
2769 pHddCtx->ftm.processedNVTableSize = 0;
2770 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2771 }
2772
2773 return 1;
2774}
2775
2776/**---------------------------------------------------------------------------
2777
2778 \brief wlan_hdd_ftm_set_nv_bin() -
2779 Set NV bin to Flash Memory, file
2780
2781 \param - ftmCmd - Pointer FTM Commad Buffer
2782
2783 \return - int
2784 -1, Process Host command fail, vail out
2785 0, Process Host command success
2786
2787+----------------------------------------------------------------------------*/
2788
2789static int wlan_hdd_ftm_set_nv_bin
2790(
2791 hdd_context_t *pHddCtx,
2792 tPttMsgbuffer *ftmCmd
2793)
2794{
2795 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2796 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002797 eNvVersionType nvVersion;
2798
2799 nvVersion = vos_nv_getNvVersion();
2800 if (E_NV_V3 != nvVersion)
2801 {
2802 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2803 "%s : Not valid NV Version %d", __func__, nvVersion);
2804 return -EINVAL;
2805 }
2806
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002807
2808 /* Test first chunk of NV table */
2809 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2810 (0 == pHddCtx->ftm.processedNVTableSize))
2811 {
2812 switch (nvTable->nvTable)
2813 {
2814 case NV_BINARY_IMAGE:
2815 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2816 break;
2817 default:
2818 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2819 "Not Valid NV Table %d", nvTable->nvTable);
2820 return -EIO;
2821 break;
2822 }
2823
2824 /* Set Current Processing NV table type */
2825 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2826 pHddCtx->ftm.processedNVTableSize = 0;
2827
2828 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2829 {
2830 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2831 "Invalid Table Size %d", nvTable->tableSize);
2832 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2833 pHddCtx->ftm.targetNVTableSize = 0;
2834 pHddCtx->ftm.processedNVTableSize = 0;
2835 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2836 return -EINVAL;
2837 }
2838 }
2839
2840 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2841 {
2842 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2843 "Invalid NV Table, now Processing %d, not %d",
2844 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2845 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2846 pHddCtx->ftm.targetNVTableSize = 0;
2847 pHddCtx->ftm.processedNVTableSize = 0;
2848 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2849 return -EINVAL;
2850 }
2851
2852 vos_mem_copy(
2853 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2854 &nvTable->tableData,
2855 nvTable->chunkSize);
2856
2857 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2858
2859 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2860 {
2861 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2862 "Processing Done!! write encoded Buffer %d",
2863 pHddCtx->ftm.targetNVTableSize);
2864
2865 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2866 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
2867
2868 if ((VOS_STATUS_SUCCESS != nvStatus))
2869 {
2870 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2871 "Fail to set NV Binary %d", nvStatus);
2872 return -EIO;
2873 }
2874
2875 nvStatus = vos_nv_setNVEncodedBuffer(
2876 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
2877 (v_SIZE_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 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2887 pHddCtx->ftm.targetNVTableSize = 0;
2888 pHddCtx->ftm.processedNVTableSize = 0;
2889 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2890 }
2891
2892 return 1;
2893}
2894
Jeff Johnson295189b2012-06-20 16:38:30 -07002895/**---------------------------------------------------------------------------
2896
2897 \brief wlan_hdd_ftm_temp_get_rel_num() -
2898 Get internal release number
2899
2900 \param - ftmCmd - Pointer FTM Commad Buffer
2901
2902 \return - int
2903 -1, Process Host command fail, vail out
2904 0, Process Host command success
2905
2906 --------------------------------------------------------------------------*/
2907int wlan_hdd_ftm_temp_get_rel_num
2908(
2909 tPttMsgbuffer *ftmCmd
2910)
2911{
2912 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
2913
2914 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
2915 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
2916 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
2917 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
2918 relNum->relParams.pttMax = 10;
2919 relNum->relParams.pttMin = 1;
2920
2921 return 1;
2922}
2923
2924/**---------------------------------------------------------------------------
2925
2926 \brief wlan_hdd_process_ftm_host_cmd() -
2927 process any command should be handled within host.
2928 decide any command should be send to HAL or not
2929
2930 \param - ftmCmd - Pointer FTM Commad Buffer
2931
2932 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002933 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07002934 0, Process Host command success, not need to send CMD to HAL
2935 1, Process Host command success, need to send CMD to HAL
2936
2937 --------------------------------------------------------------------------*/
2938int wlan_hdd_process_ftm_host_cmd
2939(
2940 hdd_context_t *pHddCtx,
2941 void *ftmCmd
2942)
2943{
2944 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
2945 int needToRouteHal = 1;
2946 int hostState = 1;
2947
2948 switch(pFTMCmd->msgId)
2949 {
2950 case PTT_MSG_GET_NV_TABLE:
2951 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
2952 needToRouteHal = 0;
2953 break;
2954
2955 case PTT_MSG_SET_NV_TABLE:
2956 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
2957 /* Temp NV Operation will be isolated to host
2958 needToRouteHal = 1; */
2959 needToRouteHal = 0;
2960 break;
2961
2962 case PTT_MSG_BLANK_NV:
2963 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
2964 needToRouteHal = 1;
2965 break;
2966
2967 case PTT_MSG_DEL_NV_TABLE:
2968 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
2969 needToRouteHal = 1;
2970 break;
2971
2972 case PTT_MSG_GET_NV_FIELD:
2973 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
2974 needToRouteHal = 0;
2975 break;
2976
2977 case PTT_MSG_SET_NV_FIELD:
2978 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
2979 needToRouteHal = 0;
2980 break;
2981
2982 case PTT_MSG_STORE_NV_TABLE:
2983 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
2984 needToRouteHal = 0;
2985 break;
2986
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002987 case PTT_MSG_GET_NV_BIN:
2988 case PTT_MSG_GET_DICTIONARY:
2989 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
2990 needToRouteHal = 0;
2991 break;
2992
2993 case PTT_MSG_SET_NV_BIN:
2994 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
2995 needToRouteHal = 0;
2996 break;
2997
Jeff Johnson295189b2012-06-20 16:38:30 -07002998 case PTT_MSG_DBG_READ_REGISTER:
2999 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3000 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3001 needToRouteHal = 0;
3002 break;
3003
3004 case PTT_MSG_DBG_WRITE_REGISTER:
3005 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3006 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3007 needToRouteHal = 0;
3008 break;
3009
3010 case PTT_MSG_DBG_READ_MEMORY:
3011 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3012 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3013 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3014 needToRouteHal = 0;
3015 break;
3016
3017 case PTT_MSG_DBG_WRITE_MEMORY:
3018 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3019 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3020 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3021 needToRouteHal = 0;
3022 break;
3023
3024 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3025 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3026 needToRouteHal = 0;
3027 break;
3028
3029 default:
3030 needToRouteHal = 1;
3031 break;
3032 }
3033
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003034 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003035 {
3036 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3037 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003038 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003039 }
3040
3041 return needToRouteHal;
3042}
Jeff Johnson295189b2012-06-20 16:38:30 -07003043
3044/**---------------------------------------------------------------------------
3045
3046 \brief wlan_hdd_process_ftm_cmd() -
3047
3048 This function process the commands received from the ptt socket application.
3049
3050 \param - pAdapter - Pointer HDD Context.
3051
3052 \param - wnl - Pointer to the ANI netlink header.
3053
3054 \return - none
3055
3056 --------------------------------------------------------------------------*/
3057
3058void wlan_hdd_process_ftm_cmd
3059(
3060 hdd_context_t *pHddCtx,
3061 tAniNlHdr *wnl
3062)
3063{
3064 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3065 v_U16_t cmd_len;
3066 v_U8_t *pftm_data;
3067 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003068 int hostState;
3069 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003070
3071 ENTER();
3072
Jeff Johnsone7245742012-09-05 17:12:55 -07003073 //Delay to fix NV write failure on JB
3074 vos_busy_wait(10000); //10ms
3075
Jeff Johnson295189b2012-06-20 16:38:30 -07003076 if (!pRequestBuf) {
3077
Arif Hussain6d2a3322013-11-17 19:50:10 -08003078 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003079 return ;
3080 }
3081 /*Save the received request*/
3082 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3083
3084 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3085 /*Save the received request netlink header used for sending the response*/
3086 pHddCtx->ftm.wnl = wnl;
3087 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3088
Arif Hussain6d2a3322013-11-17 19:50:10 -08003089 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003090
3091 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3092 wlan_ftm_send_response(pHddCtx);
3093 return ;
3094 }
3095
3096 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3097 {
3098 case WLAN_FTM_START:
3099 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3100
Arif Hussain6d2a3322013-11-17 19:50:10 -08003101 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003102 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3103 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3104 wlan_ftm_send_response(pHddCtx);
3105 return;
3106 }
3107
3108 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3109 {
3110 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3111 ,__func__);
3112 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3113 wlan_ftm_send_response(pHddCtx);
3114 return;
3115 }
3116 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3117 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3118 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3119 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3120
3121 wlan_ftm_send_response(pHddCtx);
3122
3123 break;
3124
3125 case WLAN_FTM_STOP:
3126 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3127
Arif Hussain6d2a3322013-11-17 19:50:10 -08003128 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003129 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3130 wlan_ftm_send_response(pHddCtx);
3131 return;
3132 }
3133
3134 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3135
3136 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3137 wlan_ftm_send_response(pHddCtx);
3138 return;
3139 }
3140
3141 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3142 /* This would send back the Command Success Status */
3143 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3144
3145 wlan_ftm_send_response(pHddCtx);
3146
3147 break;
3148
3149 case WLAN_FTM_CMD:
3150 /* if it is regular FTM command, pass it to HAL PHY */
3151 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003152 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003153 return;
3154 }
3155 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3156
Arif Hussain6d2a3322013-11-17 19:50:10 -08003157 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003158
3159 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3160 wlan_ftm_send_response(pHddCtx);
3161 return;
3162
3163 }
3164 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3165 cmd_len = pRequestBuf->ftm_hdr.data_len;
3166 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3167 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3168
Jeff Johnson295189b2012-06-20 16:38:30 -07003169 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3170 if (0 == hostState)
3171 {
3172 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3173 if (NULL == tempRspBuffer)
3174 {
3175 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003176 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003177 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3178 wlan_ftm_send_response(pHddCtx);
3179 return;
3180 }
3181 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3182 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3183 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3184 (unsigned char *) tempRspBuffer,
3185 tempRspBuffer->msgBodyLength);
3186 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3187 wlan_ftm_send_response(pHddCtx);
3188 vos_mem_free(tempRspBuffer);
3189 return;
3190 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003191 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003192 {
3193 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3194 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3195 wlan_ftm_send_response(pHddCtx);
3196 return;
3197 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003198
3199 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3200
3201 pHddCtx->ftm.IsCmdPending = TRUE;
3202
3203 /*Post the command to the HAL*/
3204 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3205
Arif Hussain6d2a3322013-11-17 19:50:10 -08003206 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003207 return;
3208
3209 }
3210 /*Wait here until you get the response from HAL*/
3211 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3212 {
3213 hddLog(VOS_TRACE_LEVEL_ERROR,
3214 "%s: vos_wait_single_event failed",__func__);
3215 return;
3216 }
3217
3218 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3219
3220 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3221
3222 wlan_ftm_send_response(pHddCtx);
3223 pHddCtx->ftm.IsCmdPending = FALSE;
3224 break;
3225
3226 default:
3227
Arif Hussain6d2a3322013-11-17 19:50:10 -08003228 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003229 return;
3230 }
3231
3232 EXIT();
3233 return;
3234} /* wlan_adp_ftm_cmd() */
3235
3236/**---------------------------------------------------------------------------
3237
3238 \brief wlan_ftm_priv_start_stop_ftm() -
3239
3240 This function is used for start/stop the ftm driver.
3241
3242 \param - pAdapter - Pointer HDD Context.
3243 - start - 1/0 to start/stop ftm driver.
3244
3245 \return - 0 for success, non zero for failure
3246
3247 --------------------------------------------------------------------------*/
3248
3249static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3250 v_U16_t start)
3251{
3252 VOS_STATUS status;
3253 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3254
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003255 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003256 {
3257 pHddCtx->ftm.cmd_iwpriv = TRUE;
3258 status = wlan_hdd_ftm_start(pHddCtx);
3259
3260 if (status != VOS_STATUS_SUCCESS)
3261 {
3262 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3263 "FTM Start Failed");
3264 return VOS_STATUS_E_FAILURE;
3265 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303266 if (NULL == pMsgBuf)
3267 {
3268 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3269 if (NULL == pMsgBuf)
3270 {
3271 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3272 "%s:pMsgBuf is NULL", __func__);
3273 return VOS_STATUS_E_FAILURE;
3274 }
3275 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003276 }
3277 else
3278 {
3279 status = wlan_ftm_stop(pHddCtx);
3280
3281 if (status != VOS_STATUS_SUCCESS)
3282 {
3283 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3284 "FTM Stop Failed");
3285 return VOS_STATUS_E_FAILURE;
3286 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303287 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3288 if (pMsgBuf)
3289 {
3290 vos_mem_free((v_VOID_t * )pMsgBuf);
3291 pMsgBuf = NULL;
3292 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003293 }
3294 return VOS_STATUS_SUCCESS;
3295}
3296
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303297
3298static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3299{
3300 unsigned int *table = NULL;
3301 int index = 0;
3302
3303 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3304 table = valid_channel;
3305 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3306 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3307 table = valid_channel_cb40;
3308 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3309 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3310 table = valid_channel_cb80;
3311
3312 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303313 {
3314 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3315 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303316 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303317 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303318
3319 while (table[index] != 0)
3320 {
3321 if (table[index] == channel)
3322 return VOS_STATUS_SUCCESS;
3323
3324 index++;
3325 }
3326
3327 return VOS_STATUS_E_FAILURE;
3328}
3329
3330
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303331static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3332{
3333 unsigned int primary_channel = center_channel;
3334
3335 if (center_channel <= 14)
3336 return primary_channel ;
3337
3338 switch (cb)
3339 {
3340 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3341 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3342 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3343 primary_channel -= 2;
3344 break;
3345
3346
3347 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3348 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3349 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3350 primary_channel += 2;
3351 break;
3352
3353 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3354 primary_channel -= 6;
3355 break;
3356
3357 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3358 primary_channel += 6;
3359 break;
3360 }
3361
3362 return primary_channel;
3363
3364}
3365
Jeff Johnson295189b2012-06-20 16:38:30 -07003366/**---------------------------------------------------------------------------
3367
3368 \brief wlan_ftm_priv_set_channel() -
3369
3370 This function is used for setting the channel to the halphy ptt module.
3371
3372 \param - pAdapter - Pointer HDD Context.
3373 - channel - Channel Number 1-14.
3374
3375 \return - 0 for success, non zero for failure
3376
3377 --------------------------------------------------------------------------*/
3378
3379static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3380{
Jeff Johnson295189b2012-06-20 16:38:30 -07003381 uPttMsgs *pMsgBody;
3382 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303383 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003384 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3385
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303386 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003387 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303388 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3389 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003390 return VOS_STATUS_E_FAILURE;
3391 }
3392
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303393 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003394 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303395 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3396 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003397 return VOS_STATUS_E_FAILURE;
3398 }
3399
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303400 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003401 init_completion(&pHddCtx->ftm.ftm_comp_var);
3402 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3403 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3404
3405 pMsgBody = &pMsgBuf->msgBody;
3406
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303407 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003408
Arif Hussain6d2a3322013-11-17 19:50:10 -08003409 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303410 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003411
3412 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3413
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303414 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003415 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303416 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3417 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003418 status = VOS_STATUS_E_FAILURE;
3419 goto done;
3420
3421 }
c_hpothuffdb5272013-10-02 16:42:35 +05303422 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303423 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303424 if (0 >= ret )
3425 {
3426 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3427 FL("wait on ftm_comp_var failed %ld"), ret);
3428 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003429
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303430 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
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:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003434 status = VOS_STATUS_E_FAILURE;
3435 goto done;
3436
3437 }
3438done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003439
3440 return status;
3441}
3442
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303443
3444/**---------------------------------------------------------------------------
3445
3446 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3447
3448 This function is used for setting the power control mode for tx.
3449
3450 \param - pAdapter - Pointer HDD Context.
3451 - pwr_mode - power control mode 0-2.
3452
3453 \return - 0 for success, non zero for failure
3454
3455 --------------------------------------------------------------------------*/
3456
3457static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3458 v_U16_t pwr_mode)
3459{
3460 uPttMsgs *pMsgBody;
3461 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303462 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303463 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3464
3465 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3466 {
3467 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3468 "%s:Ftm has not started. Please start the ftm. ", __func__);
3469 return VOS_STATUS_E_FAILURE;
3470 }
3471
3472 if (pwr_mode > 2)
3473 {
3474 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3475 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3476 return VOS_STATUS_E_FAILURE;
3477 }
3478
3479 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3480 init_completion(&pHddCtx->ftm.ftm_comp_var);
3481 pMsgBody = &pMsgBuf->msgBody;
3482 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3483 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3484
3485 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3486 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3487
3488 if (status != VOS_STATUS_SUCCESS)
3489 {
3490 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3491 "%s:wlan_ftm_postmsg failed", __func__);
3492 status = VOS_STATUS_E_FAILURE;
3493 goto done;
3494 }
c_hpothuffdb5272013-10-02 16:42:35 +05303495 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303496 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303497 if (0 >= ret )
3498 {
3499 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3500 FL("wait on ftm_comp_var failed %ld"), ret);
3501 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303502
3503 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3504 {
3505 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3506 "%s:Ptt response status failed", __func__);
3507 status = VOS_STATUS_E_FAILURE;
3508 goto done;
3509 }
3510
3511 done:
3512 return status;
3513
3514}
3515
Jeff Johnson295189b2012-06-20 16:38:30 -07003516/**---------------------------------------------------------------------------
3517
3518 \brief wlan_ftm_priv_set_txpower() -
3519
3520 This function is used for setting the txpower to the halphy ptt module.
3521
3522 \param - pAdapter - Pointer HDD Context.
3523 - txpower - txpower Number 1-18.
3524
3525 \return - 0 for success, non zero for failure
3526
3527 --------------------------------------------------------------------------*/
3528
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303529static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3530 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003531{
Jeff Johnson295189b2012-06-20 16:38:30 -07003532 uPttMsgs *pMsgBody;
3533 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303534 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003535 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3536
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303537 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003538 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303539 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3540 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003541 return VOS_STATUS_E_FAILURE;
3542 }
3543
3544 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3545 * when tx pktgen is enabled
3546 */
3547 if (ftm_status.frameGenEnabled)
3548 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303549 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3550 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003551 return VOS_STATUS_E_FAILURE;
3552 }
3553
3554 if(!(txpower >= 9 && txpower <= 24))
3555 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303556 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3557 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003558 return VOS_STATUS_E_FAILURE;
3559 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003560
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303561 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3562 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003563 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003564 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3565 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3566
3567 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3568
3569 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3570
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303571 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003572 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303573 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3574 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003575 status = VOS_STATUS_E_FAILURE;
3576 goto done;
3577 }
c_hpothuffdb5272013-10-02 16:42:35 +05303578 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303579 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303580 if (0 >= ret )
3581 {
3582 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3583 FL("wait on ftm_comp_var failed %ld"), ret);
3584 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003585
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303586 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003587 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303588 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3589 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003590 status = VOS_STATUS_E_FAILURE;
3591 goto done;
3592 }
3593
3594 ftm_status.txpower = txpower ;
3595 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003596
3597 return status;
3598
3599}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303600
3601
3602static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3603 v_U16_t enable)
3604{
3605 tANI_U32 value = 0;
3606 tANI_U32 reg_addr;
3607 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303608
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303609 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3610 {
3611 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3612 "%s:Ftm has not started. Please start the ftm. ", __func__);
3613 return VOS_STATUS_E_FAILURE;
3614 }
3615
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303616 reg_addr = WCNSS_TXFIR_OFFSET;
3617
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303618 wpalReadRegister(reg_addr, &value);
3619 if (enable)
3620 {
3621 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3622 }
3623 else
3624 {
3625 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3626 }
3627
3628 wpalWriteRegister(reg_addr, value);
3629
3630 return VOS_STATUS_SUCCESS;
3631}
3632
3633
Jeff Johnson295189b2012-06-20 16:38:30 -07003634/**---------------------------------------------------------------------------
3635
3636 \brief wlan_ftm_priv_set_txrate() -
3637
3638 This function is used for setting the txrate to the halphy ptt module.
3639 It converts the user input string for txrate to the tx rate index.
3640
3641 \param - pAdapter - Pointer HDD Context.
3642 - txrate - Pointer to the tx rate string.
3643
3644 \return - 0 for success, non zero for failure
3645
3646 --------------------------------------------------------------------------*/
3647
3648static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3649{
3650 int ii;
3651 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3652 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3653 {
3654 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3655 return VOS_STATUS_E_FAILURE;
3656 }
3657
3658 /* do not allow to change setting when tx pktgen is enabled */
3659 if (ftm_status.frameGenEnabled)
3660 {
3661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3662 return VOS_STATUS_E_FAILURE;
3663 }
3664
3665 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3666 {
3667 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3668 break;
3669 }
3670 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3671 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003672 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003673 return VOS_STATUS_E_FAILURE;
3674 }
3675
3676 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3677 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3678
3679 return VOS_STATUS_SUCCESS;
3680}
3681
3682/**---------------------------------------------------------------------------
3683
3684 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3685
3686 This function is used for start/stop the tx packet generation.
3687
3688 \param - pAdapter - Pointer HDD Context.
3689 - startStop - Value( 1/0) start/stop the tx packet generation.
3690
3691 \return - 0 for success, non zero for failure
3692
3693 --------------------------------------------------------------------------*/
3694
3695static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3696{
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 uPttMsgs *pMsgBody;
3698 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303699 long ret;
3700
Jeff Johnson295189b2012-06-20 16:38:30 -07003701 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3702
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303703 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003704 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303705 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3706 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003707 return VOS_STATUS_E_FAILURE;
3708 }
3709
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303710 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003711 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303712 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3713 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003714 return VOS_STATUS_E_FAILURE;
3715 }
3716
3717 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3718 (!ftm_status.frameGenEnabled && startStop == 0))
3719 {
3720 return VOS_STATUS_SUCCESS ;
3721 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303722 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003723
Jeff Johnson295189b2012-06-20 16:38:30 -07003724 if (startStop == 1)
3725 {
3726 init_completion(&pHddCtx->ftm.ftm_comp_var);
3727 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3728 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3729 pMsgBody = &pMsgBuf->msgBody;
3730 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3731
3732 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303733 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003734 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303735 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3736 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003737 status = VOS_STATUS_E_FAILURE;
3738 goto done;
3739 }
3740
c_hpothuffdb5272013-10-02 16:42:35 +05303741 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303742 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303743 if (0 >= ret )
3744 {
3745 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3746 FL("wait on ftm_comp_var failed %ld"), ret);
3747 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303748 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003749 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303750 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3751 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003752 status = VOS_STATUS_E_FAILURE;
3753 goto done;
3754 }
3755 }
3756
3757 init_completion(&pHddCtx->ftm.ftm_comp_var);
3758 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
3759 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
3760 pMsgBody = &pMsgBuf->msgBody;
3761 pMsgBody->StartStopTxPacketGen.startStop = startStop;
3762
3763 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3764 if(status != VOS_STATUS_SUCCESS)
3765 {
3766 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
3767 status = VOS_STATUS_E_FAILURE;
3768 goto done;
3769 }
3770
c_hpothuffdb5272013-10-02 16:42:35 +05303771 ret = wait_for_completion_interruptible_timeout(
3772 &pHddCtx->ftm.ftm_comp_var,
3773 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3774 if (0 >= ret )
3775 {
3776 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3777 FL("wait on ftm_comp_var failed %ld"), ret);
3778 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003779 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3780 {
3781 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
3782 status = VOS_STATUS_E_FAILURE;
3783 goto done;
3784 }
3785
3786done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003787
3788 if (status == VOS_STATUS_SUCCESS)
3789 {
3790 if (startStop == 1)
3791 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303792 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003793 }
3794 else
3795 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303796 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003797 }
3798 }
3799
3800 return status;
3801}
3802
3803
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303804
3805static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
3806{
3807
3808 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3809 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3810 {
3811 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3812 "%s:Ftm has not started. Please start the ftm. ", __func__);
3813 return VOS_STATUS_E_FAILURE;
3814 }
3815
3816 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3817 {
3818 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3819 "%s:cb mode value is invalid ", __func__);
3820 return VOS_STATUS_E_FAILURE;
3821 }
3822
3823 ftm_status.cbmode = cbmode;
3824
3825 return VOS_STATUS_SUCCESS;
3826
3827}
3828
Jeff Johnson295189b2012-06-20 16:38:30 -07003829/**---------------------------------------------------------------------------
3830
3831 \brief wlan_ftm_rx_mode() -
3832
3833 This function is used for start/stop the rx packet generation.
3834
3835 \param - pAdapter - Pointer HDD Context.
3836 - rxmode - 0-disable RX.
3837 - 1-rx ALL frames
3838 - 2-rx 11 g/n frames
3839 - 3-rx 11b frames
3840
3841 \return - 0 for success, non zero for failure
3842
3843 --------------------------------------------------------------------------*/
3844
3845static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
3846{
Jeff Johnson295189b2012-06-20 16:38:30 -07003847 uPttMsgs *pMsgBody;
3848 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303849 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003850
3851 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303852 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003853 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303854 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3855 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003856 return VOS_STATUS_E_FAILURE;
3857 }
3858
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303859 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07003860 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303861 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3862 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003863 return VOS_STATUS_E_FAILURE;
3864 }
3865
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303866 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003867 init_completion(&pHddCtx->ftm.ftm_comp_var);
3868
3869 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
3870 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
3871
3872 pMsgBody = &pMsgBuf->msgBody;
3873
3874 switch(rxmode)
3875 {
3876 case RXMODE_DISABLE_ALL:
3877 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3878 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3879 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3880 break;
3881
3882 case RXMODE_ENABLE_ALL:
3883 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3884 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3885 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
3886 break;
3887
3888 case RXMODE_ENABLE_11GN:
3889 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
3890 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
3891 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3892 break;
3893
3894 case RXMODE_ENABLE_11B:
3895 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
3896 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
3897 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
3898 break;
3899
3900 }
3901
3902 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3903
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303904 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003905 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303906 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3907 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003908 status = VOS_STATUS_E_FAILURE;
3909 goto done;
3910 }
c_hpothuffdb5272013-10-02 16:42:35 +05303911 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303912 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303913 if (0 >= ret )
3914 {
3915 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3916 FL(" wait on ftm_comp_var failed %ld"), ret);
3917 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003918
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303919 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003920 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303921 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3922 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003923 status = VOS_STATUS_E_FAILURE;
3924 goto done;
3925 }
3926 ftm_status.rxmode = rxmode ;
3927done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003928
3929 return status;
3930}
3931
3932/**---------------------------------------------------------------------------
3933
3934 \brief wlan_ftm_priv_rx_pkt_clear() -
3935
3936 This function sets the rx pkt count to zero.
3937
3938 \param - pAdapter - Pointer HDD Context.
3939 - rx_pkt_clear - rx_pkt_clear value.
3940
3941 \return - 0 for success, non zero for failure
3942
3943 --------------------------------------------------------------------------*/
3944
3945static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
3946{
Jeff Johnson295189b2012-06-20 16:38:30 -07003947 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303948 long ret;
3949
Jeff Johnson295189b2012-06-20 16:38:30 -07003950 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3951
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303952 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003953 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303954 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3955 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003956 return VOS_STATUS_E_FAILURE;
3957 }
3958
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303959 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07003960 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303961 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3962 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003963 return VOS_STATUS_E_FAILURE;
3964 }
3965
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303966 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003967 init_completion(&pHddCtx->ftm.ftm_comp_var);
3968 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
3969 pMsgBuf->msgBodyLength = sizeof(tMsgPttResetRxPacketStatistics) + PTT_HEADER_LENGTH;
3970
Jeff Johnson295189b2012-06-20 16:38:30 -07003971 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3972
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303973 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003974 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303975 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3976 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003977 status = VOS_STATUS_E_FAILURE;
3978 goto done;
3979 }
c_hpothuffdb5272013-10-02 16:42:35 +05303980 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303981 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303982 if (0 >= ret )
3983 {
3984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3985 FL("wait on ftm_comp_var failed %ld"), ret);
3986 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003987
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303988 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003989 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303990 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3991 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 status = VOS_STATUS_E_FAILURE;
3993 goto done;
3994 }
3995done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003996
3997 return status;
3998}
3999
4000/**---------------------------------------------------------------------------
4001
4002 \brief wlan_ftm_priv_get_channel() -
4003
4004 This function gets the channel number from the halphy ptt module and
4005 returns the channel number to the application.
4006
4007 \param - pAdapter - Pointer HDD Context.
4008 - pChannel - Poniter to get the Channel number.
4009
4010 \return - 0 for success, non zero for failure
4011
4012 --------------------------------------------------------------------------*/
4013
4014static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4015{
Jeff Johnson295189b2012-06-20 16:38:30 -07004016 uPttMsgs *pMsgBody;
4017 VOS_STATUS status;
4018 v_U16_t freq;
4019 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304020 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004021
4022 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4023
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304024 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004025 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304026 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4027 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004028 return VOS_STATUS_E_FAILURE;
4029 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304030 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004031 init_completion(&pHddCtx->ftm.ftm_comp_var);
4032 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4033 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4034
4035 pMsgBody = &pMsgBuf->msgBody;
4036 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
4037
4038 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4039
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304040 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304042 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4043 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004044 status = VOS_STATUS_E_FAILURE;
4045 goto done;
4046
4047 }
c_hpothuffdb5272013-10-02 16:42:35 +05304048 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304049 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304050 if (0 >= ret )
4051 {
4052 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4053 FL("wait on ftm_comp_var failed %ld"), ret);
4054 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004055
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304056 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004057 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304058 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4059 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004060 status = VOS_STATUS_E_FAILURE;
4061 goto done;
4062 }
4063
4064 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4065
4066 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4067 indx++;
4068 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4069 {
4070 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4071 status = VOS_STATUS_E_FAILURE;
4072 goto done;
4073 }
4074
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004075 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004076
Arif Hussain6d2a3322013-11-17 19:50:10 -08004077 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004078 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004079
4080 return status;
4081}
4082
4083/**---------------------------------------------------------------------------
4084
4085 \brief wlan_ftm_priv_get_txpower() -
4086
4087 This function gets the TX power from the halphy ptt module and
4088 returns the TX power to the application.
4089
4090 \param - pAdapter - Pointer HDD Context.
4091 - pTxPwr - Poniter to get the Tx power.
4092
4093 \return - 0 for success, non zero for failure
4094
4095 --------------------------------------------------------------------------*/
4096
4097static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4098{
Jeff Johnson295189b2012-06-20 16:38:30 -07004099 uPttMsgs *pMsgBody;
4100 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304101 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004102 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4103
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304104 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004105 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304106 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4107 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 return VOS_STATUS_E_FAILURE;
4109 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304110 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004111 init_completion(&pHddCtx->ftm.ftm_comp_var);
4112 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4113 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4114
4115 pMsgBody = &pMsgBuf->msgBody;
4116
4117 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4118
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304119 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004120 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304121 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4122 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004123 status = VOS_STATUS_E_FAILURE;
4124 goto done;
4125 }
c_hpothuffdb5272013-10-02 16:42:35 +05304126 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304127 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304128 if (0 >= ret )
4129 {
4130 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4131 FL("wait on ftm_comp_var failed %ld"), ret);
4132 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004133
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304134 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004135 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304136 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4137 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004138 status = VOS_STATUS_E_FAILURE;
4139 goto done;
4140 }
4141 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4142
4143 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004144
4145 return status;
4146}
4147
4148/**---------------------------------------------------------------------------
4149
4150 \brief wlan_ftm_priv_get_ftm_version() -
4151
4152 This function gets ftm driver and firmware version.
4153
4154 \param - pAdapter - Pointer HDD Context.
4155 - pTxRate - Poniter to get the Tx rate.
4156
4157 \return - 0 for success, non zero for failure
4158
4159 --------------------------------------------------------------------------*/
4160
4161VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4162{
Jeff Johnson295189b2012-06-20 16:38:30 -07004163 uPttMsgs *pMsgBody;
4164 VOS_STATUS status;
4165 v_U32_t reg_val;
4166 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004167 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4168 int lenRes = 0;
4169 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304170 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004171
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304172 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004173 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304174 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4175 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004176 return VOS_STATUS_E_FAILURE;
4177 }
4178
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304179 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004180 init_completion(&pHddCtx->ftm.ftm_comp_var);
4181 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4182 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4183
4184 pMsgBody = &pMsgBuf->msgBody;
4185 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4186
4187 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4188
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304189 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004190 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304191 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4192 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004193 status = VOS_STATUS_E_FAILURE;
4194 goto done;
4195
4196 }
c_hpothuffdb5272013-10-02 16:42:35 +05304197 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304198 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304199 if (0 >= ret )
4200 {
4201 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4202 FL("wait on ftm_comp_var failed %ld"), ret);
4203 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004204
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304205 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004206 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304207 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4208 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004209 status = VOS_STATUS_E_FAILURE;
4210 goto done;
4211 }
4212
4213 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4214
4215 init_completion(&pHddCtx->ftm.ftm_comp_var);
4216
4217 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4218 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4219
4220 pMsgBody = &pMsgBuf->msgBody;
4221
4222 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4223
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304224 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004225 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304226 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4227 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004228 status = VOS_STATUS_E_FAILURE;
4229 goto done;
4230 }
c_hpothuffdb5272013-10-02 16:42:35 +05304231 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304232 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304233 if (0 >= ret )
4234 {
4235 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4236 FL("wait on ftm_comp_var failed %ld"), ret);
4237 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004238
4239 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4240 if(lenRes < 0 || lenRes >= lenBuf)
4241 {
4242 status = VOS_STATUS_E_FAILURE;
4243 goto done;
4244 }
4245
4246 buf += lenRes;
4247 lenBuf -= lenRes;
4248
4249 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004250 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 -07004251 if(lenRes < 0 || lenRes >= lenBuf)
4252 {
4253 status = VOS_STATUS_E_FAILURE;
4254 goto done;
4255 }
4256
4257 buf += lenRes;
4258 lenBuf -= lenRes;
4259
4260 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4261 if(lenRes < 0 || lenRes >= lenBuf)
4262 {
4263 status = VOS_STATUS_E_FAILURE;
4264 goto done;
4265 }
4266
4267 buf += lenRes;
4268 lenBuf -= lenRes;
4269
Jeff Johnson295189b2012-06-20 16:38:30 -07004270
4271done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004272
4273 return status;
4274
4275}
4276
4277/**---------------------------------------------------------------------------
4278
4279 \brief wlan_ftm_priv_get_txrate() -
4280
4281 This function gets the TX rate from the halphy ptt module and
4282 returns the TX rate to the application.
4283
4284 \param - pAdapter - Pointer HDD Context.
4285 - pTxRate - Poniter to get the Tx rate.
4286
4287 \return - 0 for success, non zero for failure
4288
4289 --------------------------------------------------------------------------*/
4290
4291static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4292{
Jeff Johnson295189b2012-06-20 16:38:30 -07004293 uPttMsgs *pMsgBody;
4294 VOS_STATUS status;
4295 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304296 long ret;
4297
Jeff Johnson295189b2012-06-20 16:38:30 -07004298 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4299
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304300 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004301 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304302 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4303 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004304 return VOS_STATUS_E_FAILURE;
4305 }
4306
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304307 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004308 init_completion(&pHddCtx->ftm.ftm_comp_var);
4309 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4310 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4311
4312 pMsgBody = &pMsgBuf->msgBody;
4313
4314 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4315
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304316 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004317 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304318 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4319 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004320 status = VOS_STATUS_E_FAILURE;
4321 goto done;
4322 }
c_hpothuffdb5272013-10-02 16:42:35 +05304323 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304324 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304325 if (0 >= ret )
4326 {
4327 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4328 FL("wait on ftm_comp_var failed %ld"), ret);
4329 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004330
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304331 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004332
4333 rate_index = pMsgBody->GetTxPowerReport.rate;
4334 }
4335 else {
4336 /*Return the default rate*/
4337 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304338 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4339 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004340 status = VOS_STATUS_E_FAILURE;
4341 goto done;
4342 }
4343
4344 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4345 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4346 break;
4347 }
4348 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4349 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004350 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004351 status = VOS_STATUS_E_FAILURE;
4352 goto done;
4353 }
4354 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4355done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004356
4357 return status;
4358
4359}
4360
4361/**---------------------------------------------------------------------------
4362
4363 \brief wlan_ftm_priv_get_rx_pkt_count() -
4364
4365 This function gets the rx pkt count from the halphy ptt module and
4366 returns the rx pkt count to the application.
4367
4368 \param - pAdapter - Pointer HDD Context.
4369 - pRxPktCnt - Poniter to get the rx pkt count.
4370
4371 \return - 0 for success, non zero for failure
4372
4373 --------------------------------------------------------------------------*/
4374
4375static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4376{
Jeff Johnson295189b2012-06-20 16:38:30 -07004377 uPttMsgs *pMsgBody;
4378 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304379 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004380 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4381
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304382 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004383 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304384 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4385 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004386 return VOS_STATUS_E_FAILURE;
4387 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304388 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004389 init_completion(&pHddCtx->ftm.ftm_comp_var);
4390 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4391 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4392
4393 pMsgBody = &pMsgBuf->msgBody;
4394
4395 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4396
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304397 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004398 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304399 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4400 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004401 status = VOS_STATUS_E_FAILURE;
4402 goto done;
4403 }
c_hpothuffdb5272013-10-02 16:42:35 +05304404 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304405 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304406 if (0 >= ret )
4407 {
4408 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4409 FL("wait on ftm_comp_var failed %ld"), ret);
4410 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004411
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304412 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004413 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304414 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4415 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004416 status = VOS_STATUS_E_FAILURE;
4417 goto done;
4418 }
4419 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4420done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004421
4422 return status;
4423}
4424
4425/**---------------------------------------------------------------------------
4426
4427 \brief wlan_ftm_priv_get_rx_rssi() -
4428
4429 This function gets the rx rssi from the halphy ptt module and
4430 returns the rx rssi to the application.
4431
4432 \param - pAdapter - Pointer HDD Context.
4433 - buf - Poniter to get rssi of Rx chains
4434
4435 \return - 0 for success, non zero for failure
4436
4437 --------------------------------------------------------------------------*/
4438
4439static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4440{
Jeff Johnson295189b2012-06-20 16:38:30 -07004441 uPttMsgs *pMsgBody;
4442 VOS_STATUS status;
4443 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304444 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004445
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304446 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004447 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304448 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4449 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004450 return VOS_STATUS_E_FAILURE;
4451 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304452 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004453 init_completion(&pHddCtx->ftm.ftm_comp_var);
4454 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4455 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4456
4457 pMsgBody = &pMsgBuf->msgBody;
4458
4459 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4460
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304461 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004462 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304463 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4464 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004465 status = VOS_STATUS_E_FAILURE;
4466 goto done;
4467 }
c_hpothuffdb5272013-10-02 16:42:35 +05304468 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304469 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304470 if (0 >= ret )
4471 {
4472 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4473 FL("wait on ftm_comp_var failed %ld"), ret);
4474 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004475
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304476 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004477 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304478 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4479 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004480 status = VOS_STATUS_E_FAILURE;
4481 goto done;
4482 }
4483
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004484 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4485 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004486 pMsgBody->GetRxRssi.rssi.rx[1]);
4487
4488 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4489 {
4490 status = VOS_STATUS_E_FAILURE;
4491 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004492
Jeff Johnson295189b2012-06-20 16:38:30 -07004493done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004494
4495 return status;
4496}
4497
4498/**---------------------------------------------------------------------------
4499
4500 \brief wlan_ftm_priv_get_mac_address() -
4501
4502 This function gets the mac address from the halphy ptt module and
4503 returns the mac address to the application.
4504
4505 \param - pAdapter - Pointer HDD Context.
4506 - buf - Poniter to get the mac address.
4507
4508 \return - 0 for success, non zero for failure
4509
4510 --------------------------------------------------------------------------*/
4511
4512static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4513{
4514 v_BOOL_t itemIsValid = VOS_FALSE;
4515 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4516 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004517
Jeff Johnson295189b2012-06-20 16:38:30 -07004518 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4519
4520 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4521 {
4522 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4523 return VOS_STATUS_E_FAILURE;
4524 }
4525 /*Check the NV FIELD is valid or not*/
4526 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4527 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004528 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004529 {
4530 vos_nv_readMacAddress(macAddr);
4531
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004532 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4533 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004534 MAC_ADDR_ARRAY(macAddr));
4535 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4536 {
4537 return VOS_STATUS_E_FAILURE;
4538 }
4539 }
4540 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004541 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004542 {
4543 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004544 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4545 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004546 MAC_ADDR_ARRAY(macAddr));
4547
4548 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4549 {
4550 return VOS_STATUS_E_FAILURE;
4551 }
4552 }
4553 return VOS_STATUS_SUCCESS;
4554}
4555
4556/**---------------------------------------------------------------------------
4557
4558 \brief wlan_ftm_priv_set_mac_address() -
4559
4560 This function sets the mac address to the halphy ptt module and
4561 sends the netlink message to the ptt socket application which writes
4562 the macaddress to the qcom_wlan_nv.bin file
4563
4564 \param - pAdapter - Pointer HDD Context.
4565 - buf - Poniter to the macaddress.
4566
4567 \return - 0 for success, non zero for failure
4568
4569 --------------------------------------------------------------------------*/
4570
4571static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4572{
Jeff Johnson295189b2012-06-20 16:38:30 -07004573 uPttMsgs *pMsgBody;
4574 VOS_STATUS status;
4575 int macAddr[VOS_MAC_ADDRESS_LEN];
4576 v_U8_t *pMacAddress;
4577 v_U8_t ii;
4578 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304579 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004580
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304581 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004582 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304583 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4584 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004585 return VOS_STATUS_E_FAILURE;
4586 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304587 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004588 init_completion(&pHddCtx->ftm.ftm_comp_var);
4589 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4590 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4591
4592 pMsgBody = &pMsgBuf->msgBody;
4593 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4594
4595 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004596 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]))
4597 {
4598 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4599 "Invalid MacAddress Input %s", buf);
4600 return VOS_STATUS_E_FAILURE;
4601 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004602
Arif Hussain24bafea2013-11-15 15:10:03 -08004603 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4604 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004605
4606
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004607 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004608
4609 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4610 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4611
4612
Arif Hussain24bafea2013-11-15 15:10:03 -08004613 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4614 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004615 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4616
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304617 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004618 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304619 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4620 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004621 status = VOS_STATUS_E_FAILURE;
4622 goto done;
4623 }
c_hpothuffdb5272013-10-02 16:42:35 +05304624 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304625 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304626 if (0 >= ret )
4627 {
4628 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4629 FL("wait on ftm_comp_var failed %ld"), ret);
4630 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004631
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304632 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004633 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4635 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004636 status = VOS_STATUS_E_FAILURE;
4637 goto done;
4638 }
4639
Arif Hussain6d2a3322013-11-17 19:50:10 -08004640 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004641
4642 init_completion(&pHddCtx->ftm.ftm_comp_var);
4643 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4644
4645 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4646 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4647
4648 pMsgBody = &pMsgBuf->msgBody;
4649
4650 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4651
4652 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 }
4661
c_hpothuffdb5272013-10-02 16:42:35 +05304662 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304663 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304664 if (0 >= ret )
4665 {
4666 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4667 FL("wait on ftm_comp_var failed %ld"), ret);
4668 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004669done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004670
4671 return VOS_STATUS_SUCCESS;
4672}
4673
4674/* set param sub-ioctls */
4675static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4676 union iwreq_data *wrqu, char *extra)
4677{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004678 int ret,sub_cmd;
4679 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004680 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004681 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004682 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004683
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004684 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004685 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004686 length = wrqu->data.length;
4687 sub_cmd = wrqu->data.flags;
4688 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4689
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004690 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4691 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4692 * odd number which assigns set_args to zero.we assisgn memory using
4693 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004694 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004695 param = kzalloc(length + 1, GFP_KERNEL);
4696 if (!param)
4697 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004698
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004699 if (copy_from_user(param, pointer, length))
4700 {
4701 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4702 "%s:Failed to get user data %s", __func__, param);
4703
4704 ret = -EINVAL;
4705 goto OUT;
4706 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004707
4708 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4709 "%s: Received length %d", __func__, length);
4710
4711 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004712 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004713
4714 switch(sub_cmd)
4715 {
4716 case WE_SET_MAC_ADDRESS:
4717 {
4718
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004719 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004720 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004721
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004722 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004723
4724 if(status != VOS_STATUS_SUCCESS)
4725 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004726 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004727 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004728
Jeff Johnson295189b2012-06-20 16:38:30 -07004729 ret = -EINVAL;
4730 }
4731
Wilson Yang7c471652013-12-20 16:36:44 -08004732 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004733 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004734 case WE_SET_TX_RATE:
4735 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004736 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004737
4738 if(status != VOS_STATUS_SUCCESS)
4739 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004740 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004741 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004742
4743 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07004744 }
4745
4746 break;
Wilson Yang7c471652013-12-20 16:36:44 -08004747 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004748 default:
4749 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004750 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07004751 ret = -EINVAL;
4752 break;
4753 }
4754 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004755
4756OUT:
4757 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004758 return ret;
4759}
4760
4761static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
4762 union iwreq_data *wrqu, char *extra)
4763{
4764 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4765 int *value = (int *)extra;
4766 int sub_cmd = value[0];
4767 int set_value = value[1];
4768 int ret = 0; /* success */
4769 VOS_STATUS status;
4770
4771 switch(sub_cmd)
4772 {
4773 case WE_FTM_ON_OFF:
4774 {
4775 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
4776
4777 if(status != VOS_STATUS_SUCCESS)
4778 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004779 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004780 ret = -EINVAL;
4781 }
4782
4783 break;
4784 }
4785
4786 case WE_TX_PKT_GEN:
4787 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
4788
4789 if(status != VOS_STATUS_SUCCESS)
4790 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004791 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004792 ret = -EINVAL;
4793 }
4794 break;
4795
4796 case WE_SET_TX_IFS:
4797 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
4798
4799 if(status != VOS_STATUS_SUCCESS)
4800 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004801 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004802 ret = -EINVAL;
4803 }
4804 break;
4805
4806 case WE_SET_TX_PKT_CNT:
4807 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
4808
4809 if(status != VOS_STATUS_SUCCESS)
4810 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004811 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004812 ret = -EINVAL;
4813 }
4814 break;
4815
4816 case WE_SET_TX_PKT_LEN:
4817 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
4818
4819 if(status != VOS_STATUS_SUCCESS)
4820 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004821 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004822 ret = -EINVAL;
4823 }
4824 break;
4825
4826 case WE_SET_CHANNEL:
4827 {
4828 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
4829
4830 if(status != VOS_STATUS_SUCCESS)
4831 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004832 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004833 ret = -EINVAL;
4834 }
4835 break;
4836 }
4837 case WE_SET_TX_POWER:
4838 {
4839 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
4840
4841 if(status != VOS_STATUS_SUCCESS)
4842 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004843 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004844 ret = -EINVAL;
4845 }
4846 break;
4847 }
4848 case WE_CLEAR_RX_PKT_CNT:
4849 {
4850 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
4851
4852 if(status != VOS_STATUS_SUCCESS)
4853 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004854 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004855 ret = -EINVAL;
4856 }
4857 break;
4858 }
4859 case WE_RX:
4860 {
4861 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
4862
4863 if(status != VOS_STATUS_SUCCESS)
4864 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004865 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004866 ret = -EINVAL;
4867 }
4868 break;
4869 }
4870 case WE_ENABLE_CHAIN:
4871 {
4872 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
4873
4874 if(status != VOS_STATUS_SUCCESS)
4875 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004876 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004877 ret = -EINVAL;
4878 }
4879 break;
4880 }
4881
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304882 case WE_SET_PWR_CNTL_MODE:
4883 {
4884 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
4885 if (status != VOS_STATUS_SUCCESS)
4886 {
4887 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
4888 status);
4889 ret = -EINVAL;
4890 }
4891 break;
4892 }
4893
4894 case WE_ENABLE_DPD:
4895 {
4896 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
4897 if (status != VOS_STATUS_SUCCESS)
4898 {
4899 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
4900 ret = -EINVAL;
4901 }
4902 break;
4903 }
4904
4905 case WE_SET_CB:
4906 {
4907 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
4908 if (status != VOS_STATUS_SUCCESS)
4909 {
4910 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
4911 ret = -EINVAL;
4912 }
4913 break;
4914 }
4915
Jeff Johnson295189b2012-06-20 16:38:30 -07004916 default:
4917 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004918 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07004919 sub_cmd, set_value);
4920 break;
4921 }
4922 }
4923
4924 return ret;
4925}
4926
4927/* get param sub-ioctls */
4928static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
4929 union iwreq_data *wrqu, char *extra)
4930{
4931 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4932 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08004933 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07004934 VOS_STATUS status;
4935
4936 switch (value[0])
4937 {
4938 case WE_GET_CHANNEL:
4939 {
4940 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
4941
4942 if(status != VOS_STATUS_SUCCESS)
4943 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004944 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004945 ret = -EINVAL;
4946 }
4947 break;
4948 }
4949 case WE_GET_TX_POWER:
4950 {
4951 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
4952
4953 if(status != VOS_STATUS_SUCCESS)
4954 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004955 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004956 ret = -EINVAL;
4957 }
4958 break;
4959 }
4960 case WE_GET_RX_PKT_CNT:
4961 {
4962 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
4963
4964 if(status != VOS_STATUS_SUCCESS)
4965 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004966 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004967 ret = -EINVAL;
4968 }
4969 break;
4970 }
4971 default:
4972 {
4973 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
4974 break;
4975 }
4976 }
4977
4978 return ret;
4979}
4980
4981static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
4982 union iwreq_data *wrqu, char *extra)
4983{
4984 int sub_cmd = wrqu->data.flags;
4985 VOS_STATUS status;
4986 hdd_adapter_t *pAdapter = (netdev_priv(dev));
4987
4988 switch(sub_cmd)
4989 {
4990 case WE_GET_MAC_ADDRESS:
4991 {
4992 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
4993
4994 if(status != VOS_STATUS_SUCCESS)
4995 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004996 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07004997 return -EINVAL;
4998 }
4999 wrqu->data.length = strlen(extra)+1;
5000 break;
5001 }
5002 case WE_GET_TX_RATE:
5003 {
5004 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5005
5006 if(status != VOS_STATUS_SUCCESS)
5007 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005008 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005009 return -EINVAL;
5010 }
5011
5012 wrqu->data.length = strlen(extra)+1;
5013 break;
5014 }
5015 case WE_GET_FTM_VERSION:
5016 {
5017 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5018
5019 if(status != VOS_STATUS_SUCCESS)
5020 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005021 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005022 return -EINVAL;
5023 }
5024 wrqu->data.length = strlen(extra)+1;
5025 break;
5026 }
5027 case WE_GET_FTM_STATUS:
5028 {
5029 status = wlan_ftm_priv_get_status(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_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005034 return -EINVAL;
5035 }
5036
5037 wrqu->data.length = strlen(extra)+1;
5038 break;
5039 }
5040 case WE_GET_RX_RSSI:
5041 {
5042 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5043
5044 if(status != VOS_STATUS_SUCCESS)
5045 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005046 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005047 return -EINVAL;
5048 }
5049
5050 wrqu->data.length = strlen(extra)+1;
5051 break;
5052 }
5053 default:
5054 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005055 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005056 break;
5057 }
5058 }
5059
5060 return 0;
5061}
Jeff Johnson295189b2012-06-20 16:38:30 -07005062
5063VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5064{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005065#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005066 tAniHdr *wmsg = NULL;
5067 v_U8_t *pBuf;
5068 hdd_context_t *pHddCtx = NULL;
5069 v_CONTEXT_t pVosContext= NULL;
5070
5071 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5072 if(pBuf == NULL)
5073 {
5074 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5075 return VOS_STATUS_E_NOMEM;
5076 }
5077 wmsg = (tAniHdr*)pBuf;
5078 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5079 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5080 wmsg->length = FTM_SWAP16(wmsg->length);
5081 pBuf += sizeof(tAniHdr);
5082
5083 /*Get the global context */
5084 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5085
5086 /*Get the Hdd Context */
5087 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5088 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5089
5090 /* EfS command Code */
5091 *(v_U32_t*)pBuf = 0x000000EF;
5092
5093 pBuf += sizeof(v_U32_t);
5094
5095 memcpy(pBuf, pData,data_len);
5096
5097 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
5098 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid) < 0) {
5099
Arif Hussain6d2a3322013-11-17 19:50:10 -08005100 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 -07005101 vos_mem_free((v_VOID_t*)wmsg);
5102 return VOS_STATUS_E_FAILURE;
5103 }
5104 }
5105 else {
5106 if( ptt_sock_send_msg_to_app(wmsg, 0, ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid) < 0) {
5107
Arif Hussain6d2a3322013-11-17 19:50:10 -08005108 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 -07005109 vos_mem_free((v_VOID_t*)wmsg);
5110 return VOS_STATUS_E_FAILURE;
5111 }
5112 }
5113
5114 vos_mem_free((v_VOID_t*)wmsg);
5115#endif //FTM and ANDROID
5116
5117 return VOS_STATUS_SUCCESS;
5118}
5119
Jeff Johnson295189b2012-06-20 16:38:30 -07005120/* action sub-ioctls */
5121static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5122 union iwreq_data *wrqu, char *extra)
5123{
5124 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005125 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005126
5127 switch (sub_cmd)
5128 {
5129 case WE_SET_NV_DEFAULTS:
5130 {
5131 v_U8_t *pu8buf,*pTempBuf;
5132 v_U16_t size;
5133 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005134 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005135 pu8buf = vos_mem_malloc(size);
5136 if(pu8buf == NULL)
5137 {
5138 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5139 return VOS_STATUS_E_NOMEM;
5140 }
5141 memset(pu8buf,0,size);
5142 pTempBuf = pu8buf;
5143 pTempBuf += sizeof(v_U32_t);
5144 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5145
5146 wlan_write_to_efs(pu8buf,size);
5147 vos_mem_free(pu8buf);
5148 }
5149
5150 default:
5151 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005152 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005153 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5154 break;
5155 }
5156 }
5157
5158 return ret;
5159}
5160
Jeff Johnson295189b2012-06-20 16:38:30 -07005161static const iw_handler we_ftm_private[] = {
5162
5163 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5164 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5165 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5166 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5167 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Jeff Johnson295189b2012-06-20 16:38:30 -07005168};
5169
5170/*Maximum command length can be only 15 */
5171static const struct iw_priv_args we_ftm_private_args[] = {
5172
5173 /* handlers for main ioctl */
5174 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5175 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5176 0,
5177 "" },
5178
5179 { WE_FTM_ON_OFF,
5180 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5181 0,
5182 "ftm" },
5183
5184 { WE_TX_PKT_GEN,
5185 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5186 0,
5187 "tx" },
5188
5189 { WE_SET_TX_IFS,
5190 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5191 0,
5192 "set_txifs" },
5193
5194 { WE_SET_TX_PKT_CNT,
5195 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5196 0,
5197 "set_txpktcnt" },
5198
5199 { WE_SET_TX_PKT_LEN,
5200 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5201 0,
5202 "set_txpktlen" },
5203
5204 { WE_SET_CHANNEL,
5205 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5206 0,
5207 "set_channel" },
5208
5209 { WE_SET_TX_POWER,
5210 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5211 0,
5212 "set_txpower" },
5213
5214 { WE_CLEAR_RX_PKT_CNT,
5215 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5216 0,
5217 "clr_rxpktcnt" },
5218
5219 { WE_RX,
5220 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5221 0,
5222 "rx" },
5223
5224 { WE_ENABLE_CHAIN,
5225 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5226 0,
5227 "ena_chain" },
5228
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305229 { WE_SET_PWR_CNTL_MODE,
5230 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5231 0,
5232 "pwr_cntl_mode" },
5233
5234 { WE_ENABLE_DPD,
5235 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5236 0,
5237 "ena_dpd" },
5238
5239 { WE_SET_CB,
5240 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5241 0,
5242 "set_cb" },
5243
Jeff Johnson295189b2012-06-20 16:38:30 -07005244 /* handlers for main ioctl */
5245 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5246 0,
5247 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5248 "" },
5249
5250 { WE_GET_CHANNEL,
5251 0,
5252 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5253 "get_channel" },
5254
5255 { WE_GET_TX_POWER,
5256 0,
5257 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5258 "get_txpower" },
5259
5260 { WE_GET_RX_PKT_CNT,
5261 0,
5262 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5263 "get_rxpktcnt" },
5264
5265 /* handlers for main ioctl */
5266 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5267 IW_PRIV_TYPE_CHAR| 512,
5268 0,
5269 "" },
5270
5271 { WE_SET_MAC_ADDRESS,
5272 IW_PRIV_TYPE_CHAR| 512,
5273 0,
5274 "set_mac_address" },
5275
5276 { WE_SET_TX_RATE,
5277 IW_PRIV_TYPE_CHAR | 512,
5278 0,
5279 "set_txrate" },
5280
5281 /* handlers for main ioctl */
5282 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5283 0,
5284 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5285 "" },
5286
5287 { WE_GET_MAC_ADDRESS,
5288 0,
5289 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5290 "get_mac_address" },
5291
5292 { WE_GET_FTM_VERSION,
5293 0,
5294 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5295 "ftm_version" },
5296
5297 { WE_GET_TX_RATE,
5298 0,
5299 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5300 "get_txrate" },
5301
5302 { WE_GET_FTM_STATUS,
5303 0,
5304 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5305 "get_status" },
5306
5307 { WE_GET_RX_RSSI,
5308 0,
5309 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5310 "get_rx_rssi" },
5311
Jeff Johnson295189b2012-06-20 16:38:30 -07005312 /* handlers for main ioctl */
5313 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5314 0,
5315 0,
5316 "" },
5317
5318 /* handlers for sub-ioctl */
5319 { WE_SET_NV_DEFAULTS,
5320 0,
5321 0,
5322 "set_nv_defaults" },
5323
5324};
5325
5326const struct iw_handler_def we_ftm_handler_def = {
5327 .num_standard = 0,
5328 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5329 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5330
5331 .standard = (iw_handler *)NULL,
5332 .private = (iw_handler *)we_ftm_private,
5333 .private_args = we_ftm_private_args,
5334 .get_wireless_stats = NULL,
5335};
5336
5337static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5338{
5339
5340 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5341
5342 // Zero the memory. This zeros the profile structure.
5343 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005344
Jeff Johnson295189b2012-06-20 16:38:30 -07005345 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5346
5347 return 0;
5348}
5349
Jeff Johnson295189b2012-06-20 16:38:30 -07005350
5351VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5352{
Jeff Johnson295189b2012-06-20 16:38:30 -07005353 ftm_rsp_msg_t *pFtmMsgRsp;
5354
5355 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5356 hdd_context_t *pHddCtx;
5357 v_CONTEXT_t pVosContext= NULL;
5358
5359 ENTER();
5360
5361 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5362
5363 if (!message )
5364 {
5365 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5366 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5367 return VOS_STATUS_E_INVAL;
5368 }
5369 /*Get the global context */
5370 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5371
5372 /*Get the Hdd Context */
5373 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5374
5375 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5376
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305377 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005378 complete(&pHddCtx->ftm.ftm_comp_var);
5379 }
5380 else {
5381 /*Response length to Ptt App*/
5382 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5383
5384 /*Ptt App expects the response length in LE */
5385 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5386
5387 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005388 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005389 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5390
5391 /*Copy the message*/
5392 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5393
5394 /*Update the error code*/
5395 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5396
5397 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5398
5399 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5400 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005401 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005402 return VOS_STATUS_E_FAILURE;
5403 }
5404 }
5405 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005406 return VOS_STATUS_SUCCESS;
5407
5408}