blob: b961f2cc7ddbf0ee2c87d9e4234e62f3dc2fe17b [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 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001548
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1550 pHddCtx->ftm.targetNVTableSize = 0;
1551 pHddCtx->ftm.targetNVTablePointer = NULL;
1552 pHddCtx->ftm.processedNVTableSize = 0;
1553 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1554 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1555 {
1556 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301557 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001558 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001559 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001560 }
1561 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001562
1563 _ftm_status_init();
1564 /* Initialize the ftm vos event */
1565 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1566 {
1567 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301568 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001569 VOS_ASSERT(0);
1570 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1571 goto err_nl_srv_init;
1572 }
1573
1574 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1575
1576 return VOS_STATUS_SUCCESS;
1577
1578err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001579#ifdef WLAN_KD_READY_NOTIFIER
1580nl_srv_exit(pHddCtx->ptt_pid);
1581#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001582nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001583#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001584err_ftm_register_wext_close:
1585hdd_UnregisterWext(pAdapter->dev);
1586
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301587err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001588err_adapter_open_failure:
1589hdd_close_all_adapters( pHddCtx );
1590
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301591err_ftm_vos_close:
1592 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001593err_vos_status_failure:
1594
1595 return VOS_STATUS_E_FAILURE;
1596}
1597
1598
1599
1600int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1601{
1602 VOS_STATUS vosStatus;
1603 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1604
1605 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1606 ENTER();
1607 if(pAdapter == NULL)
1608 {
1609 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1610 return VOS_STATUS_E_NOMEM;
1611 }
1612
Atul Mittalc41126d2014-03-17 15:10:11 +05301613 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1614 if (pHddCtx->ftm.IsCmdPending == TRUE)
1615 {
1616 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1617 {
1618 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1619 "%s: vos_event_set failed", __func__);
1620 }
1621 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001622 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1623 {
1624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1625 "%s: Ftm has been started. stopping ftm", __func__);
1626 wlan_ftm_stop(pHddCtx);
1627 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001628
1629 //Assert Deep sleep signal now to put Libra HW in lowest power state
1630 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301631 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1632 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1633 "%s: Failed to assert deep sleep signal", __func__);
1634 VOS_ASSERT( 0 );
1635 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001636
1637 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301638 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1639 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1640 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1641 "%s: Failed to put HW into low power", __func__);
1642 VOS_ASSERT( 0 );
1643 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001644
1645 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1646
Leo Chang59cdc7e2013-07-10 10:08:21 -07001647#ifdef WLAN_KD_READY_NOTIFIER
1648 nl_srv_exit(pHddCtx->ptt_pid);
1649#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001650 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001651#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 //TODO----------
1653 //Deregister the device with the kernel
1654 hdd_UnregisterWext(pAdapter->dev);
1655
1656 hdd_close_all_adapters( pHddCtx );
1657#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001658 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001659 {
1660 unregister_netdev(pAdapter->dev);
1661 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1662 }
1663#endif
1664 //-----------------
1665
1666 vosStatus = vos_sched_close( vosContext );
1667 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1668 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1669 "%s: Failed to close VOSS Scheduler",__func__);
1670 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1671 }
1672
1673 //Close VOSS
1674 wlan_ftm_vos_close(vosContext);
1675
1676
1677 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1678 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1679 {
1680 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1681 "%s: Failed to destroy ftm_vos Event",__func__);
1682 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1683 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001684 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001685
Jeff Johnson295189b2012-06-20 16:38:30 -07001686 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001687}
1688
1689/**---------------------------------------------------------------------------
1690
1691 \brief wlan_ftm_send_response() -
1692
1693 The function sends the response to the ptt socket application running in user space.
1694
1695 \param - pAdapter - Pointer HDD Context.
1696
1697 \return - 0 for success, non zero for failure
1698
1699 --------------------------------------------------------------------------*/
1700
1701static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1702
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301703 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1704 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001705
Arif Hussain6d2a3322013-11-17 19:50:10 -08001706 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 -07001707 return VOS_STATUS_E_FAILURE;
1708 }
1709 return VOS_STATUS_SUCCESS;
1710}
1711
1712/**---------------------------------------------------------------------------
1713
1714 \brief wlan_hdd_ftm_start() -
1715
1716 This function gets called when the FTM start commands received from the ptt socket application and
1717 it starts the following modules.
1718 1) SAL Start.
1719 2) BAL Start.
1720 3) MAC Start to download the firmware.
1721
1722
1723 \param - pAdapter - Pointer HDD Context.
1724
1725 \return - 0 for success, non zero for failure
1726
1727 --------------------------------------------------------------------------*/
1728
1729static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1730{
1731 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1732 tSirRetStatus sirStatus = eSIR_SUCCESS;
1733 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1734 tHalMacStartParameters halStartParams;
1735
1736 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1737 {
1738 return VOS_STATUS_SUCCESS;
1739 }
1740
1741 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1742 "%s: Starting Libra SW", __func__);
1743
1744 /* We support only one instance for now ...*/
1745 if (pVosContext == NULL)
1746 {
1747 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001748 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001749 goto err_status_failure;
1750 }
1751
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001752
Jeff Johnson295189b2012-06-20 16:38:30 -07001753 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001754 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001755 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001756 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001757 goto err_status_failure;
1758 }
1759
Jeff Johnson295189b2012-06-20 16:38:30 -07001760 /*
1761 Prima needs to start the WDA correctly instead of BAL and SAL
1762 */
1763
1764 /* Vos preStart is calling */
1765 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1766 {
1767 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1768 goto err_status_failure;
1769 }
1770
1771
1772 vStatus = WDA_NVDownload_Start(pVosContext);
1773
1774 if ( vStatus != VOS_STATUS_SUCCESS )
1775 {
1776 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1777 "%s: Failed to start NV Download",__func__);
1778 return VOS_STATUS_E_FAILURE;
1779 }
1780
1781 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1782
1783 if ( vStatus != VOS_STATUS_SUCCESS )
1784 {
1785 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1786 {
1787 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001788 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001789 }
1790 else
1791 {
1792 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001793 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001794 }
1795 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301796 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001797 }
1798
1799 vStatus = WDA_start(pVosContext);
1800 if (vStatus != VOS_STATUS_SUCCESS)
1801 {
1802 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1803 "%s: Failed to start WDA",__func__);
1804 goto err_status_failure;
1805 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001806
Jeff Johnson295189b2012-06-20 16:38:30 -07001807
1808 /* Start the MAC */
1809 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1810
Jeff Johnson295189b2012-06-20 16:38:30 -07001811
1812 halStartParams.driverType = eDRIVER_TYPE_MFG;
1813
1814 /* Start the MAC */
1815 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1816
Jeff Johnson295189b2012-06-20 16:38:30 -07001817
1818 if (eSIR_SUCCESS != sirStatus)
1819 {
1820 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1821 "%s: Failed to start MAC", __func__);
1822
Jeff Johnson295189b2012-06-20 16:38:30 -07001823 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001824 }
1825
1826 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1827 "%s: MAC correctly started",__func__);
1828
Jeff Johnson295189b2012-06-20 16:38:30 -07001829
1830 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1831
1832 return VOS_STATUS_SUCCESS;
1833
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001834err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001835 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1836 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1837 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1838 if(vStatus != VOS_STATUS_SUCCESS)
1839 {
1840 if(vStatus == VOS_STATUS_E_TIMEOUT)
1841 {
1842 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001843 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001844
1845 }
1846 else
1847 {
1848 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001849 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001850 }
1851 VOS_ASSERT(0);
1852 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001853
1854err_status_failure:
1855
1856 return VOS_STATUS_E_FAILURE;
1857
1858}
1859
1860
1861static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1862{
1863 VOS_STATUS vosStatus;
1864
1865 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1866 {
1867 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1868 return VOS_STATUS_E_FAILURE;
1869 }
1870
1871 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1872 {
1873 /* STOP MAC only */
1874 v_VOID_t *hHal;
1875 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1876 if (NULL == hHal)
1877 {
1878 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1879 "%s: NULL hHal", __func__);
1880 }
1881 else
1882 {
1883 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1884 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1885 {
1886 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1887 "%s: Failed to stop SYS", __func__);
1888 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1889 }
1890 }
1891
Jeff Johnson295189b2012-06-20 16:38:30 -07001892
Jeff Johnson295189b2012-06-20 16:38:30 -07001893 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001894
1895 }
1896 return WLAN_FTM_SUCCESS;
1897}
1898
Jeff Johnson295189b2012-06-20 16:38:30 -07001899/**---------------------------------------------------------------------------
1900
1901 \brief wlan_hdd_ftm_get_nv_table() -
1902 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001903 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001904
1905 \param - ftmCmd - Pointer FTM Commad Buffer
1906
1907 \return - int
1908 -1, Process Host command fail, vail out
1909 1, Process Host command success
1910
1911 --------------------------------------------------------------------------*/
1912int wlan_hdd_ftm_get_nv_table
1913(
1914 hdd_context_t *pHddCtx,
1915 tPttMsgbuffer *ftmCmd
1916)
1917{
1918 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1919 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1920 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001921 sHalNvV2 *nvContents = NULL;
1922 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001923
Jeff Johnson295189b2012-06-20 16:38:30 -07001924 if (NULL == pHddCtx)
1925 {
1926 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1927 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001928 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001929 }
1930
Leo Chang80de3c22013-11-26 10:52:12 -08001931 nvVersion = vos_nv_getNvVersion();
1932 if (E_NV_V2 != nvVersion)
1933 {
1934 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1935 "%s : Not valid NV Version %d", __func__, nvVersion);
1936 return -EINVAL;
1937 }
1938
Jeff Johnson295189b2012-06-20 16:38:30 -07001939 /* Test first chunk of NV table */
1940 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1941 (0 == pHddCtx->ftm.processedNVTableSize))
1942 {
1943 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1944 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1945 {
c_hpothuffdb5272013-10-02 16:42:35 +05301946 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1947 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001948 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001949 }
1950
1951 switch (nvTable->nvTable)
1952 {
1953 case NV_TABLE_RATE_POWER_SETTINGS:
1954 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1955 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1956 break;
1957
1958 case NV_TABLE_REGULATORY_DOMAINS:
1959 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1960 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1961 break;
1962
1963 case NV_TABLE_DEFAULT_COUNTRY:
1964 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1965 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1966 break;
1967
1968 case NV_TABLE_TPC_POWER_TABLE:
1969 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1970 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1971 break;
1972
1973 case NV_TABLE_TPC_PDADC_OFFSETS:
1974 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1975 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1976 break;
1977
1978 case NV_TABLE_VIRTUAL_RATE:
1979 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1980 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1981 break;
1982
1983 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1984 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1985 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1986 break;
1987
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001988 case NV_TABLE_HW_CAL_VALUES:
1989 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1990 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1991 break;
1992
1993 case NV_TABLE_FW_CONFIG:
1994 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1995 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001996 break;
1997
1998 case NV_TABLE_ANTENNA_PATH_LOSS:
1999 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2000 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2001 break;
2002
2003 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2004 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2005 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2006 break;
2007
2008 default:
2009 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2010 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002011 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002012 break;
2013 }
2014
2015 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2016 {
2017 /* Invalid table size, discard and initialize data */
2018 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002019 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002020 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002021 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002022 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2023 pHddCtx->ftm.targetNVTableSize = 0;
2024 pHddCtx->ftm.processedNVTableSize = 0;
2025 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002026 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002027 }
2028
2029 /* Set Current Processing NV table type */
2030 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2031 /* Copy target NV table value into temp context buffer */
2032 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2033 pHddCtx->ftm.targetNVTablePointer,
2034 pHddCtx->ftm.targetNVTableSize);
2035
2036 }
2037
2038 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2039 {
2040 /* Invalid table type */
2041 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2042 "Invalid NV Table, now Processing %d, not %d",
2043 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2044 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2045 pHddCtx->ftm.targetNVTableSize = 0;
2046 pHddCtx->ftm.processedNVTableSize = 0;
2047 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002048
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002049 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002050 }
2051
2052 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002053 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002054 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2055 nvTable->chunkSize);
2056 /* Update processed pointer to prepare next chunk copy */
2057 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2058
2059 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2060 {
2061 /* Finished to process last chunk of data, initialize buffer */
2062 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2063 pHddCtx->ftm.targetNVTableSize = 0;
2064 pHddCtx->ftm.processedNVTableSize = 0;
2065 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2066 }
2067
2068 return 1;
2069}
2070
2071/**---------------------------------------------------------------------------
2072
2073 \brief wlan_hdd_ftm_set_nv_table() -
2074 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002075 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002076
2077 \param - ftmCmd - Pointer FTM Commad Buffer
2078
2079 \return - int
2080 -1, Process Host command fail, vail out
2081 1, Process Host command success
2082
2083 --------------------------------------------------------------------------*/
2084int wlan_hdd_ftm_set_nv_table
2085(
2086 hdd_context_t *pHddCtx,
2087 tPttMsgbuffer *ftmCmd
2088)
2089{
2090 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2091 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2092 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002093 sHalNvV2 *nvContents = NULL;
2094 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002095
2096 if (NULL == pHddCtx)
2097 {
2098 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2099 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002100 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002101 }
2102
Leo Chang80de3c22013-11-26 10:52:12 -08002103 nvVersion = vos_nv_getNvVersion();
2104 if (E_NV_V2 != nvVersion)
2105 {
2106 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2107 "%s : Not valid NV Version %d", __func__, nvVersion);
2108 return -EINVAL;
2109 }
2110
Jeff Johnson295189b2012-06-20 16:38:30 -07002111 /* Test first chunk of NV table */
2112 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2113 (0 == pHddCtx->ftm.processedNVTableSize))
2114 {
2115 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2116 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2117 {
c_hpothuffdb5272013-10-02 16:42:35 +05302118 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2119 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002120 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002121 }
2122
2123 switch (nvTable->nvTable)
2124 {
2125 case NV_TABLE_RATE_POWER_SETTINGS:
2126 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2127 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2128 break;
2129
2130 case NV_TABLE_REGULATORY_DOMAINS:
2131 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2132 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2133 break;
2134
2135 case NV_TABLE_DEFAULT_COUNTRY:
2136 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2137 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2138 break;
2139
2140 case NV_TABLE_TPC_POWER_TABLE:
2141 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2142 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2143 break;
2144
2145 case NV_TABLE_TPC_PDADC_OFFSETS:
2146 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2147 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2148 break;
2149
2150 case NV_TABLE_VIRTUAL_RATE:
2151 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2152 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2153 break;
2154
2155 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2156 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2157 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2158 break;
2159
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002160 case NV_TABLE_HW_CAL_VALUES:
2161 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2162 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2163 break;
2164
2165 case NV_TABLE_FW_CONFIG:
2166 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2167 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002168 break;
2169
2170 case NV_TABLE_ANTENNA_PATH_LOSS:
2171 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2172 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2173 break;
2174
2175 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2176 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2177 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2178 break;
2179
2180 default:
2181 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2182 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002183 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 break;
2185 }
2186
2187 /* Set Current Processing NV table type */
2188 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2189 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2190 {
2191 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2192 "Invalid Table Size %d", nvTable->tableSize);
2193 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2194 pHddCtx->ftm.targetNVTableSize = 0;
2195 pHddCtx->ftm.processedNVTableSize = 0;
2196 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002197 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002198 }
2199 }
2200
2201 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2202 {
2203 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2204 "Invalid NV Table, now Processing %d, not %d",
2205 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2206 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2207 pHddCtx->ftm.targetNVTableSize = 0;
2208 pHddCtx->ftm.processedNVTableSize = 0;
2209 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002210 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002211 }
2212 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002213 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002214 nvTable->chunkSize);
2215
2216 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2217 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2218 {
2219 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2220 pHddCtx->ftm.tempNVTableBuffer,
2221 pHddCtx->ftm.targetNVTableSize);
2222 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2223 pHddCtx->ftm.targetNVTableSize = 0;
2224 pHddCtx->ftm.processedNVTableSize = 0;
2225 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2226 }
2227
2228 return 1;
2229}
2230
2231/**---------------------------------------------------------------------------
2232
2233 \brief wlan_hdd_ftm_blank_nv() -
2234 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002235 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002236
2237 \param - ftmCmd - Pointer FTM Commad Buffer
2238
2239 \return - int
2240 -1, Process Host command fail, vail out
2241 0, Process Host command success
2242
2243 --------------------------------------------------------------------------*/
2244int wlan_hdd_ftm_blank_nv_table
2245(
2246 tPttMsgbuffer *ftmCmd
2247)
2248{
Leo Chang80de3c22013-11-26 10:52:12 -08002249 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002250 v_SIZE_t nvSize;
2251 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002252 sHalNvV2 *nvContents = NULL;
2253 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002254
2255 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2256 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2257 {
c_hpothuffdb5272013-10-02 16:42:35 +05302258 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2259 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002260 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002261 }
2262
Leo Chang80de3c22013-11-26 10:52:12 -08002263 nvVersion = vos_nv_getNvVersion();
2264 if (E_NV_V2 != nvVersion)
2265 {
2266 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2267 "%s : Not valid NV Version %d", __func__, nvVersion);
2268 return -EINVAL;
2269 }
2270
Jeff Johnson295189b2012-06-20 16:38:30 -07002271 itemSize = sizeof(nvContents->tables.pwrOptimum);
2272 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002273 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002274 itemSize);
2275
2276 itemSize = sizeof(nvContents->tables.regDomains);
2277 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002278 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002279 itemSize);
2280
2281 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2282 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002283 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002284 itemSize);
2285
2286 itemSize = sizeof(nvContents->tables.plutCharacterized);
2287 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002288 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002289 itemSize);
2290
2291 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2292 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002293 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002294 itemSize);
2295
2296 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2297 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002298 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002299 itemSize);
2300
2301 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2302 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002303 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002304 itemSize);
2305
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002306 itemSize = sizeof(nvContents->tables.hwCalValues);
2307 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002308 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002309 itemSize);
2310
2311 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2312 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002313 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002314 itemSize);
2315
2316 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2317 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002318 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002319 itemSize);
2320
2321 return 1;
2322}
2323
2324/**---------------------------------------------------------------------------
2325
2326 \brief wlan_hdd_ftm_delete_nv_table() -
2327 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002328 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002329
2330 \param - ftmCmd - Pointer FTM Commad Buffer
2331
2332 \return - int
2333 -1, Process Host command fail, vail out
2334 1, Process Host command success
2335
2336 --------------------------------------------------------------------------*/
2337int wlan_hdd_ftm_delete_nv_table
2338(
2339 tPttMsgbuffer *ftmCmd
2340)
2341{
Leo Chang80de3c22013-11-26 10:52:12 -08002342 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002343 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2344 v_SIZE_t nvSize;
2345 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002346 sHalNvV2 *nvContents = NULL;
2347 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002348
2349 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2350 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2351 {
c_hpothuffdb5272013-10-02 16:42:35 +05302352 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2353 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002354 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002355 }
2356
Leo Chang80de3c22013-11-26 10:52:12 -08002357 nvVersion = vos_nv_getNvVersion();
2358 if (E_NV_V2 != nvVersion)
2359 {
2360 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2361 "%s : Not valid NV Version %d", __func__, nvVersion);
2362 return -EINVAL;
2363 }
2364
Jeff Johnson295189b2012-06-20 16:38:30 -07002365 switch (nvTable->nvTable)
2366 {
2367 case NV_TABLE_RATE_POWER_SETTINGS:
2368 itemSize = sizeof(nvContents->tables.pwrOptimum);
2369 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002370 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002371 itemSize);
2372 break;
2373
2374 case NV_TABLE_REGULATORY_DOMAINS:
2375 itemSize = sizeof(nvContents->tables.regDomains);
2376 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002377 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002378 itemSize);
2379 break;
2380
2381 case NV_TABLE_DEFAULT_COUNTRY:
2382 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2383 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002384 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002385 itemSize);
2386 break;
2387
2388 case NV_TABLE_TPC_POWER_TABLE:
2389 itemSize = sizeof(nvContents->tables.plutCharacterized);
2390 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002391 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002392 itemSize);
2393 break;
2394
2395 case NV_TABLE_TPC_PDADC_OFFSETS:
2396 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2397 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002398 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002399 itemSize);
2400 break;
2401
2402 case NV_TABLE_VIRTUAL_RATE:
2403 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2404 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002405 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002406 itemSize);
2407 break;
2408
2409 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2410 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2411 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002412 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002413 itemSize);
2414 break;
2415
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002416 case NV_TABLE_HW_CAL_VALUES:
2417 itemSize = sizeof(nvContents->tables.hwCalValues);
2418 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002419 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002420 itemSize);
2421 break;
2422
2423 case NV_TABLE_FW_CONFIG:
2424 itemSize = sizeof(nvContents->tables.fwConfig);
2425 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002426 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002427 itemSize);
2428 break;
2429
2430 case NV_TABLE_ANTENNA_PATH_LOSS:
2431 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2432 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002433 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002434 itemSize);
2435 break;
2436
2437 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2438 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2439 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002440 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002441 itemSize);
2442 break;
2443
2444 default:
2445 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2446 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002447 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002448 break;
2449 }
2450
2451 return 1;
2452}
2453
2454/**---------------------------------------------------------------------------
2455
2456 \brief wlan_hdd_ftm_get_nv_field() -
2457 Get Specific NV field
2458
2459 \param - ftmCmd - Pointer FTM Commad Buffer
2460
2461 \return - int
2462 -1, Process Host command fail, vail out
2463 1, Process Host command success
2464
2465 --------------------------------------------------------------------------*/
2466int wlan_hdd_ftm_get_nv_field
2467(
2468 tPttMsgbuffer *ftmCmd
2469)
2470{
2471 sNvFields nvFieldDataBuffer;
2472 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2473 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2474 sHalNv *nvContents = NULL;
2475 v_SIZE_t nvSize;
2476
2477 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2478 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2479 {
c_hpothuffdb5272013-10-02 16:42:35 +05302480 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2481 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002482 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002483 }
2484 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2485
2486 switch (nvField->nvField)
2487 {
2488 case NV_COMMON_PRODUCT_ID:
2489 memcpy((void *)&nvField->fieldData,
2490 &nvFieldDataBuffer.productId,
2491 sizeof(nvFieldDataBuffer.productId));
2492 break;
2493
2494 case NV_COMMON_PRODUCT_BANDS:
2495 memcpy((void *)&nvField->fieldData,
2496 &nvFieldDataBuffer.productBands,
2497 sizeof(nvFieldDataBuffer.productBands));
2498 break;
2499
2500 case NV_COMMON_NUM_OF_TX_CHAINS:
2501 memcpy((void *)&nvField->fieldData,
2502 &nvFieldDataBuffer.numOfTxChains,
2503 sizeof(nvFieldDataBuffer.numOfTxChains));
2504 break;
2505
2506 case NV_COMMON_NUM_OF_RX_CHAINS:
2507 memcpy((void *)&nvField->fieldData,
2508 &nvFieldDataBuffer.numOfRxChains,
2509 sizeof(nvFieldDataBuffer.numOfRxChains));
2510 break;
2511
2512 case NV_COMMON_MAC_ADDR:
2513 memcpy((void *)&nvField->fieldData,
2514 &nvFieldDataBuffer.macAddr[0],
2515 NV_FIELD_MAC_ADDR_SIZE);
2516 break;
2517
2518 case NV_COMMON_MFG_SERIAL_NUMBER:
2519 memcpy((void *)&nvField->fieldData,
2520 &nvFieldDataBuffer.mfgSN[0],
2521 NV_FIELD_MFG_SN_SIZE);
2522 break;
2523
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002524 case NV_COMMON_WLAN_NV_REV_ID:
2525 memcpy((void *)&nvField->fieldData,
2526 &nvFieldDataBuffer.wlanNvRevId,
2527 sizeof(nvFieldDataBuffer.wlanNvRevId));
2528 break;
2529
Jeff Johnson295189b2012-06-20 16:38:30 -07002530 case NV_COMMON_COUPLER_TYPE:
2531 memcpy((void *)&nvField->fieldData,
2532 &nvFieldDataBuffer.couplerType,
2533 sizeof(nvFieldDataBuffer.couplerType));
2534 break;
2535
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002536 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002537 {
2538 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2539 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2540
2541 nvEmbededStatus = vos_nv_isEmbeddedNV();
2542
2543 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2544 {
2545 // High bit is set to indicate embedded NV..
2546 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2547 }
2548
2549 memcpy((void *)&nvField->fieldData,
2550 &nvVersion,
2551 sizeof(nvFieldDataBuffer.nvVersion));
2552 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002553 break;
2554
Jeff Johnson295189b2012-06-20 16:38:30 -07002555 default:
2556 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2557 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002558 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002559 break;
2560 }
2561
2562 return 1;
2563}
2564
2565/**---------------------------------------------------------------------------
2566
2567 \brief wlan_hdd_ftm_set_nv_field() -
2568 Set Specific NV field
2569
2570 \param - ftmCmd - Pointer FTM Commad Buffer
2571
2572 \return - int
2573 -1, Process Host command fail, vail out
2574 1, Process Host command success
2575
2576 --------------------------------------------------------------------------*/
2577int wlan_hdd_ftm_set_nv_field
2578(
2579 tPttMsgbuffer *ftmCmd
2580)
2581{
2582 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2583 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2584 v_SIZE_t nvSize;
2585 sHalNv *nvContents = NULL;
2586 v_U8_t macLoop;
2587 v_U8_t *pNVMac;
2588 v_U8_t lastByteMAC;
2589
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002590
Jeff Johnson295189b2012-06-20 16:38:30 -07002591 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2592 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2593 {
c_hpothuffdb5272013-10-02 16:42:35 +05302594 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2595 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002596 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002597 }
2598
2599 switch (nvField->nvField)
2600 {
2601 case NV_COMMON_PRODUCT_ID:
2602 memcpy(&nvContents->fields.productId,
2603 &nvField->fieldData,
2604 sizeof(nvContents->fields.productId));
2605 break;
2606
2607 case NV_COMMON_PRODUCT_BANDS:
2608 memcpy(&nvContents->fields.productBands,
2609 &nvField->fieldData,
2610 sizeof(nvContents->fields.productBands));
2611 break;
2612
2613 case NV_COMMON_NUM_OF_TX_CHAINS:
2614 memcpy(&nvContents->fields.numOfTxChains,
2615 &nvField->fieldData,
2616 sizeof(nvContents->fields.numOfTxChains));
2617 break;
2618
2619 case NV_COMMON_NUM_OF_RX_CHAINS:
2620 memcpy(&nvContents->fields.numOfRxChains,
2621 &nvField->fieldData,
2622 sizeof(nvContents->fields.numOfRxChains));
2623 break;
2624
2625 case NV_COMMON_MAC_ADDR:
2626 /* If Last byte is larger than 252 (0xFC), return Error,
2627 * Since 3MACs should be derived from first MAC */
2628 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002629 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002630 {
2631 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2632 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002633 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002634 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002635 }
2636
2637 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002638 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002639 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2640 {
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 lastByteMAC + macLoop;
2643 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002644 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002645 NV_FIELD_MAC_ADDR_SIZE);
2646 }
2647 break;
2648
2649 case NV_COMMON_MFG_SERIAL_NUMBER:
2650 memcpy(&nvContents->fields.mfgSN[0],
2651 &nvField->fieldData,
2652 NV_FIELD_MFG_SN_SIZE);
2653 break;
2654
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002655 case NV_COMMON_WLAN_NV_REV_ID:
2656 memcpy(&nvContents->fields.wlanNvRevId,
2657 &nvField->fieldData,
2658 sizeof(nvContents->fields.wlanNvRevId));
2659 break;
2660
Jeff Johnson295189b2012-06-20 16:38:30 -07002661 case NV_COMMON_COUPLER_TYPE:
2662 memcpy(&nvContents->fields.couplerType,
2663 &nvField->fieldData,
2664 sizeof(nvContents->fields.couplerType));
2665 break;
2666
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002667 case NV_COMMON_NV_VERSION:
2668 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2669 "Cannot modify NV version field %d", nvField->nvField);
2670 return -EIO;
2671 break;
2672
Jeff Johnson295189b2012-06-20 16:38:30 -07002673 default:
2674 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2675 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002676 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002677 break;
2678 }
2679
2680 return 1;
2681}
2682
2683/**---------------------------------------------------------------------------
2684
2685 \brief wlan_hdd_ftm_store_nv_table() -
2686 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002687 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002688
2689 \param - ftmCmd - Pointer FTM Commad Buffer
2690
2691 \return - int
2692 -1, Process Host command fail, vail out
2693 0, Process Host command success
2694
2695 --------------------------------------------------------------------------*/
2696int wlan_hdd_ftm_store_nv_table
2697(
2698 tPttMsgbuffer *ftmCmd
2699)
2700{
2701 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2702 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002703 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2704 void *tablePtr = NULL;
2705 unsigned int tableSize = 0;
2706 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002707 sHalNvV2 *nvContents = NULL;
2708 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002709
2710 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2711 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2712 {
c_hpothuffdb5272013-10-02 16:42:35 +05302713 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2714 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002715 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002716 }
2717
Leo Chang80de3c22013-11-26 10:52:12 -08002718 nvVersion = vos_nv_getNvVersion();
2719 if (E_NV_V2 != nvVersion)
2720 {
2721 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2722 "%s : Not valid NV Version %d", __func__, nvVersion);
2723 return -EINVAL;
2724 }
2725
Jeff Johnson295189b2012-06-20 16:38:30 -07002726 /* Set Platform type as PRIMA */
2727 nvContents->fields.wlanNvRevId = 2;
2728
2729 switch(nvTable->nvTable)
2730 {
2731 case NV_FIELDS_IMAGE:
2732 tablePtr = (void *)&nvContents->fields;
2733 tableSize = sizeof(nvContents->fields);
2734 tableVNVType = VNV_FIELD_IMAGE;
2735 break;
2736
2737 case NV_TABLE_RATE_POWER_SETTINGS:
2738 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2739 tableSize = sizeof(nvContents->tables.pwrOptimum);
2740 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2741 break;
2742
2743 case NV_TABLE_REGULATORY_DOMAINS:
2744 tablePtr = (void *)&nvContents->tables.regDomains[0];
2745 tableSize = sizeof(nvContents->tables.regDomains);
2746 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2747 break;
2748
2749 case NV_TABLE_DEFAULT_COUNTRY:
2750 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2751 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2752 tableVNVType = VNV_DEFAULT_LOCATION;
2753 break;
2754
2755 case NV_TABLE_TPC_POWER_TABLE:
2756 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2757 tableSize = sizeof(nvContents->tables.plutCharacterized);
2758 tableVNVType = VNV_TPC_POWER_TABLE;
2759 break;
2760
2761 case NV_TABLE_TPC_PDADC_OFFSETS:
2762 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2763 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2764 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2765 break;
2766
2767 case NV_TABLE_VIRTUAL_RATE:
2768 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2769 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2770 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2771 break;
2772
2773 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2774 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2775 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2776 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2777 break;
2778
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002779 case NV_TABLE_HW_CAL_VALUES:
2780 tablePtr = (void *)&nvContents->tables.hwCalValues;
2781 tableSize = sizeof(nvContents->tables.hwCalValues);
2782 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002783 break;
2784
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002785 case NV_TABLE_FW_CONFIG:
2786 tablePtr = (void *)&nvContents->tables.fwConfig;
2787 tableSize = sizeof(nvContents->tables.fwConfig);
2788 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002789 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002790
Jeff Johnson295189b2012-06-20 16:38:30 -07002791 case NV_TABLE_ANTENNA_PATH_LOSS:
2792 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2793 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2794 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2795 break;
2796
2797 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2798 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2799 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2800 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2801 break;
2802
2803 default:
2804 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2805 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002806 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002807 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002808
Jeff Johnson295189b2012-06-20 16:38:30 -07002809 }
2810
2811 nvStatus = vos_nv_write(tableVNVType,
2812 tablePtr,
2813 tableSize);
2814 if(VOS_STATUS_SUCCESS != nvStatus)
2815 {
c_hpothuffdb5272013-10-02 16:42:35 +05302816 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2817 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002818 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002819 }
2820
2821 return 1;
2822}
2823
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002824/* --------------------------------------------------------------------------
2825 \brief wlan_hdd_ftm_get_nv_bin() -
2826 Get NV bin read from Flash Memory, file
2827
2828 \param - ftmCmd - Pointer FTM Commad Buffer
2829
2830 \return - int
2831 -1, Process Host command fail, vail out
2832 0, Process Host command success
2833--------------------------------------------------------------------------*/
2834
2835static int wlan_hdd_ftm_get_nv_bin
2836(
2837 v_U16_t msgId,
2838 hdd_context_t *pHddCtx,
2839 tPttMsgbuffer *ftmCmd
2840)
2841{
2842 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2843 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2844 v_SIZE_t nvSize;
2845 v_U8_t *nvContents;
2846 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002847 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002848
Leo Chang80de3c22013-11-26 10:52:12 -08002849 nvVersion = vos_nv_getNvVersion();
2850 if (E_NV_V3 != nvVersion)
2851 {
2852 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2853 "%s : Not valid NV Version %d", __func__, nvVersion);
2854 return -EINVAL;
2855 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002856
2857 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2858 (0 == pHddCtx->ftm.processedNVTableSize))
2859 {
2860 if ( msgId == PTT_MSG_GET_NV_BIN )
2861 {
2862 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2863 }
2864 else
2865 {
2866 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2867 }
2868
2869 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2870 {
c_hpothuffdb5272013-10-02 16:42:35 +05302871 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2872 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002873 return -EIO;
2874 }
2875
2876 switch (nvTable->nvTable)
2877 {
2878 case NV_BINARY_IMAGE:
2879 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2880 break;
2881 default:
2882 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2883 "Not Valid NV Table %d", nvTable->nvTable);
2884 return -EIO;
2885 break;
2886 }
2887
2888 /* Set Current Processing NV table type */
2889 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2890 if ( msgId == PTT_MSG_GET_NV_BIN )
2891 {
2892 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2893 /* Validity Period */
2894 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2895 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2896 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2897 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2898 offset = sizeof(v_U32_t);
2899 }
2900 else
2901 {
2902 pHddCtx->ftm.targetNVTableSize = nvSize;
2903 offset = 0;
2904 }
2905
2906 /* Copy target NV table value into temp context buffer */
2907 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2908 pHddCtx->ftm.targetNVTablePointer,
2909 pHddCtx->ftm.targetNVTableSize);
2910 }
2911
2912
2913 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2914 {
2915 /* Invalid table type */
2916 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2917 "Invalid NV Table, now Processing %d, not %d",
2918 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2919
2920 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2921 pHddCtx->ftm.targetNVTableSize = 0;
2922 pHddCtx->ftm.processedNVTableSize = 0;
2923 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2924
2925 return -EINVAL;
2926 }
2927
2928 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2929
2930 /* Update processed pointer to prepare next chunk copy */
2931 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2932 pHddCtx->ftm.targetNVTableSize )
2933 {
2934 nvTable->chunkSize =
2935 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2936 }
2937
2938 /* Copy next chunk of NV table value into response buffer */
2939 vos_mem_copy(
2940 &nvTable->tableData,
2941 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2942 nvTable->chunkSize);
2943
2944 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2945
2946 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2947 {
2948 /* Finished to process last chunk of data, initialize buffer */
2949 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2950 pHddCtx->ftm.targetNVTableSize = 0;
2951 pHddCtx->ftm.processedNVTableSize = 0;
2952 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2953 }
2954
2955 return 1;
2956}
2957
2958/**---------------------------------------------------------------------------
2959
2960 \brief wlan_hdd_ftm_set_nv_bin() -
2961 Set NV bin to Flash Memory, file
2962
2963 \param - ftmCmd - Pointer FTM Commad Buffer
2964
2965 \return - int
2966 -1, Process Host command fail, vail out
2967 0, Process Host command success
2968
2969+----------------------------------------------------------------------------*/
2970
2971static int wlan_hdd_ftm_set_nv_bin
2972(
2973 hdd_context_t *pHddCtx,
2974 tPttMsgbuffer *ftmCmd
2975)
2976{
2977 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2978 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002979 eNvVersionType nvVersion;
2980
2981 nvVersion = vos_nv_getNvVersion();
2982 if (E_NV_V3 != nvVersion)
2983 {
2984 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2985 "%s : Not valid NV Version %d", __func__, nvVersion);
2986 return -EINVAL;
2987 }
2988
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002989
2990 /* Test first chunk of NV table */
2991 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2992 (0 == pHddCtx->ftm.processedNVTableSize))
2993 {
2994 switch (nvTable->nvTable)
2995 {
2996 case NV_BINARY_IMAGE:
2997 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2998 break;
2999 default:
3000 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3001 "Not Valid NV Table %d", nvTable->nvTable);
3002 return -EIO;
3003 break;
3004 }
3005
3006 /* Set Current Processing NV table type */
3007 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
3008 pHddCtx->ftm.processedNVTableSize = 0;
3009
3010 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
3011 {
3012 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3013 "Invalid Table Size %d", nvTable->tableSize);
3014 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3015 pHddCtx->ftm.targetNVTableSize = 0;
3016 pHddCtx->ftm.processedNVTableSize = 0;
3017 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3018 return -EINVAL;
3019 }
3020 }
3021
3022 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3023 {
3024 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3025 "Invalid NV Table, now Processing %d, not %d",
3026 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3027 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3028 pHddCtx->ftm.targetNVTableSize = 0;
3029 pHddCtx->ftm.processedNVTableSize = 0;
3030 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3031 return -EINVAL;
3032 }
3033
3034 vos_mem_copy(
3035 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3036 &nvTable->tableData,
3037 nvTable->chunkSize);
3038
3039 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3040
3041 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3042 {
3043 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3044 "Processing Done!! write encoded Buffer %d",
3045 pHddCtx->ftm.targetNVTableSize);
3046
3047 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3048 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3049
3050 if ((VOS_STATUS_SUCCESS != nvStatus))
3051 {
3052 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3053 "Fail to set NV Binary %d", nvStatus);
3054 return -EIO;
3055 }
3056
3057 nvStatus = vos_nv_setNVEncodedBuffer(
3058 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3059 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3060
3061 if ((VOS_STATUS_SUCCESS != nvStatus))
3062 {
3063 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3064 "Fail to set NV Binary %d", nvStatus);
3065 return -EIO;
3066 }
3067
3068 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3069 pHddCtx->ftm.targetNVTableSize = 0;
3070 pHddCtx->ftm.processedNVTableSize = 0;
3071 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3072 }
3073
3074 return 1;
3075}
3076
Jeff Johnson295189b2012-06-20 16:38:30 -07003077/**---------------------------------------------------------------------------
3078
3079 \brief wlan_hdd_ftm_temp_get_rel_num() -
3080 Get internal release number
3081
3082 \param - ftmCmd - Pointer FTM Commad Buffer
3083
3084 \return - int
3085 -1, Process Host command fail, vail out
3086 0, Process Host command success
3087
3088 --------------------------------------------------------------------------*/
3089int wlan_hdd_ftm_temp_get_rel_num
3090(
3091 tPttMsgbuffer *ftmCmd
3092)
3093{
3094 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3095
3096 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3097 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3098 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3099 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3100 relNum->relParams.pttMax = 10;
3101 relNum->relParams.pttMin = 1;
3102
3103 return 1;
3104}
3105
3106/**---------------------------------------------------------------------------
3107
3108 \brief wlan_hdd_process_ftm_host_cmd() -
3109 process any command should be handled within host.
3110 decide any command should be send to HAL or not
3111
3112 \param - ftmCmd - Pointer FTM Commad Buffer
3113
3114 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003115 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003116 0, Process Host command success, not need to send CMD to HAL
3117 1, Process Host command success, need to send CMD to HAL
3118
3119 --------------------------------------------------------------------------*/
3120int wlan_hdd_process_ftm_host_cmd
3121(
3122 hdd_context_t *pHddCtx,
3123 void *ftmCmd
3124)
3125{
3126 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3127 int needToRouteHal = 1;
3128 int hostState = 1;
3129
3130 switch(pFTMCmd->msgId)
3131 {
3132 case PTT_MSG_GET_NV_TABLE:
3133 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3134 needToRouteHal = 0;
3135 break;
3136
3137 case PTT_MSG_SET_NV_TABLE:
3138 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3139 /* Temp NV Operation will be isolated to host
3140 needToRouteHal = 1; */
3141 needToRouteHal = 0;
3142 break;
3143
3144 case PTT_MSG_BLANK_NV:
3145 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3146 needToRouteHal = 1;
3147 break;
3148
3149 case PTT_MSG_DEL_NV_TABLE:
3150 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3151 needToRouteHal = 1;
3152 break;
3153
3154 case PTT_MSG_GET_NV_FIELD:
3155 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3156 needToRouteHal = 0;
3157 break;
3158
3159 case PTT_MSG_SET_NV_FIELD:
3160 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3161 needToRouteHal = 0;
3162 break;
3163
3164 case PTT_MSG_STORE_NV_TABLE:
3165 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3166 needToRouteHal = 0;
3167 break;
3168
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003169 case PTT_MSG_GET_NV_BIN:
3170 case PTT_MSG_GET_DICTIONARY:
3171 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3172 needToRouteHal = 0;
3173 break;
3174
3175 case PTT_MSG_SET_NV_BIN:
3176 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3177 needToRouteHal = 0;
3178 break;
3179
Jeff Johnson295189b2012-06-20 16:38:30 -07003180 case PTT_MSG_DBG_READ_REGISTER:
3181 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3182 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3183 needToRouteHal = 0;
3184 break;
3185
3186 case PTT_MSG_DBG_WRITE_REGISTER:
3187 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3188 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3189 needToRouteHal = 0;
3190 break;
3191
3192 case PTT_MSG_DBG_READ_MEMORY:
3193 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3194 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3195 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3196 needToRouteHal = 0;
3197 break;
3198
3199 case PTT_MSG_DBG_WRITE_MEMORY:
3200 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3201 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3202 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3203 needToRouteHal = 0;
3204 break;
3205
3206 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3207 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3208 needToRouteHal = 0;
3209 break;
3210
3211 default:
3212 needToRouteHal = 1;
3213 break;
3214 }
3215
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003216 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003217 {
3218 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3219 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003220 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003221 }
3222
3223 return needToRouteHal;
3224}
Jeff Johnson295189b2012-06-20 16:38:30 -07003225
3226/**---------------------------------------------------------------------------
3227
3228 \brief wlan_hdd_process_ftm_cmd() -
3229
3230 This function process the commands received from the ptt socket application.
3231
3232 \param - pAdapter - Pointer HDD Context.
3233
3234 \param - wnl - Pointer to the ANI netlink header.
3235
3236 \return - none
3237
3238 --------------------------------------------------------------------------*/
3239
3240void wlan_hdd_process_ftm_cmd
3241(
3242 hdd_context_t *pHddCtx,
3243 tAniNlHdr *wnl
3244)
3245{
3246 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3247 v_U16_t cmd_len;
3248 v_U8_t *pftm_data;
3249 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003250 int hostState;
3251 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003252
3253 ENTER();
3254
Jeff Johnsone7245742012-09-05 17:12:55 -07003255 //Delay to fix NV write failure on JB
3256 vos_busy_wait(10000); //10ms
3257
Jeff Johnson295189b2012-06-20 16:38:30 -07003258 if (!pRequestBuf) {
3259
Arif Hussain6d2a3322013-11-17 19:50:10 -08003260 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003261 return ;
3262 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303263
3264 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3265 {
3266 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3267 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3268 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3269 return ;
3270 }
3271
Jeff Johnson295189b2012-06-20 16:38:30 -07003272 /*Save the received request*/
3273 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3274
3275 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3276 /*Save the received request netlink header used for sending the response*/
3277 pHddCtx->ftm.wnl = wnl;
3278 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3279
Arif Hussain6d2a3322013-11-17 19:50:10 -08003280 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003281
3282 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3283 wlan_ftm_send_response(pHddCtx);
3284 return ;
3285 }
3286
3287 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3288 {
3289 case WLAN_FTM_START:
3290 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3291
Arif Hussain6d2a3322013-11-17 19:50:10 -08003292 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003293 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3294 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3295 wlan_ftm_send_response(pHddCtx);
3296 return;
3297 }
3298
3299 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3300 {
3301 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3302 ,__func__);
3303 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3304 wlan_ftm_send_response(pHddCtx);
3305 return;
3306 }
3307 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3308 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3309 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3310 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3311
3312 wlan_ftm_send_response(pHddCtx);
3313
3314 break;
3315
3316 case WLAN_FTM_STOP:
3317 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3318
Arif Hussain6d2a3322013-11-17 19:50:10 -08003319 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003320 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3321 wlan_ftm_send_response(pHddCtx);
3322 return;
3323 }
3324
3325 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3326
3327 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3328 wlan_ftm_send_response(pHddCtx);
3329 return;
3330 }
3331
3332 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3333 /* This would send back the Command Success Status */
3334 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3335
3336 wlan_ftm_send_response(pHddCtx);
3337
3338 break;
3339
3340 case WLAN_FTM_CMD:
3341 /* if it is regular FTM command, pass it to HAL PHY */
3342 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003343 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003344 return;
3345 }
3346 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3347
Arif Hussain6d2a3322013-11-17 19:50:10 -08003348 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003349
3350 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3351 wlan_ftm_send_response(pHddCtx);
3352 return;
3353
3354 }
3355 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3356 cmd_len = pRequestBuf->ftm_hdr.data_len;
3357 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3358 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3359
Jeff Johnson295189b2012-06-20 16:38:30 -07003360 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3361 if (0 == hostState)
3362 {
3363 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3364 if (NULL == tempRspBuffer)
3365 {
3366 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003367 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003368 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3369 wlan_ftm_send_response(pHddCtx);
3370 return;
3371 }
3372 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3373 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3374 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3375 (unsigned char *) tempRspBuffer,
3376 tempRspBuffer->msgBodyLength);
3377 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3378 wlan_ftm_send_response(pHddCtx);
3379 vos_mem_free(tempRspBuffer);
3380 return;
3381 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003382 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003383 {
3384 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3385 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3386 wlan_ftm_send_response(pHddCtx);
3387 return;
3388 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003389
3390 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3391
Jeff Johnson295189b2012-06-20 16:38:30 -07003392
3393 /*Post the command to the HAL*/
3394 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3395
Arif Hussain6d2a3322013-11-17 19:50:10 -08003396 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003397 return;
3398
3399 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303400 /*After successful posting of message the command should be pending*/
3401 pHddCtx->ftm.IsCmdPending = TRUE;
3402
Jeff Johnson295189b2012-06-20 16:38:30 -07003403 /*Wait here until you get the response from HAL*/
3404 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3405 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303406 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3407 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3408 wlan_ftm_send_response(pHddCtx);
3409 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 return;
3411 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303412 /*This check will handle the case where the completion is sent by
3413 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3414 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3415 {
3416 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3417 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3418 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3419
3420 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3421 wlan_ftm_send_response(pHddCtx);
3422 pHddCtx->ftm.IsCmdPending = FALSE;
3423 return ;
3424 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003425
3426 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3427
3428 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3429
3430 wlan_ftm_send_response(pHddCtx);
3431 pHddCtx->ftm.IsCmdPending = FALSE;
3432 break;
3433
3434 default:
3435
Arif Hussain6d2a3322013-11-17 19:50:10 -08003436 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 return;
3438 }
3439
3440 EXIT();
3441 return;
3442} /* wlan_adp_ftm_cmd() */
3443
3444/**---------------------------------------------------------------------------
3445
3446 \brief wlan_ftm_priv_start_stop_ftm() -
3447
3448 This function is used for start/stop the ftm driver.
3449
3450 \param - pAdapter - Pointer HDD Context.
3451 - start - 1/0 to start/stop ftm driver.
3452
3453 \return - 0 for success, non zero for failure
3454
3455 --------------------------------------------------------------------------*/
3456
3457static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3458 v_U16_t start)
3459{
3460 VOS_STATUS status;
3461 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3462
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003463 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003464 {
3465 pHddCtx->ftm.cmd_iwpriv = TRUE;
3466 status = wlan_hdd_ftm_start(pHddCtx);
3467
3468 if (status != VOS_STATUS_SUCCESS)
3469 {
3470 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3471 "FTM Start Failed");
3472 return VOS_STATUS_E_FAILURE;
3473 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303474 if (NULL == pMsgBuf)
3475 {
3476 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3477 if (NULL == pMsgBuf)
3478 {
3479 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3480 "%s:pMsgBuf is NULL", __func__);
3481 return VOS_STATUS_E_FAILURE;
3482 }
3483 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003484 }
3485 else
3486 {
3487 status = wlan_ftm_stop(pHddCtx);
3488
3489 if (status != VOS_STATUS_SUCCESS)
3490 {
3491 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3492 "FTM Stop Failed");
3493 return VOS_STATUS_E_FAILURE;
3494 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303495 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3496 if (pMsgBuf)
3497 {
3498 vos_mem_free((v_VOID_t * )pMsgBuf);
3499 pMsgBuf = NULL;
3500 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003501 }
3502 return VOS_STATUS_SUCCESS;
3503}
3504
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303505
3506static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3507{
3508 unsigned int *table = NULL;
3509 int index = 0;
3510
3511 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3512 table = valid_channel;
3513 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3514 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3515 table = valid_channel_cb40;
3516 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3517 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3518 table = valid_channel_cb80;
3519
3520 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303521 {
3522 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3523 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303524 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303525 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303526
3527 while (table[index] != 0)
3528 {
3529 if (table[index] == channel)
3530 return VOS_STATUS_SUCCESS;
3531
3532 index++;
3533 }
3534
3535 return VOS_STATUS_E_FAILURE;
3536}
3537
3538
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303539static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3540{
3541 unsigned int primary_channel = center_channel;
3542
3543 if (center_channel <= 14)
3544 return primary_channel ;
3545
3546 switch (cb)
3547 {
3548 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3549 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3550 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3551 primary_channel -= 2;
3552 break;
3553
3554
3555 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3556 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3557 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3558 primary_channel += 2;
3559 break;
3560
3561 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3562 primary_channel -= 6;
3563 break;
3564
3565 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3566 primary_channel += 6;
3567 break;
3568 }
3569
3570 return primary_channel;
3571
3572}
3573
Jeff Johnson295189b2012-06-20 16:38:30 -07003574/**---------------------------------------------------------------------------
3575
3576 \brief wlan_ftm_priv_set_channel() -
3577
3578 This function is used for setting the channel to the halphy ptt module.
3579
3580 \param - pAdapter - Pointer HDD Context.
3581 - channel - Channel Number 1-14.
3582
3583 \return - 0 for success, non zero for failure
3584
3585 --------------------------------------------------------------------------*/
3586
3587static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3588{
Jeff Johnson295189b2012-06-20 16:38:30 -07003589 uPttMsgs *pMsgBody;
3590 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303591 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003592 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3593
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303594 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003595 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303596 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3597 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003598 return VOS_STATUS_E_FAILURE;
3599 }
3600
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303601 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003602 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303603 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3604 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003605 return VOS_STATUS_E_FAILURE;
3606 }
3607
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303608 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003609 init_completion(&pHddCtx->ftm.ftm_comp_var);
3610 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3611 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3612
3613 pMsgBody = &pMsgBuf->msgBody;
3614
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303615 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003616
Arif Hussain6d2a3322013-11-17 19:50:10 -08003617 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303618 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003619
3620 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303622 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3625 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003626 status = VOS_STATUS_E_FAILURE;
3627 goto done;
3628
3629 }
c_hpothuffdb5272013-10-02 16:42:35 +05303630 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303631 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303632 if (0 >= ret )
3633 {
3634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3635 FL("wait on ftm_comp_var failed %ld"), ret);
3636 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003637
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303638 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003639 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303640 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3641 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003642 status = VOS_STATUS_E_FAILURE;
3643 goto done;
3644
3645 }
3646done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003647
3648 return status;
3649}
3650
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303651
3652/**---------------------------------------------------------------------------
3653
3654 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3655
3656 This function is used for setting the power control mode for tx.
3657
3658 \param - pAdapter - Pointer HDD Context.
3659 - pwr_mode - power control mode 0-2.
3660
3661 \return - 0 for success, non zero for failure
3662
3663 --------------------------------------------------------------------------*/
3664
3665static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3666 v_U16_t pwr_mode)
3667{
3668 uPttMsgs *pMsgBody;
3669 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303670 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303671 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3672
3673 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3674 {
3675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3676 "%s:Ftm has not started. Please start the ftm. ", __func__);
3677 return VOS_STATUS_E_FAILURE;
3678 }
3679
3680 if (pwr_mode > 2)
3681 {
3682 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3683 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3684 return VOS_STATUS_E_FAILURE;
3685 }
3686
3687 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3688 init_completion(&pHddCtx->ftm.ftm_comp_var);
3689 pMsgBody = &pMsgBuf->msgBody;
3690 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3691 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3692
3693 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3694 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3695
3696 if (status != VOS_STATUS_SUCCESS)
3697 {
3698 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3699 "%s:wlan_ftm_postmsg failed", __func__);
3700 status = VOS_STATUS_E_FAILURE;
3701 goto done;
3702 }
c_hpothuffdb5272013-10-02 16:42:35 +05303703 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303704 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303705 if (0 >= ret )
3706 {
3707 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3708 FL("wait on ftm_comp_var failed %ld"), ret);
3709 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303710
3711 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3712 {
3713 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3714 "%s:Ptt response status failed", __func__);
3715 status = VOS_STATUS_E_FAILURE;
3716 goto done;
3717 }
3718
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303719 ftm_status.powerCtlMode= pwr_mode;
3720
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303721 done:
3722 return status;
3723
3724}
3725
Jeff Johnson295189b2012-06-20 16:38:30 -07003726/**---------------------------------------------------------------------------
3727
3728 \brief wlan_ftm_priv_set_txpower() -
3729
3730 This function is used for setting the txpower to the halphy ptt module.
3731
3732 \param - pAdapter - Pointer HDD Context.
3733 - txpower - txpower Number 1-18.
3734
3735 \return - 0 for success, non zero for failure
3736
3737 --------------------------------------------------------------------------*/
3738
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303739static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3740 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003741{
Jeff Johnson295189b2012-06-20 16:38:30 -07003742 uPttMsgs *pMsgBody;
3743 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303744 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003745 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3746
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303747 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003748 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303749 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3750 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003751 return VOS_STATUS_E_FAILURE;
3752 }
3753
3754 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3755 * when tx pktgen is enabled
3756 */
3757 if (ftm_status.frameGenEnabled)
3758 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303759 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3760 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003761 return VOS_STATUS_E_FAILURE;
3762 }
3763
3764 if(!(txpower >= 9 && txpower <= 24))
3765 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303766 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3767 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003768 return VOS_STATUS_E_FAILURE;
3769 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003770
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303771 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3772 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003773 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003774 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3775 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3776
3777 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3778
3779 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3780
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303781 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003782 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303783 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3784 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003785 status = VOS_STATUS_E_FAILURE;
3786 goto done;
3787 }
c_hpothuffdb5272013-10-02 16:42:35 +05303788 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303789 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303790 if (0 >= ret )
3791 {
3792 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3793 FL("wait on ftm_comp_var failed %ld"), ret);
3794 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003795
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303796 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003797 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303798 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3799 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003800 status = VOS_STATUS_E_FAILURE;
3801 goto done;
3802 }
3803
Jeff Johnson295189b2012-06-20 16:38:30 -07003804 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003805
3806 return status;
3807
3808}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303809
3810
3811static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3812 v_U16_t enable)
3813{
3814 tANI_U32 value = 0;
3815 tANI_U32 reg_addr;
3816 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303817
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303818 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3819 {
3820 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3821 "%s:Ftm has not started. Please start the ftm. ", __func__);
3822 return VOS_STATUS_E_FAILURE;
3823 }
3824
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303825 reg_addr = WCNSS_TXFIR_OFFSET;
3826
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303827 wpalReadRegister(reg_addr, &value);
3828 if (enable)
3829 {
3830 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3831 }
3832 else
3833 {
3834 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3835 }
3836
3837 wpalWriteRegister(reg_addr, value);
3838
3839 return VOS_STATUS_SUCCESS;
3840}
3841
3842
Jeff Johnson295189b2012-06-20 16:38:30 -07003843/**---------------------------------------------------------------------------
3844
3845 \brief wlan_ftm_priv_set_txrate() -
3846
3847 This function is used for setting the txrate to the halphy ptt module.
3848 It converts the user input string for txrate to the tx rate index.
3849
3850 \param - pAdapter - Pointer HDD Context.
3851 - txrate - Pointer to the tx rate string.
3852
3853 \return - 0 for success, non zero for failure
3854
3855 --------------------------------------------------------------------------*/
3856
3857static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3858{
3859 int ii;
3860 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3861 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3862 {
3863 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3864 return VOS_STATUS_E_FAILURE;
3865 }
3866
3867 /* do not allow to change setting when tx pktgen is enabled */
3868 if (ftm_status.frameGenEnabled)
3869 {
3870 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3871 return VOS_STATUS_E_FAILURE;
3872 }
3873
3874 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3875 {
3876 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3877 break;
3878 }
3879 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3880 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003881 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003882 return VOS_STATUS_E_FAILURE;
3883 }
3884
3885 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3886 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3887
3888 return VOS_STATUS_SUCCESS;
3889}
3890
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303891
3892
3893static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3894 ePowerTempIndexSource pwr_source)
3895{
3896 uPttMsgs *pMsgBody;
3897 VOS_STATUS status;
3898 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3899
3900 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3901 {
3902 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3903 "%s:Ftm has not started. Please start the ftm. ", __func__);
3904 return VOS_STATUS_E_FAILURE;
3905 }
3906
3907 if (pwr_source > 3)
3908 {
3909 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3910 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3911 __func__);
3912 return VOS_STATUS_E_FAILURE;
3913 }
3914
3915 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3916
3917 init_completion(&pHddCtx->ftm.ftm_comp_var);
3918 pMsgBody = &pMsgBuf->msgBody;
3919 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3920 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3921
3922 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3923 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3924
3925 if (status != VOS_STATUS_SUCCESS)
3926 {
3927 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3928 "%s:wlan_ftm_postmsg failed", __func__);
3929 status = VOS_STATUS_E_FAILURE;
3930 goto done;
3931 }
3932 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3933 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3934
3935 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3936 {
3937 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3938 "%s:Ptt response status failed", __func__);
3939 status = VOS_STATUS_E_FAILURE;
3940 goto done;
3941 }
3942
3943done:
3944
3945 return status;
3946}
3947
3948
Jeff Johnson295189b2012-06-20 16:38:30 -07003949/**---------------------------------------------------------------------------
3950
3951 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3952
3953 This function is used for start/stop the tx packet generation.
3954
3955 \param - pAdapter - Pointer HDD Context.
3956 - startStop - Value( 1/0) start/stop the tx packet generation.
3957
3958 \return - 0 for success, non zero for failure
3959
3960 --------------------------------------------------------------------------*/
3961
3962static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3963{
Jeff Johnson295189b2012-06-20 16:38:30 -07003964 uPttMsgs *pMsgBody;
3965 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303966 long ret;
3967
Jeff Johnson295189b2012-06-20 16:38:30 -07003968 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3969
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303970 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003971 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303972 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3973 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003974 return VOS_STATUS_E_FAILURE;
3975 }
3976
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303977 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003978 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3980 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003981 return VOS_STATUS_E_FAILURE;
3982 }
3983
3984 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3985 (!ftm_status.frameGenEnabled && startStop == 0))
3986 {
3987 return VOS_STATUS_SUCCESS ;
3988 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303989 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003990
Jeff Johnson295189b2012-06-20 16:38:30 -07003991 if (startStop == 1)
3992 {
3993 init_completion(&pHddCtx->ftm.ftm_comp_var);
3994 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3995 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3996 pMsgBody = &pMsgBuf->msgBody;
3997 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3998
3999 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304000 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004001 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304002 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4003 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004004 status = VOS_STATUS_E_FAILURE;
4005 goto done;
4006 }
4007
c_hpothuffdb5272013-10-02 16:42:35 +05304008 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304009 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304010 if (0 >= ret )
4011 {
4012 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4013 FL("wait on ftm_comp_var failed %ld"), ret);
4014 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304015 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004016 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4018 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004019 status = VOS_STATUS_E_FAILURE;
4020 goto done;
4021 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304022
4023 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4024 {
4025 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4026 if(status != VOS_STATUS_SUCCESS)
4027 {
4028 goto done;
4029 }
4030 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004031 }
4032
4033 init_completion(&pHddCtx->ftm.ftm_comp_var);
4034 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4035 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4036 pMsgBody = &pMsgBuf->msgBody;
4037 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4038
4039 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4040 if(status != VOS_STATUS_SUCCESS)
4041 {
4042 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4043 status = VOS_STATUS_E_FAILURE;
4044 goto done;
4045 }
4046
c_hpothuffdb5272013-10-02 16:42:35 +05304047 ret = wait_for_completion_interruptible_timeout(
4048 &pHddCtx->ftm.ftm_comp_var,
4049 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4050 if (0 >= ret )
4051 {
4052 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4053 FL("wait on ftm_comp_var failed %ld"), ret);
4054 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004055 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4056 {
4057 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4058 status = VOS_STATUS_E_FAILURE;
4059 goto done;
4060 }
4061
4062done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004063
4064 if (status == VOS_STATUS_SUCCESS)
4065 {
4066 if (startStop == 1)
4067 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304068 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004069 }
4070 else
4071 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304072 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004073 }
4074 }
4075
4076 return status;
4077}
4078
4079
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304080
4081static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4082{
4083
4084 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4085 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4086 {
4087 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4088 "%s:Ftm has not started. Please start the ftm. ", __func__);
4089 return VOS_STATUS_E_FAILURE;
4090 }
4091
4092 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4093 {
4094 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4095 "%s:cb mode value is invalid ", __func__);
4096 return VOS_STATUS_E_FAILURE;
4097 }
4098
4099 ftm_status.cbmode = cbmode;
4100
4101 return VOS_STATUS_SUCCESS;
4102
4103}
4104
Jeff Johnson295189b2012-06-20 16:38:30 -07004105/**---------------------------------------------------------------------------
4106
4107 \brief wlan_ftm_rx_mode() -
4108
4109 This function is used for start/stop the rx packet generation.
4110
4111 \param - pAdapter - Pointer HDD Context.
4112 - rxmode - 0-disable RX.
4113 - 1-rx ALL frames
4114 - 2-rx 11 g/n frames
4115 - 3-rx 11b frames
4116
4117 \return - 0 for success, non zero for failure
4118
4119 --------------------------------------------------------------------------*/
4120
4121static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4122{
Jeff Johnson295189b2012-06-20 16:38:30 -07004123 uPttMsgs *pMsgBody;
4124 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304125 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004126
4127 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304128 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004129 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304130 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4131 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004132 return VOS_STATUS_E_FAILURE;
4133 }
4134
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304135 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004136 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304137 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4138 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004139 return VOS_STATUS_E_FAILURE;
4140 }
4141
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304142 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004143 init_completion(&pHddCtx->ftm.ftm_comp_var);
4144
4145 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4146 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4147
4148 pMsgBody = &pMsgBuf->msgBody;
4149
4150 switch(rxmode)
4151 {
4152 case RXMODE_DISABLE_ALL:
4153 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4154 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4155 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4156 break;
4157
4158 case RXMODE_ENABLE_ALL:
4159 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4160 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4161 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4162 break;
4163
4164 case RXMODE_ENABLE_11GN:
4165 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4166 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4167 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4168 break;
4169
4170 case RXMODE_ENABLE_11B:
4171 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4172 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4173 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4174 break;
4175
4176 }
4177
4178 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4179
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304180 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004181 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304182 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4183 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004184 status = VOS_STATUS_E_FAILURE;
4185 goto done;
4186 }
c_hpothuffdb5272013-10-02 16:42:35 +05304187 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304188 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304189 if (0 >= ret )
4190 {
4191 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4192 FL(" wait on ftm_comp_var failed %ld"), ret);
4193 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004194
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304195 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004196 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304197 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4198 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004199 status = VOS_STATUS_E_FAILURE;
4200 goto done;
4201 }
4202 ftm_status.rxmode = rxmode ;
4203done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004204
4205 return status;
4206}
4207
4208/**---------------------------------------------------------------------------
4209
4210 \brief wlan_ftm_priv_rx_pkt_clear() -
4211
4212 This function sets the rx pkt count to zero.
4213
4214 \param - pAdapter - Pointer HDD Context.
4215 - rx_pkt_clear - rx_pkt_clear value.
4216
4217 \return - 0 for success, non zero for failure
4218
4219 --------------------------------------------------------------------------*/
4220
4221static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4222{
Jeff Johnson295189b2012-06-20 16:38:30 -07004223 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304224 long ret;
4225
Jeff Johnson295189b2012-06-20 16:38:30 -07004226 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4227
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304228 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004229 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304230 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4231 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004232 return VOS_STATUS_E_FAILURE;
4233 }
4234
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304235 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004236 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304237 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4238 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004239 return VOS_STATUS_E_FAILURE;
4240 }
4241
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304242 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004243 init_completion(&pHddCtx->ftm.ftm_comp_var);
4244 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304245 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004246
Jeff Johnson295189b2012-06-20 16:38:30 -07004247 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4248
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304249 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004250 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304251 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4252 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004253 status = VOS_STATUS_E_FAILURE;
4254 goto done;
4255 }
c_hpothuffdb5272013-10-02 16:42:35 +05304256 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304257 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304258 if (0 >= ret )
4259 {
4260 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4261 FL("wait on ftm_comp_var failed %ld"), ret);
4262 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004263
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304264 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004265 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304266 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4267 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004268 status = VOS_STATUS_E_FAILURE;
4269 goto done;
4270 }
4271done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004272
4273 return status;
4274}
4275
4276/**---------------------------------------------------------------------------
4277
4278 \brief wlan_ftm_priv_get_channel() -
4279
4280 This function gets the channel number from the halphy ptt module and
4281 returns the channel number to the application.
4282
4283 \param - pAdapter - Pointer HDD Context.
4284 - pChannel - Poniter to get the Channel number.
4285
4286 \return - 0 for success, non zero for failure
4287
4288 --------------------------------------------------------------------------*/
4289
4290static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4291{
Jeff Johnson295189b2012-06-20 16:38:30 -07004292 uPttMsgs *pMsgBody;
4293 VOS_STATUS status;
4294 v_U16_t freq;
4295 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304296 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004297
4298 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4299
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304300 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004301 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304302 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4303 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004304 return VOS_STATUS_E_FAILURE;
4305 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304306 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004307 init_completion(&pHddCtx->ftm.ftm_comp_var);
4308 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4309 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4310
4311 pMsgBody = &pMsgBuf->msgBody;
4312 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
4313
4314 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4315
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304316 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004317 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304318 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4319 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004320 status = VOS_STATUS_E_FAILURE;
4321 goto done;
4322
4323 }
c_hpothuffdb5272013-10-02 16:42:35 +05304324 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304325 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304326 if (0 >= ret )
4327 {
4328 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4329 FL("wait on ftm_comp_var failed %ld"), ret);
4330 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004331
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304332 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004333 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304334 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4335 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004336 status = VOS_STATUS_E_FAILURE;
4337 goto done;
4338 }
4339
4340 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4341
4342 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4343 indx++;
4344 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4345 {
4346 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4347 status = VOS_STATUS_E_FAILURE;
4348 goto done;
4349 }
4350
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004351 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004352
Arif Hussain6d2a3322013-11-17 19:50:10 -08004353 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004354 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004355
4356 return status;
4357}
4358
4359/**---------------------------------------------------------------------------
4360
4361 \brief wlan_ftm_priv_get_txpower() -
4362
4363 This function gets the TX power from the halphy ptt module and
4364 returns the TX power to the application.
4365
4366 \param - pAdapter - Pointer HDD Context.
4367 - pTxPwr - Poniter to get the Tx power.
4368
4369 \return - 0 for success, non zero for failure
4370
4371 --------------------------------------------------------------------------*/
4372
4373static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4374{
Jeff Johnson295189b2012-06-20 16:38:30 -07004375 uPttMsgs *pMsgBody;
4376 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304377 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004378 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4379
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304380 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004381 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304382 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4383 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004384 return VOS_STATUS_E_FAILURE;
4385 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304386 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004387 init_completion(&pHddCtx->ftm.ftm_comp_var);
4388 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4389 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4390
4391 pMsgBody = &pMsgBuf->msgBody;
4392
4393 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4394
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304395 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004396 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304397 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4398 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004399 status = VOS_STATUS_E_FAILURE;
4400 goto done;
4401 }
c_hpothuffdb5272013-10-02 16:42:35 +05304402 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304403 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304404 if (0 >= ret )
4405 {
4406 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4407 FL("wait on ftm_comp_var failed %ld"), ret);
4408 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004409
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304410 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004411 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304412 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4413 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004414 status = VOS_STATUS_E_FAILURE;
4415 goto done;
4416 }
4417 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4418
4419 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004420
4421 return status;
4422}
4423
4424/**---------------------------------------------------------------------------
4425
4426 \brief wlan_ftm_priv_get_ftm_version() -
4427
4428 This function gets ftm driver and firmware version.
4429
4430 \param - pAdapter - Pointer HDD Context.
4431 - pTxRate - Poniter to get the Tx rate.
4432
4433 \return - 0 for success, non zero for failure
4434
4435 --------------------------------------------------------------------------*/
4436
4437VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4438{
Jeff Johnson295189b2012-06-20 16:38:30 -07004439 uPttMsgs *pMsgBody;
4440 VOS_STATUS status;
4441 v_U32_t reg_val;
4442 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004443 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4444 int lenRes = 0;
4445 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304446 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004447
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304448 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004449 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304450 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4451 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004452 return VOS_STATUS_E_FAILURE;
4453 }
4454
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304455 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004456 init_completion(&pHddCtx->ftm.ftm_comp_var);
4457 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4458 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4459
4460 pMsgBody = &pMsgBuf->msgBody;
4461 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4462
4463 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4464
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304465 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004466 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304467 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4468 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004469 status = VOS_STATUS_E_FAILURE;
4470 goto done;
4471
4472 }
c_hpothuffdb5272013-10-02 16:42:35 +05304473 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304474 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304475 if (0 >= ret )
4476 {
4477 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4478 FL("wait on ftm_comp_var failed %ld"), ret);
4479 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004480
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304481 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004482 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304483 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4484 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004485 status = VOS_STATUS_E_FAILURE;
4486 goto done;
4487 }
4488
4489 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4490
4491 init_completion(&pHddCtx->ftm.ftm_comp_var);
4492
4493 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4494 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4495
4496 pMsgBody = &pMsgBuf->msgBody;
4497
4498 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4499
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304500 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004501 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304502 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4503 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004504 status = VOS_STATUS_E_FAILURE;
4505 goto done;
4506 }
c_hpothuffdb5272013-10-02 16:42:35 +05304507 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304508 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304509 if (0 >= ret )
4510 {
4511 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4512 FL("wait on ftm_comp_var failed %ld"), ret);
4513 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004514
4515 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4516 if(lenRes < 0 || lenRes >= lenBuf)
4517 {
4518 status = VOS_STATUS_E_FAILURE;
4519 goto done;
4520 }
4521
4522 buf += lenRes;
4523 lenBuf -= lenRes;
4524
4525 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004526 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 -07004527 if(lenRes < 0 || lenRes >= lenBuf)
4528 {
4529 status = VOS_STATUS_E_FAILURE;
4530 goto done;
4531 }
4532
4533 buf += lenRes;
4534 lenBuf -= lenRes;
4535
4536 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4537 if(lenRes < 0 || lenRes >= lenBuf)
4538 {
4539 status = VOS_STATUS_E_FAILURE;
4540 goto done;
4541 }
4542
4543 buf += lenRes;
4544 lenBuf -= lenRes;
4545
Jeff Johnson295189b2012-06-20 16:38:30 -07004546
4547done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004548
4549 return status;
4550
4551}
4552
4553/**---------------------------------------------------------------------------
4554
4555 \brief wlan_ftm_priv_get_txrate() -
4556
4557 This function gets the TX rate from the halphy ptt module and
4558 returns the TX rate to the application.
4559
4560 \param - pAdapter - Pointer HDD Context.
4561 - pTxRate - Poniter to get the Tx rate.
4562
4563 \return - 0 for success, non zero for failure
4564
4565 --------------------------------------------------------------------------*/
4566
4567static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4568{
Jeff Johnson295189b2012-06-20 16:38:30 -07004569 uPttMsgs *pMsgBody;
4570 VOS_STATUS status;
4571 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304572 long ret;
4573
Jeff Johnson295189b2012-06-20 16:38:30 -07004574 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4575
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304576 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004577 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304578 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4579 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004580 return VOS_STATUS_E_FAILURE;
4581 }
4582
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304583 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004584 init_completion(&pHddCtx->ftm.ftm_comp_var);
4585 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4586 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4587
4588 pMsgBody = &pMsgBuf->msgBody;
4589
4590 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4591
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304592 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004593 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304594 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4595 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004596 status = VOS_STATUS_E_FAILURE;
4597 goto done;
4598 }
c_hpothuffdb5272013-10-02 16:42:35 +05304599 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304600 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304601 if (0 >= ret )
4602 {
4603 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4604 FL("wait on ftm_comp_var failed %ld"), ret);
4605 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004606
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304607 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004608
4609 rate_index = pMsgBody->GetTxPowerReport.rate;
4610 }
4611 else {
4612 /*Return the default rate*/
4613 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304614 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4615 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004616 status = VOS_STATUS_E_FAILURE;
4617 goto done;
4618 }
4619
4620 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4621 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4622 break;
4623 }
4624 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4625 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004626 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004627 status = VOS_STATUS_E_FAILURE;
4628 goto done;
4629 }
4630 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4631done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004632
4633 return status;
4634
4635}
4636
4637/**---------------------------------------------------------------------------
4638
4639 \brief wlan_ftm_priv_get_rx_pkt_count() -
4640
4641 This function gets the rx pkt count from the halphy ptt module and
4642 returns the rx pkt count to the application.
4643
4644 \param - pAdapter - Pointer HDD Context.
4645 - pRxPktCnt - Poniter to get the rx pkt count.
4646
4647 \return - 0 for success, non zero for failure
4648
4649 --------------------------------------------------------------------------*/
4650
4651static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4652{
Jeff Johnson295189b2012-06-20 16:38:30 -07004653 uPttMsgs *pMsgBody;
4654 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304655 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004656 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4657
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304658 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004659 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304660 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4661 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004662 return VOS_STATUS_E_FAILURE;
4663 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304664 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004665 init_completion(&pHddCtx->ftm.ftm_comp_var);
4666 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4667 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4668
4669 pMsgBody = &pMsgBuf->msgBody;
4670
4671 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4672
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304673 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004674 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4676 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004677 status = VOS_STATUS_E_FAILURE;
4678 goto done;
4679 }
c_hpothuffdb5272013-10-02 16:42:35 +05304680 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304681 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304682 if (0 >= ret )
4683 {
4684 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4685 FL("wait on ftm_comp_var failed %ld"), ret);
4686 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004687
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304688 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004689 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304690 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4691 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004692 status = VOS_STATUS_E_FAILURE;
4693 goto done;
4694 }
4695 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4696done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004697
4698 return status;
4699}
4700
4701/**---------------------------------------------------------------------------
4702
4703 \brief wlan_ftm_priv_get_rx_rssi() -
4704
4705 This function gets the rx rssi from the halphy ptt module and
4706 returns the rx rssi to the application.
4707
4708 \param - pAdapter - Pointer HDD Context.
4709 - buf - Poniter to get rssi of Rx chains
4710
4711 \return - 0 for success, non zero for failure
4712
4713 --------------------------------------------------------------------------*/
4714
4715static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4716{
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 uPttMsgs *pMsgBody;
4718 VOS_STATUS status;
4719 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304720 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004721
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304722 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004723 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304724 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4725 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004726 return VOS_STATUS_E_FAILURE;
4727 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304728 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004729 init_completion(&pHddCtx->ftm.ftm_comp_var);
4730 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4731 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4732
4733 pMsgBody = &pMsgBuf->msgBody;
4734
4735 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4736
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304737 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004738 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304739 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4740 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004741 status = VOS_STATUS_E_FAILURE;
4742 goto done;
4743 }
c_hpothuffdb5272013-10-02 16:42:35 +05304744 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304745 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304746 if (0 >= ret )
4747 {
4748 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4749 FL("wait on ftm_comp_var failed %ld"), ret);
4750 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004751
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304752 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004753 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304754 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4755 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004756 status = VOS_STATUS_E_FAILURE;
4757 goto done;
4758 }
4759
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004760 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4761 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004762 pMsgBody->GetRxRssi.rssi.rx[1]);
4763
4764 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4765 {
4766 status = VOS_STATUS_E_FAILURE;
4767 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004768
Jeff Johnson295189b2012-06-20 16:38:30 -07004769done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004770
4771 return status;
4772}
4773
4774/**---------------------------------------------------------------------------
4775
4776 \brief wlan_ftm_priv_get_mac_address() -
4777
4778 This function gets the mac address from the halphy ptt module and
4779 returns the mac address to the application.
4780
4781 \param - pAdapter - Pointer HDD Context.
4782 - buf - Poniter to get the mac address.
4783
4784 \return - 0 for success, non zero for failure
4785
4786 --------------------------------------------------------------------------*/
4787
4788static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4789{
4790 v_BOOL_t itemIsValid = VOS_FALSE;
4791 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4792 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004793
Jeff Johnson295189b2012-06-20 16:38:30 -07004794 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4795
4796 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4797 {
4798 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4799 return VOS_STATUS_E_FAILURE;
4800 }
4801 /*Check the NV FIELD is valid or not*/
4802 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4803 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004804 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004805 {
4806 vos_nv_readMacAddress(macAddr);
4807
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004808 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4809 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004810 MAC_ADDR_ARRAY(macAddr));
4811 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4812 {
4813 return VOS_STATUS_E_FAILURE;
4814 }
4815 }
4816 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004817 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004818 {
4819 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004820 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4821 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004822 MAC_ADDR_ARRAY(macAddr));
4823
4824 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4825 {
4826 return VOS_STATUS_E_FAILURE;
4827 }
4828 }
4829 return VOS_STATUS_SUCCESS;
4830}
4831
4832/**---------------------------------------------------------------------------
4833
4834 \brief wlan_ftm_priv_set_mac_address() -
4835
4836 This function sets the mac address to the halphy ptt module and
4837 sends the netlink message to the ptt socket application which writes
4838 the macaddress to the qcom_wlan_nv.bin file
4839
4840 \param - pAdapter - Pointer HDD Context.
4841 - buf - Poniter to the macaddress.
4842
4843 \return - 0 for success, non zero for failure
4844
4845 --------------------------------------------------------------------------*/
4846
4847static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4848{
Jeff Johnson295189b2012-06-20 16:38:30 -07004849 uPttMsgs *pMsgBody;
4850 VOS_STATUS status;
4851 int macAddr[VOS_MAC_ADDRESS_LEN];
4852 v_U8_t *pMacAddress;
4853 v_U8_t ii;
4854 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304855 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004856
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304857 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004858 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304859 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4860 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004861 return VOS_STATUS_E_FAILURE;
4862 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304863 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004864 init_completion(&pHddCtx->ftm.ftm_comp_var);
4865 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4866 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4867
4868 pMsgBody = &pMsgBuf->msgBody;
4869 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4870
4871 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004872 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]))
4873 {
4874 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4875 "Invalid MacAddress Input %s", buf);
4876 return VOS_STATUS_E_FAILURE;
4877 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004878
Arif Hussain24bafea2013-11-15 15:10:03 -08004879 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4880 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004881
4882
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004883 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004884
4885 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4886 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4887
4888
Arif Hussain24bafea2013-11-15 15:10:03 -08004889 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4890 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004891 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4892
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304893 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004894 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304895 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4896 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004897 status = VOS_STATUS_E_FAILURE;
4898 goto done;
4899 }
c_hpothuffdb5272013-10-02 16:42:35 +05304900 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304901 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304902 if (0 >= ret )
4903 {
4904 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4905 FL("wait on ftm_comp_var failed %ld"), ret);
4906 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004907
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304908 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004909 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304910 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4911 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004912 status = VOS_STATUS_E_FAILURE;
4913 goto done;
4914 }
4915
Arif Hussain6d2a3322013-11-17 19:50:10 -08004916 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004917
4918 init_completion(&pHddCtx->ftm.ftm_comp_var);
4919 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4920
4921 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4922 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4923
4924 pMsgBody = &pMsgBuf->msgBody;
4925
4926 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4927
4928 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4929
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304930 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004931 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304932 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4933 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004934 status = VOS_STATUS_E_FAILURE;
4935 goto done;
4936 }
4937
c_hpothuffdb5272013-10-02 16:42:35 +05304938 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304939 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304940 if (0 >= ret )
4941 {
4942 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4943 FL("wait on ftm_comp_var failed %ld"), ret);
4944 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004945done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004946
4947 return VOS_STATUS_SUCCESS;
4948}
4949
4950/* set param sub-ioctls */
4951static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4952 union iwreq_data *wrqu, char *extra)
4953{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004954 int ret,sub_cmd;
4955 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004956 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004957 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004958 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004959
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004960 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004961 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004962 length = wrqu->data.length;
4963 sub_cmd = wrqu->data.flags;
4964 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4965
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004966 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4967 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4968 * odd number which assigns set_args to zero.we assisgn memory using
4969 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004970 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004971 param = kzalloc(length + 1, GFP_KERNEL);
4972 if (!param)
4973 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004974
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004975 if (copy_from_user(param, pointer, length))
4976 {
4977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4978 "%s:Failed to get user data %s", __func__, param);
4979
4980 ret = -EINVAL;
4981 goto OUT;
4982 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004983
4984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4985 "%s: Received length %d", __func__, length);
4986
4987 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004988 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004989
4990 switch(sub_cmd)
4991 {
4992 case WE_SET_MAC_ADDRESS:
4993 {
4994
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004995 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004996 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004997
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004998 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004999
5000 if(status != VOS_STATUS_SUCCESS)
5001 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005002 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005003 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005004
Jeff Johnson295189b2012-06-20 16:38:30 -07005005 ret = -EINVAL;
5006 }
5007
Wilson Yang7c471652013-12-20 16:36:44 -08005008 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005009 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005010 case WE_SET_TX_RATE:
5011 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005012 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005013
5014 if(status != VOS_STATUS_SUCCESS)
5015 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005016 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005017 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005018
5019 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005020 }
5021
5022 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005023 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005024 default:
5025 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005026 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005027 ret = -EINVAL;
5028 break;
5029 }
5030 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005031
5032OUT:
5033 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005034 return ret;
5035}
5036
5037static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5038 union iwreq_data *wrqu, char *extra)
5039{
5040 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5041 int *value = (int *)extra;
5042 int sub_cmd = value[0];
5043 int set_value = value[1];
5044 int ret = 0; /* success */
5045 VOS_STATUS status;
5046
5047 switch(sub_cmd)
5048 {
5049 case WE_FTM_ON_OFF:
5050 {
5051 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5052
5053 if(status != VOS_STATUS_SUCCESS)
5054 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005055 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005056 ret = -EINVAL;
5057 }
5058
5059 break;
5060 }
5061
5062 case WE_TX_PKT_GEN:
5063 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5064
5065 if(status != VOS_STATUS_SUCCESS)
5066 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005067 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005068 ret = -EINVAL;
5069 }
5070 break;
5071
5072 case WE_SET_TX_IFS:
5073 status = wlan_ftm_priv_set_txifs(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_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005078 ret = -EINVAL;
5079 }
5080 break;
5081
5082 case WE_SET_TX_PKT_CNT:
5083 status = wlan_ftm_priv_set_txpktcnt(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_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005088 ret = -EINVAL;
5089 }
5090 break;
5091
5092 case WE_SET_TX_PKT_LEN:
5093 status = wlan_ftm_priv_set_txpktlen(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_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005098 ret = -EINVAL;
5099 }
5100 break;
5101
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305102 case WE_TX_CW_RF_GEN:
5103 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5104
5105 if(status != VOS_STATUS_SUCCESS)
5106 {
5107 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5108 ret = -EINVAL;
5109 }
5110 break;
5111
Jeff Johnson295189b2012-06-20 16:38:30 -07005112 case WE_SET_CHANNEL:
5113 {
5114 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5115
5116 if(status != VOS_STATUS_SUCCESS)
5117 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005118 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005119 ret = -EINVAL;
5120 }
5121 break;
5122 }
5123 case WE_SET_TX_POWER:
5124 {
5125 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5126
5127 if(status != VOS_STATUS_SUCCESS)
5128 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005129 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005130 ret = -EINVAL;
5131 }
5132 break;
5133 }
5134 case WE_CLEAR_RX_PKT_CNT:
5135 {
5136 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5137
5138 if(status != VOS_STATUS_SUCCESS)
5139 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005140 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005141 ret = -EINVAL;
5142 }
5143 break;
5144 }
5145 case WE_RX:
5146 {
5147 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5148
5149 if(status != VOS_STATUS_SUCCESS)
5150 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005151 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005152 ret = -EINVAL;
5153 }
5154 break;
5155 }
5156 case WE_ENABLE_CHAIN:
5157 {
5158 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5159
5160 if(status != VOS_STATUS_SUCCESS)
5161 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005162 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005163 ret = -EINVAL;
5164 }
5165 break;
5166 }
5167
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305168 case WE_SET_PWR_CNTL_MODE:
5169 {
5170 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5171 if (status != VOS_STATUS_SUCCESS)
5172 {
5173 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5174 status);
5175 ret = -EINVAL;
5176 }
5177 break;
5178 }
5179
5180 case WE_ENABLE_DPD:
5181 {
5182 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5183 if (status != VOS_STATUS_SUCCESS)
5184 {
5185 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5186 ret = -EINVAL;
5187 }
5188 break;
5189 }
5190
5191 case WE_SET_CB:
5192 {
5193 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5194 if (status != VOS_STATUS_SUCCESS)
5195 {
5196 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5197 ret = -EINVAL;
5198 }
5199 break;
5200 }
5201
Jeff Johnson295189b2012-06-20 16:38:30 -07005202 default:
5203 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005204 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005205 sub_cmd, set_value);
5206 break;
5207 }
5208 }
5209
5210 return ret;
5211}
5212
5213/* get param sub-ioctls */
5214static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5215 union iwreq_data *wrqu, char *extra)
5216{
5217 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5218 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005219 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005220 VOS_STATUS status;
5221
5222 switch (value[0])
5223 {
5224 case WE_GET_CHANNEL:
5225 {
5226 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5227
5228 if(status != VOS_STATUS_SUCCESS)
5229 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005230 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005231 ret = -EINVAL;
5232 }
5233 break;
5234 }
5235 case WE_GET_TX_POWER:
5236 {
5237 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5238
5239 if(status != VOS_STATUS_SUCCESS)
5240 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005241 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005242 ret = -EINVAL;
5243 }
5244 break;
5245 }
5246 case WE_GET_RX_PKT_CNT:
5247 {
5248 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5249
5250 if(status != VOS_STATUS_SUCCESS)
5251 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005252 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005253 ret = -EINVAL;
5254 }
5255 break;
5256 }
5257 default:
5258 {
5259 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5260 break;
5261 }
5262 }
5263
5264 return ret;
5265}
5266
5267static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5268 union iwreq_data *wrqu, char *extra)
5269{
5270 int sub_cmd = wrqu->data.flags;
5271 VOS_STATUS status;
5272 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5273
5274 switch(sub_cmd)
5275 {
5276 case WE_GET_MAC_ADDRESS:
5277 {
5278 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5279
5280 if(status != VOS_STATUS_SUCCESS)
5281 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005282 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005283 return -EINVAL;
5284 }
5285 wrqu->data.length = strlen(extra)+1;
5286 break;
5287 }
5288 case WE_GET_TX_RATE:
5289 {
5290 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5291
5292 if(status != VOS_STATUS_SUCCESS)
5293 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005294 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005295 return -EINVAL;
5296 }
5297
5298 wrqu->data.length = strlen(extra)+1;
5299 break;
5300 }
5301 case WE_GET_FTM_VERSION:
5302 {
5303 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5304
5305 if(status != VOS_STATUS_SUCCESS)
5306 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005307 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005308 return -EINVAL;
5309 }
5310 wrqu->data.length = strlen(extra)+1;
5311 break;
5312 }
5313 case WE_GET_FTM_STATUS:
5314 {
5315 status = wlan_ftm_priv_get_status(pAdapter, extra);
5316
5317 if(status != VOS_STATUS_SUCCESS)
5318 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005319 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005320 return -EINVAL;
5321 }
5322
5323 wrqu->data.length = strlen(extra)+1;
5324 break;
5325 }
5326 case WE_GET_RX_RSSI:
5327 {
5328 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5329
5330 if(status != VOS_STATUS_SUCCESS)
5331 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005332 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005333 return -EINVAL;
5334 }
5335
5336 wrqu->data.length = strlen(extra)+1;
5337 break;
5338 }
5339 default:
5340 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005341 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005342 break;
5343 }
5344 }
5345
5346 return 0;
5347}
Jeff Johnson295189b2012-06-20 16:38:30 -07005348
5349VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5350{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005351#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005352 tAniHdr *wmsg = NULL;
5353 v_U8_t *pBuf;
5354 hdd_context_t *pHddCtx = NULL;
5355 v_CONTEXT_t pVosContext= NULL;
5356
5357 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5358 if(pBuf == NULL)
5359 {
5360 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5361 return VOS_STATUS_E_NOMEM;
5362 }
5363 wmsg = (tAniHdr*)pBuf;
5364 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5365 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5366 wmsg->length = FTM_SWAP16(wmsg->length);
5367 pBuf += sizeof(tAniHdr);
5368
5369 /*Get the global context */
5370 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5371
5372 /*Get the Hdd Context */
5373 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5374 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5375
5376 /* EfS command Code */
5377 *(v_U32_t*)pBuf = 0x000000EF;
5378
5379 pBuf += sizeof(v_U32_t);
5380
5381 memcpy(pBuf, pData,data_len);
5382
5383 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305384 if( ptt_sock_send_msg_to_app(wmsg, 0,
5385 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005386
Arif Hussain6d2a3322013-11-17 19:50:10 -08005387 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 -07005388 vos_mem_free((v_VOID_t*)wmsg);
5389 return VOS_STATUS_E_FAILURE;
5390 }
5391 }
5392 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305393 if( ptt_sock_send_msg_to_app(wmsg, 0,
5394 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005395
Arif Hussain6d2a3322013-11-17 19:50:10 -08005396 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 -07005397 vos_mem_free((v_VOID_t*)wmsg);
5398 return VOS_STATUS_E_FAILURE;
5399 }
5400 }
5401
5402 vos_mem_free((v_VOID_t*)wmsg);
5403#endif //FTM and ANDROID
5404
5405 return VOS_STATUS_SUCCESS;
5406}
5407
Jeff Johnson295189b2012-06-20 16:38:30 -07005408/* action sub-ioctls */
5409static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5410 union iwreq_data *wrqu, char *extra)
5411{
5412 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005413 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005414
5415 switch (sub_cmd)
5416 {
5417 case WE_SET_NV_DEFAULTS:
5418 {
5419 v_U8_t *pu8buf,*pTempBuf;
5420 v_U16_t size;
5421 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005422 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005423 pu8buf = vos_mem_malloc(size);
5424 if(pu8buf == NULL)
5425 {
5426 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5427 return VOS_STATUS_E_NOMEM;
5428 }
5429 memset(pu8buf,0,size);
5430 pTempBuf = pu8buf;
5431 pTempBuf += sizeof(v_U32_t);
5432 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5433
5434 wlan_write_to_efs(pu8buf,size);
5435 vos_mem_free(pu8buf);
5436 }
5437
5438 default:
5439 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005440 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005441 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5442 break;
5443 }
5444 }
5445
5446 return ret;
5447}
5448
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305449static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5450 union iwreq_data *wrqu, char *extra)
5451{
5452 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5453 int sub_cmd = wrqu->data.flags;
5454 int *value = (int*)wrqu->data.pointer;
5455
5456 if(wrqu->data.length != 2)
5457 {
5458 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5459 return -EINVAL;
5460 }
5461 switch (sub_cmd)
5462 {
5463 case WE_SET_TX_WF_GAIN:
5464 {
5465 v_S15_t dGain = 0;
5466 v_U16_t rfGain = 0;
5467 VOS_STATUS status;
5468
5469 dGain = *(v_S15_t*) value++;
5470 rfGain = *(v_U16_t*) value;
5471 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5472
5473 if(status != VOS_STATUS_SUCCESS)
5474 {
5475 hddLog(VOS_TRACE_LEVEL_FATAL,
5476 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5477 return -EINVAL;
5478 }
5479 }
5480 break;
5481
5482 default:
5483 {
5484 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5485 break;
5486 }
5487 }
5488
5489 return 0;
5490}
5491
5492
Jeff Johnson295189b2012-06-20 16:38:30 -07005493static const iw_handler we_ftm_private[] = {
5494
5495 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5496 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5497 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5498 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5499 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305500 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005501};
5502
5503/*Maximum command length can be only 15 */
5504static const struct iw_priv_args we_ftm_private_args[] = {
5505
5506 /* handlers for main ioctl */
5507 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5508 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5509 0,
5510 "" },
5511
5512 { WE_FTM_ON_OFF,
5513 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5514 0,
5515 "ftm" },
5516
5517 { WE_TX_PKT_GEN,
5518 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5519 0,
5520 "tx" },
5521
5522 { WE_SET_TX_IFS,
5523 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5524 0,
5525 "set_txifs" },
5526
5527 { WE_SET_TX_PKT_CNT,
5528 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5529 0,
5530 "set_txpktcnt" },
5531
5532 { WE_SET_TX_PKT_LEN,
5533 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5534 0,
5535 "set_txpktlen" },
5536
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305537 { WE_SET_TX_WF_GAIN,
5538 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5539 0,
5540 "set_tx_wf_gain" },
5541
5542 { WE_TX_CW_RF_GEN,
5543 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5544 0,
5545 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005546 { WE_SET_CHANNEL,
5547 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5548 0,
5549 "set_channel" },
5550
5551 { WE_SET_TX_POWER,
5552 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5553 0,
5554 "set_txpower" },
5555
5556 { WE_CLEAR_RX_PKT_CNT,
5557 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5558 0,
5559 "clr_rxpktcnt" },
5560
5561 { WE_RX,
5562 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5563 0,
5564 "rx" },
5565
5566 { WE_ENABLE_CHAIN,
5567 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5568 0,
5569 "ena_chain" },
5570
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305571 { WE_SET_PWR_CNTL_MODE,
5572 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5573 0,
5574 "pwr_cntl_mode" },
5575
5576 { WE_ENABLE_DPD,
5577 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5578 0,
5579 "ena_dpd" },
5580
5581 { WE_SET_CB,
5582 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5583 0,
5584 "set_cb" },
5585
Jeff Johnson295189b2012-06-20 16:38:30 -07005586 /* handlers for main ioctl */
5587 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5588 0,
5589 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5590 "" },
5591
5592 { WE_GET_CHANNEL,
5593 0,
5594 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5595 "get_channel" },
5596
5597 { WE_GET_TX_POWER,
5598 0,
5599 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5600 "get_txpower" },
5601
5602 { WE_GET_RX_PKT_CNT,
5603 0,
5604 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5605 "get_rxpktcnt" },
5606
5607 /* handlers for main ioctl */
5608 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5609 IW_PRIV_TYPE_CHAR| 512,
5610 0,
5611 "" },
5612
5613 { WE_SET_MAC_ADDRESS,
5614 IW_PRIV_TYPE_CHAR| 512,
5615 0,
5616 "set_mac_address" },
5617
5618 { WE_SET_TX_RATE,
5619 IW_PRIV_TYPE_CHAR | 512,
5620 0,
5621 "set_txrate" },
5622
5623 /* handlers for main ioctl */
5624 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5625 0,
5626 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5627 "" },
5628
5629 { WE_GET_MAC_ADDRESS,
5630 0,
5631 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5632 "get_mac_address" },
5633
5634 { WE_GET_FTM_VERSION,
5635 0,
5636 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5637 "ftm_version" },
5638
5639 { WE_GET_TX_RATE,
5640 0,
5641 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5642 "get_txrate" },
5643
5644 { WE_GET_FTM_STATUS,
5645 0,
5646 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5647 "get_status" },
5648
5649 { WE_GET_RX_RSSI,
5650 0,
5651 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5652 "get_rx_rssi" },
5653
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305654 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5655 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5656 0,
5657 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005658 /* handlers for main ioctl */
5659 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5660 0,
5661 0,
5662 "" },
5663
5664 /* handlers for sub-ioctl */
5665 { WE_SET_NV_DEFAULTS,
5666 0,
5667 0,
5668 "set_nv_defaults" },
5669
5670};
5671
5672const struct iw_handler_def we_ftm_handler_def = {
5673 .num_standard = 0,
5674 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5675 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5676
5677 .standard = (iw_handler *)NULL,
5678 .private = (iw_handler *)we_ftm_private,
5679 .private_args = we_ftm_private_args,
5680 .get_wireless_stats = NULL,
5681};
5682
5683static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5684{
5685
5686 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5687
5688 // Zero the memory. This zeros the profile structure.
5689 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005690
Jeff Johnson295189b2012-06-20 16:38:30 -07005691 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5692
5693 return 0;
5694}
5695
Jeff Johnson295189b2012-06-20 16:38:30 -07005696
5697VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5698{
Jeff Johnson295189b2012-06-20 16:38:30 -07005699 ftm_rsp_msg_t *pFtmMsgRsp;
5700
5701 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5702 hdd_context_t *pHddCtx;
5703 v_CONTEXT_t pVosContext= NULL;
5704
5705 ENTER();
5706
5707 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5708
5709 if (!message )
5710 {
5711 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5712 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5713 return VOS_STATUS_E_INVAL;
5714 }
5715 /*Get the global context */
5716 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5717
5718 /*Get the Hdd Context */
5719 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5720
5721 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5722
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305723 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005724 complete(&pHddCtx->ftm.ftm_comp_var);
5725 }
5726 else {
5727 /*Response length to Ptt App*/
5728 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5729
5730 /*Ptt App expects the response length in LE */
5731 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5732
5733 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005734 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005735 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5736
5737 /*Copy the message*/
5738 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5739
5740 /*Update the error code*/
5741 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5742
5743 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5744
5745 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5746 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005747 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005748 return VOS_STATUS_E_FAILURE;
5749 }
5750 }
5751 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005752 return VOS_STATUS_SUCCESS;
5753
5754}