blob: c0250eafc4cbee206c57f0f0448ed880759f94b2 [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"
Jeff Johnson295189b2012-06-20 16:38:30 -070074#include "qwlan_version.h"
75
Jeff Johnson295189b2012-06-20 16:38:30 -070076#include "wlan_nv.h"
77#include "wlan_qct_wda.h"
78#include "cfgApi.h"
79#include "pttMsgApi.h"
80#include "wlan_qct_pal_device.h"
Anand N Sunkad5286f8a2014-08-22 14:57:43 +053081#include "linux/wcnss_wlan.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070082
Jeff Johnson295189b2012-06-20 16:38:30 -070083#define RXMODE_DISABLE_ALL 0
84#define RXMODE_ENABLE_ALL 1
85#define RXMODE_ENABLE_11GN 2
86#define RXMODE_ENABLE_11B 3
87
88#define FTM_CHAIN_SEL_NO_RX_TX 0
89#define FTM_CHAIN_SEL_R0_ON 1
90#define FTM_CHAIN_SEL_T0_ON 2
91#define FTM_CHAIN_SEL_R0_T0_ON 3
92#define FTM_CHAIN_SEL_MAX 3
93
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053094#define WCNSS_TXFIR_OFFSET 0x00018000
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096#ifndef QWLAN_PHYDBG_BASE
97#define QWLAN_PHYDBG_BASE 0x03004000
98#endif /* QWLAN_PHYDBG_BASE */
99
100#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800101#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
103#endif
104
Jeff Johnson295189b2012-06-20 16:38:30 -0700105
Anand N Sunkad5286f8a2014-08-22 14:57:43 +0530106#ifndef QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET
107#define QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET 0x00013c34
Jeff Johnson295189b2012-06-20 16:38:30 -0700108#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
Anand N Sunkad5286f8a2014-08-22 14:57:43 +0530109#endif /* QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET */
Jeff Johnson295189b2012-06-20 16:38:30 -0700110
Jeff Johnson295189b2012-06-20 16:38:30 -0700111
112#ifndef QWLAN_RFAPB_BASE
113#define QWLAN_RFAPB_BASE 0x0E02F800
114#endif /* QWLAN_RFAPB_BASE */
115
116#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800117#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700118#endif /* QWLAN_RFAPB_REV_ID_REG */
119
120#ifndef QWLAN_TXCTL_BASE
121#define QWLAN_TXCTL_BASE 0x03012000
122#endif /* QWLAN_TXCTL_BASE */
123
124#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800125#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700126#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
127#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
128#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
129#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
130#endif /* QWLAN_TXCTL_FSHIFT_REG */
131
132/* To set 4MAC addresses from given first MAC address,
133 * Last byte value within given MAC address must less than 0xFF - 3 */
134#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700135#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700136
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530137#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
138
Jeff Johnson295189b2012-06-20 16:38:30 -0700139typedef struct {
140 tANI_U32 tableSize; /* Whole NV Table Size */
141 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
142 eNvTable nvTable;
143 tANI_U8 tableData; /* Filled by host driver */
144} pttGetNvTable;
145
146typedef struct {
147 tANI_U32 tableSize; /* Whole NV Table Size */
148 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
149 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700150 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700151} pttSetNvTable;
152
Jeff Johnson295189b2012-06-20 16:38:30 -0700153
154extern const sHalNv nvDefaults;
155static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700156static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700157VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700158
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700159/* 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 -0700160 Since it is associated to agc.channel_freq register for mapping.
161 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
162*/
163static const freq_chan_t freq_chan_tbl[] = {
164 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
165 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
166};
167
168static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
169{
170 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
171 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
172 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
173 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
174 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
175 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
176 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
177 //Spica_Virgo 11A 20MHz Rates
178 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
179 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
180 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
181 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
182 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
183 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
184 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
185 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
186
187//MCS Index #0-15 (20MHz)
188 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
189 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
190 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
191 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
192 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
193 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
194 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
195 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530196 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, "MCS_SG_7_2_MBPS"},
197 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS, "MCS_SG_14_4_MBPS"},
198 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS, "MCS_SG_21_7_MBPS"},
199 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS, "MCS_SG_28_9_MBPS"},
200 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS, "MCS_SG_43_3_MBPS"},
201 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS, "MCS_SG_57_8_MBPS"},
202 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, "MCS_SG_65_MBPS"},
203 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_SG_72_2_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530204
205//MCS Index #8-15 (40MHz)
206
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530207 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_5_MBPS" },
208 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
209 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
210 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
211 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
212 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
213 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
214 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530215 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
216 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
217 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
218 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
219 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
220 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
221 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800222 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530223
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800224#ifdef WLAN_FEATURE_11AC
225 /*11AC rate 20MHZ Normal GI*/
226 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
227 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
228 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
229 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
230 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
231 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
232 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
233 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
234 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530235#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800236 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530237#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800238
239 /*11AC rate 20MHZ Short GI*/
240 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
241 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
242 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
243 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
244 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
245 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
246 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
247 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
248 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530249#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800250 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530251#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800252
253 /*11AC rates 40MHZ normal GI*/
254 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
255 "MCS_VHT40_NGI_CB_13_5_MBPS"},
256 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
257 "MCS_VHT40_NGI_CB_27_MBPS"},
258 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
259 "MCS_VHT40_NGI_CB_40_5_MBPS"},
260 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
261 "MCS_VHT40_NGI_CB_54_MBPS"},
262 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
263 "MCS_VHT40_NGI_CB_81_MBPS"},
264 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
265 "MCS_VHT40_NGI_CB_108_MBPS"},
266 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
267 "MCS_VHT40_NGI_CB_121_5_MBPS"},
268 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
269 "MCS_VHT40_NGI_CB_135_MBPS"},
270 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
271 "MCS_VHT40_NGI_CB_162_MBPS"},
272 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
273 "MCS_VHT40_NGI_CB_180_MBPS"},
274
275 /*11AC rates 40MHZ short GI*/
276 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
277 "MCS_VHT40_SGI_CB_15_MBPS"},
278 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
279 "MCS_VHT40_SGI_CB_30_MBPS"},
280 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
281 "MCS_VHT40_SGI_CB_45_MBPS"},
282 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
283 "MCS_VHT40_SGI_CB_60_MBPS"},
284 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
285 "MCS_VHT40_SGI_CB_90_MBPS"},
286 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
287 "MCS_VHT40_SGI_CB_120_MBPS"},
288 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
289 "MCS_VHT40_SGI_CB_135_MBPS"},
290 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
291 "MCS_VHT40_SGI_CB_150_MBPS"},
292 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
293 "MCS_VHT40_SGI_CB_180_MBPS"},
294 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
295 "MCS_VHT40_SGI_CB_200_MBPS"},
296
297 /*11AC rates 80 MHZ normal GI*/
298 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
299 "MCS_VHT80_NGI_CB_29_3_MBPS"},
300 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
301 "MCS_VHT80_NGI_CB_58_5_MBPS"},
302 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
303 "MCS_VHT80_NGI_CB_87_8_MBPS"},
304 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
305 "MCS_VHT80_NGI_CB_117_MBPS"},
306 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
307 "MCS_VHT80_NGI_CB_175_5_MBPS"},
308 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
309 "MCS_VHT80_NGI_CB_234_MBPS"},
310 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
311 "MCS_VHT80_NGI_CB_263_3_MBPS"},
312 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
313 "MCS_VHT80_NGI_CB_292_5_MBPS"},
314 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
315 "MCS_VHT80_NGI_CB_351_MBPS"},
316 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
317 "MCS_VHT80_NGI_CB_390_MBPS"},
318
319 /*11AC rates 80 MHZ short GI*/
320 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
321 "MCS_VHT80_SGI_CB_32_5_MBPS"},
322 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
323 "MCS_VHT80_SGI_CB_65_MBPS"},
324 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
325 "MCS_VHT80_SGI_CB_97_5_MBPS"},
326 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
327 "MCS_VHT80_SGI_CB_130_MBPS"},
328 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
329 "MCS_VHT80_SGI_CB_195_MBPS"},
330 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
331 "MCS_VHT80_SGI_CB_260_MBPS"},
332 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
333 "MCS_VHT80_SGI_CB_292_5_MBPS"},
334 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
335 "MCS_VHT80_SGI_CB_325_MBPS"},
336 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
337 "MCS_VHT80_SGI_CB_390_MBPS"},
338 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
339 "MCS_VHT80_SGI_CB_433_3_MBPS"},
340#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700341};
342
343static rateIndex2Preamble_t rate_index_2_preamble_table[] =
344{
345
346 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
347 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
348 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
349 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
350 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
351 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
352 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
353
Jeff Johnson295189b2012-06-20 16:38:30 -0700354
355 //Spica_Virgo 11A 20MHz Rates
356 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
357 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
358 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
359 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
360 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
361 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
362 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
363 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
364
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530365 // 11A 20MHz Rates
366 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
367 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
368 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
369 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
370 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
371 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
372 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
373 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
374
Jeff Johnson295189b2012-06-20 16:38:30 -0700375 //MCS Index #0-15 (20MHz)
376 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
377 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
378 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
379 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
380 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
381 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
382 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
383 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
385 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
386 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
387 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
388 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
389 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
390 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
391 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530392
393 //MCS index (40MHz)
394 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
395 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
396 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
397 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
398 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
399 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
400 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
401 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800409 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530410
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800411#ifdef WLAN_FEATURE_11AC
412 /*11AC rate 20MHZ Normal GI*/
413 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
416 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
417 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
418 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
419 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
420 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530422#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800423 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530424#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800425 /*11AC rate 20MHZ Short GI*/
426 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
429 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
430 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
431 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
432 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
433 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530435#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800436 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530437#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800438
439 /*11AC rates 40MHZ normal GI*/
440 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
442 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
443 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
444 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
445 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
446 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
447 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
450
451 /*11AC rates 40MHZ short GI*/
452 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
457 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
458 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
459 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
462
463 /*11AC rates 80 MHZ normal GI*/
464 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
465 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
466 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
467 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
468 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
469 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
470 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
471 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
472 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
473 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
474
475 /*11AC rates 80 MHZ short GI*/
476 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
477 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
478 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
479 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
480 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
481 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
482 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
483 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
484 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
485 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
486#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700487};
488
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530489static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
490 11, 12, 13, 14, 36, 40, 44, 48,
491 52, 56, 60, 64, 100, 104, 108,
492 112, 116, 120, 124, 128, 132,
493 136, 140, 149, 153, 157, 161,
494 165, 208, 212, 216, 240, 244,
495 248, 252, 0 };
496static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
497 42, 46, 50, 54, 58, 62, 102, 106,
498 110, 114, 118, 122, 126, 130, 134,
499 138, 151, 155, 159, 163, 210, 214,
500 242, 246, 250, 0 };
501static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
502 114, 118, 122, 126, 130, 134, 155,
503 159, 246, 0 };
504
Jeff Johnson295189b2012-06-20 16:38:30 -0700505typedef struct
506{
507 tANI_BOOLEAN frameGenEnabled;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530508 tANI_BOOLEAN wfRfGenEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -0700509 tANI_BOOLEAN wfmEnabled;
510 sPttFrameGenParams frameParams;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530511 v_U16_t powerCtlMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700512 v_U16_t rxmode;
513 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530514 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700515
516} FTM_STATUS ;
517static FTM_STATUS ftm_status;
518
519//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530520static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700521
522static void _ftm_status_init(void)
523{
524 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
525 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
526 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
527
528 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
529 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530530 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700531 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530532 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700533 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
534 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530535 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700536 ftm_status.frameParams.payloadFillByte = 0xA5;
537 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
538 ftm_status.frameParams.tx_mode = 0;
539 ftm_status.frameParams.crc = 0;
540 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
541 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
542 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
543 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530544 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700545 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
546 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530547 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700548
549 return;
550}
551
552/**---------------------------------------------------------------------------
553
554 \brief wlan_ftm_postmsg() -
555
556 The function used for sending the command to the halphy.
557
558 \param - cmd_ptr - Pointer command buffer.
559
560 \param - cmd_len - Command length.
561
562 \return - 0 for success, non zero for failure
563
564 --------------------------------------------------------------------------*/
565
566static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
567{
568 vos_msg_t *ftmReqMsg;
569 vos_msg_t ftmMsg;
570 ENTER();
571
572 ftmReqMsg = (vos_msg_t *) cmd_ptr;
573
Jeff Johnson295189b2012-06-20 16:38:30 -0700574 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700575 ftmMsg.reserved = 0;
576 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
577 ftmMsg.bodyval = 0;
578
579 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700580 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700582 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800583 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700584
585 return VOS_STATUS_E_FAILURE;
586 }
587
588 EXIT();
589 return VOS_STATUS_SUCCESS;
590}
591
592/*---------------------------------------------------------------------------
593
594 \brief wlan_ftm_vos_open() - Open the vOSS Module
595
596 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
597 Upon successful initialization:
598
599 - All VOS submodules should have been initialized
600
601 - The VOS scheduler should have opened
602
603 - All the WLAN SW components should have been opened. This include
604 MAC.
605
606
Girish Gowli32fbe522014-05-08 20:27:04 +0530607 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700608
609
610 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
611 is ready to be used.
612
613 VOS_STATUS_E_RESOURCES - System resources (other than memory)
614 are unavailable to initialize the scheduler
615
616
617 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
618
619 \sa wlan_ftm_vos_open()
620
621---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530622static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700623{
624 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
625 int iter = 0;
626 tSirRetStatus sirStatus = eSIR_SUCCESS;
627 tMacOpenParameters macOpenParms;
628 pVosContextType gpVosContext = (pVosContextType)pVosContext;
629
630 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
631 "%s: Opening VOSS", __func__);
632
633 if (NULL == gpVosContext)
634 {
635 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
636 "%s: Trying to open VOSS without a PreOpen",__func__);
637 VOS_ASSERT(0);
638 return VOS_STATUS_E_FAILURE;
639 }
640
641 /* Initialize the probe event */
642 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
643 {
644 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
645 "%s: Unable to init probeEvent",__func__);
646 VOS_ASSERT(0);
647 return VOS_STATUS_E_FAILURE;
648 }
649
Jeff Johnson295189b2012-06-20 16:38:30 -0700650 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
651 {
652 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
653 "%s: Unable to init wdaCompleteEvent",__func__);
654 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700655
Jeff Johnson295189b2012-06-20 16:38:30 -0700656 goto err_probe_event;
657 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700658
659 /* Initialize the free message queue */
660 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
661 if (! VOS_IS_STATUS_SUCCESS(vStatus))
662 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700663 /* Critical Error ... Cannot proceed further */
664 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530665 "%s: Failed to initialize VOS free message queue %d",
666 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700667 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700668 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700669 }
670
671 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
672 {
673 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
674 &(gpVosContext->aMsgBuffers[iter]);
675 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
676 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
677 }
678
679 /* Now Open the VOS Scheduler */
680 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
681 sizeof(VosSchedContext));
682
683 if (!VOS_IS_STATUS_SUCCESS(vStatus))
684 {
685 /* Critical Error ... Cannot proceed further */
686 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530687 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700688 VOS_ASSERT(0);
689 goto err_msg_queue;
690 }
691
692 /* Open the SYS module */
693 vStatus = sysOpen(gpVosContext);
694
695 if (!VOS_IS_STATUS_SUCCESS(vStatus))
696 {
697 /* Critical Error ... Cannot proceed further */
698 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530699 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700700 VOS_ASSERT(0);
701 goto err_sched_close;
702 }
703
Jeff Johnson295189b2012-06-20 16:38:30 -0700704 /*Open the WDA module */
705 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
706 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530707 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700708 if (!VOS_IS_STATUS_SUCCESS(vStatus))
709 {
710 /* Critical Error ... Cannot proceed further */
711 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530712 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700713 VOS_ASSERT(0);
714 goto err_sys_close;
715 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700716
717 /* initialize the NV module */
718 vStatus = vos_nv_open();
719 if (!VOS_IS_STATUS_SUCCESS(vStatus))
720 {
721 // NV module cannot be initialized, however the driver is allowed
722 // to proceed
723 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530724 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700725 goto err_wda_close;
726 }
727
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700728 vStatus = vos_nv_get_dictionary_data();
729
730 if (!VOS_IS_STATUS_SUCCESS(vStatus))
731 {
732 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530733 "%s : failed to get dictionary data for NV %d",
734 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700735 goto err_wda_close;
736 }
737
Jeff Johnson295189b2012-06-20 16:38:30 -0700738 /* If we arrive here, both threads dispacthing messages correctly */
739
740 /* Now proceed to open the MAC */
741
742 /* UMA is supported in hardware for performing the
743 frame translation 802.11 <-> 802.3 */
744 macOpenParms.frameTransRequired = 1;
745 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
746 &macOpenParms);
747
748 if (eSIR_SUCCESS != sirStatus)
749 {
750 /* Critical Error ... Cannot proceed further */
751 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530752 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700753 VOS_ASSERT(0);
754 goto err_nv_close;
755 }
756
Jeff Johnson295189b2012-06-20 16:38:30 -0700757 /* Now proceed to open the SME */
758 vStatus = sme_Open(gpVosContext->pMACContext);
759 if (!VOS_IS_STATUS_SUCCESS(vStatus))
760 {
761 /* Critical Error ... Cannot proceed further */
762 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530763 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700764 goto err_mac_close;
765 }
766 return VOS_STATUS_SUCCESS;
767
Jeff Johnson295189b2012-06-20 16:38:30 -0700768
769 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
770 "%s: VOSS successfully Opened",__func__);
771
772 return VOS_STATUS_SUCCESS;
773err_mac_close:
774 macClose(gpVosContext->pMACContext);
775
776err_nv_close:
777 vos_nv_close();
778
779err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700780 WDA_close(gpVosContext);
781
782err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700783 sysClose(gpVosContext);
784
785err_sched_close:
786 vos_sched_close(gpVosContext);
787err_msg_queue:
788 vos_mq_deinit(&gpVosContext->freeVosMq);
789
Jeff Johnson295189b2012-06-20 16:38:30 -0700790err_wda_complete_event:
791 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700792
793err_probe_event:
794 vos_event_destroy(&gpVosContext->ProbeEvent);
795
796 return VOS_STATUS_E_FAILURE;
797
798} /* wlan_ftm_vos_open() */
799
800/*---------------------------------------------------------------------------
801
802 \brief wlan_ftm_vos_close() - Close the vOSS Module
803
804 The \a wlan_ftm_vos_close() function closes the vOSS Module
805
806 \param vosContext context of vos
807
808 \return VOS_STATUS_SUCCESS - successfully closed
809
810 \sa wlan_ftm_vos_close()
811
812---------------------------------------------------------------------------*/
813
814static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
815{
816 VOS_STATUS vosStatus;
817 pVosContextType gpVosContext = (pVosContextType)vosContext;
818
Jeff Johnson295189b2012-06-20 16:38:30 -0700819 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
820 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
821 {
822 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530823 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700824 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
825 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700826
827 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
828 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
829 {
830 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530831 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700832 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
833 }
834
835 ((pVosContextType)vosContext)->pMACContext = NULL;
836
837 vosStatus = vos_nv_close();
838 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
839 {
840 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530841 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700842 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
843 }
844
845
846 vosStatus = sysClose( vosContext );
847 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
848 {
849 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530850 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
852 }
853
Jeff Johnson295189b2012-06-20 16:38:30 -0700854 vosStatus = WDA_close( vosContext );
855 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
856 {
857 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530858 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700859 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
860 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700861
862 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
863
864 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
865 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
866 {
867 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530868 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700869 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
870 }
871
Jeff Johnson295189b2012-06-20 16:38:30 -0700872 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
873 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
874 {
875 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530876 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700877 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
878 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700879
880 return VOS_STATUS_SUCCESS;
881}
882
883/**---------------------------------------------------------------------------
884
885 \brief wlan_ftm_priv_set_txifs() -
886
887 This function is used for
888
889 \param - pAdapter - Pointer HDD Context.
890 - ifs
891
892 \return - 0 for success, non zero for failure
893
894 --------------------------------------------------------------------------*/
895
896
897
898static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
899{
900 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
901 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
902 {
903 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
904 return VOS_STATUS_E_FAILURE;
905 }
906
907 /* do not allow to change setting when tx pktgen is enabled */
908 if (ftm_status.frameGenEnabled)
909 {
910 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
911 return VOS_STATUS_E_FAILURE;
912 }
913
914 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
915 {
c_hpothuffdb5272013-10-02 16:42:35 +0530916 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
917 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700918 return VOS_STATUS_E_FAILURE;
919 }
920
921 ftm_status.frameParams.interFrameSpace = ifs;
922
923 return VOS_STATUS_SUCCESS;
924}
925
926/**---------------------------------------------------------------------------
927
928 \brief wlan_ftm_priv_set_txpktcnt() -
929
930 This function is used for
931
932 \param - pAdapter - Pointer HDD Context.
933 - ifs
934
935 \return - 0 for success, non zero for failure
936
937 --------------------------------------------------------------------------*/
938
939static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
940{
941 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
942 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
943 {
944 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
945 return VOS_STATUS_E_FAILURE;
946 }
947
948 /* do not allow to change setting when tx pktgen is enabled */
949 if (ftm_status.frameGenEnabled)
950 {
951 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
952 return VOS_STATUS_E_FAILURE;
953 }
954
955 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
956 {
c_hpothuffdb5272013-10-02 16:42:35 +0530957 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
958 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700959 return VOS_STATUS_E_FAILURE;
960 }
961
962 ftm_status.frameParams.numTestPackets = cnt;
963
964 return VOS_STATUS_SUCCESS;
965}
966
967static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
968{
969 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
970 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
971 {
972 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
973 return VOS_STATUS_E_FAILURE;
974 }
975
976 /* do not allow to change setting when tx pktgen is enabled */
977 if (ftm_status.frameGenEnabled)
978 {
979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
980 return VOS_STATUS_E_FAILURE;
981 }
982
983 if (len > 4095) //4096
984 {
c_hpothuffdb5272013-10-02 16:42:35 +0530985 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
986 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700987 return VOS_STATUS_E_FAILURE;
988 }
989
990 ftm_status.frameParams.payloadLength = (tANI_U16)len;
991
992 return VOS_STATUS_SUCCESS;
993}
994
Jeff Johnson295189b2012-06-20 16:38:30 -0700995
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530996static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
997/**---------------------------------------------------------------------------
998<FTM_Command>set_tx_wf_gain
999<argument> is <n>
1000Designates the number of amplitude gain (31 to 255).
1001Description
1002This command can be set only when Tx CW generation is stopped.
1003--------------------------------------------------------------------------*/
1004static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
1005{
1006 uPttMsgs *pMsgBody;
1007 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1008 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
1009 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
1010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1011 "%s:Ftm has not started. Please start the ftm.", __func__);
1012 return VOS_STATUS_E_FAILURE;
1013 }
1014
1015 if (ftm_status.wfRfGenEnabled) {
1016 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1017 "%s:cannot set gain when cwgen is enabled.", __func__);
1018 return VOS_STATUS_E_FAILURE;
1019 }
1020
1021 if (dGain > 24 || dGain <-39) {
1022 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1023 "%s:digital gain value is invalid", __func__);
1024 return VOS_STATUS_E_FAILURE;
1025 }
1026
1027 if (rfGain > 31 || rfGain <0) {
1028 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1029 "%s:rf gain value is invalid", __func__);
1030 return VOS_STATUS_E_FAILURE;
1031 }
1032
1033 if (pMsgBuf == NULL) {
1034 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1035 "%s:pMsgBuf is NULL", __func__);
1036 return VOS_STATUS_E_NOMEM;
1037 }
1038
1039 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1040 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1041
1042 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1043 init_completion(&pHddCtx->ftm.ftm_comp_var);
1044 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1045 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1046 pMsgBody = &pMsgBuf->msgBody;
1047 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1048 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1049 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1050 VOS_STATUS_SUCCESS) {
1051 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1052 "%s:wlan_ftm_postmsg failed",__func__);
1053 return VOS_STATUS_E_FAILURE;
1054 }
1055
1056 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1057 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1058 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1059 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1060 "%s:Ptt response status failed",__func__);
1061 return VOS_STATUS_E_FAILURE;
1062 }
1063 return VOS_STATUS_SUCCESS;
1064}
1065
1066
1067/**---------------------------------------------------------------------------
1068 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1069 <argument> is < 1 | 0 >
1070 1 : Start Tx CW rf generation
1071 0 : Stop Tx CW rf generation
1072 Description
1073 This command starts/stops Tx CW rf generation.
1074--------------------------------------------------------------------------*/
1075static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1076{
1077 uPttMsgs *pMsgBody;
1078 VOS_STATUS status;
1079 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1080
1081 printk(KERN_EMERG "startStop: %02x ", startStop);
1082
1083 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1084 {
1085 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1086 "%s:Ftm has not started. Please start the ftm. ", __func__);
1087 return VOS_STATUS_E_FAILURE;
1088 }
1089
1090 if (startStop != 1 && startStop != 0)
1091 {
1092 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1093 "%s:Tx value is invalid ", __func__);
1094 return VOS_STATUS_E_FAILURE;
1095 }
1096
1097 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1098 (!ftm_status.wfRfGenEnabled && startStop == 0))
1099 {
1100 return VOS_STATUS_SUCCESS;
1101 }
1102
1103 if (pMsgBuf == NULL)
1104 {
1105 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1106 "%s:pMsgBuf is NULL", __func__);
1107 return VOS_STATUS_E_NOMEM;
1108 }
1109 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1110 if (startStop == 1) {
1111 tANI_U16 numSamples = 1;
1112 tANI_BOOLEAN clk80 = TRUE;
1113 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1114
1115 init_completion(&pHddCtx->ftm.ftm_comp_var);
1116 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1117 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1118 pMsgBody = &pMsgBuf->msgBody;
1119
1120 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1121 pMsgBody->SetWaveformRF.numSamples = numSamples;
1122 pMsgBody->SetWaveformRF.clk80 = clk80;
1123 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1124 if (status != VOS_STATUS_SUCCESS) {
1125 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1126 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1127 __func__);
1128 status = VOS_STATUS_E_FAILURE;
1129 goto done;
1130 }
1131 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1132 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1133 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1134 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1135 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1136 status = VOS_STATUS_E_FAILURE;
1137 goto done;
1138 }
1139 } else {
1140 init_completion(&pHddCtx->ftm.ftm_comp_var);
1141 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1142 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1143 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1144 if(status != VOS_STATUS_SUCCESS) {
1145 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1146 "%s:wlan_ftm_postmsg failed", __func__);
1147 status = VOS_STATUS_E_FAILURE;
1148 goto done;
1149 }
1150
1151 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1152 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1153 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1154 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1155 "%s:Ptt response status failed", __func__);
1156 status = VOS_STATUS_E_FAILURE;
1157 }
1158 }
1159done:
1160 if (status == VOS_STATUS_SUCCESS) {
1161 if (startStop == 1)
1162 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1163 else
1164 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1165 }
1166 return status;
1167}
1168
1169
Jeff Johnson295189b2012-06-20 16:38:30 -07001170static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1171{
Jeff Johnson295189b2012-06-20 16:38:30 -07001172 uPttMsgs *pMsgBody;
1173 VOS_STATUS status;
1174 v_U16_t chainSelect_save = chainSelect;
1175 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301176 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001177
1178 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1179 {
1180 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1181 return VOS_STATUS_E_FAILURE;
1182 }
1183
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05301184 if (NULL == pMsgBuf)
1185 {
1186 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1187 "%s:pMsgBuf is NULL", __func__);
1188 return VOS_STATUS_E_NOMEM;
1189 }
1190
Jeff Johnson295189b2012-06-20 16:38:30 -07001191 if (chainSelect > FTM_CHAIN_SEL_MAX)
1192 {
c_hpothuffdb5272013-10-02 16:42:35 +05301193 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1194 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001195 return VOS_STATUS_E_FAILURE;
1196 }
1197
1198 /* do not allow to change setting when tx pktgen is enabled */
1199 if (ftm_status.frameGenEnabled)
1200 {
1201 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1202 return VOS_STATUS_E_FAILURE;
1203 }
1204
1205 switch (chainSelect)
1206 {
1207 case FTM_CHAIN_SEL_NO_RX_TX:
1208 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1209 break;
1210
1211 case FTM_CHAIN_SEL_R0_ON:
1212 chainSelect = PHY_CHAIN_SEL_R0_ON;
1213 break;
1214
1215 case FTM_CHAIN_SEL_T0_ON:
1216 chainSelect = PHY_CHAIN_SEL_T0_ON;
1217 break;
1218 }
1219
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301220 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001221 init_completion(&pHddCtx->ftm.ftm_comp_var);
1222 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1223 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1224
1225 pMsgBody = &pMsgBuf->msgBody;
1226 pMsgBody->EnableChains.chainSelect = chainSelect;
1227
1228 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1229
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301230 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001231 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301232 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1233 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001234 status = VOS_STATUS_E_FAILURE;
1235 goto done;
1236 }
c_hpothuffdb5272013-10-02 16:42:35 +05301237 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301238 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301239 if (0 >= ret)
1240 {
1241 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1242 FL("wait on ftm_comp_var failed %ld"), ret);
1243 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001244
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301245 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001246 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301247 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1248 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001249 status = VOS_STATUS_E_FAILURE;
1250 goto done;
1251 }
1252 ftm_status.chainSelect = chainSelect_save;
1253done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001254
1255 return status;
1256}
1257
1258/**---------------------------------------------------------------------------
1259 --------------------------------------------------------------------------*/
1260static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1261{
1262 int ii;
1263 int lenBuf = WE_FTM_MAX_STR_LEN;
1264 int lenRes = 0;
1265 char *chain[] = {
1266 "None",
1267 "R0,R1",
1268 "R0",
1269 "R1",
1270 "T0",
1271 "R0,R1,T0"
1272 };
1273 char *rx[] = {
1274 "disable",
1275 "11b/g/n",
1276 "11g/n",
1277 "11b"
1278 };
1279 char *tx[] = {
1280 "stopped",
1281 "started",
1282 };
1283 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1284
1285 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1286 {
1287 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1288 return VOS_STATUS_E_FAILURE;
1289 }
1290
1291 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001292 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001293 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1294 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001295 ftm_status.frameParams.interFrameSpace);
1296 if ((lenRes < 0) || (lenRes >= lenBuf))
1297 {
c_hpothuffdb5272013-10-02 16:42:35 +05301298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1299 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001300 return VOS_STATUS_E_FAILURE;
1301 }
1302
1303 buf += lenRes;
1304 lenBuf -= lenRes;
1305
1306 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1307 {
1308 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1309 break;
1310 }
1311
1312 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1313 {
1314 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1315 }
1316 else
1317 {
1318 lenRes = strlcpy(buf, "invalid", lenBuf);
1319 }
1320 if ((lenRes < 0) || (lenRes >= lenBuf))
1321 {
c_hpothuffdb5272013-10-02 16:42:35 +05301322 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1323 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001324 return VOS_STATUS_E_FAILURE;
1325 }
1326
1327 buf += lenRes;
1328 lenBuf -= lenRes;
1329
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301330 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1331 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001332 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001333 ftm_status.frameParams.payloadLength);
1334
1335 if ((lenRes < 0) || (lenRes >= lenBuf))
1336 {
c_hpothuffdb5272013-10-02 16:42:35 +05301337 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1338 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001339 return VOS_STATUS_E_FAILURE;
1340 }
1341
1342 return VOS_STATUS_SUCCESS;
1343}
1344
Jeff Johnson295189b2012-06-20 16:38:30 -07001345
1346void HEXDUMP(char *s0, char *s1, int len)
1347{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301348 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001349 printk(KERN_EMERG "%s\n :", s0);
1350
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301351 if (len > 8)
1352 {
1353 for (j = 0; j < len/8; j++)
1354 {
1355 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1356 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1357 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1358 }
1359 len = len - j*8;
1360 }
1361 for (i = 0; i< len; i++) {
1362 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001363 }
1364 printk("\n");
1365}
1366
Jeff Johnson295189b2012-06-20 16:38:30 -07001367/*---------------------------------------------------------------------------
1368
1369 \brief vos_ftm_preStart() -
1370
1371 The \a vos_ftm_preStart() function to download CFG.
1372 including:
1373 - ccmStart
1374
1375 - WDA: triggers the CFG download
1376
1377
1378 \param pVosContext: The VOS context
1379
1380
1381 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1382 is ready to be used.
1383
1384 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1385 are unavailable to initialize the scheduler
1386
1387
1388 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1389
1390 \sa vos_start
1391
1392---------------------------------------------------------------------------*/
1393VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1394{
1395 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1396 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001397
Jeff Johnson295189b2012-06-20 16:38:30 -07001398 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1399 "vos prestart");
1400
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001401 if (NULL == pVosContext->pWDAContext)
1402 {
1403 VOS_ASSERT(0);
1404 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1405 "%s: WDA NULL context", __func__);
1406 return VOS_STATUS_E_FAILURE;
1407 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001408
1409 /* call macPreStart */
1410 vStatus = macPreStart(pVosContext->pMACContext);
1411 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1412 {
1413 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1414 "Failed at macPreStart ");
1415 return VOS_STATUS_E_FAILURE;
1416 }
1417
1418 /* call ccmStart */
1419 ccmStart(pVosContext->pMACContext);
1420
1421 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001422 vos_event_reset(&pVosContext->wdaCompleteEvent);
1423
Jeff Johnson295189b2012-06-20 16:38:30 -07001424
1425 /*call WDA pre start*/
1426 vStatus = WDA_preStart(pVosContext);
1427 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1428 {
1429 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1430 "Failed to WDA prestart ");
1431 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1432 ccmStop(pVosContext->pMACContext);
1433 VOS_ASSERT(0);
1434 return VOS_STATUS_E_FAILURE;
1435 }
1436
1437 /* Need to update time out of complete */
1438 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1439 if ( vStatus != VOS_STATUS_SUCCESS )
1440 {
1441 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1442 {
1443 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001444 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001445 }
1446 else
1447 {
1448 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001449 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001450 }
1451 VOS_ASSERT( 0 );
1452 return VOS_STATUS_E_FAILURE;
1453 }
1454
1455 return VOS_STATUS_SUCCESS;
1456}
Jeff Johnson295189b2012-06-20 16:38:30 -07001457
1458/**---------------------------------------------------------------------------
1459
1460 \brief wlan_hdd_ftm_open() -
1461
1462 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1463
1464 \param - pAdapter - Pointer HDD Context.
1465
1466 \return - 0 for success, non zero for failure
1467
1468 --------------------------------------------------------------------------*/
1469
1470int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1471{
1472 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1473 pVosContextType pVosContext= NULL;
1474 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001475
Jeff Johnson295189b2012-06-20 16:38:30 -07001476 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1477 "%s: Opening VOSS", __func__);
1478
1479 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1480
1481 if (NULL == pVosContext)
1482 {
1483 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301484 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001485 VOS_ASSERT(0);
1486 goto err_vos_status_failure;
1487 }
1488
1489 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301490 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001491
1492 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1493 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301494 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001495 goto err_vos_status_failure;
1496 }
1497
Jeff Johnson295189b2012-06-20 16:38:30 -07001498 /*
1499 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1500 */
1501 /* Save the hal context in Adapter */
1502 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001503
1504 if ( NULL == pHddCtx->hHal )
1505 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301506 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301507 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001508 }
1509
1510 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1511 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1512 if( NULL == pAdapter )
1513 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301514 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301515 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001516 }
1517
1518 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1519 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301520 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301521 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001522 }
1523
1524 //Initialize the nlink service
1525 if(nl_srv_init() != 0)
1526 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301527 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001528 goto err_ftm_register_wext_close;
1529 }
1530
Leo Chang9e646082013-08-02 11:20:21 -07001531#ifdef WLAN_KD_READY_NOTIFIER
1532 pHddCtx->kd_nl_init = 1;
1533#endif /* WLAN_KD_READY_NOTIFIER */
1534
Jeff Johnson295189b2012-06-20 16:38:30 -07001535#ifdef PTT_SOCK_SVC_ENABLE
1536 //Initialize the PTT service
1537 if(ptt_sock_activate_svc(pHddCtx) != 0)
1538 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301539 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001540 goto err_nl_srv_init;
1541 }
1542#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001543
Jeff Johnson295189b2012-06-20 16:38:30 -07001544 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1545 pHddCtx->ftm.targetNVTableSize = 0;
1546 pHddCtx->ftm.targetNVTablePointer = NULL;
1547 pHddCtx->ftm.processedNVTableSize = 0;
1548 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1549 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1550 {
1551 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301552 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001553 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001554 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001555 }
1556 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001557
1558 _ftm_status_init();
1559 /* Initialize the ftm vos event */
1560 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1561 {
1562 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301563 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001564 VOS_ASSERT(0);
1565 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1566 goto err_nl_srv_init;
1567 }
1568
1569 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1570
1571 return VOS_STATUS_SUCCESS;
1572
1573err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001574#ifdef WLAN_KD_READY_NOTIFIER
1575nl_srv_exit(pHddCtx->ptt_pid);
1576#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001577nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001578#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001579err_ftm_register_wext_close:
1580hdd_UnregisterWext(pAdapter->dev);
1581
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301582err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001583err_adapter_open_failure:
1584hdd_close_all_adapters( pHddCtx );
1585
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301586err_ftm_vos_close:
1587 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001588err_vos_status_failure:
1589
1590 return VOS_STATUS_E_FAILURE;
1591}
1592
1593
1594
1595int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1596{
1597 VOS_STATUS vosStatus;
1598 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1599
1600 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1601 ENTER();
1602 if(pAdapter == NULL)
1603 {
1604 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1605 return VOS_STATUS_E_NOMEM;
1606 }
1607
Atul Mittalc41126d2014-03-17 15:10:11 +05301608 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1609 if (pHddCtx->ftm.IsCmdPending == TRUE)
1610 {
1611 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1612 {
1613 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1614 "%s: vos_event_set failed", __func__);
1615 }
1616 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001617 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1618 {
1619 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1620 "%s: Ftm has been started. stopping ftm", __func__);
1621 wlan_ftm_stop(pHddCtx);
1622 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001623
Leo Chang59cdc7e2013-07-10 10:08:21 -07001624#ifdef WLAN_KD_READY_NOTIFIER
1625 nl_srv_exit(pHddCtx->ptt_pid);
1626#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001627 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001628#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001629 //TODO----------
1630 //Deregister the device with the kernel
1631 hdd_UnregisterWext(pAdapter->dev);
1632
1633 hdd_close_all_adapters( pHddCtx );
1634#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001635 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001636 {
1637 unregister_netdev(pAdapter->dev);
1638 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1639 }
1640#endif
1641 //-----------------
1642
1643 vosStatus = vos_sched_close( vosContext );
1644 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1645 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1646 "%s: Failed to close VOSS Scheduler",__func__);
1647 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1648 }
1649
1650 //Close VOSS
1651 wlan_ftm_vos_close(vosContext);
1652
1653
1654 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1655 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1656 {
1657 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1658 "%s: Failed to destroy ftm_vos Event",__func__);
1659 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1660 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001661 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001662
Jeff Johnson295189b2012-06-20 16:38:30 -07001663 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001664}
1665
1666/**---------------------------------------------------------------------------
1667
1668 \brief wlan_ftm_send_response() -
1669
1670 The function sends the response to the ptt socket application running in user space.
1671
1672 \param - pAdapter - Pointer HDD Context.
1673
1674 \return - 0 for success, non zero for failure
1675
1676 --------------------------------------------------------------------------*/
1677
1678static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1679
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301680 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1681 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001682
Arif Hussain6d2a3322013-11-17 19:50:10 -08001683 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 -07001684 return VOS_STATUS_E_FAILURE;
1685 }
1686 return VOS_STATUS_SUCCESS;
1687}
1688
1689/**---------------------------------------------------------------------------
1690
1691 \brief wlan_hdd_ftm_start() -
1692
1693 This function gets called when the FTM start commands received from the ptt socket application and
1694 it starts the following modules.
1695 1) SAL Start.
1696 2) BAL Start.
1697 3) MAC Start to download the firmware.
1698
1699
1700 \param - pAdapter - Pointer HDD Context.
1701
1702 \return - 0 for success, non zero for failure
1703
1704 --------------------------------------------------------------------------*/
1705
1706static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1707{
1708 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1709 tSirRetStatus sirStatus = eSIR_SUCCESS;
1710 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1711 tHalMacStartParameters halStartParams;
1712
1713 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1714 {
1715 return VOS_STATUS_SUCCESS;
1716 }
1717
1718 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1719 "%s: Starting Libra SW", __func__);
1720
1721 /* We support only one instance for now ...*/
1722 if (pVosContext == NULL)
1723 {
1724 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001725 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001726 goto err_status_failure;
1727 }
1728
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001729
Jeff Johnson295189b2012-06-20 16:38:30 -07001730 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001731 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001732 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001733 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001734 goto err_status_failure;
1735 }
1736
Jeff Johnson295189b2012-06-20 16:38:30 -07001737 /*
1738 Prima needs to start the WDA correctly instead of BAL and SAL
1739 */
1740
1741 /* Vos preStart is calling */
1742 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1743 {
1744 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1745 goto err_status_failure;
1746 }
1747
1748
1749 vStatus = WDA_NVDownload_Start(pVosContext);
1750
1751 if ( vStatus != VOS_STATUS_SUCCESS )
1752 {
1753 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1754 "%s: Failed to start NV Download",__func__);
1755 return VOS_STATUS_E_FAILURE;
1756 }
1757
Anand N Sunkadb94bc5f2014-10-06 16:40:01 +05301758 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000 * 30);
Jeff Johnson295189b2012-06-20 16:38:30 -07001759
1760 if ( vStatus != VOS_STATUS_SUCCESS )
1761 {
1762 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1763 {
1764 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001765 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001766 }
1767 else
1768 {
1769 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001770 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001771 }
1772 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301773 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001774 }
1775
1776 vStatus = WDA_start(pVosContext);
1777 if (vStatus != VOS_STATUS_SUCCESS)
1778 {
1779 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1780 "%s: Failed to start WDA",__func__);
1781 goto err_status_failure;
1782 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001783
Jeff Johnson295189b2012-06-20 16:38:30 -07001784
1785 /* Start the MAC */
1786 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1787
Jeff Johnson295189b2012-06-20 16:38:30 -07001788
1789 halStartParams.driverType = eDRIVER_TYPE_MFG;
1790
1791 /* Start the MAC */
1792 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1793
Jeff Johnson295189b2012-06-20 16:38:30 -07001794
1795 if (eSIR_SUCCESS != sirStatus)
1796 {
1797 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1798 "%s: Failed to start MAC", __func__);
1799
Jeff Johnson295189b2012-06-20 16:38:30 -07001800 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001801 }
1802
1803 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1804 "%s: MAC correctly started",__func__);
1805
Jeff Johnson295189b2012-06-20 16:38:30 -07001806
1807 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1808
1809 return VOS_STATUS_SUCCESS;
1810
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001811err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001812 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1813 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1814 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1815 if(vStatus != VOS_STATUS_SUCCESS)
1816 {
1817 if(vStatus == VOS_STATUS_E_TIMEOUT)
1818 {
1819 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001820 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001821
1822 }
1823 else
1824 {
1825 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001826 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001827 }
1828 VOS_ASSERT(0);
1829 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001830
1831err_status_failure:
1832
1833 return VOS_STATUS_E_FAILURE;
1834
1835}
1836
1837
1838static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1839{
1840 VOS_STATUS vosStatus;
1841
1842 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1843 {
1844 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1845 return VOS_STATUS_E_FAILURE;
1846 }
1847
1848 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1849 {
1850 /* STOP MAC only */
1851 v_VOID_t *hHal;
1852 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1853 if (NULL == hHal)
1854 {
1855 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1856 "%s: NULL hHal", __func__);
1857 }
1858 else
1859 {
1860 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1861 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1862 {
1863 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1864 "%s: Failed to stop SYS", __func__);
1865 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1866 }
1867 }
1868
Jeff Johnson295189b2012-06-20 16:38:30 -07001869
Jeff Johnson295189b2012-06-20 16:38:30 -07001870 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001871
1872 }
1873 return WLAN_FTM_SUCCESS;
1874}
1875
Jeff Johnson295189b2012-06-20 16:38:30 -07001876/**---------------------------------------------------------------------------
1877
1878 \brief wlan_hdd_ftm_get_nv_table() -
1879 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001880 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001881
1882 \param - ftmCmd - Pointer FTM Commad Buffer
1883
1884 \return - int
1885 -1, Process Host command fail, vail out
1886 1, Process Host command success
1887
1888 --------------------------------------------------------------------------*/
1889int wlan_hdd_ftm_get_nv_table
1890(
1891 hdd_context_t *pHddCtx,
1892 tPttMsgbuffer *ftmCmd
1893)
1894{
1895 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1896 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1897 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001898 sHalNvV2 *nvContents = NULL;
1899 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001900
Jeff Johnson295189b2012-06-20 16:38:30 -07001901 if (NULL == pHddCtx)
1902 {
1903 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1904 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001905 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001906 }
1907
Leo Chang80de3c22013-11-26 10:52:12 -08001908 nvVersion = vos_nv_getNvVersion();
1909 if (E_NV_V2 != nvVersion)
1910 {
1911 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1912 "%s : Not valid NV Version %d", __func__, nvVersion);
1913 return -EINVAL;
1914 }
1915
Jeff Johnson295189b2012-06-20 16:38:30 -07001916 /* Test first chunk of NV table */
1917 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1918 (0 == pHddCtx->ftm.processedNVTableSize))
1919 {
1920 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1921 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1922 {
c_hpothuffdb5272013-10-02 16:42:35 +05301923 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1924 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001925 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001926 }
1927
1928 switch (nvTable->nvTable)
1929 {
1930 case NV_TABLE_RATE_POWER_SETTINGS:
1931 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1932 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1933 break;
1934
1935 case NV_TABLE_REGULATORY_DOMAINS:
1936 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1937 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1938 break;
1939
1940 case NV_TABLE_DEFAULT_COUNTRY:
1941 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1942 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1943 break;
1944
1945 case NV_TABLE_TPC_POWER_TABLE:
1946 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1947 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1948 break;
1949
1950 case NV_TABLE_TPC_PDADC_OFFSETS:
1951 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1952 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1953 break;
1954
1955 case NV_TABLE_VIRTUAL_RATE:
1956 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1957 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1958 break;
1959
1960 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1961 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1962 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1963 break;
1964
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001965 case NV_TABLE_HW_CAL_VALUES:
1966 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1967 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1968 break;
1969
1970 case NV_TABLE_FW_CONFIG:
1971 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1972 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001973 break;
1974
1975 case NV_TABLE_ANTENNA_PATH_LOSS:
1976 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
1977 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
1978 break;
1979
1980 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
1981 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
1982 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
1983 break;
1984
1985 default:
1986 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1987 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001988 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001989 break;
1990 }
1991
1992 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
1993 {
1994 /* Invalid table size, discard and initialize data */
1995 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001996 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08001997 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001998 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07001999 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2000 pHddCtx->ftm.targetNVTableSize = 0;
2001 pHddCtx->ftm.processedNVTableSize = 0;
2002 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002003 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002004 }
2005
2006 /* Set Current Processing NV table type */
2007 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2008 /* Copy target NV table value into temp context buffer */
2009 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2010 pHddCtx->ftm.targetNVTablePointer,
2011 pHddCtx->ftm.targetNVTableSize);
2012
2013 }
2014
2015 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2016 {
2017 /* Invalid table type */
2018 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2019 "Invalid NV Table, now Processing %d, not %d",
2020 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2021 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2022 pHddCtx->ftm.targetNVTableSize = 0;
2023 pHddCtx->ftm.processedNVTableSize = 0;
2024 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002025
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002026 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002027 }
2028
2029 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002030 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002031 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2032 nvTable->chunkSize);
2033 /* Update processed pointer to prepare next chunk copy */
2034 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2035
2036 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2037 {
2038 /* Finished to process last chunk of data, initialize buffer */
2039 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2040 pHddCtx->ftm.targetNVTableSize = 0;
2041 pHddCtx->ftm.processedNVTableSize = 0;
2042 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2043 }
2044
2045 return 1;
2046}
2047
2048/**---------------------------------------------------------------------------
2049
2050 \brief wlan_hdd_ftm_set_nv_table() -
2051 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002052 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002053
2054 \param - ftmCmd - Pointer FTM Commad Buffer
2055
2056 \return - int
2057 -1, Process Host command fail, vail out
2058 1, Process Host command success
2059
2060 --------------------------------------------------------------------------*/
2061int wlan_hdd_ftm_set_nv_table
2062(
2063 hdd_context_t *pHddCtx,
2064 tPttMsgbuffer *ftmCmd
2065)
2066{
2067 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2068 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2069 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002070 sHalNvV2 *nvContents = NULL;
2071 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002072
2073 if (NULL == pHddCtx)
2074 {
2075 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2076 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002077 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002078 }
2079
Leo Chang80de3c22013-11-26 10:52:12 -08002080 nvVersion = vos_nv_getNvVersion();
2081 if (E_NV_V2 != nvVersion)
2082 {
2083 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2084 "%s : Not valid NV Version %d", __func__, nvVersion);
2085 return -EINVAL;
2086 }
2087
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 /* Test first chunk of NV table */
2089 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2090 (0 == pHddCtx->ftm.processedNVTableSize))
2091 {
2092 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2093 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2094 {
c_hpothuffdb5272013-10-02 16:42:35 +05302095 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2096 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002097 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002098 }
2099
2100 switch (nvTable->nvTable)
2101 {
2102 case NV_TABLE_RATE_POWER_SETTINGS:
2103 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2104 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2105 break;
2106
2107 case NV_TABLE_REGULATORY_DOMAINS:
2108 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2109 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2110 break;
2111
2112 case NV_TABLE_DEFAULT_COUNTRY:
2113 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2114 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2115 break;
2116
2117 case NV_TABLE_TPC_POWER_TABLE:
2118 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2119 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2120 break;
2121
2122 case NV_TABLE_TPC_PDADC_OFFSETS:
2123 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2124 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2125 break;
2126
2127 case NV_TABLE_VIRTUAL_RATE:
2128 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2129 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2130 break;
2131
2132 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2133 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2134 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2135 break;
2136
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002137 case NV_TABLE_HW_CAL_VALUES:
2138 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2139 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2140 break;
2141
2142 case NV_TABLE_FW_CONFIG:
2143 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2144 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002145 break;
2146
2147 case NV_TABLE_ANTENNA_PATH_LOSS:
2148 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2149 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2150 break;
2151
2152 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2153 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2154 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2155 break;
2156
2157 default:
2158 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2159 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002160 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002161 break;
2162 }
2163
2164 /* Set Current Processing NV table type */
2165 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2166 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2167 {
2168 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2169 "Invalid Table Size %d", nvTable->tableSize);
2170 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2171 pHddCtx->ftm.targetNVTableSize = 0;
2172 pHddCtx->ftm.processedNVTableSize = 0;
2173 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002174 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002175 }
2176 }
2177
2178 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2179 {
2180 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2181 "Invalid NV Table, now Processing %d, not %d",
2182 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2183 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2184 pHddCtx->ftm.targetNVTableSize = 0;
2185 pHddCtx->ftm.processedNVTableSize = 0;
2186 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002187 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002188 }
2189 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002190 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002191 nvTable->chunkSize);
2192
2193 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2194 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2195 {
2196 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2197 pHddCtx->ftm.tempNVTableBuffer,
2198 pHddCtx->ftm.targetNVTableSize);
2199 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2200 pHddCtx->ftm.targetNVTableSize = 0;
2201 pHddCtx->ftm.processedNVTableSize = 0;
2202 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2203 }
2204
2205 return 1;
2206}
2207
2208/**---------------------------------------------------------------------------
2209
2210 \brief wlan_hdd_ftm_blank_nv() -
2211 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002212 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002213
2214 \param - ftmCmd - Pointer FTM Commad Buffer
2215
2216 \return - int
2217 -1, Process Host command fail, vail out
2218 0, Process Host command success
2219
2220 --------------------------------------------------------------------------*/
2221int wlan_hdd_ftm_blank_nv_table
2222(
2223 tPttMsgbuffer *ftmCmd
2224)
2225{
Leo Chang80de3c22013-11-26 10:52:12 -08002226 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002227 v_SIZE_t nvSize;
2228 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002229 sHalNvV2 *nvContents = NULL;
2230 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002231
2232 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2233 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2234 {
c_hpothuffdb5272013-10-02 16:42:35 +05302235 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2236 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002237 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002238 }
2239
Leo Chang80de3c22013-11-26 10:52:12 -08002240 nvVersion = vos_nv_getNvVersion();
2241 if (E_NV_V2 != nvVersion)
2242 {
2243 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2244 "%s : Not valid NV Version %d", __func__, nvVersion);
2245 return -EINVAL;
2246 }
2247
Jeff Johnson295189b2012-06-20 16:38:30 -07002248 itemSize = sizeof(nvContents->tables.pwrOptimum);
2249 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002250 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002251 itemSize);
2252
2253 itemSize = sizeof(nvContents->tables.regDomains);
2254 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002255 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002256 itemSize);
2257
2258 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2259 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002260 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002261 itemSize);
2262
2263 itemSize = sizeof(nvContents->tables.plutCharacterized);
2264 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002265 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002266 itemSize);
2267
2268 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2269 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002270 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002271 itemSize);
2272
2273 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2274 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002275 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002276 itemSize);
2277
2278 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2279 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002280 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002281 itemSize);
2282
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002283 itemSize = sizeof(nvContents->tables.hwCalValues);
2284 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002285 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002286 itemSize);
2287
2288 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2289 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002290 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002291 itemSize);
2292
2293 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2294 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002295 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002296 itemSize);
2297
2298 return 1;
2299}
2300
2301/**---------------------------------------------------------------------------
2302
2303 \brief wlan_hdd_ftm_delete_nv_table() -
2304 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002305 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002306
2307 \param - ftmCmd - Pointer FTM Commad Buffer
2308
2309 \return - int
2310 -1, Process Host command fail, vail out
2311 1, Process Host command success
2312
2313 --------------------------------------------------------------------------*/
2314int wlan_hdd_ftm_delete_nv_table
2315(
2316 tPttMsgbuffer *ftmCmd
2317)
2318{
Leo Chang80de3c22013-11-26 10:52:12 -08002319 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002320 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2321 v_SIZE_t nvSize;
2322 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002323 sHalNvV2 *nvContents = NULL;
2324 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002325
2326 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2327 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2328 {
c_hpothuffdb5272013-10-02 16:42:35 +05302329 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2330 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002331 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002332 }
2333
Leo Chang80de3c22013-11-26 10:52:12 -08002334 nvVersion = vos_nv_getNvVersion();
2335 if (E_NV_V2 != nvVersion)
2336 {
2337 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2338 "%s : Not valid NV Version %d", __func__, nvVersion);
2339 return -EINVAL;
2340 }
2341
Jeff Johnson295189b2012-06-20 16:38:30 -07002342 switch (nvTable->nvTable)
2343 {
2344 case NV_TABLE_RATE_POWER_SETTINGS:
2345 itemSize = sizeof(nvContents->tables.pwrOptimum);
2346 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002347 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002348 itemSize);
2349 break;
2350
2351 case NV_TABLE_REGULATORY_DOMAINS:
2352 itemSize = sizeof(nvContents->tables.regDomains);
2353 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002354 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002355 itemSize);
2356 break;
2357
2358 case NV_TABLE_DEFAULT_COUNTRY:
2359 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2360 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002361 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002362 itemSize);
2363 break;
2364
2365 case NV_TABLE_TPC_POWER_TABLE:
2366 itemSize = sizeof(nvContents->tables.plutCharacterized);
2367 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002368 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002369 itemSize);
2370 break;
2371
2372 case NV_TABLE_TPC_PDADC_OFFSETS:
2373 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2374 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002375 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002376 itemSize);
2377 break;
2378
2379 case NV_TABLE_VIRTUAL_RATE:
2380 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2381 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002382 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002383 itemSize);
2384 break;
2385
2386 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2387 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2388 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002389 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002390 itemSize);
2391 break;
2392
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002393 case NV_TABLE_HW_CAL_VALUES:
2394 itemSize = sizeof(nvContents->tables.hwCalValues);
2395 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002396 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002397 itemSize);
2398 break;
2399
2400 case NV_TABLE_FW_CONFIG:
2401 itemSize = sizeof(nvContents->tables.fwConfig);
2402 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002403 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002404 itemSize);
2405 break;
2406
2407 case NV_TABLE_ANTENNA_PATH_LOSS:
2408 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2409 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002410 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002411 itemSize);
2412 break;
2413
2414 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2415 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2416 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002417 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002418 itemSize);
2419 break;
2420
2421 default:
2422 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2423 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002424 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002425 break;
2426 }
2427
2428 return 1;
2429}
2430
2431/**---------------------------------------------------------------------------
2432
2433 \brief wlan_hdd_ftm_get_nv_field() -
2434 Get Specific NV field
2435
2436 \param - ftmCmd - Pointer FTM Commad Buffer
2437
2438 \return - int
2439 -1, Process Host command fail, vail out
2440 1, Process Host command success
2441
2442 --------------------------------------------------------------------------*/
2443int wlan_hdd_ftm_get_nv_field
2444(
2445 tPttMsgbuffer *ftmCmd
2446)
2447{
2448 sNvFields nvFieldDataBuffer;
2449 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2450 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2451 sHalNv *nvContents = NULL;
2452 v_SIZE_t nvSize;
2453
2454 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2455 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2456 {
c_hpothuffdb5272013-10-02 16:42:35 +05302457 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2458 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002459 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002460 }
2461 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2462
2463 switch (nvField->nvField)
2464 {
2465 case NV_COMMON_PRODUCT_ID:
2466 memcpy((void *)&nvField->fieldData,
2467 &nvFieldDataBuffer.productId,
2468 sizeof(nvFieldDataBuffer.productId));
2469 break;
2470
2471 case NV_COMMON_PRODUCT_BANDS:
2472 memcpy((void *)&nvField->fieldData,
2473 &nvFieldDataBuffer.productBands,
2474 sizeof(nvFieldDataBuffer.productBands));
2475 break;
2476
2477 case NV_COMMON_NUM_OF_TX_CHAINS:
2478 memcpy((void *)&nvField->fieldData,
2479 &nvFieldDataBuffer.numOfTxChains,
2480 sizeof(nvFieldDataBuffer.numOfTxChains));
2481 break;
2482
2483 case NV_COMMON_NUM_OF_RX_CHAINS:
2484 memcpy((void *)&nvField->fieldData,
2485 &nvFieldDataBuffer.numOfRxChains,
2486 sizeof(nvFieldDataBuffer.numOfRxChains));
2487 break;
2488
2489 case NV_COMMON_MAC_ADDR:
2490 memcpy((void *)&nvField->fieldData,
2491 &nvFieldDataBuffer.macAddr[0],
2492 NV_FIELD_MAC_ADDR_SIZE);
2493 break;
2494
2495 case NV_COMMON_MFG_SERIAL_NUMBER:
2496 memcpy((void *)&nvField->fieldData,
2497 &nvFieldDataBuffer.mfgSN[0],
2498 NV_FIELD_MFG_SN_SIZE);
2499 break;
2500
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002501 case NV_COMMON_WLAN_NV_REV_ID:
2502 memcpy((void *)&nvField->fieldData,
2503 &nvFieldDataBuffer.wlanNvRevId,
2504 sizeof(nvFieldDataBuffer.wlanNvRevId));
2505 break;
2506
Jeff Johnson295189b2012-06-20 16:38:30 -07002507 case NV_COMMON_COUPLER_TYPE:
2508 memcpy((void *)&nvField->fieldData,
2509 &nvFieldDataBuffer.couplerType,
2510 sizeof(nvFieldDataBuffer.couplerType));
2511 break;
2512
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002513 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002514 {
2515 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2516 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2517
2518 nvEmbededStatus = vos_nv_isEmbeddedNV();
2519
2520 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2521 {
2522 // High bit is set to indicate embedded NV..
2523 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2524 }
2525
2526 memcpy((void *)&nvField->fieldData,
2527 &nvVersion,
2528 sizeof(nvFieldDataBuffer.nvVersion));
2529 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002530 break;
2531
Jeff Johnson295189b2012-06-20 16:38:30 -07002532 default:
2533 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2534 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002535 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002536 break;
2537 }
2538
2539 return 1;
2540}
2541
2542/**---------------------------------------------------------------------------
2543
2544 \brief wlan_hdd_ftm_set_nv_field() -
2545 Set Specific NV field
2546
2547 \param - ftmCmd - Pointer FTM Commad Buffer
2548
2549 \return - int
2550 -1, Process Host command fail, vail out
2551 1, Process Host command success
2552
2553 --------------------------------------------------------------------------*/
2554int wlan_hdd_ftm_set_nv_field
2555(
2556 tPttMsgbuffer *ftmCmd
2557)
2558{
2559 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2560 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2561 v_SIZE_t nvSize;
2562 sHalNv *nvContents = NULL;
2563 v_U8_t macLoop;
2564 v_U8_t *pNVMac;
2565 v_U8_t lastByteMAC;
2566
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002567
Jeff Johnson295189b2012-06-20 16:38:30 -07002568 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2569 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2570 {
c_hpothuffdb5272013-10-02 16:42:35 +05302571 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2572 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002573 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002574 }
2575
2576 switch (nvField->nvField)
2577 {
2578 case NV_COMMON_PRODUCT_ID:
2579 memcpy(&nvContents->fields.productId,
2580 &nvField->fieldData,
2581 sizeof(nvContents->fields.productId));
2582 break;
2583
2584 case NV_COMMON_PRODUCT_BANDS:
2585 memcpy(&nvContents->fields.productBands,
2586 &nvField->fieldData,
2587 sizeof(nvContents->fields.productBands));
2588 break;
2589
2590 case NV_COMMON_NUM_OF_TX_CHAINS:
2591 memcpy(&nvContents->fields.numOfTxChains,
2592 &nvField->fieldData,
2593 sizeof(nvContents->fields.numOfTxChains));
2594 break;
2595
2596 case NV_COMMON_NUM_OF_RX_CHAINS:
2597 memcpy(&nvContents->fields.numOfRxChains,
2598 &nvField->fieldData,
2599 sizeof(nvContents->fields.numOfRxChains));
2600 break;
2601
2602 case NV_COMMON_MAC_ADDR:
2603 /* If Last byte is larger than 252 (0xFC), return Error,
2604 * Since 3MACs should be derived from first MAC */
2605 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002606 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002607 {
2608 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2609 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002610 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002611 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002612 }
2613
2614 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002615 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002616 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2617 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002618 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002619 lastByteMAC + macLoop;
2620 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002621 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002622 NV_FIELD_MAC_ADDR_SIZE);
2623 }
2624 break;
2625
2626 case NV_COMMON_MFG_SERIAL_NUMBER:
2627 memcpy(&nvContents->fields.mfgSN[0],
2628 &nvField->fieldData,
2629 NV_FIELD_MFG_SN_SIZE);
2630 break;
2631
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002632 case NV_COMMON_WLAN_NV_REV_ID:
2633 memcpy(&nvContents->fields.wlanNvRevId,
2634 &nvField->fieldData,
2635 sizeof(nvContents->fields.wlanNvRevId));
2636 break;
2637
Jeff Johnson295189b2012-06-20 16:38:30 -07002638 case NV_COMMON_COUPLER_TYPE:
2639 memcpy(&nvContents->fields.couplerType,
2640 &nvField->fieldData,
2641 sizeof(nvContents->fields.couplerType));
2642 break;
2643
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002644 case NV_COMMON_NV_VERSION:
2645 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2646 "Cannot modify NV version field %d", nvField->nvField);
2647 return -EIO;
2648 break;
2649
Jeff Johnson295189b2012-06-20 16:38:30 -07002650 default:
2651 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2652 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002653 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002654 break;
2655 }
2656
2657 return 1;
2658}
2659
2660/**---------------------------------------------------------------------------
2661
2662 \brief wlan_hdd_ftm_store_nv_table() -
2663 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002664 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002665
2666 \param - ftmCmd - Pointer FTM Commad Buffer
2667
2668 \return - int
2669 -1, Process Host command fail, vail out
2670 0, Process Host command success
2671
2672 --------------------------------------------------------------------------*/
2673int wlan_hdd_ftm_store_nv_table
2674(
2675 tPttMsgbuffer *ftmCmd
2676)
2677{
2678 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2679 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002680 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2681 void *tablePtr = NULL;
2682 unsigned int tableSize = 0;
2683 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002684 sHalNvV2 *nvContents = NULL;
2685 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002686
2687 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2688 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2689 {
c_hpothuffdb5272013-10-02 16:42:35 +05302690 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2691 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002692 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002693 }
2694
Leo Chang80de3c22013-11-26 10:52:12 -08002695 nvVersion = vos_nv_getNvVersion();
2696 if (E_NV_V2 != nvVersion)
2697 {
2698 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2699 "%s : Not valid NV Version %d", __func__, nvVersion);
2700 return -EINVAL;
2701 }
2702
Jeff Johnson295189b2012-06-20 16:38:30 -07002703 /* Set Platform type as PRIMA */
2704 nvContents->fields.wlanNvRevId = 2;
2705
2706 switch(nvTable->nvTable)
2707 {
2708 case NV_FIELDS_IMAGE:
2709 tablePtr = (void *)&nvContents->fields;
2710 tableSize = sizeof(nvContents->fields);
2711 tableVNVType = VNV_FIELD_IMAGE;
2712 break;
2713
2714 case NV_TABLE_RATE_POWER_SETTINGS:
2715 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2716 tableSize = sizeof(nvContents->tables.pwrOptimum);
2717 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2718 break;
2719
2720 case NV_TABLE_REGULATORY_DOMAINS:
2721 tablePtr = (void *)&nvContents->tables.regDomains[0];
2722 tableSize = sizeof(nvContents->tables.regDomains);
2723 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2724 break;
2725
2726 case NV_TABLE_DEFAULT_COUNTRY:
2727 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2728 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2729 tableVNVType = VNV_DEFAULT_LOCATION;
2730 break;
2731
2732 case NV_TABLE_TPC_POWER_TABLE:
2733 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2734 tableSize = sizeof(nvContents->tables.plutCharacterized);
2735 tableVNVType = VNV_TPC_POWER_TABLE;
2736 break;
2737
2738 case NV_TABLE_TPC_PDADC_OFFSETS:
2739 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2740 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2741 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2742 break;
2743
2744 case NV_TABLE_VIRTUAL_RATE:
2745 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2746 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2747 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2748 break;
2749
2750 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2751 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2752 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2753 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2754 break;
2755
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002756 case NV_TABLE_HW_CAL_VALUES:
2757 tablePtr = (void *)&nvContents->tables.hwCalValues;
2758 tableSize = sizeof(nvContents->tables.hwCalValues);
2759 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002760 break;
2761
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002762 case NV_TABLE_FW_CONFIG:
2763 tablePtr = (void *)&nvContents->tables.fwConfig;
2764 tableSize = sizeof(nvContents->tables.fwConfig);
2765 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002766 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002767
Jeff Johnson295189b2012-06-20 16:38:30 -07002768 case NV_TABLE_ANTENNA_PATH_LOSS:
2769 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2770 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2771 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2772 break;
2773
2774 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2775 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2776 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2777 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2778 break;
2779
2780 default:
2781 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2782 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002783 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002784 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002785
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 }
2787
2788 nvStatus = vos_nv_write(tableVNVType,
2789 tablePtr,
2790 tableSize);
2791 if(VOS_STATUS_SUCCESS != nvStatus)
2792 {
c_hpothuffdb5272013-10-02 16:42:35 +05302793 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2794 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002795 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002796 }
2797
2798 return 1;
2799}
2800
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002801/* --------------------------------------------------------------------------
2802 \brief wlan_hdd_ftm_get_nv_bin() -
2803 Get NV bin read from Flash Memory, file
2804
2805 \param - ftmCmd - Pointer FTM Commad Buffer
2806
2807 \return - int
2808 -1, Process Host command fail, vail out
2809 0, Process Host command success
2810--------------------------------------------------------------------------*/
2811
2812static int wlan_hdd_ftm_get_nv_bin
2813(
2814 v_U16_t msgId,
2815 hdd_context_t *pHddCtx,
2816 tPttMsgbuffer *ftmCmd
2817)
2818{
2819 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2820 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2821 v_SIZE_t nvSize;
2822 v_U8_t *nvContents;
2823 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002824 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002825
Leo Chang80de3c22013-11-26 10:52:12 -08002826 nvVersion = vos_nv_getNvVersion();
2827 if (E_NV_V3 != nvVersion)
2828 {
2829 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2830 "%s : Not valid NV Version %d", __func__, nvVersion);
2831 return -EINVAL;
2832 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002833
2834 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2835 (0 == pHddCtx->ftm.processedNVTableSize))
2836 {
2837 if ( msgId == PTT_MSG_GET_NV_BIN )
2838 {
2839 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2840 }
2841 else
2842 {
2843 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2844 }
2845
2846 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2847 {
c_hpothuffdb5272013-10-02 16:42:35 +05302848 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2849 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002850 return -EIO;
2851 }
2852
2853 switch (nvTable->nvTable)
2854 {
2855 case NV_BINARY_IMAGE:
2856 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2857 break;
2858 default:
2859 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2860 "Not Valid NV Table %d", nvTable->nvTable);
2861 return -EIO;
2862 break;
2863 }
2864
2865 /* Set Current Processing NV table type */
2866 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2867 if ( msgId == PTT_MSG_GET_NV_BIN )
2868 {
2869 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2870 /* Validity Period */
2871 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2872 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2873 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2874 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2875 offset = sizeof(v_U32_t);
2876 }
2877 else
2878 {
2879 pHddCtx->ftm.targetNVTableSize = nvSize;
2880 offset = 0;
2881 }
2882
2883 /* Copy target NV table value into temp context buffer */
2884 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2885 pHddCtx->ftm.targetNVTablePointer,
2886 pHddCtx->ftm.targetNVTableSize);
2887 }
2888
2889
2890 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2891 {
2892 /* Invalid table type */
2893 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2894 "Invalid NV Table, now Processing %d, not %d",
2895 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2896
2897 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2898 pHddCtx->ftm.targetNVTableSize = 0;
2899 pHddCtx->ftm.processedNVTableSize = 0;
2900 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2901
2902 return -EINVAL;
2903 }
2904
2905 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2906
2907 /* Update processed pointer to prepare next chunk copy */
2908 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2909 pHddCtx->ftm.targetNVTableSize )
2910 {
2911 nvTable->chunkSize =
2912 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2913 }
2914
2915 /* Copy next chunk of NV table value into response buffer */
2916 vos_mem_copy(
2917 &nvTable->tableData,
2918 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2919 nvTable->chunkSize);
2920
2921 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2922
2923 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2924 {
2925 /* Finished to process last chunk of data, initialize buffer */
2926 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2927 pHddCtx->ftm.targetNVTableSize = 0;
2928 pHddCtx->ftm.processedNVTableSize = 0;
2929 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2930 }
2931
2932 return 1;
2933}
2934
2935/**---------------------------------------------------------------------------
2936
2937 \brief wlan_hdd_ftm_set_nv_bin() -
2938 Set NV bin to Flash Memory, file
2939
2940 \param - ftmCmd - Pointer FTM Commad Buffer
2941
2942 \return - int
2943 -1, Process Host command fail, vail out
2944 0, Process Host command success
2945
2946+----------------------------------------------------------------------------*/
2947
2948static int wlan_hdd_ftm_set_nv_bin
2949(
2950 hdd_context_t *pHddCtx,
2951 tPttMsgbuffer *ftmCmd
2952)
2953{
2954 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2955 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002956 eNvVersionType nvVersion;
2957
2958 nvVersion = vos_nv_getNvVersion();
2959 if (E_NV_V3 != nvVersion)
2960 {
2961 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2962 "%s : Not valid NV Version %d", __func__, nvVersion);
2963 return -EINVAL;
2964 }
2965
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002966
2967 /* Test first chunk of NV table */
2968 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2969 (0 == pHddCtx->ftm.processedNVTableSize))
2970 {
2971 switch (nvTable->nvTable)
2972 {
2973 case NV_BINARY_IMAGE:
2974 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2975 break;
2976 default:
2977 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2978 "Not Valid NV Table %d", nvTable->nvTable);
2979 return -EIO;
2980 break;
2981 }
2982
2983 /* Set Current Processing NV table type */
2984 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2985 pHddCtx->ftm.processedNVTableSize = 0;
2986
2987 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2988 {
2989 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2990 "Invalid Table Size %d", nvTable->tableSize);
2991 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2992 pHddCtx->ftm.targetNVTableSize = 0;
2993 pHddCtx->ftm.processedNVTableSize = 0;
2994 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2995 return -EINVAL;
2996 }
2997 }
2998
2999 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3000 {
3001 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3002 "Invalid NV Table, now Processing %d, not %d",
3003 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3004 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3005 pHddCtx->ftm.targetNVTableSize = 0;
3006 pHddCtx->ftm.processedNVTableSize = 0;
3007 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3008 return -EINVAL;
3009 }
3010
3011 vos_mem_copy(
3012 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3013 &nvTable->tableData,
3014 nvTable->chunkSize);
3015
3016 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3017
3018 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3019 {
3020 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3021 "Processing Done!! write encoded Buffer %d",
3022 pHddCtx->ftm.targetNVTableSize);
3023
3024 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3025 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3026
3027 if ((VOS_STATUS_SUCCESS != nvStatus))
3028 {
3029 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3030 "Fail to set NV Binary %d", nvStatus);
3031 return -EIO;
3032 }
3033
3034 nvStatus = vos_nv_setNVEncodedBuffer(
3035 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3036 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3037
3038 if ((VOS_STATUS_SUCCESS != nvStatus))
3039 {
3040 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3041 "Fail to set NV Binary %d", nvStatus);
3042 return -EIO;
3043 }
3044
3045 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3046 pHddCtx->ftm.targetNVTableSize = 0;
3047 pHddCtx->ftm.processedNVTableSize = 0;
3048 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3049 }
3050
3051 return 1;
3052}
3053
Jeff Johnson295189b2012-06-20 16:38:30 -07003054/**---------------------------------------------------------------------------
3055
3056 \brief wlan_hdd_ftm_temp_get_rel_num() -
3057 Get internal release number
3058
3059 \param - ftmCmd - Pointer FTM Commad Buffer
3060
3061 \return - int
3062 -1, Process Host command fail, vail out
3063 0, Process Host command success
3064
3065 --------------------------------------------------------------------------*/
3066int wlan_hdd_ftm_temp_get_rel_num
3067(
3068 tPttMsgbuffer *ftmCmd
3069)
3070{
3071 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3072
3073 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3074 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3075 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3076 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3077 relNum->relParams.pttMax = 10;
3078 relNum->relParams.pttMin = 1;
3079
3080 return 1;
3081}
3082
3083/**---------------------------------------------------------------------------
3084
3085 \brief wlan_hdd_process_ftm_host_cmd() -
3086 process any command should be handled within host.
3087 decide any command should be send to HAL or not
3088
3089 \param - ftmCmd - Pointer FTM Commad Buffer
3090
3091 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003092 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003093 0, Process Host command success, not need to send CMD to HAL
3094 1, Process Host command success, need to send CMD to HAL
3095
3096 --------------------------------------------------------------------------*/
3097int wlan_hdd_process_ftm_host_cmd
3098(
3099 hdd_context_t *pHddCtx,
3100 void *ftmCmd
3101)
3102{
3103 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3104 int needToRouteHal = 1;
3105 int hostState = 1;
3106
3107 switch(pFTMCmd->msgId)
3108 {
3109 case PTT_MSG_GET_NV_TABLE:
3110 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3111 needToRouteHal = 0;
3112 break;
3113
3114 case PTT_MSG_SET_NV_TABLE:
3115 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3116 /* Temp NV Operation will be isolated to host
3117 needToRouteHal = 1; */
3118 needToRouteHal = 0;
3119 break;
3120
3121 case PTT_MSG_BLANK_NV:
3122 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3123 needToRouteHal = 1;
3124 break;
3125
3126 case PTT_MSG_DEL_NV_TABLE:
3127 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3128 needToRouteHal = 1;
3129 break;
3130
3131 case PTT_MSG_GET_NV_FIELD:
3132 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3133 needToRouteHal = 0;
3134 break;
3135
3136 case PTT_MSG_SET_NV_FIELD:
3137 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3138 needToRouteHal = 0;
3139 break;
3140
3141 case PTT_MSG_STORE_NV_TABLE:
3142 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3143 needToRouteHal = 0;
3144 break;
3145
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003146 case PTT_MSG_GET_NV_BIN:
3147 case PTT_MSG_GET_DICTIONARY:
3148 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3149 needToRouteHal = 0;
3150 break;
3151
3152 case PTT_MSG_SET_NV_BIN:
3153 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3154 needToRouteHal = 0;
3155 break;
3156
Jeff Johnson295189b2012-06-20 16:38:30 -07003157 case PTT_MSG_DBG_READ_REGISTER:
3158 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3159 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3160 needToRouteHal = 0;
3161 break;
3162
3163 case PTT_MSG_DBG_WRITE_REGISTER:
3164 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3165 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3166 needToRouteHal = 0;
3167 break;
3168
3169 case PTT_MSG_DBG_READ_MEMORY:
3170 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3171 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3172 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3173 needToRouteHal = 0;
3174 break;
3175
3176 case PTT_MSG_DBG_WRITE_MEMORY:
3177 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3178 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3179 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3180 needToRouteHal = 0;
3181 break;
3182
3183 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3184 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3185 needToRouteHal = 0;
3186 break;
3187
3188 default:
3189 needToRouteHal = 1;
3190 break;
3191 }
3192
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003193 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003194 {
3195 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3196 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003197 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003198 }
3199
3200 return needToRouteHal;
3201}
Jeff Johnson295189b2012-06-20 16:38:30 -07003202
3203/**---------------------------------------------------------------------------
3204
3205 \brief wlan_hdd_process_ftm_cmd() -
3206
3207 This function process the commands received from the ptt socket application.
3208
3209 \param - pAdapter - Pointer HDD Context.
3210
3211 \param - wnl - Pointer to the ANI netlink header.
3212
3213 \return - none
3214
3215 --------------------------------------------------------------------------*/
3216
3217void wlan_hdd_process_ftm_cmd
3218(
3219 hdd_context_t *pHddCtx,
3220 tAniNlHdr *wnl
3221)
3222{
3223 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3224 v_U16_t cmd_len;
3225 v_U8_t *pftm_data;
3226 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003227 int hostState;
3228 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003229
3230 ENTER();
3231
Jeff Johnsone7245742012-09-05 17:12:55 -07003232 //Delay to fix NV write failure on JB
3233 vos_busy_wait(10000); //10ms
3234
Jeff Johnson295189b2012-06-20 16:38:30 -07003235 if (!pRequestBuf) {
3236
Arif Hussain6d2a3322013-11-17 19:50:10 -08003237 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003238 return ;
3239 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303240
3241 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3242 {
3243 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3244 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3245 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3246 return ;
3247 }
3248
Jeff Johnson295189b2012-06-20 16:38:30 -07003249 /*Save the received request*/
3250 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3251
3252 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3253 /*Save the received request netlink header used for sending the response*/
3254 pHddCtx->ftm.wnl = wnl;
3255 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3256
Arif Hussain6d2a3322013-11-17 19:50:10 -08003257 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003258
3259 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3260 wlan_ftm_send_response(pHddCtx);
3261 return ;
3262 }
3263
3264 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3265 {
3266 case WLAN_FTM_START:
3267 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3268
Arif Hussain6d2a3322013-11-17 19:50:10 -08003269 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003270 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3271 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3272 wlan_ftm_send_response(pHddCtx);
3273 return;
3274 }
3275
3276 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3277 {
3278 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3279 ,__func__);
3280 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3281 wlan_ftm_send_response(pHddCtx);
3282 return;
3283 }
3284 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3285 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3286 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3287 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3288
3289 wlan_ftm_send_response(pHddCtx);
3290
3291 break;
3292
3293 case WLAN_FTM_STOP:
3294 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3295
Arif Hussain6d2a3322013-11-17 19:50:10 -08003296 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003297 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3298 wlan_ftm_send_response(pHddCtx);
3299 return;
3300 }
3301
3302 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3303
3304 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3305 wlan_ftm_send_response(pHddCtx);
3306 return;
3307 }
3308
3309 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3310 /* This would send back the Command Success Status */
3311 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3312
3313 wlan_ftm_send_response(pHddCtx);
3314
3315 break;
3316
3317 case WLAN_FTM_CMD:
3318 /* if it is regular FTM command, pass it to HAL PHY */
3319 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003320 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003321 return;
3322 }
3323 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3324
Arif Hussain6d2a3322013-11-17 19:50:10 -08003325 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003326
3327 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3328 wlan_ftm_send_response(pHddCtx);
3329 return;
3330
3331 }
3332 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3333 cmd_len = pRequestBuf->ftm_hdr.data_len;
3334 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3335 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3336
Jeff Johnson295189b2012-06-20 16:38:30 -07003337 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3338 if (0 == hostState)
3339 {
3340 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3341 if (NULL == tempRspBuffer)
3342 {
3343 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003344 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003345 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3346 wlan_ftm_send_response(pHddCtx);
3347 return;
3348 }
3349 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3350 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3351 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3352 (unsigned char *) tempRspBuffer,
3353 tempRspBuffer->msgBodyLength);
3354 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3355 wlan_ftm_send_response(pHddCtx);
3356 vos_mem_free(tempRspBuffer);
3357 return;
3358 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003359 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003360 {
3361 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3362 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3363 wlan_ftm_send_response(pHddCtx);
3364 return;
3365 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003366
3367 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3368
Jeff Johnson295189b2012-06-20 16:38:30 -07003369
3370 /*Post the command to the HAL*/
3371 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3372
Arif Hussain6d2a3322013-11-17 19:50:10 -08003373 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003374 return;
3375
3376 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303377 /*After successful posting of message the command should be pending*/
3378 pHddCtx->ftm.IsCmdPending = TRUE;
3379
Jeff Johnson295189b2012-06-20 16:38:30 -07003380 /*Wait here until you get the response from HAL*/
3381 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3382 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303383 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3384 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3385 wlan_ftm_send_response(pHddCtx);
3386 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003387 return;
3388 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303389 /*This check will handle the case where the completion is sent by
3390 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3391 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3392 {
3393 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3394 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3395 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3396
3397 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3398 wlan_ftm_send_response(pHddCtx);
3399 pHddCtx->ftm.IsCmdPending = FALSE;
3400 return ;
3401 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003402
3403 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3404
3405 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3406
3407 wlan_ftm_send_response(pHddCtx);
3408 pHddCtx->ftm.IsCmdPending = FALSE;
3409 break;
3410
3411 default:
3412
Arif Hussain6d2a3322013-11-17 19:50:10 -08003413 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003414 return;
3415 }
3416
3417 EXIT();
3418 return;
3419} /* wlan_adp_ftm_cmd() */
3420
3421/**---------------------------------------------------------------------------
3422
3423 \brief wlan_ftm_priv_start_stop_ftm() -
3424
3425 This function is used for start/stop the ftm driver.
3426
3427 \param - pAdapter - Pointer HDD Context.
3428 - start - 1/0 to start/stop ftm driver.
3429
3430 \return - 0 for success, non zero for failure
3431
3432 --------------------------------------------------------------------------*/
3433
3434static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3435 v_U16_t start)
3436{
3437 VOS_STATUS status;
3438 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3439
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003440 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003441 {
3442 pHddCtx->ftm.cmd_iwpriv = TRUE;
3443 status = wlan_hdd_ftm_start(pHddCtx);
3444
3445 if (status != VOS_STATUS_SUCCESS)
3446 {
3447 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3448 "FTM Start Failed");
3449 return VOS_STATUS_E_FAILURE;
3450 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303451 if (NULL == pMsgBuf)
3452 {
3453 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3454 if (NULL == pMsgBuf)
3455 {
3456 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3457 "%s:pMsgBuf is NULL", __func__);
3458 return VOS_STATUS_E_FAILURE;
3459 }
3460 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003461 }
3462 else
3463 {
3464 status = wlan_ftm_stop(pHddCtx);
3465
3466 if (status != VOS_STATUS_SUCCESS)
3467 {
3468 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3469 "FTM Stop Failed");
3470 return VOS_STATUS_E_FAILURE;
3471 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303472 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3473 if (pMsgBuf)
3474 {
3475 vos_mem_free((v_VOID_t * )pMsgBuf);
3476 pMsgBuf = NULL;
3477 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003478 }
3479 return VOS_STATUS_SUCCESS;
3480}
3481
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303482
3483static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3484{
3485 unsigned int *table = NULL;
3486 int index = 0;
3487
3488 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3489 table = valid_channel;
3490 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3491 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3492 table = valid_channel_cb40;
3493 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3494 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3495 table = valid_channel_cb80;
3496
3497 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303498 {
3499 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3500 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303501 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303502 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303503
3504 while (table[index] != 0)
3505 {
3506 if (table[index] == channel)
3507 return VOS_STATUS_SUCCESS;
3508
3509 index++;
3510 }
3511
3512 return VOS_STATUS_E_FAILURE;
3513}
3514
3515
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303516static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3517{
3518 unsigned int primary_channel = center_channel;
3519
3520 if (center_channel <= 14)
3521 return primary_channel ;
3522
3523 switch (cb)
3524 {
3525 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3526 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3527 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3528 primary_channel -= 2;
3529 break;
3530
3531
3532 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3533 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3534 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3535 primary_channel += 2;
3536 break;
3537
3538 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3539 primary_channel -= 6;
3540 break;
3541
3542 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3543 primary_channel += 6;
3544 break;
3545 }
3546
3547 return primary_channel;
3548
3549}
3550
Jeff Johnson295189b2012-06-20 16:38:30 -07003551/**---------------------------------------------------------------------------
3552
3553 \brief wlan_ftm_priv_set_channel() -
3554
3555 This function is used for setting the channel to the halphy ptt module.
3556
3557 \param - pAdapter - Pointer HDD Context.
3558 - channel - Channel Number 1-14.
3559
3560 \return - 0 for success, non zero for failure
3561
3562 --------------------------------------------------------------------------*/
3563
3564static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3565{
Jeff Johnson295189b2012-06-20 16:38:30 -07003566 uPttMsgs *pMsgBody;
3567 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303568 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003569 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3570
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303571 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003572 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303573 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3574 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003575 return VOS_STATUS_E_FAILURE;
3576 }
3577
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303578 if (NULL == pMsgBuf)
3579 {
3580 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3581 "%s:pMsgBuf is NULL", __func__);
3582 return VOS_STATUS_E_NOMEM;
3583 }
3584
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303585 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003586 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303587 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3588 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003589 return VOS_STATUS_E_FAILURE;
3590 }
3591
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303592 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003593 init_completion(&pHddCtx->ftm.ftm_comp_var);
3594 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3595 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3596
3597 pMsgBody = &pMsgBuf->msgBody;
3598
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303599 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003600
Arif Hussain6d2a3322013-11-17 19:50:10 -08003601 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303602 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003603
3604 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3605
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303606 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003607 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303608 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3609 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003610 status = VOS_STATUS_E_FAILURE;
3611 goto done;
3612
3613 }
c_hpothuffdb5272013-10-02 16:42:35 +05303614 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303615 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303616 if (0 >= ret )
3617 {
3618 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3619 FL("wait on ftm_comp_var failed %ld"), ret);
3620 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303622 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3625 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003626 status = VOS_STATUS_E_FAILURE;
3627 goto done;
3628
3629 }
3630done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003631
3632 return status;
3633}
3634
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303635
3636/**---------------------------------------------------------------------------
3637
3638 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3639
3640 This function is used for setting the power control mode for tx.
3641
3642 \param - pAdapter - Pointer HDD Context.
3643 - pwr_mode - power control mode 0-2.
3644
3645 \return - 0 for success, non zero for failure
3646
3647 --------------------------------------------------------------------------*/
3648
3649static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3650 v_U16_t pwr_mode)
3651{
3652 uPttMsgs *pMsgBody;
3653 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303654 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303655 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3656
3657 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3658 {
3659 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3660 "%s:Ftm has not started. Please start the ftm. ", __func__);
3661 return VOS_STATUS_E_FAILURE;
3662 }
3663
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303664 if (NULL == pMsgBuf)
3665 {
3666 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3667 "%s:pMsgBuf is NULL", __func__);
3668 return VOS_STATUS_E_NOMEM;
3669 }
3670
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303671 if (pwr_mode > 2)
3672 {
3673 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3674 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3675 return VOS_STATUS_E_FAILURE;
3676 }
3677
3678 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3679 init_completion(&pHddCtx->ftm.ftm_comp_var);
3680 pMsgBody = &pMsgBuf->msgBody;
3681 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3682 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3683
3684 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3685 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3686
3687 if (status != VOS_STATUS_SUCCESS)
3688 {
3689 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3690 "%s:wlan_ftm_postmsg failed", __func__);
3691 status = VOS_STATUS_E_FAILURE;
3692 goto done;
3693 }
c_hpothuffdb5272013-10-02 16:42:35 +05303694 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303695 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303696 if (0 >= ret )
3697 {
3698 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3699 FL("wait on ftm_comp_var failed %ld"), ret);
3700 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303701
3702 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3703 {
3704 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3705 "%s:Ptt response status failed", __func__);
3706 status = VOS_STATUS_E_FAILURE;
3707 goto done;
3708 }
3709
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303710 ftm_status.powerCtlMode= pwr_mode;
3711
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303712 done:
3713 return status;
3714
3715}
3716
Jeff Johnson295189b2012-06-20 16:38:30 -07003717/**---------------------------------------------------------------------------
3718
3719 \brief wlan_ftm_priv_set_txpower() -
3720
3721 This function is used for setting the txpower to the halphy ptt module.
3722
3723 \param - pAdapter - Pointer HDD Context.
3724 - txpower - txpower Number 1-18.
3725
3726 \return - 0 for success, non zero for failure
3727
3728 --------------------------------------------------------------------------*/
3729
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303730static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3731 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003732{
Jeff Johnson295189b2012-06-20 16:38:30 -07003733 uPttMsgs *pMsgBody;
3734 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303735 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003736 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3737
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303738 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003739 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303740 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3741 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003742 return VOS_STATUS_E_FAILURE;
3743 }
3744
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303745 if (NULL == pMsgBuf)
3746 {
3747 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3748 "%s:pMsgBuf is NULL", __func__);
3749 return VOS_STATUS_E_NOMEM;
3750 }
3751
Jeff Johnson295189b2012-06-20 16:38:30 -07003752 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3753 * when tx pktgen is enabled
3754 */
3755 if (ftm_status.frameGenEnabled)
3756 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303757 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3758 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003759 return VOS_STATUS_E_FAILURE;
3760 }
3761
3762 if(!(txpower >= 9 && txpower <= 24))
3763 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303764 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3765 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003766 return VOS_STATUS_E_FAILURE;
3767 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003768
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303769 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3770 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003772 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3773 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3774
3775 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3776
3777 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3778
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303779 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003780 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303781 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3782 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003783 status = VOS_STATUS_E_FAILURE;
3784 goto done;
3785 }
c_hpothuffdb5272013-10-02 16:42:35 +05303786 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303787 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303788 if (0 >= ret )
3789 {
3790 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3791 FL("wait on ftm_comp_var failed %ld"), ret);
3792 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003793
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003795 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303796 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3797 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003798 status = VOS_STATUS_E_FAILURE;
3799 goto done;
3800 }
3801
Jeff Johnson295189b2012-06-20 16:38:30 -07003802 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003803
3804 return status;
3805
3806}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303807
3808
3809static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3810 v_U16_t enable)
3811{
3812 tANI_U32 value = 0;
3813 tANI_U32 reg_addr;
3814 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303815
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303816 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3817 {
3818 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3819 "%s:Ftm has not started. Please start the ftm. ", __func__);
3820 return VOS_STATUS_E_FAILURE;
3821 }
3822
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303823 reg_addr = WCNSS_TXFIR_OFFSET;
3824
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303825 wpalReadRegister(reg_addr, &value);
3826 if (enable)
3827 {
3828 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3829 }
3830 else
3831 {
3832 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3833 }
3834
3835 wpalWriteRegister(reg_addr, value);
3836
3837 return VOS_STATUS_SUCCESS;
3838}
3839
3840
Jeff Johnson295189b2012-06-20 16:38:30 -07003841/**---------------------------------------------------------------------------
3842
3843 \brief wlan_ftm_priv_set_txrate() -
3844
3845 This function is used for setting the txrate to the halphy ptt module.
3846 It converts the user input string for txrate to the tx rate index.
3847
3848 \param - pAdapter - Pointer HDD Context.
3849 - txrate - Pointer to the tx rate string.
3850
3851 \return - 0 for success, non zero for failure
3852
3853 --------------------------------------------------------------------------*/
3854
3855static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3856{
3857 int ii;
3858 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3859 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3860 {
3861 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3862 return VOS_STATUS_E_FAILURE;
3863 }
3864
3865 /* do not allow to change setting when tx pktgen is enabled */
3866 if (ftm_status.frameGenEnabled)
3867 {
3868 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3869 return VOS_STATUS_E_FAILURE;
3870 }
3871
3872 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3873 {
3874 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3875 break;
3876 }
3877 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3878 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003879 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 return VOS_STATUS_E_FAILURE;
3881 }
3882
3883 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3884 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3885
3886 return VOS_STATUS_SUCCESS;
3887}
3888
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303889
3890
3891static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3892 ePowerTempIndexSource pwr_source)
3893{
3894 uPttMsgs *pMsgBody;
3895 VOS_STATUS status;
3896 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3897
3898 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3899 {
3900 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3901 "%s:Ftm has not started. Please start the ftm. ", __func__);
3902 return VOS_STATUS_E_FAILURE;
3903 }
3904
3905 if (pwr_source > 3)
3906 {
3907 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3908 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3909 __func__);
3910 return VOS_STATUS_E_FAILURE;
3911 }
3912
3913 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3914
3915 init_completion(&pHddCtx->ftm.ftm_comp_var);
3916 pMsgBody = &pMsgBuf->msgBody;
3917 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3918 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3919
3920 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3921 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3922
3923 if (status != VOS_STATUS_SUCCESS)
3924 {
3925 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3926 "%s:wlan_ftm_postmsg failed", __func__);
3927 status = VOS_STATUS_E_FAILURE;
3928 goto done;
3929 }
3930 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3931 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3932
3933 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3934 {
3935 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3936 "%s:Ptt response status failed", __func__);
3937 status = VOS_STATUS_E_FAILURE;
3938 goto done;
3939 }
3940
3941done:
3942
3943 return status;
3944}
3945
3946
Jeff Johnson295189b2012-06-20 16:38:30 -07003947/**---------------------------------------------------------------------------
3948
3949 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3950
3951 This function is used for start/stop the tx packet generation.
3952
3953 \param - pAdapter - Pointer HDD Context.
3954 - startStop - Value( 1/0) start/stop the tx packet generation.
3955
3956 \return - 0 for success, non zero for failure
3957
3958 --------------------------------------------------------------------------*/
3959
3960static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3961{
Jeff Johnson295189b2012-06-20 16:38:30 -07003962 uPttMsgs *pMsgBody;
3963 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303964 long ret;
3965
Jeff Johnson295189b2012-06-20 16:38:30 -07003966 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3967
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303968 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003969 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303970 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3971 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003972 return VOS_STATUS_E_FAILURE;
3973 }
3974
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303975 if (NULL == pMsgBuf)
3976 {
3977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3978 "%s:pMsgBuf is NULL", __func__);
3979 return VOS_STATUS_E_NOMEM;
3980 }
3981
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303982 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003983 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3985 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003986 return VOS_STATUS_E_FAILURE;
3987 }
3988
3989 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3990 (!ftm_status.frameGenEnabled && startStop == 0))
3991 {
3992 return VOS_STATUS_SUCCESS ;
3993 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303994 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003995
Jeff Johnson295189b2012-06-20 16:38:30 -07003996 if (startStop == 1)
3997 {
3998 init_completion(&pHddCtx->ftm.ftm_comp_var);
3999 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4000 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4001 pMsgBody = &pMsgBuf->msgBody;
4002 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4003
4004 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304005 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004006 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304007 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4008 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004009 status = VOS_STATUS_E_FAILURE;
4010 goto done;
4011 }
4012
c_hpothuffdb5272013-10-02 16:42:35 +05304013 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304014 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304015 if (0 >= ret )
4016 {
4017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4018 FL("wait on ftm_comp_var failed %ld"), ret);
4019 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304020 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004021 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304022 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4023 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004024 status = VOS_STATUS_E_FAILURE;
4025 goto done;
4026 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304027
4028 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4029 {
4030 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4031 if(status != VOS_STATUS_SUCCESS)
4032 {
4033 goto done;
4034 }
4035 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004036 }
4037
4038 init_completion(&pHddCtx->ftm.ftm_comp_var);
4039 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4040 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4041 pMsgBody = &pMsgBuf->msgBody;
4042 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4043
4044 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4045 if(status != VOS_STATUS_SUCCESS)
4046 {
4047 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4048 status = VOS_STATUS_E_FAILURE;
4049 goto done;
4050 }
4051
c_hpothuffdb5272013-10-02 16:42:35 +05304052 ret = wait_for_completion_interruptible_timeout(
4053 &pHddCtx->ftm.ftm_comp_var,
4054 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4055 if (0 >= ret )
4056 {
4057 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4058 FL("wait on ftm_comp_var failed %ld"), ret);
4059 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004060 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4061 {
4062 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4063 status = VOS_STATUS_E_FAILURE;
4064 goto done;
4065 }
4066
4067done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004068
4069 if (status == VOS_STATUS_SUCCESS)
4070 {
4071 if (startStop == 1)
4072 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304073 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004074 }
4075 else
4076 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304077 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004078 }
4079 }
4080
4081 return status;
4082}
4083
4084
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304085
4086static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4087{
4088
4089 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4090 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4091 {
4092 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4093 "%s:Ftm has not started. Please start the ftm. ", __func__);
4094 return VOS_STATUS_E_FAILURE;
4095 }
4096
4097 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4098 {
4099 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4100 "%s:cb mode value is invalid ", __func__);
4101 return VOS_STATUS_E_FAILURE;
4102 }
4103
4104 ftm_status.cbmode = cbmode;
4105
4106 return VOS_STATUS_SUCCESS;
4107
4108}
4109
Jeff Johnson295189b2012-06-20 16:38:30 -07004110/**---------------------------------------------------------------------------
4111
4112 \brief wlan_ftm_rx_mode() -
4113
4114 This function is used for start/stop the rx packet generation.
4115
4116 \param - pAdapter - Pointer HDD Context.
4117 - rxmode - 0-disable RX.
4118 - 1-rx ALL frames
4119 - 2-rx 11 g/n frames
4120 - 3-rx 11b frames
4121
4122 \return - 0 for success, non zero for failure
4123
4124 --------------------------------------------------------------------------*/
4125
4126static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4127{
Jeff Johnson295189b2012-06-20 16:38:30 -07004128 uPttMsgs *pMsgBody;
4129 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304130 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004131
4132 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304133 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004134 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304135 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4136 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004137 return VOS_STATUS_E_FAILURE;
4138 }
4139
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304140 if (NULL == pMsgBuf)
4141 {
4142 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4143 "%s:pMsgBuf is NULL", __func__);
4144 return VOS_STATUS_E_NOMEM;
4145 }
4146
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304147 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304149 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4150 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004151 return VOS_STATUS_E_FAILURE;
4152 }
4153
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304154 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004155 init_completion(&pHddCtx->ftm.ftm_comp_var);
4156
4157 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4158 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4159
4160 pMsgBody = &pMsgBuf->msgBody;
4161
4162 switch(rxmode)
4163 {
4164 case RXMODE_DISABLE_ALL:
4165 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4166 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4167 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4168 break;
4169
4170 case RXMODE_ENABLE_ALL:
4171 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4172 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4173 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4174 break;
4175
4176 case RXMODE_ENABLE_11GN:
4177 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4178 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4179 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4180 break;
4181
4182 case RXMODE_ENABLE_11B:
4183 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4184 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4185 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4186 break;
4187
4188 }
4189
4190 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4191
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304192 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004193 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304194 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4195 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004196 status = VOS_STATUS_E_FAILURE;
4197 goto done;
4198 }
c_hpothuffdb5272013-10-02 16:42:35 +05304199 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304200 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304201 if (0 >= ret )
4202 {
4203 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4204 FL(" wait on ftm_comp_var failed %ld"), ret);
4205 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004206
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304207 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304209 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4210 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004211 status = VOS_STATUS_E_FAILURE;
4212 goto done;
4213 }
4214 ftm_status.rxmode = rxmode ;
4215done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004216
4217 return status;
4218}
4219
4220/**---------------------------------------------------------------------------
4221
4222 \brief wlan_ftm_priv_rx_pkt_clear() -
4223
4224 This function sets the rx pkt count to zero.
4225
4226 \param - pAdapter - Pointer HDD Context.
4227 - rx_pkt_clear - rx_pkt_clear value.
4228
4229 \return - 0 for success, non zero for failure
4230
4231 --------------------------------------------------------------------------*/
4232
4233static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4234{
Jeff Johnson295189b2012-06-20 16:38:30 -07004235 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304236 long ret;
4237
Jeff Johnson295189b2012-06-20 16:38:30 -07004238 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4239
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304240 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004241 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304242 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4243 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004244 return VOS_STATUS_E_FAILURE;
4245 }
4246
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304247 if (NULL == pMsgBuf)
4248 {
4249 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4250 "%s:pMsgBuf is NULL", __func__);
4251 return VOS_STATUS_E_NOMEM;
4252 }
4253
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304254 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004255 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304256 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4257 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004258 return VOS_STATUS_E_FAILURE;
4259 }
4260
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304261 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004262 init_completion(&pHddCtx->ftm.ftm_comp_var);
4263 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304264 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004265
Jeff Johnson295189b2012-06-20 16:38:30 -07004266 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4267
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304268 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004269 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304270 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4271 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004272 status = VOS_STATUS_E_FAILURE;
4273 goto done;
4274 }
c_hpothuffdb5272013-10-02 16:42:35 +05304275 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304276 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304277 if (0 >= ret )
4278 {
4279 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4280 FL("wait on ftm_comp_var failed %ld"), ret);
4281 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004282
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304283 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004284 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304285 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4286 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004287 status = VOS_STATUS_E_FAILURE;
4288 goto done;
4289 }
4290done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004291
4292 return status;
4293}
4294
4295/**---------------------------------------------------------------------------
4296
4297 \brief wlan_ftm_priv_get_channel() -
4298
4299 This function gets the channel number from the halphy ptt module and
4300 returns the channel number to the application.
4301
4302 \param - pAdapter - Pointer HDD Context.
4303 - pChannel - Poniter to get the Channel number.
4304
4305 \return - 0 for success, non zero for failure
4306
4307 --------------------------------------------------------------------------*/
4308
4309static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4310{
Jeff Johnson295189b2012-06-20 16:38:30 -07004311 uPttMsgs *pMsgBody;
4312 VOS_STATUS status;
4313 v_U16_t freq;
4314 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304315 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004316
4317 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304318 v_PVOID_t devHandle = pHddCtx->parent_dev;
4319 struct device *wcnss_device = (struct device *)devHandle;
4320 struct resource *wcnss_memory;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304321 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004322 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304323 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4324 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004325 return VOS_STATUS_E_FAILURE;
4326 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304327
4328 if (NULL == pMsgBuf)
4329 {
4330 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4331 "%s:pMsgBuf is NULL", __func__);
4332 return VOS_STATUS_E_NOMEM;
4333 }
4334
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304335 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004336 init_completion(&pHddCtx->ftm.ftm_comp_var);
4337 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4338 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4339
4340 pMsgBody = &pMsgBuf->msgBody;
Anand N Sunkad5286f8a2014-08-22 14:57:43 +05304341 wcnss_memory = wcnss_wlan_get_memory_map(wcnss_device);
4342 if (NULL == wcnss_memory)
4343 {
4344 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4345 "%s: wcnss_memory is NULL", __func__);
4346 return VOS_STATUS_E_NOMEM;
4347 }
4348 else
4349 {
4350 pMsgBody->DbgReadRegister.regAddr = wcnss_memory->start
4351 + QWLAN_AGC_CHANNEL_FREQ_REG_OFFSET;
4352 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004353 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4354
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304355 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004356 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304357 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4358 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004359 status = VOS_STATUS_E_FAILURE;
4360 goto done;
4361
4362 }
c_hpothuffdb5272013-10-02 16:42:35 +05304363 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304364 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304365 if (0 >= ret )
4366 {
4367 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4368 FL("wait on ftm_comp_var failed %ld"), ret);
4369 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004370
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304371 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004372 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304373 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4374 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004375 status = VOS_STATUS_E_FAILURE;
4376 goto done;
4377 }
4378
4379 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4380
4381 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4382 indx++;
4383 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4384 {
4385 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4386 status = VOS_STATUS_E_FAILURE;
4387 goto done;
4388 }
4389
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004390 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004391
Arif Hussain6d2a3322013-11-17 19:50:10 -08004392 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004393 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004394
4395 return status;
4396}
4397
4398/**---------------------------------------------------------------------------
4399
4400 \brief wlan_ftm_priv_get_txpower() -
4401
4402 This function gets the TX power from the halphy ptt module and
4403 returns the TX power to the application.
4404
4405 \param - pAdapter - Pointer HDD Context.
4406 - pTxPwr - Poniter to get the Tx power.
4407
4408 \return - 0 for success, non zero for failure
4409
4410 --------------------------------------------------------------------------*/
4411
4412static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4413{
Jeff Johnson295189b2012-06-20 16:38:30 -07004414 uPttMsgs *pMsgBody;
4415 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304416 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004417 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4418
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304419 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004420 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304421 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4422 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004423 return VOS_STATUS_E_FAILURE;
4424 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304425
4426 if (NULL == pMsgBuf)
4427 {
4428 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4429 "%s:pMsgBuf is NULL", __func__);
4430 return VOS_STATUS_E_NOMEM;
4431 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304432 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004433 init_completion(&pHddCtx->ftm.ftm_comp_var);
4434 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4435 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4436
4437 pMsgBody = &pMsgBuf->msgBody;
4438
4439 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4440
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304441 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004442 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304443 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4444 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004445 status = VOS_STATUS_E_FAILURE;
4446 goto done;
4447 }
c_hpothuffdb5272013-10-02 16:42:35 +05304448 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304449 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304450 if (0 >= ret )
4451 {
4452 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4453 FL("wait on ftm_comp_var failed %ld"), ret);
4454 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004455
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304456 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304458 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4459 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004460 status = VOS_STATUS_E_FAILURE;
4461 goto done;
4462 }
4463 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4464
4465 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004466
4467 return status;
4468}
4469
4470/**---------------------------------------------------------------------------
4471
4472 \brief wlan_ftm_priv_get_ftm_version() -
4473
4474 This function gets ftm driver and firmware version.
4475
4476 \param - pAdapter - Pointer HDD Context.
4477 - pTxRate - Poniter to get the Tx rate.
4478
4479 \return - 0 for success, non zero for failure
4480
4481 --------------------------------------------------------------------------*/
4482
4483VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4484{
Jeff Johnson295189b2012-06-20 16:38:30 -07004485 uPttMsgs *pMsgBody;
4486 VOS_STATUS status;
4487 v_U32_t reg_val;
4488 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004489 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4490 int lenRes = 0;
4491 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304492 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004493
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304494 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004495 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304496 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4497 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004498 return VOS_STATUS_E_FAILURE;
4499 }
4500
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304501 if (NULL == pMsgBuf)
4502 {
4503 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4504 "%s:pMsgBuf is NULL", __func__);
4505 return VOS_STATUS_E_NOMEM;
4506 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304507 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004508 init_completion(&pHddCtx->ftm.ftm_comp_var);
4509 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4510 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4511
4512 pMsgBody = &pMsgBuf->msgBody;
4513 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4514
4515 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4516
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304517 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004518 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304519 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4520 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004521 status = VOS_STATUS_E_FAILURE;
4522 goto done;
4523
4524 }
c_hpothuffdb5272013-10-02 16:42:35 +05304525 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304526 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304527 if (0 >= ret )
4528 {
4529 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4530 FL("wait on ftm_comp_var failed %ld"), ret);
4531 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004532
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304533 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004534 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304535 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4536 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004537 status = VOS_STATUS_E_FAILURE;
4538 goto done;
4539 }
4540
4541 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4542
4543 init_completion(&pHddCtx->ftm.ftm_comp_var);
4544
4545 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4546 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4547
4548 pMsgBody = &pMsgBuf->msgBody;
4549
4550 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4551
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304552 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004553 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304554 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4555 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004556 status = VOS_STATUS_E_FAILURE;
4557 goto done;
4558 }
c_hpothuffdb5272013-10-02 16:42:35 +05304559 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304560 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304561 if (0 >= ret )
4562 {
4563 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4564 FL("wait on ftm_comp_var failed %ld"), ret);
4565 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004566
4567 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4568 if(lenRes < 0 || lenRes >= lenBuf)
4569 {
4570 status = VOS_STATUS_E_FAILURE;
4571 goto done;
4572 }
4573
4574 buf += lenRes;
4575 lenBuf -= lenRes;
4576
4577 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004578 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 -07004579 if(lenRes < 0 || lenRes >= lenBuf)
4580 {
4581 status = VOS_STATUS_E_FAILURE;
4582 goto done;
4583 }
4584
4585 buf += lenRes;
4586 lenBuf -= lenRes;
4587
4588 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4589 if(lenRes < 0 || lenRes >= lenBuf)
4590 {
4591 status = VOS_STATUS_E_FAILURE;
4592 goto done;
4593 }
4594
4595 buf += lenRes;
4596 lenBuf -= lenRes;
4597
Jeff Johnson295189b2012-06-20 16:38:30 -07004598
4599done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004600
4601 return status;
4602
4603}
4604
4605/**---------------------------------------------------------------------------
4606
4607 \brief wlan_ftm_priv_get_txrate() -
4608
4609 This function gets the TX rate from the halphy ptt module and
4610 returns the TX rate to the application.
4611
4612 \param - pAdapter - Pointer HDD Context.
4613 - pTxRate - Poniter to get the Tx rate.
4614
4615 \return - 0 for success, non zero for failure
4616
4617 --------------------------------------------------------------------------*/
4618
4619static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4620{
Jeff Johnson295189b2012-06-20 16:38:30 -07004621 uPttMsgs *pMsgBody;
4622 VOS_STATUS status;
4623 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304624 long ret;
4625
Jeff Johnson295189b2012-06-20 16:38:30 -07004626 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4627
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304628 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004629 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304630 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4631 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004632 return VOS_STATUS_E_FAILURE;
4633 }
4634
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304635 if (NULL == pMsgBuf)
4636 {
4637 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4638 "%s:pMsgBuf is NULL", __func__);
4639 return VOS_STATUS_E_NOMEM;
4640 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304641 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004642 init_completion(&pHddCtx->ftm.ftm_comp_var);
4643 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4644 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4645
4646 pMsgBody = &pMsgBuf->msgBody;
4647
4648 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4649
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304650 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004651 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304652 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4653 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004654 status = VOS_STATUS_E_FAILURE;
4655 goto done;
4656 }
c_hpothuffdb5272013-10-02 16:42:35 +05304657 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304658 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304659 if (0 >= ret )
4660 {
4661 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4662 FL("wait on ftm_comp_var failed %ld"), ret);
4663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004664
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304665 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004666
4667 rate_index = pMsgBody->GetTxPowerReport.rate;
4668 }
4669 else {
4670 /*Return the default rate*/
4671 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304672 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4673 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004674 status = VOS_STATUS_E_FAILURE;
4675 goto done;
4676 }
4677
4678 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4679 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4680 break;
4681 }
4682 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4683 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004684 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004685 status = VOS_STATUS_E_FAILURE;
4686 goto done;
4687 }
4688 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4689done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004690
4691 return status;
4692
4693}
4694
4695/**---------------------------------------------------------------------------
4696
4697 \brief wlan_ftm_priv_get_rx_pkt_count() -
4698
4699 This function gets the rx pkt count from the halphy ptt module and
4700 returns the rx pkt count to the application.
4701
4702 \param - pAdapter - Pointer HDD Context.
4703 - pRxPktCnt - Poniter to get the rx pkt count.
4704
4705 \return - 0 for success, non zero for failure
4706
4707 --------------------------------------------------------------------------*/
4708
4709static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4710{
Jeff Johnson295189b2012-06-20 16:38:30 -07004711 uPttMsgs *pMsgBody;
4712 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304713 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004714 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4715
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304716 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304718 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4719 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004720 return VOS_STATUS_E_FAILURE;
4721 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304722
4723 if (NULL == pMsgBuf)
4724 {
4725 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4726 "%s:pMsgBuf is NULL", __func__);
4727 return VOS_STATUS_E_NOMEM;
4728 }
4729
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304730 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004731 init_completion(&pHddCtx->ftm.ftm_comp_var);
4732 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4733 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4734
4735 pMsgBody = &pMsgBuf->msgBody;
4736
4737 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4738
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304739 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004740 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304741 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4742 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004743 status = VOS_STATUS_E_FAILURE;
4744 goto done;
4745 }
c_hpothuffdb5272013-10-02 16:42:35 +05304746 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304747 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304748 if (0 >= ret )
4749 {
4750 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4751 FL("wait on ftm_comp_var failed %ld"), ret);
4752 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004753
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304754 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004755 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304756 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4757 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004758 status = VOS_STATUS_E_FAILURE;
4759 goto done;
4760 }
4761 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4762done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004763
4764 return status;
4765}
4766
4767/**---------------------------------------------------------------------------
4768
4769 \brief wlan_ftm_priv_get_rx_rssi() -
4770
4771 This function gets the rx rssi from the halphy ptt module and
4772 returns the rx rssi to the application.
4773
4774 \param - pAdapter - Pointer HDD Context.
4775 - buf - Poniter to get rssi of Rx chains
4776
4777 \return - 0 for success, non zero for failure
4778
4779 --------------------------------------------------------------------------*/
4780
4781static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4782{
Jeff Johnson295189b2012-06-20 16:38:30 -07004783 uPttMsgs *pMsgBody;
4784 VOS_STATUS status;
4785 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304786 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004787
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304788 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004789 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304790 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4791 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004792 return VOS_STATUS_E_FAILURE;
4793 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304794
4795 if (NULL == pMsgBuf)
4796 {
4797 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4798 "%s:pMsgBuf is NULL", __func__);
4799 return VOS_STATUS_E_NOMEM;
4800 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304801 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004802 init_completion(&pHddCtx->ftm.ftm_comp_var);
4803 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4804 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4805
4806 pMsgBody = &pMsgBuf->msgBody;
4807
4808 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4809
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304810 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004811 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304812 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4813 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004814 status = VOS_STATUS_E_FAILURE;
4815 goto done;
4816 }
c_hpothuffdb5272013-10-02 16:42:35 +05304817 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304818 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304819 if (0 >= ret )
4820 {
4821 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4822 FL("wait on ftm_comp_var failed %ld"), ret);
4823 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004824
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304825 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004826 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304827 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4828 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004829 status = VOS_STATUS_E_FAILURE;
4830 goto done;
4831 }
4832
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004833 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4834 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004835 pMsgBody->GetRxRssi.rssi.rx[1]);
4836
4837 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4838 {
4839 status = VOS_STATUS_E_FAILURE;
4840 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004841
Jeff Johnson295189b2012-06-20 16:38:30 -07004842done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004843
4844 return status;
4845}
4846
4847/**---------------------------------------------------------------------------
4848
4849 \brief wlan_ftm_priv_get_mac_address() -
4850
4851 This function gets the mac address from the halphy ptt module and
4852 returns the mac address to the application.
4853
4854 \param - pAdapter - Pointer HDD Context.
4855 - buf - Poniter to get the mac address.
4856
4857 \return - 0 for success, non zero for failure
4858
4859 --------------------------------------------------------------------------*/
4860
4861static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4862{
4863 v_BOOL_t itemIsValid = VOS_FALSE;
4864 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4865 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004866
Jeff Johnson295189b2012-06-20 16:38:30 -07004867 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4868
4869 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4870 {
4871 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4872 return VOS_STATUS_E_FAILURE;
4873 }
4874 /*Check the NV FIELD is valid or not*/
4875 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4876 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004877 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004878 {
4879 vos_nv_readMacAddress(macAddr);
4880
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004881 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4882 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004883 MAC_ADDR_ARRAY(macAddr));
4884 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4885 {
4886 return VOS_STATUS_E_FAILURE;
4887 }
4888 }
4889 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004890 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004891 {
4892 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004893 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4894 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004895 MAC_ADDR_ARRAY(macAddr));
4896
4897 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4898 {
4899 return VOS_STATUS_E_FAILURE;
4900 }
4901 }
4902 return VOS_STATUS_SUCCESS;
4903}
4904
4905/**---------------------------------------------------------------------------
4906
4907 \brief wlan_ftm_priv_set_mac_address() -
4908
4909 This function sets the mac address to the halphy ptt module and
4910 sends the netlink message to the ptt socket application which writes
4911 the macaddress to the qcom_wlan_nv.bin file
4912
4913 \param - pAdapter - Pointer HDD Context.
4914 - buf - Poniter to the macaddress.
4915
4916 \return - 0 for success, non zero for failure
4917
4918 --------------------------------------------------------------------------*/
4919
4920static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4921{
Jeff Johnson295189b2012-06-20 16:38:30 -07004922 uPttMsgs *pMsgBody;
4923 VOS_STATUS status;
4924 int macAddr[VOS_MAC_ADDRESS_LEN];
4925 v_U8_t *pMacAddress;
4926 v_U8_t ii;
4927 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304928 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004929
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304930 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004931 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304932 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4933 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004934 return VOS_STATUS_E_FAILURE;
4935 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304936 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004937 init_completion(&pHddCtx->ftm.ftm_comp_var);
4938 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4939 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4940
4941 pMsgBody = &pMsgBuf->msgBody;
4942 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4943
4944 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004945 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]))
4946 {
4947 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4948 "Invalid MacAddress Input %s", buf);
4949 return VOS_STATUS_E_FAILURE;
4950 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004951
Arif Hussain24bafea2013-11-15 15:10:03 -08004952 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4953 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004954
4955
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004956 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004957
4958 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4959 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4960
4961
Arif Hussain24bafea2013-11-15 15:10:03 -08004962 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4963 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004964 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4965
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304966 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004967 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304968 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4969 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004970 status = VOS_STATUS_E_FAILURE;
4971 goto done;
4972 }
c_hpothuffdb5272013-10-02 16:42:35 +05304973 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304974 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304975 if (0 >= ret )
4976 {
4977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4978 FL("wait on ftm_comp_var failed %ld"), ret);
4979 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004980
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304981 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004982 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304983 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4984 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004985 status = VOS_STATUS_E_FAILURE;
4986 goto done;
4987 }
4988
Arif Hussain6d2a3322013-11-17 19:50:10 -08004989 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004990
4991 init_completion(&pHddCtx->ftm.ftm_comp_var);
4992 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4993
4994 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4995 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4996
4997 pMsgBody = &pMsgBuf->msgBody;
4998
4999 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
5000
5001 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
5002
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305003 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07005004 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305005 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
5006 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005007 status = VOS_STATUS_E_FAILURE;
5008 goto done;
5009 }
5010
c_hpothuffdb5272013-10-02 16:42:35 +05305011 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305012 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05305013 if (0 >= ret )
5014 {
5015 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5016 FL("wait on ftm_comp_var failed %ld"), ret);
5017 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005018done:
Jeff Johnson295189b2012-06-20 16:38:30 -07005019
5020 return VOS_STATUS_SUCCESS;
5021}
5022
5023/* set param sub-ioctls */
5024static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
5025 union iwreq_data *wrqu, char *extra)
5026{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005027 int ret,sub_cmd;
5028 unsigned int length;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305029 char *param;
Jeff Johnson295189b2012-06-20 16:38:30 -07005030 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005031 hdd_adapter_t *pAdapter;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305032 struct iw_point s_priv_data;
Jeff Johnson295189b2012-06-20 16:38:30 -07005033
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005034 ret =0;
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305035 /* helper function to get iwreq_data with compat handling. */
5036 if (hdd_priv_get_data(&s_priv_data, wrqu))
5037 {
5038 return -EINVAL;
5039 }
5040
5041 /* make sure all params are correctly passed to function */
5042 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
5043 {
5044 return -EINVAL;
5045 }
5046
5047 sub_cmd = s_priv_data.flags;
5048 length = s_priv_data.length;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005049 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
5050
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005051 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
5052 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
5053 * odd number which assigns set_args to zero.we assisgn memory using
5054 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005055 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005056 param = kzalloc(length + 1, GFP_KERNEL);
5057 if (!param)
5058 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08005059
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305060 if (copy_from_user(param, s_priv_data.pointer, length))
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005061 {
5062 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
5063 "%s:Failed to get user data %s", __func__, param);
5064
5065 ret = -EINVAL;
5066 goto OUT;
5067 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005068
5069 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Mahesh A Saptasagarb14beb32014-09-10 14:47:00 +05305070 "%s: Received length %d, parameters: %s", __func__, length, param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005071
5072 switch(sub_cmd)
5073 {
5074 case WE_SET_MAC_ADDRESS:
5075 {
5076
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005077 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005078 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005079
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005080 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005081
5082 if(status != VOS_STATUS_SUCCESS)
5083 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005084 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005085 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005086
Jeff Johnson295189b2012-06-20 16:38:30 -07005087 ret = -EINVAL;
5088 }
5089
Wilson Yang7c471652013-12-20 16:36:44 -08005090 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005091 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005092 case WE_SET_TX_RATE:
5093 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005094 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005095
5096 if(status != VOS_STATUS_SUCCESS)
5097 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005098 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005099 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005100
5101 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005102 }
5103
5104 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005105 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005106 default:
5107 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005108 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005109 ret = -EINVAL;
5110 break;
5111 }
5112 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005113
5114OUT:
5115 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005116 return ret;
5117}
5118
5119static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5120 union iwreq_data *wrqu, char *extra)
5121{
5122 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5123 int *value = (int *)extra;
5124 int sub_cmd = value[0];
5125 int set_value = value[1];
5126 int ret = 0; /* success */
5127 VOS_STATUS status;
5128
5129 switch(sub_cmd)
5130 {
5131 case WE_FTM_ON_OFF:
5132 {
5133 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5134
5135 if(status != VOS_STATUS_SUCCESS)
5136 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005137 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005138 ret = -EINVAL;
5139 }
5140
5141 break;
5142 }
5143
5144 case WE_TX_PKT_GEN:
5145 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5146
5147 if(status != VOS_STATUS_SUCCESS)
5148 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005149 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005150 ret = -EINVAL;
5151 }
5152 break;
5153
5154 case WE_SET_TX_IFS:
5155 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5156
5157 if(status != VOS_STATUS_SUCCESS)
5158 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005159 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005160 ret = -EINVAL;
5161 }
5162 break;
5163
5164 case WE_SET_TX_PKT_CNT:
5165 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5166
5167 if(status != VOS_STATUS_SUCCESS)
5168 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005169 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005170 ret = -EINVAL;
5171 }
5172 break;
5173
5174 case WE_SET_TX_PKT_LEN:
5175 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5176
5177 if(status != VOS_STATUS_SUCCESS)
5178 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005179 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005180 ret = -EINVAL;
5181 }
5182 break;
5183
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305184 case WE_TX_CW_RF_GEN:
5185 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5186
5187 if(status != VOS_STATUS_SUCCESS)
5188 {
5189 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5190 ret = -EINVAL;
5191 }
5192 break;
5193
Jeff Johnson295189b2012-06-20 16:38:30 -07005194 case WE_SET_CHANNEL:
5195 {
5196 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5197
5198 if(status != VOS_STATUS_SUCCESS)
5199 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005200 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005201 ret = -EINVAL;
5202 }
5203 break;
5204 }
5205 case WE_SET_TX_POWER:
5206 {
5207 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5208
5209 if(status != VOS_STATUS_SUCCESS)
5210 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005211 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005212 ret = -EINVAL;
5213 }
5214 break;
5215 }
5216 case WE_CLEAR_RX_PKT_CNT:
5217 {
5218 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5219
5220 if(status != VOS_STATUS_SUCCESS)
5221 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005222 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005223 ret = -EINVAL;
5224 }
5225 break;
5226 }
5227 case WE_RX:
5228 {
5229 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5230
5231 if(status != VOS_STATUS_SUCCESS)
5232 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005233 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005234 ret = -EINVAL;
5235 }
5236 break;
5237 }
5238 case WE_ENABLE_CHAIN:
5239 {
5240 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5241
5242 if(status != VOS_STATUS_SUCCESS)
5243 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005244 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005245 ret = -EINVAL;
5246 }
5247 break;
5248 }
5249
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305250 case WE_SET_PWR_CNTL_MODE:
5251 {
5252 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5253 if (status != VOS_STATUS_SUCCESS)
5254 {
5255 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5256 status);
5257 ret = -EINVAL;
5258 }
5259 break;
5260 }
5261
5262 case WE_ENABLE_DPD:
5263 {
5264 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5265 if (status != VOS_STATUS_SUCCESS)
5266 {
5267 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5268 ret = -EINVAL;
5269 }
5270 break;
5271 }
5272
5273 case WE_SET_CB:
5274 {
5275 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5276 if (status != VOS_STATUS_SUCCESS)
5277 {
5278 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5279 ret = -EINVAL;
5280 }
5281 break;
5282 }
5283
Jeff Johnson295189b2012-06-20 16:38:30 -07005284 default:
5285 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005286 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005287 sub_cmd, set_value);
5288 break;
5289 }
5290 }
5291
5292 return ret;
5293}
5294
5295/* get param sub-ioctls */
5296static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5297 union iwreq_data *wrqu, char *extra)
5298{
5299 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5300 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005301 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005302 VOS_STATUS status;
5303
5304 switch (value[0])
5305 {
5306 case WE_GET_CHANNEL:
5307 {
5308 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5309
5310 if(status != VOS_STATUS_SUCCESS)
5311 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005312 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005313 ret = -EINVAL;
5314 }
5315 break;
5316 }
5317 case WE_GET_TX_POWER:
5318 {
5319 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5320
5321 if(status != VOS_STATUS_SUCCESS)
5322 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005323 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005324 ret = -EINVAL;
5325 }
5326 break;
5327 }
5328 case WE_GET_RX_PKT_CNT:
5329 {
5330 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5331
5332 if(status != VOS_STATUS_SUCCESS)
5333 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005334 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005335 ret = -EINVAL;
5336 }
5337 break;
5338 }
5339 default:
5340 {
5341 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5342 break;
5343 }
5344 }
5345
5346 return ret;
5347}
5348
5349static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5350 union iwreq_data *wrqu, char *extra)
5351{
5352 int sub_cmd = wrqu->data.flags;
5353 VOS_STATUS status;
5354 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5355
5356 switch(sub_cmd)
5357 {
5358 case WE_GET_MAC_ADDRESS:
5359 {
5360 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5361
5362 if(status != VOS_STATUS_SUCCESS)
5363 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005364 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005365 return -EINVAL;
5366 }
5367 wrqu->data.length = strlen(extra)+1;
5368 break;
5369 }
5370 case WE_GET_TX_RATE:
5371 {
5372 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5373
5374 if(status != VOS_STATUS_SUCCESS)
5375 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005376 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005377 return -EINVAL;
5378 }
5379
5380 wrqu->data.length = strlen(extra)+1;
5381 break;
5382 }
5383 case WE_GET_FTM_VERSION:
5384 {
5385 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5386
5387 if(status != VOS_STATUS_SUCCESS)
5388 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005389 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005390 return -EINVAL;
5391 }
5392 wrqu->data.length = strlen(extra)+1;
5393 break;
5394 }
5395 case WE_GET_FTM_STATUS:
5396 {
5397 status = wlan_ftm_priv_get_status(pAdapter, extra);
5398
5399 if(status != VOS_STATUS_SUCCESS)
5400 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005401 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005402 return -EINVAL;
5403 }
5404
5405 wrqu->data.length = strlen(extra)+1;
5406 break;
5407 }
5408 case WE_GET_RX_RSSI:
5409 {
5410 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5411
5412 if(status != VOS_STATUS_SUCCESS)
5413 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005414 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005415 return -EINVAL;
5416 }
5417
5418 wrqu->data.length = strlen(extra)+1;
5419 break;
5420 }
5421 default:
5422 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005423 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005424 break;
5425 }
5426 }
5427
5428 return 0;
5429}
Jeff Johnson295189b2012-06-20 16:38:30 -07005430
5431VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5432{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005433#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005434 tAniHdr *wmsg = NULL;
5435 v_U8_t *pBuf;
5436 hdd_context_t *pHddCtx = NULL;
5437 v_CONTEXT_t pVosContext= NULL;
5438
5439 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5440 if(pBuf == NULL)
5441 {
5442 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5443 return VOS_STATUS_E_NOMEM;
5444 }
5445 wmsg = (tAniHdr*)pBuf;
5446 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5447 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5448 wmsg->length = FTM_SWAP16(wmsg->length);
5449 pBuf += sizeof(tAniHdr);
5450
5451 /*Get the global context */
5452 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5453
5454 /*Get the Hdd Context */
5455 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5456 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5457
5458 /* EfS command Code */
5459 *(v_U32_t*)pBuf = 0x000000EF;
5460
5461 pBuf += sizeof(v_U32_t);
5462
5463 memcpy(pBuf, pData,data_len);
5464
5465 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305466 if( ptt_sock_send_msg_to_app(wmsg, 0,
5467 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005468
Arif Hussain6d2a3322013-11-17 19:50:10 -08005469 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 -07005470 vos_mem_free((v_VOID_t*)wmsg);
5471 return VOS_STATUS_E_FAILURE;
5472 }
5473 }
5474 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305475 if( ptt_sock_send_msg_to_app(wmsg, 0,
5476 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005477
Arif Hussain6d2a3322013-11-17 19:50:10 -08005478 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 -07005479 vos_mem_free((v_VOID_t*)wmsg);
5480 return VOS_STATUS_E_FAILURE;
5481 }
5482 }
5483
5484 vos_mem_free((v_VOID_t*)wmsg);
5485#endif //FTM and ANDROID
5486
5487 return VOS_STATUS_SUCCESS;
5488}
5489
Jeff Johnson295189b2012-06-20 16:38:30 -07005490/* action sub-ioctls */
5491static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5492 union iwreq_data *wrqu, char *extra)
5493{
5494 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005495 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005496
5497 switch (sub_cmd)
5498 {
5499 case WE_SET_NV_DEFAULTS:
5500 {
5501 v_U8_t *pu8buf,*pTempBuf;
5502 v_U16_t size;
5503 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005504 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005505 pu8buf = vos_mem_malloc(size);
5506 if(pu8buf == NULL)
5507 {
5508 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5509 return VOS_STATUS_E_NOMEM;
5510 }
5511 memset(pu8buf,0,size);
5512 pTempBuf = pu8buf;
5513 pTempBuf += sizeof(v_U32_t);
5514 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5515
5516 wlan_write_to_efs(pu8buf,size);
5517 vos_mem_free(pu8buf);
5518 }
5519
5520 default:
5521 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005522 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005523 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5524 break;
5525 }
5526 }
5527
5528 return ret;
5529}
5530
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305531static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5532 union iwreq_data *wrqu, char *extra)
5533{
5534 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5535 int sub_cmd = wrqu->data.flags;
5536 int *value = (int*)wrqu->data.pointer;
5537
5538 if(wrqu->data.length != 2)
5539 {
5540 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5541 return -EINVAL;
5542 }
5543 switch (sub_cmd)
5544 {
5545 case WE_SET_TX_WF_GAIN:
5546 {
5547 v_S15_t dGain = 0;
5548 v_U16_t rfGain = 0;
5549 VOS_STATUS status;
5550
5551 dGain = *(v_S15_t*) value++;
5552 rfGain = *(v_U16_t*) value;
5553 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5554
5555 if(status != VOS_STATUS_SUCCESS)
5556 {
5557 hddLog(VOS_TRACE_LEVEL_FATAL,
5558 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5559 return -EINVAL;
5560 }
5561 }
5562 break;
5563
5564 default:
5565 {
5566 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5567 break;
5568 }
5569 }
5570
5571 return 0;
5572}
5573
5574
Jeff Johnson295189b2012-06-20 16:38:30 -07005575static const iw_handler we_ftm_private[] = {
5576
5577 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5578 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5579 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5580 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5581 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305582 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005583};
5584
5585/*Maximum command length can be only 15 */
5586static const struct iw_priv_args we_ftm_private_args[] = {
5587
5588 /* handlers for main ioctl */
5589 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5590 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5591 0,
5592 "" },
5593
5594 { WE_FTM_ON_OFF,
5595 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5596 0,
5597 "ftm" },
5598
5599 { WE_TX_PKT_GEN,
5600 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5601 0,
5602 "tx" },
5603
5604 { WE_SET_TX_IFS,
5605 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5606 0,
5607 "set_txifs" },
5608
5609 { WE_SET_TX_PKT_CNT,
5610 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5611 0,
5612 "set_txpktcnt" },
5613
5614 { WE_SET_TX_PKT_LEN,
5615 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5616 0,
5617 "set_txpktlen" },
5618
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305619 { WE_SET_TX_WF_GAIN,
5620 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5621 0,
5622 "set_tx_wf_gain" },
5623
5624 { WE_TX_CW_RF_GEN,
5625 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5626 0,
5627 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005628 { WE_SET_CHANNEL,
5629 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5630 0,
5631 "set_channel" },
5632
5633 { WE_SET_TX_POWER,
5634 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5635 0,
5636 "set_txpower" },
5637
5638 { WE_CLEAR_RX_PKT_CNT,
5639 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5640 0,
5641 "clr_rxpktcnt" },
5642
5643 { WE_RX,
5644 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5645 0,
5646 "rx" },
5647
5648 { WE_ENABLE_CHAIN,
5649 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5650 0,
5651 "ena_chain" },
5652
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305653 { WE_SET_PWR_CNTL_MODE,
5654 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5655 0,
5656 "pwr_cntl_mode" },
5657
5658 { WE_ENABLE_DPD,
5659 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5660 0,
5661 "ena_dpd" },
5662
5663 { WE_SET_CB,
5664 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5665 0,
5666 "set_cb" },
5667
Jeff Johnson295189b2012-06-20 16:38:30 -07005668 /* handlers for main ioctl */
5669 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5670 0,
5671 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5672 "" },
5673
5674 { WE_GET_CHANNEL,
5675 0,
5676 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5677 "get_channel" },
5678
5679 { WE_GET_TX_POWER,
5680 0,
5681 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5682 "get_txpower" },
5683
5684 { WE_GET_RX_PKT_CNT,
5685 0,
5686 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5687 "get_rxpktcnt" },
5688
5689 /* handlers for main ioctl */
5690 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5691 IW_PRIV_TYPE_CHAR| 512,
5692 0,
5693 "" },
5694
5695 { WE_SET_MAC_ADDRESS,
5696 IW_PRIV_TYPE_CHAR| 512,
5697 0,
5698 "set_mac_address" },
5699
5700 { WE_SET_TX_RATE,
5701 IW_PRIV_TYPE_CHAR | 512,
5702 0,
5703 "set_txrate" },
5704
5705 /* handlers for main ioctl */
5706 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5707 0,
5708 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5709 "" },
5710
5711 { WE_GET_MAC_ADDRESS,
5712 0,
5713 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5714 "get_mac_address" },
5715
5716 { WE_GET_FTM_VERSION,
5717 0,
5718 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5719 "ftm_version" },
5720
5721 { WE_GET_TX_RATE,
5722 0,
5723 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5724 "get_txrate" },
5725
5726 { WE_GET_FTM_STATUS,
5727 0,
5728 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5729 "get_status" },
5730
5731 { WE_GET_RX_RSSI,
5732 0,
5733 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5734 "get_rx_rssi" },
5735
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305736 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5737 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5738 0,
5739 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005740 /* handlers for main ioctl */
5741 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5742 0,
5743 0,
5744 "" },
5745
5746 /* handlers for sub-ioctl */
5747 { WE_SET_NV_DEFAULTS,
5748 0,
5749 0,
5750 "set_nv_defaults" },
5751
5752};
5753
5754const struct iw_handler_def we_ftm_handler_def = {
5755 .num_standard = 0,
5756 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5757 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5758
5759 .standard = (iw_handler *)NULL,
5760 .private = (iw_handler *)we_ftm_private,
5761 .private_args = we_ftm_private_args,
5762 .get_wireless_stats = NULL,
5763};
5764
5765static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5766{
5767
5768 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5769
5770 // Zero the memory. This zeros the profile structure.
5771 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005772
Jeff Johnson295189b2012-06-20 16:38:30 -07005773 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5774
5775 return 0;
5776}
5777
Jeff Johnson295189b2012-06-20 16:38:30 -07005778
5779VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5780{
Jeff Johnson295189b2012-06-20 16:38:30 -07005781 ftm_rsp_msg_t *pFtmMsgRsp;
5782
5783 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5784 hdd_context_t *pHddCtx;
5785 v_CONTEXT_t pVosContext= NULL;
5786
5787 ENTER();
5788
5789 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5790
5791 if (!message )
5792 {
5793 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5794 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5795 return VOS_STATUS_E_INVAL;
5796 }
5797 /*Get the global context */
5798 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5799
5800 /*Get the Hdd Context */
5801 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5802
5803 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5804
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305805 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005806 complete(&pHddCtx->ftm.ftm_comp_var);
5807 }
5808 else {
5809 /*Response length to Ptt App*/
5810 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5811
5812 /*Ptt App expects the response length in LE */
5813 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5814
5815 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005816 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005817 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5818
5819 /*Copy the message*/
5820 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5821
5822 /*Update the error code*/
5823 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5824
5825 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5826
5827 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5828 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005829 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005830 return VOS_STATUS_E_FAILURE;
5831 }
5832 }
5833 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005834 return VOS_STATUS_SUCCESS;
5835
5836}