blob: 28625ecd05f2ff91c805b70356e32c99867fc60b [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam842dad02014-02-18 18:44:02 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**========================================================================
29
30 \file wlan_hdd_ftm.c
31
32 \brief This file contains the WLAN factory test mode implementation
33
34 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
35
36 Qualcomm Confidential and Proprietary.
37
38 ========================================================================*/
39
40/**=========================================================================
41
42 EDIT HISTORY FOR FILE
43
44
45 This section contains comments describing changes made to the module.
46 Notice that changes are listed in reverse chronological order.
47
48
49 $Header:$ $DateTime: $ $Author: $
50
51
52 when who what, where, why
53 -------- --- --------------------------------------------------------
54 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
55 for FTM and mission mode
56 04/5/09 Shailender Created module.
57
58 ==========================================================================*/
59#include <vos_mq.h>
60#include "vos_sched.h"
61#include <vos_api.h>
62#include "sirTypes.h"
63#include "halTypes.h"
64#include "sirApi.h"
65#include "sirMacProtDef.h"
66#include "sme_Api.h"
67#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070068#include "wlan_qct_sys.h"
69#include "wlan_qct_tl.h"
70#include "wlan_hdd_misc.h"
71#include "i_vos_packet.h"
72#include "vos_nvitem.h"
73#include "wlan_hdd_main.h"
74#include "vos_power.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070075#include "qwlan_version.h"
76
Jeff Johnson295189b2012-06-20 16:38:30 -070077#include "wlan_nv.h"
78#include "wlan_qct_wda.h"
79#include "cfgApi.h"
80#include "pttMsgApi.h"
81#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070082
Jeff Johnson295189b2012-06-20 16:38:30 -070083#define RXMODE_DISABLE_ALL 0
84#define RXMODE_ENABLE_ALL 1
85#define RXMODE_ENABLE_11GN 2
86#define RXMODE_ENABLE_11B 3
87
88#define FTM_CHAIN_SEL_NO_RX_TX 0
89#define FTM_CHAIN_SEL_R0_ON 1
90#define FTM_CHAIN_SEL_T0_ON 2
91#define FTM_CHAIN_SEL_R0_T0_ON 3
92#define FTM_CHAIN_SEL_MAX 3
93
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053094#define WCNSS_TXFIR_OFFSET 0x00018000
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096#ifndef QWLAN_PHYDBG_BASE
97#define QWLAN_PHYDBG_BASE 0x03004000
98#endif /* QWLAN_PHYDBG_BASE */
99
100#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800101#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
103#endif
104
105#ifndef QWLAN_AGC_BASE
106#define QWLAN_AGC_BASE 0x03013C00
107#endif /* QWLAN_AGC_BASE */
108
109#ifndef QWLAN_AGC_CHANNEL_FREQ_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800110#define QWLAN_AGC_CHANNEL_FREQ_REG (QWLAN_AGC_BASE + 0x34)
Jeff Johnson295189b2012-06-20 16:38:30 -0700111#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
112#endif /* QWLAN_AGC_CHANNEL_FREQ_REG */
113
114#ifndef QWLAN_AGC_SUBBAND_CONFIG_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800115#define QWLAN_AGC_SUBBAND_CONFIG_REG (QWLAN_AGC_BASE + 0x30)
Jeff Johnson295189b2012-06-20 16:38:30 -0700116#define QWLAN_AGC_SUBBAND_CONFIG_STG2_SUBBAND_MASK 0x03
117#endif /* QWLAN_AGC_SUBBAND_CONFIG_REG */
118
119#ifndef QWLAN_RFAPB_BASE
120#define QWLAN_RFAPB_BASE 0x0E02F800
121#endif /* QWLAN_RFAPB_BASE */
122
123#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800124#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700125#endif /* QWLAN_RFAPB_REV_ID_REG */
126
127#ifndef QWLAN_TXCTL_BASE
128#define QWLAN_TXCTL_BASE 0x03012000
129#endif /* QWLAN_TXCTL_BASE */
130
131#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800132#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700133#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
134#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
135#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
136#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
137#endif /* QWLAN_TXCTL_FSHIFT_REG */
138
139/* To set 4MAC addresses from given first MAC address,
140 * Last byte value within given MAC address must less than 0xFF - 3 */
141#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700142#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700143
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530144#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
145
Jeff Johnson295189b2012-06-20 16:38:30 -0700146typedef struct {
147 tANI_U32 tableSize; /* Whole NV Table Size */
148 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
149 eNvTable nvTable;
150 tANI_U8 tableData; /* Filled by host driver */
151} pttGetNvTable;
152
153typedef struct {
154 tANI_U32 tableSize; /* Whole NV Table Size */
155 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
156 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700157 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700158} pttSetNvTable;
159
Jeff Johnson295189b2012-06-20 16:38:30 -0700160
161extern const sHalNv nvDefaults;
162static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700163static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700164VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700165
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700166/* for PRIMA: all the available frequency, channal pair i the table are defined for channel frequency @ RF center frequency
Jeff Johnson295189b2012-06-20 16:38:30 -0700167 Since it is associated to agc.channel_freq register for mapping.
168 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
169*/
170static const freq_chan_t freq_chan_tbl[] = {
171 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
172 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
173};
174
175static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
176{
177 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
178 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
179 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
180 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
181 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
182 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
183 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
184 //Spica_Virgo 11A 20MHz Rates
185 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
186 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
187 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
188 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
189 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
190 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
191 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
192 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
193
194//MCS Index #0-15 (20MHz)
195 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
196 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
197 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
198 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
199 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
200 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
201 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
202 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530203 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, "MCS_SG_7_2_MBPS"},
204 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS, "MCS_SG_14_4_MBPS"},
205 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS, "MCS_SG_21_7_MBPS"},
206 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS, "MCS_SG_28_9_MBPS"},
207 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS, "MCS_SG_43_3_MBPS"},
208 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS, "MCS_SG_57_8_MBPS"},
209 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, "MCS_SG_65_MBPS"},
210 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_SG_72_2_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530211
212//MCS Index #8-15 (40MHz)
213
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530214 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_5_MBPS" },
215 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
216 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
217 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
218 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
219 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
220 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
221 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530222 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
223 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
224 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
225 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
226 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
227 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
228 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800229 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530230
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800231#ifdef WLAN_FEATURE_11AC
232 /*11AC rate 20MHZ Normal GI*/
233 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
234 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
235 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
236 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
237 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
238 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
239 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
240 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
241 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530242#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800243 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530244#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800245
246 /*11AC rate 20MHZ Short GI*/
247 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
248 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
249 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
250 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
251 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
252 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
253 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
254 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
255 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530256#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800257 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530258#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800259
260 /*11AC rates 40MHZ normal GI*/
261 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
262 "MCS_VHT40_NGI_CB_13_5_MBPS"},
263 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
264 "MCS_VHT40_NGI_CB_27_MBPS"},
265 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
266 "MCS_VHT40_NGI_CB_40_5_MBPS"},
267 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
268 "MCS_VHT40_NGI_CB_54_MBPS"},
269 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
270 "MCS_VHT40_NGI_CB_81_MBPS"},
271 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
272 "MCS_VHT40_NGI_CB_108_MBPS"},
273 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
274 "MCS_VHT40_NGI_CB_121_5_MBPS"},
275 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
276 "MCS_VHT40_NGI_CB_135_MBPS"},
277 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
278 "MCS_VHT40_NGI_CB_162_MBPS"},
279 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
280 "MCS_VHT40_NGI_CB_180_MBPS"},
281
282 /*11AC rates 40MHZ short GI*/
283 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
284 "MCS_VHT40_SGI_CB_15_MBPS"},
285 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
286 "MCS_VHT40_SGI_CB_30_MBPS"},
287 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
288 "MCS_VHT40_SGI_CB_45_MBPS"},
289 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
290 "MCS_VHT40_SGI_CB_60_MBPS"},
291 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
292 "MCS_VHT40_SGI_CB_90_MBPS"},
293 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
294 "MCS_VHT40_SGI_CB_120_MBPS"},
295 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
296 "MCS_VHT40_SGI_CB_135_MBPS"},
297 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
298 "MCS_VHT40_SGI_CB_150_MBPS"},
299 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
300 "MCS_VHT40_SGI_CB_180_MBPS"},
301 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
302 "MCS_VHT40_SGI_CB_200_MBPS"},
303
304 /*11AC rates 80 MHZ normal GI*/
305 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
306 "MCS_VHT80_NGI_CB_29_3_MBPS"},
307 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
308 "MCS_VHT80_NGI_CB_58_5_MBPS"},
309 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
310 "MCS_VHT80_NGI_CB_87_8_MBPS"},
311 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
312 "MCS_VHT80_NGI_CB_117_MBPS"},
313 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
314 "MCS_VHT80_NGI_CB_175_5_MBPS"},
315 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
316 "MCS_VHT80_NGI_CB_234_MBPS"},
317 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
318 "MCS_VHT80_NGI_CB_263_3_MBPS"},
319 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
320 "MCS_VHT80_NGI_CB_292_5_MBPS"},
321 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
322 "MCS_VHT80_NGI_CB_351_MBPS"},
323 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
324 "MCS_VHT80_NGI_CB_390_MBPS"},
325
326 /*11AC rates 80 MHZ short GI*/
327 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
328 "MCS_VHT80_SGI_CB_32_5_MBPS"},
329 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
330 "MCS_VHT80_SGI_CB_65_MBPS"},
331 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
332 "MCS_VHT80_SGI_CB_97_5_MBPS"},
333 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
334 "MCS_VHT80_SGI_CB_130_MBPS"},
335 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
336 "MCS_VHT80_SGI_CB_195_MBPS"},
337 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
338 "MCS_VHT80_SGI_CB_260_MBPS"},
339 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
340 "MCS_VHT80_SGI_CB_292_5_MBPS"},
341 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
342 "MCS_VHT80_SGI_CB_325_MBPS"},
343 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
344 "MCS_VHT80_SGI_CB_390_MBPS"},
345 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
346 "MCS_VHT80_SGI_CB_433_3_MBPS"},
347#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700348};
349
350static rateIndex2Preamble_t rate_index_2_preamble_table[] =
351{
352
353 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
354 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
355 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
356 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
357 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
358 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
359 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
360
Jeff Johnson295189b2012-06-20 16:38:30 -0700361
362 //Spica_Virgo 11A 20MHz Rates
363 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
364 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
365 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
366 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
367 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
368 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
369 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
370 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
371
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530372 // 11A 20MHz Rates
373 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
374 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
375 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
376 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
377 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
378 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
379 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
380 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
381
Jeff Johnson295189b2012-06-20 16:38:30 -0700382 //MCS Index #0-15 (20MHz)
383 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
385 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
386 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
387 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
388 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
389 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
390 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
391 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
392 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
393 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
394 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
395 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
396 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
397 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
398 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530399
400 //MCS index (40MHz)
401 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
409 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
410 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
411 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
412 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
413 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800416 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530417
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800418#ifdef WLAN_FEATURE_11AC
419 /*11AC rate 20MHZ Normal GI*/
420 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
422 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
423 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
424 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
425 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
426 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530429#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800430 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530431#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800432 /*11AC rate 20MHZ Short GI*/
433 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
435 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
436 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
437 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
438 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
439 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
440 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530442#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800443 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530444#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800445
446 /*11AC rates 40MHZ normal GI*/
447 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
450 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
451 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
452 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
457
458 /*11AC rates 40MHZ short GI*/
459 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
462 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
463 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
464 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
465 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
466 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
467 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
468 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
469
470 /*11AC rates 80 MHZ normal GI*/
471 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
472 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
473 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
474 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
475 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
476 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
477 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
478 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
479 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
480 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
481
482 /*11AC rates 80 MHZ short GI*/
483 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
484 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
485 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
486 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
487 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
488 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
489 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
490 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
491 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
492 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
493#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700494};
495
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530496static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
497 11, 12, 13, 14, 36, 40, 44, 48,
498 52, 56, 60, 64, 100, 104, 108,
499 112, 116, 120, 124, 128, 132,
500 136, 140, 149, 153, 157, 161,
501 165, 208, 212, 216, 240, 244,
502 248, 252, 0 };
503static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
504 42, 46, 50, 54, 58, 62, 102, 106,
505 110, 114, 118, 122, 126, 130, 134,
506 138, 151, 155, 159, 163, 210, 214,
507 242, 246, 250, 0 };
508static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
509 114, 118, 122, 126, 130, 134, 155,
510 159, 246, 0 };
511
Jeff Johnson295189b2012-06-20 16:38:30 -0700512typedef struct
513{
514 tANI_BOOLEAN frameGenEnabled;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530515 tANI_BOOLEAN wfRfGenEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -0700516 tANI_BOOLEAN wfmEnabled;
517 sPttFrameGenParams frameParams;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530518 v_U16_t powerCtlMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 v_U16_t rxmode;
520 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530521 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700522
523} FTM_STATUS ;
524static FTM_STATUS ftm_status;
525
526//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530527static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700528
529static void _ftm_status_init(void)
530{
531 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
532 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
533 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
534
535 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
536 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530537 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700538 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530539 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700540 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
541 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530542 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700543 ftm_status.frameParams.payloadFillByte = 0xA5;
544 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
545 ftm_status.frameParams.tx_mode = 0;
546 ftm_status.frameParams.crc = 0;
547 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
548 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
549 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
550 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530551 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700552 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
553 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530554 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700555
556 return;
557}
558
559/**---------------------------------------------------------------------------
560
561 \brief wlan_ftm_postmsg() -
562
563 The function used for sending the command to the halphy.
564
565 \param - cmd_ptr - Pointer command buffer.
566
567 \param - cmd_len - Command length.
568
569 \return - 0 for success, non zero for failure
570
571 --------------------------------------------------------------------------*/
572
573static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
574{
575 vos_msg_t *ftmReqMsg;
576 vos_msg_t ftmMsg;
577 ENTER();
578
579 ftmReqMsg = (vos_msg_t *) cmd_ptr;
580
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700582 ftmMsg.reserved = 0;
583 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
584 ftmMsg.bodyval = 0;
585
586 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700587 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700588 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800590 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700591
592 return VOS_STATUS_E_FAILURE;
593 }
594
595 EXIT();
596 return VOS_STATUS_SUCCESS;
597}
598
599/*---------------------------------------------------------------------------
600
601 \brief wlan_ftm_vos_open() - Open the vOSS Module
602
603 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
604 Upon successful initialization:
605
606 - All VOS submodules should have been initialized
607
608 - The VOS scheduler should have opened
609
610 - All the WLAN SW components should have been opened. This include
611 MAC.
612
613
Girish Gowli32fbe522014-05-08 20:27:04 +0530614 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700615
616
617 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
618 is ready to be used.
619
620 VOS_STATUS_E_RESOURCES - System resources (other than memory)
621 are unavailable to initialize the scheduler
622
623
624 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
625
626 \sa wlan_ftm_vos_open()
627
628---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530629static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700630{
631 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
632 int iter = 0;
633 tSirRetStatus sirStatus = eSIR_SUCCESS;
634 tMacOpenParameters macOpenParms;
635 pVosContextType gpVosContext = (pVosContextType)pVosContext;
636
637 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
638 "%s: Opening VOSS", __func__);
639
640 if (NULL == gpVosContext)
641 {
642 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
643 "%s: Trying to open VOSS without a PreOpen",__func__);
644 VOS_ASSERT(0);
645 return VOS_STATUS_E_FAILURE;
646 }
647
648 /* Initialize the probe event */
649 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
650 {
651 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
652 "%s: Unable to init probeEvent",__func__);
653 VOS_ASSERT(0);
654 return VOS_STATUS_E_FAILURE;
655 }
656
Jeff Johnson295189b2012-06-20 16:38:30 -0700657 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
658 {
659 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
660 "%s: Unable to init wdaCompleteEvent",__func__);
661 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700662
Jeff Johnson295189b2012-06-20 16:38:30 -0700663 goto err_probe_event;
664 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700665
666 /* Initialize the free message queue */
667 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
668 if (! VOS_IS_STATUS_SUCCESS(vStatus))
669 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700670 /* Critical Error ... Cannot proceed further */
671 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530672 "%s: Failed to initialize VOS free message queue %d",
673 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700674 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700675 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 }
677
678 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
679 {
680 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
681 &(gpVosContext->aMsgBuffers[iter]);
682 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
683 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
684 }
685
686 /* Now Open the VOS Scheduler */
687 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
688 sizeof(VosSchedContext));
689
690 if (!VOS_IS_STATUS_SUCCESS(vStatus))
691 {
692 /* Critical Error ... Cannot proceed further */
693 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530694 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700695 VOS_ASSERT(0);
696 goto err_msg_queue;
697 }
698
699 /* Open the SYS module */
700 vStatus = sysOpen(gpVosContext);
701
702 if (!VOS_IS_STATUS_SUCCESS(vStatus))
703 {
704 /* Critical Error ... Cannot proceed further */
705 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530706 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700707 VOS_ASSERT(0);
708 goto err_sched_close;
709 }
710
Jeff Johnson295189b2012-06-20 16:38:30 -0700711 /*Open the WDA module */
712 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
713 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530714 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700715 if (!VOS_IS_STATUS_SUCCESS(vStatus))
716 {
717 /* Critical Error ... Cannot proceed further */
718 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530719 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700720 VOS_ASSERT(0);
721 goto err_sys_close;
722 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700723
724 /* initialize the NV module */
725 vStatus = vos_nv_open();
726 if (!VOS_IS_STATUS_SUCCESS(vStatus))
727 {
728 // NV module cannot be initialized, however the driver is allowed
729 // to proceed
730 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530731 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700732 goto err_wda_close;
733 }
734
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700735 vStatus = vos_nv_get_dictionary_data();
736
737 if (!VOS_IS_STATUS_SUCCESS(vStatus))
738 {
739 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530740 "%s : failed to get dictionary data for NV %d",
741 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700742 goto err_wda_close;
743 }
744
Jeff Johnson295189b2012-06-20 16:38:30 -0700745 /* If we arrive here, both threads dispacthing messages correctly */
746
747 /* Now proceed to open the MAC */
748
749 /* UMA is supported in hardware for performing the
750 frame translation 802.11 <-> 802.3 */
751 macOpenParms.frameTransRequired = 1;
752 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
753 &macOpenParms);
754
755 if (eSIR_SUCCESS != sirStatus)
756 {
757 /* Critical Error ... Cannot proceed further */
758 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530759 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700760 VOS_ASSERT(0);
761 goto err_nv_close;
762 }
763
Jeff Johnson295189b2012-06-20 16:38:30 -0700764 /* Now proceed to open the SME */
765 vStatus = sme_Open(gpVosContext->pMACContext);
766 if (!VOS_IS_STATUS_SUCCESS(vStatus))
767 {
768 /* Critical Error ... Cannot proceed further */
769 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530770 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700771 goto err_mac_close;
772 }
773 return VOS_STATUS_SUCCESS;
774
Jeff Johnson295189b2012-06-20 16:38:30 -0700775
776 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
777 "%s: VOSS successfully Opened",__func__);
778
779 return VOS_STATUS_SUCCESS;
780err_mac_close:
781 macClose(gpVosContext->pMACContext);
782
783err_nv_close:
784 vos_nv_close();
785
786err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700787 WDA_close(gpVosContext);
788
789err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700790 sysClose(gpVosContext);
791
792err_sched_close:
793 vos_sched_close(gpVosContext);
794err_msg_queue:
795 vos_mq_deinit(&gpVosContext->freeVosMq);
796
Jeff Johnson295189b2012-06-20 16:38:30 -0700797err_wda_complete_event:
798 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700799
800err_probe_event:
801 vos_event_destroy(&gpVosContext->ProbeEvent);
802
803 return VOS_STATUS_E_FAILURE;
804
805} /* wlan_ftm_vos_open() */
806
807/*---------------------------------------------------------------------------
808
809 \brief wlan_ftm_vos_close() - Close the vOSS Module
810
811 The \a wlan_ftm_vos_close() function closes the vOSS Module
812
813 \param vosContext context of vos
814
815 \return VOS_STATUS_SUCCESS - successfully closed
816
817 \sa wlan_ftm_vos_close()
818
819---------------------------------------------------------------------------*/
820
821static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
822{
823 VOS_STATUS vosStatus;
824 pVosContextType gpVosContext = (pVosContextType)vosContext;
825
Jeff Johnson295189b2012-06-20 16:38:30 -0700826 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
827 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
828 {
829 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530830 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700831 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
832 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700833
834 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
835 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
836 {
837 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530838 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700839 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
840 }
841
842 ((pVosContextType)vosContext)->pMACContext = NULL;
843
844 vosStatus = vos_nv_close();
845 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
846 {
847 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530848 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
850 }
851
852
853 vosStatus = sysClose( vosContext );
854 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
855 {
856 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530857 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700858 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
859 }
860
Jeff Johnson295189b2012-06-20 16:38:30 -0700861 vosStatus = WDA_close( vosContext );
862 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
863 {
864 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530865 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700866 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
867 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700868
869 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
870
871 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
872 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
873 {
874 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530875 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700876 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
877 }
878
Jeff Johnson295189b2012-06-20 16:38:30 -0700879 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
880 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
881 {
882 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530883 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700884 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
885 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700886
887 return VOS_STATUS_SUCCESS;
888}
889
890/**---------------------------------------------------------------------------
891
892 \brief wlan_ftm_priv_set_txifs() -
893
894 This function is used for
895
896 \param - pAdapter - Pointer HDD Context.
897 - ifs
898
899 \return - 0 for success, non zero for failure
900
901 --------------------------------------------------------------------------*/
902
903
904
905static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
906{
907 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
908 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
909 {
910 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
911 return VOS_STATUS_E_FAILURE;
912 }
913
914 /* do not allow to change setting when tx pktgen is enabled */
915 if (ftm_status.frameGenEnabled)
916 {
917 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
918 return VOS_STATUS_E_FAILURE;
919 }
920
921 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
922 {
c_hpothuffdb5272013-10-02 16:42:35 +0530923 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
924 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700925 return VOS_STATUS_E_FAILURE;
926 }
927
928 ftm_status.frameParams.interFrameSpace = ifs;
929
930 return VOS_STATUS_SUCCESS;
931}
932
933/**---------------------------------------------------------------------------
934
935 \brief wlan_ftm_priv_set_txpktcnt() -
936
937 This function is used for
938
939 \param - pAdapter - Pointer HDD Context.
940 - ifs
941
942 \return - 0 for success, non zero for failure
943
944 --------------------------------------------------------------------------*/
945
946static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
947{
948 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
949 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
950 {
951 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
952 return VOS_STATUS_E_FAILURE;
953 }
954
955 /* do not allow to change setting when tx pktgen is enabled */
956 if (ftm_status.frameGenEnabled)
957 {
958 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
959 return VOS_STATUS_E_FAILURE;
960 }
961
962 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
963 {
c_hpothuffdb5272013-10-02 16:42:35 +0530964 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
965 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700966 return VOS_STATUS_E_FAILURE;
967 }
968
969 ftm_status.frameParams.numTestPackets = cnt;
970
971 return VOS_STATUS_SUCCESS;
972}
973
974static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
975{
976 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
977 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
978 {
979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
980 return VOS_STATUS_E_FAILURE;
981 }
982
983 /* do not allow to change setting when tx pktgen is enabled */
984 if (ftm_status.frameGenEnabled)
985 {
986 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
987 return VOS_STATUS_E_FAILURE;
988 }
989
990 if (len > 4095) //4096
991 {
c_hpothuffdb5272013-10-02 16:42:35 +0530992 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
993 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700994 return VOS_STATUS_E_FAILURE;
995 }
996
997 ftm_status.frameParams.payloadLength = (tANI_U16)len;
998
999 return VOS_STATUS_SUCCESS;
1000}
1001
Jeff Johnson295189b2012-06-20 16:38:30 -07001002
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301003static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
1004/**---------------------------------------------------------------------------
1005<FTM_Command>set_tx_wf_gain
1006<argument> is <n>
1007Designates the number of amplitude gain (31 to 255).
1008Description
1009This command can be set only when Tx CW generation is stopped.
1010--------------------------------------------------------------------------*/
1011static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
1012{
1013 uPttMsgs *pMsgBody;
1014 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1015 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
1016 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
1017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1018 "%s:Ftm has not started. Please start the ftm.", __func__);
1019 return VOS_STATUS_E_FAILURE;
1020 }
1021
1022 if (ftm_status.wfRfGenEnabled) {
1023 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1024 "%s:cannot set gain when cwgen is enabled.", __func__);
1025 return VOS_STATUS_E_FAILURE;
1026 }
1027
1028 if (dGain > 24 || dGain <-39) {
1029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1030 "%s:digital gain value is invalid", __func__);
1031 return VOS_STATUS_E_FAILURE;
1032 }
1033
1034 if (rfGain > 31 || rfGain <0) {
1035 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1036 "%s:rf gain value is invalid", __func__);
1037 return VOS_STATUS_E_FAILURE;
1038 }
1039
1040 if (pMsgBuf == NULL) {
1041 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1042 "%s:pMsgBuf is NULL", __func__);
1043 return VOS_STATUS_E_NOMEM;
1044 }
1045
1046 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1047 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1048
1049 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1050 init_completion(&pHddCtx->ftm.ftm_comp_var);
1051 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1052 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1053 pMsgBody = &pMsgBuf->msgBody;
1054 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1055 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1056 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1057 VOS_STATUS_SUCCESS) {
1058 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1059 "%s:wlan_ftm_postmsg failed",__func__);
1060 return VOS_STATUS_E_FAILURE;
1061 }
1062
1063 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1064 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1065 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1066 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1067 "%s:Ptt response status failed",__func__);
1068 return VOS_STATUS_E_FAILURE;
1069 }
1070 return VOS_STATUS_SUCCESS;
1071}
1072
1073
1074/**---------------------------------------------------------------------------
1075 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1076 <argument> is < 1 | 0 >
1077 1 : Start Tx CW rf generation
1078 0 : Stop Tx CW rf generation
1079 Description
1080 This command starts/stops Tx CW rf generation.
1081--------------------------------------------------------------------------*/
1082static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1083{
1084 uPttMsgs *pMsgBody;
1085 VOS_STATUS status;
1086 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1087
1088 printk(KERN_EMERG "startStop: %02x ", startStop);
1089
1090 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1091 {
1092 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1093 "%s:Ftm has not started. Please start the ftm. ", __func__);
1094 return VOS_STATUS_E_FAILURE;
1095 }
1096
1097 if (startStop != 1 && startStop != 0)
1098 {
1099 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1100 "%s:Tx value is invalid ", __func__);
1101 return VOS_STATUS_E_FAILURE;
1102 }
1103
1104 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1105 (!ftm_status.wfRfGenEnabled && startStop == 0))
1106 {
1107 return VOS_STATUS_SUCCESS;
1108 }
1109
1110 if (pMsgBuf == NULL)
1111 {
1112 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1113 "%s:pMsgBuf is NULL", __func__);
1114 return VOS_STATUS_E_NOMEM;
1115 }
1116 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1117 if (startStop == 1) {
1118 tANI_U16 numSamples = 1;
1119 tANI_BOOLEAN clk80 = TRUE;
1120 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1121
1122 init_completion(&pHddCtx->ftm.ftm_comp_var);
1123 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1124 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1125 pMsgBody = &pMsgBuf->msgBody;
1126
1127 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1128 pMsgBody->SetWaveformRF.numSamples = numSamples;
1129 pMsgBody->SetWaveformRF.clk80 = clk80;
1130 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1131 if (status != VOS_STATUS_SUCCESS) {
1132 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1133 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1134 __func__);
1135 status = VOS_STATUS_E_FAILURE;
1136 goto done;
1137 }
1138 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1139 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1140 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1141 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1142 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1143 status = VOS_STATUS_E_FAILURE;
1144 goto done;
1145 }
1146 } else {
1147 init_completion(&pHddCtx->ftm.ftm_comp_var);
1148 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1149 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1150 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1151 if(status != VOS_STATUS_SUCCESS) {
1152 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1153 "%s:wlan_ftm_postmsg failed", __func__);
1154 status = VOS_STATUS_E_FAILURE;
1155 goto done;
1156 }
1157
1158 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1159 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1160 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1161 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1162 "%s:Ptt response status failed", __func__);
1163 status = VOS_STATUS_E_FAILURE;
1164 }
1165 }
1166done:
1167 if (status == VOS_STATUS_SUCCESS) {
1168 if (startStop == 1)
1169 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1170 else
1171 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1172 }
1173 return status;
1174}
1175
1176
Jeff Johnson295189b2012-06-20 16:38:30 -07001177static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1178{
Jeff Johnson295189b2012-06-20 16:38:30 -07001179 uPttMsgs *pMsgBody;
1180 VOS_STATUS status;
1181 v_U16_t chainSelect_save = chainSelect;
1182 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301183 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001184
1185 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1186 {
1187 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1188 return VOS_STATUS_E_FAILURE;
1189 }
1190
1191 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
1543 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1544 {
1545 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1546 goto err_nl_srv_init;
1547 }
1548#ifdef HDD_SESSIONIZE
1549 //Turn off carrier state
1550 netif_carrier_off(pAdapter->dev);
1551
1552 //Stop the Interface TX queue. Just being safe
1553 netif_tx_disable(pAdapter->dev);
1554#endif
1555
Jeff Johnson295189b2012-06-20 16:38:30 -07001556 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1557 pHddCtx->ftm.targetNVTableSize = 0;
1558 pHddCtx->ftm.targetNVTablePointer = NULL;
1559 pHddCtx->ftm.processedNVTableSize = 0;
1560 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1561 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1562 {
1563 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301564 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001565 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001566 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001567 }
1568 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001569
1570 _ftm_status_init();
1571 /* Initialize the ftm vos event */
1572 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1573 {
1574 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301575 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001576 VOS_ASSERT(0);
1577 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1578 goto err_nl_srv_init;
1579 }
1580
1581 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1582
1583 return VOS_STATUS_SUCCESS;
1584
1585err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001586#ifdef WLAN_KD_READY_NOTIFIER
1587nl_srv_exit(pHddCtx->ptt_pid);
1588#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001589nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001590#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001591err_ftm_register_wext_close:
1592hdd_UnregisterWext(pAdapter->dev);
1593
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301594err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001595err_adapter_open_failure:
1596hdd_close_all_adapters( pHddCtx );
1597
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301598err_ftm_vos_close:
1599 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001600err_vos_status_failure:
1601
1602 return VOS_STATUS_E_FAILURE;
1603}
1604
1605
1606
1607int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1608{
1609 VOS_STATUS vosStatus;
1610 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1611
1612 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1613 ENTER();
1614 if(pAdapter == NULL)
1615 {
1616 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1617 return VOS_STATUS_E_NOMEM;
1618 }
1619
Atul Mittalc41126d2014-03-17 15:10:11 +05301620 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1621 if (pHddCtx->ftm.IsCmdPending == TRUE)
1622 {
1623 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1624 {
1625 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1626 "%s: vos_event_set failed", __func__);
1627 }
1628 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001629 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1630 {
1631 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1632 "%s: Ftm has been started. stopping ftm", __func__);
1633 wlan_ftm_stop(pHddCtx);
1634 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001635
1636 //Assert Deep sleep signal now to put Libra HW in lowest power state
1637 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301638 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1639 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1640 "%s: Failed to assert deep sleep signal", __func__);
1641 VOS_ASSERT( 0 );
1642 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001643
1644 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301645 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1646 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1647 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1648 "%s: Failed to put HW into low power", __func__);
1649 VOS_ASSERT( 0 );
1650 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001651
1652 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1653
Leo Chang59cdc7e2013-07-10 10:08:21 -07001654#ifdef WLAN_KD_READY_NOTIFIER
1655 nl_srv_exit(pHddCtx->ptt_pid);
1656#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001657 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001658#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001659 //TODO----------
1660 //Deregister the device with the kernel
1661 hdd_UnregisterWext(pAdapter->dev);
1662
1663 hdd_close_all_adapters( pHddCtx );
1664#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001665 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001666 {
1667 unregister_netdev(pAdapter->dev);
1668 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1669 }
1670#endif
1671 //-----------------
1672
1673 vosStatus = vos_sched_close( vosContext );
1674 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1675 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1676 "%s: Failed to close VOSS Scheduler",__func__);
1677 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1678 }
1679
1680 //Close VOSS
1681 wlan_ftm_vos_close(vosContext);
1682
1683
1684 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1685 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1686 {
1687 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1688 "%s: Failed to destroy ftm_vos Event",__func__);
1689 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1690 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001691 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001692
1693 //Free up dynamically allocated members inside HDD Adapter
1694 kfree(pHddCtx->cfg_ini);
1695 pHddCtx->cfg_ini= NULL;
1696
1697 return 0;
1698
1699}
1700
1701/**---------------------------------------------------------------------------
1702
1703 \brief wlan_ftm_send_response() -
1704
1705 The function sends the response to the ptt socket application running in user space.
1706
1707 \param - pAdapter - Pointer HDD Context.
1708
1709 \return - 0 for success, non zero for failure
1710
1711 --------------------------------------------------------------------------*/
1712
1713static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1714
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301715 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1716 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001717
Arif Hussain6d2a3322013-11-17 19:50:10 -08001718 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 -07001719 return VOS_STATUS_E_FAILURE;
1720 }
1721 return VOS_STATUS_SUCCESS;
1722}
1723
1724/**---------------------------------------------------------------------------
1725
1726 \brief wlan_hdd_ftm_start() -
1727
1728 This function gets called when the FTM start commands received from the ptt socket application and
1729 it starts the following modules.
1730 1) SAL Start.
1731 2) BAL Start.
1732 3) MAC Start to download the firmware.
1733
1734
1735 \param - pAdapter - Pointer HDD Context.
1736
1737 \return - 0 for success, non zero for failure
1738
1739 --------------------------------------------------------------------------*/
1740
1741static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1742{
1743 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1744 tSirRetStatus sirStatus = eSIR_SUCCESS;
1745 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1746 tHalMacStartParameters halStartParams;
1747
1748 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1749 {
1750 return VOS_STATUS_SUCCESS;
1751 }
1752
1753 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1754 "%s: Starting Libra SW", __func__);
1755
1756 /* We support only one instance for now ...*/
1757 if (pVosContext == NULL)
1758 {
1759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001760 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001761 goto err_status_failure;
1762 }
1763
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001764
Jeff Johnson295189b2012-06-20 16:38:30 -07001765 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001766 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001767 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001768 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001769 goto err_status_failure;
1770 }
1771
Jeff Johnson295189b2012-06-20 16:38:30 -07001772 /*
1773 Prima needs to start the WDA correctly instead of BAL and SAL
1774 */
1775
1776 /* Vos preStart is calling */
1777 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1778 {
1779 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1780 goto err_status_failure;
1781 }
1782
1783
1784 vStatus = WDA_NVDownload_Start(pVosContext);
1785
1786 if ( vStatus != VOS_STATUS_SUCCESS )
1787 {
1788 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1789 "%s: Failed to start NV Download",__func__);
1790 return VOS_STATUS_E_FAILURE;
1791 }
1792
1793 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1794
1795 if ( vStatus != VOS_STATUS_SUCCESS )
1796 {
1797 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1798 {
1799 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001800 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001801 }
1802 else
1803 {
1804 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001805 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001806 }
1807 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301808 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001809 }
1810
1811 vStatus = WDA_start(pVosContext);
1812 if (vStatus != VOS_STATUS_SUCCESS)
1813 {
1814 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1815 "%s: Failed to start WDA",__func__);
1816 goto err_status_failure;
1817 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001818
Jeff Johnson295189b2012-06-20 16:38:30 -07001819
1820 /* Start the MAC */
1821 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1822
Jeff Johnson295189b2012-06-20 16:38:30 -07001823
1824 halStartParams.driverType = eDRIVER_TYPE_MFG;
1825
1826 /* Start the MAC */
1827 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1828
Jeff Johnson295189b2012-06-20 16:38:30 -07001829
1830 if (eSIR_SUCCESS != sirStatus)
1831 {
1832 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1833 "%s: Failed to start MAC", __func__);
1834
Jeff Johnson295189b2012-06-20 16:38:30 -07001835 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001836 }
1837
1838 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1839 "%s: MAC correctly started",__func__);
1840
Jeff Johnson295189b2012-06-20 16:38:30 -07001841
1842 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1843
1844 return VOS_STATUS_SUCCESS;
1845
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001846err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001847 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1848 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1849 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1850 if(vStatus != VOS_STATUS_SUCCESS)
1851 {
1852 if(vStatus == VOS_STATUS_E_TIMEOUT)
1853 {
1854 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001855 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001856
1857 }
1858 else
1859 {
1860 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001861 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001862 }
1863 VOS_ASSERT(0);
1864 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001865
1866err_status_failure:
1867
1868 return VOS_STATUS_E_FAILURE;
1869
1870}
1871
1872
1873static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1874{
1875 VOS_STATUS vosStatus;
1876
1877 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1878 {
1879 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1880 return VOS_STATUS_E_FAILURE;
1881 }
1882
1883 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1884 {
1885 /* STOP MAC only */
1886 v_VOID_t *hHal;
1887 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1888 if (NULL == hHal)
1889 {
1890 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1891 "%s: NULL hHal", __func__);
1892 }
1893 else
1894 {
1895 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1896 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1897 {
1898 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1899 "%s: Failed to stop SYS", __func__);
1900 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1901 }
1902 }
1903
Jeff Johnson295189b2012-06-20 16:38:30 -07001904
Jeff Johnson295189b2012-06-20 16:38:30 -07001905 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001906
1907 }
1908 return WLAN_FTM_SUCCESS;
1909}
1910
Jeff Johnson295189b2012-06-20 16:38:30 -07001911/**---------------------------------------------------------------------------
1912
1913 \brief wlan_hdd_ftm_get_nv_table() -
1914 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001915 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001916
1917 \param - ftmCmd - Pointer FTM Commad Buffer
1918
1919 \return - int
1920 -1, Process Host command fail, vail out
1921 1, Process Host command success
1922
1923 --------------------------------------------------------------------------*/
1924int wlan_hdd_ftm_get_nv_table
1925(
1926 hdd_context_t *pHddCtx,
1927 tPttMsgbuffer *ftmCmd
1928)
1929{
1930 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1931 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1932 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001933 sHalNvV2 *nvContents = NULL;
1934 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001935
Jeff Johnson295189b2012-06-20 16:38:30 -07001936 if (NULL == pHddCtx)
1937 {
1938 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1939 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001940 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001941 }
1942
Leo Chang80de3c22013-11-26 10:52:12 -08001943 nvVersion = vos_nv_getNvVersion();
1944 if (E_NV_V2 != nvVersion)
1945 {
1946 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1947 "%s : Not valid NV Version %d", __func__, nvVersion);
1948 return -EINVAL;
1949 }
1950
Jeff Johnson295189b2012-06-20 16:38:30 -07001951 /* Test first chunk of NV table */
1952 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1953 (0 == pHddCtx->ftm.processedNVTableSize))
1954 {
1955 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1956 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1957 {
c_hpothuffdb5272013-10-02 16:42:35 +05301958 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1959 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001960 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001961 }
1962
1963 switch (nvTable->nvTable)
1964 {
1965 case NV_TABLE_RATE_POWER_SETTINGS:
1966 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1967 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1968 break;
1969
1970 case NV_TABLE_REGULATORY_DOMAINS:
1971 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1972 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1973 break;
1974
1975 case NV_TABLE_DEFAULT_COUNTRY:
1976 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1977 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1978 break;
1979
1980 case NV_TABLE_TPC_POWER_TABLE:
1981 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1982 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1983 break;
1984
1985 case NV_TABLE_TPC_PDADC_OFFSETS:
1986 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1987 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1988 break;
1989
1990 case NV_TABLE_VIRTUAL_RATE:
1991 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1992 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1993 break;
1994
1995 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1996 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1997 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1998 break;
1999
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002000 case NV_TABLE_HW_CAL_VALUES:
2001 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2002 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2003 break;
2004
2005 case NV_TABLE_FW_CONFIG:
2006 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2007 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002008 break;
2009
2010 case NV_TABLE_ANTENNA_PATH_LOSS:
2011 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2012 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2013 break;
2014
2015 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2016 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2017 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2018 break;
2019
2020 default:
2021 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2022 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002023 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002024 break;
2025 }
2026
2027 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2028 {
2029 /* Invalid table size, discard and initialize data */
2030 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002031 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002032 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002033 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002034 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2035 pHddCtx->ftm.targetNVTableSize = 0;
2036 pHddCtx->ftm.processedNVTableSize = 0;
2037 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002038 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002039 }
2040
2041 /* Set Current Processing NV table type */
2042 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2043 /* Copy target NV table value into temp context buffer */
2044 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2045 pHddCtx->ftm.targetNVTablePointer,
2046 pHddCtx->ftm.targetNVTableSize);
2047
2048 }
2049
2050 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2051 {
2052 /* Invalid table type */
2053 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2054 "Invalid NV Table, now Processing %d, not %d",
2055 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2056 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2057 pHddCtx->ftm.targetNVTableSize = 0;
2058 pHddCtx->ftm.processedNVTableSize = 0;
2059 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002060
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002061 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002062 }
2063
2064 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002065 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002066 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2067 nvTable->chunkSize);
2068 /* Update processed pointer to prepare next chunk copy */
2069 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2070
2071 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2072 {
2073 /* Finished to process last chunk of data, initialize buffer */
2074 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2075 pHddCtx->ftm.targetNVTableSize = 0;
2076 pHddCtx->ftm.processedNVTableSize = 0;
2077 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2078 }
2079
2080 return 1;
2081}
2082
2083/**---------------------------------------------------------------------------
2084
2085 \brief wlan_hdd_ftm_set_nv_table() -
2086 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002087 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002088
2089 \param - ftmCmd - Pointer FTM Commad Buffer
2090
2091 \return - int
2092 -1, Process Host command fail, vail out
2093 1, Process Host command success
2094
2095 --------------------------------------------------------------------------*/
2096int wlan_hdd_ftm_set_nv_table
2097(
2098 hdd_context_t *pHddCtx,
2099 tPttMsgbuffer *ftmCmd
2100)
2101{
2102 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2103 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2104 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002105 sHalNvV2 *nvContents = NULL;
2106 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002107
2108 if (NULL == pHddCtx)
2109 {
2110 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2111 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002112 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002113 }
2114
Leo Chang80de3c22013-11-26 10:52:12 -08002115 nvVersion = vos_nv_getNvVersion();
2116 if (E_NV_V2 != nvVersion)
2117 {
2118 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2119 "%s : Not valid NV Version %d", __func__, nvVersion);
2120 return -EINVAL;
2121 }
2122
Jeff Johnson295189b2012-06-20 16:38:30 -07002123 /* Test first chunk of NV table */
2124 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2125 (0 == pHddCtx->ftm.processedNVTableSize))
2126 {
2127 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2128 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2129 {
c_hpothuffdb5272013-10-02 16:42:35 +05302130 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2131 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002132 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002133 }
2134
2135 switch (nvTable->nvTable)
2136 {
2137 case NV_TABLE_RATE_POWER_SETTINGS:
2138 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2139 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2140 break;
2141
2142 case NV_TABLE_REGULATORY_DOMAINS:
2143 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2144 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2145 break;
2146
2147 case NV_TABLE_DEFAULT_COUNTRY:
2148 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2149 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2150 break;
2151
2152 case NV_TABLE_TPC_POWER_TABLE:
2153 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2154 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2155 break;
2156
2157 case NV_TABLE_TPC_PDADC_OFFSETS:
2158 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2159 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2160 break;
2161
2162 case NV_TABLE_VIRTUAL_RATE:
2163 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2164 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2165 break;
2166
2167 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2168 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2169 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2170 break;
2171
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002172 case NV_TABLE_HW_CAL_VALUES:
2173 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2174 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2175 break;
2176
2177 case NV_TABLE_FW_CONFIG:
2178 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2179 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002180 break;
2181
2182 case NV_TABLE_ANTENNA_PATH_LOSS:
2183 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2184 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2185 break;
2186
2187 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2188 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2189 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2190 break;
2191
2192 default:
2193 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2194 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002195 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002196 break;
2197 }
2198
2199 /* Set Current Processing NV table type */
2200 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2201 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2202 {
2203 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2204 "Invalid Table Size %d", nvTable->tableSize);
2205 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2206 pHddCtx->ftm.targetNVTableSize = 0;
2207 pHddCtx->ftm.processedNVTableSize = 0;
2208 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002209 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002210 }
2211 }
2212
2213 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2214 {
2215 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2216 "Invalid NV Table, now Processing %d, not %d",
2217 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2218 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2219 pHddCtx->ftm.targetNVTableSize = 0;
2220 pHddCtx->ftm.processedNVTableSize = 0;
2221 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002222 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002223 }
2224 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002225 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002226 nvTable->chunkSize);
2227
2228 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2229 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2230 {
2231 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2232 pHddCtx->ftm.tempNVTableBuffer,
2233 pHddCtx->ftm.targetNVTableSize);
2234 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2235 pHddCtx->ftm.targetNVTableSize = 0;
2236 pHddCtx->ftm.processedNVTableSize = 0;
2237 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2238 }
2239
2240 return 1;
2241}
2242
2243/**---------------------------------------------------------------------------
2244
2245 \brief wlan_hdd_ftm_blank_nv() -
2246 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002247 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002248
2249 \param - ftmCmd - Pointer FTM Commad Buffer
2250
2251 \return - int
2252 -1, Process Host command fail, vail out
2253 0, Process Host command success
2254
2255 --------------------------------------------------------------------------*/
2256int wlan_hdd_ftm_blank_nv_table
2257(
2258 tPttMsgbuffer *ftmCmd
2259)
2260{
Leo Chang80de3c22013-11-26 10:52:12 -08002261 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002262 v_SIZE_t nvSize;
2263 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002264 sHalNvV2 *nvContents = NULL;
2265 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002266
2267 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2268 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2269 {
c_hpothuffdb5272013-10-02 16:42:35 +05302270 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2271 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002272 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002273 }
2274
Leo Chang80de3c22013-11-26 10:52:12 -08002275 nvVersion = vos_nv_getNvVersion();
2276 if (E_NV_V2 != nvVersion)
2277 {
2278 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2279 "%s : Not valid NV Version %d", __func__, nvVersion);
2280 return -EINVAL;
2281 }
2282
Jeff Johnson295189b2012-06-20 16:38:30 -07002283 itemSize = sizeof(nvContents->tables.pwrOptimum);
2284 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002285 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002286 itemSize);
2287
2288 itemSize = sizeof(nvContents->tables.regDomains);
2289 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002290 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002291 itemSize);
2292
2293 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2294 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002295 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002296 itemSize);
2297
2298 itemSize = sizeof(nvContents->tables.plutCharacterized);
2299 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002300 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002301 itemSize);
2302
2303 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2304 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002305 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002306 itemSize);
2307
2308 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2309 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002310 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002311 itemSize);
2312
2313 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2314 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002315 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002316 itemSize);
2317
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002318 itemSize = sizeof(nvContents->tables.hwCalValues);
2319 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002320 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 itemSize);
2322
2323 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2324 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002325 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002326 itemSize);
2327
2328 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2329 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002330 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002331 itemSize);
2332
2333 return 1;
2334}
2335
2336/**---------------------------------------------------------------------------
2337
2338 \brief wlan_hdd_ftm_delete_nv_table() -
2339 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002340 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002341
2342 \param - ftmCmd - Pointer FTM Commad Buffer
2343
2344 \return - int
2345 -1, Process Host command fail, vail out
2346 1, Process Host command success
2347
2348 --------------------------------------------------------------------------*/
2349int wlan_hdd_ftm_delete_nv_table
2350(
2351 tPttMsgbuffer *ftmCmd
2352)
2353{
Leo Chang80de3c22013-11-26 10:52:12 -08002354 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002355 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2356 v_SIZE_t nvSize;
2357 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002358 sHalNvV2 *nvContents = NULL;
2359 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002360
2361 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2362 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2363 {
c_hpothuffdb5272013-10-02 16:42:35 +05302364 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2365 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002366 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002367 }
2368
Leo Chang80de3c22013-11-26 10:52:12 -08002369 nvVersion = vos_nv_getNvVersion();
2370 if (E_NV_V2 != nvVersion)
2371 {
2372 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2373 "%s : Not valid NV Version %d", __func__, nvVersion);
2374 return -EINVAL;
2375 }
2376
Jeff Johnson295189b2012-06-20 16:38:30 -07002377 switch (nvTable->nvTable)
2378 {
2379 case NV_TABLE_RATE_POWER_SETTINGS:
2380 itemSize = sizeof(nvContents->tables.pwrOptimum);
2381 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002382 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002383 itemSize);
2384 break;
2385
2386 case NV_TABLE_REGULATORY_DOMAINS:
2387 itemSize = sizeof(nvContents->tables.regDomains);
2388 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002389 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002390 itemSize);
2391 break;
2392
2393 case NV_TABLE_DEFAULT_COUNTRY:
2394 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2395 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002396 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002397 itemSize);
2398 break;
2399
2400 case NV_TABLE_TPC_POWER_TABLE:
2401 itemSize = sizeof(nvContents->tables.plutCharacterized);
2402 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002403 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002404 itemSize);
2405 break;
2406
2407 case NV_TABLE_TPC_PDADC_OFFSETS:
2408 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2409 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002410 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002411 itemSize);
2412 break;
2413
2414 case NV_TABLE_VIRTUAL_RATE:
2415 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2416 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002417 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002418 itemSize);
2419 break;
2420
2421 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2422 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2423 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002424 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002425 itemSize);
2426 break;
2427
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002428 case NV_TABLE_HW_CAL_VALUES:
2429 itemSize = sizeof(nvContents->tables.hwCalValues);
2430 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002431 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002432 itemSize);
2433 break;
2434
2435 case NV_TABLE_FW_CONFIG:
2436 itemSize = sizeof(nvContents->tables.fwConfig);
2437 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002438 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002439 itemSize);
2440 break;
2441
2442 case NV_TABLE_ANTENNA_PATH_LOSS:
2443 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2444 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002445 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002446 itemSize);
2447 break;
2448
2449 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2450 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2451 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002452 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002453 itemSize);
2454 break;
2455
2456 default:
2457 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2458 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002459 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002460 break;
2461 }
2462
2463 return 1;
2464}
2465
2466/**---------------------------------------------------------------------------
2467
2468 \brief wlan_hdd_ftm_get_nv_field() -
2469 Get Specific NV field
2470
2471 \param - ftmCmd - Pointer FTM Commad Buffer
2472
2473 \return - int
2474 -1, Process Host command fail, vail out
2475 1, Process Host command success
2476
2477 --------------------------------------------------------------------------*/
2478int wlan_hdd_ftm_get_nv_field
2479(
2480 tPttMsgbuffer *ftmCmd
2481)
2482{
2483 sNvFields nvFieldDataBuffer;
2484 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2485 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2486 sHalNv *nvContents = NULL;
2487 v_SIZE_t nvSize;
2488
2489 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2490 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2491 {
c_hpothuffdb5272013-10-02 16:42:35 +05302492 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2493 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002494 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002495 }
2496 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2497
2498 switch (nvField->nvField)
2499 {
2500 case NV_COMMON_PRODUCT_ID:
2501 memcpy((void *)&nvField->fieldData,
2502 &nvFieldDataBuffer.productId,
2503 sizeof(nvFieldDataBuffer.productId));
2504 break;
2505
2506 case NV_COMMON_PRODUCT_BANDS:
2507 memcpy((void *)&nvField->fieldData,
2508 &nvFieldDataBuffer.productBands,
2509 sizeof(nvFieldDataBuffer.productBands));
2510 break;
2511
2512 case NV_COMMON_NUM_OF_TX_CHAINS:
2513 memcpy((void *)&nvField->fieldData,
2514 &nvFieldDataBuffer.numOfTxChains,
2515 sizeof(nvFieldDataBuffer.numOfTxChains));
2516 break;
2517
2518 case NV_COMMON_NUM_OF_RX_CHAINS:
2519 memcpy((void *)&nvField->fieldData,
2520 &nvFieldDataBuffer.numOfRxChains,
2521 sizeof(nvFieldDataBuffer.numOfRxChains));
2522 break;
2523
2524 case NV_COMMON_MAC_ADDR:
2525 memcpy((void *)&nvField->fieldData,
2526 &nvFieldDataBuffer.macAddr[0],
2527 NV_FIELD_MAC_ADDR_SIZE);
2528 break;
2529
2530 case NV_COMMON_MFG_SERIAL_NUMBER:
2531 memcpy((void *)&nvField->fieldData,
2532 &nvFieldDataBuffer.mfgSN[0],
2533 NV_FIELD_MFG_SN_SIZE);
2534 break;
2535
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002536 case NV_COMMON_WLAN_NV_REV_ID:
2537 memcpy((void *)&nvField->fieldData,
2538 &nvFieldDataBuffer.wlanNvRevId,
2539 sizeof(nvFieldDataBuffer.wlanNvRevId));
2540 break;
2541
Jeff Johnson295189b2012-06-20 16:38:30 -07002542 case NV_COMMON_COUPLER_TYPE:
2543 memcpy((void *)&nvField->fieldData,
2544 &nvFieldDataBuffer.couplerType,
2545 sizeof(nvFieldDataBuffer.couplerType));
2546 break;
2547
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002548 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002549 {
2550 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2551 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2552
2553 nvEmbededStatus = vos_nv_isEmbeddedNV();
2554
2555 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2556 {
2557 // High bit is set to indicate embedded NV..
2558 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2559 }
2560
2561 memcpy((void *)&nvField->fieldData,
2562 &nvVersion,
2563 sizeof(nvFieldDataBuffer.nvVersion));
2564 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002565 break;
2566
Jeff Johnson295189b2012-06-20 16:38:30 -07002567 default:
2568 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2569 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002570 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002571 break;
2572 }
2573
2574 return 1;
2575}
2576
2577/**---------------------------------------------------------------------------
2578
2579 \brief wlan_hdd_ftm_set_nv_field() -
2580 Set Specific NV field
2581
2582 \param - ftmCmd - Pointer FTM Commad Buffer
2583
2584 \return - int
2585 -1, Process Host command fail, vail out
2586 1, Process Host command success
2587
2588 --------------------------------------------------------------------------*/
2589int wlan_hdd_ftm_set_nv_field
2590(
2591 tPttMsgbuffer *ftmCmd
2592)
2593{
2594 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2595 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2596 v_SIZE_t nvSize;
2597 sHalNv *nvContents = NULL;
2598 v_U8_t macLoop;
2599 v_U8_t *pNVMac;
2600 v_U8_t lastByteMAC;
2601
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002602
Jeff Johnson295189b2012-06-20 16:38:30 -07002603 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2604 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2605 {
c_hpothuffdb5272013-10-02 16:42:35 +05302606 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2607 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002608 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002609 }
2610
2611 switch (nvField->nvField)
2612 {
2613 case NV_COMMON_PRODUCT_ID:
2614 memcpy(&nvContents->fields.productId,
2615 &nvField->fieldData,
2616 sizeof(nvContents->fields.productId));
2617 break;
2618
2619 case NV_COMMON_PRODUCT_BANDS:
2620 memcpy(&nvContents->fields.productBands,
2621 &nvField->fieldData,
2622 sizeof(nvContents->fields.productBands));
2623 break;
2624
2625 case NV_COMMON_NUM_OF_TX_CHAINS:
2626 memcpy(&nvContents->fields.numOfTxChains,
2627 &nvField->fieldData,
2628 sizeof(nvContents->fields.numOfTxChains));
2629 break;
2630
2631 case NV_COMMON_NUM_OF_RX_CHAINS:
2632 memcpy(&nvContents->fields.numOfRxChains,
2633 &nvField->fieldData,
2634 sizeof(nvContents->fields.numOfRxChains));
2635 break;
2636
2637 case NV_COMMON_MAC_ADDR:
2638 /* If Last byte is larger than 252 (0xFC), return Error,
2639 * Since 3MACs should be derived from first MAC */
2640 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002641 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002642 {
2643 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2644 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002645 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002646 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002647 }
2648
2649 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002650 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002651 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2652 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002653 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002654 lastByteMAC + macLoop;
2655 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002656 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002657 NV_FIELD_MAC_ADDR_SIZE);
2658 }
2659 break;
2660
2661 case NV_COMMON_MFG_SERIAL_NUMBER:
2662 memcpy(&nvContents->fields.mfgSN[0],
2663 &nvField->fieldData,
2664 NV_FIELD_MFG_SN_SIZE);
2665 break;
2666
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002667 case NV_COMMON_WLAN_NV_REV_ID:
2668 memcpy(&nvContents->fields.wlanNvRevId,
2669 &nvField->fieldData,
2670 sizeof(nvContents->fields.wlanNvRevId));
2671 break;
2672
Jeff Johnson295189b2012-06-20 16:38:30 -07002673 case NV_COMMON_COUPLER_TYPE:
2674 memcpy(&nvContents->fields.couplerType,
2675 &nvField->fieldData,
2676 sizeof(nvContents->fields.couplerType));
2677 break;
2678
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002679 case NV_COMMON_NV_VERSION:
2680 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2681 "Cannot modify NV version field %d", nvField->nvField);
2682 return -EIO;
2683 break;
2684
Jeff Johnson295189b2012-06-20 16:38:30 -07002685 default:
2686 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2687 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002688 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002689 break;
2690 }
2691
2692 return 1;
2693}
2694
2695/**---------------------------------------------------------------------------
2696
2697 \brief wlan_hdd_ftm_store_nv_table() -
2698 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002699 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002700
2701 \param - ftmCmd - Pointer FTM Commad Buffer
2702
2703 \return - int
2704 -1, Process Host command fail, vail out
2705 0, Process Host command success
2706
2707 --------------------------------------------------------------------------*/
2708int wlan_hdd_ftm_store_nv_table
2709(
2710 tPttMsgbuffer *ftmCmd
2711)
2712{
2713 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2714 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002715 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2716 void *tablePtr = NULL;
2717 unsigned int tableSize = 0;
2718 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002719 sHalNvV2 *nvContents = NULL;
2720 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002721
2722 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2723 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2724 {
c_hpothuffdb5272013-10-02 16:42:35 +05302725 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2726 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002727 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002728 }
2729
Leo Chang80de3c22013-11-26 10:52:12 -08002730 nvVersion = vos_nv_getNvVersion();
2731 if (E_NV_V2 != nvVersion)
2732 {
2733 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2734 "%s : Not valid NV Version %d", __func__, nvVersion);
2735 return -EINVAL;
2736 }
2737
Jeff Johnson295189b2012-06-20 16:38:30 -07002738 /* Set Platform type as PRIMA */
2739 nvContents->fields.wlanNvRevId = 2;
2740
2741 switch(nvTable->nvTable)
2742 {
2743 case NV_FIELDS_IMAGE:
2744 tablePtr = (void *)&nvContents->fields;
2745 tableSize = sizeof(nvContents->fields);
2746 tableVNVType = VNV_FIELD_IMAGE;
2747 break;
2748
2749 case NV_TABLE_RATE_POWER_SETTINGS:
2750 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2751 tableSize = sizeof(nvContents->tables.pwrOptimum);
2752 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2753 break;
2754
2755 case NV_TABLE_REGULATORY_DOMAINS:
2756 tablePtr = (void *)&nvContents->tables.regDomains[0];
2757 tableSize = sizeof(nvContents->tables.regDomains);
2758 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2759 break;
2760
2761 case NV_TABLE_DEFAULT_COUNTRY:
2762 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2763 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2764 tableVNVType = VNV_DEFAULT_LOCATION;
2765 break;
2766
2767 case NV_TABLE_TPC_POWER_TABLE:
2768 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2769 tableSize = sizeof(nvContents->tables.plutCharacterized);
2770 tableVNVType = VNV_TPC_POWER_TABLE;
2771 break;
2772
2773 case NV_TABLE_TPC_PDADC_OFFSETS:
2774 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2775 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2776 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2777 break;
2778
2779 case NV_TABLE_VIRTUAL_RATE:
2780 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2781 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2782 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2783 break;
2784
2785 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2786 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2787 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2788 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2789 break;
2790
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002791 case NV_TABLE_HW_CAL_VALUES:
2792 tablePtr = (void *)&nvContents->tables.hwCalValues;
2793 tableSize = sizeof(nvContents->tables.hwCalValues);
2794 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002795 break;
2796
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002797 case NV_TABLE_FW_CONFIG:
2798 tablePtr = (void *)&nvContents->tables.fwConfig;
2799 tableSize = sizeof(nvContents->tables.fwConfig);
2800 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002801 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002802
Jeff Johnson295189b2012-06-20 16:38:30 -07002803 case NV_TABLE_ANTENNA_PATH_LOSS:
2804 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2805 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2806 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2807 break;
2808
2809 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2810 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2811 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2812 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2813 break;
2814
2815 default:
2816 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2817 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002818 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002819 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002820
Jeff Johnson295189b2012-06-20 16:38:30 -07002821 }
2822
2823 nvStatus = vos_nv_write(tableVNVType,
2824 tablePtr,
2825 tableSize);
2826 if(VOS_STATUS_SUCCESS != nvStatus)
2827 {
c_hpothuffdb5272013-10-02 16:42:35 +05302828 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2829 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002830 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002831 }
2832
2833 return 1;
2834}
2835
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002836/* --------------------------------------------------------------------------
2837 \brief wlan_hdd_ftm_get_nv_bin() -
2838 Get NV bin read from Flash Memory, file
2839
2840 \param - ftmCmd - Pointer FTM Commad Buffer
2841
2842 \return - int
2843 -1, Process Host command fail, vail out
2844 0, Process Host command success
2845--------------------------------------------------------------------------*/
2846
2847static int wlan_hdd_ftm_get_nv_bin
2848(
2849 v_U16_t msgId,
2850 hdd_context_t *pHddCtx,
2851 tPttMsgbuffer *ftmCmd
2852)
2853{
2854 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2855 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2856 v_SIZE_t nvSize;
2857 v_U8_t *nvContents;
2858 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002859 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002860
Leo Chang80de3c22013-11-26 10:52:12 -08002861 nvVersion = vos_nv_getNvVersion();
2862 if (E_NV_V3 != nvVersion)
2863 {
2864 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2865 "%s : Not valid NV Version %d", __func__, nvVersion);
2866 return -EINVAL;
2867 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002868
2869 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2870 (0 == pHddCtx->ftm.processedNVTableSize))
2871 {
2872 if ( msgId == PTT_MSG_GET_NV_BIN )
2873 {
2874 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2875 }
2876 else
2877 {
2878 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2879 }
2880
2881 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2882 {
c_hpothuffdb5272013-10-02 16:42:35 +05302883 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2884 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002885 return -EIO;
2886 }
2887
2888 switch (nvTable->nvTable)
2889 {
2890 case NV_BINARY_IMAGE:
2891 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2892 break;
2893 default:
2894 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2895 "Not Valid NV Table %d", nvTable->nvTable);
2896 return -EIO;
2897 break;
2898 }
2899
2900 /* Set Current Processing NV table type */
2901 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2902 if ( msgId == PTT_MSG_GET_NV_BIN )
2903 {
2904 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2905 /* Validity Period */
2906 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2907 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2908 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2909 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2910 offset = sizeof(v_U32_t);
2911 }
2912 else
2913 {
2914 pHddCtx->ftm.targetNVTableSize = nvSize;
2915 offset = 0;
2916 }
2917
2918 /* Copy target NV table value into temp context buffer */
2919 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2920 pHddCtx->ftm.targetNVTablePointer,
2921 pHddCtx->ftm.targetNVTableSize);
2922 }
2923
2924
2925 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2926 {
2927 /* Invalid table type */
2928 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2929 "Invalid NV Table, now Processing %d, not %d",
2930 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2931
2932 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2933 pHddCtx->ftm.targetNVTableSize = 0;
2934 pHddCtx->ftm.processedNVTableSize = 0;
2935 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2936
2937 return -EINVAL;
2938 }
2939
2940 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2941
2942 /* Update processed pointer to prepare next chunk copy */
2943 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2944 pHddCtx->ftm.targetNVTableSize )
2945 {
2946 nvTable->chunkSize =
2947 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2948 }
2949
2950 /* Copy next chunk of NV table value into response buffer */
2951 vos_mem_copy(
2952 &nvTable->tableData,
2953 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2954 nvTable->chunkSize);
2955
2956 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2957
2958 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2959 {
2960 /* Finished to process last chunk of data, initialize buffer */
2961 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2962 pHddCtx->ftm.targetNVTableSize = 0;
2963 pHddCtx->ftm.processedNVTableSize = 0;
2964 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2965 }
2966
2967 return 1;
2968}
2969
2970/**---------------------------------------------------------------------------
2971
2972 \brief wlan_hdd_ftm_set_nv_bin() -
2973 Set NV bin to Flash Memory, file
2974
2975 \param - ftmCmd - Pointer FTM Commad Buffer
2976
2977 \return - int
2978 -1, Process Host command fail, vail out
2979 0, Process Host command success
2980
2981+----------------------------------------------------------------------------*/
2982
2983static int wlan_hdd_ftm_set_nv_bin
2984(
2985 hdd_context_t *pHddCtx,
2986 tPttMsgbuffer *ftmCmd
2987)
2988{
2989 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2990 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002991 eNvVersionType nvVersion;
2992
2993 nvVersion = vos_nv_getNvVersion();
2994 if (E_NV_V3 != nvVersion)
2995 {
2996 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2997 "%s : Not valid NV Version %d", __func__, nvVersion);
2998 return -EINVAL;
2999 }
3000
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003001
3002 /* Test first chunk of NV table */
3003 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
3004 (0 == pHddCtx->ftm.processedNVTableSize))
3005 {
3006 switch (nvTable->nvTable)
3007 {
3008 case NV_BINARY_IMAGE:
3009 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
3010 break;
3011 default:
3012 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3013 "Not Valid NV Table %d", nvTable->nvTable);
3014 return -EIO;
3015 break;
3016 }
3017
3018 /* Set Current Processing NV table type */
3019 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
3020 pHddCtx->ftm.processedNVTableSize = 0;
3021
3022 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
3023 {
3024 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3025 "Invalid Table Size %d", nvTable->tableSize);
3026 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3027 pHddCtx->ftm.targetNVTableSize = 0;
3028 pHddCtx->ftm.processedNVTableSize = 0;
3029 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3030 return -EINVAL;
3031 }
3032 }
3033
3034 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3035 {
3036 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3037 "Invalid NV Table, now Processing %d, not %d",
3038 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3039 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3040 pHddCtx->ftm.targetNVTableSize = 0;
3041 pHddCtx->ftm.processedNVTableSize = 0;
3042 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3043 return -EINVAL;
3044 }
3045
3046 vos_mem_copy(
3047 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3048 &nvTable->tableData,
3049 nvTable->chunkSize);
3050
3051 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3052
3053 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3054 {
3055 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3056 "Processing Done!! write encoded Buffer %d",
3057 pHddCtx->ftm.targetNVTableSize);
3058
3059 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3060 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3061
3062 if ((VOS_STATUS_SUCCESS != nvStatus))
3063 {
3064 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3065 "Fail to set NV Binary %d", nvStatus);
3066 return -EIO;
3067 }
3068
3069 nvStatus = vos_nv_setNVEncodedBuffer(
3070 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3071 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3072
3073 if ((VOS_STATUS_SUCCESS != nvStatus))
3074 {
3075 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3076 "Fail to set NV Binary %d", nvStatus);
3077 return -EIO;
3078 }
3079
3080 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3081 pHddCtx->ftm.targetNVTableSize = 0;
3082 pHddCtx->ftm.processedNVTableSize = 0;
3083 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3084 }
3085
3086 return 1;
3087}
3088
Jeff Johnson295189b2012-06-20 16:38:30 -07003089/**---------------------------------------------------------------------------
3090
3091 \brief wlan_hdd_ftm_temp_get_rel_num() -
3092 Get internal release number
3093
3094 \param - ftmCmd - Pointer FTM Commad Buffer
3095
3096 \return - int
3097 -1, Process Host command fail, vail out
3098 0, Process Host command success
3099
3100 --------------------------------------------------------------------------*/
3101int wlan_hdd_ftm_temp_get_rel_num
3102(
3103 tPttMsgbuffer *ftmCmd
3104)
3105{
3106 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3107
3108 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3109 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3110 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3111 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3112 relNum->relParams.pttMax = 10;
3113 relNum->relParams.pttMin = 1;
3114
3115 return 1;
3116}
3117
3118/**---------------------------------------------------------------------------
3119
3120 \brief wlan_hdd_process_ftm_host_cmd() -
3121 process any command should be handled within host.
3122 decide any command should be send to HAL or not
3123
3124 \param - ftmCmd - Pointer FTM Commad Buffer
3125
3126 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003127 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003128 0, Process Host command success, not need to send CMD to HAL
3129 1, Process Host command success, need to send CMD to HAL
3130
3131 --------------------------------------------------------------------------*/
3132int wlan_hdd_process_ftm_host_cmd
3133(
3134 hdd_context_t *pHddCtx,
3135 void *ftmCmd
3136)
3137{
3138 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3139 int needToRouteHal = 1;
3140 int hostState = 1;
3141
3142 switch(pFTMCmd->msgId)
3143 {
3144 case PTT_MSG_GET_NV_TABLE:
3145 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3146 needToRouteHal = 0;
3147 break;
3148
3149 case PTT_MSG_SET_NV_TABLE:
3150 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3151 /* Temp NV Operation will be isolated to host
3152 needToRouteHal = 1; */
3153 needToRouteHal = 0;
3154 break;
3155
3156 case PTT_MSG_BLANK_NV:
3157 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3158 needToRouteHal = 1;
3159 break;
3160
3161 case PTT_MSG_DEL_NV_TABLE:
3162 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3163 needToRouteHal = 1;
3164 break;
3165
3166 case PTT_MSG_GET_NV_FIELD:
3167 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3168 needToRouteHal = 0;
3169 break;
3170
3171 case PTT_MSG_SET_NV_FIELD:
3172 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3173 needToRouteHal = 0;
3174 break;
3175
3176 case PTT_MSG_STORE_NV_TABLE:
3177 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3178 needToRouteHal = 0;
3179 break;
3180
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003181 case PTT_MSG_GET_NV_BIN:
3182 case PTT_MSG_GET_DICTIONARY:
3183 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3184 needToRouteHal = 0;
3185 break;
3186
3187 case PTT_MSG_SET_NV_BIN:
3188 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3189 needToRouteHal = 0;
3190 break;
3191
Jeff Johnson295189b2012-06-20 16:38:30 -07003192 case PTT_MSG_DBG_READ_REGISTER:
3193 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3194 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3195 needToRouteHal = 0;
3196 break;
3197
3198 case PTT_MSG_DBG_WRITE_REGISTER:
3199 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3200 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3201 needToRouteHal = 0;
3202 break;
3203
3204 case PTT_MSG_DBG_READ_MEMORY:
3205 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3206 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3207 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3208 needToRouteHal = 0;
3209 break;
3210
3211 case PTT_MSG_DBG_WRITE_MEMORY:
3212 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3213 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3214 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3215 needToRouteHal = 0;
3216 break;
3217
3218 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3219 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3220 needToRouteHal = 0;
3221 break;
3222
3223 default:
3224 needToRouteHal = 1;
3225 break;
3226 }
3227
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003228 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003229 {
3230 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3231 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003232 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003233 }
3234
3235 return needToRouteHal;
3236}
Jeff Johnson295189b2012-06-20 16:38:30 -07003237
3238/**---------------------------------------------------------------------------
3239
3240 \brief wlan_hdd_process_ftm_cmd() -
3241
3242 This function process the commands received from the ptt socket application.
3243
3244 \param - pAdapter - Pointer HDD Context.
3245
3246 \param - wnl - Pointer to the ANI netlink header.
3247
3248 \return - none
3249
3250 --------------------------------------------------------------------------*/
3251
3252void wlan_hdd_process_ftm_cmd
3253(
3254 hdd_context_t *pHddCtx,
3255 tAniNlHdr *wnl
3256)
3257{
3258 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3259 v_U16_t cmd_len;
3260 v_U8_t *pftm_data;
3261 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003262 int hostState;
3263 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003264
3265 ENTER();
3266
Jeff Johnsone7245742012-09-05 17:12:55 -07003267 //Delay to fix NV write failure on JB
3268 vos_busy_wait(10000); //10ms
3269
Jeff Johnson295189b2012-06-20 16:38:30 -07003270 if (!pRequestBuf) {
3271
Arif Hussain6d2a3322013-11-17 19:50:10 -08003272 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003273 return ;
3274 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303275
3276 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3277 {
3278 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3279 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3280 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3281 return ;
3282 }
3283
Jeff Johnson295189b2012-06-20 16:38:30 -07003284 /*Save the received request*/
3285 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3286
3287 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3288 /*Save the received request netlink header used for sending the response*/
3289 pHddCtx->ftm.wnl = wnl;
3290 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3291
Arif Hussain6d2a3322013-11-17 19:50:10 -08003292 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003293
3294 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3295 wlan_ftm_send_response(pHddCtx);
3296 return ;
3297 }
3298
3299 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3300 {
3301 case WLAN_FTM_START:
3302 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3303
Arif Hussain6d2a3322013-11-17 19:50:10 -08003304 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003305 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3306 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3307 wlan_ftm_send_response(pHddCtx);
3308 return;
3309 }
3310
3311 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3312 {
3313 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3314 ,__func__);
3315 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3316 wlan_ftm_send_response(pHddCtx);
3317 return;
3318 }
3319 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3320 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3321 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3322 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3323
3324 wlan_ftm_send_response(pHddCtx);
3325
3326 break;
3327
3328 case WLAN_FTM_STOP:
3329 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3330
Arif Hussain6d2a3322013-11-17 19:50:10 -08003331 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003332 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3333 wlan_ftm_send_response(pHddCtx);
3334 return;
3335 }
3336
3337 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3338
3339 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3340 wlan_ftm_send_response(pHddCtx);
3341 return;
3342 }
3343
3344 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3345 /* This would send back the Command Success Status */
3346 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3347
3348 wlan_ftm_send_response(pHddCtx);
3349
3350 break;
3351
3352 case WLAN_FTM_CMD:
3353 /* if it is regular FTM command, pass it to HAL PHY */
3354 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003355 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003356 return;
3357 }
3358 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3359
Arif Hussain6d2a3322013-11-17 19:50:10 -08003360 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003361
3362 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3363 wlan_ftm_send_response(pHddCtx);
3364 return;
3365
3366 }
3367 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3368 cmd_len = pRequestBuf->ftm_hdr.data_len;
3369 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3370 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3371
Jeff Johnson295189b2012-06-20 16:38:30 -07003372 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3373 if (0 == hostState)
3374 {
3375 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3376 if (NULL == tempRspBuffer)
3377 {
3378 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003379 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003380 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3381 wlan_ftm_send_response(pHddCtx);
3382 return;
3383 }
3384 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3385 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3386 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3387 (unsigned char *) tempRspBuffer,
3388 tempRspBuffer->msgBodyLength);
3389 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3390 wlan_ftm_send_response(pHddCtx);
3391 vos_mem_free(tempRspBuffer);
3392 return;
3393 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003394 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003395 {
3396 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3397 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3398 wlan_ftm_send_response(pHddCtx);
3399 return;
3400 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003401
3402 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3403
Jeff Johnson295189b2012-06-20 16:38:30 -07003404
3405 /*Post the command to the HAL*/
3406 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3407
Arif Hussain6d2a3322013-11-17 19:50:10 -08003408 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003409 return;
3410
3411 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303412 /*After successful posting of message the command should be pending*/
3413 pHddCtx->ftm.IsCmdPending = TRUE;
3414
Jeff Johnson295189b2012-06-20 16:38:30 -07003415 /*Wait here until you get the response from HAL*/
3416 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3417 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303418 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3419 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3420 wlan_ftm_send_response(pHddCtx);
3421 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003422 return;
3423 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303424 /*This check will handle the case where the completion is sent by
3425 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3426 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3427 {
3428 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3429 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3430 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3431
3432 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3433 wlan_ftm_send_response(pHddCtx);
3434 pHddCtx->ftm.IsCmdPending = FALSE;
3435 return ;
3436 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003437
3438 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3439
3440 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3441
3442 wlan_ftm_send_response(pHddCtx);
3443 pHddCtx->ftm.IsCmdPending = FALSE;
3444 break;
3445
3446 default:
3447
Arif Hussain6d2a3322013-11-17 19:50:10 -08003448 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003449 return;
3450 }
3451
3452 EXIT();
3453 return;
3454} /* wlan_adp_ftm_cmd() */
3455
3456/**---------------------------------------------------------------------------
3457
3458 \brief wlan_ftm_priv_start_stop_ftm() -
3459
3460 This function is used for start/stop the ftm driver.
3461
3462 \param - pAdapter - Pointer HDD Context.
3463 - start - 1/0 to start/stop ftm driver.
3464
3465 \return - 0 for success, non zero for failure
3466
3467 --------------------------------------------------------------------------*/
3468
3469static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3470 v_U16_t start)
3471{
3472 VOS_STATUS status;
3473 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3474
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003475 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003476 {
3477 pHddCtx->ftm.cmd_iwpriv = TRUE;
3478 status = wlan_hdd_ftm_start(pHddCtx);
3479
3480 if (status != VOS_STATUS_SUCCESS)
3481 {
3482 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3483 "FTM Start Failed");
3484 return VOS_STATUS_E_FAILURE;
3485 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303486 if (NULL == pMsgBuf)
3487 {
3488 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3489 if (NULL == pMsgBuf)
3490 {
3491 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3492 "%s:pMsgBuf is NULL", __func__);
3493 return VOS_STATUS_E_FAILURE;
3494 }
3495 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003496 }
3497 else
3498 {
3499 status = wlan_ftm_stop(pHddCtx);
3500
3501 if (status != VOS_STATUS_SUCCESS)
3502 {
3503 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3504 "FTM Stop Failed");
3505 return VOS_STATUS_E_FAILURE;
3506 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303507 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3508 if (pMsgBuf)
3509 {
3510 vos_mem_free((v_VOID_t * )pMsgBuf);
3511 pMsgBuf = NULL;
3512 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003513 }
3514 return VOS_STATUS_SUCCESS;
3515}
3516
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303517
3518static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3519{
3520 unsigned int *table = NULL;
3521 int index = 0;
3522
3523 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3524 table = valid_channel;
3525 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3526 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3527 table = valid_channel_cb40;
3528 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3529 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3530 table = valid_channel_cb80;
3531
3532 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303533 {
3534 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3535 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303536 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303537 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303538
3539 while (table[index] != 0)
3540 {
3541 if (table[index] == channel)
3542 return VOS_STATUS_SUCCESS;
3543
3544 index++;
3545 }
3546
3547 return VOS_STATUS_E_FAILURE;
3548}
3549
3550
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303551static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3552{
3553 unsigned int primary_channel = center_channel;
3554
3555 if (center_channel <= 14)
3556 return primary_channel ;
3557
3558 switch (cb)
3559 {
3560 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3561 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3562 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3563 primary_channel -= 2;
3564 break;
3565
3566
3567 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3568 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3569 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3570 primary_channel += 2;
3571 break;
3572
3573 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3574 primary_channel -= 6;
3575 break;
3576
3577 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3578 primary_channel += 6;
3579 break;
3580 }
3581
3582 return primary_channel;
3583
3584}
3585
Jeff Johnson295189b2012-06-20 16:38:30 -07003586/**---------------------------------------------------------------------------
3587
3588 \brief wlan_ftm_priv_set_channel() -
3589
3590 This function is used for setting the channel to the halphy ptt module.
3591
3592 \param - pAdapter - Pointer HDD Context.
3593 - channel - Channel Number 1-14.
3594
3595 \return - 0 for success, non zero for failure
3596
3597 --------------------------------------------------------------------------*/
3598
3599static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3600{
Jeff Johnson295189b2012-06-20 16:38:30 -07003601 uPttMsgs *pMsgBody;
3602 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303603 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003604 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3605
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303606 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
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:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003610 return VOS_STATUS_E_FAILURE;
3611 }
3612
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303613 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003614 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303615 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3616 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003617 return VOS_STATUS_E_FAILURE;
3618 }
3619
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303620 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003621 init_completion(&pHddCtx->ftm.ftm_comp_var);
3622 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3623 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3624
3625 pMsgBody = &pMsgBuf->msgBody;
3626
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303627 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003628
Arif Hussain6d2a3322013-11-17 19:50:10 -08003629 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303630 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003631
3632 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3633
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303634 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003635 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303636 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3637 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003638 status = VOS_STATUS_E_FAILURE;
3639 goto done;
3640
3641 }
c_hpothuffdb5272013-10-02 16:42:35 +05303642 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303643 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303644 if (0 >= ret )
3645 {
3646 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3647 FL("wait on ftm_comp_var failed %ld"), ret);
3648 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003649
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303650 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003651 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303652 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3653 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003654 status = VOS_STATUS_E_FAILURE;
3655 goto done;
3656
3657 }
3658done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003659
3660 return status;
3661}
3662
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303663
3664/**---------------------------------------------------------------------------
3665
3666 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3667
3668 This function is used for setting the power control mode for tx.
3669
3670 \param - pAdapter - Pointer HDD Context.
3671 - pwr_mode - power control mode 0-2.
3672
3673 \return - 0 for success, non zero for failure
3674
3675 --------------------------------------------------------------------------*/
3676
3677static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3678 v_U16_t pwr_mode)
3679{
3680 uPttMsgs *pMsgBody;
3681 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303682 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303683 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3684
3685 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3686 {
3687 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3688 "%s:Ftm has not started. Please start the ftm. ", __func__);
3689 return VOS_STATUS_E_FAILURE;
3690 }
3691
3692 if (pwr_mode > 2)
3693 {
3694 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3695 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3696 return VOS_STATUS_E_FAILURE;
3697 }
3698
3699 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3700 init_completion(&pHddCtx->ftm.ftm_comp_var);
3701 pMsgBody = &pMsgBuf->msgBody;
3702 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3703 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3704
3705 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3706 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3707
3708 if (status != VOS_STATUS_SUCCESS)
3709 {
3710 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3711 "%s:wlan_ftm_postmsg failed", __func__);
3712 status = VOS_STATUS_E_FAILURE;
3713 goto done;
3714 }
c_hpothuffdb5272013-10-02 16:42:35 +05303715 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303716 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303717 if (0 >= ret )
3718 {
3719 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3720 FL("wait on ftm_comp_var failed %ld"), ret);
3721 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303722
3723 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3724 {
3725 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3726 "%s:Ptt response status failed", __func__);
3727 status = VOS_STATUS_E_FAILURE;
3728 goto done;
3729 }
3730
3731 done:
3732 return status;
3733
3734}
3735
Jeff Johnson295189b2012-06-20 16:38:30 -07003736/**---------------------------------------------------------------------------
3737
3738 \brief wlan_ftm_priv_set_txpower() -
3739
3740 This function is used for setting the txpower to the halphy ptt module.
3741
3742 \param - pAdapter - Pointer HDD Context.
3743 - txpower - txpower Number 1-18.
3744
3745 \return - 0 for success, non zero for failure
3746
3747 --------------------------------------------------------------------------*/
3748
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303749static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3750 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003751{
Jeff Johnson295189b2012-06-20 16:38:30 -07003752 uPttMsgs *pMsgBody;
3753 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303754 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003755 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3756
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303757 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003758 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3760 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003761 return VOS_STATUS_E_FAILURE;
3762 }
3763
3764 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3765 * when tx pktgen is enabled
3766 */
3767 if (ftm_status.frameGenEnabled)
3768 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303769 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3770 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 return VOS_STATUS_E_FAILURE;
3772 }
3773
3774 if(!(txpower >= 9 && txpower <= 24))
3775 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303776 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3777 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003778 return VOS_STATUS_E_FAILURE;
3779 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003780
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303781 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3782 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003783 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003784 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3785 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3786
3787 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3788
3789 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3790
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303791 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003792 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303793 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3794 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003795 status = VOS_STATUS_E_FAILURE;
3796 goto done;
3797 }
c_hpothuffdb5272013-10-02 16:42:35 +05303798 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303799 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303800 if (0 >= ret )
3801 {
3802 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3803 FL("wait on ftm_comp_var failed %ld"), ret);
3804 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003805
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303806 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003807 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303808 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3809 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003810 status = VOS_STATUS_E_FAILURE;
3811 goto done;
3812 }
3813
Jeff Johnson295189b2012-06-20 16:38:30 -07003814 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003815
3816 return status;
3817
3818}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303819
3820
3821static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3822 v_U16_t enable)
3823{
3824 tANI_U32 value = 0;
3825 tANI_U32 reg_addr;
3826 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303827
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303828 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3829 {
3830 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3831 "%s:Ftm has not started. Please start the ftm. ", __func__);
3832 return VOS_STATUS_E_FAILURE;
3833 }
3834
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303835 reg_addr = WCNSS_TXFIR_OFFSET;
3836
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303837 wpalReadRegister(reg_addr, &value);
3838 if (enable)
3839 {
3840 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3841 }
3842 else
3843 {
3844 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3845 }
3846
3847 wpalWriteRegister(reg_addr, value);
3848
3849 return VOS_STATUS_SUCCESS;
3850}
3851
3852
Jeff Johnson295189b2012-06-20 16:38:30 -07003853/**---------------------------------------------------------------------------
3854
3855 \brief wlan_ftm_priv_set_txrate() -
3856
3857 This function is used for setting the txrate to the halphy ptt module.
3858 It converts the user input string for txrate to the tx rate index.
3859
3860 \param - pAdapter - Pointer HDD Context.
3861 - txrate - Pointer to the tx rate string.
3862
3863 \return - 0 for success, non zero for failure
3864
3865 --------------------------------------------------------------------------*/
3866
3867static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3868{
3869 int ii;
3870 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3871 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3872 {
3873 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3874 return VOS_STATUS_E_FAILURE;
3875 }
3876
3877 /* do not allow to change setting when tx pktgen is enabled */
3878 if (ftm_status.frameGenEnabled)
3879 {
3880 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3881 return VOS_STATUS_E_FAILURE;
3882 }
3883
3884 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3885 {
3886 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3887 break;
3888 }
3889 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3890 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003891 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003892 return VOS_STATUS_E_FAILURE;
3893 }
3894
3895 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3896 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3897
3898 return VOS_STATUS_SUCCESS;
3899}
3900
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303901
3902
3903static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3904 ePowerTempIndexSource pwr_source)
3905{
3906 uPttMsgs *pMsgBody;
3907 VOS_STATUS status;
3908 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3909
3910 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3911 {
3912 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3913 "%s:Ftm has not started. Please start the ftm. ", __func__);
3914 return VOS_STATUS_E_FAILURE;
3915 }
3916
3917 if (pwr_source > 3)
3918 {
3919 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3920 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3921 __func__);
3922 return VOS_STATUS_E_FAILURE;
3923 }
3924
3925 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3926
3927 init_completion(&pHddCtx->ftm.ftm_comp_var);
3928 pMsgBody = &pMsgBuf->msgBody;
3929 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3930 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3931
3932 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3933 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3934
3935 if (status != VOS_STATUS_SUCCESS)
3936 {
3937 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3938 "%s:wlan_ftm_postmsg failed", __func__);
3939 status = VOS_STATUS_E_FAILURE;
3940 goto done;
3941 }
3942 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3943 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3944
3945 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3946 {
3947 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3948 "%s:Ptt response status failed", __func__);
3949 status = VOS_STATUS_E_FAILURE;
3950 goto done;
3951 }
3952
3953done:
3954
3955 return status;
3956}
3957
3958
Jeff Johnson295189b2012-06-20 16:38:30 -07003959/**---------------------------------------------------------------------------
3960
3961 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3962
3963 This function is used for start/stop the tx packet generation.
3964
3965 \param - pAdapter - Pointer HDD Context.
3966 - startStop - Value( 1/0) start/stop the tx packet generation.
3967
3968 \return - 0 for success, non zero for failure
3969
3970 --------------------------------------------------------------------------*/
3971
3972static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3973{
Jeff Johnson295189b2012-06-20 16:38:30 -07003974 uPttMsgs *pMsgBody;
3975 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303976 long ret;
3977
Jeff Johnson295189b2012-06-20 16:38:30 -07003978 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3979
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303980 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003981 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303982 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3983 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003984 return VOS_STATUS_E_FAILURE;
3985 }
3986
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303987 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003988 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303989 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3990 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003991 return VOS_STATUS_E_FAILURE;
3992 }
3993
3994 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3995 (!ftm_status.frameGenEnabled && startStop == 0))
3996 {
3997 return VOS_STATUS_SUCCESS ;
3998 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303999 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004000
Jeff Johnson295189b2012-06-20 16:38:30 -07004001 if (startStop == 1)
4002 {
4003 init_completion(&pHddCtx->ftm.ftm_comp_var);
4004 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4005 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4006 pMsgBody = &pMsgBuf->msgBody;
4007 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4008
4009 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304010 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004011 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304012 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4013 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004014 status = VOS_STATUS_E_FAILURE;
4015 goto done;
4016 }
4017
c_hpothuffdb5272013-10-02 16:42:35 +05304018 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304019 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304020 if (0 >= ret )
4021 {
4022 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4023 FL("wait on ftm_comp_var failed %ld"), ret);
4024 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304025 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004026 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304027 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4028 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 status = VOS_STATUS_E_FAILURE;
4030 goto done;
4031 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304032
4033 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4034 {
4035 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4036 if(status != VOS_STATUS_SUCCESS)
4037 {
4038 goto done;
4039 }
4040 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 }
4042
4043 init_completion(&pHddCtx->ftm.ftm_comp_var);
4044 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4045 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4046 pMsgBody = &pMsgBuf->msgBody;
4047 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4048
4049 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4050 if(status != VOS_STATUS_SUCCESS)
4051 {
4052 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4053 status = VOS_STATUS_E_FAILURE;
4054 goto done;
4055 }
4056
c_hpothuffdb5272013-10-02 16:42:35 +05304057 ret = wait_for_completion_interruptible_timeout(
4058 &pHddCtx->ftm.ftm_comp_var,
4059 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4060 if (0 >= ret )
4061 {
4062 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4063 FL("wait on ftm_comp_var failed %ld"), ret);
4064 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004065 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4066 {
4067 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4068 status = VOS_STATUS_E_FAILURE;
4069 goto done;
4070 }
4071
4072done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004073
4074 if (status == VOS_STATUS_SUCCESS)
4075 {
4076 if (startStop == 1)
4077 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304078 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004079 }
4080 else
4081 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304082 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004083 }
4084 }
4085
4086 return status;
4087}
4088
4089
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304090
4091static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4092{
4093
4094 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4095 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4096 {
4097 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4098 "%s:Ftm has not started. Please start the ftm. ", __func__);
4099 return VOS_STATUS_E_FAILURE;
4100 }
4101
4102 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4103 {
4104 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4105 "%s:cb mode value is invalid ", __func__);
4106 return VOS_STATUS_E_FAILURE;
4107 }
4108
4109 ftm_status.cbmode = cbmode;
4110
4111 return VOS_STATUS_SUCCESS;
4112
4113}
4114
Jeff Johnson295189b2012-06-20 16:38:30 -07004115/**---------------------------------------------------------------------------
4116
4117 \brief wlan_ftm_rx_mode() -
4118
4119 This function is used for start/stop the rx packet generation.
4120
4121 \param - pAdapter - Pointer HDD Context.
4122 - rxmode - 0-disable RX.
4123 - 1-rx ALL frames
4124 - 2-rx 11 g/n frames
4125 - 3-rx 11b frames
4126
4127 \return - 0 for success, non zero for failure
4128
4129 --------------------------------------------------------------------------*/
4130
4131static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4132{
Jeff Johnson295189b2012-06-20 16:38:30 -07004133 uPttMsgs *pMsgBody;
4134 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304135 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004136
4137 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304138 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004139 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304140 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4141 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004142 return VOS_STATUS_E_FAILURE;
4143 }
4144
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304145 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004146 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304147 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4148 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004149 return VOS_STATUS_E_FAILURE;
4150 }
4151
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304152 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004153 init_completion(&pHddCtx->ftm.ftm_comp_var);
4154
4155 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4156 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4157
4158 pMsgBody = &pMsgBuf->msgBody;
4159
4160 switch(rxmode)
4161 {
4162 case RXMODE_DISABLE_ALL:
4163 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4164 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4165 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4166 break;
4167
4168 case RXMODE_ENABLE_ALL:
4169 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4170 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4171 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4172 break;
4173
4174 case RXMODE_ENABLE_11GN:
4175 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4176 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4177 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4178 break;
4179
4180 case RXMODE_ENABLE_11B:
4181 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4182 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4183 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4184 break;
4185
4186 }
4187
4188 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4189
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304190 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004191 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304192 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4193 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004194 status = VOS_STATUS_E_FAILURE;
4195 goto done;
4196 }
c_hpothuffdb5272013-10-02 16:42:35 +05304197 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304198 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304199 if (0 >= ret )
4200 {
4201 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4202 FL(" wait on ftm_comp_var failed %ld"), ret);
4203 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004204
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304205 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004206 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304207 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4208 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004209 status = VOS_STATUS_E_FAILURE;
4210 goto done;
4211 }
4212 ftm_status.rxmode = rxmode ;
4213done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004214
4215 return status;
4216}
4217
4218/**---------------------------------------------------------------------------
4219
4220 \brief wlan_ftm_priv_rx_pkt_clear() -
4221
4222 This function sets the rx pkt count to zero.
4223
4224 \param - pAdapter - Pointer HDD Context.
4225 - rx_pkt_clear - rx_pkt_clear value.
4226
4227 \return - 0 for success, non zero for failure
4228
4229 --------------------------------------------------------------------------*/
4230
4231static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4232{
Jeff Johnson295189b2012-06-20 16:38:30 -07004233 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304234 long ret;
4235
Jeff Johnson295189b2012-06-20 16:38:30 -07004236 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4237
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304238 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004239 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304240 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4241 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004242 return VOS_STATUS_E_FAILURE;
4243 }
4244
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304245 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004246 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304247 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4248 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004249 return VOS_STATUS_E_FAILURE;
4250 }
4251
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304252 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004253 init_completion(&pHddCtx->ftm.ftm_comp_var);
4254 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304255 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004256
Jeff Johnson295189b2012-06-20 16:38:30 -07004257 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4258
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304259 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004260 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304261 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4262 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004263 status = VOS_STATUS_E_FAILURE;
4264 goto done;
4265 }
c_hpothuffdb5272013-10-02 16:42:35 +05304266 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304267 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304268 if (0 >= ret )
4269 {
4270 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4271 FL("wait on ftm_comp_var failed %ld"), ret);
4272 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004273
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304274 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004275 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304276 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4277 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004278 status = VOS_STATUS_E_FAILURE;
4279 goto done;
4280 }
4281done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004282
4283 return status;
4284}
4285
4286/**---------------------------------------------------------------------------
4287
4288 \brief wlan_ftm_priv_get_channel() -
4289
4290 This function gets the channel number from the halphy ptt module and
4291 returns the channel number to the application.
4292
4293 \param - pAdapter - Pointer HDD Context.
4294 - pChannel - Poniter to get the Channel number.
4295
4296 \return - 0 for success, non zero for failure
4297
4298 --------------------------------------------------------------------------*/
4299
4300static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4301{
Jeff Johnson295189b2012-06-20 16:38:30 -07004302 uPttMsgs *pMsgBody;
4303 VOS_STATUS status;
4304 v_U16_t freq;
4305 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304306 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004307
4308 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4309
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304310 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004311 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304312 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4313 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004314 return VOS_STATUS_E_FAILURE;
4315 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304316 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004317 init_completion(&pHddCtx->ftm.ftm_comp_var);
4318 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4319 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4320
4321 pMsgBody = &pMsgBuf->msgBody;
4322 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
4323
4324 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4325
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304326 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004327 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304328 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4329 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 status = VOS_STATUS_E_FAILURE;
4331 goto done;
4332
4333 }
c_hpothuffdb5272013-10-02 16:42:35 +05304334 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304335 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304336 if (0 >= ret )
4337 {
4338 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4339 FL("wait on ftm_comp_var failed %ld"), ret);
4340 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004341
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304342 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004343 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304344 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4345 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004346 status = VOS_STATUS_E_FAILURE;
4347 goto done;
4348 }
4349
4350 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4351
4352 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4353 indx++;
4354 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4355 {
4356 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4357 status = VOS_STATUS_E_FAILURE;
4358 goto done;
4359 }
4360
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004361 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004362
Arif Hussain6d2a3322013-11-17 19:50:10 -08004363 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004364 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004365
4366 return status;
4367}
4368
4369/**---------------------------------------------------------------------------
4370
4371 \brief wlan_ftm_priv_get_txpower() -
4372
4373 This function gets the TX power from the halphy ptt module and
4374 returns the TX power to the application.
4375
4376 \param - pAdapter - Pointer HDD Context.
4377 - pTxPwr - Poniter to get the Tx power.
4378
4379 \return - 0 for success, non zero for failure
4380
4381 --------------------------------------------------------------------------*/
4382
4383static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4384{
Jeff Johnson295189b2012-06-20 16:38:30 -07004385 uPttMsgs *pMsgBody;
4386 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304387 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4389
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304390 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004391 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304392 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4393 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004394 return VOS_STATUS_E_FAILURE;
4395 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304396 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004397 init_completion(&pHddCtx->ftm.ftm_comp_var);
4398 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4399 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4400
4401 pMsgBody = &pMsgBuf->msgBody;
4402
4403 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4404
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304405 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004406 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304407 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4408 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004409 status = VOS_STATUS_E_FAILURE;
4410 goto done;
4411 }
c_hpothuffdb5272013-10-02 16:42:35 +05304412 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304413 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304414 if (0 >= ret )
4415 {
4416 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4417 FL("wait on ftm_comp_var failed %ld"), ret);
4418 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004419
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304420 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004421 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304422 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4423 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004424 status = VOS_STATUS_E_FAILURE;
4425 goto done;
4426 }
4427 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4428
4429 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004430
4431 return status;
4432}
4433
4434/**---------------------------------------------------------------------------
4435
4436 \brief wlan_ftm_priv_get_ftm_version() -
4437
4438 This function gets ftm driver and firmware version.
4439
4440 \param - pAdapter - Pointer HDD Context.
4441 - pTxRate - Poniter to get the Tx rate.
4442
4443 \return - 0 for success, non zero for failure
4444
4445 --------------------------------------------------------------------------*/
4446
4447VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4448{
Jeff Johnson295189b2012-06-20 16:38:30 -07004449 uPttMsgs *pMsgBody;
4450 VOS_STATUS status;
4451 v_U32_t reg_val;
4452 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004453 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4454 int lenRes = 0;
4455 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304456 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004457
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304458 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004459 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304460 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4461 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004462 return VOS_STATUS_E_FAILURE;
4463 }
4464
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304465 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004466 init_completion(&pHddCtx->ftm.ftm_comp_var);
4467 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4468 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4469
4470 pMsgBody = &pMsgBuf->msgBody;
4471 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4472
4473 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4474
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304475 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004476 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304477 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4478 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004479 status = VOS_STATUS_E_FAILURE;
4480 goto done;
4481
4482 }
c_hpothuffdb5272013-10-02 16:42:35 +05304483 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304484 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304485 if (0 >= ret )
4486 {
4487 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4488 FL("wait on ftm_comp_var failed %ld"), ret);
4489 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004490
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304491 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004492 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304493 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4494 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004495 status = VOS_STATUS_E_FAILURE;
4496 goto done;
4497 }
4498
4499 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4500
4501 init_completion(&pHddCtx->ftm.ftm_comp_var);
4502
4503 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4504 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4505
4506 pMsgBody = &pMsgBuf->msgBody;
4507
4508 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4509
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304510 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004511 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304512 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4513 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004514 status = VOS_STATUS_E_FAILURE;
4515 goto done;
4516 }
c_hpothuffdb5272013-10-02 16:42:35 +05304517 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304518 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304519 if (0 >= ret )
4520 {
4521 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4522 FL("wait on ftm_comp_var failed %ld"), ret);
4523 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004524
4525 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4526 if(lenRes < 0 || lenRes >= lenBuf)
4527 {
4528 status = VOS_STATUS_E_FAILURE;
4529 goto done;
4530 }
4531
4532 buf += lenRes;
4533 lenBuf -= lenRes;
4534
4535 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004536 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 -07004537 if(lenRes < 0 || lenRes >= lenBuf)
4538 {
4539 status = VOS_STATUS_E_FAILURE;
4540 goto done;
4541 }
4542
4543 buf += lenRes;
4544 lenBuf -= lenRes;
4545
4546 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4547 if(lenRes < 0 || lenRes >= lenBuf)
4548 {
4549 status = VOS_STATUS_E_FAILURE;
4550 goto done;
4551 }
4552
4553 buf += lenRes;
4554 lenBuf -= lenRes;
4555
Jeff Johnson295189b2012-06-20 16:38:30 -07004556
4557done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004558
4559 return status;
4560
4561}
4562
4563/**---------------------------------------------------------------------------
4564
4565 \brief wlan_ftm_priv_get_txrate() -
4566
4567 This function gets the TX rate from the halphy ptt module and
4568 returns the TX rate to the application.
4569
4570 \param - pAdapter - Pointer HDD Context.
4571 - pTxRate - Poniter to get the Tx rate.
4572
4573 \return - 0 for success, non zero for failure
4574
4575 --------------------------------------------------------------------------*/
4576
4577static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4578{
Jeff Johnson295189b2012-06-20 16:38:30 -07004579 uPttMsgs *pMsgBody;
4580 VOS_STATUS status;
4581 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304582 long ret;
4583
Jeff Johnson295189b2012-06-20 16:38:30 -07004584 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4585
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304586 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004587 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304588 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4589 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004590 return VOS_STATUS_E_FAILURE;
4591 }
4592
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304593 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004594 init_completion(&pHddCtx->ftm.ftm_comp_var);
4595 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4596 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4597
4598 pMsgBody = &pMsgBuf->msgBody;
4599
4600 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4601
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304602 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004603 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304604 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4605 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004606 status = VOS_STATUS_E_FAILURE;
4607 goto done;
4608 }
c_hpothuffdb5272013-10-02 16:42:35 +05304609 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304610 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304611 if (0 >= ret )
4612 {
4613 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4614 FL("wait on ftm_comp_var failed %ld"), ret);
4615 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004616
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304617 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004618
4619 rate_index = pMsgBody->GetTxPowerReport.rate;
4620 }
4621 else {
4622 /*Return the default rate*/
4623 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4625 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004626 status = VOS_STATUS_E_FAILURE;
4627 goto done;
4628 }
4629
4630 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4631 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4632 break;
4633 }
4634 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4635 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004636 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004637 status = VOS_STATUS_E_FAILURE;
4638 goto done;
4639 }
4640 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4641done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004642
4643 return status;
4644
4645}
4646
4647/**---------------------------------------------------------------------------
4648
4649 \brief wlan_ftm_priv_get_rx_pkt_count() -
4650
4651 This function gets the rx pkt count from the halphy ptt module and
4652 returns the rx pkt count to the application.
4653
4654 \param - pAdapter - Pointer HDD Context.
4655 - pRxPktCnt - Poniter to get the rx pkt count.
4656
4657 \return - 0 for success, non zero for failure
4658
4659 --------------------------------------------------------------------------*/
4660
4661static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4662{
Jeff Johnson295189b2012-06-20 16:38:30 -07004663 uPttMsgs *pMsgBody;
4664 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304665 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004666 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4667
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304668 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004669 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304670 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4671 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004672 return VOS_STATUS_E_FAILURE;
4673 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304674 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004675 init_completion(&pHddCtx->ftm.ftm_comp_var);
4676 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4677 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4678
4679 pMsgBody = &pMsgBuf->msgBody;
4680
4681 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4682
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304683 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004684 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304685 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4686 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004687 status = VOS_STATUS_E_FAILURE;
4688 goto done;
4689 }
c_hpothuffdb5272013-10-02 16:42:35 +05304690 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304691 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304692 if (0 >= ret )
4693 {
4694 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4695 FL("wait on ftm_comp_var failed %ld"), ret);
4696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004697
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304698 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004699 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304700 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4701 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004702 status = VOS_STATUS_E_FAILURE;
4703 goto done;
4704 }
4705 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4706done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004707
4708 return status;
4709}
4710
4711/**---------------------------------------------------------------------------
4712
4713 \brief wlan_ftm_priv_get_rx_rssi() -
4714
4715 This function gets the rx rssi from the halphy ptt module and
4716 returns the rx rssi to the application.
4717
4718 \param - pAdapter - Pointer HDD Context.
4719 - buf - Poniter to get rssi of Rx chains
4720
4721 \return - 0 for success, non zero for failure
4722
4723 --------------------------------------------------------------------------*/
4724
4725static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4726{
Jeff Johnson295189b2012-06-20 16:38:30 -07004727 uPttMsgs *pMsgBody;
4728 VOS_STATUS status;
4729 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304730 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004731
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304732 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004733 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304734 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4735 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004736 return VOS_STATUS_E_FAILURE;
4737 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304738 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004739 init_completion(&pHddCtx->ftm.ftm_comp_var);
4740 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4741 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4742
4743 pMsgBody = &pMsgBuf->msgBody;
4744
4745 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4746
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304747 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004748 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304749 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4750 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004751 status = VOS_STATUS_E_FAILURE;
4752 goto done;
4753 }
c_hpothuffdb5272013-10-02 16:42:35 +05304754 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304755 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304756 if (0 >= ret )
4757 {
4758 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4759 FL("wait on ftm_comp_var failed %ld"), ret);
4760 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004761
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304762 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004763 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304764 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4765 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004766 status = VOS_STATUS_E_FAILURE;
4767 goto done;
4768 }
4769
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004770 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4771 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004772 pMsgBody->GetRxRssi.rssi.rx[1]);
4773
4774 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4775 {
4776 status = VOS_STATUS_E_FAILURE;
4777 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004778
Jeff Johnson295189b2012-06-20 16:38:30 -07004779done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004780
4781 return status;
4782}
4783
4784/**---------------------------------------------------------------------------
4785
4786 \brief wlan_ftm_priv_get_mac_address() -
4787
4788 This function gets the mac address from the halphy ptt module and
4789 returns the mac address to the application.
4790
4791 \param - pAdapter - Pointer HDD Context.
4792 - buf - Poniter to get the mac address.
4793
4794 \return - 0 for success, non zero for failure
4795
4796 --------------------------------------------------------------------------*/
4797
4798static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4799{
4800 v_BOOL_t itemIsValid = VOS_FALSE;
4801 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4802 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004803
Jeff Johnson295189b2012-06-20 16:38:30 -07004804 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4805
4806 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4807 {
4808 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4809 return VOS_STATUS_E_FAILURE;
4810 }
4811 /*Check the NV FIELD is valid or not*/
4812 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4813 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004814 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004815 {
4816 vos_nv_readMacAddress(macAddr);
4817
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004818 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4819 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004820 MAC_ADDR_ARRAY(macAddr));
4821 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4822 {
4823 return VOS_STATUS_E_FAILURE;
4824 }
4825 }
4826 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004827 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004828 {
4829 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004830 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4831 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004832 MAC_ADDR_ARRAY(macAddr));
4833
4834 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4835 {
4836 return VOS_STATUS_E_FAILURE;
4837 }
4838 }
4839 return VOS_STATUS_SUCCESS;
4840}
4841
4842/**---------------------------------------------------------------------------
4843
4844 \brief wlan_ftm_priv_set_mac_address() -
4845
4846 This function sets the mac address to the halphy ptt module and
4847 sends the netlink message to the ptt socket application which writes
4848 the macaddress to the qcom_wlan_nv.bin file
4849
4850 \param - pAdapter - Pointer HDD Context.
4851 - buf - Poniter to the macaddress.
4852
4853 \return - 0 for success, non zero for failure
4854
4855 --------------------------------------------------------------------------*/
4856
4857static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4858{
Jeff Johnson295189b2012-06-20 16:38:30 -07004859 uPttMsgs *pMsgBody;
4860 VOS_STATUS status;
4861 int macAddr[VOS_MAC_ADDRESS_LEN];
4862 v_U8_t *pMacAddress;
4863 v_U8_t ii;
4864 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304865 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004866
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304867 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004868 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304869 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4870 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004871 return VOS_STATUS_E_FAILURE;
4872 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304873 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004874 init_completion(&pHddCtx->ftm.ftm_comp_var);
4875 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4876 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4877
4878 pMsgBody = &pMsgBuf->msgBody;
4879 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4880
4881 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004882 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]))
4883 {
4884 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4885 "Invalid MacAddress Input %s", buf);
4886 return VOS_STATUS_E_FAILURE;
4887 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004888
Arif Hussain24bafea2013-11-15 15:10:03 -08004889 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4890 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004891
4892
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004893 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004894
4895 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4896 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4897
4898
Arif Hussain24bafea2013-11-15 15:10:03 -08004899 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4900 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004901 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4902
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304903 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004904 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304905 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4906 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004907 status = VOS_STATUS_E_FAILURE;
4908 goto done;
4909 }
c_hpothuffdb5272013-10-02 16:42:35 +05304910 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304911 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304912 if (0 >= ret )
4913 {
4914 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4915 FL("wait on ftm_comp_var failed %ld"), ret);
4916 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004917
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304918 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004919 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304920 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4921 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004922 status = VOS_STATUS_E_FAILURE;
4923 goto done;
4924 }
4925
Arif Hussain6d2a3322013-11-17 19:50:10 -08004926 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004927
4928 init_completion(&pHddCtx->ftm.ftm_comp_var);
4929 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4930
4931 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4932 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4933
4934 pMsgBody = &pMsgBuf->msgBody;
4935
4936 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4937
4938 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4939
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304940 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004941 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304942 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4943 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004944 status = VOS_STATUS_E_FAILURE;
4945 goto done;
4946 }
4947
c_hpothuffdb5272013-10-02 16:42:35 +05304948 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304949 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304950 if (0 >= ret )
4951 {
4952 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4953 FL("wait on ftm_comp_var failed %ld"), ret);
4954 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004955done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004956
4957 return VOS_STATUS_SUCCESS;
4958}
4959
4960/* set param sub-ioctls */
4961static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4962 union iwreq_data *wrqu, char *extra)
4963{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004964 int ret,sub_cmd;
4965 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004966 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004967 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004968 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004969
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004970 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004971 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004972 length = wrqu->data.length;
4973 sub_cmd = wrqu->data.flags;
4974 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4975
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004976 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4977 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4978 * odd number which assigns set_args to zero.we assisgn memory using
4979 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004980 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004981 param = kzalloc(length + 1, GFP_KERNEL);
4982 if (!param)
4983 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004984
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004985 if (copy_from_user(param, pointer, length))
4986 {
4987 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4988 "%s:Failed to get user data %s", __func__, param);
4989
4990 ret = -EINVAL;
4991 goto OUT;
4992 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004993
4994 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4995 "%s: Received length %d", __func__, length);
4996
4997 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004998 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004999
5000 switch(sub_cmd)
5001 {
5002 case WE_SET_MAC_ADDRESS:
5003 {
5004
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005005 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005006 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005007
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005008 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005009
5010 if(status != VOS_STATUS_SUCCESS)
5011 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005012 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005013 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005014
Jeff Johnson295189b2012-06-20 16:38:30 -07005015 ret = -EINVAL;
5016 }
5017
Wilson Yang7c471652013-12-20 16:36:44 -08005018 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005019 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005020 case WE_SET_TX_RATE:
5021 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005022 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005023
5024 if(status != VOS_STATUS_SUCCESS)
5025 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005026 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005027 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005028
5029 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005030 }
5031
5032 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005033 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005034 default:
5035 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005036 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005037 ret = -EINVAL;
5038 break;
5039 }
5040 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005041
5042OUT:
5043 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005044 return ret;
5045}
5046
5047static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5048 union iwreq_data *wrqu, char *extra)
5049{
5050 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5051 int *value = (int *)extra;
5052 int sub_cmd = value[0];
5053 int set_value = value[1];
5054 int ret = 0; /* success */
5055 VOS_STATUS status;
5056
5057 switch(sub_cmd)
5058 {
5059 case WE_FTM_ON_OFF:
5060 {
5061 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5062
5063 if(status != VOS_STATUS_SUCCESS)
5064 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005065 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005066 ret = -EINVAL;
5067 }
5068
5069 break;
5070 }
5071
5072 case WE_TX_PKT_GEN:
5073 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5074
5075 if(status != VOS_STATUS_SUCCESS)
5076 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005077 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005078 ret = -EINVAL;
5079 }
5080 break;
5081
5082 case WE_SET_TX_IFS:
5083 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5084
5085 if(status != VOS_STATUS_SUCCESS)
5086 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005087 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005088 ret = -EINVAL;
5089 }
5090 break;
5091
5092 case WE_SET_TX_PKT_CNT:
5093 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5094
5095 if(status != VOS_STATUS_SUCCESS)
5096 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005097 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005098 ret = -EINVAL;
5099 }
5100 break;
5101
5102 case WE_SET_TX_PKT_LEN:
5103 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5104
5105 if(status != VOS_STATUS_SUCCESS)
5106 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005107 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005108 ret = -EINVAL;
5109 }
5110 break;
5111
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305112 case WE_TX_CW_RF_GEN:
5113 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5114
5115 if(status != VOS_STATUS_SUCCESS)
5116 {
5117 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5118 ret = -EINVAL;
5119 }
5120 break;
5121
Jeff Johnson295189b2012-06-20 16:38:30 -07005122 case WE_SET_CHANNEL:
5123 {
5124 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5125
5126 if(status != VOS_STATUS_SUCCESS)
5127 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005128 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005129 ret = -EINVAL;
5130 }
5131 break;
5132 }
5133 case WE_SET_TX_POWER:
5134 {
5135 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5136
5137 if(status != VOS_STATUS_SUCCESS)
5138 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005139 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005140 ret = -EINVAL;
5141 }
5142 break;
5143 }
5144 case WE_CLEAR_RX_PKT_CNT:
5145 {
5146 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5147
5148 if(status != VOS_STATUS_SUCCESS)
5149 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005150 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005151 ret = -EINVAL;
5152 }
5153 break;
5154 }
5155 case WE_RX:
5156 {
5157 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5158
5159 if(status != VOS_STATUS_SUCCESS)
5160 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005161 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005162 ret = -EINVAL;
5163 }
5164 break;
5165 }
5166 case WE_ENABLE_CHAIN:
5167 {
5168 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5169
5170 if(status != VOS_STATUS_SUCCESS)
5171 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005172 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005173 ret = -EINVAL;
5174 }
5175 break;
5176 }
5177
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305178 case WE_SET_PWR_CNTL_MODE:
5179 {
5180 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5181 if (status != VOS_STATUS_SUCCESS)
5182 {
5183 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5184 status);
5185 ret = -EINVAL;
5186 }
5187 break;
5188 }
5189
5190 case WE_ENABLE_DPD:
5191 {
5192 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5193 if (status != VOS_STATUS_SUCCESS)
5194 {
5195 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5196 ret = -EINVAL;
5197 }
5198 break;
5199 }
5200
5201 case WE_SET_CB:
5202 {
5203 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5204 if (status != VOS_STATUS_SUCCESS)
5205 {
5206 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5207 ret = -EINVAL;
5208 }
5209 break;
5210 }
5211
Jeff Johnson295189b2012-06-20 16:38:30 -07005212 default:
5213 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005214 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005215 sub_cmd, set_value);
5216 break;
5217 }
5218 }
5219
5220 return ret;
5221}
5222
5223/* get param sub-ioctls */
5224static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5225 union iwreq_data *wrqu, char *extra)
5226{
5227 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5228 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005229 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005230 VOS_STATUS status;
5231
5232 switch (value[0])
5233 {
5234 case WE_GET_CHANNEL:
5235 {
5236 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5237
5238 if(status != VOS_STATUS_SUCCESS)
5239 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005240 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005241 ret = -EINVAL;
5242 }
5243 break;
5244 }
5245 case WE_GET_TX_POWER:
5246 {
5247 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5248
5249 if(status != VOS_STATUS_SUCCESS)
5250 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005251 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005252 ret = -EINVAL;
5253 }
5254 break;
5255 }
5256 case WE_GET_RX_PKT_CNT:
5257 {
5258 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5259
5260 if(status != VOS_STATUS_SUCCESS)
5261 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005262 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005263 ret = -EINVAL;
5264 }
5265 break;
5266 }
5267 default:
5268 {
5269 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5270 break;
5271 }
5272 }
5273
5274 return ret;
5275}
5276
5277static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5278 union iwreq_data *wrqu, char *extra)
5279{
5280 int sub_cmd = wrqu->data.flags;
5281 VOS_STATUS status;
5282 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5283
5284 switch(sub_cmd)
5285 {
5286 case WE_GET_MAC_ADDRESS:
5287 {
5288 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5289
5290 if(status != VOS_STATUS_SUCCESS)
5291 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005292 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005293 return -EINVAL;
5294 }
5295 wrqu->data.length = strlen(extra)+1;
5296 break;
5297 }
5298 case WE_GET_TX_RATE:
5299 {
5300 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5301
5302 if(status != VOS_STATUS_SUCCESS)
5303 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005304 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005305 return -EINVAL;
5306 }
5307
5308 wrqu->data.length = strlen(extra)+1;
5309 break;
5310 }
5311 case WE_GET_FTM_VERSION:
5312 {
5313 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5314
5315 if(status != VOS_STATUS_SUCCESS)
5316 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005317 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005318 return -EINVAL;
5319 }
5320 wrqu->data.length = strlen(extra)+1;
5321 break;
5322 }
5323 case WE_GET_FTM_STATUS:
5324 {
5325 status = wlan_ftm_priv_get_status(pAdapter, extra);
5326
5327 if(status != VOS_STATUS_SUCCESS)
5328 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005329 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005330 return -EINVAL;
5331 }
5332
5333 wrqu->data.length = strlen(extra)+1;
5334 break;
5335 }
5336 case WE_GET_RX_RSSI:
5337 {
5338 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5339
5340 if(status != VOS_STATUS_SUCCESS)
5341 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005342 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005343 return -EINVAL;
5344 }
5345
5346 wrqu->data.length = strlen(extra)+1;
5347 break;
5348 }
5349 default:
5350 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005351 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005352 break;
5353 }
5354 }
5355
5356 return 0;
5357}
Jeff Johnson295189b2012-06-20 16:38:30 -07005358
5359VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5360{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005361#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005362 tAniHdr *wmsg = NULL;
5363 v_U8_t *pBuf;
5364 hdd_context_t *pHddCtx = NULL;
5365 v_CONTEXT_t pVosContext= NULL;
5366
5367 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5368 if(pBuf == NULL)
5369 {
5370 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5371 return VOS_STATUS_E_NOMEM;
5372 }
5373 wmsg = (tAniHdr*)pBuf;
5374 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5375 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5376 wmsg->length = FTM_SWAP16(wmsg->length);
5377 pBuf += sizeof(tAniHdr);
5378
5379 /*Get the global context */
5380 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5381
5382 /*Get the Hdd Context */
5383 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5384 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5385
5386 /* EfS command Code */
5387 *(v_U32_t*)pBuf = 0x000000EF;
5388
5389 pBuf += sizeof(v_U32_t);
5390
5391 memcpy(pBuf, pData,data_len);
5392
5393 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305394 if( ptt_sock_send_msg_to_app(wmsg, 0,
5395 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005396
Arif Hussain6d2a3322013-11-17 19:50:10 -08005397 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 -07005398 vos_mem_free((v_VOID_t*)wmsg);
5399 return VOS_STATUS_E_FAILURE;
5400 }
5401 }
5402 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305403 if( ptt_sock_send_msg_to_app(wmsg, 0,
5404 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005405
Arif Hussain6d2a3322013-11-17 19:50:10 -08005406 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 -07005407 vos_mem_free((v_VOID_t*)wmsg);
5408 return VOS_STATUS_E_FAILURE;
5409 }
5410 }
5411
5412 vos_mem_free((v_VOID_t*)wmsg);
5413#endif //FTM and ANDROID
5414
5415 return VOS_STATUS_SUCCESS;
5416}
5417
Jeff Johnson295189b2012-06-20 16:38:30 -07005418/* action sub-ioctls */
5419static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5420 union iwreq_data *wrqu, char *extra)
5421{
5422 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005423 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005424
5425 switch (sub_cmd)
5426 {
5427 case WE_SET_NV_DEFAULTS:
5428 {
5429 v_U8_t *pu8buf,*pTempBuf;
5430 v_U16_t size;
5431 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005432 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005433 pu8buf = vos_mem_malloc(size);
5434 if(pu8buf == NULL)
5435 {
5436 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5437 return VOS_STATUS_E_NOMEM;
5438 }
5439 memset(pu8buf,0,size);
5440 pTempBuf = pu8buf;
5441 pTempBuf += sizeof(v_U32_t);
5442 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5443
5444 wlan_write_to_efs(pu8buf,size);
5445 vos_mem_free(pu8buf);
5446 }
5447
5448 default:
5449 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005451 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5452 break;
5453 }
5454 }
5455
5456 return ret;
5457}
5458
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305459static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5460 union iwreq_data *wrqu, char *extra)
5461{
5462 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5463 int sub_cmd = wrqu->data.flags;
5464 int *value = (int*)wrqu->data.pointer;
5465
5466 if(wrqu->data.length != 2)
5467 {
5468 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5469 return -EINVAL;
5470 }
5471 switch (sub_cmd)
5472 {
5473 case WE_SET_TX_WF_GAIN:
5474 {
5475 v_S15_t dGain = 0;
5476 v_U16_t rfGain = 0;
5477 VOS_STATUS status;
5478
5479 dGain = *(v_S15_t*) value++;
5480 rfGain = *(v_U16_t*) value;
5481 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5482
5483 if(status != VOS_STATUS_SUCCESS)
5484 {
5485 hddLog(VOS_TRACE_LEVEL_FATAL,
5486 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5487 return -EINVAL;
5488 }
5489 }
5490 break;
5491
5492 default:
5493 {
5494 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5495 break;
5496 }
5497 }
5498
5499 return 0;
5500}
5501
5502
Jeff Johnson295189b2012-06-20 16:38:30 -07005503static const iw_handler we_ftm_private[] = {
5504
5505 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5506 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5507 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5508 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5509 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305510 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005511};
5512
5513/*Maximum command length can be only 15 */
5514static const struct iw_priv_args we_ftm_private_args[] = {
5515
5516 /* handlers for main ioctl */
5517 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5518 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5519 0,
5520 "" },
5521
5522 { WE_FTM_ON_OFF,
5523 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5524 0,
5525 "ftm" },
5526
5527 { WE_TX_PKT_GEN,
5528 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5529 0,
5530 "tx" },
5531
5532 { WE_SET_TX_IFS,
5533 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5534 0,
5535 "set_txifs" },
5536
5537 { WE_SET_TX_PKT_CNT,
5538 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5539 0,
5540 "set_txpktcnt" },
5541
5542 { WE_SET_TX_PKT_LEN,
5543 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5544 0,
5545 "set_txpktlen" },
5546
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305547 { WE_SET_TX_WF_GAIN,
5548 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5549 0,
5550 "set_tx_wf_gain" },
5551
5552 { WE_TX_CW_RF_GEN,
5553 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5554 0,
5555 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005556 { WE_SET_CHANNEL,
5557 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5558 0,
5559 "set_channel" },
5560
5561 { WE_SET_TX_POWER,
5562 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5563 0,
5564 "set_txpower" },
5565
5566 { WE_CLEAR_RX_PKT_CNT,
5567 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5568 0,
5569 "clr_rxpktcnt" },
5570
5571 { WE_RX,
5572 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5573 0,
5574 "rx" },
5575
5576 { WE_ENABLE_CHAIN,
5577 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5578 0,
5579 "ena_chain" },
5580
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305581 { WE_SET_PWR_CNTL_MODE,
5582 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5583 0,
5584 "pwr_cntl_mode" },
5585
5586 { WE_ENABLE_DPD,
5587 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5588 0,
5589 "ena_dpd" },
5590
5591 { WE_SET_CB,
5592 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5593 0,
5594 "set_cb" },
5595
Jeff Johnson295189b2012-06-20 16:38:30 -07005596 /* handlers for main ioctl */
5597 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5598 0,
5599 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5600 "" },
5601
5602 { WE_GET_CHANNEL,
5603 0,
5604 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5605 "get_channel" },
5606
5607 { WE_GET_TX_POWER,
5608 0,
5609 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5610 "get_txpower" },
5611
5612 { WE_GET_RX_PKT_CNT,
5613 0,
5614 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5615 "get_rxpktcnt" },
5616
5617 /* handlers for main ioctl */
5618 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5619 IW_PRIV_TYPE_CHAR| 512,
5620 0,
5621 "" },
5622
5623 { WE_SET_MAC_ADDRESS,
5624 IW_PRIV_TYPE_CHAR| 512,
5625 0,
5626 "set_mac_address" },
5627
5628 { WE_SET_TX_RATE,
5629 IW_PRIV_TYPE_CHAR | 512,
5630 0,
5631 "set_txrate" },
5632
5633 /* handlers for main ioctl */
5634 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5635 0,
5636 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5637 "" },
5638
5639 { WE_GET_MAC_ADDRESS,
5640 0,
5641 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5642 "get_mac_address" },
5643
5644 { WE_GET_FTM_VERSION,
5645 0,
5646 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5647 "ftm_version" },
5648
5649 { WE_GET_TX_RATE,
5650 0,
5651 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5652 "get_txrate" },
5653
5654 { WE_GET_FTM_STATUS,
5655 0,
5656 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5657 "get_status" },
5658
5659 { WE_GET_RX_RSSI,
5660 0,
5661 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5662 "get_rx_rssi" },
5663
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305664 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5665 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5666 0,
5667 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005668 /* handlers for main ioctl */
5669 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5670 0,
5671 0,
5672 "" },
5673
5674 /* handlers for sub-ioctl */
5675 { WE_SET_NV_DEFAULTS,
5676 0,
5677 0,
5678 "set_nv_defaults" },
5679
5680};
5681
5682const struct iw_handler_def we_ftm_handler_def = {
5683 .num_standard = 0,
5684 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5685 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5686
5687 .standard = (iw_handler *)NULL,
5688 .private = (iw_handler *)we_ftm_private,
5689 .private_args = we_ftm_private_args,
5690 .get_wireless_stats = NULL,
5691};
5692
5693static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5694{
5695
5696 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5697
5698 // Zero the memory. This zeros the profile structure.
5699 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005700
Jeff Johnson295189b2012-06-20 16:38:30 -07005701 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5702
5703 return 0;
5704}
5705
Jeff Johnson295189b2012-06-20 16:38:30 -07005706
5707VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5708{
Jeff Johnson295189b2012-06-20 16:38:30 -07005709 ftm_rsp_msg_t *pFtmMsgRsp;
5710
5711 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5712 hdd_context_t *pHddCtx;
5713 v_CONTEXT_t pVosContext= NULL;
5714
5715 ENTER();
5716
5717 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5718
5719 if (!message )
5720 {
5721 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5722 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5723 return VOS_STATUS_E_INVAL;
5724 }
5725 /*Get the global context */
5726 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5727
5728 /*Get the Hdd Context */
5729 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5730
5731 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5732
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305733 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005734 complete(&pHddCtx->ftm.ftm_comp_var);
5735 }
5736 else {
5737 /*Response length to Ptt App*/
5738 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5739
5740 /*Ptt App expects the response length in LE */
5741 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5742
5743 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005744 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005745 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5746
5747 /*Copy the message*/
5748 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5749
5750 /*Update the error code*/
5751 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5752
5753 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5754
5755 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5756 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005757 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005758 return VOS_STATUS_E_FAILURE;
5759 }
5760 }
5761 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005762 return VOS_STATUS_SUCCESS;
5763
5764}