blob: b10fe14570c53b1d09505cd612e66aa5dab7cad1 [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
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05301191 if (NULL == pMsgBuf)
1192 {
1193 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1194 "%s:pMsgBuf is NULL", __func__);
1195 return VOS_STATUS_E_NOMEM;
1196 }
1197
Jeff Johnson295189b2012-06-20 16:38:30 -07001198 if (chainSelect > FTM_CHAIN_SEL_MAX)
1199 {
c_hpothuffdb5272013-10-02 16:42:35 +05301200 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1201 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001202 return VOS_STATUS_E_FAILURE;
1203 }
1204
1205 /* do not allow to change setting when tx pktgen is enabled */
1206 if (ftm_status.frameGenEnabled)
1207 {
1208 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1209 return VOS_STATUS_E_FAILURE;
1210 }
1211
1212 switch (chainSelect)
1213 {
1214 case FTM_CHAIN_SEL_NO_RX_TX:
1215 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1216 break;
1217
1218 case FTM_CHAIN_SEL_R0_ON:
1219 chainSelect = PHY_CHAIN_SEL_R0_ON;
1220 break;
1221
1222 case FTM_CHAIN_SEL_T0_ON:
1223 chainSelect = PHY_CHAIN_SEL_T0_ON;
1224 break;
1225 }
1226
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301227 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001228 init_completion(&pHddCtx->ftm.ftm_comp_var);
1229 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1230 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1231
1232 pMsgBody = &pMsgBuf->msgBody;
1233 pMsgBody->EnableChains.chainSelect = chainSelect;
1234
1235 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1236
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301237 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001238 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301239 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1240 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001241 status = VOS_STATUS_E_FAILURE;
1242 goto done;
1243 }
c_hpothuffdb5272013-10-02 16:42:35 +05301244 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301245 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301246 if (0 >= ret)
1247 {
1248 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1249 FL("wait on ftm_comp_var failed %ld"), ret);
1250 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001251
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301252 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001253 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301254 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1255 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001256 status = VOS_STATUS_E_FAILURE;
1257 goto done;
1258 }
1259 ftm_status.chainSelect = chainSelect_save;
1260done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001261
1262 return status;
1263}
1264
1265/**---------------------------------------------------------------------------
1266 --------------------------------------------------------------------------*/
1267static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1268{
1269 int ii;
1270 int lenBuf = WE_FTM_MAX_STR_LEN;
1271 int lenRes = 0;
1272 char *chain[] = {
1273 "None",
1274 "R0,R1",
1275 "R0",
1276 "R1",
1277 "T0",
1278 "R0,R1,T0"
1279 };
1280 char *rx[] = {
1281 "disable",
1282 "11b/g/n",
1283 "11g/n",
1284 "11b"
1285 };
1286 char *tx[] = {
1287 "stopped",
1288 "started",
1289 };
1290 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1291
1292 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1293 {
1294 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1295 return VOS_STATUS_E_FAILURE;
1296 }
1297
1298 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001299 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001300 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1301 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001302 ftm_status.frameParams.interFrameSpace);
1303 if ((lenRes < 0) || (lenRes >= lenBuf))
1304 {
c_hpothuffdb5272013-10-02 16:42:35 +05301305 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1306 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001307 return VOS_STATUS_E_FAILURE;
1308 }
1309
1310 buf += lenRes;
1311 lenBuf -= lenRes;
1312
1313 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1314 {
1315 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1316 break;
1317 }
1318
1319 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1320 {
1321 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1322 }
1323 else
1324 {
1325 lenRes = strlcpy(buf, "invalid", lenBuf);
1326 }
1327 if ((lenRes < 0) || (lenRes >= lenBuf))
1328 {
c_hpothuffdb5272013-10-02 16:42:35 +05301329 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1330 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001331 return VOS_STATUS_E_FAILURE;
1332 }
1333
1334 buf += lenRes;
1335 lenBuf -= lenRes;
1336
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301337 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1338 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001339 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001340 ftm_status.frameParams.payloadLength);
1341
1342 if ((lenRes < 0) || (lenRes >= lenBuf))
1343 {
c_hpothuffdb5272013-10-02 16:42:35 +05301344 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1345 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001346 return VOS_STATUS_E_FAILURE;
1347 }
1348
1349 return VOS_STATUS_SUCCESS;
1350}
1351
Jeff Johnson295189b2012-06-20 16:38:30 -07001352
1353void HEXDUMP(char *s0, char *s1, int len)
1354{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301355 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001356 printk(KERN_EMERG "%s\n :", s0);
1357
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301358 if (len > 8)
1359 {
1360 for (j = 0; j < len/8; j++)
1361 {
1362 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1363 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1364 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1365 }
1366 len = len - j*8;
1367 }
1368 for (i = 0; i< len; i++) {
1369 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001370 }
1371 printk("\n");
1372}
1373
Jeff Johnson295189b2012-06-20 16:38:30 -07001374/*---------------------------------------------------------------------------
1375
1376 \brief vos_ftm_preStart() -
1377
1378 The \a vos_ftm_preStart() function to download CFG.
1379 including:
1380 - ccmStart
1381
1382 - WDA: triggers the CFG download
1383
1384
1385 \param pVosContext: The VOS context
1386
1387
1388 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1389 is ready to be used.
1390
1391 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1392 are unavailable to initialize the scheduler
1393
1394
1395 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1396
1397 \sa vos_start
1398
1399---------------------------------------------------------------------------*/
1400VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1401{
1402 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1403 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001404
Jeff Johnson295189b2012-06-20 16:38:30 -07001405 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1406 "vos prestart");
1407
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001408 if (NULL == pVosContext->pWDAContext)
1409 {
1410 VOS_ASSERT(0);
1411 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1412 "%s: WDA NULL context", __func__);
1413 return VOS_STATUS_E_FAILURE;
1414 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001415
1416 /* call macPreStart */
1417 vStatus = macPreStart(pVosContext->pMACContext);
1418 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1419 {
1420 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1421 "Failed at macPreStart ");
1422 return VOS_STATUS_E_FAILURE;
1423 }
1424
1425 /* call ccmStart */
1426 ccmStart(pVosContext->pMACContext);
1427
1428 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001429 vos_event_reset(&pVosContext->wdaCompleteEvent);
1430
Jeff Johnson295189b2012-06-20 16:38:30 -07001431
1432 /*call WDA pre start*/
1433 vStatus = WDA_preStart(pVosContext);
1434 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1435 {
1436 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1437 "Failed to WDA prestart ");
1438 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1439 ccmStop(pVosContext->pMACContext);
1440 VOS_ASSERT(0);
1441 return VOS_STATUS_E_FAILURE;
1442 }
1443
1444 /* Need to update time out of complete */
1445 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1446 if ( vStatus != VOS_STATUS_SUCCESS )
1447 {
1448 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1449 {
1450 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001451 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001452 }
1453 else
1454 {
1455 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001456 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001457 }
1458 VOS_ASSERT( 0 );
1459 return VOS_STATUS_E_FAILURE;
1460 }
1461
1462 return VOS_STATUS_SUCCESS;
1463}
Jeff Johnson295189b2012-06-20 16:38:30 -07001464
1465/**---------------------------------------------------------------------------
1466
1467 \brief wlan_hdd_ftm_open() -
1468
1469 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1470
1471 \param - pAdapter - Pointer HDD Context.
1472
1473 \return - 0 for success, non zero for failure
1474
1475 --------------------------------------------------------------------------*/
1476
1477int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1478{
1479 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1480 pVosContextType pVosContext= NULL;
1481 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001482
Jeff Johnson295189b2012-06-20 16:38:30 -07001483 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1484 "%s: Opening VOSS", __func__);
1485
1486 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1487
1488 if (NULL == pVosContext)
1489 {
1490 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301491 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001492 VOS_ASSERT(0);
1493 goto err_vos_status_failure;
1494 }
1495
1496 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301497 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001498
1499 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1500 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301501 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001502 goto err_vos_status_failure;
1503 }
1504
Jeff Johnson295189b2012-06-20 16:38:30 -07001505 /*
1506 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1507 */
1508 /* Save the hal context in Adapter */
1509 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001510
1511 if ( NULL == pHddCtx->hHal )
1512 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301513 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301514 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001515 }
1516
1517 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1518 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1519 if( NULL == pAdapter )
1520 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301521 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301522 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001523 }
1524
1525 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1526 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301527 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301528 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001529 }
1530
1531 //Initialize the nlink service
1532 if(nl_srv_init() != 0)
1533 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301534 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001535 goto err_ftm_register_wext_close;
1536 }
1537
Leo Chang9e646082013-08-02 11:20:21 -07001538#ifdef WLAN_KD_READY_NOTIFIER
1539 pHddCtx->kd_nl_init = 1;
1540#endif /* WLAN_KD_READY_NOTIFIER */
1541
Jeff Johnson295189b2012-06-20 16:38:30 -07001542#ifdef PTT_SOCK_SVC_ENABLE
1543 //Initialize the PTT service
1544 if(ptt_sock_activate_svc(pHddCtx) != 0)
1545 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301546 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001547 goto err_nl_srv_init;
1548 }
1549#endif
1550 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1551 {
1552 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1553 goto err_nl_srv_init;
1554 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001555
Jeff Johnson295189b2012-06-20 16:38:30 -07001556 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1557 pHddCtx->ftm.targetNVTableSize = 0;
1558 pHddCtx->ftm.targetNVTablePointer = NULL;
1559 pHddCtx->ftm.processedNVTableSize = 0;
1560 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1561 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1562 {
1563 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301564 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001565 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001566 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001567 }
1568 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001569
1570 _ftm_status_init();
1571 /* Initialize the ftm vos event */
1572 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1573 {
1574 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301575 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001576 VOS_ASSERT(0);
1577 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1578 goto err_nl_srv_init;
1579 }
1580
1581 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1582
1583 return VOS_STATUS_SUCCESS;
1584
1585err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001586#ifdef WLAN_KD_READY_NOTIFIER
1587nl_srv_exit(pHddCtx->ptt_pid);
1588#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001589nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001590#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001591err_ftm_register_wext_close:
1592hdd_UnregisterWext(pAdapter->dev);
1593
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301594err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001595err_adapter_open_failure:
1596hdd_close_all_adapters( pHddCtx );
1597
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301598err_ftm_vos_close:
1599 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001600err_vos_status_failure:
1601
1602 return VOS_STATUS_E_FAILURE;
1603}
1604
1605
1606
1607int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1608{
1609 VOS_STATUS vosStatus;
1610 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1611
1612 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1613 ENTER();
1614 if(pAdapter == NULL)
1615 {
1616 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1617 return VOS_STATUS_E_NOMEM;
1618 }
1619
Atul Mittalc41126d2014-03-17 15:10:11 +05301620 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1621 if (pHddCtx->ftm.IsCmdPending == TRUE)
1622 {
1623 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1624 {
1625 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1626 "%s: vos_event_set failed", __func__);
1627 }
1628 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001629 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1630 {
1631 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1632 "%s: Ftm has been started. stopping ftm", __func__);
1633 wlan_ftm_stop(pHddCtx);
1634 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001635
1636 //Assert Deep sleep signal now to put Libra HW in lowest power state
1637 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301638 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1639 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1640 "%s: Failed to assert deep sleep signal", __func__);
1641 VOS_ASSERT( 0 );
1642 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001643
1644 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301645 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1646 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1647 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1648 "%s: Failed to put HW into low power", __func__);
1649 VOS_ASSERT( 0 );
1650 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001651
1652 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1653
Leo Chang59cdc7e2013-07-10 10:08:21 -07001654#ifdef WLAN_KD_READY_NOTIFIER
1655 nl_srv_exit(pHddCtx->ptt_pid);
1656#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001657 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001658#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001659 //TODO----------
1660 //Deregister the device with the kernel
1661 hdd_UnregisterWext(pAdapter->dev);
1662
1663 hdd_close_all_adapters( pHddCtx );
1664#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001665 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001666 {
1667 unregister_netdev(pAdapter->dev);
1668 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1669 }
1670#endif
1671 //-----------------
1672
1673 vosStatus = vos_sched_close( vosContext );
1674 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1675 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1676 "%s: Failed to close VOSS Scheduler",__func__);
1677 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1678 }
1679
1680 //Close VOSS
1681 wlan_ftm_vos_close(vosContext);
1682
1683
1684 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1685 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1686 {
1687 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1688 "%s: Failed to destroy ftm_vos Event",__func__);
1689 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1690 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001691 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001692
Jeff Johnson295189b2012-06-20 16:38:30 -07001693 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001694}
1695
1696/**---------------------------------------------------------------------------
1697
1698 \brief wlan_ftm_send_response() -
1699
1700 The function sends the response to the ptt socket application running in user space.
1701
1702 \param - pAdapter - Pointer HDD Context.
1703
1704 \return - 0 for success, non zero for failure
1705
1706 --------------------------------------------------------------------------*/
1707
1708static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1709
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301710 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1711 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001712
Arif Hussain6d2a3322013-11-17 19:50:10 -08001713 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 -07001714 return VOS_STATUS_E_FAILURE;
1715 }
1716 return VOS_STATUS_SUCCESS;
1717}
1718
1719/**---------------------------------------------------------------------------
1720
1721 \brief wlan_hdd_ftm_start() -
1722
1723 This function gets called when the FTM start commands received from the ptt socket application and
1724 it starts the following modules.
1725 1) SAL Start.
1726 2) BAL Start.
1727 3) MAC Start to download the firmware.
1728
1729
1730 \param - pAdapter - Pointer HDD Context.
1731
1732 \return - 0 for success, non zero for failure
1733
1734 --------------------------------------------------------------------------*/
1735
1736static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1737{
1738 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1739 tSirRetStatus sirStatus = eSIR_SUCCESS;
1740 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1741 tHalMacStartParameters halStartParams;
1742
1743 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1744 {
1745 return VOS_STATUS_SUCCESS;
1746 }
1747
1748 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1749 "%s: Starting Libra SW", __func__);
1750
1751 /* We support only one instance for now ...*/
1752 if (pVosContext == NULL)
1753 {
1754 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001755 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001756 goto err_status_failure;
1757 }
1758
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001759
Jeff Johnson295189b2012-06-20 16:38:30 -07001760 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001761 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001762 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001763 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001764 goto err_status_failure;
1765 }
1766
Jeff Johnson295189b2012-06-20 16:38:30 -07001767 /*
1768 Prima needs to start the WDA correctly instead of BAL and SAL
1769 */
1770
1771 /* Vos preStart is calling */
1772 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1773 {
1774 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1775 goto err_status_failure;
1776 }
1777
1778
1779 vStatus = WDA_NVDownload_Start(pVosContext);
1780
1781 if ( vStatus != VOS_STATUS_SUCCESS )
1782 {
1783 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1784 "%s: Failed to start NV Download",__func__);
1785 return VOS_STATUS_E_FAILURE;
1786 }
1787
1788 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1789
1790 if ( vStatus != VOS_STATUS_SUCCESS )
1791 {
1792 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1793 {
1794 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001795 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001796 }
1797 else
1798 {
1799 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001800 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001801 }
1802 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301803 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001804 }
1805
1806 vStatus = WDA_start(pVosContext);
1807 if (vStatus != VOS_STATUS_SUCCESS)
1808 {
1809 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1810 "%s: Failed to start WDA",__func__);
1811 goto err_status_failure;
1812 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001813
Jeff Johnson295189b2012-06-20 16:38:30 -07001814
1815 /* Start the MAC */
1816 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1817
Jeff Johnson295189b2012-06-20 16:38:30 -07001818
1819 halStartParams.driverType = eDRIVER_TYPE_MFG;
1820
1821 /* Start the MAC */
1822 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1823
Jeff Johnson295189b2012-06-20 16:38:30 -07001824
1825 if (eSIR_SUCCESS != sirStatus)
1826 {
1827 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1828 "%s: Failed to start MAC", __func__);
1829
Jeff Johnson295189b2012-06-20 16:38:30 -07001830 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001831 }
1832
1833 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1834 "%s: MAC correctly started",__func__);
1835
Jeff Johnson295189b2012-06-20 16:38:30 -07001836
1837 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1838
1839 return VOS_STATUS_SUCCESS;
1840
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001841err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001842 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1843 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1844 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1845 if(vStatus != VOS_STATUS_SUCCESS)
1846 {
1847 if(vStatus == VOS_STATUS_E_TIMEOUT)
1848 {
1849 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001850 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001851
1852 }
1853 else
1854 {
1855 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001856 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001857 }
1858 VOS_ASSERT(0);
1859 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001860
1861err_status_failure:
1862
1863 return VOS_STATUS_E_FAILURE;
1864
1865}
1866
1867
1868static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1869{
1870 VOS_STATUS vosStatus;
1871
1872 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1873 {
1874 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1875 return VOS_STATUS_E_FAILURE;
1876 }
1877
1878 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1879 {
1880 /* STOP MAC only */
1881 v_VOID_t *hHal;
1882 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1883 if (NULL == hHal)
1884 {
1885 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1886 "%s: NULL hHal", __func__);
1887 }
1888 else
1889 {
1890 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1891 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1892 {
1893 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1894 "%s: Failed to stop SYS", __func__);
1895 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1896 }
1897 }
1898
Jeff Johnson295189b2012-06-20 16:38:30 -07001899
Jeff Johnson295189b2012-06-20 16:38:30 -07001900 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001901
1902 }
1903 return WLAN_FTM_SUCCESS;
1904}
1905
Jeff Johnson295189b2012-06-20 16:38:30 -07001906/**---------------------------------------------------------------------------
1907
1908 \brief wlan_hdd_ftm_get_nv_table() -
1909 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001910 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001911
1912 \param - ftmCmd - Pointer FTM Commad Buffer
1913
1914 \return - int
1915 -1, Process Host command fail, vail out
1916 1, Process Host command success
1917
1918 --------------------------------------------------------------------------*/
1919int wlan_hdd_ftm_get_nv_table
1920(
1921 hdd_context_t *pHddCtx,
1922 tPttMsgbuffer *ftmCmd
1923)
1924{
1925 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1926 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1927 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001928 sHalNvV2 *nvContents = NULL;
1929 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001930
Jeff Johnson295189b2012-06-20 16:38:30 -07001931 if (NULL == pHddCtx)
1932 {
1933 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1934 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001935 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001936 }
1937
Leo Chang80de3c22013-11-26 10:52:12 -08001938 nvVersion = vos_nv_getNvVersion();
1939 if (E_NV_V2 != nvVersion)
1940 {
1941 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1942 "%s : Not valid NV Version %d", __func__, nvVersion);
1943 return -EINVAL;
1944 }
1945
Jeff Johnson295189b2012-06-20 16:38:30 -07001946 /* Test first chunk of NV table */
1947 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1948 (0 == pHddCtx->ftm.processedNVTableSize))
1949 {
1950 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1951 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1952 {
c_hpothuffdb5272013-10-02 16:42:35 +05301953 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1954 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001955 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001956 }
1957
1958 switch (nvTable->nvTable)
1959 {
1960 case NV_TABLE_RATE_POWER_SETTINGS:
1961 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1962 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1963 break;
1964
1965 case NV_TABLE_REGULATORY_DOMAINS:
1966 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1967 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1968 break;
1969
1970 case NV_TABLE_DEFAULT_COUNTRY:
1971 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1972 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1973 break;
1974
1975 case NV_TABLE_TPC_POWER_TABLE:
1976 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1977 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1978 break;
1979
1980 case NV_TABLE_TPC_PDADC_OFFSETS:
1981 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1982 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1983 break;
1984
1985 case NV_TABLE_VIRTUAL_RATE:
1986 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1987 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1988 break;
1989
1990 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1991 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1992 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1993 break;
1994
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001995 case NV_TABLE_HW_CAL_VALUES:
1996 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1997 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1998 break;
1999
2000 case NV_TABLE_FW_CONFIG:
2001 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2002 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002003 break;
2004
2005 case NV_TABLE_ANTENNA_PATH_LOSS:
2006 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2007 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2008 break;
2009
2010 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2011 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2012 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2013 break;
2014
2015 default:
2016 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2017 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002018 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002019 break;
2020 }
2021
2022 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2023 {
2024 /* Invalid table size, discard and initialize data */
2025 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002026 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002027 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002028 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002029 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2030 pHddCtx->ftm.targetNVTableSize = 0;
2031 pHddCtx->ftm.processedNVTableSize = 0;
2032 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002033 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002034 }
2035
2036 /* Set Current Processing NV table type */
2037 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2038 /* Copy target NV table value into temp context buffer */
2039 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2040 pHddCtx->ftm.targetNVTablePointer,
2041 pHddCtx->ftm.targetNVTableSize);
2042
2043 }
2044
2045 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2046 {
2047 /* Invalid table type */
2048 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2049 "Invalid NV Table, now Processing %d, not %d",
2050 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2051 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2052 pHddCtx->ftm.targetNVTableSize = 0;
2053 pHddCtx->ftm.processedNVTableSize = 0;
2054 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002055
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002056 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002057 }
2058
2059 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002060 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002061 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2062 nvTable->chunkSize);
2063 /* Update processed pointer to prepare next chunk copy */
2064 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2065
2066 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2067 {
2068 /* Finished to process last chunk of data, initialize buffer */
2069 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2070 pHddCtx->ftm.targetNVTableSize = 0;
2071 pHddCtx->ftm.processedNVTableSize = 0;
2072 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2073 }
2074
2075 return 1;
2076}
2077
2078/**---------------------------------------------------------------------------
2079
2080 \brief wlan_hdd_ftm_set_nv_table() -
2081 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002082 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002083
2084 \param - ftmCmd - Pointer FTM Commad Buffer
2085
2086 \return - int
2087 -1, Process Host command fail, vail out
2088 1, Process Host command success
2089
2090 --------------------------------------------------------------------------*/
2091int wlan_hdd_ftm_set_nv_table
2092(
2093 hdd_context_t *pHddCtx,
2094 tPttMsgbuffer *ftmCmd
2095)
2096{
2097 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2098 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2099 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002100 sHalNvV2 *nvContents = NULL;
2101 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002102
2103 if (NULL == pHddCtx)
2104 {
2105 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2106 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002107 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 }
2109
Leo Chang80de3c22013-11-26 10:52:12 -08002110 nvVersion = vos_nv_getNvVersion();
2111 if (E_NV_V2 != nvVersion)
2112 {
2113 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2114 "%s : Not valid NV Version %d", __func__, nvVersion);
2115 return -EINVAL;
2116 }
2117
Jeff Johnson295189b2012-06-20 16:38:30 -07002118 /* Test first chunk of NV table */
2119 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2120 (0 == pHddCtx->ftm.processedNVTableSize))
2121 {
2122 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2123 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2124 {
c_hpothuffdb5272013-10-02 16:42:35 +05302125 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2126 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002127 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002128 }
2129
2130 switch (nvTable->nvTable)
2131 {
2132 case NV_TABLE_RATE_POWER_SETTINGS:
2133 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2134 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2135 break;
2136
2137 case NV_TABLE_REGULATORY_DOMAINS:
2138 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2139 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2140 break;
2141
2142 case NV_TABLE_DEFAULT_COUNTRY:
2143 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2144 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2145 break;
2146
2147 case NV_TABLE_TPC_POWER_TABLE:
2148 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2149 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2150 break;
2151
2152 case NV_TABLE_TPC_PDADC_OFFSETS:
2153 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2154 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2155 break;
2156
2157 case NV_TABLE_VIRTUAL_RATE:
2158 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2159 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2160 break;
2161
2162 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2163 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2164 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2165 break;
2166
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002167 case NV_TABLE_HW_CAL_VALUES:
2168 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2169 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2170 break;
2171
2172 case NV_TABLE_FW_CONFIG:
2173 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2174 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002175 break;
2176
2177 case NV_TABLE_ANTENNA_PATH_LOSS:
2178 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2179 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2180 break;
2181
2182 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2183 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2184 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2185 break;
2186
2187 default:
2188 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2189 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002190 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002191 break;
2192 }
2193
2194 /* Set Current Processing NV table type */
2195 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2196 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2197 {
2198 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2199 "Invalid Table Size %d", nvTable->tableSize);
2200 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2201 pHddCtx->ftm.targetNVTableSize = 0;
2202 pHddCtx->ftm.processedNVTableSize = 0;
2203 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002204 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002205 }
2206 }
2207
2208 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2209 {
2210 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2211 "Invalid NV Table, now Processing %d, not %d",
2212 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2213 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2214 pHddCtx->ftm.targetNVTableSize = 0;
2215 pHddCtx->ftm.processedNVTableSize = 0;
2216 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002217 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002218 }
2219 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002220 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002221 nvTable->chunkSize);
2222
2223 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2224 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2225 {
2226 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2227 pHddCtx->ftm.tempNVTableBuffer,
2228 pHddCtx->ftm.targetNVTableSize);
2229 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2230 pHddCtx->ftm.targetNVTableSize = 0;
2231 pHddCtx->ftm.processedNVTableSize = 0;
2232 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2233 }
2234
2235 return 1;
2236}
2237
2238/**---------------------------------------------------------------------------
2239
2240 \brief wlan_hdd_ftm_blank_nv() -
2241 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002242 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002243
2244 \param - ftmCmd - Pointer FTM Commad Buffer
2245
2246 \return - int
2247 -1, Process Host command fail, vail out
2248 0, Process Host command success
2249
2250 --------------------------------------------------------------------------*/
2251int wlan_hdd_ftm_blank_nv_table
2252(
2253 tPttMsgbuffer *ftmCmd
2254)
2255{
Leo Chang80de3c22013-11-26 10:52:12 -08002256 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002257 v_SIZE_t nvSize;
2258 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002259 sHalNvV2 *nvContents = NULL;
2260 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002261
2262 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2263 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2264 {
c_hpothuffdb5272013-10-02 16:42:35 +05302265 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2266 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002267 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002268 }
2269
Leo Chang80de3c22013-11-26 10:52:12 -08002270 nvVersion = vos_nv_getNvVersion();
2271 if (E_NV_V2 != nvVersion)
2272 {
2273 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2274 "%s : Not valid NV Version %d", __func__, nvVersion);
2275 return -EINVAL;
2276 }
2277
Jeff Johnson295189b2012-06-20 16:38:30 -07002278 itemSize = sizeof(nvContents->tables.pwrOptimum);
2279 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002280 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002281 itemSize);
2282
2283 itemSize = sizeof(nvContents->tables.regDomains);
2284 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002285 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002286 itemSize);
2287
2288 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2289 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002290 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002291 itemSize);
2292
2293 itemSize = sizeof(nvContents->tables.plutCharacterized);
2294 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002295 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002296 itemSize);
2297
2298 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2299 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002300 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002301 itemSize);
2302
2303 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2304 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002305 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002306 itemSize);
2307
2308 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2309 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002310 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002311 itemSize);
2312
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002313 itemSize = sizeof(nvContents->tables.hwCalValues);
2314 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002315 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002316 itemSize);
2317
2318 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2319 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002320 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 itemSize);
2322
2323 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2324 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002325 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002326 itemSize);
2327
2328 return 1;
2329}
2330
2331/**---------------------------------------------------------------------------
2332
2333 \brief wlan_hdd_ftm_delete_nv_table() -
2334 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002335 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002336
2337 \param - ftmCmd - Pointer FTM Commad Buffer
2338
2339 \return - int
2340 -1, Process Host command fail, vail out
2341 1, Process Host command success
2342
2343 --------------------------------------------------------------------------*/
2344int wlan_hdd_ftm_delete_nv_table
2345(
2346 tPttMsgbuffer *ftmCmd
2347)
2348{
Leo Chang80de3c22013-11-26 10:52:12 -08002349 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002350 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2351 v_SIZE_t nvSize;
2352 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002353 sHalNvV2 *nvContents = NULL;
2354 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002355
2356 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2357 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2358 {
c_hpothuffdb5272013-10-02 16:42:35 +05302359 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2360 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002361 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002362 }
2363
Leo Chang80de3c22013-11-26 10:52:12 -08002364 nvVersion = vos_nv_getNvVersion();
2365 if (E_NV_V2 != nvVersion)
2366 {
2367 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2368 "%s : Not valid NV Version %d", __func__, nvVersion);
2369 return -EINVAL;
2370 }
2371
Jeff Johnson295189b2012-06-20 16:38:30 -07002372 switch (nvTable->nvTable)
2373 {
2374 case NV_TABLE_RATE_POWER_SETTINGS:
2375 itemSize = sizeof(nvContents->tables.pwrOptimum);
2376 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002377 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002378 itemSize);
2379 break;
2380
2381 case NV_TABLE_REGULATORY_DOMAINS:
2382 itemSize = sizeof(nvContents->tables.regDomains);
2383 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002384 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002385 itemSize);
2386 break;
2387
2388 case NV_TABLE_DEFAULT_COUNTRY:
2389 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2390 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002391 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002392 itemSize);
2393 break;
2394
2395 case NV_TABLE_TPC_POWER_TABLE:
2396 itemSize = sizeof(nvContents->tables.plutCharacterized);
2397 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002398 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002399 itemSize);
2400 break;
2401
2402 case NV_TABLE_TPC_PDADC_OFFSETS:
2403 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2404 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002405 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002406 itemSize);
2407 break;
2408
2409 case NV_TABLE_VIRTUAL_RATE:
2410 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2411 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002412 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002413 itemSize);
2414 break;
2415
2416 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2417 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2418 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002419 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002420 itemSize);
2421 break;
2422
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002423 case NV_TABLE_HW_CAL_VALUES:
2424 itemSize = sizeof(nvContents->tables.hwCalValues);
2425 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002426 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002427 itemSize);
2428 break;
2429
2430 case NV_TABLE_FW_CONFIG:
2431 itemSize = sizeof(nvContents->tables.fwConfig);
2432 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002433 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002434 itemSize);
2435 break;
2436
2437 case NV_TABLE_ANTENNA_PATH_LOSS:
2438 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2439 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002440 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002441 itemSize);
2442 break;
2443
2444 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2445 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2446 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002447 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002448 itemSize);
2449 break;
2450
2451 default:
2452 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2453 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002454 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002455 break;
2456 }
2457
2458 return 1;
2459}
2460
2461/**---------------------------------------------------------------------------
2462
2463 \brief wlan_hdd_ftm_get_nv_field() -
2464 Get Specific NV field
2465
2466 \param - ftmCmd - Pointer FTM Commad Buffer
2467
2468 \return - int
2469 -1, Process Host command fail, vail out
2470 1, Process Host command success
2471
2472 --------------------------------------------------------------------------*/
2473int wlan_hdd_ftm_get_nv_field
2474(
2475 tPttMsgbuffer *ftmCmd
2476)
2477{
2478 sNvFields nvFieldDataBuffer;
2479 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2480 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2481 sHalNv *nvContents = NULL;
2482 v_SIZE_t nvSize;
2483
2484 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2485 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2486 {
c_hpothuffdb5272013-10-02 16:42:35 +05302487 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2488 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002489 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002490 }
2491 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2492
2493 switch (nvField->nvField)
2494 {
2495 case NV_COMMON_PRODUCT_ID:
2496 memcpy((void *)&nvField->fieldData,
2497 &nvFieldDataBuffer.productId,
2498 sizeof(nvFieldDataBuffer.productId));
2499 break;
2500
2501 case NV_COMMON_PRODUCT_BANDS:
2502 memcpy((void *)&nvField->fieldData,
2503 &nvFieldDataBuffer.productBands,
2504 sizeof(nvFieldDataBuffer.productBands));
2505 break;
2506
2507 case NV_COMMON_NUM_OF_TX_CHAINS:
2508 memcpy((void *)&nvField->fieldData,
2509 &nvFieldDataBuffer.numOfTxChains,
2510 sizeof(nvFieldDataBuffer.numOfTxChains));
2511 break;
2512
2513 case NV_COMMON_NUM_OF_RX_CHAINS:
2514 memcpy((void *)&nvField->fieldData,
2515 &nvFieldDataBuffer.numOfRxChains,
2516 sizeof(nvFieldDataBuffer.numOfRxChains));
2517 break;
2518
2519 case NV_COMMON_MAC_ADDR:
2520 memcpy((void *)&nvField->fieldData,
2521 &nvFieldDataBuffer.macAddr[0],
2522 NV_FIELD_MAC_ADDR_SIZE);
2523 break;
2524
2525 case NV_COMMON_MFG_SERIAL_NUMBER:
2526 memcpy((void *)&nvField->fieldData,
2527 &nvFieldDataBuffer.mfgSN[0],
2528 NV_FIELD_MFG_SN_SIZE);
2529 break;
2530
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002531 case NV_COMMON_WLAN_NV_REV_ID:
2532 memcpy((void *)&nvField->fieldData,
2533 &nvFieldDataBuffer.wlanNvRevId,
2534 sizeof(nvFieldDataBuffer.wlanNvRevId));
2535 break;
2536
Jeff Johnson295189b2012-06-20 16:38:30 -07002537 case NV_COMMON_COUPLER_TYPE:
2538 memcpy((void *)&nvField->fieldData,
2539 &nvFieldDataBuffer.couplerType,
2540 sizeof(nvFieldDataBuffer.couplerType));
2541 break;
2542
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002543 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002544 {
2545 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2546 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2547
2548 nvEmbededStatus = vos_nv_isEmbeddedNV();
2549
2550 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2551 {
2552 // High bit is set to indicate embedded NV..
2553 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2554 }
2555
2556 memcpy((void *)&nvField->fieldData,
2557 &nvVersion,
2558 sizeof(nvFieldDataBuffer.nvVersion));
2559 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002560 break;
2561
Jeff Johnson295189b2012-06-20 16:38:30 -07002562 default:
2563 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2564 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002565 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002566 break;
2567 }
2568
2569 return 1;
2570}
2571
2572/**---------------------------------------------------------------------------
2573
2574 \brief wlan_hdd_ftm_set_nv_field() -
2575 Set Specific NV field
2576
2577 \param - ftmCmd - Pointer FTM Commad Buffer
2578
2579 \return - int
2580 -1, Process Host command fail, vail out
2581 1, Process Host command success
2582
2583 --------------------------------------------------------------------------*/
2584int wlan_hdd_ftm_set_nv_field
2585(
2586 tPttMsgbuffer *ftmCmd
2587)
2588{
2589 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2590 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2591 v_SIZE_t nvSize;
2592 sHalNv *nvContents = NULL;
2593 v_U8_t macLoop;
2594 v_U8_t *pNVMac;
2595 v_U8_t lastByteMAC;
2596
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002597
Jeff Johnson295189b2012-06-20 16:38:30 -07002598 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2599 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2600 {
c_hpothuffdb5272013-10-02 16:42:35 +05302601 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2602 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002603 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002604 }
2605
2606 switch (nvField->nvField)
2607 {
2608 case NV_COMMON_PRODUCT_ID:
2609 memcpy(&nvContents->fields.productId,
2610 &nvField->fieldData,
2611 sizeof(nvContents->fields.productId));
2612 break;
2613
2614 case NV_COMMON_PRODUCT_BANDS:
2615 memcpy(&nvContents->fields.productBands,
2616 &nvField->fieldData,
2617 sizeof(nvContents->fields.productBands));
2618 break;
2619
2620 case NV_COMMON_NUM_OF_TX_CHAINS:
2621 memcpy(&nvContents->fields.numOfTxChains,
2622 &nvField->fieldData,
2623 sizeof(nvContents->fields.numOfTxChains));
2624 break;
2625
2626 case NV_COMMON_NUM_OF_RX_CHAINS:
2627 memcpy(&nvContents->fields.numOfRxChains,
2628 &nvField->fieldData,
2629 sizeof(nvContents->fields.numOfRxChains));
2630 break;
2631
2632 case NV_COMMON_MAC_ADDR:
2633 /* If Last byte is larger than 252 (0xFC), return Error,
2634 * Since 3MACs should be derived from first MAC */
2635 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002636 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002637 {
2638 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2639 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002640 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002641 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002642 }
2643
2644 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002645 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002646 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2647 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002648 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002649 lastByteMAC + macLoop;
2650 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002651 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002652 NV_FIELD_MAC_ADDR_SIZE);
2653 }
2654 break;
2655
2656 case NV_COMMON_MFG_SERIAL_NUMBER:
2657 memcpy(&nvContents->fields.mfgSN[0],
2658 &nvField->fieldData,
2659 NV_FIELD_MFG_SN_SIZE);
2660 break;
2661
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002662 case NV_COMMON_WLAN_NV_REV_ID:
2663 memcpy(&nvContents->fields.wlanNvRevId,
2664 &nvField->fieldData,
2665 sizeof(nvContents->fields.wlanNvRevId));
2666 break;
2667
Jeff Johnson295189b2012-06-20 16:38:30 -07002668 case NV_COMMON_COUPLER_TYPE:
2669 memcpy(&nvContents->fields.couplerType,
2670 &nvField->fieldData,
2671 sizeof(nvContents->fields.couplerType));
2672 break;
2673
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002674 case NV_COMMON_NV_VERSION:
2675 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2676 "Cannot modify NV version field %d", nvField->nvField);
2677 return -EIO;
2678 break;
2679
Jeff Johnson295189b2012-06-20 16:38:30 -07002680 default:
2681 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2682 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002683 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002684 break;
2685 }
2686
2687 return 1;
2688}
2689
2690/**---------------------------------------------------------------------------
2691
2692 \brief wlan_hdd_ftm_store_nv_table() -
2693 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002694 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002695
2696 \param - ftmCmd - Pointer FTM Commad Buffer
2697
2698 \return - int
2699 -1, Process Host command fail, vail out
2700 0, Process Host command success
2701
2702 --------------------------------------------------------------------------*/
2703int wlan_hdd_ftm_store_nv_table
2704(
2705 tPttMsgbuffer *ftmCmd
2706)
2707{
2708 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2709 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002710 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2711 void *tablePtr = NULL;
2712 unsigned int tableSize = 0;
2713 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002714 sHalNvV2 *nvContents = NULL;
2715 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002716
2717 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2718 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2719 {
c_hpothuffdb5272013-10-02 16:42:35 +05302720 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2721 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002722 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002723 }
2724
Leo Chang80de3c22013-11-26 10:52:12 -08002725 nvVersion = vos_nv_getNvVersion();
2726 if (E_NV_V2 != nvVersion)
2727 {
2728 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2729 "%s : Not valid NV Version %d", __func__, nvVersion);
2730 return -EINVAL;
2731 }
2732
Jeff Johnson295189b2012-06-20 16:38:30 -07002733 /* Set Platform type as PRIMA */
2734 nvContents->fields.wlanNvRevId = 2;
2735
2736 switch(nvTable->nvTable)
2737 {
2738 case NV_FIELDS_IMAGE:
2739 tablePtr = (void *)&nvContents->fields;
2740 tableSize = sizeof(nvContents->fields);
2741 tableVNVType = VNV_FIELD_IMAGE;
2742 break;
2743
2744 case NV_TABLE_RATE_POWER_SETTINGS:
2745 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2746 tableSize = sizeof(nvContents->tables.pwrOptimum);
2747 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2748 break;
2749
2750 case NV_TABLE_REGULATORY_DOMAINS:
2751 tablePtr = (void *)&nvContents->tables.regDomains[0];
2752 tableSize = sizeof(nvContents->tables.regDomains);
2753 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2754 break;
2755
2756 case NV_TABLE_DEFAULT_COUNTRY:
2757 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2758 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2759 tableVNVType = VNV_DEFAULT_LOCATION;
2760 break;
2761
2762 case NV_TABLE_TPC_POWER_TABLE:
2763 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2764 tableSize = sizeof(nvContents->tables.plutCharacterized);
2765 tableVNVType = VNV_TPC_POWER_TABLE;
2766 break;
2767
2768 case NV_TABLE_TPC_PDADC_OFFSETS:
2769 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2770 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2771 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2772 break;
2773
2774 case NV_TABLE_VIRTUAL_RATE:
2775 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2776 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2777 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2778 break;
2779
2780 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2781 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2782 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2783 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2784 break;
2785
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002786 case NV_TABLE_HW_CAL_VALUES:
2787 tablePtr = (void *)&nvContents->tables.hwCalValues;
2788 tableSize = sizeof(nvContents->tables.hwCalValues);
2789 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002790 break;
2791
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002792 case NV_TABLE_FW_CONFIG:
2793 tablePtr = (void *)&nvContents->tables.fwConfig;
2794 tableSize = sizeof(nvContents->tables.fwConfig);
2795 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002796 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002797
Jeff Johnson295189b2012-06-20 16:38:30 -07002798 case NV_TABLE_ANTENNA_PATH_LOSS:
2799 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2800 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2801 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2802 break;
2803
2804 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2805 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2806 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2807 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2808 break;
2809
2810 default:
2811 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2812 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002813 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002814 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002815
Jeff Johnson295189b2012-06-20 16:38:30 -07002816 }
2817
2818 nvStatus = vos_nv_write(tableVNVType,
2819 tablePtr,
2820 tableSize);
2821 if(VOS_STATUS_SUCCESS != nvStatus)
2822 {
c_hpothuffdb5272013-10-02 16:42:35 +05302823 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2824 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002825 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002826 }
2827
2828 return 1;
2829}
2830
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002831/* --------------------------------------------------------------------------
2832 \brief wlan_hdd_ftm_get_nv_bin() -
2833 Get NV bin read from Flash Memory, file
2834
2835 \param - ftmCmd - Pointer FTM Commad Buffer
2836
2837 \return - int
2838 -1, Process Host command fail, vail out
2839 0, Process Host command success
2840--------------------------------------------------------------------------*/
2841
2842static int wlan_hdd_ftm_get_nv_bin
2843(
2844 v_U16_t msgId,
2845 hdd_context_t *pHddCtx,
2846 tPttMsgbuffer *ftmCmd
2847)
2848{
2849 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2850 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2851 v_SIZE_t nvSize;
2852 v_U8_t *nvContents;
2853 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002854 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002855
Leo Chang80de3c22013-11-26 10:52:12 -08002856 nvVersion = vos_nv_getNvVersion();
2857 if (E_NV_V3 != nvVersion)
2858 {
2859 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2860 "%s : Not valid NV Version %d", __func__, nvVersion);
2861 return -EINVAL;
2862 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002863
2864 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2865 (0 == pHddCtx->ftm.processedNVTableSize))
2866 {
2867 if ( msgId == PTT_MSG_GET_NV_BIN )
2868 {
2869 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2870 }
2871 else
2872 {
2873 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2874 }
2875
2876 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2877 {
c_hpothuffdb5272013-10-02 16:42:35 +05302878 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2879 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002880 return -EIO;
2881 }
2882
2883 switch (nvTable->nvTable)
2884 {
2885 case NV_BINARY_IMAGE:
2886 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2887 break;
2888 default:
2889 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2890 "Not Valid NV Table %d", nvTable->nvTable);
2891 return -EIO;
2892 break;
2893 }
2894
2895 /* Set Current Processing NV table type */
2896 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2897 if ( msgId == PTT_MSG_GET_NV_BIN )
2898 {
2899 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2900 /* Validity Period */
2901 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2902 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2903 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2904 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2905 offset = sizeof(v_U32_t);
2906 }
2907 else
2908 {
2909 pHddCtx->ftm.targetNVTableSize = nvSize;
2910 offset = 0;
2911 }
2912
2913 /* Copy target NV table value into temp context buffer */
2914 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2915 pHddCtx->ftm.targetNVTablePointer,
2916 pHddCtx->ftm.targetNVTableSize);
2917 }
2918
2919
2920 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2921 {
2922 /* Invalid table type */
2923 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2924 "Invalid NV Table, now Processing %d, not %d",
2925 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2926
2927 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2928 pHddCtx->ftm.targetNVTableSize = 0;
2929 pHddCtx->ftm.processedNVTableSize = 0;
2930 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2931
2932 return -EINVAL;
2933 }
2934
2935 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2936
2937 /* Update processed pointer to prepare next chunk copy */
2938 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2939 pHddCtx->ftm.targetNVTableSize )
2940 {
2941 nvTable->chunkSize =
2942 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2943 }
2944
2945 /* Copy next chunk of NV table value into response buffer */
2946 vos_mem_copy(
2947 &nvTable->tableData,
2948 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2949 nvTable->chunkSize);
2950
2951 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2952
2953 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2954 {
2955 /* Finished to process last chunk of data, initialize buffer */
2956 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2957 pHddCtx->ftm.targetNVTableSize = 0;
2958 pHddCtx->ftm.processedNVTableSize = 0;
2959 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2960 }
2961
2962 return 1;
2963}
2964
2965/**---------------------------------------------------------------------------
2966
2967 \brief wlan_hdd_ftm_set_nv_bin() -
2968 Set NV bin to Flash Memory, file
2969
2970 \param - ftmCmd - Pointer FTM Commad Buffer
2971
2972 \return - int
2973 -1, Process Host command fail, vail out
2974 0, Process Host command success
2975
2976+----------------------------------------------------------------------------*/
2977
2978static int wlan_hdd_ftm_set_nv_bin
2979(
2980 hdd_context_t *pHddCtx,
2981 tPttMsgbuffer *ftmCmd
2982)
2983{
2984 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2985 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002986 eNvVersionType nvVersion;
2987
2988 nvVersion = vos_nv_getNvVersion();
2989 if (E_NV_V3 != nvVersion)
2990 {
2991 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2992 "%s : Not valid NV Version %d", __func__, nvVersion);
2993 return -EINVAL;
2994 }
2995
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002996
2997 /* Test first chunk of NV table */
2998 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2999 (0 == pHddCtx->ftm.processedNVTableSize))
3000 {
3001 switch (nvTable->nvTable)
3002 {
3003 case NV_BINARY_IMAGE:
3004 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
3005 break;
3006 default:
3007 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3008 "Not Valid NV Table %d", nvTable->nvTable);
3009 return -EIO;
3010 break;
3011 }
3012
3013 /* Set Current Processing NV table type */
3014 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
3015 pHddCtx->ftm.processedNVTableSize = 0;
3016
3017 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
3018 {
3019 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3020 "Invalid Table Size %d", nvTable->tableSize);
3021 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3022 pHddCtx->ftm.targetNVTableSize = 0;
3023 pHddCtx->ftm.processedNVTableSize = 0;
3024 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3025 return -EINVAL;
3026 }
3027 }
3028
3029 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3030 {
3031 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3032 "Invalid NV Table, now Processing %d, not %d",
3033 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3034 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3035 pHddCtx->ftm.targetNVTableSize = 0;
3036 pHddCtx->ftm.processedNVTableSize = 0;
3037 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3038 return -EINVAL;
3039 }
3040
3041 vos_mem_copy(
3042 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3043 &nvTable->tableData,
3044 nvTable->chunkSize);
3045
3046 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3047
3048 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3049 {
3050 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3051 "Processing Done!! write encoded Buffer %d",
3052 pHddCtx->ftm.targetNVTableSize);
3053
3054 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3055 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3056
3057 if ((VOS_STATUS_SUCCESS != nvStatus))
3058 {
3059 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3060 "Fail to set NV Binary %d", nvStatus);
3061 return -EIO;
3062 }
3063
3064 nvStatus = vos_nv_setNVEncodedBuffer(
3065 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3066 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3067
3068 if ((VOS_STATUS_SUCCESS != nvStatus))
3069 {
3070 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3071 "Fail to set NV Binary %d", nvStatus);
3072 return -EIO;
3073 }
3074
3075 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3076 pHddCtx->ftm.targetNVTableSize = 0;
3077 pHddCtx->ftm.processedNVTableSize = 0;
3078 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3079 }
3080
3081 return 1;
3082}
3083
Jeff Johnson295189b2012-06-20 16:38:30 -07003084/**---------------------------------------------------------------------------
3085
3086 \brief wlan_hdd_ftm_temp_get_rel_num() -
3087 Get internal release number
3088
3089 \param - ftmCmd - Pointer FTM Commad Buffer
3090
3091 \return - int
3092 -1, Process Host command fail, vail out
3093 0, Process Host command success
3094
3095 --------------------------------------------------------------------------*/
3096int wlan_hdd_ftm_temp_get_rel_num
3097(
3098 tPttMsgbuffer *ftmCmd
3099)
3100{
3101 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3102
3103 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3104 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3105 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3106 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3107 relNum->relParams.pttMax = 10;
3108 relNum->relParams.pttMin = 1;
3109
3110 return 1;
3111}
3112
3113/**---------------------------------------------------------------------------
3114
3115 \brief wlan_hdd_process_ftm_host_cmd() -
3116 process any command should be handled within host.
3117 decide any command should be send to HAL or not
3118
3119 \param - ftmCmd - Pointer FTM Commad Buffer
3120
3121 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003122 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003123 0, Process Host command success, not need to send CMD to HAL
3124 1, Process Host command success, need to send CMD to HAL
3125
3126 --------------------------------------------------------------------------*/
3127int wlan_hdd_process_ftm_host_cmd
3128(
3129 hdd_context_t *pHddCtx,
3130 void *ftmCmd
3131)
3132{
3133 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3134 int needToRouteHal = 1;
3135 int hostState = 1;
3136
3137 switch(pFTMCmd->msgId)
3138 {
3139 case PTT_MSG_GET_NV_TABLE:
3140 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3141 needToRouteHal = 0;
3142 break;
3143
3144 case PTT_MSG_SET_NV_TABLE:
3145 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3146 /* Temp NV Operation will be isolated to host
3147 needToRouteHal = 1; */
3148 needToRouteHal = 0;
3149 break;
3150
3151 case PTT_MSG_BLANK_NV:
3152 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3153 needToRouteHal = 1;
3154 break;
3155
3156 case PTT_MSG_DEL_NV_TABLE:
3157 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3158 needToRouteHal = 1;
3159 break;
3160
3161 case PTT_MSG_GET_NV_FIELD:
3162 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3163 needToRouteHal = 0;
3164 break;
3165
3166 case PTT_MSG_SET_NV_FIELD:
3167 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3168 needToRouteHal = 0;
3169 break;
3170
3171 case PTT_MSG_STORE_NV_TABLE:
3172 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3173 needToRouteHal = 0;
3174 break;
3175
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003176 case PTT_MSG_GET_NV_BIN:
3177 case PTT_MSG_GET_DICTIONARY:
3178 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3179 needToRouteHal = 0;
3180 break;
3181
3182 case PTT_MSG_SET_NV_BIN:
3183 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3184 needToRouteHal = 0;
3185 break;
3186
Jeff Johnson295189b2012-06-20 16:38:30 -07003187 case PTT_MSG_DBG_READ_REGISTER:
3188 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3189 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3190 needToRouteHal = 0;
3191 break;
3192
3193 case PTT_MSG_DBG_WRITE_REGISTER:
3194 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3195 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3196 needToRouteHal = 0;
3197 break;
3198
3199 case PTT_MSG_DBG_READ_MEMORY:
3200 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3201 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3202 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3203 needToRouteHal = 0;
3204 break;
3205
3206 case PTT_MSG_DBG_WRITE_MEMORY:
3207 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3208 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3209 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3210 needToRouteHal = 0;
3211 break;
3212
3213 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3214 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3215 needToRouteHal = 0;
3216 break;
3217
3218 default:
3219 needToRouteHal = 1;
3220 break;
3221 }
3222
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003223 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003224 {
3225 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3226 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003227 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003228 }
3229
3230 return needToRouteHal;
3231}
Jeff Johnson295189b2012-06-20 16:38:30 -07003232
3233/**---------------------------------------------------------------------------
3234
3235 \brief wlan_hdd_process_ftm_cmd() -
3236
3237 This function process the commands received from the ptt socket application.
3238
3239 \param - pAdapter - Pointer HDD Context.
3240
3241 \param - wnl - Pointer to the ANI netlink header.
3242
3243 \return - none
3244
3245 --------------------------------------------------------------------------*/
3246
3247void wlan_hdd_process_ftm_cmd
3248(
3249 hdd_context_t *pHddCtx,
3250 tAniNlHdr *wnl
3251)
3252{
3253 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3254 v_U16_t cmd_len;
3255 v_U8_t *pftm_data;
3256 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003257 int hostState;
3258 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003259
3260 ENTER();
3261
Jeff Johnsone7245742012-09-05 17:12:55 -07003262 //Delay to fix NV write failure on JB
3263 vos_busy_wait(10000); //10ms
3264
Jeff Johnson295189b2012-06-20 16:38:30 -07003265 if (!pRequestBuf) {
3266
Arif Hussain6d2a3322013-11-17 19:50:10 -08003267 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003268 return ;
3269 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303270
3271 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3272 {
3273 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3274 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3275 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3276 return ;
3277 }
3278
Jeff Johnson295189b2012-06-20 16:38:30 -07003279 /*Save the received request*/
3280 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3281
3282 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3283 /*Save the received request netlink header used for sending the response*/
3284 pHddCtx->ftm.wnl = wnl;
3285 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3286
Arif Hussain6d2a3322013-11-17 19:50:10 -08003287 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003288
3289 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3290 wlan_ftm_send_response(pHddCtx);
3291 return ;
3292 }
3293
3294 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3295 {
3296 case WLAN_FTM_START:
3297 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3298
Arif Hussain6d2a3322013-11-17 19:50:10 -08003299 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003300 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3301 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3302 wlan_ftm_send_response(pHddCtx);
3303 return;
3304 }
3305
3306 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3307 {
3308 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3309 ,__func__);
3310 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3311 wlan_ftm_send_response(pHddCtx);
3312 return;
3313 }
3314 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3315 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3316 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3317 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3318
3319 wlan_ftm_send_response(pHddCtx);
3320
3321 break;
3322
3323 case WLAN_FTM_STOP:
3324 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3325
Arif Hussain6d2a3322013-11-17 19:50:10 -08003326 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003327 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3328 wlan_ftm_send_response(pHddCtx);
3329 return;
3330 }
3331
3332 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3333
3334 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3335 wlan_ftm_send_response(pHddCtx);
3336 return;
3337 }
3338
3339 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3340 /* This would send back the Command Success Status */
3341 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3342
3343 wlan_ftm_send_response(pHddCtx);
3344
3345 break;
3346
3347 case WLAN_FTM_CMD:
3348 /* if it is regular FTM command, pass it to HAL PHY */
3349 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003350 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003351 return;
3352 }
3353 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3354
Arif Hussain6d2a3322013-11-17 19:50:10 -08003355 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003356
3357 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3358 wlan_ftm_send_response(pHddCtx);
3359 return;
3360
3361 }
3362 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3363 cmd_len = pRequestBuf->ftm_hdr.data_len;
3364 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3365 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3366
Jeff Johnson295189b2012-06-20 16:38:30 -07003367 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3368 if (0 == hostState)
3369 {
3370 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3371 if (NULL == tempRspBuffer)
3372 {
3373 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003374 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003375 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3376 wlan_ftm_send_response(pHddCtx);
3377 return;
3378 }
3379 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3380 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3381 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3382 (unsigned char *) tempRspBuffer,
3383 tempRspBuffer->msgBodyLength);
3384 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3385 wlan_ftm_send_response(pHddCtx);
3386 vos_mem_free(tempRspBuffer);
3387 return;
3388 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003389 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003390 {
3391 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3392 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3393 wlan_ftm_send_response(pHddCtx);
3394 return;
3395 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003396
3397 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3398
Jeff Johnson295189b2012-06-20 16:38:30 -07003399
3400 /*Post the command to the HAL*/
3401 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3402
Arif Hussain6d2a3322013-11-17 19:50:10 -08003403 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003404 return;
3405
3406 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303407 /*After successful posting of message the command should be pending*/
3408 pHddCtx->ftm.IsCmdPending = TRUE;
3409
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 /*Wait here until you get the response from HAL*/
3411 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3412 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303413 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3414 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3415 wlan_ftm_send_response(pHddCtx);
3416 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003417 return;
3418 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303419 /*This check will handle the case where the completion is sent by
3420 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3421 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3422 {
3423 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3424 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3425 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3426
3427 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3428 wlan_ftm_send_response(pHddCtx);
3429 pHddCtx->ftm.IsCmdPending = FALSE;
3430 return ;
3431 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003432
3433 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3434
3435 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3436
3437 wlan_ftm_send_response(pHddCtx);
3438 pHddCtx->ftm.IsCmdPending = FALSE;
3439 break;
3440
3441 default:
3442
Arif Hussain6d2a3322013-11-17 19:50:10 -08003443 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003444 return;
3445 }
3446
3447 EXIT();
3448 return;
3449} /* wlan_adp_ftm_cmd() */
3450
3451/**---------------------------------------------------------------------------
3452
3453 \brief wlan_ftm_priv_start_stop_ftm() -
3454
3455 This function is used for start/stop the ftm driver.
3456
3457 \param - pAdapter - Pointer HDD Context.
3458 - start - 1/0 to start/stop ftm driver.
3459
3460 \return - 0 for success, non zero for failure
3461
3462 --------------------------------------------------------------------------*/
3463
3464static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3465 v_U16_t start)
3466{
3467 VOS_STATUS status;
3468 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3469
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003470 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003471 {
3472 pHddCtx->ftm.cmd_iwpriv = TRUE;
3473 status = wlan_hdd_ftm_start(pHddCtx);
3474
3475 if (status != VOS_STATUS_SUCCESS)
3476 {
3477 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3478 "FTM Start Failed");
3479 return VOS_STATUS_E_FAILURE;
3480 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303481 if (NULL == pMsgBuf)
3482 {
3483 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3484 if (NULL == pMsgBuf)
3485 {
3486 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3487 "%s:pMsgBuf is NULL", __func__);
3488 return VOS_STATUS_E_FAILURE;
3489 }
3490 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003491 }
3492 else
3493 {
3494 status = wlan_ftm_stop(pHddCtx);
3495
3496 if (status != VOS_STATUS_SUCCESS)
3497 {
3498 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3499 "FTM Stop Failed");
3500 return VOS_STATUS_E_FAILURE;
3501 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303502 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3503 if (pMsgBuf)
3504 {
3505 vos_mem_free((v_VOID_t * )pMsgBuf);
3506 pMsgBuf = NULL;
3507 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003508 }
3509 return VOS_STATUS_SUCCESS;
3510}
3511
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303512
3513static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3514{
3515 unsigned int *table = NULL;
3516 int index = 0;
3517
3518 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3519 table = valid_channel;
3520 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3521 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3522 table = valid_channel_cb40;
3523 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3524 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3525 table = valid_channel_cb80;
3526
3527 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303528 {
3529 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3530 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303531 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303532 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303533
3534 while (table[index] != 0)
3535 {
3536 if (table[index] == channel)
3537 return VOS_STATUS_SUCCESS;
3538
3539 index++;
3540 }
3541
3542 return VOS_STATUS_E_FAILURE;
3543}
3544
3545
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303546static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3547{
3548 unsigned int primary_channel = center_channel;
3549
3550 if (center_channel <= 14)
3551 return primary_channel ;
3552
3553 switch (cb)
3554 {
3555 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3556 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3557 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3558 primary_channel -= 2;
3559 break;
3560
3561
3562 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3563 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3564 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3565 primary_channel += 2;
3566 break;
3567
3568 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3569 primary_channel -= 6;
3570 break;
3571
3572 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3573 primary_channel += 6;
3574 break;
3575 }
3576
3577 return primary_channel;
3578
3579}
3580
Jeff Johnson295189b2012-06-20 16:38:30 -07003581/**---------------------------------------------------------------------------
3582
3583 \brief wlan_ftm_priv_set_channel() -
3584
3585 This function is used for setting the channel to the halphy ptt module.
3586
3587 \param - pAdapter - Pointer HDD Context.
3588 - channel - Channel Number 1-14.
3589
3590 \return - 0 for success, non zero for failure
3591
3592 --------------------------------------------------------------------------*/
3593
3594static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3595{
Jeff Johnson295189b2012-06-20 16:38:30 -07003596 uPttMsgs *pMsgBody;
3597 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303598 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003599 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3600
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303601 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
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:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003605 return VOS_STATUS_E_FAILURE;
3606 }
3607
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303608 if (NULL == pMsgBuf)
3609 {
3610 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3611 "%s:pMsgBuf is NULL", __func__);
3612 return VOS_STATUS_E_NOMEM;
3613 }
3614
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303615 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003616 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303617 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3618 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003619 return VOS_STATUS_E_FAILURE;
3620 }
3621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303622 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 init_completion(&pHddCtx->ftm.ftm_comp_var);
3624 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3625 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3626
3627 pMsgBody = &pMsgBuf->msgBody;
3628
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303629 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003630
Arif Hussain6d2a3322013-11-17 19:50:10 -08003631 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303632 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003633
3634 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3635
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303636 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003637 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303638 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3639 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003640 status = VOS_STATUS_E_FAILURE;
3641 goto done;
3642
3643 }
c_hpothuffdb5272013-10-02 16:42:35 +05303644 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303645 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303646 if (0 >= ret )
3647 {
3648 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3649 FL("wait on ftm_comp_var failed %ld"), ret);
3650 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003651
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303652 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003653 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303654 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3655 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003656 status = VOS_STATUS_E_FAILURE;
3657 goto done;
3658
3659 }
3660done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003661
3662 return status;
3663}
3664
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303665
3666/**---------------------------------------------------------------------------
3667
3668 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3669
3670 This function is used for setting the power control mode for tx.
3671
3672 \param - pAdapter - Pointer HDD Context.
3673 - pwr_mode - power control mode 0-2.
3674
3675 \return - 0 for success, non zero for failure
3676
3677 --------------------------------------------------------------------------*/
3678
3679static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3680 v_U16_t pwr_mode)
3681{
3682 uPttMsgs *pMsgBody;
3683 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303684 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303685 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3686
3687 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3688 {
3689 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3690 "%s:Ftm has not started. Please start the ftm. ", __func__);
3691 return VOS_STATUS_E_FAILURE;
3692 }
3693
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303694 if (NULL == pMsgBuf)
3695 {
3696 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3697 "%s:pMsgBuf is NULL", __func__);
3698 return VOS_STATUS_E_NOMEM;
3699 }
3700
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303701 if (pwr_mode > 2)
3702 {
3703 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3704 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3705 return VOS_STATUS_E_FAILURE;
3706 }
3707
3708 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3709 init_completion(&pHddCtx->ftm.ftm_comp_var);
3710 pMsgBody = &pMsgBuf->msgBody;
3711 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3712 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3713
3714 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3715 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3716
3717 if (status != VOS_STATUS_SUCCESS)
3718 {
3719 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3720 "%s:wlan_ftm_postmsg failed", __func__);
3721 status = VOS_STATUS_E_FAILURE;
3722 goto done;
3723 }
c_hpothuffdb5272013-10-02 16:42:35 +05303724 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303725 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303726 if (0 >= ret )
3727 {
3728 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3729 FL("wait on ftm_comp_var failed %ld"), ret);
3730 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303731
3732 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3733 {
3734 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3735 "%s:Ptt response status failed", __func__);
3736 status = VOS_STATUS_E_FAILURE;
3737 goto done;
3738 }
3739
Mahesh A Saptasagar19076a92014-07-02 12:58:24 +05303740 ftm_status.powerCtlMode= pwr_mode;
3741
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303742 done:
3743 return status;
3744
3745}
3746
Jeff Johnson295189b2012-06-20 16:38:30 -07003747/**---------------------------------------------------------------------------
3748
3749 \brief wlan_ftm_priv_set_txpower() -
3750
3751 This function is used for setting the txpower to the halphy ptt module.
3752
3753 \param - pAdapter - Pointer HDD Context.
3754 - txpower - txpower Number 1-18.
3755
3756 \return - 0 for success, non zero for failure
3757
3758 --------------------------------------------------------------------------*/
3759
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303760static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3761 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003762{
Jeff Johnson295189b2012-06-20 16:38:30 -07003763 uPttMsgs *pMsgBody;
3764 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303765 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003766 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3767
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303768 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003769 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303770 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3771 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003772 return VOS_STATUS_E_FAILURE;
3773 }
3774
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05303775 if (NULL == pMsgBuf)
3776 {
3777 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3778 "%s:pMsgBuf is NULL", __func__);
3779 return VOS_STATUS_E_NOMEM;
3780 }
3781
Jeff Johnson295189b2012-06-20 16:38:30 -07003782 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3783 * when tx pktgen is enabled
3784 */
3785 if (ftm_status.frameGenEnabled)
3786 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303787 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3788 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003789 return VOS_STATUS_E_FAILURE;
3790 }
3791
3792 if(!(txpower >= 9 && txpower <= 24))
3793 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3795 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003796 return VOS_STATUS_E_FAILURE;
3797 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003798
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303799 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3800 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003801 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003802 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3803 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3804
3805 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3806
3807 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3808
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303809 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003810 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303811 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3812 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003813 status = VOS_STATUS_E_FAILURE;
3814 goto done;
3815 }
c_hpothuffdb5272013-10-02 16:42:35 +05303816 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303817 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303818 if (0 >= ret )
3819 {
3820 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3821 FL("wait on ftm_comp_var failed %ld"), ret);
3822 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003823
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303824 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003825 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303826 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3827 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003828 status = VOS_STATUS_E_FAILURE;
3829 goto done;
3830 }
3831
Jeff Johnson295189b2012-06-20 16:38:30 -07003832 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003833
3834 return status;
3835
3836}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303837
3838
3839static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3840 v_U16_t enable)
3841{
3842 tANI_U32 value = 0;
3843 tANI_U32 reg_addr;
3844 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303845
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303846 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3847 {
3848 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3849 "%s:Ftm has not started. Please start the ftm. ", __func__);
3850 return VOS_STATUS_E_FAILURE;
3851 }
3852
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303853 reg_addr = WCNSS_TXFIR_OFFSET;
3854
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303855 wpalReadRegister(reg_addr, &value);
3856 if (enable)
3857 {
3858 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3859 }
3860 else
3861 {
3862 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3863 }
3864
3865 wpalWriteRegister(reg_addr, value);
3866
3867 return VOS_STATUS_SUCCESS;
3868}
3869
3870
Jeff Johnson295189b2012-06-20 16:38:30 -07003871/**---------------------------------------------------------------------------
3872
3873 \brief wlan_ftm_priv_set_txrate() -
3874
3875 This function is used for setting the txrate to the halphy ptt module.
3876 It converts the user input string for txrate to the tx rate index.
3877
3878 \param - pAdapter - Pointer HDD Context.
3879 - txrate - Pointer to the tx rate string.
3880
3881 \return - 0 for success, non zero for failure
3882
3883 --------------------------------------------------------------------------*/
3884
3885static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3886{
3887 int ii;
3888 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3889 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3890 {
3891 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3892 return VOS_STATUS_E_FAILURE;
3893 }
3894
3895 /* do not allow to change setting when tx pktgen is enabled */
3896 if (ftm_status.frameGenEnabled)
3897 {
3898 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3899 return VOS_STATUS_E_FAILURE;
3900 }
3901
3902 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3903 {
3904 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3905 break;
3906 }
3907 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3908 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003909 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003910 return VOS_STATUS_E_FAILURE;
3911 }
3912
3913 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3914 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3915
3916 return VOS_STATUS_SUCCESS;
3917}
3918
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303919
3920
3921static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3922 ePowerTempIndexSource pwr_source)
3923{
3924 uPttMsgs *pMsgBody;
3925 VOS_STATUS status;
3926 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3927
3928 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3929 {
3930 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3931 "%s:Ftm has not started. Please start the ftm. ", __func__);
3932 return VOS_STATUS_E_FAILURE;
3933 }
3934
3935 if (pwr_source > 3)
3936 {
3937 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3938 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3939 __func__);
3940 return VOS_STATUS_E_FAILURE;
3941 }
3942
3943 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3944
3945 init_completion(&pHddCtx->ftm.ftm_comp_var);
3946 pMsgBody = &pMsgBuf->msgBody;
3947 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3948 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3949
3950 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3951 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3952
3953 if (status != VOS_STATUS_SUCCESS)
3954 {
3955 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3956 "%s:wlan_ftm_postmsg failed", __func__);
3957 status = VOS_STATUS_E_FAILURE;
3958 goto done;
3959 }
3960 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3961 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3962
3963 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3964 {
3965 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3966 "%s:Ptt response status failed", __func__);
3967 status = VOS_STATUS_E_FAILURE;
3968 goto done;
3969 }
3970
3971done:
3972
3973 return status;
3974}
3975
3976
Jeff Johnson295189b2012-06-20 16:38:30 -07003977/**---------------------------------------------------------------------------
3978
3979 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3980
3981 This function is used for start/stop the tx packet generation.
3982
3983 \param - pAdapter - Pointer HDD Context.
3984 - startStop - Value( 1/0) start/stop the tx packet generation.
3985
3986 \return - 0 for success, non zero for failure
3987
3988 --------------------------------------------------------------------------*/
3989
3990static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3991{
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 uPttMsgs *pMsgBody;
3993 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303994 long ret;
3995
Jeff Johnson295189b2012-06-20 16:38:30 -07003996 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3997
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303998 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003999 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304000 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4001 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004002 return VOS_STATUS_E_FAILURE;
4003 }
4004
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304005 if (NULL == pMsgBuf)
4006 {
4007 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4008 "%s:pMsgBuf is NULL", __func__);
4009 return VOS_STATUS_E_NOMEM;
4010 }
4011
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304012 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07004013 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304014 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4015 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004016 return VOS_STATUS_E_FAILURE;
4017 }
4018
4019 if ((ftm_status.frameGenEnabled && startStop == 1) ||
4020 (!ftm_status.frameGenEnabled && startStop == 0))
4021 {
4022 return VOS_STATUS_SUCCESS ;
4023 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304024 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004025
Jeff Johnson295189b2012-06-20 16:38:30 -07004026 if (startStop == 1)
4027 {
4028 init_completion(&pHddCtx->ftm.ftm_comp_var);
4029 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
4030 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
4031 pMsgBody = &pMsgBuf->msgBody;
4032 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
4033
4034 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304035 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004036 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304037 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4038 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004039 status = VOS_STATUS_E_FAILURE;
4040 goto done;
4041 }
4042
c_hpothuffdb5272013-10-02 16:42:35 +05304043 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304044 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304045 if (0 >= ret )
4046 {
4047 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4048 FL("wait on ftm_comp_var failed %ld"), ret);
4049 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304050 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004051 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304052 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4053 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004054 status = VOS_STATUS_E_FAILURE;
4055 goto done;
4056 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304057
4058 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4059 {
4060 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4061 if(status != VOS_STATUS_SUCCESS)
4062 {
4063 goto done;
4064 }
4065 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004066 }
4067
4068 init_completion(&pHddCtx->ftm.ftm_comp_var);
4069 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4070 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4071 pMsgBody = &pMsgBuf->msgBody;
4072 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4073
4074 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4075 if(status != VOS_STATUS_SUCCESS)
4076 {
4077 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4078 status = VOS_STATUS_E_FAILURE;
4079 goto done;
4080 }
4081
c_hpothuffdb5272013-10-02 16:42:35 +05304082 ret = wait_for_completion_interruptible_timeout(
4083 &pHddCtx->ftm.ftm_comp_var,
4084 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4085 if (0 >= ret )
4086 {
4087 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4088 FL("wait on ftm_comp_var failed %ld"), ret);
4089 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004090 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4091 {
4092 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4093 status = VOS_STATUS_E_FAILURE;
4094 goto done;
4095 }
4096
4097done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004098
4099 if (status == VOS_STATUS_SUCCESS)
4100 {
4101 if (startStop == 1)
4102 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304103 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004104 }
4105 else
4106 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304107 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 }
4109 }
4110
4111 return status;
4112}
4113
4114
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304115
4116static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4117{
4118
4119 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4120 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4121 {
4122 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4123 "%s:Ftm has not started. Please start the ftm. ", __func__);
4124 return VOS_STATUS_E_FAILURE;
4125 }
4126
4127 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4128 {
4129 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4130 "%s:cb mode value is invalid ", __func__);
4131 return VOS_STATUS_E_FAILURE;
4132 }
4133
4134 ftm_status.cbmode = cbmode;
4135
4136 return VOS_STATUS_SUCCESS;
4137
4138}
4139
Jeff Johnson295189b2012-06-20 16:38:30 -07004140/**---------------------------------------------------------------------------
4141
4142 \brief wlan_ftm_rx_mode() -
4143
4144 This function is used for start/stop the rx packet generation.
4145
4146 \param - pAdapter - Pointer HDD Context.
4147 - rxmode - 0-disable RX.
4148 - 1-rx ALL frames
4149 - 2-rx 11 g/n frames
4150 - 3-rx 11b frames
4151
4152 \return - 0 for success, non zero for failure
4153
4154 --------------------------------------------------------------------------*/
4155
4156static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4157{
Jeff Johnson295189b2012-06-20 16:38:30 -07004158 uPttMsgs *pMsgBody;
4159 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304160 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004161
4162 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304163 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004164 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304165 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4166 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004167 return VOS_STATUS_E_FAILURE;
4168 }
4169
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304170 if (NULL == pMsgBuf)
4171 {
4172 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4173 "%s:pMsgBuf is NULL", __func__);
4174 return VOS_STATUS_E_NOMEM;
4175 }
4176
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304177 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004178 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304179 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4180 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004181 return VOS_STATUS_E_FAILURE;
4182 }
4183
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304184 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004185 init_completion(&pHddCtx->ftm.ftm_comp_var);
4186
4187 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4188 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4189
4190 pMsgBody = &pMsgBuf->msgBody;
4191
4192 switch(rxmode)
4193 {
4194 case RXMODE_DISABLE_ALL:
4195 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4196 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4197 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4198 break;
4199
4200 case RXMODE_ENABLE_ALL:
4201 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4202 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4203 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4204 break;
4205
4206 case RXMODE_ENABLE_11GN:
4207 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4208 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4209 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4210 break;
4211
4212 case RXMODE_ENABLE_11B:
4213 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4214 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4215 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4216 break;
4217
4218 }
4219
4220 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4221
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304222 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004223 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304224 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4225 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004226 status = VOS_STATUS_E_FAILURE;
4227 goto done;
4228 }
c_hpothuffdb5272013-10-02 16:42:35 +05304229 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304230 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304231 if (0 >= ret )
4232 {
4233 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4234 FL(" wait on ftm_comp_var failed %ld"), ret);
4235 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004236
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304237 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004238 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304239 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4240 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004241 status = VOS_STATUS_E_FAILURE;
4242 goto done;
4243 }
4244 ftm_status.rxmode = rxmode ;
4245done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004246
4247 return status;
4248}
4249
4250/**---------------------------------------------------------------------------
4251
4252 \brief wlan_ftm_priv_rx_pkt_clear() -
4253
4254 This function sets the rx pkt count to zero.
4255
4256 \param - pAdapter - Pointer HDD Context.
4257 - rx_pkt_clear - rx_pkt_clear value.
4258
4259 \return - 0 for success, non zero for failure
4260
4261 --------------------------------------------------------------------------*/
4262
4263static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4264{
Jeff Johnson295189b2012-06-20 16:38:30 -07004265 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304266 long ret;
4267
Jeff Johnson295189b2012-06-20 16:38:30 -07004268 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4269
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304270 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004271 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304272 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4273 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004274 return VOS_STATUS_E_FAILURE;
4275 }
4276
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304277 if (NULL == pMsgBuf)
4278 {
4279 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4280 "%s:pMsgBuf is NULL", __func__);
4281 return VOS_STATUS_E_NOMEM;
4282 }
4283
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304284 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004285 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304286 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4287 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004288 return VOS_STATUS_E_FAILURE;
4289 }
4290
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304291 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004292 init_completion(&pHddCtx->ftm.ftm_comp_var);
4293 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304294 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004295
Jeff Johnson295189b2012-06-20 16:38:30 -07004296 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4297
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304298 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004299 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304300 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4301 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004302 status = VOS_STATUS_E_FAILURE;
4303 goto done;
4304 }
c_hpothuffdb5272013-10-02 16:42:35 +05304305 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304306 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304307 if (0 >= ret )
4308 {
4309 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4310 FL("wait on ftm_comp_var failed %ld"), ret);
4311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004312
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304313 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004314 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304315 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4316 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004317 status = VOS_STATUS_E_FAILURE;
4318 goto done;
4319 }
4320done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004321
4322 return status;
4323}
4324
4325/**---------------------------------------------------------------------------
4326
4327 \brief wlan_ftm_priv_get_channel() -
4328
4329 This function gets the channel number from the halphy ptt module and
4330 returns the channel number to the application.
4331
4332 \param - pAdapter - Pointer HDD Context.
4333 - pChannel - Poniter to get the Channel number.
4334
4335 \return - 0 for success, non zero for failure
4336
4337 --------------------------------------------------------------------------*/
4338
4339static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4340{
Jeff Johnson295189b2012-06-20 16:38:30 -07004341 uPttMsgs *pMsgBody;
4342 VOS_STATUS status;
4343 v_U16_t freq;
4344 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304345 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004346
4347 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304348 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004349 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304350 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4351 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004352 return VOS_STATUS_E_FAILURE;
4353 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304354
4355 if (NULL == pMsgBuf)
4356 {
4357 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4358 "%s:pMsgBuf is NULL", __func__);
4359 return VOS_STATUS_E_NOMEM;
4360 }
4361
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304362 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004363 init_completion(&pHddCtx->ftm.ftm_comp_var);
4364 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4365 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4366
4367 pMsgBody = &pMsgBuf->msgBody;
4368 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
Jeff Johnson295189b2012-06-20 16:38:30 -07004369 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4370
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304371 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004372 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304373 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4374 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004375 status = VOS_STATUS_E_FAILURE;
4376 goto done;
4377
4378 }
c_hpothuffdb5272013-10-02 16:42:35 +05304379 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304380 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304381 if (0 >= ret )
4382 {
4383 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4384 FL("wait on ftm_comp_var failed %ld"), ret);
4385 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004386
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304387 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304389 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4390 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004391 status = VOS_STATUS_E_FAILURE;
4392 goto done;
4393 }
4394
4395 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4396
4397 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4398 indx++;
4399 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4400 {
4401 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4402 status = VOS_STATUS_E_FAILURE;
4403 goto done;
4404 }
4405
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004406 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004407
Arif Hussain6d2a3322013-11-17 19:50:10 -08004408 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004409 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004410
4411 return status;
4412}
4413
4414/**---------------------------------------------------------------------------
4415
4416 \brief wlan_ftm_priv_get_txpower() -
4417
4418 This function gets the TX power from the halphy ptt module and
4419 returns the TX power to the application.
4420
4421 \param - pAdapter - Pointer HDD Context.
4422 - pTxPwr - Poniter to get the Tx power.
4423
4424 \return - 0 for success, non zero for failure
4425
4426 --------------------------------------------------------------------------*/
4427
4428static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4429{
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 uPttMsgs *pMsgBody;
4431 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304432 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004433 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4434
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304435 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004436 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304437 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4438 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004439 return VOS_STATUS_E_FAILURE;
4440 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304441
4442 if (NULL == pMsgBuf)
4443 {
4444 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4445 "%s:pMsgBuf is NULL", __func__);
4446 return VOS_STATUS_E_NOMEM;
4447 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304448 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004449 init_completion(&pHddCtx->ftm.ftm_comp_var);
4450 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4451 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4452
4453 pMsgBody = &pMsgBuf->msgBody;
4454
4455 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4456
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304457 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004458 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304459 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4460 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004461 status = VOS_STATUS_E_FAILURE;
4462 goto done;
4463 }
c_hpothuffdb5272013-10-02 16:42:35 +05304464 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304465 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304466 if (0 >= ret )
4467 {
4468 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4469 FL("wait on ftm_comp_var failed %ld"), ret);
4470 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004471
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304472 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004473 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304474 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4475 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004476 status = VOS_STATUS_E_FAILURE;
4477 goto done;
4478 }
4479 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4480
4481 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004482
4483 return status;
4484}
4485
4486/**---------------------------------------------------------------------------
4487
4488 \brief wlan_ftm_priv_get_ftm_version() -
4489
4490 This function gets ftm driver and firmware version.
4491
4492 \param - pAdapter - Pointer HDD Context.
4493 - pTxRate - Poniter to get the Tx rate.
4494
4495 \return - 0 for success, non zero for failure
4496
4497 --------------------------------------------------------------------------*/
4498
4499VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4500{
Jeff Johnson295189b2012-06-20 16:38:30 -07004501 uPttMsgs *pMsgBody;
4502 VOS_STATUS status;
4503 v_U32_t reg_val;
4504 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004505 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4506 int lenRes = 0;
4507 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304508 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004509
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304510 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004511 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304512 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4513 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004514 return VOS_STATUS_E_FAILURE;
4515 }
4516
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304517 if (NULL == pMsgBuf)
4518 {
4519 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4520 "%s:pMsgBuf is NULL", __func__);
4521 return VOS_STATUS_E_NOMEM;
4522 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304523 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004524 init_completion(&pHddCtx->ftm.ftm_comp_var);
4525 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4526 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4527
4528 pMsgBody = &pMsgBuf->msgBody;
4529 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4530
4531 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4532
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304533 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004534 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304535 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4536 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004537 status = VOS_STATUS_E_FAILURE;
4538 goto done;
4539
4540 }
c_hpothuffdb5272013-10-02 16:42:35 +05304541 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304542 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304543 if (0 >= ret )
4544 {
4545 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4546 FL("wait on ftm_comp_var failed %ld"), ret);
4547 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004548
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304549 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004550 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304551 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4552 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004553 status = VOS_STATUS_E_FAILURE;
4554 goto done;
4555 }
4556
4557 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4558
4559 init_completion(&pHddCtx->ftm.ftm_comp_var);
4560
4561 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4562 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4563
4564 pMsgBody = &pMsgBuf->msgBody;
4565
4566 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4567
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304568 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004569 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304570 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4571 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004572 status = VOS_STATUS_E_FAILURE;
4573 goto done;
4574 }
c_hpothuffdb5272013-10-02 16:42:35 +05304575 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304576 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304577 if (0 >= ret )
4578 {
4579 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4580 FL("wait on ftm_comp_var failed %ld"), ret);
4581 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004582
4583 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4584 if(lenRes < 0 || lenRes >= lenBuf)
4585 {
4586 status = VOS_STATUS_E_FAILURE;
4587 goto done;
4588 }
4589
4590 buf += lenRes;
4591 lenBuf -= lenRes;
4592
4593 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004594 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 -07004595 if(lenRes < 0 || lenRes >= lenBuf)
4596 {
4597 status = VOS_STATUS_E_FAILURE;
4598 goto done;
4599 }
4600
4601 buf += lenRes;
4602 lenBuf -= lenRes;
4603
4604 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4605 if(lenRes < 0 || lenRes >= lenBuf)
4606 {
4607 status = VOS_STATUS_E_FAILURE;
4608 goto done;
4609 }
4610
4611 buf += lenRes;
4612 lenBuf -= lenRes;
4613
Jeff Johnson295189b2012-06-20 16:38:30 -07004614
4615done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004616
4617 return status;
4618
4619}
4620
4621/**---------------------------------------------------------------------------
4622
4623 \brief wlan_ftm_priv_get_txrate() -
4624
4625 This function gets the TX rate from the halphy ptt module and
4626 returns the TX rate to the application.
4627
4628 \param - pAdapter - Pointer HDD Context.
4629 - pTxRate - Poniter to get the Tx rate.
4630
4631 \return - 0 for success, non zero for failure
4632
4633 --------------------------------------------------------------------------*/
4634
4635static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4636{
Jeff Johnson295189b2012-06-20 16:38:30 -07004637 uPttMsgs *pMsgBody;
4638 VOS_STATUS status;
4639 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304640 long ret;
4641
Jeff Johnson295189b2012-06-20 16:38:30 -07004642 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4643
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304644 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004645 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304646 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4647 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004648 return VOS_STATUS_E_FAILURE;
4649 }
4650
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304651 if (NULL == pMsgBuf)
4652 {
4653 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4654 "%s:pMsgBuf is NULL", __func__);
4655 return VOS_STATUS_E_NOMEM;
4656 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304657 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004658 init_completion(&pHddCtx->ftm.ftm_comp_var);
4659 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4660 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4661
4662 pMsgBody = &pMsgBuf->msgBody;
4663
4664 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4665
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304666 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004667 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304668 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4669 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004670 status = VOS_STATUS_E_FAILURE;
4671 goto done;
4672 }
c_hpothuffdb5272013-10-02 16:42:35 +05304673 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304674 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304675 if (0 >= ret )
4676 {
4677 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4678 FL("wait on ftm_comp_var failed %ld"), ret);
4679 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004680
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304681 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004682
4683 rate_index = pMsgBody->GetTxPowerReport.rate;
4684 }
4685 else {
4686 /*Return the default rate*/
4687 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304688 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4689 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004690 status = VOS_STATUS_E_FAILURE;
4691 goto done;
4692 }
4693
4694 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4695 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4696 break;
4697 }
4698 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4699 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004700 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004701 status = VOS_STATUS_E_FAILURE;
4702 goto done;
4703 }
4704 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4705done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004706
4707 return status;
4708
4709}
4710
4711/**---------------------------------------------------------------------------
4712
4713 \brief wlan_ftm_priv_get_rx_pkt_count() -
4714
4715 This function gets the rx pkt count from the halphy ptt module and
4716 returns the rx pkt count to the application.
4717
4718 \param - pAdapter - Pointer HDD Context.
4719 - pRxPktCnt - Poniter to get the rx pkt count.
4720
4721 \return - 0 for success, non zero for failure
4722
4723 --------------------------------------------------------------------------*/
4724
4725static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4726{
Jeff Johnson295189b2012-06-20 16:38:30 -07004727 uPttMsgs *pMsgBody;
4728 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304729 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004730 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4731
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304732 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004733 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304734 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4735 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004736 return VOS_STATUS_E_FAILURE;
4737 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304738
4739 if (NULL == pMsgBuf)
4740 {
4741 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4742 "%s:pMsgBuf is NULL", __func__);
4743 return VOS_STATUS_E_NOMEM;
4744 }
4745
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304746 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004747 init_completion(&pHddCtx->ftm.ftm_comp_var);
4748 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4749 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4750
4751 pMsgBody = &pMsgBuf->msgBody;
4752
4753 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4754
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304755 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004756 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304757 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4758 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004759 status = VOS_STATUS_E_FAILURE;
4760 goto done;
4761 }
c_hpothuffdb5272013-10-02 16:42:35 +05304762 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304763 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304764 if (0 >= ret )
4765 {
4766 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4767 FL("wait on ftm_comp_var failed %ld"), ret);
4768 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004769
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304770 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004771 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304772 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4773 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004774 status = VOS_STATUS_E_FAILURE;
4775 goto done;
4776 }
4777 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4778done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004779
4780 return status;
4781}
4782
4783/**---------------------------------------------------------------------------
4784
4785 \brief wlan_ftm_priv_get_rx_rssi() -
4786
4787 This function gets the rx rssi from the halphy ptt module and
4788 returns the rx rssi to the application.
4789
4790 \param - pAdapter - Pointer HDD Context.
4791 - buf - Poniter to get rssi of Rx chains
4792
4793 \return - 0 for success, non zero for failure
4794
4795 --------------------------------------------------------------------------*/
4796
4797static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4798{
Jeff Johnson295189b2012-06-20 16:38:30 -07004799 uPttMsgs *pMsgBody;
4800 VOS_STATUS status;
4801 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304802 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004803
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304804 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004805 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304806 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4807 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004808 return VOS_STATUS_E_FAILURE;
4809 }
Mahesh A Saptasagar72f383b2014-08-06 12:40:08 +05304810
4811 if (NULL == pMsgBuf)
4812 {
4813 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4814 "%s:pMsgBuf is NULL", __func__);
4815 return VOS_STATUS_E_NOMEM;
4816 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304817 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004818 init_completion(&pHddCtx->ftm.ftm_comp_var);
4819 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4820 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4821
4822 pMsgBody = &pMsgBuf->msgBody;
4823
4824 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4825
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304826 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004827 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304828 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4829 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004830 status = VOS_STATUS_E_FAILURE;
4831 goto done;
4832 }
c_hpothuffdb5272013-10-02 16:42:35 +05304833 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304834 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304835 if (0 >= ret )
4836 {
4837 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4838 FL("wait on ftm_comp_var failed %ld"), ret);
4839 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004840
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304841 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004842 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304843 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4844 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004845 status = VOS_STATUS_E_FAILURE;
4846 goto done;
4847 }
4848
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004849 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4850 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004851 pMsgBody->GetRxRssi.rssi.rx[1]);
4852
4853 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4854 {
4855 status = VOS_STATUS_E_FAILURE;
4856 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004857
Jeff Johnson295189b2012-06-20 16:38:30 -07004858done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004859
4860 return status;
4861}
4862
4863/**---------------------------------------------------------------------------
4864
4865 \brief wlan_ftm_priv_get_mac_address() -
4866
4867 This function gets the mac address from the halphy ptt module and
4868 returns the mac address to the application.
4869
4870 \param - pAdapter - Pointer HDD Context.
4871 - buf - Poniter to get the mac address.
4872
4873 \return - 0 for success, non zero for failure
4874
4875 --------------------------------------------------------------------------*/
4876
4877static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4878{
4879 v_BOOL_t itemIsValid = VOS_FALSE;
4880 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4881 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004882
Jeff Johnson295189b2012-06-20 16:38:30 -07004883 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4884
4885 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4886 {
4887 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4888 return VOS_STATUS_E_FAILURE;
4889 }
4890 /*Check the NV FIELD is valid or not*/
4891 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4892 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004893 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004894 {
4895 vos_nv_readMacAddress(macAddr);
4896
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004897 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4898 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004899 MAC_ADDR_ARRAY(macAddr));
4900 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4901 {
4902 return VOS_STATUS_E_FAILURE;
4903 }
4904 }
4905 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004906 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004907 {
4908 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004909 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4910 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004911 MAC_ADDR_ARRAY(macAddr));
4912
4913 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4914 {
4915 return VOS_STATUS_E_FAILURE;
4916 }
4917 }
4918 return VOS_STATUS_SUCCESS;
4919}
4920
4921/**---------------------------------------------------------------------------
4922
4923 \brief wlan_ftm_priv_set_mac_address() -
4924
4925 This function sets the mac address to the halphy ptt module and
4926 sends the netlink message to the ptt socket application which writes
4927 the macaddress to the qcom_wlan_nv.bin file
4928
4929 \param - pAdapter - Pointer HDD Context.
4930 - buf - Poniter to the macaddress.
4931
4932 \return - 0 for success, non zero for failure
4933
4934 --------------------------------------------------------------------------*/
4935
4936static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4937{
Jeff Johnson295189b2012-06-20 16:38:30 -07004938 uPttMsgs *pMsgBody;
4939 VOS_STATUS status;
4940 int macAddr[VOS_MAC_ADDRESS_LEN];
4941 v_U8_t *pMacAddress;
4942 v_U8_t ii;
4943 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304944 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004945
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304946 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004947 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304948 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4949 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004950 return VOS_STATUS_E_FAILURE;
4951 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304952 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004953 init_completion(&pHddCtx->ftm.ftm_comp_var);
4954 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4955 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4956
4957 pMsgBody = &pMsgBuf->msgBody;
4958 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4959
4960 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004961 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]))
4962 {
4963 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4964 "Invalid MacAddress Input %s", buf);
4965 return VOS_STATUS_E_FAILURE;
4966 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004967
Arif Hussain24bafea2013-11-15 15:10:03 -08004968 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4969 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004970
4971
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004972 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004973
4974 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4975 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4976
4977
Arif Hussain24bafea2013-11-15 15:10:03 -08004978 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4979 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004980 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4981
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304982 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004983 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304984 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4985 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004986 status = VOS_STATUS_E_FAILURE;
4987 goto done;
4988 }
c_hpothuffdb5272013-10-02 16:42:35 +05304989 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304990 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304991 if (0 >= ret )
4992 {
4993 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4994 FL("wait on ftm_comp_var failed %ld"), ret);
4995 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004996
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304997 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004998 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304999 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
5000 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005001 status = VOS_STATUS_E_FAILURE;
5002 goto done;
5003 }
5004
Arif Hussain6d2a3322013-11-17 19:50:10 -08005005 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07005006
5007 init_completion(&pHddCtx->ftm.ftm_comp_var);
5008 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
5009
5010 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
5011 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
5012
5013 pMsgBody = &pMsgBuf->msgBody;
5014
5015 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
5016
5017 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
5018
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305019 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07005020 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305021 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
5022 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005023 status = VOS_STATUS_E_FAILURE;
5024 goto done;
5025 }
5026
c_hpothuffdb5272013-10-02 16:42:35 +05305027 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305028 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05305029 if (0 >= ret )
5030 {
5031 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
5032 FL("wait on ftm_comp_var failed %ld"), ret);
5033 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005034done:
Jeff Johnson295189b2012-06-20 16:38:30 -07005035
5036 return VOS_STATUS_SUCCESS;
5037}
5038
5039/* set param sub-ioctls */
5040static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
5041 union iwreq_data *wrqu, char *extra)
5042{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005043 int ret,sub_cmd;
5044 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005045 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07005046 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005047 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07005048
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005049 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005050 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005051 length = wrqu->data.length;
5052 sub_cmd = wrqu->data.flags;
5053 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
5054
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005055 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
5056 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
5057 * odd number which assigns set_args to zero.we assisgn memory using
5058 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005059 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005060 param = kzalloc(length + 1, GFP_KERNEL);
5061 if (!param)
5062 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08005063
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005064 if (copy_from_user(param, pointer, length))
5065 {
5066 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
5067 "%s:Failed to get user data %s", __func__, param);
5068
5069 ret = -EINVAL;
5070 goto OUT;
5071 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005072
5073 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
5074 "%s: Received length %d", __func__, length);
5075
5076 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005077 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005078
5079 switch(sub_cmd)
5080 {
5081 case WE_SET_MAC_ADDRESS:
5082 {
5083
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005084 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005085 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07005086
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005087 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005088
5089 if(status != VOS_STATUS_SUCCESS)
5090 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005091 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005092 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005093
Jeff Johnson295189b2012-06-20 16:38:30 -07005094 ret = -EINVAL;
5095 }
5096
Wilson Yang7c471652013-12-20 16:36:44 -08005097 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005098 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005099 case WE_SET_TX_RATE:
5100 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005101 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005102
5103 if(status != VOS_STATUS_SUCCESS)
5104 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005105 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005106 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005107
5108 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005109 }
5110
5111 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005112 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005113 default:
5114 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005115 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005116 ret = -EINVAL;
5117 break;
5118 }
5119 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005120
5121OUT:
5122 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005123 return ret;
5124}
5125
5126static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5127 union iwreq_data *wrqu, char *extra)
5128{
5129 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5130 int *value = (int *)extra;
5131 int sub_cmd = value[0];
5132 int set_value = value[1];
5133 int ret = 0; /* success */
5134 VOS_STATUS status;
5135
5136 switch(sub_cmd)
5137 {
5138 case WE_FTM_ON_OFF:
5139 {
5140 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5141
5142 if(status != VOS_STATUS_SUCCESS)
5143 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005144 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005145 ret = -EINVAL;
5146 }
5147
5148 break;
5149 }
5150
5151 case WE_TX_PKT_GEN:
5152 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5153
5154 if(status != VOS_STATUS_SUCCESS)
5155 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005156 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005157 ret = -EINVAL;
5158 }
5159 break;
5160
5161 case WE_SET_TX_IFS:
5162 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5163
5164 if(status != VOS_STATUS_SUCCESS)
5165 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005166 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005167 ret = -EINVAL;
5168 }
5169 break;
5170
5171 case WE_SET_TX_PKT_CNT:
5172 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5173
5174 if(status != VOS_STATUS_SUCCESS)
5175 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005176 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005177 ret = -EINVAL;
5178 }
5179 break;
5180
5181 case WE_SET_TX_PKT_LEN:
5182 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5183
5184 if(status != VOS_STATUS_SUCCESS)
5185 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005186 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005187 ret = -EINVAL;
5188 }
5189 break;
5190
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305191 case WE_TX_CW_RF_GEN:
5192 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5193
5194 if(status != VOS_STATUS_SUCCESS)
5195 {
5196 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5197 ret = -EINVAL;
5198 }
5199 break;
5200
Jeff Johnson295189b2012-06-20 16:38:30 -07005201 case WE_SET_CHANNEL:
5202 {
5203 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5204
5205 if(status != VOS_STATUS_SUCCESS)
5206 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005207 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005208 ret = -EINVAL;
5209 }
5210 break;
5211 }
5212 case WE_SET_TX_POWER:
5213 {
5214 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5215
5216 if(status != VOS_STATUS_SUCCESS)
5217 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005218 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005219 ret = -EINVAL;
5220 }
5221 break;
5222 }
5223 case WE_CLEAR_RX_PKT_CNT:
5224 {
5225 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5226
5227 if(status != VOS_STATUS_SUCCESS)
5228 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005229 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005230 ret = -EINVAL;
5231 }
5232 break;
5233 }
5234 case WE_RX:
5235 {
5236 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5237
5238 if(status != VOS_STATUS_SUCCESS)
5239 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005240 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005241 ret = -EINVAL;
5242 }
5243 break;
5244 }
5245 case WE_ENABLE_CHAIN:
5246 {
5247 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5248
5249 if(status != VOS_STATUS_SUCCESS)
5250 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005251 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005252 ret = -EINVAL;
5253 }
5254 break;
5255 }
5256
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305257 case WE_SET_PWR_CNTL_MODE:
5258 {
5259 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5260 if (status != VOS_STATUS_SUCCESS)
5261 {
5262 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5263 status);
5264 ret = -EINVAL;
5265 }
5266 break;
5267 }
5268
5269 case WE_ENABLE_DPD:
5270 {
5271 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5272 if (status != VOS_STATUS_SUCCESS)
5273 {
5274 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5275 ret = -EINVAL;
5276 }
5277 break;
5278 }
5279
5280 case WE_SET_CB:
5281 {
5282 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5283 if (status != VOS_STATUS_SUCCESS)
5284 {
5285 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5286 ret = -EINVAL;
5287 }
5288 break;
5289 }
5290
Jeff Johnson295189b2012-06-20 16:38:30 -07005291 default:
5292 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005293 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005294 sub_cmd, set_value);
5295 break;
5296 }
5297 }
5298
5299 return ret;
5300}
5301
5302/* get param sub-ioctls */
5303static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5304 union iwreq_data *wrqu, char *extra)
5305{
5306 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5307 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005308 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005309 VOS_STATUS status;
5310
5311 switch (value[0])
5312 {
5313 case WE_GET_CHANNEL:
5314 {
5315 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
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_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005320 ret = -EINVAL;
5321 }
5322 break;
5323 }
5324 case WE_GET_TX_POWER:
5325 {
5326 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5327
5328 if(status != VOS_STATUS_SUCCESS)
5329 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005330 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005331 ret = -EINVAL;
5332 }
5333 break;
5334 }
5335 case WE_GET_RX_PKT_CNT:
5336 {
5337 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5338
5339 if(status != VOS_STATUS_SUCCESS)
5340 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005341 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005342 ret = -EINVAL;
5343 }
5344 break;
5345 }
5346 default:
5347 {
5348 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5349 break;
5350 }
5351 }
5352
5353 return ret;
5354}
5355
5356static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5357 union iwreq_data *wrqu, char *extra)
5358{
5359 int sub_cmd = wrqu->data.flags;
5360 VOS_STATUS status;
5361 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5362
5363 switch(sub_cmd)
5364 {
5365 case WE_GET_MAC_ADDRESS:
5366 {
5367 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5368
5369 if(status != VOS_STATUS_SUCCESS)
5370 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005371 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005372 return -EINVAL;
5373 }
5374 wrqu->data.length = strlen(extra)+1;
5375 break;
5376 }
5377 case WE_GET_TX_RATE:
5378 {
5379 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5380
5381 if(status != VOS_STATUS_SUCCESS)
5382 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005383 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 return -EINVAL;
5385 }
5386
5387 wrqu->data.length = strlen(extra)+1;
5388 break;
5389 }
5390 case WE_GET_FTM_VERSION:
5391 {
5392 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5393
5394 if(status != VOS_STATUS_SUCCESS)
5395 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005396 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005397 return -EINVAL;
5398 }
5399 wrqu->data.length = strlen(extra)+1;
5400 break;
5401 }
5402 case WE_GET_FTM_STATUS:
5403 {
5404 status = wlan_ftm_priv_get_status(pAdapter, extra);
5405
5406 if(status != VOS_STATUS_SUCCESS)
5407 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005408 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005409 return -EINVAL;
5410 }
5411
5412 wrqu->data.length = strlen(extra)+1;
5413 break;
5414 }
5415 case WE_GET_RX_RSSI:
5416 {
5417 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
5418
5419 if(status != VOS_STATUS_SUCCESS)
5420 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005421 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005422 return -EINVAL;
5423 }
5424
5425 wrqu->data.length = strlen(extra)+1;
5426 break;
5427 }
5428 default:
5429 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005430 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005431 break;
5432 }
5433 }
5434
5435 return 0;
5436}
Jeff Johnson295189b2012-06-20 16:38:30 -07005437
5438VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5439{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005440#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005441 tAniHdr *wmsg = NULL;
5442 v_U8_t *pBuf;
5443 hdd_context_t *pHddCtx = NULL;
5444 v_CONTEXT_t pVosContext= NULL;
5445
5446 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5447 if(pBuf == NULL)
5448 {
5449 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5450 return VOS_STATUS_E_NOMEM;
5451 }
5452 wmsg = (tAniHdr*)pBuf;
5453 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5454 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5455 wmsg->length = FTM_SWAP16(wmsg->length);
5456 pBuf += sizeof(tAniHdr);
5457
5458 /*Get the global context */
5459 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5460
5461 /*Get the Hdd Context */
5462 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5463 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5464
5465 /* EfS command Code */
5466 *(v_U32_t*)pBuf = 0x000000EF;
5467
5468 pBuf += sizeof(v_U32_t);
5469
5470 memcpy(pBuf, pData,data_len);
5471
5472 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305473 if( ptt_sock_send_msg_to_app(wmsg, 0,
5474 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005475
Arif Hussain6d2a3322013-11-17 19:50:10 -08005476 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 -07005477 vos_mem_free((v_VOID_t*)wmsg);
5478 return VOS_STATUS_E_FAILURE;
5479 }
5480 }
5481 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305482 if( ptt_sock_send_msg_to_app(wmsg, 0,
5483 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005484
Arif Hussain6d2a3322013-11-17 19:50:10 -08005485 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 -07005486 vos_mem_free((v_VOID_t*)wmsg);
5487 return VOS_STATUS_E_FAILURE;
5488 }
5489 }
5490
5491 vos_mem_free((v_VOID_t*)wmsg);
5492#endif //FTM and ANDROID
5493
5494 return VOS_STATUS_SUCCESS;
5495}
5496
Jeff Johnson295189b2012-06-20 16:38:30 -07005497/* action sub-ioctls */
5498static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5499 union iwreq_data *wrqu, char *extra)
5500{
5501 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005502 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005503
5504 switch (sub_cmd)
5505 {
5506 case WE_SET_NV_DEFAULTS:
5507 {
5508 v_U8_t *pu8buf,*pTempBuf;
5509 v_U16_t size;
5510 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005511 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005512 pu8buf = vos_mem_malloc(size);
5513 if(pu8buf == NULL)
5514 {
5515 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5516 return VOS_STATUS_E_NOMEM;
5517 }
5518 memset(pu8buf,0,size);
5519 pTempBuf = pu8buf;
5520 pTempBuf += sizeof(v_U32_t);
5521 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5522
5523 wlan_write_to_efs(pu8buf,size);
5524 vos_mem_free(pu8buf);
5525 }
5526
5527 default:
5528 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005529 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005530 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5531 break;
5532 }
5533 }
5534
5535 return ret;
5536}
5537
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305538static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5539 union iwreq_data *wrqu, char *extra)
5540{
5541 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5542 int sub_cmd = wrqu->data.flags;
5543 int *value = (int*)wrqu->data.pointer;
5544
5545 if(wrqu->data.length != 2)
5546 {
5547 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5548 return -EINVAL;
5549 }
5550 switch (sub_cmd)
5551 {
5552 case WE_SET_TX_WF_GAIN:
5553 {
5554 v_S15_t dGain = 0;
5555 v_U16_t rfGain = 0;
5556 VOS_STATUS status;
5557
5558 dGain = *(v_S15_t*) value++;
5559 rfGain = *(v_U16_t*) value;
5560 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5561
5562 if(status != VOS_STATUS_SUCCESS)
5563 {
5564 hddLog(VOS_TRACE_LEVEL_FATAL,
5565 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5566 return -EINVAL;
5567 }
5568 }
5569 break;
5570
5571 default:
5572 {
5573 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5574 break;
5575 }
5576 }
5577
5578 return 0;
5579}
5580
5581
Jeff Johnson295189b2012-06-20 16:38:30 -07005582static const iw_handler we_ftm_private[] = {
5583
5584 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5585 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5586 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5587 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5588 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305589 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005590};
5591
5592/*Maximum command length can be only 15 */
5593static const struct iw_priv_args we_ftm_private_args[] = {
5594
5595 /* handlers for main ioctl */
5596 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5597 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5598 0,
5599 "" },
5600
5601 { WE_FTM_ON_OFF,
5602 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5603 0,
5604 "ftm" },
5605
5606 { WE_TX_PKT_GEN,
5607 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5608 0,
5609 "tx" },
5610
5611 { WE_SET_TX_IFS,
5612 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5613 0,
5614 "set_txifs" },
5615
5616 { WE_SET_TX_PKT_CNT,
5617 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5618 0,
5619 "set_txpktcnt" },
5620
5621 { WE_SET_TX_PKT_LEN,
5622 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5623 0,
5624 "set_txpktlen" },
5625
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305626 { WE_SET_TX_WF_GAIN,
5627 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5628 0,
5629 "set_tx_wf_gain" },
5630
5631 { WE_TX_CW_RF_GEN,
5632 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5633 0,
5634 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005635 { WE_SET_CHANNEL,
5636 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5637 0,
5638 "set_channel" },
5639
5640 { WE_SET_TX_POWER,
5641 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5642 0,
5643 "set_txpower" },
5644
5645 { WE_CLEAR_RX_PKT_CNT,
5646 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5647 0,
5648 "clr_rxpktcnt" },
5649
5650 { WE_RX,
5651 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5652 0,
5653 "rx" },
5654
5655 { WE_ENABLE_CHAIN,
5656 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5657 0,
5658 "ena_chain" },
5659
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305660 { WE_SET_PWR_CNTL_MODE,
5661 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5662 0,
5663 "pwr_cntl_mode" },
5664
5665 { WE_ENABLE_DPD,
5666 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5667 0,
5668 "ena_dpd" },
5669
5670 { WE_SET_CB,
5671 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5672 0,
5673 "set_cb" },
5674
Jeff Johnson295189b2012-06-20 16:38:30 -07005675 /* handlers for main ioctl */
5676 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5677 0,
5678 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5679 "" },
5680
5681 { WE_GET_CHANNEL,
5682 0,
5683 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5684 "get_channel" },
5685
5686 { WE_GET_TX_POWER,
5687 0,
5688 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5689 "get_txpower" },
5690
5691 { WE_GET_RX_PKT_CNT,
5692 0,
5693 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5694 "get_rxpktcnt" },
5695
5696 /* handlers for main ioctl */
5697 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5698 IW_PRIV_TYPE_CHAR| 512,
5699 0,
5700 "" },
5701
5702 { WE_SET_MAC_ADDRESS,
5703 IW_PRIV_TYPE_CHAR| 512,
5704 0,
5705 "set_mac_address" },
5706
5707 { WE_SET_TX_RATE,
5708 IW_PRIV_TYPE_CHAR | 512,
5709 0,
5710 "set_txrate" },
5711
5712 /* handlers for main ioctl */
5713 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5714 0,
5715 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5716 "" },
5717
5718 { WE_GET_MAC_ADDRESS,
5719 0,
5720 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5721 "get_mac_address" },
5722
5723 { WE_GET_FTM_VERSION,
5724 0,
5725 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5726 "ftm_version" },
5727
5728 { WE_GET_TX_RATE,
5729 0,
5730 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5731 "get_txrate" },
5732
5733 { WE_GET_FTM_STATUS,
5734 0,
5735 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5736 "get_status" },
5737
5738 { WE_GET_RX_RSSI,
5739 0,
5740 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5741 "get_rx_rssi" },
5742
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305743 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5744 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5745 0,
5746 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005747 /* handlers for main ioctl */
5748 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5749 0,
5750 0,
5751 "" },
5752
5753 /* handlers for sub-ioctl */
5754 { WE_SET_NV_DEFAULTS,
5755 0,
5756 0,
5757 "set_nv_defaults" },
5758
5759};
5760
5761const struct iw_handler_def we_ftm_handler_def = {
5762 .num_standard = 0,
5763 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5764 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5765
5766 .standard = (iw_handler *)NULL,
5767 .private = (iw_handler *)we_ftm_private,
5768 .private_args = we_ftm_private_args,
5769 .get_wireless_stats = NULL,
5770};
5771
5772static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5773{
5774
5775 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5776
5777 // Zero the memory. This zeros the profile structure.
5778 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005779
Jeff Johnson295189b2012-06-20 16:38:30 -07005780 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5781
5782 return 0;
5783}
5784
Jeff Johnson295189b2012-06-20 16:38:30 -07005785
5786VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5787{
Jeff Johnson295189b2012-06-20 16:38:30 -07005788 ftm_rsp_msg_t *pFtmMsgRsp;
5789
5790 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5791 hdd_context_t *pHddCtx;
5792 v_CONTEXT_t pVosContext= NULL;
5793
5794 ENTER();
5795
5796 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5797
5798 if (!message )
5799 {
5800 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5801 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5802 return VOS_STATUS_E_INVAL;
5803 }
5804 /*Get the global context */
5805 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5806
5807 /*Get the Hdd Context */
5808 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5809
5810 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5811
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305812 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005813 complete(&pHddCtx->ftm.ftm_comp_var);
5814 }
5815 else {
5816 /*Response length to Ptt App*/
5817 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5818
5819 /*Ptt App expects the response length in LE */
5820 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5821
5822 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005823 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005824 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5825
5826 /*Copy the message*/
5827 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5828
5829 /*Update the error code*/
5830 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5831
5832 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5833
5834 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5835 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005836 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005837 return VOS_STATUS_E_FAILURE;
5838 }
5839 }
5840 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005841 return VOS_STATUS_SUCCESS;
5842
5843}