blob: 198c3fd0d7a576d94ec2033cd8690204eb30c8cf [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"
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053082#include "linux/wcnss_wlan.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070083
Jeff Johnson295189b2012-06-20 16:38:30 -070084#define RXMODE_DISABLE_ALL 0
85#define RXMODE_ENABLE_ALL 1
86#define RXMODE_ENABLE_11GN 2
87#define RXMODE_ENABLE_11B 3
88
89#define FTM_CHAIN_SEL_NO_RX_TX 0
90#define FTM_CHAIN_SEL_R0_ON 1
91#define FTM_CHAIN_SEL_T0_ON 2
92#define FTM_CHAIN_SEL_R0_T0_ON 3
93#define FTM_CHAIN_SEL_MAX 3
94
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053095#define WCNSS_TXFIR_OFFSET 0x00018000
96
Jeff Johnson295189b2012-06-20 16:38:30 -070097#ifndef QWLAN_PHYDBG_BASE
98#define QWLAN_PHYDBG_BASE 0x03004000
99#endif /* QWLAN_PHYDBG_BASE */
100
101#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800102#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700103#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
104#endif
105
Jeff Johnson295189b2012-06-20 16:38:30 -0700106
Anand N Sunkad5286f8a2014-08-22 14:57:43 +0530107#ifndef QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET
108#define QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET 0x00013c34
Jeff Johnson295189b2012-06-20 16:38:30 -0700109#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
Anand N Sunkad5286f8a2014-08-22 14:57:43 +0530110#endif /* QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET */
Jeff Johnson295189b2012-06-20 16:38:30 -0700111
Jeff Johnson295189b2012-06-20 16:38:30 -0700112
113#ifndef QWLAN_RFAPB_BASE
114#define QWLAN_RFAPB_BASE 0x0E02F800
115#endif /* QWLAN_RFAPB_BASE */
116
117#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800118#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700119#endif /* QWLAN_RFAPB_REV_ID_REG */
120
121#ifndef QWLAN_TXCTL_BASE
122#define QWLAN_TXCTL_BASE 0x03012000
123#endif /* QWLAN_TXCTL_BASE */
124
125#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800126#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700127#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
128#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
129#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
130#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
131#endif /* QWLAN_TXCTL_FSHIFT_REG */
132
133/* To set 4MAC addresses from given first MAC address,
134 * Last byte value within given MAC address must less than 0xFF - 3 */
135#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700136#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700137
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530138#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
139
Jeff Johnson295189b2012-06-20 16:38:30 -0700140typedef struct {
141 tANI_U32 tableSize; /* Whole NV Table Size */
142 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
143 eNvTable nvTable;
144 tANI_U8 tableData; /* Filled by host driver */
145} pttGetNvTable;
146
147typedef struct {
148 tANI_U32 tableSize; /* Whole NV Table Size */
149 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
150 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700151 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700152} pttSetNvTable;
153
Jeff Johnson295189b2012-06-20 16:38:30 -0700154
155extern const sHalNv nvDefaults;
156static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700157static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700158VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700159
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700160/* 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 -0700161 Since it is associated to agc.channel_freq register for mapping.
162 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
163*/
164static const freq_chan_t freq_chan_tbl[] = {
165 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
166 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
167};
168
169static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
170{
171 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
172 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
173 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
174 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
175 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
176 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
177 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
178 //Spica_Virgo 11A 20MHz Rates
179 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
180 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
181 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
182 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
183 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
184 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
185 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
186 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
187
188//MCS Index #0-15 (20MHz)
189 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
190 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
191 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
192 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
193 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
194 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
195 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
196 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530197 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, "MCS_SG_7_2_MBPS"},
198 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS, "MCS_SG_14_4_MBPS"},
199 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS, "MCS_SG_21_7_MBPS"},
200 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS, "MCS_SG_28_9_MBPS"},
201 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS, "MCS_SG_43_3_MBPS"},
202 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS, "MCS_SG_57_8_MBPS"},
203 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, "MCS_SG_65_MBPS"},
204 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_SG_72_2_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530205
206//MCS Index #8-15 (40MHz)
207
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530208 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_5_MBPS" },
209 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
210 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
211 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
212 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
213 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
214 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
215 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530216 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
217 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
218 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
219 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
220 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
221 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
222 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800223 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530224
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800225#ifdef WLAN_FEATURE_11AC
226 /*11AC rate 20MHZ Normal GI*/
227 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
228 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
229 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
230 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
231 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
232 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
233 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
234 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
235 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530236#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800237 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530238#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800239
240 /*11AC rate 20MHZ Short GI*/
241 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
242 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
243 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
244 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
245 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
246 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
247 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
248 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
249 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530250#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800251 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530252#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800253
254 /*11AC rates 40MHZ normal GI*/
255 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
256 "MCS_VHT40_NGI_CB_13_5_MBPS"},
257 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
258 "MCS_VHT40_NGI_CB_27_MBPS"},
259 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
260 "MCS_VHT40_NGI_CB_40_5_MBPS"},
261 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
262 "MCS_VHT40_NGI_CB_54_MBPS"},
263 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
264 "MCS_VHT40_NGI_CB_81_MBPS"},
265 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
266 "MCS_VHT40_NGI_CB_108_MBPS"},
267 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
268 "MCS_VHT40_NGI_CB_121_5_MBPS"},
269 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
270 "MCS_VHT40_NGI_CB_135_MBPS"},
271 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
272 "MCS_VHT40_NGI_CB_162_MBPS"},
273 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
274 "MCS_VHT40_NGI_CB_180_MBPS"},
275
276 /*11AC rates 40MHZ short GI*/
277 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
278 "MCS_VHT40_SGI_CB_15_MBPS"},
279 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
280 "MCS_VHT40_SGI_CB_30_MBPS"},
281 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
282 "MCS_VHT40_SGI_CB_45_MBPS"},
283 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
284 "MCS_VHT40_SGI_CB_60_MBPS"},
285 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
286 "MCS_VHT40_SGI_CB_90_MBPS"},
287 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
288 "MCS_VHT40_SGI_CB_120_MBPS"},
289 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
290 "MCS_VHT40_SGI_CB_135_MBPS"},
291 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
292 "MCS_VHT40_SGI_CB_150_MBPS"},
293 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
294 "MCS_VHT40_SGI_CB_180_MBPS"},
295 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
296 "MCS_VHT40_SGI_CB_200_MBPS"},
297
298 /*11AC rates 80 MHZ normal GI*/
299 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
300 "MCS_VHT80_NGI_CB_29_3_MBPS"},
301 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
302 "MCS_VHT80_NGI_CB_58_5_MBPS"},
303 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
304 "MCS_VHT80_NGI_CB_87_8_MBPS"},
305 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
306 "MCS_VHT80_NGI_CB_117_MBPS"},
307 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
308 "MCS_VHT80_NGI_CB_175_5_MBPS"},
309 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
310 "MCS_VHT80_NGI_CB_234_MBPS"},
311 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
312 "MCS_VHT80_NGI_CB_263_3_MBPS"},
313 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
314 "MCS_VHT80_NGI_CB_292_5_MBPS"},
315 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
316 "MCS_VHT80_NGI_CB_351_MBPS"},
317 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
318 "MCS_VHT80_NGI_CB_390_MBPS"},
319
320 /*11AC rates 80 MHZ short GI*/
321 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
322 "MCS_VHT80_SGI_CB_32_5_MBPS"},
323 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
324 "MCS_VHT80_SGI_CB_65_MBPS"},
325 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
326 "MCS_VHT80_SGI_CB_97_5_MBPS"},
327 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
328 "MCS_VHT80_SGI_CB_130_MBPS"},
329 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
330 "MCS_VHT80_SGI_CB_195_MBPS"},
331 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
332 "MCS_VHT80_SGI_CB_260_MBPS"},
333 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
334 "MCS_VHT80_SGI_CB_292_5_MBPS"},
335 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
336 "MCS_VHT80_SGI_CB_325_MBPS"},
337 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
338 "MCS_VHT80_SGI_CB_390_MBPS"},
339 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
340 "MCS_VHT80_SGI_CB_433_3_MBPS"},
341#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700342};
343
344static rateIndex2Preamble_t rate_index_2_preamble_table[] =
345{
346
347 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
348 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
349 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
350 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
351 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
352 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
353 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
354
Jeff Johnson295189b2012-06-20 16:38:30 -0700355
356 //Spica_Virgo 11A 20MHz Rates
357 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
358 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
359 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
360 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
361 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
362 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
363 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
364 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
365
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530366 // 11A 20MHz Rates
367 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
368 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
369 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
370 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
371 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
372 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
373 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
374 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
375
Jeff Johnson295189b2012-06-20 16:38:30 -0700376 //MCS Index #0-15 (20MHz)
377 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
378 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
379 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
380 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
381 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
382 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
383 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
385 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
386 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
387 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
388 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
389 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
390 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
391 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
392 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530393
394 //MCS index (40MHz)
395 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
396 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
397 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
398 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
399 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
400 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
401 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
409 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800410 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530411
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800412#ifdef WLAN_FEATURE_11AC
413 /*11AC rate 20MHZ Normal GI*/
414 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
419 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
420 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
422 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530423#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800424 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530425#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800426 /*11AC rate 20MHZ Short GI*/
427 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
431 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
432 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
433 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
435 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530436#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800437 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530438#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800439
440 /*11AC rates 40MHZ normal GI*/
441 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
443 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
444 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
445 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
450 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
451
452 /*11AC rates 40MHZ short GI*/
453 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
457 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
458 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
459 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
462 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
463
464 /*11AC rates 80 MHZ normal GI*/
465 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
466 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
467 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
468 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
469 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
470 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
471 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
472 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
473 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
474 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
475
476 /*11AC rates 80 MHZ short GI*/
477 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
478 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
479 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
480 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
481 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
482 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
483 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
484 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
485 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
486 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
487#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700488};
489
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530490static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
491 11, 12, 13, 14, 36, 40, 44, 48,
492 52, 56, 60, 64, 100, 104, 108,
493 112, 116, 120, 124, 128, 132,
494 136, 140, 149, 153, 157, 161,
495 165, 208, 212, 216, 240, 244,
496 248, 252, 0 };
497static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
498 42, 46, 50, 54, 58, 62, 102, 106,
499 110, 114, 118, 122, 126, 130, 134,
500 138, 151, 155, 159, 163, 210, 214,
501 242, 246, 250, 0 };
502static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
503 114, 118, 122, 126, 130, 134, 155,
504 159, 246, 0 };
505
Jeff Johnson295189b2012-06-20 16:38:30 -0700506typedef struct
507{
508 tANI_BOOLEAN frameGenEnabled;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530509 tANI_BOOLEAN wfRfGenEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -0700510 tANI_BOOLEAN wfmEnabled;
511 sPttFrameGenParams frameParams;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530512 v_U16_t powerCtlMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700513 v_U16_t rxmode;
514 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530515 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700516
517} FTM_STATUS ;
518static FTM_STATUS ftm_status;
519
520//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530521static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700522
523static void _ftm_status_init(void)
524{
525 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
526 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
527 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
528
529 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
530 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530531 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700532 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530533 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700534 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
535 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530536 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700537 ftm_status.frameParams.payloadFillByte = 0xA5;
538 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
539 ftm_status.frameParams.tx_mode = 0;
540 ftm_status.frameParams.crc = 0;
541 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
542 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
543 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
544 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530545 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700546 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
547 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530548 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700549
550 return;
551}
552
553/**---------------------------------------------------------------------------
554
555 \brief wlan_ftm_postmsg() -
556
557 The function used for sending the command to the halphy.
558
559 \param - cmd_ptr - Pointer command buffer.
560
561 \param - cmd_len - Command length.
562
563 \return - 0 for success, non zero for failure
564
565 --------------------------------------------------------------------------*/
566
567static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
568{
569 vos_msg_t *ftmReqMsg;
570 vos_msg_t ftmMsg;
571 ENTER();
572
573 ftmReqMsg = (vos_msg_t *) cmd_ptr;
574
Jeff Johnson295189b2012-06-20 16:38:30 -0700575 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700576 ftmMsg.reserved = 0;
577 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
578 ftmMsg.bodyval = 0;
579
580 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700582 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700583 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800584 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700585
586 return VOS_STATUS_E_FAILURE;
587 }
588
589 EXIT();
590 return VOS_STATUS_SUCCESS;
591}
592
593/*---------------------------------------------------------------------------
594
595 \brief wlan_ftm_vos_open() - Open the vOSS Module
596
597 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
598 Upon successful initialization:
599
600 - All VOS submodules should have been initialized
601
602 - The VOS scheduler should have opened
603
604 - All the WLAN SW components should have been opened. This include
605 MAC.
606
607
Girish Gowli32fbe522014-05-08 20:27:04 +0530608 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700609
610
611 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
612 is ready to be used.
613
614 VOS_STATUS_E_RESOURCES - System resources (other than memory)
615 are unavailable to initialize the scheduler
616
617
618 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
619
620 \sa wlan_ftm_vos_open()
621
622---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530623static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700624{
625 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
626 int iter = 0;
627 tSirRetStatus sirStatus = eSIR_SUCCESS;
628 tMacOpenParameters macOpenParms;
629 pVosContextType gpVosContext = (pVosContextType)pVosContext;
630
631 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
632 "%s: Opening VOSS", __func__);
633
634 if (NULL == gpVosContext)
635 {
636 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
637 "%s: Trying to open VOSS without a PreOpen",__func__);
638 VOS_ASSERT(0);
639 return VOS_STATUS_E_FAILURE;
640 }
641
642 /* Initialize the probe event */
643 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
644 {
645 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
646 "%s: Unable to init probeEvent",__func__);
647 VOS_ASSERT(0);
648 return VOS_STATUS_E_FAILURE;
649 }
650
Jeff Johnson295189b2012-06-20 16:38:30 -0700651 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
652 {
653 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
654 "%s: Unable to init wdaCompleteEvent",__func__);
655 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700656
Jeff Johnson295189b2012-06-20 16:38:30 -0700657 goto err_probe_event;
658 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700659
660 /* Initialize the free message queue */
661 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
662 if (! VOS_IS_STATUS_SUCCESS(vStatus))
663 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700664 /* Critical Error ... Cannot proceed further */
665 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530666 "%s: Failed to initialize VOS free message queue %d",
667 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700668 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700669 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700670 }
671
672 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
673 {
674 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
675 &(gpVosContext->aMsgBuffers[iter]);
676 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
677 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
678 }
679
680 /* Now Open the VOS Scheduler */
681 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
682 sizeof(VosSchedContext));
683
684 if (!VOS_IS_STATUS_SUCCESS(vStatus))
685 {
686 /* Critical Error ... Cannot proceed further */
687 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530688 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700689 VOS_ASSERT(0);
690 goto err_msg_queue;
691 }
692
693 /* Open the SYS module */
694 vStatus = sysOpen(gpVosContext);
695
696 if (!VOS_IS_STATUS_SUCCESS(vStatus))
697 {
698 /* Critical Error ... Cannot proceed further */
699 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530700 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700701 VOS_ASSERT(0);
702 goto err_sched_close;
703 }
704
Jeff Johnson295189b2012-06-20 16:38:30 -0700705 /*Open the WDA module */
706 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
707 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530708 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700709 if (!VOS_IS_STATUS_SUCCESS(vStatus))
710 {
711 /* Critical Error ... Cannot proceed further */
712 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530713 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700714 VOS_ASSERT(0);
715 goto err_sys_close;
716 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700717
718 /* initialize the NV module */
719 vStatus = vos_nv_open();
720 if (!VOS_IS_STATUS_SUCCESS(vStatus))
721 {
722 // NV module cannot be initialized, however the driver is allowed
723 // to proceed
724 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530725 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700726 goto err_wda_close;
727 }
728
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700729 vStatus = vos_nv_get_dictionary_data();
730
731 if (!VOS_IS_STATUS_SUCCESS(vStatus))
732 {
733 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530734 "%s : failed to get dictionary data for NV %d",
735 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700736 goto err_wda_close;
737 }
738
Jeff Johnson295189b2012-06-20 16:38:30 -0700739 /* If we arrive here, both threads dispacthing messages correctly */
740
741 /* Now proceed to open the MAC */
742
743 /* UMA is supported in hardware for performing the
744 frame translation 802.11 <-> 802.3 */
745 macOpenParms.frameTransRequired = 1;
746 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
747 &macOpenParms);
748
749 if (eSIR_SUCCESS != sirStatus)
750 {
751 /* Critical Error ... Cannot proceed further */
752 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530753 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700754 VOS_ASSERT(0);
755 goto err_nv_close;
756 }
757
Jeff Johnson295189b2012-06-20 16:38:30 -0700758 /* Now proceed to open the SME */
759 vStatus = sme_Open(gpVosContext->pMACContext);
760 if (!VOS_IS_STATUS_SUCCESS(vStatus))
761 {
762 /* Critical Error ... Cannot proceed further */
763 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530764 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700765 goto err_mac_close;
766 }
767 return VOS_STATUS_SUCCESS;
768
Jeff Johnson295189b2012-06-20 16:38:30 -0700769
770 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
771 "%s: VOSS successfully Opened",__func__);
772
773 return VOS_STATUS_SUCCESS;
774err_mac_close:
775 macClose(gpVosContext->pMACContext);
776
777err_nv_close:
778 vos_nv_close();
779
780err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700781 WDA_close(gpVosContext);
782
783err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700784 sysClose(gpVosContext);
785
786err_sched_close:
787 vos_sched_close(gpVosContext);
788err_msg_queue:
789 vos_mq_deinit(&gpVosContext->freeVosMq);
790
Jeff Johnson295189b2012-06-20 16:38:30 -0700791err_wda_complete_event:
792 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700793
794err_probe_event:
795 vos_event_destroy(&gpVosContext->ProbeEvent);
796
797 return VOS_STATUS_E_FAILURE;
798
799} /* wlan_ftm_vos_open() */
800
801/*---------------------------------------------------------------------------
802
803 \brief wlan_ftm_vos_close() - Close the vOSS Module
804
805 The \a wlan_ftm_vos_close() function closes the vOSS Module
806
807 \param vosContext context of vos
808
809 \return VOS_STATUS_SUCCESS - successfully closed
810
811 \sa wlan_ftm_vos_close()
812
813---------------------------------------------------------------------------*/
814
815static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
816{
817 VOS_STATUS vosStatus;
818 pVosContextType gpVosContext = (pVosContextType)vosContext;
819
Jeff Johnson295189b2012-06-20 16:38:30 -0700820 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
821 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
822 {
823 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530824 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700825 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
826 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700827
828 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
829 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
830 {
831 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530832 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700833 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
834 }
835
836 ((pVosContextType)vosContext)->pMACContext = NULL;
837
838 vosStatus = vos_nv_close();
839 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
840 {
841 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530842 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700843 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
844 }
845
846
847 vosStatus = sysClose( vosContext );
848 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
849 {
850 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530851 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700852 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
853 }
854
Jeff Johnson295189b2012-06-20 16:38:30 -0700855 vosStatus = WDA_close( vosContext );
856 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
857 {
858 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530859 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700860 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
861 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700862
863 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
864
865 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
866 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
867 {
868 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530869 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700870 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
871 }
872
Jeff Johnson295189b2012-06-20 16:38:30 -0700873 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
874 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
875 {
876 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530877 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700878 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
879 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700880
881 return VOS_STATUS_SUCCESS;
882}
883
884/**---------------------------------------------------------------------------
885
886 \brief wlan_ftm_priv_set_txifs() -
887
888 This function is used for
889
890 \param - pAdapter - Pointer HDD Context.
891 - ifs
892
893 \return - 0 for success, non zero for failure
894
895 --------------------------------------------------------------------------*/
896
897
898
899static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
900{
901 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
902 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
903 {
904 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
905 return VOS_STATUS_E_FAILURE;
906 }
907
908 /* do not allow to change setting when tx pktgen is enabled */
909 if (ftm_status.frameGenEnabled)
910 {
911 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
912 return VOS_STATUS_E_FAILURE;
913 }
914
915 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
916 {
c_hpothuffdb5272013-10-02 16:42:35 +0530917 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
918 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700919 return VOS_STATUS_E_FAILURE;
920 }
921
922 ftm_status.frameParams.interFrameSpace = ifs;
923
924 return VOS_STATUS_SUCCESS;
925}
926
927/**---------------------------------------------------------------------------
928
929 \brief wlan_ftm_priv_set_txpktcnt() -
930
931 This function is used for
932
933 \param - pAdapter - Pointer HDD Context.
934 - ifs
935
936 \return - 0 for success, non zero for failure
937
938 --------------------------------------------------------------------------*/
939
940static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
941{
942 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
943 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
944 {
945 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
946 return VOS_STATUS_E_FAILURE;
947 }
948
949 /* do not allow to change setting when tx pktgen is enabled */
950 if (ftm_status.frameGenEnabled)
951 {
952 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
953 return VOS_STATUS_E_FAILURE;
954 }
955
956 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
957 {
c_hpothuffdb5272013-10-02 16:42:35 +0530958 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
959 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700960 return VOS_STATUS_E_FAILURE;
961 }
962
963 ftm_status.frameParams.numTestPackets = cnt;
964
965 return VOS_STATUS_SUCCESS;
966}
967
968static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
969{
970 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
971 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
972 {
973 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
974 return VOS_STATUS_E_FAILURE;
975 }
976
977 /* do not allow to change setting when tx pktgen is enabled */
978 if (ftm_status.frameGenEnabled)
979 {
980 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
981 return VOS_STATUS_E_FAILURE;
982 }
983
984 if (len > 4095) //4096
985 {
c_hpothuffdb5272013-10-02 16:42:35 +0530986 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
987 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700988 return VOS_STATUS_E_FAILURE;
989 }
990
991 ftm_status.frameParams.payloadLength = (tANI_U16)len;
992
993 return VOS_STATUS_SUCCESS;
994}
995
Jeff Johnson295189b2012-06-20 16:38:30 -0700996
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530997static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
998/**---------------------------------------------------------------------------
999<FTM_Command>set_tx_wf_gain
1000<argument> is <n>
1001Designates the number of amplitude gain (31 to 255).
1002Description
1003This command can be set only when Tx CW generation is stopped.
1004--------------------------------------------------------------------------*/
1005static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
1006{
1007 uPttMsgs *pMsgBody;
1008 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1009 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
1010 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
1011 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1012 "%s:Ftm has not started. Please start the ftm.", __func__);
1013 return VOS_STATUS_E_FAILURE;
1014 }
1015
1016 if (ftm_status.wfRfGenEnabled) {
1017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1018 "%s:cannot set gain when cwgen is enabled.", __func__);
1019 return VOS_STATUS_E_FAILURE;
1020 }
1021
1022 if (dGain > 24 || dGain <-39) {
1023 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1024 "%s:digital gain value is invalid", __func__);
1025 return VOS_STATUS_E_FAILURE;
1026 }
1027
1028 if (rfGain > 31 || rfGain <0) {
1029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1030 "%s:rf gain value is invalid", __func__);
1031 return VOS_STATUS_E_FAILURE;
1032 }
1033
1034 if (pMsgBuf == NULL) {
1035 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1036 "%s:pMsgBuf is NULL", __func__);
1037 return VOS_STATUS_E_NOMEM;
1038 }
1039
1040 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1041 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1042
1043 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1044 init_completion(&pHddCtx->ftm.ftm_comp_var);
1045 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1046 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1047 pMsgBody = &pMsgBuf->msgBody;
1048 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1049 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1050 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1051 VOS_STATUS_SUCCESS) {
1052 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1053 "%s:wlan_ftm_postmsg failed",__func__);
1054 return VOS_STATUS_E_FAILURE;
1055 }
1056
1057 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1058 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1059 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1060 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1061 "%s:Ptt response status failed",__func__);
1062 return VOS_STATUS_E_FAILURE;
1063 }
1064 return VOS_STATUS_SUCCESS;
1065}
1066
1067
1068/**---------------------------------------------------------------------------
1069 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1070 <argument> is < 1 | 0 >
1071 1 : Start Tx CW rf generation
1072 0 : Stop Tx CW rf generation
1073 Description
1074 This command starts/stops Tx CW rf generation.
1075--------------------------------------------------------------------------*/
1076static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1077{
1078 uPttMsgs *pMsgBody;
1079 VOS_STATUS status;
1080 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1081
1082 printk(KERN_EMERG "startStop: %02x ", startStop);
1083
1084 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1085 {
1086 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1087 "%s:Ftm has not started. Please start the ftm. ", __func__);
1088 return VOS_STATUS_E_FAILURE;
1089 }
1090
1091 if (startStop != 1 && startStop != 0)
1092 {
1093 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1094 "%s:Tx value is invalid ", __func__);
1095 return VOS_STATUS_E_FAILURE;
1096 }
1097
1098 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1099 (!ftm_status.wfRfGenEnabled && startStop == 0))
1100 {
1101 return VOS_STATUS_SUCCESS;
1102 }
1103
1104 if (pMsgBuf == NULL)
1105 {
1106 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1107 "%s:pMsgBuf is NULL", __func__);
1108 return VOS_STATUS_E_NOMEM;
1109 }
1110 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1111 if (startStop == 1) {
1112 tANI_U16 numSamples = 1;
1113 tANI_BOOLEAN clk80 = TRUE;
1114 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1115
1116 init_completion(&pHddCtx->ftm.ftm_comp_var);
1117 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1118 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1119 pMsgBody = &pMsgBuf->msgBody;
1120
1121 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1122 pMsgBody->SetWaveformRF.numSamples = numSamples;
1123 pMsgBody->SetWaveformRF.clk80 = clk80;
1124 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1125 if (status != VOS_STATUS_SUCCESS) {
1126 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1127 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1128 __func__);
1129 status = VOS_STATUS_E_FAILURE;
1130 goto done;
1131 }
1132 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1133 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1134 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1135 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1136 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1137 status = VOS_STATUS_E_FAILURE;
1138 goto done;
1139 }
1140 } else {
1141 init_completion(&pHddCtx->ftm.ftm_comp_var);
1142 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1143 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1144 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1145 if(status != VOS_STATUS_SUCCESS) {
1146 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1147 "%s:wlan_ftm_postmsg failed", __func__);
1148 status = VOS_STATUS_E_FAILURE;
1149 goto done;
1150 }
1151
1152 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1153 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1154 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1155 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1156 "%s:Ptt response status failed", __func__);
1157 status = VOS_STATUS_E_FAILURE;
1158 }
1159 }
1160done:
1161 if (status == VOS_STATUS_SUCCESS) {
1162 if (startStop == 1)
1163 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1164 else
1165 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1166 }
1167 return status;
1168}
1169
1170
Jeff Johnson295189b2012-06-20 16:38:30 -07001171static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1172{
Jeff Johnson295189b2012-06-20 16:38:30 -07001173 uPttMsgs *pMsgBody;
1174 VOS_STATUS status;
1175 v_U16_t chainSelect_save = chainSelect;
1176 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301177 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001178
1179 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1180 {
1181 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1182 return VOS_STATUS_E_FAILURE;
1183 }
1184
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05301185 if (NULL == pMsgBuf)
1186 {
1187 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1188 "%s:pMsgBuf is NULL", __func__);
1189 return VOS_STATUS_E_NOMEM;
1190 }
1191
Jeff Johnson295189b2012-06-20 16:38:30 -07001192 if (chainSelect > FTM_CHAIN_SEL_MAX)
1193 {
c_hpothuffdb5272013-10-02 16:42:35 +05301194 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1195 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001196 return VOS_STATUS_E_FAILURE;
1197 }
1198
1199 /* do not allow to change setting when tx pktgen is enabled */
1200 if (ftm_status.frameGenEnabled)
1201 {
1202 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1203 return VOS_STATUS_E_FAILURE;
1204 }
1205
1206 switch (chainSelect)
1207 {
1208 case FTM_CHAIN_SEL_NO_RX_TX:
1209 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1210 break;
1211
1212 case FTM_CHAIN_SEL_R0_ON:
1213 chainSelect = PHY_CHAIN_SEL_R0_ON;
1214 break;
1215
1216 case FTM_CHAIN_SEL_T0_ON:
1217 chainSelect = PHY_CHAIN_SEL_T0_ON;
1218 break;
1219 }
1220
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301221 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001222 init_completion(&pHddCtx->ftm.ftm_comp_var);
1223 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1224 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1225
1226 pMsgBody = &pMsgBuf->msgBody;
1227 pMsgBody->EnableChains.chainSelect = chainSelect;
1228
1229 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1230
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301231 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001232 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301233 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1234 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001235 status = VOS_STATUS_E_FAILURE;
1236 goto done;
1237 }
c_hpothuffdb5272013-10-02 16:42:35 +05301238 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301239 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301240 if (0 >= ret)
1241 {
1242 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1243 FL("wait on ftm_comp_var failed %ld"), ret);
1244 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001245
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301246 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001247 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301248 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1249 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 status = VOS_STATUS_E_FAILURE;
1251 goto done;
1252 }
1253 ftm_status.chainSelect = chainSelect_save;
1254done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001255
1256 return status;
1257}
1258
1259/**---------------------------------------------------------------------------
1260 --------------------------------------------------------------------------*/
1261static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1262{
1263 int ii;
1264 int lenBuf = WE_FTM_MAX_STR_LEN;
1265 int lenRes = 0;
1266 char *chain[] = {
1267 "None",
1268 "R0,R1",
1269 "R0",
1270 "R1",
1271 "T0",
1272 "R0,R1,T0"
1273 };
1274 char *rx[] = {
1275 "disable",
1276 "11b/g/n",
1277 "11g/n",
1278 "11b"
1279 };
1280 char *tx[] = {
1281 "stopped",
1282 "started",
1283 };
1284 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1285
1286 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1287 {
1288 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1289 return VOS_STATUS_E_FAILURE;
1290 }
1291
1292 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001293 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001294 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1295 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001296 ftm_status.frameParams.interFrameSpace);
1297 if ((lenRes < 0) || (lenRes >= lenBuf))
1298 {
c_hpothuffdb5272013-10-02 16:42:35 +05301299 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1300 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001301 return VOS_STATUS_E_FAILURE;
1302 }
1303
1304 buf += lenRes;
1305 lenBuf -= lenRes;
1306
1307 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1308 {
1309 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1310 break;
1311 }
1312
1313 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1314 {
1315 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1316 }
1317 else
1318 {
1319 lenRes = strlcpy(buf, "invalid", lenBuf);
1320 }
1321 if ((lenRes < 0) || (lenRes >= lenBuf))
1322 {
c_hpothuffdb5272013-10-02 16:42:35 +05301323 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1324 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001325 return VOS_STATUS_E_FAILURE;
1326 }
1327
1328 buf += lenRes;
1329 lenBuf -= lenRes;
1330
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301331 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1332 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001333 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001334 ftm_status.frameParams.payloadLength);
1335
1336 if ((lenRes < 0) || (lenRes >= lenBuf))
1337 {
c_hpothuffdb5272013-10-02 16:42:35 +05301338 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1339 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001340 return VOS_STATUS_E_FAILURE;
1341 }
1342
1343 return VOS_STATUS_SUCCESS;
1344}
1345
Jeff Johnson295189b2012-06-20 16:38:30 -07001346
1347void HEXDUMP(char *s0, char *s1, int len)
1348{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301349 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001350 printk(KERN_EMERG "%s\n :", s0);
1351
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301352 if (len > 8)
1353 {
1354 for (j = 0; j < len/8; j++)
1355 {
1356 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1357 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1358 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1359 }
1360 len = len - j*8;
1361 }
1362 for (i = 0; i< len; i++) {
1363 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001364 }
1365 printk("\n");
1366}
1367
Jeff Johnson295189b2012-06-20 16:38:30 -07001368/*---------------------------------------------------------------------------
1369
1370 \brief vos_ftm_preStart() -
1371
1372 The \a vos_ftm_preStart() function to download CFG.
1373 including:
1374 - ccmStart
1375
1376 - WDA: triggers the CFG download
1377
1378
1379 \param pVosContext: The VOS context
1380
1381
1382 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1383 is ready to be used.
1384
1385 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1386 are unavailable to initialize the scheduler
1387
1388
1389 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1390
1391 \sa vos_start
1392
1393---------------------------------------------------------------------------*/
1394VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1395{
1396 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1397 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001398
Jeff Johnson295189b2012-06-20 16:38:30 -07001399 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1400 "vos prestart");
1401
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001402 if (NULL == pVosContext->pWDAContext)
1403 {
1404 VOS_ASSERT(0);
1405 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1406 "%s: WDA NULL context", __func__);
1407 return VOS_STATUS_E_FAILURE;
1408 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001409
1410 /* call macPreStart */
1411 vStatus = macPreStart(pVosContext->pMACContext);
1412 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1413 {
1414 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1415 "Failed at macPreStart ");
1416 return VOS_STATUS_E_FAILURE;
1417 }
1418
1419 /* call ccmStart */
1420 ccmStart(pVosContext->pMACContext);
1421
1422 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001423 vos_event_reset(&pVosContext->wdaCompleteEvent);
1424
Jeff Johnson295189b2012-06-20 16:38:30 -07001425
1426 /*call WDA pre start*/
1427 vStatus = WDA_preStart(pVosContext);
1428 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1429 {
1430 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1431 "Failed to WDA prestart ");
1432 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1433 ccmStop(pVosContext->pMACContext);
1434 VOS_ASSERT(0);
1435 return VOS_STATUS_E_FAILURE;
1436 }
1437
1438 /* Need to update time out of complete */
1439 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1440 if ( vStatus != VOS_STATUS_SUCCESS )
1441 {
1442 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1443 {
1444 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001445 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001446 }
1447 else
1448 {
1449 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001450 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001451 }
1452 VOS_ASSERT( 0 );
1453 return VOS_STATUS_E_FAILURE;
1454 }
1455
1456 return VOS_STATUS_SUCCESS;
1457}
Jeff Johnson295189b2012-06-20 16:38:30 -07001458
1459/**---------------------------------------------------------------------------
1460
1461 \brief wlan_hdd_ftm_open() -
1462
1463 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1464
1465 \param - pAdapter - Pointer HDD Context.
1466
1467 \return - 0 for success, non zero for failure
1468
1469 --------------------------------------------------------------------------*/
1470
1471int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1472{
1473 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1474 pVosContextType pVosContext= NULL;
1475 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001476
Jeff Johnson295189b2012-06-20 16:38:30 -07001477 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1478 "%s: Opening VOSS", __func__);
1479
1480 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1481
1482 if (NULL == pVosContext)
1483 {
1484 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301485 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001486 VOS_ASSERT(0);
1487 goto err_vos_status_failure;
1488 }
1489
1490 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301491 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001492
1493 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1494 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301495 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001496 goto err_vos_status_failure;
1497 }
1498
Jeff Johnson295189b2012-06-20 16:38:30 -07001499 /*
1500 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1501 */
1502 /* Save the hal context in Adapter */
1503 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001504
1505 if ( NULL == pHddCtx->hHal )
1506 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301507 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301508 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001509 }
1510
1511 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1512 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1513 if( NULL == pAdapter )
1514 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301515 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301516 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001517 }
1518
1519 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1520 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301521 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301522 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001523 }
1524
1525 //Initialize the nlink service
1526 if(nl_srv_init() != 0)
1527 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301528 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001529 goto err_ftm_register_wext_close;
1530 }
1531
Leo Chang9e646082013-08-02 11:20:21 -07001532#ifdef WLAN_KD_READY_NOTIFIER
1533 pHddCtx->kd_nl_init = 1;
1534#endif /* WLAN_KD_READY_NOTIFIER */
1535
Jeff Johnson295189b2012-06-20 16:38:30 -07001536#ifdef PTT_SOCK_SVC_ENABLE
1537 //Initialize the PTT service
1538 if(ptt_sock_activate_svc(pHddCtx) != 0)
1539 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301540 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001541 goto err_nl_srv_init;
1542 }
1543#endif
1544 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1545 {
1546 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1547 goto err_nl_srv_init;
1548 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001549
Jeff Johnson295189b2012-06-20 16:38:30 -07001550 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1551 pHddCtx->ftm.targetNVTableSize = 0;
1552 pHddCtx->ftm.targetNVTablePointer = NULL;
1553 pHddCtx->ftm.processedNVTableSize = 0;
1554 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1555 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1556 {
1557 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301558 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001559 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001560 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001561 }
1562 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001563
1564 _ftm_status_init();
1565 /* Initialize the ftm vos event */
1566 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1567 {
1568 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301569 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001570 VOS_ASSERT(0);
1571 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1572 goto err_nl_srv_init;
1573 }
1574
1575 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1576
1577 return VOS_STATUS_SUCCESS;
1578
1579err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001580#ifdef WLAN_KD_READY_NOTIFIER
1581nl_srv_exit(pHddCtx->ptt_pid);
1582#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001583nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001584#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001585err_ftm_register_wext_close:
1586hdd_UnregisterWext(pAdapter->dev);
1587
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301588err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001589err_adapter_open_failure:
1590hdd_close_all_adapters( pHddCtx );
1591
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301592err_ftm_vos_close:
1593 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001594err_vos_status_failure:
1595
1596 return VOS_STATUS_E_FAILURE;
1597}
1598
1599
1600
1601int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1602{
1603 VOS_STATUS vosStatus;
1604 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1605
1606 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1607 ENTER();
1608 if(pAdapter == NULL)
1609 {
1610 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1611 return VOS_STATUS_E_NOMEM;
1612 }
1613
Atul Mittalc41126d2014-03-17 15:10:11 +05301614 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1615 if (pHddCtx->ftm.IsCmdPending == TRUE)
1616 {
1617 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1618 {
1619 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1620 "%s: vos_event_set failed", __func__);
1621 }
1622 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001623 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1624 {
1625 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1626 "%s: Ftm has been started. stopping ftm", __func__);
1627 wlan_ftm_stop(pHddCtx);
1628 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001629
1630 //Assert Deep sleep signal now to put Libra HW in lowest power state
1631 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301632 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1633 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1634 "%s: Failed to assert deep sleep signal", __func__);
1635 VOS_ASSERT( 0 );
1636 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001637
1638 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301639 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1640 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1641 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1642 "%s: Failed to put HW into low power", __func__);
1643 VOS_ASSERT( 0 );
1644 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001645
1646 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1647
Leo Chang59cdc7e2013-07-10 10:08:21 -07001648#ifdef WLAN_KD_READY_NOTIFIER
1649 nl_srv_exit(pHddCtx->ptt_pid);
1650#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001651 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001652#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001653 //TODO----------
1654 //Deregister the device with the kernel
1655 hdd_UnregisterWext(pAdapter->dev);
1656
1657 hdd_close_all_adapters( pHddCtx );
1658#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001659 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001660 {
1661 unregister_netdev(pAdapter->dev);
1662 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1663 }
1664#endif
1665 //-----------------
1666
1667 vosStatus = vos_sched_close( vosContext );
1668 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1669 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1670 "%s: Failed to close VOSS Scheduler",__func__);
1671 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1672 }
1673
1674 //Close VOSS
1675 wlan_ftm_vos_close(vosContext);
1676
1677
1678 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1679 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1680 {
1681 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1682 "%s: Failed to destroy ftm_vos Event",__func__);
1683 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1684 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001685 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001686
Jeff Johnson295189b2012-06-20 16:38:30 -07001687 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001688}
1689
1690/**---------------------------------------------------------------------------
1691
1692 \brief wlan_ftm_send_response() -
1693
1694 The function sends the response to the ptt socket application running in user space.
1695
1696 \param - pAdapter - Pointer HDD Context.
1697
1698 \return - 0 for success, non zero for failure
1699
1700 --------------------------------------------------------------------------*/
1701
1702static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1703
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301704 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1705 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001706
Arif Hussain6d2a3322013-11-17 19:50:10 -08001707 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 -07001708 return VOS_STATUS_E_FAILURE;
1709 }
1710 return VOS_STATUS_SUCCESS;
1711}
1712
1713/**---------------------------------------------------------------------------
1714
1715 \brief wlan_hdd_ftm_start() -
1716
1717 This function gets called when the FTM start commands received from the ptt socket application and
1718 it starts the following modules.
1719 1) SAL Start.
1720 2) BAL Start.
1721 3) MAC Start to download the firmware.
1722
1723
1724 \param - pAdapter - Pointer HDD Context.
1725
1726 \return - 0 for success, non zero for failure
1727
1728 --------------------------------------------------------------------------*/
1729
1730static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1731{
1732 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1733 tSirRetStatus sirStatus = eSIR_SUCCESS;
1734 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1735 tHalMacStartParameters halStartParams;
1736
1737 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1738 {
1739 return VOS_STATUS_SUCCESS;
1740 }
1741
1742 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1743 "%s: Starting Libra SW", __func__);
1744
1745 /* We support only one instance for now ...*/
1746 if (pVosContext == NULL)
1747 {
1748 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001749 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001750 goto err_status_failure;
1751 }
1752
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001753
Jeff Johnson295189b2012-06-20 16:38:30 -07001754 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001755 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001756 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001757 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001758 goto err_status_failure;
1759 }
1760
Jeff Johnson295189b2012-06-20 16:38:30 -07001761 /*
1762 Prima needs to start the WDA correctly instead of BAL and SAL
1763 */
1764
1765 /* Vos preStart is calling */
1766 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1767 {
1768 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1769 goto err_status_failure;
1770 }
1771
1772
1773 vStatus = WDA_NVDownload_Start(pVosContext);
1774
1775 if ( vStatus != VOS_STATUS_SUCCESS )
1776 {
1777 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1778 "%s: Failed to start NV Download",__func__);
1779 return VOS_STATUS_E_FAILURE;
1780 }
1781
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301782 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001783
1784 if ( vStatus != VOS_STATUS_SUCCESS )
1785 {
1786 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1787 {
1788 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001789 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001790 }
1791 else
1792 {
1793 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001794 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001795 }
1796 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301797 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001798 }
1799
1800 vStatus = WDA_start(pVosContext);
1801 if (vStatus != VOS_STATUS_SUCCESS)
1802 {
1803 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1804 "%s: Failed to start WDA",__func__);
1805 goto err_status_failure;
1806 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001807
Jeff Johnson295189b2012-06-20 16:38:30 -07001808
1809 /* Start the MAC */
1810 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1811
Jeff Johnson295189b2012-06-20 16:38:30 -07001812
1813 halStartParams.driverType = eDRIVER_TYPE_MFG;
1814
1815 /* Start the MAC */
1816 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1817
Jeff Johnson295189b2012-06-20 16:38:30 -07001818
1819 if (eSIR_SUCCESS != sirStatus)
1820 {
1821 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1822 "%s: Failed to start MAC", __func__);
1823
Jeff Johnson295189b2012-06-20 16:38:30 -07001824 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001825 }
1826
1827 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1828 "%s: MAC correctly started",__func__);
1829
Jeff Johnson295189b2012-06-20 16:38:30 -07001830
1831 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1832
1833 return VOS_STATUS_SUCCESS;
1834
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001835err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001836 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1837 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1838 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1839 if(vStatus != VOS_STATUS_SUCCESS)
1840 {
1841 if(vStatus == VOS_STATUS_E_TIMEOUT)
1842 {
1843 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001844 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001845
1846 }
1847 else
1848 {
1849 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001850 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001851 }
1852 VOS_ASSERT(0);
1853 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001854
1855err_status_failure:
1856
1857 return VOS_STATUS_E_FAILURE;
1858
1859}
1860
1861
1862static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1863{
1864 VOS_STATUS vosStatus;
1865
1866 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1867 {
1868 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1869 return VOS_STATUS_E_FAILURE;
1870 }
1871
1872 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1873 {
1874 /* STOP MAC only */
1875 v_VOID_t *hHal;
1876 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1877 if (NULL == hHal)
1878 {
1879 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1880 "%s: NULL hHal", __func__);
1881 }
1882 else
1883 {
1884 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1885 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1886 {
1887 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1888 "%s: Failed to stop SYS", __func__);
1889 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1890 }
1891 }
1892
Jeff Johnson295189b2012-06-20 16:38:30 -07001893
Jeff Johnson295189b2012-06-20 16:38:30 -07001894 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001895
1896 }
1897 return WLAN_FTM_SUCCESS;
1898}
1899
Jeff Johnson295189b2012-06-20 16:38:30 -07001900/**---------------------------------------------------------------------------
1901
1902 \brief wlan_hdd_ftm_get_nv_table() -
1903 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001904 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001905
1906 \param - ftmCmd - Pointer FTM Commad Buffer
1907
1908 \return - int
1909 -1, Process Host command fail, vail out
1910 1, Process Host command success
1911
1912 --------------------------------------------------------------------------*/
1913int wlan_hdd_ftm_get_nv_table
1914(
1915 hdd_context_t *pHddCtx,
1916 tPttMsgbuffer *ftmCmd
1917)
1918{
1919 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1920 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1921 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001922 sHalNvV2 *nvContents = NULL;
1923 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001924
Jeff Johnson295189b2012-06-20 16:38:30 -07001925 if (NULL == pHddCtx)
1926 {
1927 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1928 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001929 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001930 }
1931
Leo Chang80de3c22013-11-26 10:52:12 -08001932 nvVersion = vos_nv_getNvVersion();
1933 if (E_NV_V2 != nvVersion)
1934 {
1935 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1936 "%s : Not valid NV Version %d", __func__, nvVersion);
1937 return -EINVAL;
1938 }
1939
Jeff Johnson295189b2012-06-20 16:38:30 -07001940 /* Test first chunk of NV table */
1941 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1942 (0 == pHddCtx->ftm.processedNVTableSize))
1943 {
1944 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1945 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1946 {
c_hpothuffdb5272013-10-02 16:42:35 +05301947 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1948 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001949 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001950 }
1951
1952 switch (nvTable->nvTable)
1953 {
1954 case NV_TABLE_RATE_POWER_SETTINGS:
1955 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1956 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1957 break;
1958
1959 case NV_TABLE_REGULATORY_DOMAINS:
1960 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1961 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1962 break;
1963
1964 case NV_TABLE_DEFAULT_COUNTRY:
1965 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1966 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1967 break;
1968
1969 case NV_TABLE_TPC_POWER_TABLE:
1970 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1971 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1972 break;
1973
1974 case NV_TABLE_TPC_PDADC_OFFSETS:
1975 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1976 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1977 break;
1978
1979 case NV_TABLE_VIRTUAL_RATE:
1980 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1981 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1982 break;
1983
1984 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1985 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1986 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1987 break;
1988
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001989 case NV_TABLE_HW_CAL_VALUES:
1990 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1991 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1992 break;
1993
1994 case NV_TABLE_FW_CONFIG:
1995 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1996 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001997 break;
1998
1999 case NV_TABLE_ANTENNA_PATH_LOSS:
2000 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2001 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2002 break;
2003
2004 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2005 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2006 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2007 break;
2008
2009 default:
2010 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2011 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002012 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002013 break;
2014 }
2015
2016 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2017 {
2018 /* Invalid table size, discard and initialize data */
2019 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002020 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002021 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002022 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002023 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2024 pHddCtx->ftm.targetNVTableSize = 0;
2025 pHddCtx->ftm.processedNVTableSize = 0;
2026 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002027 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002028 }
2029
2030 /* Set Current Processing NV table type */
2031 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2032 /* Copy target NV table value into temp context buffer */
2033 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2034 pHddCtx->ftm.targetNVTablePointer,
2035 pHddCtx->ftm.targetNVTableSize);
2036
2037 }
2038
2039 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2040 {
2041 /* Invalid table type */
2042 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2043 "Invalid NV Table, now Processing %d, not %d",
2044 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2045 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2046 pHddCtx->ftm.targetNVTableSize = 0;
2047 pHddCtx->ftm.processedNVTableSize = 0;
2048 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002049
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002050 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002051 }
2052
2053 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002054 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002055 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2056 nvTable->chunkSize);
2057 /* Update processed pointer to prepare next chunk copy */
2058 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2059
2060 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2061 {
2062 /* Finished to process last chunk of data, initialize buffer */
2063 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2064 pHddCtx->ftm.targetNVTableSize = 0;
2065 pHddCtx->ftm.processedNVTableSize = 0;
2066 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2067 }
2068
2069 return 1;
2070}
2071
2072/**---------------------------------------------------------------------------
2073
2074 \brief wlan_hdd_ftm_set_nv_table() -
2075 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002076 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002077
2078 \param - ftmCmd - Pointer FTM Commad Buffer
2079
2080 \return - int
2081 -1, Process Host command fail, vail out
2082 1, Process Host command success
2083
2084 --------------------------------------------------------------------------*/
2085int wlan_hdd_ftm_set_nv_table
2086(
2087 hdd_context_t *pHddCtx,
2088 tPttMsgbuffer *ftmCmd
2089)
2090{
2091 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2092 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2093 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002094 sHalNvV2 *nvContents = NULL;
2095 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002096
2097 if (NULL == pHddCtx)
2098 {
2099 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2100 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002101 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 }
2103
Leo Chang80de3c22013-11-26 10:52:12 -08002104 nvVersion = vos_nv_getNvVersion();
2105 if (E_NV_V2 != nvVersion)
2106 {
2107 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2108 "%s : Not valid NV Version %d", __func__, nvVersion);
2109 return -EINVAL;
2110 }
2111
Jeff Johnson295189b2012-06-20 16:38:30 -07002112 /* Test first chunk of NV table */
2113 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2114 (0 == pHddCtx->ftm.processedNVTableSize))
2115 {
2116 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2117 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2118 {
c_hpothuffdb5272013-10-02 16:42:35 +05302119 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2120 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002121 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002122 }
2123
2124 switch (nvTable->nvTable)
2125 {
2126 case NV_TABLE_RATE_POWER_SETTINGS:
2127 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2128 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2129 break;
2130
2131 case NV_TABLE_REGULATORY_DOMAINS:
2132 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2133 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2134 break;
2135
2136 case NV_TABLE_DEFAULT_COUNTRY:
2137 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2138 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2139 break;
2140
2141 case NV_TABLE_TPC_POWER_TABLE:
2142 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2143 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2144 break;
2145
2146 case NV_TABLE_TPC_PDADC_OFFSETS:
2147 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2148 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2149 break;
2150
2151 case NV_TABLE_VIRTUAL_RATE:
2152 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2153 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2154 break;
2155
2156 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2157 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2158 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2159 break;
2160
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002161 case NV_TABLE_HW_CAL_VALUES:
2162 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2163 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2164 break;
2165
2166 case NV_TABLE_FW_CONFIG:
2167 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2168 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002169 break;
2170
2171 case NV_TABLE_ANTENNA_PATH_LOSS:
2172 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2173 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2174 break;
2175
2176 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2177 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2178 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2179 break;
2180
2181 default:
2182 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2183 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002184 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002185 break;
2186 }
2187
2188 /* Set Current Processing NV table type */
2189 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2190 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2191 {
2192 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2193 "Invalid Table Size %d", nvTable->tableSize);
2194 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2195 pHddCtx->ftm.targetNVTableSize = 0;
2196 pHddCtx->ftm.processedNVTableSize = 0;
2197 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002198 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002199 }
2200 }
2201
2202 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2203 {
2204 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2205 "Invalid NV Table, now Processing %d, not %d",
2206 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2207 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2208 pHddCtx->ftm.targetNVTableSize = 0;
2209 pHddCtx->ftm.processedNVTableSize = 0;
2210 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002211 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002212 }
2213 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002214 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002215 nvTable->chunkSize);
2216
2217 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2218 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2219 {
2220 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2221 pHddCtx->ftm.tempNVTableBuffer,
2222 pHddCtx->ftm.targetNVTableSize);
2223 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2224 pHddCtx->ftm.targetNVTableSize = 0;
2225 pHddCtx->ftm.processedNVTableSize = 0;
2226 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2227 }
2228
2229 return 1;
2230}
2231
2232/**---------------------------------------------------------------------------
2233
2234 \brief wlan_hdd_ftm_blank_nv() -
2235 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002236 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002237
2238 \param - ftmCmd - Pointer FTM Commad Buffer
2239
2240 \return - int
2241 -1, Process Host command fail, vail out
2242 0, Process Host command success
2243
2244 --------------------------------------------------------------------------*/
2245int wlan_hdd_ftm_blank_nv_table
2246(
2247 tPttMsgbuffer *ftmCmd
2248)
2249{
Leo Chang80de3c22013-11-26 10:52:12 -08002250 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002251 v_SIZE_t nvSize;
2252 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002253 sHalNvV2 *nvContents = NULL;
2254 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002255
2256 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2257 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2258 {
c_hpothuffdb5272013-10-02 16:42:35 +05302259 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2260 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002261 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002262 }
2263
Leo Chang80de3c22013-11-26 10:52:12 -08002264 nvVersion = vos_nv_getNvVersion();
2265 if (E_NV_V2 != nvVersion)
2266 {
2267 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2268 "%s : Not valid NV Version %d", __func__, nvVersion);
2269 return -EINVAL;
2270 }
2271
Jeff Johnson295189b2012-06-20 16:38:30 -07002272 itemSize = sizeof(nvContents->tables.pwrOptimum);
2273 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002274 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002275 itemSize);
2276
2277 itemSize = sizeof(nvContents->tables.regDomains);
2278 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002279 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002280 itemSize);
2281
2282 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2283 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002284 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002285 itemSize);
2286
2287 itemSize = sizeof(nvContents->tables.plutCharacterized);
2288 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002289 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002290 itemSize);
2291
2292 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2293 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002294 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002295 itemSize);
2296
2297 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2298 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002299 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002300 itemSize);
2301
2302 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2303 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002304 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002305 itemSize);
2306
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002307 itemSize = sizeof(nvContents->tables.hwCalValues);
2308 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002309 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002310 itemSize);
2311
2312 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2313 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002314 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002315 itemSize);
2316
2317 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2318 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002319 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002320 itemSize);
2321
2322 return 1;
2323}
2324
2325/**---------------------------------------------------------------------------
2326
2327 \brief wlan_hdd_ftm_delete_nv_table() -
2328 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002329 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002330
2331 \param - ftmCmd - Pointer FTM Commad Buffer
2332
2333 \return - int
2334 -1, Process Host command fail, vail out
2335 1, Process Host command success
2336
2337 --------------------------------------------------------------------------*/
2338int wlan_hdd_ftm_delete_nv_table
2339(
2340 tPttMsgbuffer *ftmCmd
2341)
2342{
Leo Chang80de3c22013-11-26 10:52:12 -08002343 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002344 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2345 v_SIZE_t nvSize;
2346 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002347 sHalNvV2 *nvContents = NULL;
2348 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002349
2350 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2351 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2352 {
c_hpothuffdb5272013-10-02 16:42:35 +05302353 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2354 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002355 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002356 }
2357
Leo Chang80de3c22013-11-26 10:52:12 -08002358 nvVersion = vos_nv_getNvVersion();
2359 if (E_NV_V2 != nvVersion)
2360 {
2361 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2362 "%s : Not valid NV Version %d", __func__, nvVersion);
2363 return -EINVAL;
2364 }
2365
Jeff Johnson295189b2012-06-20 16:38:30 -07002366 switch (nvTable->nvTable)
2367 {
2368 case NV_TABLE_RATE_POWER_SETTINGS:
2369 itemSize = sizeof(nvContents->tables.pwrOptimum);
2370 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002371 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002372 itemSize);
2373 break;
2374
2375 case NV_TABLE_REGULATORY_DOMAINS:
2376 itemSize = sizeof(nvContents->tables.regDomains);
2377 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002378 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002379 itemSize);
2380 break;
2381
2382 case NV_TABLE_DEFAULT_COUNTRY:
2383 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2384 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002385 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002386 itemSize);
2387 break;
2388
2389 case NV_TABLE_TPC_POWER_TABLE:
2390 itemSize = sizeof(nvContents->tables.plutCharacterized);
2391 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002392 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002393 itemSize);
2394 break;
2395
2396 case NV_TABLE_TPC_PDADC_OFFSETS:
2397 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2398 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002399 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002400 itemSize);
2401 break;
2402
2403 case NV_TABLE_VIRTUAL_RATE:
2404 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2405 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002406 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002407 itemSize);
2408 break;
2409
2410 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2411 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2412 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002413 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002414 itemSize);
2415 break;
2416
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002417 case NV_TABLE_HW_CAL_VALUES:
2418 itemSize = sizeof(nvContents->tables.hwCalValues);
2419 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002420 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002421 itemSize);
2422 break;
2423
2424 case NV_TABLE_FW_CONFIG:
2425 itemSize = sizeof(nvContents->tables.fwConfig);
2426 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002427 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002428 itemSize);
2429 break;
2430
2431 case NV_TABLE_ANTENNA_PATH_LOSS:
2432 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2433 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002434 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002435 itemSize);
2436 break;
2437
2438 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2439 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2440 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002441 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002442 itemSize);
2443 break;
2444
2445 default:
2446 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2447 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002448 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002449 break;
2450 }
2451
2452 return 1;
2453}
2454
2455/**---------------------------------------------------------------------------
2456
2457 \brief wlan_hdd_ftm_get_nv_field() -
2458 Get Specific NV field
2459
2460 \param - ftmCmd - Pointer FTM Commad Buffer
2461
2462 \return - int
2463 -1, Process Host command fail, vail out
2464 1, Process Host command success
2465
2466 --------------------------------------------------------------------------*/
2467int wlan_hdd_ftm_get_nv_field
2468(
2469 tPttMsgbuffer *ftmCmd
2470)
2471{
2472 sNvFields nvFieldDataBuffer;
2473 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2474 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2475 sHalNv *nvContents = NULL;
2476 v_SIZE_t nvSize;
2477
2478 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2479 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2480 {
c_hpothuffdb5272013-10-02 16:42:35 +05302481 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2482 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002483 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002484 }
2485 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2486
2487 switch (nvField->nvField)
2488 {
2489 case NV_COMMON_PRODUCT_ID:
2490 memcpy((void *)&nvField->fieldData,
2491 &nvFieldDataBuffer.productId,
2492 sizeof(nvFieldDataBuffer.productId));
2493 break;
2494
2495 case NV_COMMON_PRODUCT_BANDS:
2496 memcpy((void *)&nvField->fieldData,
2497 &nvFieldDataBuffer.productBands,
2498 sizeof(nvFieldDataBuffer.productBands));
2499 break;
2500
2501 case NV_COMMON_NUM_OF_TX_CHAINS:
2502 memcpy((void *)&nvField->fieldData,
2503 &nvFieldDataBuffer.numOfTxChains,
2504 sizeof(nvFieldDataBuffer.numOfTxChains));
2505 break;
2506
2507 case NV_COMMON_NUM_OF_RX_CHAINS:
2508 memcpy((void *)&nvField->fieldData,
2509 &nvFieldDataBuffer.numOfRxChains,
2510 sizeof(nvFieldDataBuffer.numOfRxChains));
2511 break;
2512
2513 case NV_COMMON_MAC_ADDR:
2514 memcpy((void *)&nvField->fieldData,
2515 &nvFieldDataBuffer.macAddr[0],
2516 NV_FIELD_MAC_ADDR_SIZE);
2517 break;
2518
2519 case NV_COMMON_MFG_SERIAL_NUMBER:
2520 memcpy((void *)&nvField->fieldData,
2521 &nvFieldDataBuffer.mfgSN[0],
2522 NV_FIELD_MFG_SN_SIZE);
2523 break;
2524
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002525 case NV_COMMON_WLAN_NV_REV_ID:
2526 memcpy((void *)&nvField->fieldData,
2527 &nvFieldDataBuffer.wlanNvRevId,
2528 sizeof(nvFieldDataBuffer.wlanNvRevId));
2529 break;
2530
Jeff Johnson295189b2012-06-20 16:38:30 -07002531 case NV_COMMON_COUPLER_TYPE:
2532 memcpy((void *)&nvField->fieldData,
2533 &nvFieldDataBuffer.couplerType,
2534 sizeof(nvFieldDataBuffer.couplerType));
2535 break;
2536
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002537 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002538 {
2539 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2540 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2541
2542 nvEmbededStatus = vos_nv_isEmbeddedNV();
2543
2544 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2545 {
2546 // High bit is set to indicate embedded NV..
2547 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2548 }
2549
2550 memcpy((void *)&nvField->fieldData,
2551 &nvVersion,
2552 sizeof(nvFieldDataBuffer.nvVersion));
2553 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002554 break;
2555
Jeff Johnson295189b2012-06-20 16:38:30 -07002556 default:
2557 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2558 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002559 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002560 break;
2561 }
2562
2563 return 1;
2564}
2565
2566/**---------------------------------------------------------------------------
2567
2568 \brief wlan_hdd_ftm_set_nv_field() -
2569 Set Specific NV field
2570
2571 \param - ftmCmd - Pointer FTM Commad Buffer
2572
2573 \return - int
2574 -1, Process Host command fail, vail out
2575 1, Process Host command success
2576
2577 --------------------------------------------------------------------------*/
2578int wlan_hdd_ftm_set_nv_field
2579(
2580 tPttMsgbuffer *ftmCmd
2581)
2582{
2583 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2584 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2585 v_SIZE_t nvSize;
2586 sHalNv *nvContents = NULL;
2587 v_U8_t macLoop;
2588 v_U8_t *pNVMac;
2589 v_U8_t lastByteMAC;
2590
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002591
Jeff Johnson295189b2012-06-20 16:38:30 -07002592 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2593 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2594 {
c_hpothuffdb5272013-10-02 16:42:35 +05302595 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2596 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002597 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002598 }
2599
2600 switch (nvField->nvField)
2601 {
2602 case NV_COMMON_PRODUCT_ID:
2603 memcpy(&nvContents->fields.productId,
2604 &nvField->fieldData,
2605 sizeof(nvContents->fields.productId));
2606 break;
2607
2608 case NV_COMMON_PRODUCT_BANDS:
2609 memcpy(&nvContents->fields.productBands,
2610 &nvField->fieldData,
2611 sizeof(nvContents->fields.productBands));
2612 break;
2613
2614 case NV_COMMON_NUM_OF_TX_CHAINS:
2615 memcpy(&nvContents->fields.numOfTxChains,
2616 &nvField->fieldData,
2617 sizeof(nvContents->fields.numOfTxChains));
2618 break;
2619
2620 case NV_COMMON_NUM_OF_RX_CHAINS:
2621 memcpy(&nvContents->fields.numOfRxChains,
2622 &nvField->fieldData,
2623 sizeof(nvContents->fields.numOfRxChains));
2624 break;
2625
2626 case NV_COMMON_MAC_ADDR:
2627 /* If Last byte is larger than 252 (0xFC), return Error,
2628 * Since 3MACs should be derived from first MAC */
2629 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002630 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002631 {
2632 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2633 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002634 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002635 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002636 }
2637
2638 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002639 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002640 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2641 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002642 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002643 lastByteMAC + macLoop;
2644 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002645 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002646 NV_FIELD_MAC_ADDR_SIZE);
2647 }
2648 break;
2649
2650 case NV_COMMON_MFG_SERIAL_NUMBER:
2651 memcpy(&nvContents->fields.mfgSN[0],
2652 &nvField->fieldData,
2653 NV_FIELD_MFG_SN_SIZE);
2654 break;
2655
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002656 case NV_COMMON_WLAN_NV_REV_ID:
2657 memcpy(&nvContents->fields.wlanNvRevId,
2658 &nvField->fieldData,
2659 sizeof(nvContents->fields.wlanNvRevId));
2660 break;
2661
Jeff Johnson295189b2012-06-20 16:38:30 -07002662 case NV_COMMON_COUPLER_TYPE:
2663 memcpy(&nvContents->fields.couplerType,
2664 &nvField->fieldData,
2665 sizeof(nvContents->fields.couplerType));
2666 break;
2667
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002668 case NV_COMMON_NV_VERSION:
2669 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2670 "Cannot modify NV version field %d", nvField->nvField);
2671 return -EIO;
2672 break;
2673
Jeff Johnson295189b2012-06-20 16:38:30 -07002674 default:
2675 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2676 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002677 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002678 break;
2679 }
2680
2681 return 1;
2682}
2683
2684/**---------------------------------------------------------------------------
2685
2686 \brief wlan_hdd_ftm_store_nv_table() -
2687 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002688 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002689
2690 \param - ftmCmd - Pointer FTM Commad Buffer
2691
2692 \return - int
2693 -1, Process Host command fail, vail out
2694 0, Process Host command success
2695
2696 --------------------------------------------------------------------------*/
2697int wlan_hdd_ftm_store_nv_table
2698(
2699 tPttMsgbuffer *ftmCmd
2700)
2701{
2702 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2703 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002704 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2705 void *tablePtr = NULL;
2706 unsigned int tableSize = 0;
2707 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002708 sHalNvV2 *nvContents = NULL;
2709 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002710
2711 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2712 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2713 {
c_hpothuffdb5272013-10-02 16:42:35 +05302714 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2715 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002716 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002717 }
2718
Leo Chang80de3c22013-11-26 10:52:12 -08002719 nvVersion = vos_nv_getNvVersion();
2720 if (E_NV_V2 != nvVersion)
2721 {
2722 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2723 "%s : Not valid NV Version %d", __func__, nvVersion);
2724 return -EINVAL;
2725 }
2726
Jeff Johnson295189b2012-06-20 16:38:30 -07002727 /* Set Platform type as PRIMA */
2728 nvContents->fields.wlanNvRevId = 2;
2729
2730 switch(nvTable->nvTable)
2731 {
2732 case NV_FIELDS_IMAGE:
2733 tablePtr = (void *)&nvContents->fields;
2734 tableSize = sizeof(nvContents->fields);
2735 tableVNVType = VNV_FIELD_IMAGE;
2736 break;
2737
2738 case NV_TABLE_RATE_POWER_SETTINGS:
2739 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2740 tableSize = sizeof(nvContents->tables.pwrOptimum);
2741 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2742 break;
2743
2744 case NV_TABLE_REGULATORY_DOMAINS:
2745 tablePtr = (void *)&nvContents->tables.regDomains[0];
2746 tableSize = sizeof(nvContents->tables.regDomains);
2747 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2748 break;
2749
2750 case NV_TABLE_DEFAULT_COUNTRY:
2751 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2752 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2753 tableVNVType = VNV_DEFAULT_LOCATION;
2754 break;
2755
2756 case NV_TABLE_TPC_POWER_TABLE:
2757 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2758 tableSize = sizeof(nvContents->tables.plutCharacterized);
2759 tableVNVType = VNV_TPC_POWER_TABLE;
2760 break;
2761
2762 case NV_TABLE_TPC_PDADC_OFFSETS:
2763 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2764 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2765 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2766 break;
2767
2768 case NV_TABLE_VIRTUAL_RATE:
2769 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2770 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2771 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2772 break;
2773
2774 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2775 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2776 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2777 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2778 break;
2779
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002780 case NV_TABLE_HW_CAL_VALUES:
2781 tablePtr = (void *)&nvContents->tables.hwCalValues;
2782 tableSize = sizeof(nvContents->tables.hwCalValues);
2783 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002784 break;
2785
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002786 case NV_TABLE_FW_CONFIG:
2787 tablePtr = (void *)&nvContents->tables.fwConfig;
2788 tableSize = sizeof(nvContents->tables.fwConfig);
2789 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002790 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002791
Jeff Johnson295189b2012-06-20 16:38:30 -07002792 case NV_TABLE_ANTENNA_PATH_LOSS:
2793 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2794 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2795 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2796 break;
2797
2798 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2799 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2800 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2801 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2802 break;
2803
2804 default:
2805 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2806 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002807 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002808 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002809
Jeff Johnson295189b2012-06-20 16:38:30 -07002810 }
2811
2812 nvStatus = vos_nv_write(tableVNVType,
2813 tablePtr,
2814 tableSize);
2815 if(VOS_STATUS_SUCCESS != nvStatus)
2816 {
c_hpothuffdb5272013-10-02 16:42:35 +05302817 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2818 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002819 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002820 }
2821
2822 return 1;
2823}
2824
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002825/* --------------------------------------------------------------------------
2826 \brief wlan_hdd_ftm_get_nv_bin() -
2827 Get NV bin read from Flash Memory, file
2828
2829 \param - ftmCmd - Pointer FTM Commad Buffer
2830
2831 \return - int
2832 -1, Process Host command fail, vail out
2833 0, Process Host command success
2834--------------------------------------------------------------------------*/
2835
2836static int wlan_hdd_ftm_get_nv_bin
2837(
2838 v_U16_t msgId,
2839 hdd_context_t *pHddCtx,
2840 tPttMsgbuffer *ftmCmd
2841)
2842{
2843 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2844 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2845 v_SIZE_t nvSize;
2846 v_U8_t *nvContents;
2847 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002848 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002849
Leo Chang80de3c22013-11-26 10:52:12 -08002850 nvVersion = vos_nv_getNvVersion();
2851 if (E_NV_V3 != nvVersion)
2852 {
2853 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2854 "%s : Not valid NV Version %d", __func__, nvVersion);
2855 return -EINVAL;
2856 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002857
2858 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2859 (0 == pHddCtx->ftm.processedNVTableSize))
2860 {
2861 if ( msgId == PTT_MSG_GET_NV_BIN )
2862 {
2863 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2864 }
2865 else
2866 {
2867 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2868 }
2869
2870 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2871 {
c_hpothuffdb5272013-10-02 16:42:35 +05302872 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2873 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002874 return -EIO;
2875 }
2876
2877 switch (nvTable->nvTable)
2878 {
2879 case NV_BINARY_IMAGE:
2880 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2881 break;
2882 default:
2883 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2884 "Not Valid NV Table %d", nvTable->nvTable);
2885 return -EIO;
2886 break;
2887 }
2888
2889 /* Set Current Processing NV table type */
2890 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2891 if ( msgId == PTT_MSG_GET_NV_BIN )
2892 {
2893 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2894 /* Validity Period */
2895 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2896 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2897 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2898 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2899 offset = sizeof(v_U32_t);
2900 }
2901 else
2902 {
2903 pHddCtx->ftm.targetNVTableSize = nvSize;
2904 offset = 0;
2905 }
2906
2907 /* Copy target NV table value into temp context buffer */
2908 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2909 pHddCtx->ftm.targetNVTablePointer,
2910 pHddCtx->ftm.targetNVTableSize);
2911 }
2912
2913
2914 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2915 {
2916 /* Invalid table type */
2917 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2918 "Invalid NV Table, now Processing %d, not %d",
2919 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2920
2921 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2922 pHddCtx->ftm.targetNVTableSize = 0;
2923 pHddCtx->ftm.processedNVTableSize = 0;
2924 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2925
2926 return -EINVAL;
2927 }
2928
2929 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2930
2931 /* Update processed pointer to prepare next chunk copy */
2932 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2933 pHddCtx->ftm.targetNVTableSize )
2934 {
2935 nvTable->chunkSize =
2936 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2937 }
2938
2939 /* Copy next chunk of NV table value into response buffer */
2940 vos_mem_copy(
2941 &nvTable->tableData,
2942 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2943 nvTable->chunkSize);
2944
2945 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2946
2947 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2948 {
2949 /* Finished to process last chunk of data, initialize buffer */
2950 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2951 pHddCtx->ftm.targetNVTableSize = 0;
2952 pHddCtx->ftm.processedNVTableSize = 0;
2953 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2954 }
2955
2956 return 1;
2957}
2958
2959/**---------------------------------------------------------------------------
2960
2961 \brief wlan_hdd_ftm_set_nv_bin() -
2962 Set NV bin to Flash Memory, file
2963
2964 \param - ftmCmd - Pointer FTM Commad Buffer
2965
2966 \return - int
2967 -1, Process Host command fail, vail out
2968 0, Process Host command success
2969
2970+----------------------------------------------------------------------------*/
2971
2972static int wlan_hdd_ftm_set_nv_bin
2973(
2974 hdd_context_t *pHddCtx,
2975 tPttMsgbuffer *ftmCmd
2976)
2977{
2978 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2979 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002980 eNvVersionType nvVersion;
2981
2982 nvVersion = vos_nv_getNvVersion();
2983 if (E_NV_V3 != nvVersion)
2984 {
2985 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2986 "%s : Not valid NV Version %d", __func__, nvVersion);
2987 return -EINVAL;
2988 }
2989
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002990
2991 /* Test first chunk of NV table */
2992 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2993 (0 == pHddCtx->ftm.processedNVTableSize))
2994 {
2995 switch (nvTable->nvTable)
2996 {
2997 case NV_BINARY_IMAGE:
2998 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2999 break;
3000 default:
3001 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3002 "Not Valid NV Table %d", nvTable->nvTable);
3003 return -EIO;
3004 break;
3005 }
3006
3007 /* Set Current Processing NV table type */
3008 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
3009 pHddCtx->ftm.processedNVTableSize = 0;
3010
3011 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
3012 {
3013 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3014 "Invalid Table Size %d", nvTable->tableSize);
3015 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3016 pHddCtx->ftm.targetNVTableSize = 0;
3017 pHddCtx->ftm.processedNVTableSize = 0;
3018 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3019 return -EINVAL;
3020 }
3021 }
3022
3023 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3024 {
3025 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3026 "Invalid NV Table, now Processing %d, not %d",
3027 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3028 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3029 pHddCtx->ftm.targetNVTableSize = 0;
3030 pHddCtx->ftm.processedNVTableSize = 0;
3031 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3032 return -EINVAL;
3033 }
3034
3035 vos_mem_copy(
3036 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3037 &nvTable->tableData,
3038 nvTable->chunkSize);
3039
3040 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3041
3042 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3043 {
3044 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3045 "Processing Done!! write encoded Buffer %d",
3046 pHddCtx->ftm.targetNVTableSize);
3047
3048 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3049 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3050
3051 if ((VOS_STATUS_SUCCESS != nvStatus))
3052 {
3053 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3054 "Fail to set NV Binary %d", nvStatus);
3055 return -EIO;
3056 }
3057
3058 nvStatus = vos_nv_setNVEncodedBuffer(
3059 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3060 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3061
3062 if ((VOS_STATUS_SUCCESS != nvStatus))
3063 {
3064 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3065 "Fail to set NV Binary %d", nvStatus);
3066 return -EIO;
3067 }
3068
3069 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3070 pHddCtx->ftm.targetNVTableSize = 0;
3071 pHddCtx->ftm.processedNVTableSize = 0;
3072 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3073 }
3074
3075 return 1;
3076}
3077
Jeff Johnson295189b2012-06-20 16:38:30 -07003078/**---------------------------------------------------------------------------
3079
3080 \brief wlan_hdd_ftm_temp_get_rel_num() -
3081 Get internal release number
3082
3083 \param - ftmCmd - Pointer FTM Commad Buffer
3084
3085 \return - int
3086 -1, Process Host command fail, vail out
3087 0, Process Host command success
3088
3089 --------------------------------------------------------------------------*/
3090int wlan_hdd_ftm_temp_get_rel_num
3091(
3092 tPttMsgbuffer *ftmCmd
3093)
3094{
3095 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3096
3097 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3098 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3099 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3100 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3101 relNum->relParams.pttMax = 10;
3102 relNum->relParams.pttMin = 1;
3103
3104 return 1;
3105}
3106
3107/**---------------------------------------------------------------------------
3108
3109 \brief wlan_hdd_process_ftm_host_cmd() -
3110 process any command should be handled within host.
3111 decide any command should be send to HAL or not
3112
3113 \param - ftmCmd - Pointer FTM Commad Buffer
3114
3115 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003116 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003117 0, Process Host command success, not need to send CMD to HAL
3118 1, Process Host command success, need to send CMD to HAL
3119
3120 --------------------------------------------------------------------------*/
3121int wlan_hdd_process_ftm_host_cmd
3122(
3123 hdd_context_t *pHddCtx,
3124 void *ftmCmd
3125)
3126{
3127 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3128 int needToRouteHal = 1;
3129 int hostState = 1;
3130
3131 switch(pFTMCmd->msgId)
3132 {
3133 case PTT_MSG_GET_NV_TABLE:
3134 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3135 needToRouteHal = 0;
3136 break;
3137
3138 case PTT_MSG_SET_NV_TABLE:
3139 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3140 /* Temp NV Operation will be isolated to host
3141 needToRouteHal = 1; */
3142 needToRouteHal = 0;
3143 break;
3144
3145 case PTT_MSG_BLANK_NV:
3146 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3147 needToRouteHal = 1;
3148 break;
3149
3150 case PTT_MSG_DEL_NV_TABLE:
3151 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3152 needToRouteHal = 1;
3153 break;
3154
3155 case PTT_MSG_GET_NV_FIELD:
3156 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3157 needToRouteHal = 0;
3158 break;
3159
3160 case PTT_MSG_SET_NV_FIELD:
3161 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3162 needToRouteHal = 0;
3163 break;
3164
3165 case PTT_MSG_STORE_NV_TABLE:
3166 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3167 needToRouteHal = 0;
3168 break;
3169
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003170 case PTT_MSG_GET_NV_BIN:
3171 case PTT_MSG_GET_DICTIONARY:
3172 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3173 needToRouteHal = 0;
3174 break;
3175
3176 case PTT_MSG_SET_NV_BIN:
3177 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3178 needToRouteHal = 0;
3179 break;
3180
Jeff Johnson295189b2012-06-20 16:38:30 -07003181 case PTT_MSG_DBG_READ_REGISTER:
3182 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3183 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3184 needToRouteHal = 0;
3185 break;
3186
3187 case PTT_MSG_DBG_WRITE_REGISTER:
3188 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3189 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3190 needToRouteHal = 0;
3191 break;
3192
3193 case PTT_MSG_DBG_READ_MEMORY:
3194 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3195 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3196 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3197 needToRouteHal = 0;
3198 break;
3199
3200 case PTT_MSG_DBG_WRITE_MEMORY:
3201 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3202 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3203 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3204 needToRouteHal = 0;
3205 break;
3206
3207 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3208 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3209 needToRouteHal = 0;
3210 break;
3211
3212 default:
3213 needToRouteHal = 1;
3214 break;
3215 }
3216
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003217 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003218 {
3219 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3220 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003221 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003222 }
3223
3224 return needToRouteHal;
3225}
Jeff Johnson295189b2012-06-20 16:38:30 -07003226
3227/**---------------------------------------------------------------------------
3228
3229 \brief wlan_hdd_process_ftm_cmd() -
3230
3231 This function process the commands received from the ptt socket application.
3232
3233 \param - pAdapter - Pointer HDD Context.
3234
3235 \param - wnl - Pointer to the ANI netlink header.
3236
3237 \return - none
3238
3239 --------------------------------------------------------------------------*/
3240
3241void wlan_hdd_process_ftm_cmd
3242(
3243 hdd_context_t *pHddCtx,
3244 tAniNlHdr *wnl
3245)
3246{
3247 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3248 v_U16_t cmd_len;
3249 v_U8_t *pftm_data;
3250 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003251 int hostState;
3252 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003253
3254 ENTER();
3255
Jeff Johnsone7245742012-09-05 17:12:55 -07003256 //Delay to fix NV write failure on JB
3257 vos_busy_wait(10000); //10ms
3258
Jeff Johnson295189b2012-06-20 16:38:30 -07003259 if (!pRequestBuf) {
3260
Arif Hussain6d2a3322013-11-17 19:50:10 -08003261 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003262 return ;
3263 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303264
3265 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3266 {
3267 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3268 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3269 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3270 return ;
3271 }
3272
Jeff Johnson295189b2012-06-20 16:38:30 -07003273 /*Save the received request*/
3274 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3275
3276 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3277 /*Save the received request netlink header used for sending the response*/
3278 pHddCtx->ftm.wnl = wnl;
3279 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3280
Arif Hussain6d2a3322013-11-17 19:50:10 -08003281 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003282
3283 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3284 wlan_ftm_send_response(pHddCtx);
3285 return ;
3286 }
3287
3288 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3289 {
3290 case WLAN_FTM_START:
3291 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3292
Arif Hussain6d2a3322013-11-17 19:50:10 -08003293 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003294 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3295 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3296 wlan_ftm_send_response(pHddCtx);
3297 return;
3298 }
3299
3300 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3301 {
3302 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3303 ,__func__);
3304 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3305 wlan_ftm_send_response(pHddCtx);
3306 return;
3307 }
3308 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3309 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3310 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3311 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3312
3313 wlan_ftm_send_response(pHddCtx);
3314
3315 break;
3316
3317 case WLAN_FTM_STOP:
3318 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3319
Arif Hussain6d2a3322013-11-17 19:50:10 -08003320 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003321 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3322 wlan_ftm_send_response(pHddCtx);
3323 return;
3324 }
3325
3326 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3327
3328 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3329 wlan_ftm_send_response(pHddCtx);
3330 return;
3331 }
3332
3333 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3334 /* This would send back the Command Success Status */
3335 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3336
3337 wlan_ftm_send_response(pHddCtx);
3338
3339 break;
3340
3341 case WLAN_FTM_CMD:
3342 /* if it is regular FTM command, pass it to HAL PHY */
3343 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003344 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003345 return;
3346 }
3347 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3348
Arif Hussain6d2a3322013-11-17 19:50:10 -08003349 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003350
3351 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3352 wlan_ftm_send_response(pHddCtx);
3353 return;
3354
3355 }
3356 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3357 cmd_len = pRequestBuf->ftm_hdr.data_len;
3358 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3359 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3360
Jeff Johnson295189b2012-06-20 16:38:30 -07003361 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3362 if (0 == hostState)
3363 {
3364 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3365 if (NULL == tempRspBuffer)
3366 {
3367 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003368 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003369 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3370 wlan_ftm_send_response(pHddCtx);
3371 return;
3372 }
3373 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3374 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3375 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3376 (unsigned char *) tempRspBuffer,
3377 tempRspBuffer->msgBodyLength);
3378 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3379 wlan_ftm_send_response(pHddCtx);
3380 vos_mem_free(tempRspBuffer);
3381 return;
3382 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003383 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003384 {
3385 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3386 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3387 wlan_ftm_send_response(pHddCtx);
3388 return;
3389 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003390
3391 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3392
Jeff Johnson295189b2012-06-20 16:38:30 -07003393
3394 /*Post the command to the HAL*/
3395 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3396
Arif Hussain6d2a3322013-11-17 19:50:10 -08003397 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003398 return;
3399
3400 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303401 /*After successful posting of message the command should be pending*/
3402 pHddCtx->ftm.IsCmdPending = TRUE;
3403
Jeff Johnson295189b2012-06-20 16:38:30 -07003404 /*Wait here until you get the response from HAL*/
3405 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3406 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303407 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3408 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3409 wlan_ftm_send_response(pHddCtx);
3410 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003411 return;
3412 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303413 /*This check will handle the case where the completion is sent by
3414 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3415 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3416 {
3417 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3418 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3419 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3420
3421 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3422 wlan_ftm_send_response(pHddCtx);
3423 pHddCtx->ftm.IsCmdPending = FALSE;
3424 return ;
3425 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003426
3427 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3428
3429 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3430
3431 wlan_ftm_send_response(pHddCtx);
3432 pHddCtx->ftm.IsCmdPending = FALSE;
3433 break;
3434
3435 default:
3436
Arif Hussain6d2a3322013-11-17 19:50:10 -08003437 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003438 return;
3439 }
3440
3441 EXIT();
3442 return;
3443} /* wlan_adp_ftm_cmd() */
3444
3445/**---------------------------------------------------------------------------
3446
3447 \brief wlan_ftm_priv_start_stop_ftm() -
3448
3449 This function is used for start/stop the ftm driver.
3450
3451 \param - pAdapter - Pointer HDD Context.
3452 - start - 1/0 to start/stop ftm driver.
3453
3454 \return - 0 for success, non zero for failure
3455
3456 --------------------------------------------------------------------------*/
3457
3458static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3459 v_U16_t start)
3460{
3461 VOS_STATUS status;
3462 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3463
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003464 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003465 {
3466 pHddCtx->ftm.cmd_iwpriv = TRUE;
3467 status = wlan_hdd_ftm_start(pHddCtx);
3468
3469 if (status != VOS_STATUS_SUCCESS)
3470 {
3471 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3472 "FTM Start Failed");
3473 return VOS_STATUS_E_FAILURE;
3474 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303475 if (NULL == pMsgBuf)
3476 {
3477 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3478 if (NULL == pMsgBuf)
3479 {
3480 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3481 "%s:pMsgBuf is NULL", __func__);
3482 return VOS_STATUS_E_FAILURE;
3483 }
3484 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003485 }
3486 else
3487 {
3488 status = wlan_ftm_stop(pHddCtx);
3489
3490 if (status != VOS_STATUS_SUCCESS)
3491 {
3492 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3493 "FTM Stop Failed");
3494 return VOS_STATUS_E_FAILURE;
3495 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303496 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3497 if (pMsgBuf)
3498 {
3499 vos_mem_free((v_VOID_t * )pMsgBuf);
3500 pMsgBuf = NULL;
3501 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003502 }
3503 return VOS_STATUS_SUCCESS;
3504}
3505
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303506
3507static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3508{
3509 unsigned int *table = NULL;
3510 int index = 0;
3511
3512 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3513 table = valid_channel;
3514 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3515 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3516 table = valid_channel_cb40;
3517 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3518 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3519 table = valid_channel_cb80;
3520
3521 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303522 {
3523 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3524 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303525 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303526 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303527
3528 while (table[index] != 0)
3529 {
3530 if (table[index] == channel)
3531 return VOS_STATUS_SUCCESS;
3532
3533 index++;
3534 }
3535
3536 return VOS_STATUS_E_FAILURE;
3537}
3538
3539
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303540static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3541{
3542 unsigned int primary_channel = center_channel;
3543
3544 if (center_channel <= 14)
3545 return primary_channel ;
3546
3547 switch (cb)
3548 {
3549 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3550 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3551 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3552 primary_channel -= 2;
3553 break;
3554
3555
3556 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3557 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3558 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3559 primary_channel += 2;
3560 break;
3561
3562 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3563 primary_channel -= 6;
3564 break;
3565
3566 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3567 primary_channel += 6;
3568 break;
3569 }
3570
3571 return primary_channel;
3572
3573}
3574
Jeff Johnson295189b2012-06-20 16:38:30 -07003575/**---------------------------------------------------------------------------
3576
3577 \brief wlan_ftm_priv_set_channel() -
3578
3579 This function is used for setting the channel to the halphy ptt module.
3580
3581 \param - pAdapter - Pointer HDD Context.
3582 - channel - Channel Number 1-14.
3583
3584 \return - 0 for success, non zero for failure
3585
3586 --------------------------------------------------------------------------*/
3587
3588static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3589{
Jeff Johnson295189b2012-06-20 16:38:30 -07003590 uPttMsgs *pMsgBody;
3591 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303592 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003593 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3594
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303595 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003596 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303597 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3598 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003599 return VOS_STATUS_E_FAILURE;
3600 }
3601
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303602 if (NULL == pMsgBuf)
3603 {
3604 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3605 "%s:pMsgBuf is NULL", __func__);
3606 return VOS_STATUS_E_NOMEM;
3607 }
3608
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303609 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003610 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303611 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3612 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003613 return VOS_STATUS_E_FAILURE;
3614 }
3615
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303616 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003617 init_completion(&pHddCtx->ftm.ftm_comp_var);
3618 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3619 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3620
3621 pMsgBody = &pMsgBuf->msgBody;
3622
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303623 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003624
Arif Hussain6d2a3322013-11-17 19:50:10 -08003625 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303626 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003627
3628 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3629
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303630 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003631 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303632 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3633 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003634 status = VOS_STATUS_E_FAILURE;
3635 goto done;
3636
3637 }
c_hpothuffdb5272013-10-02 16:42:35 +05303638 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303639 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303640 if (0 >= ret )
3641 {
3642 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3643 FL("wait on ftm_comp_var failed %ld"), ret);
3644 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003645
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303646 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003647 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303648 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3649 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003650 status = VOS_STATUS_E_FAILURE;
3651 goto done;
3652
3653 }
3654done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003655
3656 return status;
3657}
3658
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303659
3660/**---------------------------------------------------------------------------
3661
3662 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3663
3664 This function is used for setting the power control mode for tx.
3665
3666 \param - pAdapter - Pointer HDD Context.
3667 - pwr_mode - power control mode 0-2.
3668
3669 \return - 0 for success, non zero for failure
3670
3671 --------------------------------------------------------------------------*/
3672
3673static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3674 v_U16_t pwr_mode)
3675{
3676 uPttMsgs *pMsgBody;
3677 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303678 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303679 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3680
3681 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3682 {
3683 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3684 "%s:Ftm has not started. Please start the ftm. ", __func__);
3685 return VOS_STATUS_E_FAILURE;
3686 }
3687
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303688 if (NULL == pMsgBuf)
3689 {
3690 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3691 "%s:pMsgBuf is NULL", __func__);
3692 return VOS_STATUS_E_NOMEM;
3693 }
3694
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303695 if (pwr_mode > 2)
3696 {
3697 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3698 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3699 return VOS_STATUS_E_FAILURE;
3700 }
3701
3702 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3703 init_completion(&pHddCtx->ftm.ftm_comp_var);
3704 pMsgBody = &pMsgBuf->msgBody;
3705 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3706 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3707
3708 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3709 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3710
3711 if (status != VOS_STATUS_SUCCESS)
3712 {
3713 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3714 "%s:wlan_ftm_postmsg failed", __func__);
3715 status = VOS_STATUS_E_FAILURE;
3716 goto done;
3717 }
c_hpothuffdb5272013-10-02 16:42:35 +05303718 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303719 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303720 if (0 >= ret )
3721 {
3722 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3723 FL("wait on ftm_comp_var failed %ld"), ret);
3724 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303725
3726 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3727 {
3728 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3729 "%s:Ptt response status failed", __func__);
3730 status = VOS_STATUS_E_FAILURE;
3731 goto done;
3732 }
3733
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303734 ftm_status.powerCtlMode= pwr_mode;
3735
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303736 done:
3737 return status;
3738
3739}
3740
Jeff Johnson295189b2012-06-20 16:38:30 -07003741/**---------------------------------------------------------------------------
3742
3743 \brief wlan_ftm_priv_set_txpower() -
3744
3745 This function is used for setting the txpower to the halphy ptt module.
3746
3747 \param - pAdapter - Pointer HDD Context.
3748 - txpower - txpower Number 1-18.
3749
3750 \return - 0 for success, non zero for failure
3751
3752 --------------------------------------------------------------------------*/
3753
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303754static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3755 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003756{
Jeff Johnson295189b2012-06-20 16:38:30 -07003757 uPttMsgs *pMsgBody;
3758 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303759 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003760 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3761
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303762 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003763 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303764 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3765 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003766 return VOS_STATUS_E_FAILURE;
3767 }
3768
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303769 if (NULL == pMsgBuf)
3770 {
3771 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3772 "%s:pMsgBuf is NULL", __func__);
3773 return VOS_STATUS_E_NOMEM;
3774 }
3775
Jeff Johnson295189b2012-06-20 16:38:30 -07003776 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3777 * when tx pktgen is enabled
3778 */
3779 if (ftm_status.frameGenEnabled)
3780 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303781 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3782 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003783 return VOS_STATUS_E_FAILURE;
3784 }
3785
3786 if(!(txpower >= 9 && txpower <= 24))
3787 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303788 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3789 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003790 return VOS_STATUS_E_FAILURE;
3791 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003792
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303793 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3794 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003795 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003796 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3797 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3798
3799 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3800
3801 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3802
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303803 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003804 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303805 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3806 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003807 status = VOS_STATUS_E_FAILURE;
3808 goto done;
3809 }
c_hpothuffdb5272013-10-02 16:42:35 +05303810 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303811 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303812 if (0 >= ret )
3813 {
3814 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3815 FL("wait on ftm_comp_var failed %ld"), ret);
3816 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003817
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303818 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003819 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303820 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3821 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003822 status = VOS_STATUS_E_FAILURE;
3823 goto done;
3824 }
3825
Jeff Johnson295189b2012-06-20 16:38:30 -07003826 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003827
3828 return status;
3829
3830}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303831
3832
3833static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3834 v_U16_t enable)
3835{
3836 tANI_U32 value = 0;
3837 tANI_U32 reg_addr;
3838 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303839
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303840 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3841 {
3842 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3843 "%s:Ftm has not started. Please start the ftm. ", __func__);
3844 return VOS_STATUS_E_FAILURE;
3845 }
3846
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303847 reg_addr = WCNSS_TXFIR_OFFSET;
3848
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303849 wpalReadRegister(reg_addr, &value);
3850 if (enable)
3851 {
3852 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3853 }
3854 else
3855 {
3856 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3857 }
3858
3859 wpalWriteRegister(reg_addr, value);
3860
3861 return VOS_STATUS_SUCCESS;
3862}
3863
3864
Jeff Johnson295189b2012-06-20 16:38:30 -07003865/**---------------------------------------------------------------------------
3866
3867 \brief wlan_ftm_priv_set_txrate() -
3868
3869 This function is used for setting the txrate to the halphy ptt module.
3870 It converts the user input string for txrate to the tx rate index.
3871
3872 \param - pAdapter - Pointer HDD Context.
3873 - txrate - Pointer to the tx rate string.
3874
3875 \return - 0 for success, non zero for failure
3876
3877 --------------------------------------------------------------------------*/
3878
3879static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3880{
3881 int ii;
3882 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3883 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3884 {
3885 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3886 return VOS_STATUS_E_FAILURE;
3887 }
3888
3889 /* do not allow to change setting when tx pktgen is enabled */
3890 if (ftm_status.frameGenEnabled)
3891 {
3892 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3893 return VOS_STATUS_E_FAILURE;
3894 }
3895
3896 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3897 {
3898 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3899 break;
3900 }
3901 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3902 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003903 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003904 return VOS_STATUS_E_FAILURE;
3905 }
3906
3907 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3908 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3909
3910 return VOS_STATUS_SUCCESS;
3911}
3912
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303913
3914
3915static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3916 ePowerTempIndexSource pwr_source)
3917{
3918 uPttMsgs *pMsgBody;
3919 VOS_STATUS status;
3920 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3921
3922 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3923 {
3924 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3925 "%s:Ftm has not started. Please start the ftm. ", __func__);
3926 return VOS_STATUS_E_FAILURE;
3927 }
3928
3929 if (pwr_source > 3)
3930 {
3931 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3932 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3933 __func__);
3934 return VOS_STATUS_E_FAILURE;
3935 }
3936
3937 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3938
3939 init_completion(&pHddCtx->ftm.ftm_comp_var);
3940 pMsgBody = &pMsgBuf->msgBody;
3941 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3942 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3943
3944 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3945 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3946
3947 if (status != VOS_STATUS_SUCCESS)
3948 {
3949 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3950 "%s:wlan_ftm_postmsg failed", __func__);
3951 status = VOS_STATUS_E_FAILURE;
3952 goto done;
3953 }
3954 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3955 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3956
3957 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3958 {
3959 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3960 "%s:Ptt response status failed", __func__);
3961 status = VOS_STATUS_E_FAILURE;
3962 goto done;
3963 }
3964
3965done:
3966
3967 return status;
3968}
3969
3970
Jeff Johnson295189b2012-06-20 16:38:30 -07003971/**---------------------------------------------------------------------------
3972
3973 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3974
3975 This function is used for start/stop the tx packet generation.
3976
3977 \param - pAdapter - Pointer HDD Context.
3978 - startStop - Value( 1/0) start/stop the tx packet generation.
3979
3980 \return - 0 for success, non zero for failure
3981
3982 --------------------------------------------------------------------------*/
3983
3984static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3985{
Jeff Johnson295189b2012-06-20 16:38:30 -07003986 uPttMsgs *pMsgBody;
3987 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303988 long ret;
3989
Jeff Johnson295189b2012-06-20 16:38:30 -07003990 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3991
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303992 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003993 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303994 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3995 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003996 return VOS_STATUS_E_FAILURE;
3997 }
3998
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303999 if (NULL == pMsgBuf)
4000 {
4001 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4002 "%s:pMsgBuf is NULL", __func__);
4003 return VOS_STATUS_E_NOMEM;
4004 }
4005
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304006 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07004007 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304008 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4009 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004010 return VOS_STATUS_E_FAILURE;
4011 }
4012
4013 if ((ftm_status.frameGenEnabled && startStop == 1) ||
4014 (!ftm_status.frameGenEnabled && startStop == 0))
4015 {
4016 return VOS_STATUS_SUCCESS ;
4017 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304018 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004019
Jeff Johnson295189b2012-06-20 16:38:30 -07004020 if (startStop == 1)
4021 {
4022 init_completion(&pHddCtx->ftm.ftm_comp_var);
4023 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4024 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4025 pMsgBody = &pMsgBuf->msgBody;
4026 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4027
4028 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304029 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004030 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304031 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4032 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004033 status = VOS_STATUS_E_FAILURE;
4034 goto done;
4035 }
4036
c_hpothuffdb5272013-10-02 16:42:35 +05304037 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304038 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304039 if (0 >= ret )
4040 {
4041 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4042 FL("wait on ftm_comp_var failed %ld"), ret);
4043 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304044 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004045 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304046 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4047 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004048 status = VOS_STATUS_E_FAILURE;
4049 goto done;
4050 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304051
4052 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4053 {
4054 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4055 if(status != VOS_STATUS_SUCCESS)
4056 {
4057 goto done;
4058 }
4059 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004060 }
4061
4062 init_completion(&pHddCtx->ftm.ftm_comp_var);
4063 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4064 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4065 pMsgBody = &pMsgBuf->msgBody;
4066 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4067
4068 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4069 if(status != VOS_STATUS_SUCCESS)
4070 {
4071 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4072 status = VOS_STATUS_E_FAILURE;
4073 goto done;
4074 }
4075
c_hpothuffdb5272013-10-02 16:42:35 +05304076 ret = wait_for_completion_interruptible_timeout(
4077 &pHddCtx->ftm.ftm_comp_var,
4078 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4079 if (0 >= ret )
4080 {
4081 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4082 FL("wait on ftm_comp_var failed %ld"), ret);
4083 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004084 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4085 {
4086 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4087 status = VOS_STATUS_E_FAILURE;
4088 goto done;
4089 }
4090
4091done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004092
4093 if (status == VOS_STATUS_SUCCESS)
4094 {
4095 if (startStop == 1)
4096 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304097 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004098 }
4099 else
4100 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304101 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004102 }
4103 }
4104
4105 return status;
4106}
4107
4108
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304109
4110static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4111{
4112
4113 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4114 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4115 {
4116 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4117 "%s:Ftm has not started. Please start the ftm. ", __func__);
4118 return VOS_STATUS_E_FAILURE;
4119 }
4120
4121 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4122 {
4123 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4124 "%s:cb mode value is invalid ", __func__);
4125 return VOS_STATUS_E_FAILURE;
4126 }
4127
4128 ftm_status.cbmode = cbmode;
4129
4130 return VOS_STATUS_SUCCESS;
4131
4132}
4133
Jeff Johnson295189b2012-06-20 16:38:30 -07004134/**---------------------------------------------------------------------------
4135
4136 \brief wlan_ftm_rx_mode() -
4137
4138 This function is used for start/stop the rx packet generation.
4139
4140 \param - pAdapter - Pointer HDD Context.
4141 - rxmode - 0-disable RX.
4142 - 1-rx ALL frames
4143 - 2-rx 11 g/n frames
4144 - 3-rx 11b frames
4145
4146 \return - 0 for success, non zero for failure
4147
4148 --------------------------------------------------------------------------*/
4149
4150static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4151{
Jeff Johnson295189b2012-06-20 16:38:30 -07004152 uPttMsgs *pMsgBody;
4153 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304154 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004155
4156 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304157 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004158 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304159 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4160 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004161 return VOS_STATUS_E_FAILURE;
4162 }
4163
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304164 if (NULL == pMsgBuf)
4165 {
4166 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4167 "%s:pMsgBuf is NULL", __func__);
4168 return VOS_STATUS_E_NOMEM;
4169 }
4170
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304171 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004172 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304173 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4174 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004175 return VOS_STATUS_E_FAILURE;
4176 }
4177
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304178 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004179 init_completion(&pHddCtx->ftm.ftm_comp_var);
4180
4181 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4182 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4183
4184 pMsgBody = &pMsgBuf->msgBody;
4185
4186 switch(rxmode)
4187 {
4188 case RXMODE_DISABLE_ALL:
4189 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4190 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4191 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4192 break;
4193
4194 case RXMODE_ENABLE_ALL:
4195 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4196 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4197 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4198 break;
4199
4200 case RXMODE_ENABLE_11GN:
4201 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4202 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4203 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4204 break;
4205
4206 case RXMODE_ENABLE_11B:
4207 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4208 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4209 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4210 break;
4211
4212 }
4213
4214 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4215
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304216 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004217 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304218 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4219 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004220 status = VOS_STATUS_E_FAILURE;
4221 goto done;
4222 }
c_hpothuffdb5272013-10-02 16:42:35 +05304223 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304224 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304225 if (0 >= ret )
4226 {
4227 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4228 FL(" wait on ftm_comp_var failed %ld"), ret);
4229 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004230
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304231 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004232 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304233 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4234 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004235 status = VOS_STATUS_E_FAILURE;
4236 goto done;
4237 }
4238 ftm_status.rxmode = rxmode ;
4239done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004240
4241 return status;
4242}
4243
4244/**---------------------------------------------------------------------------
4245
4246 \brief wlan_ftm_priv_rx_pkt_clear() -
4247
4248 This function sets the rx pkt count to zero.
4249
4250 \param - pAdapter - Pointer HDD Context.
4251 - rx_pkt_clear - rx_pkt_clear value.
4252
4253 \return - 0 for success, non zero for failure
4254
4255 --------------------------------------------------------------------------*/
4256
4257static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4258{
Jeff Johnson295189b2012-06-20 16:38:30 -07004259 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304260 long ret;
4261
Jeff Johnson295189b2012-06-20 16:38:30 -07004262 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4263
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304264 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004265 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304266 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4267 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004268 return VOS_STATUS_E_FAILURE;
4269 }
4270
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304271 if (NULL == pMsgBuf)
4272 {
4273 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4274 "%s:pMsgBuf is NULL", __func__);
4275 return VOS_STATUS_E_NOMEM;
4276 }
4277
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304278 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004279 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304280 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4281 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004282 return VOS_STATUS_E_FAILURE;
4283 }
4284
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304285 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004286 init_completion(&pHddCtx->ftm.ftm_comp_var);
4287 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304288 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004289
Jeff Johnson295189b2012-06-20 16:38:30 -07004290 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4291
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304292 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004293 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304294 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4295 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004296 status = VOS_STATUS_E_FAILURE;
4297 goto done;
4298 }
c_hpothuffdb5272013-10-02 16:42:35 +05304299 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304300 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304301 if (0 >= ret )
4302 {
4303 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4304 FL("wait on ftm_comp_var failed %ld"), ret);
4305 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004306
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304307 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004308 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304309 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4310 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004311 status = VOS_STATUS_E_FAILURE;
4312 goto done;
4313 }
4314done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004315
4316 return status;
4317}
4318
4319/**---------------------------------------------------------------------------
4320
4321 \brief wlan_ftm_priv_get_channel() -
4322
4323 This function gets the channel number from the halphy ptt module and
4324 returns the channel number to the application.
4325
4326 \param - pAdapter - Pointer HDD Context.
4327 - pChannel - Poniter to get the Channel number.
4328
4329 \return - 0 for success, non zero for failure
4330
4331 --------------------------------------------------------------------------*/
4332
4333static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4334{
Jeff Johnson295189b2012-06-20 16:38:30 -07004335 uPttMsgs *pMsgBody;
4336 VOS_STATUS status;
4337 v_U16_t freq;
4338 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304339 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004340
4341 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304342 v_PVOID_t devHandle = pHddCtx->parent_dev;
4343 struct device *wcnss_device = (struct device *)devHandle;
4344 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304345 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004346 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304347 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4348 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004349 return VOS_STATUS_E_FAILURE;
4350 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304351
4352 if (NULL == pMsgBuf)
4353 {
4354 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4355 "%s:pMsgBuf is NULL", __func__);
4356 return VOS_STATUS_E_NOMEM;
4357 }
4358
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304359 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004360 init_completion(&pHddCtx->ftm.ftm_comp_var);
4361 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4362 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4363
4364 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304365 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4366 if (NULL == wcnss_memory)
4367 {
4368 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4369 "%s: wcnss_memory is NULL", __func__);
4370 return VOS_STATUS_E_NOMEM;
4371 }
4372 else
4373 {
4374 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4375 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4376 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004377 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4378
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304379 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004380 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304381 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4382 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004383 status = VOS_STATUS_E_FAILURE;
4384 goto done;
4385
4386 }
c_hpothuffdb5272013-10-02 16:42:35 +05304387 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304388 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304389 if (0 >= ret )
4390 {
4391 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4392 FL("wait on ftm_comp_var failed %ld"), ret);
4393 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004394
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304395 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004396 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304397 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4398 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004399 status = VOS_STATUS_E_FAILURE;
4400 goto done;
4401 }
4402
4403 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4404
4405 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4406 indx++;
4407 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4408 {
4409 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4410 status = VOS_STATUS_E_FAILURE;
4411 goto done;
4412 }
4413
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004414 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004415
Arif Hussain6d2a3322013-11-17 19:50:10 -08004416 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004417 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004418
4419 return status;
4420}
4421
4422/**---------------------------------------------------------------------------
4423
4424 \brief wlan_ftm_priv_get_txpower() -
4425
4426 This function gets the TX power from the halphy ptt module and
4427 returns the TX power to the application.
4428
4429 \param - pAdapter - Pointer HDD Context.
4430 - pTxPwr - Poniter to get the Tx power.
4431
4432 \return - 0 for success, non zero for failure
4433
4434 --------------------------------------------------------------------------*/
4435
4436static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4437{
Jeff Johnson295189b2012-06-20 16:38:30 -07004438 uPttMsgs *pMsgBody;
4439 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304440 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004441 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4442
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304443 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004444 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304445 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4446 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004447 return VOS_STATUS_E_FAILURE;
4448 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304449
4450 if (NULL == pMsgBuf)
4451 {
4452 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4453 "%s:pMsgBuf is NULL", __func__);
4454 return VOS_STATUS_E_NOMEM;
4455 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304456 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 init_completion(&pHddCtx->ftm.ftm_comp_var);
4458 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4459 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4460
4461 pMsgBody = &pMsgBuf->msgBody;
4462
4463 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4464
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304465 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004466 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304467 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4468 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004469 status = VOS_STATUS_E_FAILURE;
4470 goto done;
4471 }
c_hpothuffdb5272013-10-02 16:42:35 +05304472 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304473 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304474 if (0 >= ret )
4475 {
4476 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4477 FL("wait on ftm_comp_var failed %ld"), ret);
4478 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004479
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304480 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004481 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304482 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4483 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004484 status = VOS_STATUS_E_FAILURE;
4485 goto done;
4486 }
4487 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4488
4489 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004490
4491 return status;
4492}
4493
4494/**---------------------------------------------------------------------------
4495
4496 \brief wlan_ftm_priv_get_ftm_version() -
4497
4498 This function gets ftm driver and firmware version.
4499
4500 \param - pAdapter - Pointer HDD Context.
4501 - pTxRate - Poniter to get the Tx rate.
4502
4503 \return - 0 for success, non zero for failure
4504
4505 --------------------------------------------------------------------------*/
4506
4507VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4508{
Jeff Johnson295189b2012-06-20 16:38:30 -07004509 uPttMsgs *pMsgBody;
4510 VOS_STATUS status;
4511 v_U32_t reg_val;
4512 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004513 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4514 int lenRes = 0;
4515 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304516 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004517
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304518 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304520 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4521 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004522 return VOS_STATUS_E_FAILURE;
4523 }
4524
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304525 if (NULL == pMsgBuf)
4526 {
4527 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4528 "%s:pMsgBuf is NULL", __func__);
4529 return VOS_STATUS_E_NOMEM;
4530 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304531 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004532 init_completion(&pHddCtx->ftm.ftm_comp_var);
4533 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4534 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4535
4536 pMsgBody = &pMsgBuf->msgBody;
4537 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4538
4539 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4540
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304541 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004542 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304543 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4544 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004545 status = VOS_STATUS_E_FAILURE;
4546 goto done;
4547
4548 }
c_hpothuffdb5272013-10-02 16:42:35 +05304549 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304550 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304551 if (0 >= ret )
4552 {
4553 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4554 FL("wait on ftm_comp_var failed %ld"), ret);
4555 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004556
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304557 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004558 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304559 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4560 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004561 status = VOS_STATUS_E_FAILURE;
4562 goto done;
4563 }
4564
4565 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4566
4567 init_completion(&pHddCtx->ftm.ftm_comp_var);
4568
4569 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4570 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4571
4572 pMsgBody = &pMsgBuf->msgBody;
4573
4574 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4575
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304576 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004577 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304578 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4579 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004580 status = VOS_STATUS_E_FAILURE;
4581 goto done;
4582 }
c_hpothuffdb5272013-10-02 16:42:35 +05304583 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304584 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304585 if (0 >= ret )
4586 {
4587 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4588 FL("wait on ftm_comp_var failed %ld"), ret);
4589 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004590
4591 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4592 if(lenRes < 0 || lenRes >= lenBuf)
4593 {
4594 status = VOS_STATUS_E_FAILURE;
4595 goto done;
4596 }
4597
4598 buf += lenRes;
4599 lenBuf -= lenRes;
4600
4601 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004602 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 -07004603 if(lenRes < 0 || lenRes >= lenBuf)
4604 {
4605 status = VOS_STATUS_E_FAILURE;
4606 goto done;
4607 }
4608
4609 buf += lenRes;
4610 lenBuf -= lenRes;
4611
4612 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4613 if(lenRes < 0 || lenRes >= lenBuf)
4614 {
4615 status = VOS_STATUS_E_FAILURE;
4616 goto done;
4617 }
4618
4619 buf += lenRes;
4620 lenBuf -= lenRes;
4621
Jeff Johnson295189b2012-06-20 16:38:30 -07004622
4623done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004624
4625 return status;
4626
4627}
4628
4629/**---------------------------------------------------------------------------
4630
4631 \brief wlan_ftm_priv_get_txrate() -
4632
4633 This function gets the TX rate from the halphy ptt module and
4634 returns the TX rate to the application.
4635
4636 \param - pAdapter - Pointer HDD Context.
4637 - pTxRate - Poniter to get the Tx rate.
4638
4639 \return - 0 for success, non zero for failure
4640
4641 --------------------------------------------------------------------------*/
4642
4643static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4644{
Jeff Johnson295189b2012-06-20 16:38:30 -07004645 uPttMsgs *pMsgBody;
4646 VOS_STATUS status;
4647 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304648 long ret;
4649
Jeff Johnson295189b2012-06-20 16:38:30 -07004650 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4651
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304652 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004653 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304654 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4655 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004656 return VOS_STATUS_E_FAILURE;
4657 }
4658
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304659 if (NULL == pMsgBuf)
4660 {
4661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4662 "%s:pMsgBuf is NULL", __func__);
4663 return VOS_STATUS_E_NOMEM;
4664 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304665 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004666 init_completion(&pHddCtx->ftm.ftm_comp_var);
4667 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4668 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4669
4670 pMsgBody = &pMsgBuf->msgBody;
4671
4672 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4673
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304674 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004675 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304676 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4677 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004678 status = VOS_STATUS_E_FAILURE;
4679 goto done;
4680 }
c_hpothuffdb5272013-10-02 16:42:35 +05304681 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304682 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304683 if (0 >= ret )
4684 {
4685 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4686 FL("wait on ftm_comp_var failed %ld"), ret);
4687 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004688
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304689 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004690
4691 rate_index = pMsgBody->GetTxPowerReport.rate;
4692 }
4693 else {
4694 /*Return the default rate*/
4695 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304696 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4697 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004698 status = VOS_STATUS_E_FAILURE;
4699 goto done;
4700 }
4701
4702 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4703 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4704 break;
4705 }
4706 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4707 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004708 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004709 status = VOS_STATUS_E_FAILURE;
4710 goto done;
4711 }
4712 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4713done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004714
4715 return status;
4716
4717}
4718
4719/**---------------------------------------------------------------------------
4720
4721 \brief wlan_ftm_priv_get_rx_pkt_count() -
4722
4723 This function gets the rx pkt count from the halphy ptt module and
4724 returns the rx pkt count to the application.
4725
4726 \param - pAdapter - Pointer HDD Context.
4727 - pRxPktCnt - Poniter to get the rx pkt count.
4728
4729 \return - 0 for success, non zero for failure
4730
4731 --------------------------------------------------------------------------*/
4732
4733static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4734{
Jeff Johnson295189b2012-06-20 16:38:30 -07004735 uPttMsgs *pMsgBody;
4736 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304737 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004738 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4739
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304740 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004741 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304742 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4743 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004744 return VOS_STATUS_E_FAILURE;
4745 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304746
4747 if (NULL == pMsgBuf)
4748 {
4749 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4750 "%s:pMsgBuf is NULL", __func__);
4751 return VOS_STATUS_E_NOMEM;
4752 }
4753
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304754 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004755 init_completion(&pHddCtx->ftm.ftm_comp_var);
4756 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4757 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4758
4759 pMsgBody = &pMsgBuf->msgBody;
4760
4761 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4762
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304763 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004764 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304765 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4766 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004767 status = VOS_STATUS_E_FAILURE;
4768 goto done;
4769 }
c_hpothuffdb5272013-10-02 16:42:35 +05304770 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304771 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304772 if (0 >= ret )
4773 {
4774 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4775 FL("wait on ftm_comp_var failed %ld"), ret);
4776 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004777
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304778 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004779 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304780 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4781 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004782 status = VOS_STATUS_E_FAILURE;
4783 goto done;
4784 }
4785 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4786done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004787
4788 return status;
4789}
4790
4791/**---------------------------------------------------------------------------
4792
4793 \brief wlan_ftm_priv_get_rx_rssi() -
4794
4795 This function gets the rx rssi from the halphy ptt module and
4796 returns the rx rssi to the application.
4797
4798 \param - pAdapter - Pointer HDD Context.
4799 - buf - Poniter to get rssi of Rx chains
4800
4801 \return - 0 for success, non zero for failure
4802
4803 --------------------------------------------------------------------------*/
4804
4805static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4806{
Jeff Johnson295189b2012-06-20 16:38:30 -07004807 uPttMsgs *pMsgBody;
4808 VOS_STATUS status;
4809 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304810 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004811
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304812 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004813 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304814 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4815 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004816 return VOS_STATUS_E_FAILURE;
4817 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304818
4819 if (NULL == pMsgBuf)
4820 {
4821 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4822 "%s:pMsgBuf is NULL", __func__);
4823 return VOS_STATUS_E_NOMEM;
4824 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304825 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004826 init_completion(&pHddCtx->ftm.ftm_comp_var);
4827 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4828 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4829
4830 pMsgBody = &pMsgBuf->msgBody;
4831
4832 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4833
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304834 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004835 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304836 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4837 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004838 status = VOS_STATUS_E_FAILURE;
4839 goto done;
4840 }
c_hpothuffdb5272013-10-02 16:42:35 +05304841 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304842 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304843 if (0 >= ret )
4844 {
4845 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4846 FL("wait on ftm_comp_var failed %ld"), ret);
4847 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004848
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304849 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004850 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304851 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4852 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004853 status = VOS_STATUS_E_FAILURE;
4854 goto done;
4855 }
4856
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004857 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4858 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004859 pMsgBody->GetRxRssi.rssi.rx[1]);
4860
4861 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4862 {
4863 status = VOS_STATUS_E_FAILURE;
4864 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004865
Jeff Johnson295189b2012-06-20 16:38:30 -07004866done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004867
4868 return status;
4869}
4870
4871/**---------------------------------------------------------------------------
4872
4873 \brief wlan_ftm_priv_get_mac_address() -
4874
4875 This function gets the mac address from the halphy ptt module and
4876 returns the mac address to the application.
4877
4878 \param - pAdapter - Pointer HDD Context.
4879 - buf - Poniter to get the mac address.
4880
4881 \return - 0 for success, non zero for failure
4882
4883 --------------------------------------------------------------------------*/
4884
4885static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4886{
4887 v_BOOL_t itemIsValid = VOS_FALSE;
4888 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4889 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004890
Jeff Johnson295189b2012-06-20 16:38:30 -07004891 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4892
4893 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4894 {
4895 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4896 return VOS_STATUS_E_FAILURE;
4897 }
4898 /*Check the NV FIELD is valid or not*/
4899 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4900 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004901 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004902 {
4903 vos_nv_readMacAddress(macAddr);
4904
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004905 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4906 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004907 MAC_ADDR_ARRAY(macAddr));
4908 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4909 {
4910 return VOS_STATUS_E_FAILURE;
4911 }
4912 }
4913 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004914 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004915 {
4916 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004917 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4918 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004919 MAC_ADDR_ARRAY(macAddr));
4920
4921 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4922 {
4923 return VOS_STATUS_E_FAILURE;
4924 }
4925 }
4926 return VOS_STATUS_SUCCESS;
4927}
4928
4929/**---------------------------------------------------------------------------
4930
4931 \brief wlan_ftm_priv_set_mac_address() -
4932
4933 This function sets the mac address to the halphy ptt module and
4934 sends the netlink message to the ptt socket application which writes
4935 the macaddress to the qcom_wlan_nv.bin file
4936
4937 \param - pAdapter - Pointer HDD Context.
4938 - buf - Poniter to the macaddress.
4939
4940 \return - 0 for success, non zero for failure
4941
4942 --------------------------------------------------------------------------*/
4943
4944static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4945{
Jeff Johnson295189b2012-06-20 16:38:30 -07004946 uPttMsgs *pMsgBody;
4947 VOS_STATUS status;
4948 int macAddr[VOS_MAC_ADDRESS_LEN];
4949 v_U8_t *pMacAddress;
4950 v_U8_t ii;
4951 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304952 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004953
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304954 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004955 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304956 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4957 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004958 return VOS_STATUS_E_FAILURE;
4959 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304960 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004961 init_completion(&pHddCtx->ftm.ftm_comp_var);
4962 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4963 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4964
4965 pMsgBody = &pMsgBuf->msgBody;
4966 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4967
4968 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004969 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]))
4970 {
4971 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4972 "Invalid MacAddress Input %s", buf);
4973 return VOS_STATUS_E_FAILURE;
4974 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004975
Arif Hussain24bafea2013-11-15 15:10:03 -08004976 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4977 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004978
4979
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004980 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004981
4982 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4983 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4984
4985
Arif Hussain24bafea2013-11-15 15:10:03 -08004986 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4987 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004988 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4989
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304990 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004991 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304992 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4993 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004994 status = VOS_STATUS_E_FAILURE;
4995 goto done;
4996 }
c_hpothuffdb5272013-10-02 16:42:35 +05304997 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304998 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304999 if (0 >= ret )
5000 {
5001 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5002 FL("wait on ftm_comp_var failed %ld"), ret);
5003 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005004
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305005 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07005006 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305007 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
5008 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005009 status = VOS_STATUS_E_FAILURE;
5010 goto done;
5011 }
5012
Arif Hussain6d2a3322013-11-17 19:50:10 -08005013 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07005014
5015 init_completion(&pHddCtx->ftm.ftm_comp_var);
5016 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
5017
5018 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
5019 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
5020
5021 pMsgBody = &pMsgBuf->msgBody;
5022
5023 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
5024
5025 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
5026
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305027 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07005028 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
5030 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005031 status = VOS_STATUS_E_FAILURE;
5032 goto done;
5033 }
5034
c_hpothuffdb5272013-10-02 16:42:35 +05305035 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305036 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05305037 if (0 >= ret )
5038 {
5039 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5040 FL("wait on ftm_comp_var failed %ld"), ret);
5041 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005042done:
Jeff Johnson295189b2012-06-20 16:38:30 -07005043
5044 return VOS_STATUS_SUCCESS;
5045}
5046
5047/* set param sub-ioctls */
5048static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
5049 union iwreq_data *wrqu, char *extra)
5050{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005051 int ret,sub_cmd;
5052 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305053 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07005054 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005055 hdd_adapter_t *pAdapter;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305056 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07005057
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005058 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305059 /* helper function to get iwreq_data with compat handling. */
5060 if (hdd_priv_get_data(&s_priv_data, wrqu))
5061 {
5062 return -EINVAL;
5063 }
5064
5065 /* make sure all params are correctly passed to function */
5066 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
5067 {
5068 return -EINVAL;
5069 }
5070
5071 sub_cmd = s_priv_data.flags;
5072 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005073 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
5074
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005075 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
5076 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
5077 * odd number which assigns set_args to zero.we assisgn memory using
5078 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005079 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005080 param = kzalloc(length + 1, GFP_KERNEL);
5081 if (!param)
5082 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08005083
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305084 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005085 {
5086 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
5087 "%s:Failed to get user data %s", __func__, param);
5088
5089 ret = -EINVAL;
5090 goto OUT;
5091 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005092
5093 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305094 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005095
5096 switch(sub_cmd)
5097 {
5098 case WE_SET_MAC_ADDRESS:
5099 {
5100
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005101 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005102 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005103
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005104 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005105
5106 if(status != VOS_STATUS_SUCCESS)
5107 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005108 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005109 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005110
Jeff Johnson295189b2012-06-20 16:38:30 -07005111 ret = -EINVAL;
5112 }
5113
Wilson Yang7c471652013-12-20 16:36:44 -08005114 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005115 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005116 case WE_SET_TX_RATE:
5117 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005118 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005119
5120 if(status != VOS_STATUS_SUCCESS)
5121 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005122 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005123 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005124
5125 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005126 }
5127
5128 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005129 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005130 default:
5131 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005132 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005133 ret = -EINVAL;
5134 break;
5135 }
5136 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005137
5138OUT:
5139 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005140 return ret;
5141}
5142
5143static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5144 union iwreq_data *wrqu, char *extra)
5145{
5146 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5147 int *value = (int *)extra;
5148 int sub_cmd = value[0];
5149 int set_value = value[1];
5150 int ret = 0; /* success */
5151 VOS_STATUS status;
5152
5153 switch(sub_cmd)
5154 {
5155 case WE_FTM_ON_OFF:
5156 {
5157 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5158
5159 if(status != VOS_STATUS_SUCCESS)
5160 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005161 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005162 ret = -EINVAL;
5163 }
5164
5165 break;
5166 }
5167
5168 case WE_TX_PKT_GEN:
5169 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5170
5171 if(status != VOS_STATUS_SUCCESS)
5172 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005173 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005174 ret = -EINVAL;
5175 }
5176 break;
5177
5178 case WE_SET_TX_IFS:
5179 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5180
5181 if(status != VOS_STATUS_SUCCESS)
5182 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005183 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005184 ret = -EINVAL;
5185 }
5186 break;
5187
5188 case WE_SET_TX_PKT_CNT:
5189 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5190
5191 if(status != VOS_STATUS_SUCCESS)
5192 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005193 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005194 ret = -EINVAL;
5195 }
5196 break;
5197
5198 case WE_SET_TX_PKT_LEN:
5199 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5200
5201 if(status != VOS_STATUS_SUCCESS)
5202 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005203 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005204 ret = -EINVAL;
5205 }
5206 break;
5207
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305208 case WE_TX_CW_RF_GEN:
5209 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5210
5211 if(status != VOS_STATUS_SUCCESS)
5212 {
5213 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5214 ret = -EINVAL;
5215 }
5216 break;
5217
Jeff Johnson295189b2012-06-20 16:38:30 -07005218 case WE_SET_CHANNEL:
5219 {
5220 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5221
5222 if(status != VOS_STATUS_SUCCESS)
5223 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005224 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005225 ret = -EINVAL;
5226 }
5227 break;
5228 }
5229 case WE_SET_TX_POWER:
5230 {
5231 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5232
5233 if(status != VOS_STATUS_SUCCESS)
5234 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005235 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005236 ret = -EINVAL;
5237 }
5238 break;
5239 }
5240 case WE_CLEAR_RX_PKT_CNT:
5241 {
5242 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5243
5244 if(status != VOS_STATUS_SUCCESS)
5245 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005246 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005247 ret = -EINVAL;
5248 }
5249 break;
5250 }
5251 case WE_RX:
5252 {
5253 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5254
5255 if(status != VOS_STATUS_SUCCESS)
5256 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005257 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005258 ret = -EINVAL;
5259 }
5260 break;
5261 }
5262 case WE_ENABLE_CHAIN:
5263 {
5264 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5265
5266 if(status != VOS_STATUS_SUCCESS)
5267 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005268 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005269 ret = -EINVAL;
5270 }
5271 break;
5272 }
5273
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305274 case WE_SET_PWR_CNTL_MODE:
5275 {
5276 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5277 if (status != VOS_STATUS_SUCCESS)
5278 {
5279 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5280 status);
5281 ret = -EINVAL;
5282 }
5283 break;
5284 }
5285
5286 case WE_ENABLE_DPD:
5287 {
5288 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5289 if (status != VOS_STATUS_SUCCESS)
5290 {
5291 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5292 ret = -EINVAL;
5293 }
5294 break;
5295 }
5296
5297 case WE_SET_CB:
5298 {
5299 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5300 if (status != VOS_STATUS_SUCCESS)
5301 {
5302 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5303 ret = -EINVAL;
5304 }
5305 break;
5306 }
5307
Jeff Johnson295189b2012-06-20 16:38:30 -07005308 default:
5309 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005310 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005311 sub_cmd, set_value);
5312 break;
5313 }
5314 }
5315
5316 return ret;
5317}
5318
5319/* get param sub-ioctls */
5320static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5321 union iwreq_data *wrqu, char *extra)
5322{
5323 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5324 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005325 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005326 VOS_STATUS status;
5327
5328 switch (value[0])
5329 {
5330 case WE_GET_CHANNEL:
5331 {
5332 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5333
5334 if(status != VOS_STATUS_SUCCESS)
5335 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005336 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005337 ret = -EINVAL;
5338 }
5339 break;
5340 }
5341 case WE_GET_TX_POWER:
5342 {
5343 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5344
5345 if(status != VOS_STATUS_SUCCESS)
5346 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005347 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005348 ret = -EINVAL;
5349 }
5350 break;
5351 }
5352 case WE_GET_RX_PKT_CNT:
5353 {
5354 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5355
5356 if(status != VOS_STATUS_SUCCESS)
5357 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005358 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005359 ret = -EINVAL;
5360 }
5361 break;
5362 }
5363 default:
5364 {
5365 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5366 break;
5367 }
5368 }
5369
5370 return ret;
5371}
5372
5373static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5374 union iwreq_data *wrqu, char *extra)
5375{
5376 int sub_cmd = wrqu->data.flags;
5377 VOS_STATUS status;
5378 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5379
5380 switch(sub_cmd)
5381 {
5382 case WE_GET_MAC_ADDRESS:
5383 {
5384 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5385
5386 if(status != VOS_STATUS_SUCCESS)
5387 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005388 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005389 return -EINVAL;
5390 }
5391 wrqu->data.length = strlen(extra)+1;
5392 break;
5393 }
5394 case WE_GET_TX_RATE:
5395 {
5396 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5397
5398 if(status != VOS_STATUS_SUCCESS)
5399 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005400 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005401 return -EINVAL;
5402 }
5403
5404 wrqu->data.length = strlen(extra)+1;
5405 break;
5406 }
5407 case WE_GET_FTM_VERSION:
5408 {
5409 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5410
5411 if(status != VOS_STATUS_SUCCESS)
5412 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005413 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005414 return -EINVAL;
5415 }
5416 wrqu->data.length = strlen(extra)+1;
5417 break;
5418 }
5419 case WE_GET_FTM_STATUS:
5420 {
5421 status = wlan_ftm_priv_get_status(pAdapter, extra);
5422
5423 if(status != VOS_STATUS_SUCCESS)
5424 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005425 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005426 return -EINVAL;
5427 }
5428
5429 wrqu->data.length = strlen(extra)+1;
5430 break;
5431 }
5432 case WE_GET_RX_RSSI:
5433 {
5434 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5435
5436 if(status != VOS_STATUS_SUCCESS)
5437 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005438 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005439 return -EINVAL;
5440 }
5441
5442 wrqu->data.length = strlen(extra)+1;
5443 break;
5444 }
5445 default:
5446 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005447 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005448 break;
5449 }
5450 }
5451
5452 return 0;
5453}
Jeff Johnson295189b2012-06-20 16:38:30 -07005454
5455VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5456{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005457#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005458 tAniHdr *wmsg = NULL;
5459 v_U8_t *pBuf;
5460 hdd_context_t *pHddCtx = NULL;
5461 v_CONTEXT_t pVosContext= NULL;
5462
5463 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5464 if(pBuf == NULL)
5465 {
5466 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5467 return VOS_STATUS_E_NOMEM;
5468 }
5469 wmsg = (tAniHdr*)pBuf;
5470 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5471 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5472 wmsg->length = FTM_SWAP16(wmsg->length);
5473 pBuf += sizeof(tAniHdr);
5474
5475 /*Get the global context */
5476 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5477
5478 /*Get the Hdd Context */
5479 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5480 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5481
5482 /* EfS command Code */
5483 *(v_U32_t*)pBuf = 0x000000EF;
5484
5485 pBuf += sizeof(v_U32_t);
5486
5487 memcpy(pBuf, pData,data_len);
5488
5489 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305490 if( ptt_sock_send_msg_to_app(wmsg, 0,
5491 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005492
Arif Hussain6d2a3322013-11-17 19:50:10 -08005493 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 -07005494 vos_mem_free((v_VOID_t*)wmsg);
5495 return VOS_STATUS_E_FAILURE;
5496 }
5497 }
5498 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305499 if( ptt_sock_send_msg_to_app(wmsg, 0,
5500 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005501
Arif Hussain6d2a3322013-11-17 19:50:10 -08005502 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 -07005503 vos_mem_free((v_VOID_t*)wmsg);
5504 return VOS_STATUS_E_FAILURE;
5505 }
5506 }
5507
5508 vos_mem_free((v_VOID_t*)wmsg);
5509#endif //FTM and ANDROID
5510
5511 return VOS_STATUS_SUCCESS;
5512}
5513
Jeff Johnson295189b2012-06-20 16:38:30 -07005514/* action sub-ioctls */
5515static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5516 union iwreq_data *wrqu, char *extra)
5517{
5518 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005519 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005520
5521 switch (sub_cmd)
5522 {
5523 case WE_SET_NV_DEFAULTS:
5524 {
5525 v_U8_t *pu8buf,*pTempBuf;
5526 v_U16_t size;
5527 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005528 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005529 pu8buf = vos_mem_malloc(size);
5530 if(pu8buf == NULL)
5531 {
5532 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5533 return VOS_STATUS_E_NOMEM;
5534 }
5535 memset(pu8buf,0,size);
5536 pTempBuf = pu8buf;
5537 pTempBuf += sizeof(v_U32_t);
5538 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5539
5540 wlan_write_to_efs(pu8buf,size);
5541 vos_mem_free(pu8buf);
5542 }
5543
5544 default:
5545 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005546 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005547 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5548 break;
5549 }
5550 }
5551
5552 return ret;
5553}
5554
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305555static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5556 union iwreq_data *wrqu, char *extra)
5557{
5558 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5559 int sub_cmd = wrqu->data.flags;
5560 int *value = (int*)wrqu->data.pointer;
5561
5562 if(wrqu->data.length != 2)
5563 {
5564 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5565 return -EINVAL;
5566 }
5567 switch (sub_cmd)
5568 {
5569 case WE_SET_TX_WF_GAIN:
5570 {
5571 v_S15_t dGain = 0;
5572 v_U16_t rfGain = 0;
5573 VOS_STATUS status;
5574
5575 dGain = *(v_S15_t*) value++;
5576 rfGain = *(v_U16_t*) value;
5577 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5578
5579 if(status != VOS_STATUS_SUCCESS)
5580 {
5581 hddLog(VOS_TRACE_LEVEL_FATAL,
5582 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5583 return -EINVAL;
5584 }
5585 }
5586 break;
5587
5588 default:
5589 {
5590 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5591 break;
5592 }
5593 }
5594
5595 return 0;
5596}
5597
5598
Jeff Johnson295189b2012-06-20 16:38:30 -07005599static const iw_handler we_ftm_private[] = {
5600
5601 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5602 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5603 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5604 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5605 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305606 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005607};
5608
5609/*Maximum command length can be only 15 */
5610static const struct iw_priv_args we_ftm_private_args[] = {
5611
5612 /* handlers for main ioctl */
5613 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5614 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5615 0,
5616 "" },
5617
5618 { WE_FTM_ON_OFF,
5619 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5620 0,
5621 "ftm" },
5622
5623 { WE_TX_PKT_GEN,
5624 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5625 0,
5626 "tx" },
5627
5628 { WE_SET_TX_IFS,
5629 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5630 0,
5631 "set_txifs" },
5632
5633 { WE_SET_TX_PKT_CNT,
5634 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5635 0,
5636 "set_txpktcnt" },
5637
5638 { WE_SET_TX_PKT_LEN,
5639 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5640 0,
5641 "set_txpktlen" },
5642
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305643 { WE_SET_TX_WF_GAIN,
5644 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5645 0,
5646 "set_tx_wf_gain" },
5647
5648 { WE_TX_CW_RF_GEN,
5649 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5650 0,
5651 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005652 { WE_SET_CHANNEL,
5653 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5654 0,
5655 "set_channel" },
5656
5657 { WE_SET_TX_POWER,
5658 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5659 0,
5660 "set_txpower" },
5661
5662 { WE_CLEAR_RX_PKT_CNT,
5663 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5664 0,
5665 "clr_rxpktcnt" },
5666
5667 { WE_RX,
5668 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5669 0,
5670 "rx" },
5671
5672 { WE_ENABLE_CHAIN,
5673 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5674 0,
5675 "ena_chain" },
5676
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305677 { WE_SET_PWR_CNTL_MODE,
5678 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5679 0,
5680 "pwr_cntl_mode" },
5681
5682 { WE_ENABLE_DPD,
5683 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5684 0,
5685 "ena_dpd" },
5686
5687 { WE_SET_CB,
5688 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5689 0,
5690 "set_cb" },
5691
Jeff Johnson295189b2012-06-20 16:38:30 -07005692 /* handlers for main ioctl */
5693 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5694 0,
5695 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5696 "" },
5697
5698 { WE_GET_CHANNEL,
5699 0,
5700 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5701 "get_channel" },
5702
5703 { WE_GET_TX_POWER,
5704 0,
5705 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5706 "get_txpower" },
5707
5708 { WE_GET_RX_PKT_CNT,
5709 0,
5710 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5711 "get_rxpktcnt" },
5712
5713 /* handlers for main ioctl */
5714 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5715 IW_PRIV_TYPE_CHAR| 512,
5716 0,
5717 "" },
5718
5719 { WE_SET_MAC_ADDRESS,
5720 IW_PRIV_TYPE_CHAR| 512,
5721 0,
5722 "set_mac_address" },
5723
5724 { WE_SET_TX_RATE,
5725 IW_PRIV_TYPE_CHAR | 512,
5726 0,
5727 "set_txrate" },
5728
5729 /* handlers for main ioctl */
5730 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5731 0,
5732 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5733 "" },
5734
5735 { WE_GET_MAC_ADDRESS,
5736 0,
5737 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5738 "get_mac_address" },
5739
5740 { WE_GET_FTM_VERSION,
5741 0,
5742 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5743 "ftm_version" },
5744
5745 { WE_GET_TX_RATE,
5746 0,
5747 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5748 "get_txrate" },
5749
5750 { WE_GET_FTM_STATUS,
5751 0,
5752 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5753 "get_status" },
5754
5755 { WE_GET_RX_RSSI,
5756 0,
5757 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5758 "get_rx_rssi" },
5759
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305760 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5761 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5762 0,
5763 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005764 /* handlers for main ioctl */
5765 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5766 0,
5767 0,
5768 "" },
5769
5770 /* handlers for sub-ioctl */
5771 { WE_SET_NV_DEFAULTS,
5772 0,
5773 0,
5774 "set_nv_defaults" },
5775
5776};
5777
5778const struct iw_handler_def we_ftm_handler_def = {
5779 .num_standard = 0,
5780 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5781 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5782
5783 .standard = (iw_handler *)NULL,
5784 .private = (iw_handler *)we_ftm_private,
5785 .private_args = we_ftm_private_args,
5786 .get_wireless_stats = NULL,
5787};
5788
5789static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5790{
5791
5792 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5793
5794 // Zero the memory. This zeros the profile structure.
5795 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005796
Jeff Johnson295189b2012-06-20 16:38:30 -07005797 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5798
5799 return 0;
5800}
5801
Jeff Johnson295189b2012-06-20 16:38:30 -07005802
5803VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5804{
Jeff Johnson295189b2012-06-20 16:38:30 -07005805 ftm_rsp_msg_t *pFtmMsgRsp;
5806
5807 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5808 hdd_context_t *pHddCtx;
5809 v_CONTEXT_t pVosContext= NULL;
5810
5811 ENTER();
5812
5813 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5814
5815 if (!message )
5816 {
5817 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5818 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5819 return VOS_STATUS_E_INVAL;
5820 }
5821 /*Get the global context */
5822 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5823
5824 /*Get the Hdd Context */
5825 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5826
5827 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5828
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305829 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005830 complete(&pHddCtx->ftm.ftm_comp_var);
5831 }
5832 else {
5833 /*Response length to Ptt App*/
5834 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5835
5836 /*Ptt App expects the response length in LE */
5837 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5838
5839 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005840 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005841 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5842
5843 /*Copy the message*/
5844 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5845
5846 /*Update the error code*/
5847 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5848
5849 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5850
5851 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5852 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005853 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005854 return VOS_STATUS_E_FAILURE;
5855 }
5856 }
5857 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005858 return VOS_STATUS_SUCCESS;
5859
5860}