blob: 8ca21e7002980adc989a8ab74d7fbffa5c5da60f [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam842dad02014-02-18 18:44:02 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/**========================================================================
29
30 \file wlan_hdd_ftm.c
31
32 \brief This file contains the WLAN factory test mode implementation
33
34 Copyright 2008 (c) Qualcomm, Incorporated. All Rights Reserved.
35
36 Qualcomm Confidential and Proprietary.
37
38 ========================================================================*/
39
40/**=========================================================================
41
42 EDIT HISTORY FOR FILE
43
44
45 This section contains comments describing changes made to the module.
46 Notice that changes are listed in reverse chronological order.
47
48
49 $Header:$ $DateTime: $ $Author: $
50
51
52 when who what, where, why
53 -------- --- --------------------------------------------------------
54 04/20/11 Leo/Henri Convergence for Prima and Volans. Single image
55 for FTM and mission mode
56 04/5/09 Shailender Created module.
57
58 ==========================================================================*/
59#include <vos_mq.h>
60#include "vos_sched.h"
61#include <vos_api.h>
62#include "sirTypes.h"
63#include "halTypes.h"
64#include "sirApi.h"
65#include "sirMacProtDef.h"
66#include "sme_Api.h"
67#include "macInitApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070068#include "wlan_qct_sys.h"
69#include "wlan_qct_tl.h"
70#include "wlan_hdd_misc.h"
71#include "i_vos_packet.h"
72#include "vos_nvitem.h"
73#include "wlan_hdd_main.h"
74#include "vos_power.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070075#include "qwlan_version.h"
76
Jeff Johnson295189b2012-06-20 16:38:30 -070077#include "wlan_nv.h"
78#include "wlan_qct_wda.h"
79#include "cfgApi.h"
80#include "pttMsgApi.h"
81#include "wlan_qct_pal_device.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070082
Jeff Johnson295189b2012-06-20 16:38:30 -070083#define RXMODE_DISABLE_ALL 0
84#define RXMODE_ENABLE_ALL 1
85#define RXMODE_ENABLE_11GN 2
86#define RXMODE_ENABLE_11B 3
87
88#define FTM_CHAIN_SEL_NO_RX_TX 0
89#define FTM_CHAIN_SEL_R0_ON 1
90#define FTM_CHAIN_SEL_T0_ON 2
91#define FTM_CHAIN_SEL_R0_T0_ON 3
92#define FTM_CHAIN_SEL_MAX 3
93
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +053094#define WCNSS_TXFIR_OFFSET 0x00018000
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096#ifndef QWLAN_PHYDBG_BASE
97#define QWLAN_PHYDBG_BASE 0x03004000
98#endif /* QWLAN_PHYDBG_BASE */
99
100#ifndef QWLAN_PHYDBG_TXPKT_CNT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800101#define QWLAN_PHYDBG_TXPKT_CNT_REG (QWLAN_PHYDBG_BASE + 0x6C)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102#define QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK 0xFFFF
103#endif
104
105#ifndef QWLAN_AGC_BASE
106#define QWLAN_AGC_BASE 0x03013C00
107#endif /* QWLAN_AGC_BASE */
108
109#ifndef QWLAN_AGC_CHANNEL_FREQ_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800110#define QWLAN_AGC_CHANNEL_FREQ_REG (QWLAN_AGC_BASE + 0x34)
Jeff Johnson295189b2012-06-20 16:38:30 -0700111#define QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK 0x1FFF
112#endif /* QWLAN_AGC_CHANNEL_FREQ_REG */
113
114#ifndef QWLAN_AGC_SUBBAND_CONFIG_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800115#define QWLAN_AGC_SUBBAND_CONFIG_REG (QWLAN_AGC_BASE + 0x30)
Jeff Johnson295189b2012-06-20 16:38:30 -0700116#define QWLAN_AGC_SUBBAND_CONFIG_STG2_SUBBAND_MASK 0x03
117#endif /* QWLAN_AGC_SUBBAND_CONFIG_REG */
118
119#ifndef QWLAN_RFAPB_BASE
120#define QWLAN_RFAPB_BASE 0x0E02F800
121#endif /* QWLAN_RFAPB_BASE */
122
123#ifndef QWLAN_RFAPB_REV_ID_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800124#define QWLAN_RFAPB_REV_ID_REG (QWLAN_RFAPB_BASE + 0x00)
Jeff Johnson295189b2012-06-20 16:38:30 -0700125#endif /* QWLAN_RFAPB_REV_ID_REG */
126
127#ifndef QWLAN_TXCTL_BASE
128#define QWLAN_TXCTL_BASE 0x03012000
129#endif /* QWLAN_TXCTL_BASE */
130
131#ifndef QWLAN_TXCTL_FSHIFT_REG
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -0800132#define QWLAN_TXCTL_FSHIFT_REG (QWLAN_TXCTL_BASE + 0x20)
Jeff Johnson295189b2012-06-20 16:38:30 -0700133#define QWLAN_TXCTL_FSHIFT_BW14_OFFSET 0x02
134#define QWLAN_TXCTL_FSHIFT_BW14_MASK 0x1C
135#define QWLAN_TXCTL_FSHIFT_BW12_OFFSET 0x00
136#define QWLAN_TXCTL_FSHIFT_BW12_MASK 0x03
137#endif /* QWLAN_TXCTL_FSHIFT_REG */
138
139/* To set 4MAC addresses from given first MAC address,
140 * Last byte value within given MAC address must less than 0xFF - 3 */
141#define QWLAN_MAX_MAC_LAST_BYTE_VALUE 0xFC
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700142#define NV_EMBEDDED_VERSION 0x80
Jeff Johnson295189b2012-06-20 16:38:30 -0700143
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530144#define QWLAN_TXFIR_CFG_DPD_BYPASS_MASK 0x8
145
Jeff Johnson295189b2012-06-20 16:38:30 -0700146typedef struct {
147 tANI_U32 tableSize; /* Whole NV Table Size */
148 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
149 eNvTable nvTable;
150 tANI_U8 tableData; /* Filled by host driver */
151} pttGetNvTable;
152
153typedef struct {
154 tANI_U32 tableSize; /* Whole NV Table Size */
155 tANI_U32 chunkSize; /* Current Chunk Size < 2K */
156 eNvTable nvTable;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700157 tANI_U8 tableData;
Jeff Johnson295189b2012-06-20 16:38:30 -0700158} pttSetNvTable;
159
Jeff Johnson295189b2012-06-20 16:38:30 -0700160
161extern const sHalNv nvDefaults;
162static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter);
Leo Chang4e8183f2013-05-31 15:38:34 -0700163static int wlan_ftm_stop(hdd_context_t *pHddCtx);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700164VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700165
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700166/* for PRIMA: all the available frequency, channal pair i the table are defined for channel frequency @ RF center frequency
Jeff Johnson295189b2012-06-20 16:38:30 -0700167 Since it is associated to agc.channel_freq register for mapping.
168 For channel bonding, the channel number is +2 or -2 for CB with primary high, or with primary low respectively.
169*/
170static const freq_chan_t freq_chan_tbl[] = {
171 {2412, 1}, {2417, 2},{2422, 3}, {2427, 4}, {2432, 5}, {2437, 6}, {2442, 7},
172 {2447, 8}, {2452, 9},{2457, 10},{2462, 11},{2467 ,12},{2472, 13},{2484, 14}
173};
174
175static rateStr2rateIndex_t rateName_rateIndex_tbl[] =
176{
177 { HAL_PHY_RATE_11B_LONG_1_MBPS, "11B_LONG_1_MBPS"},
178 { HAL_PHY_RATE_11B_LONG_2_MBPS, "11B_LONG_2_MBPS"},
179 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, "11B_LONG_5_5_MBPS"},
180 { HAL_PHY_RATE_11B_LONG_11_MBPS, "11B_LONG_11_MBPS"},
181 { HAL_PHY_RATE_11B_SHORT_2_MBPS, "11B_SHORT_2_MBPS"},
182 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, "11B_SHORT_5_5_MBPS"},
183 { HAL_PHY_RATE_11B_SHORT_11_MBPS, "11B_SHORT_11_MBPS"},
184 //Spica_Virgo 11A 20MHz Rates
185 { HAL_PHY_RATE_11A_6_MBPS, "11A_6_MBPS"},
186 { HAL_PHY_RATE_11A_9_MBPS, "11A_9_MBPS"},
187 { HAL_PHY_RATE_11A_12_MBPS, "11A_12_MBPS"},
188 { HAL_PHY_RATE_11A_18_MBPS, "11A_18_MBPS"},
189 { HAL_PHY_RATE_11A_24_MBPS, "11A_24_MBPS"},
190 { HAL_PHY_RATE_11A_36_MBPS, "11A_36_MBPS"},
191 { HAL_PHY_RATE_11A_48_MBPS, "11A_48_MBPS"},
192 { HAL_PHY_RATE_11A_54_MBPS, "11A_54_MBPS"},
193
194//MCS Index #0-15 (20MHz)
195 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, "MCS_6_5_MBPS"},
196 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, "MCS_13_MBPS"},
197 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, "MCS_19_5_MBPS"},
198 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, "MCS_26_MBPS"},
199 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, "MCS_39_MBPS"},
200 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, "MCS_52_MBPS"},
201 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, "MCS_58_5_MBPS"},
202 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, "MCS_65_MBPS"},
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530203 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, "MCS_SG_7_2_MBPS"},
204 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS, "MCS_SG_14_4_MBPS"},
205 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS, "MCS_SG_21_7_MBPS"},
206 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS, "MCS_SG_28_9_MBPS"},
207 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS, "MCS_SG_43_3_MBPS"},
208 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS, "MCS_SG_57_8_MBPS"},
209 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, "MCS_SG_65_MBPS"},
210 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, "MCS_SG_72_2_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530211
212//MCS Index #8-15 (40MHz)
213
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530214 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, "MCS_CB_13_5_MBPS" },
215 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, "MCS_CB_27_MBPS" },
216 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, "MCS_CB_40_5_MBPS" },
217 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, "MCS_CB_54_MBPS"},
218 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, "MCS_CB_81_MBPS"},
219 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, "MCS_CB_108_MBPS"},
220 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, "MCS_CB_121_5_MBPS"},
221 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, "MCS_CB_135_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530222 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, "MCS_CB_15_MBPS"},
223 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, "MCS_CB_30_MBPS"},
224 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, "MCS_CB_45_MBPS"},
225 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, "MCS_CB_60_MBPS"},
226 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, "MCS_CB_90_MBPS"},
227 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, "MCS_CB_120_MBPS"},
228 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, "MCS_CB_135_MBPS"},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800229 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, "MCS_CB_150_MBPS"},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530230
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800231#ifdef WLAN_FEATURE_11AC
232 /*11AC rate 20MHZ Normal GI*/
233 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, "MCS_VHT20_NGI_6_5_MBPS"},
234 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, "MCS_VHT20_NGI_13_MBPS"},
235 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,"MCS_VHT20_NGI_19_5_MBPS"},
236 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, "MCS_VHT20_NGI_26_MBPS"},
237 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, "MCS_VHT20_NGI_39_MBPS"},
238 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, "MCS_VHT20_NGI_52_MBPS"},
239 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,"MCS_VHT20_NGI_58_5_MBPS"},
240 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, "MCS_VHT20_NGI_65_MBPS"},
241 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, "MCS_VHT20_NGI_78_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530242#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800243 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,"MCS_VHT20_NGI_86_5_MBPS"},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530244#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800245
246 /*11AC rate 20MHZ Short GI*/
247 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, "MCS_VHT20_SGI_7_2_MBPS"},
248 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,"MCS_VHT20_SGI_14_4_MBPS"},
249 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,"MCS_VHT20_SGI_21_6_MBPS"},
250 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,"MCS_VHT20_SGI_28_8_MBPS"},
251 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,"MCS_VHT20_SGI_43_3_MBPS"},
252 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,"MCS_VHT20_SGI_57_7_MBPS"},
253 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, "MCS_VHT20_SGI_65_MBPS"},
254 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,"MCS_VHT20_SGI_72_2_MBPS"},
255 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,"MCS_VHT20_SGI_86_6_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530256#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800257 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,"MCS_VHT20_SGI_96_1_MBPS"},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530258#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800259
260 /*11AC rates 40MHZ normal GI*/
261 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS,
262 "MCS_VHT40_NGI_CB_13_5_MBPS"},
263 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS,
264 "MCS_VHT40_NGI_CB_27_MBPS"},
265 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS,
266 "MCS_VHT40_NGI_CB_40_5_MBPS"},
267 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS,
268 "MCS_VHT40_NGI_CB_54_MBPS"},
269 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS,
270 "MCS_VHT40_NGI_CB_81_MBPS"},
271 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS,
272 "MCS_VHT40_NGI_CB_108_MBPS"},
273 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,
274 "MCS_VHT40_NGI_CB_121_5_MBPS"},
275 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS,
276 "MCS_VHT40_NGI_CB_135_MBPS"},
277 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS,
278 "MCS_VHT40_NGI_CB_162_MBPS"},
279 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS,
280 "MCS_VHT40_NGI_CB_180_MBPS"},
281
282 /*11AC rates 40MHZ short GI*/
283 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS,
284 "MCS_VHT40_SGI_CB_15_MBPS"},
285 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS,
286 "MCS_VHT40_SGI_CB_30_MBPS"},
287 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS,
288 "MCS_VHT40_SGI_CB_45_MBPS"},
289 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS,
290 "MCS_VHT40_SGI_CB_60_MBPS"},
291 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS,
292 "MCS_VHT40_SGI_CB_90_MBPS"},
293 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,
294 "MCS_VHT40_SGI_CB_120_MBPS"},
295 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,
296 "MCS_VHT40_SGI_CB_135_MBPS"},
297 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,
298 "MCS_VHT40_SGI_CB_150_MBPS"},
299 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,
300 "MCS_VHT40_SGI_CB_180_MBPS"},
301 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,
302 "MCS_VHT40_SGI_CB_200_MBPS"},
303
304 /*11AC rates 80 MHZ normal GI*/
305 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS,
306 "MCS_VHT80_NGI_CB_29_3_MBPS"},
307 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS,
308 "MCS_VHT80_NGI_CB_58_5_MBPS"},
309 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS,
310 "MCS_VHT80_NGI_CB_87_8_MBPS"},
311 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS,
312 "MCS_VHT80_NGI_CB_117_MBPS"},
313 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,
314 "MCS_VHT80_NGI_CB_175_5_MBPS"},
315 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS,
316 "MCS_VHT80_NGI_CB_234_MBPS"},
317 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,
318 "MCS_VHT80_NGI_CB_263_3_MBPS"},
319 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,
320 "MCS_VHT80_NGI_CB_292_5_MBPS"},
321 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS,
322 "MCS_VHT80_NGI_CB_351_MBPS"},
323 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS,
324 "MCS_VHT80_NGI_CB_390_MBPS"},
325
326 /*11AC rates 80 MHZ short GI*/
327 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS,
328 "MCS_VHT80_SGI_CB_32_5_MBPS"},
329 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS,
330 "MCS_VHT80_SGI_CB_65_MBPS"},
331 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS,
332 "MCS_VHT80_SGI_CB_97_5_MBPS"},
333 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS,
334 "MCS_VHT80_SGI_CB_130_MBPS"},
335 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS,
336 "MCS_VHT80_SGI_CB_195_MBPS"},
337 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS,
338 "MCS_VHT80_SGI_CB_260_MBPS"},
339 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,
340 "MCS_VHT80_SGI_CB_292_5_MBPS"},
341 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS,
342 "MCS_VHT80_SGI_CB_325_MBPS"},
343 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS,
344 "MCS_VHT80_SGI_CB_390_MBPS"},
345 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,
346 "MCS_VHT80_SGI_CB_433_3_MBPS"},
347#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700348};
349
350static rateIndex2Preamble_t rate_index_2_preamble_table[] =
351{
352
353 { HAL_PHY_RATE_11B_LONG_1_MBPS, PHYDBG_PREAMBLE_LONGB},
354 { HAL_PHY_RATE_11B_LONG_2_MBPS, PHYDBG_PREAMBLE_LONGB},
355 { HAL_PHY_RATE_11B_LONG_5_5_MBPS, PHYDBG_PREAMBLE_LONGB},
356 { HAL_PHY_RATE_11B_LONG_11_MBPS, PHYDBG_PREAMBLE_LONGB},
357 { HAL_PHY_RATE_11B_SHORT_2_MBPS, PHYDBG_PREAMBLE_SHORTB},
358 { HAL_PHY_RATE_11B_SHORT_5_5_MBPS, PHYDBG_PREAMBLE_SHORTB},
359 { HAL_PHY_RATE_11B_SHORT_11_MBPS, PHYDBG_PREAMBLE_SHORTB},
360
Jeff Johnson295189b2012-06-20 16:38:30 -0700361
362 //Spica_Virgo 11A 20MHz Rates
363 { HAL_PHY_RATE_11A_6_MBPS, PHYDBG_PREAMBLE_OFDM},
364 { HAL_PHY_RATE_11A_9_MBPS, PHYDBG_PREAMBLE_OFDM},
365 { HAL_PHY_RATE_11A_12_MBPS, PHYDBG_PREAMBLE_OFDM},
366 { HAL_PHY_RATE_11A_18_MBPS, PHYDBG_PREAMBLE_OFDM},
367 { HAL_PHY_RATE_11A_24_MBPS, PHYDBG_PREAMBLE_OFDM},
368 { HAL_PHY_RATE_11A_36_MBPS, PHYDBG_PREAMBLE_OFDM},
369 { HAL_PHY_RATE_11A_48_MBPS, PHYDBG_PREAMBLE_OFDM},
370 { HAL_PHY_RATE_11A_54_MBPS, PHYDBG_PREAMBLE_OFDM},
371
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530372 // 11A 20MHz Rates
373 { HAL_PHY_RATE_11A_DUP_6_MBPS, PHYDBG_PREAMBLE_OFDM},
374 { HAL_PHY_RATE_11A_DUP_9_MBPS, PHYDBG_PREAMBLE_OFDM},
375 { HAL_PHY_RATE_11A_DUP_12_MBPS, PHYDBG_PREAMBLE_OFDM},
376 { HAL_PHY_RATE_11A_DUP_18_MBPS, PHYDBG_PREAMBLE_OFDM},
377 { HAL_PHY_RATE_11A_DUP_24_MBPS, PHYDBG_PREAMBLE_OFDM},
378 { HAL_PHY_RATE_11A_DUP_36_MBPS, PHYDBG_PREAMBLE_OFDM},
379 { HAL_PHY_RATE_11A_DUP_48_MBPS, PHYDBG_PREAMBLE_OFDM},
380 { HAL_PHY_RATE_11A_DUP_54_MBPS, PHYDBG_PREAMBLE_OFDM},
381
Jeff Johnson295189b2012-06-20 16:38:30 -0700382 //MCS Index #0-15 (20MHz)
383 { HAL_PHY_RATE_MCS_1NSS_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
384 { HAL_PHY_RATE_MCS_1NSS_13_MBPS, PHYDBG_PREAMBLE_MIXED},
385 { HAL_PHY_RATE_MCS_1NSS_19_5_MBPS, PHYDBG_PREAMBLE_MIXED},
386 { HAL_PHY_RATE_MCS_1NSS_26_MBPS, PHYDBG_PREAMBLE_MIXED},
387 { HAL_PHY_RATE_MCS_1NSS_39_MBPS, PHYDBG_PREAMBLE_MIXED},
388 { HAL_PHY_RATE_MCS_1NSS_52_MBPS, PHYDBG_PREAMBLE_MIXED},
389 { HAL_PHY_RATE_MCS_1NSS_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
390 { HAL_PHY_RATE_MCS_1NSS_65_MBPS, PHYDBG_PREAMBLE_MIXED},
391 { HAL_PHY_RATE_MCS_1NSS_MM_SG_7_2_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
392 { HAL_PHY_RATE_MCS_1NSS_MM_SG_14_4_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
393 { HAL_PHY_RATE_MCS_1NSS_MM_SG_21_7_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
394 { HAL_PHY_RATE_MCS_1NSS_MM_SG_28_9_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
395 { HAL_PHY_RATE_MCS_1NSS_MM_SG_43_3_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
396 { HAL_PHY_RATE_MCS_1NSS_MM_SG_57_8_MBPS,PHYDBG_PREAMBLE_NOT_SUPPORTED},
397 { HAL_PHY_RATE_MCS_1NSS_MM_SG_65_MBPS, PHYDBG_PREAMBLE_NOT_SUPPORTED},
398 { HAL_PHY_RATE_MCS_1NSS_MM_SG_72_2_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530399
400 //MCS index (40MHz)
401 { HAL_PHY_RATE_MCS_1NSS_CB_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
402 { HAL_PHY_RATE_MCS_1NSS_CB_27_MBPS, PHYDBG_PREAMBLE_MIXED},
403 { HAL_PHY_RATE_MCS_1NSS_CB_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
404 { HAL_PHY_RATE_MCS_1NSS_CB_54_MBPS, PHYDBG_PREAMBLE_MIXED},
405 { HAL_PHY_RATE_MCS_1NSS_CB_81_MBPS, PHYDBG_PREAMBLE_MIXED},
406 { HAL_PHY_RATE_MCS_1NSS_CB_108_MBPS, PHYDBG_PREAMBLE_MIXED},
407 { HAL_PHY_RATE_MCS_1NSS_CB_121_5_MBPS, PHYDBG_PREAMBLE_MIXED},
408 { HAL_PHY_RATE_MCS_1NSS_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
409 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_15_MBPS, PHYDBG_PREAMBLE_MIXED},
410 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_30_MBPS, PHYDBG_PREAMBLE_MIXED},
411 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_45_MBPS, PHYDBG_PREAMBLE_MIXED},
412 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_60_MBPS, PHYDBG_PREAMBLE_MIXED},
413 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_90_MBPS, PHYDBG_PREAMBLE_MIXED},
414 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_120_MBPS, PHYDBG_PREAMBLE_MIXED},
415 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_135_MBPS, PHYDBG_PREAMBLE_MIXED},
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800416 { HAL_PHY_RATE_MCS_1NSS_MM_SG_CB_150_MBPS, PHYDBG_PREAMBLE_MIXED},
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530417
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800418#ifdef WLAN_FEATURE_11AC
419 /*11AC rate 20MHZ Normal GI*/
420 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_6_5_MBPS, PHYDBG_PREAMBLE_MIXED},
421 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_13_MBPS, PHYDBG_PREAMBLE_MIXED},
422 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_19_5_MBPS,PHYDBG_PREAMBLE_MIXED},
423 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_26_MBPS, PHYDBG_PREAMBLE_MIXED},
424 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_39_MBPS, PHYDBG_PREAMBLE_MIXED},
425 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_52_MBPS, PHYDBG_PREAMBLE_MIXED},
426 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_58_5_MBPS,PHYDBG_PREAMBLE_MIXED},
427 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
428 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_78_MBPS, PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530429#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800430 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_NGI_86_5_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilladf677e42014-02-17 01:07:24 +0530431#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800432 /*11AC rate 20MHZ Short GI*/
433 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_7_2_MBPS, PHYDBG_PREAMBLE_MIXED},
434 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_14_4_MBPS,PHYDBG_PREAMBLE_MIXED},
435 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_21_6_MBPS,PHYDBG_PREAMBLE_MIXED},
436 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_28_8_MBPS,PHYDBG_PREAMBLE_MIXED},
437 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_43_3_MBPS,PHYDBG_PREAMBLE_MIXED},
438 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_57_7_MBPS,PHYDBG_PREAMBLE_MIXED},
439 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
440 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_72_2_MBPS,PHYDBG_PREAMBLE_MIXED},
441 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_86_6_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530442#ifdef WCN_PRONTO
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800443 { HAL_PHY_RATE_VHT_20MHZ_MCS_1NSS_SGI_96_1_MBPS,PHYDBG_PREAMBLE_MIXED},
Sandeep Puligilla9b446642014-02-18 00:23:52 +0530444#endif
Manjunathappa Prakashef60acb2013-12-10 10:03:43 -0800445
446 /*11AC rates 40MHZ normal GI*/
447 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_13_5_MBPS, PHYDBG_PREAMBLE_MIXED},
448 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_27_MBPS, PHYDBG_PREAMBLE_MIXED},
449 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_40_5_MBPS, PHYDBG_PREAMBLE_MIXED},
450 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_54_MBPS, PHYDBG_PREAMBLE_MIXED},
451 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_81_MBPS, PHYDBG_PREAMBLE_MIXED},
452 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_108_MBPS, PHYDBG_PREAMBLE_MIXED},
453 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_121_5_MBPS,PHYDBG_PREAMBLE_MIXED},
454 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_135_MBPS, PHYDBG_PREAMBLE_MIXED},
455 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_162_MBPS, PHYDBG_PREAMBLE_MIXED},
456 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_NGI_180_MBPS, PHYDBG_PREAMBLE_MIXED},
457
458 /*11AC rates 40MHZ short GI*/
459 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_15_MBPS, PHYDBG_PREAMBLE_MIXED},
460 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_30_MBPS, PHYDBG_PREAMBLE_MIXED},
461 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_45_MBPS, PHYDBG_PREAMBLE_MIXED},
462 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_60_MBPS, PHYDBG_PREAMBLE_MIXED},
463 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_90_MBPS, PHYDBG_PREAMBLE_MIXED},
464 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_120_MBPS,PHYDBG_PREAMBLE_MIXED},
465 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_135_MBPS,PHYDBG_PREAMBLE_MIXED},
466 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_150_MBPS,PHYDBG_PREAMBLE_MIXED},
467 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_180_MBPS,PHYDBG_PREAMBLE_MIXED},
468 { HAL_PHY_RATE_VHT_40MHZ_MCS_1NSS_CB_SGI_200_MBPS,PHYDBG_PREAMBLE_MIXED},
469
470 /*11AC rates 80 MHZ normal GI*/
471 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_29_3_MBPS, PHYDBG_PREAMBLE_MIXED},
472 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_58_5_MBPS, PHYDBG_PREAMBLE_MIXED},
473 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_87_8_MBPS, PHYDBG_PREAMBLE_MIXED},
474 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_117_MBPS, PHYDBG_PREAMBLE_MIXED},
475 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_175_5_MBPS,PHYDBG_PREAMBLE_MIXED},
476 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_234_MBPS, PHYDBG_PREAMBLE_MIXED},
477 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_263_3_MBPS,PHYDBG_PREAMBLE_MIXED},
478 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
479 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_351_MBPS, PHYDBG_PREAMBLE_MIXED},
480 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_NGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
481
482 /*11AC rates 80 MHZ short GI*/
483 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_32_5_MBPS, PHYDBG_PREAMBLE_MIXED},
484 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_65_MBPS, PHYDBG_PREAMBLE_MIXED},
485 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_97_5_MBPS, PHYDBG_PREAMBLE_MIXED},
486 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_130_MBPS, PHYDBG_PREAMBLE_MIXED},
487 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_195_MBPS, PHYDBG_PREAMBLE_MIXED},
488 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_260_MBPS, PHYDBG_PREAMBLE_MIXED},
489 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_292_5_MBPS,PHYDBG_PREAMBLE_MIXED},
490 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_325_MBPS, PHYDBG_PREAMBLE_MIXED},
491 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_390_MBPS, PHYDBG_PREAMBLE_MIXED},
492 { HAL_PHY_RATE_VHT_80MHZ_MCS_1NSS_CB_SGI_433_3_MBPS,PHYDBG_PREAMBLE_MIXED},
493#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700494};
495
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530496static unsigned int valid_channel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
497 11, 12, 13, 14, 36, 40, 44, 48,
498 52, 56, 60, 64, 100, 104, 108,
499 112, 116, 120, 124, 128, 132,
500 136, 140, 149, 153, 157, 161,
501 165, 208, 212, 216, 240, 244,
502 248, 252, 0 };
503static unsigned int valid_channel_cb40[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 38,
504 42, 46, 50, 54, 58, 62, 102, 106,
505 110, 114, 118, 122, 126, 130, 134,
506 138, 151, 155, 159, 163, 210, 214,
507 242, 246, 250, 0 };
508static unsigned int valid_channel_cb80[] = { 7, 42, 46, 50, 54, 58, 106, 110,
509 114, 118, 122, 126, 130, 134, 155,
510 159, 246, 0 };
511
Jeff Johnson295189b2012-06-20 16:38:30 -0700512typedef struct
513{
514 tANI_BOOLEAN frameGenEnabled;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530515 tANI_BOOLEAN wfRfGenEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -0700516 tANI_BOOLEAN wfmEnabled;
517 sPttFrameGenParams frameParams;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530518 v_U16_t powerCtlMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 v_U16_t rxmode;
520 v_U16_t chainSelect;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530521 ePhyChanBondState cbmode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700522
523} FTM_STATUS ;
524static FTM_STATUS ftm_status;
525
526//tpAniSirGlobal pMac;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530527static tPttMsgbuffer *pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -0700528
529static void _ftm_status_init(void)
530{
531 tANI_U8 addr1[ANI_MAC_ADDR_SIZE] = { 0x00, 0x11, 0x11, 0x11, 0x11, 0x11 }; //dest
532 tANI_U8 addr2[ANI_MAC_ADDR_SIZE] = { 0x00, 0x22, 0x22, 0x22, 0x22, 0x22 }; //sour
533 tANI_U8 addr3[ANI_MAC_ADDR_SIZE] = { 0x00, 0x33, 0x33, 0x33, 0x33, 0x33 }; //bssId
534
535 ftm_status.wfmEnabled = eANI_BOOLEAN_FALSE;
536 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530537 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700538 ftm_status.frameParams.numTestPackets = 0; //Continuous
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530539 ftm_status.frameParams.interFrameSpace = 200;
Jeff Johnson295189b2012-06-20 16:38:30 -0700540 ftm_status.frameParams.rate = HAL_PHY_RATE_11A_6_MBPS;
541 ftm_status.frameParams.payloadContents = TEST_PAYLOAD_RANDOM;
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530542 ftm_status.frameParams.payloadLength = 1000;
Jeff Johnson295189b2012-06-20 16:38:30 -0700543 ftm_status.frameParams.payloadFillByte = 0xA5;
544 ftm_status.frameParams.pktAutoSeqNum = eANI_BOOLEAN_FALSE;
545 ftm_status.frameParams.tx_mode = 0;
546 ftm_status.frameParams.crc = 0;
547 ftm_status.frameParams.preamble = PHYDBG_PREAMBLE_OFDM;
548 memcpy(&ftm_status.frameParams.addr1[0], addr1, ANI_MAC_ADDR_SIZE);
549 memcpy(&ftm_status.frameParams.addr2[0], addr2, ANI_MAC_ADDR_SIZE);
550 memcpy(&ftm_status.frameParams.addr3[0], addr3, ANI_MAC_ADDR_SIZE);
Zhaoming Shuaaac0362014-05-14 11:59:41 +0530551 ftm_status.powerCtlMode= 2 ; //CLPC mode
Jeff Johnson295189b2012-06-20 16:38:30 -0700552 ftm_status.rxmode = RXMODE_ENABLE_ALL; /* macStart() enables all receive pkt types */
553 ftm_status.chainSelect = FTM_CHAIN_SEL_R0_T0_ON;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +0530554 ftm_status.cbmode = 0 ; //none channel bonding
Jeff Johnson295189b2012-06-20 16:38:30 -0700555
556 return;
557}
558
559/**---------------------------------------------------------------------------
560
561 \brief wlan_ftm_postmsg() -
562
563 The function used for sending the command to the halphy.
564
565 \param - cmd_ptr - Pointer command buffer.
566
567 \param - cmd_len - Command length.
568
569 \return - 0 for success, non zero for failure
570
571 --------------------------------------------------------------------------*/
572
573static v_U32_t wlan_ftm_postmsg(v_U8_t *cmd_ptr, v_U16_t cmd_len)
574{
575 vos_msg_t *ftmReqMsg;
576 vos_msg_t ftmMsg;
577 ENTER();
578
579 ftmReqMsg = (vos_msg_t *) cmd_ptr;
580
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 ftmMsg.type = WDA_FTM_CMD_REQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700582 ftmMsg.reserved = 0;
583 ftmMsg.bodyptr = (v_U8_t*)cmd_ptr;
584 ftmMsg.bodyval = 0;
585
586 /* Use Vos messaging mechanism to send the command to halPhy */
Jeff Johnson295189b2012-06-20 16:38:30 -0700587 if (VOS_STATUS_SUCCESS != vos_mq_post_message(
Jeff Johnson295189b2012-06-20 16:38:30 -0700588 VOS_MODULE_ID_WDA,
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 (vos_msg_t *)&ftmMsg)) {
Arif Hussain6d2a3322013-11-17 19:50:10 -0800590 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700591
592 return VOS_STATUS_E_FAILURE;
593 }
594
595 EXIT();
596 return VOS_STATUS_SUCCESS;
597}
598
599/*---------------------------------------------------------------------------
600
601 \brief wlan_ftm_vos_open() - Open the vOSS Module
602
603 The \a wlan_ftm_vos_open() function opens the vOSS Scheduler
604 Upon successful initialization:
605
606 - All VOS submodules should have been initialized
607
608 - The VOS scheduler should have opened
609
610 - All the WLAN SW components should have been opened. This include
611 MAC.
612
613
Girish Gowli32fbe522014-05-08 20:27:04 +0530614 \param devHandle: pointer to the OS specific device handle.
Jeff Johnson295189b2012-06-20 16:38:30 -0700615
616
617 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
618 is ready to be used.
619
620 VOS_STATUS_E_RESOURCES - System resources (other than memory)
621 are unavailable to initialize the scheduler
622
623
624 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
625
626 \sa wlan_ftm_vos_open()
627
628---------------------------------------------------------------------------*/
Girish Gowli32fbe522014-05-08 20:27:04 +0530629static VOS_STATUS wlan_ftm_vos_open( v_CONTEXT_t pVosContext, v_PVOID_t devHandle )
Jeff Johnson295189b2012-06-20 16:38:30 -0700630{
631 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
632 int iter = 0;
633 tSirRetStatus sirStatus = eSIR_SUCCESS;
634 tMacOpenParameters macOpenParms;
635 pVosContextType gpVosContext = (pVosContextType)pVosContext;
636
637 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
638 "%s: Opening VOSS", __func__);
639
640 if (NULL == gpVosContext)
641 {
642 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
643 "%s: Trying to open VOSS without a PreOpen",__func__);
644 VOS_ASSERT(0);
645 return VOS_STATUS_E_FAILURE;
646 }
647
648 /* Initialize the probe event */
649 if (vos_event_init(&gpVosContext->ProbeEvent) != VOS_STATUS_SUCCESS)
650 {
651 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
652 "%s: Unable to init probeEvent",__func__);
653 VOS_ASSERT(0);
654 return VOS_STATUS_E_FAILURE;
655 }
656
Jeff Johnson295189b2012-06-20 16:38:30 -0700657 if(vos_event_init(&(gpVosContext->wdaCompleteEvent)) != VOS_STATUS_SUCCESS )
658 {
659 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
660 "%s: Unable to init wdaCompleteEvent",__func__);
661 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700662
Jeff Johnson295189b2012-06-20 16:38:30 -0700663 goto err_probe_event;
664 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700665
666 /* Initialize the free message queue */
667 vStatus = vos_mq_init(&gpVosContext->freeVosMq);
668 if (! VOS_IS_STATUS_SUCCESS(vStatus))
669 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700670 /* Critical Error ... Cannot proceed further */
671 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530672 "%s: Failed to initialize VOS free message queue %d",
673 __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700674 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700675 goto err_wda_complete_event;
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 }
677
678 for (iter = 0; iter < VOS_CORE_MAX_MESSAGES; iter++)
679 {
680 (gpVosContext->aMsgWrappers[iter]).pVosMsg =
681 &(gpVosContext->aMsgBuffers[iter]);
682 INIT_LIST_HEAD(&gpVosContext->aMsgWrappers[iter].msgNode);
683 vos_mq_put(&gpVosContext->freeVosMq, &(gpVosContext->aMsgWrappers[iter]));
684 }
685
686 /* Now Open the VOS Scheduler */
687 vStatus= vos_sched_open(gpVosContext, &gpVosContext->vosSched,
688 sizeof(VosSchedContext));
689
690 if (!VOS_IS_STATUS_SUCCESS(vStatus))
691 {
692 /* Critical Error ... Cannot proceed further */
693 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530694 "%s: Failed to open VOS Scheduler %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700695 VOS_ASSERT(0);
696 goto err_msg_queue;
697 }
698
699 /* Open the SYS module */
700 vStatus = sysOpen(gpVosContext);
701
702 if (!VOS_IS_STATUS_SUCCESS(vStatus))
703 {
704 /* Critical Error ... Cannot proceed further */
705 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530706 "%s: Failed to open SYS module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700707 VOS_ASSERT(0);
708 goto err_sched_close;
709 }
710
Jeff Johnson295189b2012-06-20 16:38:30 -0700711 /*Open the WDA module */
712 vos_mem_set(&macOpenParms, sizeof(macOpenParms), 0);
713 macOpenParms.driverType = eDRIVER_TYPE_MFG;
Girish Gowli32fbe522014-05-08 20:27:04 +0530714 vStatus = WDA_open(gpVosContext, devHandle, &macOpenParms);
Jeff Johnson295189b2012-06-20 16:38:30 -0700715 if (!VOS_IS_STATUS_SUCCESS(vStatus))
716 {
717 /* Critical Error ... Cannot proceed further */
718 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530719 "%s: Failed to open WDA module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700720 VOS_ASSERT(0);
721 goto err_sys_close;
722 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700723
724 /* initialize the NV module */
725 vStatus = vos_nv_open();
726 if (!VOS_IS_STATUS_SUCCESS(vStatus))
727 {
728 // NV module cannot be initialized, however the driver is allowed
729 // to proceed
730 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530731 "%s: Failed to initialize the NV module %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700732 goto err_wda_close;
733 }
734
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700735 vStatus = vos_nv_get_dictionary_data();
736
737 if (!VOS_IS_STATUS_SUCCESS(vStatus))
738 {
739 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530740 "%s : failed to get dictionary data for NV %d",
741 __func__, vStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -0700742 goto err_wda_close;
743 }
744
Jeff Johnson295189b2012-06-20 16:38:30 -0700745 /* If we arrive here, both threads dispacthing messages correctly */
746
747 /* Now proceed to open the MAC */
748
749 /* UMA is supported in hardware for performing the
750 frame translation 802.11 <-> 802.3 */
751 macOpenParms.frameTransRequired = 1;
752 sirStatus = macOpen(&(gpVosContext->pMACContext), gpVosContext->pHDDContext,
753 &macOpenParms);
754
755 if (eSIR_SUCCESS != sirStatus)
756 {
757 /* Critical Error ... Cannot proceed further */
758 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530759 "%s: Failed to open MAC %d", __func__, sirStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700760 VOS_ASSERT(0);
761 goto err_nv_close;
762 }
763
Jeff Johnson295189b2012-06-20 16:38:30 -0700764 /* Now proceed to open the SME */
765 vStatus = sme_Open(gpVosContext->pMACContext);
766 if (!VOS_IS_STATUS_SUCCESS(vStatus))
767 {
768 /* Critical Error ... Cannot proceed further */
769 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530770 "%s: Failed to open SME %d", __func__, vStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700771 goto err_mac_close;
772 }
773 return VOS_STATUS_SUCCESS;
774
Jeff Johnson295189b2012-06-20 16:38:30 -0700775
776 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
777 "%s: VOSS successfully Opened",__func__);
778
779 return VOS_STATUS_SUCCESS;
780err_mac_close:
781 macClose(gpVosContext->pMACContext);
782
783err_nv_close:
784 vos_nv_close();
785
786err_wda_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700787 WDA_close(gpVosContext);
788
789err_sys_close:
Jeff Johnson295189b2012-06-20 16:38:30 -0700790 sysClose(gpVosContext);
791
792err_sched_close:
793 vos_sched_close(gpVosContext);
794err_msg_queue:
795 vos_mq_deinit(&gpVosContext->freeVosMq);
796
Jeff Johnson295189b2012-06-20 16:38:30 -0700797err_wda_complete_event:
798 vos_event_destroy(&gpVosContext->wdaCompleteEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700799
800err_probe_event:
801 vos_event_destroy(&gpVosContext->ProbeEvent);
802
803 return VOS_STATUS_E_FAILURE;
804
805} /* wlan_ftm_vos_open() */
806
807/*---------------------------------------------------------------------------
808
809 \brief wlan_ftm_vos_close() - Close the vOSS Module
810
811 The \a wlan_ftm_vos_close() function closes the vOSS Module
812
813 \param vosContext context of vos
814
815 \return VOS_STATUS_SUCCESS - successfully closed
816
817 \sa wlan_ftm_vos_close()
818
819---------------------------------------------------------------------------*/
820
821static VOS_STATUS wlan_ftm_vos_close( v_CONTEXT_t vosContext )
822{
823 VOS_STATUS vosStatus;
824 pVosContextType gpVosContext = (pVosContextType)vosContext;
825
Jeff Johnson295189b2012-06-20 16:38:30 -0700826 vosStatus = sme_Close(((pVosContextType)vosContext)->pMACContext);
827 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
828 {
829 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530830 "%s: Failed to close SME %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700831 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
832 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700833
834 vosStatus = macClose( ((pVosContextType)vosContext)->pMACContext);
835 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
836 {
837 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530838 "%s: Failed to close MAC %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700839 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
840 }
841
842 ((pVosContextType)vosContext)->pMACContext = NULL;
843
844 vosStatus = vos_nv_close();
845 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
846 {
847 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530848 "%s: Failed to close NV %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
850 }
851
852
853 vosStatus = sysClose( vosContext );
854 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
855 {
856 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530857 "%s: Failed to close SYS %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700858 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
859 }
860
Jeff Johnson295189b2012-06-20 16:38:30 -0700861 vosStatus = WDA_close( vosContext );
862 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
863 {
864 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530865 "%s: Failed to close WDA %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700866 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
867 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700868
869 vos_mq_deinit(&((pVosContextType)vosContext)->freeVosMq);
870
871 vosStatus = vos_event_destroy(&gpVosContext->ProbeEvent);
872 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
873 {
874 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530875 "%s: Failed to destroy ProbeEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700876 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
877 }
878
Jeff Johnson295189b2012-06-20 16:38:30 -0700879 vosStatus = vos_event_destroy(&gpVosContext->wdaCompleteEvent);
880 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
881 {
882 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
c_hpothuffdb5272013-10-02 16:42:35 +0530883 "%s: Failed to destroy wdaCompleteEvent %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700884 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
885 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700886
887 return VOS_STATUS_SUCCESS;
888}
889
890/**---------------------------------------------------------------------------
891
892 \brief wlan_ftm_priv_set_txifs() -
893
894 This function is used for
895
896 \param - pAdapter - Pointer HDD Context.
897 - ifs
898
899 \return - 0 for success, non zero for failure
900
901 --------------------------------------------------------------------------*/
902
903
904
905static VOS_STATUS wlan_ftm_priv_set_txifs(hdd_adapter_t *pAdapter,v_U32_t ifs)
906{
907 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
908 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
909 {
910 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
911 return VOS_STATUS_E_FAILURE;
912 }
913
914 /* do not allow to change setting when tx pktgen is enabled */
915 if (ftm_status.frameGenEnabled)
916 {
917 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txifs when pktgen is enabled.",__func__);
918 return VOS_STATUS_E_FAILURE;
919 }
920
921 if (ifs > 100000) //max = (MSK_24 / ONE_MICROSECOND)
922 {
c_hpothuffdb5272013-10-02 16:42:35 +0530923 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
924 "%s:ifs value is invalid %x", __func__, ifs);
Jeff Johnson295189b2012-06-20 16:38:30 -0700925 return VOS_STATUS_E_FAILURE;
926 }
927
928 ftm_status.frameParams.interFrameSpace = ifs;
929
930 return VOS_STATUS_SUCCESS;
931}
932
933/**---------------------------------------------------------------------------
934
935 \brief wlan_ftm_priv_set_txpktcnt() -
936
937 This function is used for
938
939 \param - pAdapter - Pointer HDD Context.
940 - ifs
941
942 \return - 0 for success, non zero for failure
943
944 --------------------------------------------------------------------------*/
945
946static VOS_STATUS wlan_ftm_priv_set_txpktcnt(hdd_adapter_t *pAdapter,v_U32_t cnt)
947{
948 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
949 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
950 {
951 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
952 return VOS_STATUS_E_FAILURE;
953 }
954
955 /* do not allow to change setting when tx pktgen is enabled */
956 if (ftm_status.frameGenEnabled)
957 {
958 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
959 return VOS_STATUS_E_FAILURE;
960 }
961
962 if (cnt > QWLAN_PHYDBG_TXPKT_CNT_CNT_MASK) //0xFFFF
963 {
c_hpothuffdb5272013-10-02 16:42:35 +0530964 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
965 "%s:pktcnt value is invalid %08x", __func__, cnt);
Jeff Johnson295189b2012-06-20 16:38:30 -0700966 return VOS_STATUS_E_FAILURE;
967 }
968
969 ftm_status.frameParams.numTestPackets = cnt;
970
971 return VOS_STATUS_SUCCESS;
972}
973
974static VOS_STATUS wlan_ftm_priv_set_txpktlen(hdd_adapter_t *pAdapter,v_U32_t len)
975{
976 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
977 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
978 {
979 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
980 return VOS_STATUS_E_FAILURE;
981 }
982
983 /* do not allow to change setting when tx pktgen is enabled */
984 if (ftm_status.frameGenEnabled)
985 {
986 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txpktcnt when pktgen is enabled.",__func__);
987 return VOS_STATUS_E_FAILURE;
988 }
989
990 if (len > 4095) //4096
991 {
c_hpothuffdb5272013-10-02 16:42:35 +0530992 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
993 "%s:payload len is invalid %08x", __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -0700994 return VOS_STATUS_E_FAILURE;
995 }
996
997 ftm_status.frameParams.payloadLength = (tANI_U16)len;
998
999 return VOS_STATUS_SUCCESS;
1000}
1001
Jeff Johnson295189b2012-06-20 16:38:30 -07001002
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301003static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop);
1004/**---------------------------------------------------------------------------
1005<FTM_Command>set_tx_wf_gain
1006<argument> is <n>
1007Designates the number of amplitude gain (31 to 255).
1008Description
1009This command can be set only when Tx CW generation is stopped.
1010--------------------------------------------------------------------------*/
1011static VOS_STATUS wlan_ftm_priv_set_wfgain(hdd_adapter_t *pAdapter,v_S15_t dGain,v_U16_t rfGain)
1012{
1013 uPttMsgs *pMsgBody;
1014 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1015 printk(KERN_EMERG "dGain: %02x rfGain: %02x", dGain,rfGain);
1016 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
1017 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1018 "%s:Ftm has not started. Please start the ftm.", __func__);
1019 return VOS_STATUS_E_FAILURE;
1020 }
1021
1022 if (ftm_status.wfRfGenEnabled) {
1023 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1024 "%s:cannot set gain when cwgen is enabled.", __func__);
1025 return VOS_STATUS_E_FAILURE;
1026 }
1027
1028 if (dGain > 24 || dGain <-39) {
1029 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1030 "%s:digital gain value is invalid", __func__);
1031 return VOS_STATUS_E_FAILURE;
1032 }
1033
1034 if (rfGain > 31 || rfGain <0) {
1035 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1036 "%s:rf gain value is invalid", __func__);
1037 return VOS_STATUS_E_FAILURE;
1038 }
1039
1040 if (pMsgBuf == NULL) {
1041 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1042 "%s:pMsgBuf is NULL", __func__);
1043 return VOS_STATUS_E_NOMEM;
1044 }
1045
1046 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1047 wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,0);
1048
1049 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1050 init_completion(&pHddCtx->ftm.ftm_comp_var);
1051 pMsgBuf->msgId = PTT_MSG_SET_TX_WAVEFORM_GAIN_PRIMA_V1;
1052 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxWaveformGain_PRIMA_V1) + PTT_HEADER_LENGTH;
1053 pMsgBody = &pMsgBuf->msgBody;
1054 pMsgBody->SetTxWaveformGain_PRIMA_V1.txChain = PHY_TX_CHAIN_0;
1055 pMsgBody->SetTxWaveformGain_PRIMA_V1.gain = (rfGain << 16 | (dGain & 0xffff));
1056 if (wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength) !=
1057 VOS_STATUS_SUCCESS) {
1058 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1059 "%s:wlan_ftm_postmsg failed",__func__);
1060 return VOS_STATUS_E_FAILURE;
1061 }
1062
1063 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1064 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1065 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1066 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1067 "%s:Ptt response status failed",__func__);
1068 return VOS_STATUS_E_FAILURE;
1069 }
1070 return VOS_STATUS_SUCCESS;
1071}
1072
1073
1074/**---------------------------------------------------------------------------
1075 <FTM_Command> wlan_ftm_priv_cw_rf_gen
1076 <argument> is < 1 | 0 >
1077 1 : Start Tx CW rf generation
1078 0 : Stop Tx CW rf generation
1079 Description
1080 This command starts/stops Tx CW rf generation.
1081--------------------------------------------------------------------------*/
1082static VOS_STATUS wlan_ftm_priv_cw_rf_gen(hdd_adapter_t *pAdapter,v_U16_t startStop)
1083{
1084 uPttMsgs *pMsgBody;
1085 VOS_STATUS status;
1086 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1087
1088 printk(KERN_EMERG "startStop: %02x ", startStop);
1089
1090 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1091 {
1092 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1093 "%s:Ftm has not started. Please start the ftm. ", __func__);
1094 return VOS_STATUS_E_FAILURE;
1095 }
1096
1097 if (startStop != 1 && startStop != 0)
1098 {
1099 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1100 "%s:Tx value is invalid ", __func__);
1101 return VOS_STATUS_E_FAILURE;
1102 }
1103
1104 if ((ftm_status.wfRfGenEnabled && startStop == 1) ||
1105 (!ftm_status.wfRfGenEnabled && startStop == 0))
1106 {
1107 return VOS_STATUS_SUCCESS;
1108 }
1109
1110 if (pMsgBuf == NULL)
1111 {
1112 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1113 "%s:pMsgBuf is NULL", __func__);
1114 return VOS_STATUS_E_NOMEM;
1115 }
1116 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
1117 if (startStop == 1) {
1118 tANI_U16 numSamples = 1;
1119 tANI_BOOLEAN clk80 = TRUE;
1120 v_BYTE_t msgT[4] = {0xff,0x00,0x00,0x00};
1121
1122 init_completion(&pHddCtx->ftm.ftm_comp_var);
1123 pMsgBuf->msgId = PTT_MSG_SET_WAVEFORM;
1124 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetWaveformRF) + PTT_HEADER_LENGTH;
1125 pMsgBody = &pMsgBuf->msgBody;
1126
1127 memcpy((v_BYTE_t*)pMsgBody->SetWaveformRF.waveform,msgT,4);
1128 pMsgBody->SetWaveformRF.numSamples = numSamples;
1129 pMsgBody->SetWaveformRF.clk80 = clk80;
1130 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1131 if (status != VOS_STATUS_SUCCESS) {
1132 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1133 "%s:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed",
1134 __func__);
1135 status = VOS_STATUS_E_FAILURE;
1136 goto done;
1137 }
1138 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1139 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1140 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1141 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1142 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
1143 status = VOS_STATUS_E_FAILURE;
1144 goto done;
1145 }
1146 } else {
1147 init_completion(&pHddCtx->ftm.ftm_comp_var);
1148 pMsgBuf->msgId = PTT_MSG_STOP_WAVEFORM;
1149 pMsgBuf->msgBodyLength = PTT_HEADER_LENGTH;
1150 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1151 if(status != VOS_STATUS_SUCCESS) {
1152 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1153 "%s:wlan_ftm_postmsg failed", __func__);
1154 status = VOS_STATUS_E_FAILURE;
1155 goto done;
1156 }
1157
1158 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
1159 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
1160 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS) {
1161 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1162 "%s:Ptt response status failed", __func__);
1163 status = VOS_STATUS_E_FAILURE;
1164 }
1165 }
1166done:
1167 if (status == VOS_STATUS_SUCCESS) {
1168 if (startStop == 1)
1169 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_TRUE;
1170 else
1171 ftm_status.wfRfGenEnabled = eANI_BOOLEAN_FALSE;
1172 }
1173 return status;
1174}
1175
1176
Jeff Johnson295189b2012-06-20 16:38:30 -07001177static VOS_STATUS wlan_ftm_priv_enable_chain(hdd_adapter_t *pAdapter,v_U16_t chainSelect)
1178{
Jeff Johnson295189b2012-06-20 16:38:30 -07001179 uPttMsgs *pMsgBody;
1180 VOS_STATUS status;
1181 v_U16_t chainSelect_save = chainSelect;
1182 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05301183 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07001184
1185 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1186 {
1187 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1188 return VOS_STATUS_E_FAILURE;
1189 }
1190
1191 if (chainSelect > FTM_CHAIN_SEL_MAX)
1192 {
c_hpothuffdb5272013-10-02 16:42:35 +05301193 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1194 "%s:Invalid chain %08x", __func__, chainSelect);
Jeff Johnson295189b2012-06-20 16:38:30 -07001195 return VOS_STATUS_E_FAILURE;
1196 }
1197
1198 /* do not allow to change setting when tx pktgen is enabled */
1199 if (ftm_status.frameGenEnabled)
1200 {
1201 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot select chain when pktgen is enabled.",__func__);
1202 return VOS_STATUS_E_FAILURE;
1203 }
1204
1205 switch (chainSelect)
1206 {
1207 case FTM_CHAIN_SEL_NO_RX_TX:
1208 chainSelect = PHY_CHAIN_SEL_NO_RX_TX;
1209 break;
1210
1211 case FTM_CHAIN_SEL_R0_ON:
1212 chainSelect = PHY_CHAIN_SEL_R0_ON;
1213 break;
1214
1215 case FTM_CHAIN_SEL_T0_ON:
1216 chainSelect = PHY_CHAIN_SEL_T0_ON;
1217 break;
1218 }
1219
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301220 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001221 init_completion(&pHddCtx->ftm.ftm_comp_var);
1222 pMsgBuf->msgId = PTT_MSG_ENABLE_CHAINS;
1223 pMsgBuf->msgBodyLength = sizeof(tMsgPttEnableChains) + PTT_HEADER_LENGTH;
1224
1225 pMsgBody = &pMsgBuf->msgBody;
1226 pMsgBody->EnableChains.chainSelect = chainSelect;
1227
1228 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
1229
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301230 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001231 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301232 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1233 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001234 status = VOS_STATUS_E_FAILURE;
1235 goto done;
1236 }
c_hpothuffdb5272013-10-02 16:42:35 +05301237 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301238 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05301239 if (0 >= ret)
1240 {
1241 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1242 FL("wait on ftm_comp_var failed %ld"), ret);
1243 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001244
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301245 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07001246 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301247 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1248 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001249 status = VOS_STATUS_E_FAILURE;
1250 goto done;
1251 }
1252 ftm_status.chainSelect = chainSelect_save;
1253done:
Jeff Johnson295189b2012-06-20 16:38:30 -07001254
1255 return status;
1256}
1257
1258/**---------------------------------------------------------------------------
1259 --------------------------------------------------------------------------*/
1260static VOS_STATUS wlan_ftm_priv_get_status(hdd_adapter_t *pAdapter,char *buf)
1261{
1262 int ii;
1263 int lenBuf = WE_FTM_MAX_STR_LEN;
1264 int lenRes = 0;
1265 char *chain[] = {
1266 "None",
1267 "R0,R1",
1268 "R0",
1269 "R1",
1270 "T0",
1271 "R0,R1,T0"
1272 };
1273 char *rx[] = {
1274 "disable",
1275 "11b/g/n",
1276 "11g/n",
1277 "11b"
1278 };
1279 char *tx[] = {
1280 "stopped",
1281 "started",
1282 };
1283 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
1284
1285 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1286 {
1287 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1288 return VOS_STATUS_E_FAILURE;
1289 }
1290
1291 lenRes = snprintf(buf, lenBuf, "\n chainSelect: %s\n rxmode: %s\n "
Jeff Johnson02797792013-10-26 19:17:13 -07001292 "txpktgen: %s\n txifs: %d\n txrate: ",
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001293 chain[ftm_status.chainSelect], rx[ftm_status.rxmode],
1294 tx[ftm_status.frameGenEnabled],
Jeff Johnson295189b2012-06-20 16:38:30 -07001295 ftm_status.frameParams.interFrameSpace);
1296 if ((lenRes < 0) || (lenRes >= lenBuf))
1297 {
c_hpothuffdb5272013-10-02 16:42:35 +05301298 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1299 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001300 return VOS_STATUS_E_FAILURE;
1301 }
1302
1303 buf += lenRes;
1304 lenBuf -= lenRes;
1305
1306 for (ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
1307 {
1308 if (rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
1309 break;
1310 }
1311
1312 if (ii < SIZE_OF_TABLE(rateName_rateIndex_tbl))
1313 {
1314 lenRes = strlcpy(buf, rateName_rateIndex_tbl[ii].rate_str, lenBuf);
1315 }
1316 else
1317 {
1318 lenRes = strlcpy(buf, "invalid", lenBuf);
1319 }
1320 if ((lenRes < 0) || (lenRes >= lenBuf))
1321 {
c_hpothuffdb5272013-10-02 16:42:35 +05301322 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1323 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001324 return VOS_STATUS_E_FAILURE;
1325 }
1326
1327 buf += lenRes;
1328 lenBuf -= lenRes;
1329
Zhaoming Shuaaac0362014-05-14 11:59:41 +05301330 lenRes = snprintf(buf, lenBuf, "\n power ctl mode: %d\n txpktcnt: %d\n "
1331 "txpktlen: %d\n", ftm_status.powerCtlMode,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001332 ftm_status.frameParams.numTestPackets,
Jeff Johnson295189b2012-06-20 16:38:30 -07001333 ftm_status.frameParams.payloadLength);
1334
1335 if ((lenRes < 0) || (lenRes >= lenBuf))
1336 {
c_hpothuffdb5272013-10-02 16:42:35 +05301337 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1338 FL("failed to copy data into buf %d"), lenRes);
Jeff Johnson295189b2012-06-20 16:38:30 -07001339 return VOS_STATUS_E_FAILURE;
1340 }
1341
1342 return VOS_STATUS_SUCCESS;
1343}
1344
Jeff Johnson295189b2012-06-20 16:38:30 -07001345
1346void HEXDUMP(char *s0, char *s1, int len)
1347{
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301348 int i = 0, j = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001349 printk(KERN_EMERG "%s\n :", s0);
1350
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05301351 if (len > 8)
1352 {
1353 for (j = 0; j < len/8; j++)
1354 {
1355 printk(KERN_EMERG "%02x %02x %02x %02x %02x %02x %02x %02x",
1356 s1[j*8], s1[j*8+1], s1[j*8+2], s1[j*8+3], s1[j*8+4],
1357 s1[j*8+5],s1[j*8+6],s1[j*8+7] );
1358 }
1359 len = len - j*8;
1360 }
1361 for (i = 0; i< len; i++) {
1362 printk(KERN_EMERG "%02x ", s1[j*8+i]);
Jeff Johnson295189b2012-06-20 16:38:30 -07001363 }
1364 printk("\n");
1365}
1366
Jeff Johnson295189b2012-06-20 16:38:30 -07001367/*---------------------------------------------------------------------------
1368
1369 \brief vos_ftm_preStart() -
1370
1371 The \a vos_ftm_preStart() function to download CFG.
1372 including:
1373 - ccmStart
1374
1375 - WDA: triggers the CFG download
1376
1377
1378 \param pVosContext: The VOS context
1379
1380
1381 \return VOS_STATUS_SUCCESS - Scheduler was successfully initialized and
1382 is ready to be used.
1383
1384 VOS_STATUS_E_RESOURCES - System resources (other than memory)
1385 are unavailable to initialize the scheduler
1386
1387
1388 VOS_STATUS_E_FAILURE - Failure to initialize the scheduler/
1389
1390 \sa vos_start
1391
1392---------------------------------------------------------------------------*/
1393VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
1394{
1395 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1396 pVosContextType pVosContext = (pVosContextType)vosContext;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001397
Jeff Johnson295189b2012-06-20 16:38:30 -07001398 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
1399 "vos prestart");
1400
Manjunathappa Prakashfb585462013-12-23 19:07:07 -08001401 if (NULL == pVosContext->pWDAContext)
1402 {
1403 VOS_ASSERT(0);
1404 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1405 "%s: WDA NULL context", __func__);
1406 return VOS_STATUS_E_FAILURE;
1407 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001408
1409 /* call macPreStart */
1410 vStatus = macPreStart(pVosContext->pMACContext);
1411 if ( !VOS_IS_STATUS_SUCCESS(vStatus) )
1412 {
1413 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1414 "Failed at macPreStart ");
1415 return VOS_STATUS_E_FAILURE;
1416 }
1417
1418 /* call ccmStart */
1419 ccmStart(pVosContext->pMACContext);
1420
1421 /* Reset wda wait event */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001422 vos_event_reset(&pVosContext->wdaCompleteEvent);
1423
Jeff Johnson295189b2012-06-20 16:38:30 -07001424
1425 /*call WDA pre start*/
1426 vStatus = WDA_preStart(pVosContext);
1427 if (!VOS_IS_STATUS_SUCCESS(vStatus))
1428 {
1429 VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1430 "Failed to WDA prestart ");
1431 macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP);
1432 ccmStop(pVosContext->pMACContext);
1433 VOS_ASSERT(0);
1434 return VOS_STATUS_E_FAILURE;
1435 }
1436
1437 /* Need to update time out of complete */
1438 vStatus = vos_wait_single_event( &pVosContext->wdaCompleteEvent, 1000);
1439 if ( vStatus != VOS_STATUS_SUCCESS )
1440 {
1441 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1442 {
1443 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001444 "%s: Timeout occurred before WDA complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001445 }
1446 else
1447 {
1448 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001449 "%s: WDA_preStart reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001450 }
1451 VOS_ASSERT( 0 );
1452 return VOS_STATUS_E_FAILURE;
1453 }
1454
1455 return VOS_STATUS_SUCCESS;
1456}
Jeff Johnson295189b2012-06-20 16:38:30 -07001457
1458/**---------------------------------------------------------------------------
1459
1460 \brief wlan_hdd_ftm_open() -
1461
1462 The function hdd_wlan_startup calls this function to initialize the FTM specific modules.
1463
1464 \param - pAdapter - Pointer HDD Context.
1465
1466 \return - 0 for success, non zero for failure
1467
1468 --------------------------------------------------------------------------*/
1469
1470int wlan_hdd_ftm_open(hdd_context_t *pHddCtx)
1471{
1472 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1473 pVosContextType pVosContext= NULL;
1474 hdd_adapter_t *pAdapter;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001475
Jeff Johnson295189b2012-06-20 16:38:30 -07001476 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
1477 "%s: Opening VOSS", __func__);
1478
1479 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
1480
1481 if (NULL == pVosContext)
1482 {
1483 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301484 "%s: Trying to open VOSS without a PreOpen", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001485 VOS_ASSERT(0);
1486 goto err_vos_status_failure;
1487 }
1488
1489 // Open VOSS
Girish Gowli32fbe522014-05-08 20:27:04 +05301490 vStatus = wlan_ftm_vos_open( pVosContext, pHddCtx->parent_dev);
Jeff Johnson295189b2012-06-20 16:38:30 -07001491
1492 if ( !VOS_IS_STATUS_SUCCESS( vStatus ))
1493 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301494 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_open failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001495 goto err_vos_status_failure;
1496 }
1497
Jeff Johnson295189b2012-06-20 16:38:30 -07001498 /*
1499 For Integrated SOC, only needed to start WDA, whihc happens in wlan_hdd_ftm_start()
1500 */
1501 /* Save the hal context in Adapter */
1502 pHddCtx->hHal = (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07001503
1504 if ( NULL == pHddCtx->hHal )
1505 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301506 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: HAL context is null", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301507 goto err_ftm_vos_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001508 }
1509
1510 pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_FTM, "wlan%d",
1511 wlan_hdd_get_intf_addr(pHddCtx), FALSE);
1512 if( NULL == pAdapter )
1513 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301514 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_open_adapter failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301515 goto err_adapter_open_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001516 }
1517
1518 if( wlan_ftm_register_wext(pAdapter)!= 0 )
1519 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301520 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: hdd_register_wext failed", __func__);
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301521 goto err_adapter_close;
Jeff Johnson295189b2012-06-20 16:38:30 -07001522 }
1523
1524 //Initialize the nlink service
1525 if(nl_srv_init() != 0)
1526 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301527 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: nl_srv_init failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001528 goto err_ftm_register_wext_close;
1529 }
1530
Leo Chang9e646082013-08-02 11:20:21 -07001531#ifdef WLAN_KD_READY_NOTIFIER
1532 pHddCtx->kd_nl_init = 1;
1533#endif /* WLAN_KD_READY_NOTIFIER */
1534
Jeff Johnson295189b2012-06-20 16:38:30 -07001535#ifdef PTT_SOCK_SVC_ENABLE
1536 //Initialize the PTT service
1537 if(ptt_sock_activate_svc(pHddCtx) != 0)
1538 {
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301539 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: ptt_sock_activate_svc failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001540 goto err_nl_srv_init;
1541 }
1542#endif
1543 if (!VOS_IS_STATUS_SUCCESS(vos_chipVoteOnXOBuffer(NULL, NULL, NULL)))
1544 {
1545 hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed to configure 19.2 MHz Clock", __func__);
1546 goto err_nl_srv_init;
1547 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001548
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
1550 pHddCtx->ftm.targetNVTableSize = 0;
1551 pHddCtx->ftm.targetNVTablePointer = NULL;
1552 pHddCtx->ftm.processedNVTableSize = 0;
1553 pHddCtx->ftm.tempNVTableBuffer = (v_U8_t *)vos_mem_malloc(MAX_NV_TABLE_SIZE);
1554 if(NULL == pHddCtx->ftm.tempNVTableBuffer)
1555 {
1556 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301557 "%s: NV Table Buffer Alloc Fail", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001558 VOS_ASSERT(0);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001559 goto err_nl_srv_init;
Jeff Johnson295189b2012-06-20 16:38:30 -07001560 }
1561 vos_mem_zero((v_VOID_t *)pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001562
1563 _ftm_status_init();
1564 /* Initialize the ftm vos event */
1565 if (vos_event_init(&pHddCtx->ftm.ftm_vos_event) != VOS_STATUS_SUCCESS)
1566 {
1567 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +05301568 "%s: Unable to init probeEvent", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001569 VOS_ASSERT(0);
1570 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
1571 goto err_nl_srv_init;
1572 }
1573
1574 pHddCtx->ftm.ftm_state = WLAN_FTM_INITIALIZED;
1575
1576 return VOS_STATUS_SUCCESS;
1577
1578err_nl_srv_init:
Leo Chang59cdc7e2013-07-10 10:08:21 -07001579#ifdef WLAN_KD_READY_NOTIFIER
1580nl_srv_exit(pHddCtx->ptt_pid);
1581#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001582nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001583#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001584err_ftm_register_wext_close:
1585hdd_UnregisterWext(pAdapter->dev);
1586
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301587err_adapter_close:
Jeff Johnson295189b2012-06-20 16:38:30 -07001588err_adapter_open_failure:
1589hdd_close_all_adapters( pHddCtx );
1590
Mahesh A Saptasagard1e821d2014-04-04 11:42:47 +05301591err_ftm_vos_close:
1592 wlan_ftm_vos_close(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001593err_vos_status_failure:
1594
1595 return VOS_STATUS_E_FAILURE;
1596}
1597
1598
1599
1600int wlan_hdd_ftm_close(hdd_context_t *pHddCtx)
1601{
1602 VOS_STATUS vosStatus;
1603 v_CONTEXT_t vosContext = pHddCtx->pvosContext;
1604
1605 hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_FTM);
1606 ENTER();
1607 if(pAdapter == NULL)
1608 {
1609 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
1610 return VOS_STATUS_E_NOMEM;
1611 }
1612
Atul Mittalc41126d2014-03-17 15:10:11 +05301613 /*release the wlan_hdd_process_ftm_cmd(), if waiting for any response.*/
1614 if (pHddCtx->ftm.IsCmdPending == TRUE)
1615 {
1616 if (vos_event_set(&pHddCtx->ftm.ftm_vos_event)!= VOS_STATUS_SUCCESS)
1617 {
1618 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1619 "%s: vos_event_set failed", __func__);
1620 }
1621 }
Leo Chang4e8183f2013-05-31 15:38:34 -07001622 if(WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1623 {
1624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1625 "%s: Ftm has been started. stopping ftm", __func__);
1626 wlan_ftm_stop(pHddCtx);
1627 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001628
1629 //Assert Deep sleep signal now to put Libra HW in lowest power state
1630 vosStatus = vos_chipAssertDeepSleep( NULL, NULL, NULL );
c_hpothuffdb5272013-10-02 16:42:35 +05301631 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1632 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1633 "%s: Failed to assert deep sleep signal", __func__);
1634 VOS_ASSERT( 0 );
1635 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001636
1637 //Vote off any PMIC voltage supplies
c_hpothuffdb5272013-10-02 16:42:35 +05301638 vosStatus = vos_chipPowerDown(NULL, NULL, NULL);
1639 if (!VOS_IS_STATUS_SUCCESS(vosStatus)){
1640 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1641 "%s: Failed to put HW into low power", __func__);
1642 VOS_ASSERT( 0 );
1643 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001644
1645 vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
1646
Leo Chang59cdc7e2013-07-10 10:08:21 -07001647#ifdef WLAN_KD_READY_NOTIFIER
1648 nl_srv_exit(pHddCtx->ptt_pid);
1649#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001650 nl_srv_exit();
Leo Chang59cdc7e2013-07-10 10:08:21 -07001651#endif /* WLAN_KD_READY_NOTIFIER */
Jeff Johnson295189b2012-06-20 16:38:30 -07001652 //TODO----------
1653 //Deregister the device with the kernel
1654 hdd_UnregisterWext(pAdapter->dev);
1655
1656 hdd_close_all_adapters( pHddCtx );
1657#if 0
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001658 if(test_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags))
Jeff Johnson295189b2012-06-20 16:38:30 -07001659 {
1660 unregister_netdev(pAdapter->dev);
1661 clear_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
1662 }
1663#endif
1664 //-----------------
1665
1666 vosStatus = vos_sched_close( vosContext );
1667 if (!VOS_IS_STATUS_SUCCESS(vosStatus)) {
1668 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1669 "%s: Failed to close VOSS Scheduler",__func__);
1670 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1671 }
1672
1673 //Close VOSS
1674 wlan_ftm_vos_close(vosContext);
1675
1676
1677 vosStatus = vos_event_destroy(&pHddCtx->ftm.ftm_vos_event);
1678 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1679 {
1680 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1681 "%s: Failed to destroy ftm_vos Event",__func__);
1682 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1683 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001684 vos_mem_free(pHddCtx->ftm.tempNVTableBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -07001685
Jeff Johnson295189b2012-06-20 16:38:30 -07001686 return 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001687}
1688
1689/**---------------------------------------------------------------------------
1690
1691 \brief wlan_ftm_send_response() -
1692
1693 The function sends the response to the ptt socket application running in user space.
1694
1695 \param - pAdapter - Pointer HDD Context.
1696
1697 \return - 0 for success, non zero for failure
1698
1699 --------------------------------------------------------------------------*/
1700
1701static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){
1702
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05301703 if( ptt_sock_send_msg_to_app(&pHddCtx->ftm.wnl->wmsg, 0,
1704 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001705
Arif Hussain6d2a3322013-11-17 19:50:10 -08001706 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("Ptt Socket error sending message to the app!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001707 return VOS_STATUS_E_FAILURE;
1708 }
1709 return VOS_STATUS_SUCCESS;
1710}
1711
1712/**---------------------------------------------------------------------------
1713
1714 \brief wlan_hdd_ftm_start() -
1715
1716 This function gets called when the FTM start commands received from the ptt socket application and
1717 it starts the following modules.
1718 1) SAL Start.
1719 2) BAL Start.
1720 3) MAC Start to download the firmware.
1721
1722
1723 \param - pAdapter - Pointer HDD Context.
1724
1725 \return - 0 for success, non zero for failure
1726
1727 --------------------------------------------------------------------------*/
1728
1729static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx)
1730{
1731 VOS_STATUS vStatus = VOS_STATUS_SUCCESS;
1732 tSirRetStatus sirStatus = eSIR_SUCCESS;
1733 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
1734 tHalMacStartParameters halStartParams;
1735
1736 if (WLAN_FTM_STARTED == pHddCtx->ftm.ftm_state)
1737 {
1738 return VOS_STATUS_SUCCESS;
1739 }
1740
1741 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1742 "%s: Starting Libra SW", __func__);
1743
1744 /* We support only one instance for now ...*/
1745 if (pVosContext == NULL)
1746 {
1747 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001748 "%s: mismatch in context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001749 goto err_status_failure;
1750 }
1751
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001752
Jeff Johnson295189b2012-06-20 16:38:30 -07001753 if (pVosContext->pMACContext == NULL)
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001754 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001755 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001756 "%s: MAC NULL context",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001757 goto err_status_failure;
1758 }
1759
Jeff Johnson295189b2012-06-20 16:38:30 -07001760 /*
1761 Prima needs to start the WDA correctly instead of BAL and SAL
1762 */
1763
1764 /* Vos preStart is calling */
1765 if ( !VOS_IS_STATUS_SUCCESS(vos_ftm_preStart(pHddCtx->pvosContext) ) )
1766 {
1767 hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_preStart failed",__func__);
1768 goto err_status_failure;
1769 }
1770
1771
1772 vStatus = WDA_NVDownload_Start(pVosContext);
1773
1774 if ( vStatus != VOS_STATUS_SUCCESS )
1775 {
1776 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1777 "%s: Failed to start NV Download",__func__);
1778 return VOS_STATUS_E_FAILURE;
1779 }
1780
1781 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1782
1783 if ( vStatus != VOS_STATUS_SUCCESS )
1784 {
1785 if ( vStatus == VOS_STATUS_E_TIMEOUT )
1786 {
1787 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001788 "%s: Timeout occurred before WDA_NVDownload_Start complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001789 }
1790 else
1791 {
1792 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001793 "%s: WDA_NVDownload_Start reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001794 }
1795 VOS_ASSERT(0);
Arun Kumar Khandavalli034c8232013-11-27 15:49:07 +05301796 goto err_status_failure;
Jeff Johnson295189b2012-06-20 16:38:30 -07001797 }
1798
1799 vStatus = WDA_start(pVosContext);
1800 if (vStatus != VOS_STATUS_SUCCESS)
1801 {
1802 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1803 "%s: Failed to start WDA",__func__);
1804 goto err_status_failure;
1805 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001806
Jeff Johnson295189b2012-06-20 16:38:30 -07001807
1808 /* Start the MAC */
1809 vos_mem_zero((v_PVOID_t)&halStartParams, sizeof(tHalMacStartParameters));
1810
Jeff Johnson295189b2012-06-20 16:38:30 -07001811
1812 halStartParams.driverType = eDRIVER_TYPE_MFG;
1813
1814 /* Start the MAC */
1815 sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams);
1816
Jeff Johnson295189b2012-06-20 16:38:30 -07001817
1818 if (eSIR_SUCCESS != sirStatus)
1819 {
1820 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1821 "%s: Failed to start MAC", __func__);
1822
Jeff Johnson295189b2012-06-20 16:38:30 -07001823 goto err_wda_stop;
Jeff Johnson295189b2012-06-20 16:38:30 -07001824 }
1825
1826 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1827 "%s: MAC correctly started",__func__);
1828
Jeff Johnson295189b2012-06-20 16:38:30 -07001829
1830 pHddCtx->ftm.ftm_state = WLAN_FTM_STARTED;
1831
1832 return VOS_STATUS_SUCCESS;
1833
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07001834err_wda_stop:
Jeff Johnson295189b2012-06-20 16:38:30 -07001835 vos_event_reset(&(pVosContext->wdaCompleteEvent));
1836 WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL);
1837 vStatus = vos_wait_single_event(&(pVosContext->wdaCompleteEvent), 1000);
1838 if(vStatus != VOS_STATUS_SUCCESS)
1839 {
1840 if(vStatus == VOS_STATUS_E_TIMEOUT)
1841 {
1842 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001843 "%s: Timeout occurred before WDA_stop complete",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001844
1845 }
1846 else
1847 {
1848 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08001849 "%s: WDA_stop reporting other error",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001850 }
1851 VOS_ASSERT(0);
1852 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001853
1854err_status_failure:
1855
1856 return VOS_STATUS_E_FAILURE;
1857
1858}
1859
1860
1861static int wlan_ftm_stop(hdd_context_t *pHddCtx)
1862{
1863 VOS_STATUS vosStatus;
1864
1865 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
1866 {
1867 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
1868 return VOS_STATUS_E_FAILURE;
1869 }
1870
1871 //if(pHddCtx->ftm.cmd_iwpriv == TRUE)
1872 {
1873 /* STOP MAC only */
1874 v_VOID_t *hHal;
1875 hHal = vos_get_context( VOS_MODULE_ID_SME, pHddCtx->pvosContext );
1876 if (NULL == hHal)
1877 {
1878 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1879 "%s: NULL hHal", __func__);
1880 }
1881 else
1882 {
1883 vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP );
1884 if (!VOS_IS_STATUS_SUCCESS(vosStatus))
1885 {
1886 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1887 "%s: Failed to stop SYS", __func__);
1888 VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) );
1889 }
1890 }
1891
Jeff Johnson295189b2012-06-20 16:38:30 -07001892
Jeff Johnson295189b2012-06-20 16:38:30 -07001893 WDA_stop(pHddCtx->pvosContext, HAL_STOP_TYPE_RF_KILL);
Jeff Johnson295189b2012-06-20 16:38:30 -07001894
1895 }
1896 return WLAN_FTM_SUCCESS;
1897}
1898
Jeff Johnson295189b2012-06-20 16:38:30 -07001899/**---------------------------------------------------------------------------
1900
1901 \brief wlan_hdd_ftm_get_nv_table() -
1902 Get Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08001903 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07001904
1905 \param - ftmCmd - Pointer FTM Commad Buffer
1906
1907 \return - int
1908 -1, Process Host command fail, vail out
1909 1, Process Host command success
1910
1911 --------------------------------------------------------------------------*/
1912int wlan_hdd_ftm_get_nv_table
1913(
1914 hdd_context_t *pHddCtx,
1915 tPttMsgbuffer *ftmCmd
1916)
1917{
1918 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
1919 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvTable;
1920 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08001921 sHalNvV2 *nvContents = NULL;
1922 eNvVersionType nvVersion;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001923
Jeff Johnson295189b2012-06-20 16:38:30 -07001924 if (NULL == pHddCtx)
1925 {
1926 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1927 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001928 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001929 }
1930
Leo Chang80de3c22013-11-26 10:52:12 -08001931 nvVersion = vos_nv_getNvVersion();
1932 if (E_NV_V2 != nvVersion)
1933 {
1934 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
1935 "%s : Not valid NV Version %d", __func__, nvVersion);
1936 return -EINVAL;
1937 }
1938
Jeff Johnson295189b2012-06-20 16:38:30 -07001939 /* Test first chunk of NV table */
1940 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
1941 (0 == pHddCtx->ftm.processedNVTableSize))
1942 {
1943 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
1944 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
1945 {
c_hpothuffdb5272013-10-02 16:42:35 +05301946 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
1947 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08001948 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001949 }
1950
1951 switch (nvTable->nvTable)
1952 {
1953 case NV_TABLE_RATE_POWER_SETTINGS:
1954 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
1955 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
1956 break;
1957
1958 case NV_TABLE_REGULATORY_DOMAINS:
1959 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
1960 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
1961 break;
1962
1963 case NV_TABLE_DEFAULT_COUNTRY:
1964 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
1965 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
1966 break;
1967
1968 case NV_TABLE_TPC_POWER_TABLE:
1969 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
1970 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
1971 break;
1972
1973 case NV_TABLE_TPC_PDADC_OFFSETS:
1974 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
1975 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
1976 break;
1977
1978 case NV_TABLE_VIRTUAL_RATE:
1979 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
1980 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
1981 break;
1982
1983 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
1984 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
1985 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
1986 break;
1987
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08001988 case NV_TABLE_HW_CAL_VALUES:
1989 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
1990 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
1991 break;
1992
1993 case NV_TABLE_FW_CONFIG:
1994 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
1995 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07001996 break;
1997
1998 case NV_TABLE_ANTENNA_PATH_LOSS:
1999 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2000 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2001 break;
2002
2003 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2004 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2005 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2006 break;
2007
2008 default:
2009 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2010 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002011 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002012 break;
2013 }
2014
2015 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2016 {
2017 /* Invalid table size, discard and initialize data */
2018 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002019 "Invalid Table Size %d for Table %d"
Arif Hussain6d2a3322013-11-17 19:50:10 -08002020 " expected size %d", nvTable->tableSize, nvTable->nvTable,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002021 pHddCtx->ftm.targetNVTableSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07002022 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2023 pHddCtx->ftm.targetNVTableSize = 0;
2024 pHddCtx->ftm.processedNVTableSize = 0;
2025 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002026 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002027 }
2028
2029 /* Set Current Processing NV table type */
2030 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2031 /* Copy target NV table value into temp context buffer */
2032 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer,
2033 pHddCtx->ftm.targetNVTablePointer,
2034 pHddCtx->ftm.targetNVTableSize);
2035
2036 }
2037
2038 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2039 {
2040 /* Invalid table type */
2041 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2042 "Invalid NV Table, now Processing %d, not %d",
2043 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2044 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2045 pHddCtx->ftm.targetNVTableSize = 0;
2046 pHddCtx->ftm.processedNVTableSize = 0;
2047 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002048
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002049 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002050 }
2051
2052 /* Copy next chunk of NV table value into response buffer */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002053 vos_mem_copy(&nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002054 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2055 nvTable->chunkSize);
2056 /* Update processed pointer to prepare next chunk copy */
2057 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2058
2059 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2060 {
2061 /* Finished to process last chunk of data, initialize buffer */
2062 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2063 pHddCtx->ftm.targetNVTableSize = 0;
2064 pHddCtx->ftm.processedNVTableSize = 0;
2065 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2066 }
2067
2068 return 1;
2069}
2070
2071/**---------------------------------------------------------------------------
2072
2073 \brief wlan_hdd_ftm_set_nv_table() -
2074 Set Specific NV table as given
Leo Chang80de3c22013-11-26 10:52:12 -08002075 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002076
2077 \param - ftmCmd - Pointer FTM Commad Buffer
2078
2079 \return - int
2080 -1, Process Host command fail, vail out
2081 1, Process Host command success
2082
2083 --------------------------------------------------------------------------*/
2084int wlan_hdd_ftm_set_nv_table
2085(
2086 hdd_context_t *pHddCtx,
2087 tPttMsgbuffer *ftmCmd
2088)
2089{
2090 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2091 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvTable;
2092 v_SIZE_t nvSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002093 sHalNvV2 *nvContents = NULL;
2094 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002095
2096 if (NULL == pHddCtx)
2097 {
2098 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2099 "Not valid driver context");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002100 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002101 }
2102
Leo Chang80de3c22013-11-26 10:52:12 -08002103 nvVersion = vos_nv_getNvVersion();
2104 if (E_NV_V2 != nvVersion)
2105 {
2106 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2107 "%s : Not valid NV Version %d", __func__, nvVersion);
2108 return -EINVAL;
2109 }
2110
Jeff Johnson295189b2012-06-20 16:38:30 -07002111 /* Test first chunk of NV table */
2112 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2113 (0 == pHddCtx->ftm.processedNVTableSize))
2114 {
2115 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2116 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2117 {
c_hpothuffdb5272013-10-02 16:42:35 +05302118 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2119 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002120 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002121 }
2122
2123 switch (nvTable->nvTable)
2124 {
2125 case NV_TABLE_RATE_POWER_SETTINGS:
2126 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum);
2127 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum;
2128 break;
2129
2130 case NV_TABLE_REGULATORY_DOMAINS:
2131 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.regDomains);
2132 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.regDomains;
2133 break;
2134
2135 case NV_TABLE_DEFAULT_COUNTRY:
2136 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.defaultCountryTable);
2137 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.defaultCountryTable;
2138 break;
2139
2140 case NV_TABLE_TPC_POWER_TABLE:
2141 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutCharacterized);
2142 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutCharacterized[0];
2143 break;
2144
2145 case NV_TABLE_TPC_PDADC_OFFSETS:
2146 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.plutPdadcOffset);
2147 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.plutPdadcOffset[0];
2148 break;
2149
2150 case NV_TABLE_VIRTUAL_RATE:
2151 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2152 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pwrOptimum_virtualRate[0];
2153 break;
2154
2155 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2156 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.rssiChanOffsets);
2157 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.rssiChanOffsets[0];
2158 break;
2159
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002160 case NV_TABLE_HW_CAL_VALUES:
2161 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.hwCalValues);
2162 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.hwCalValues;
2163 break;
2164
2165 case NV_TABLE_FW_CONFIG:
2166 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.fwConfig);
2167 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.fwConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002168 break;
2169
2170 case NV_TABLE_ANTENNA_PATH_LOSS:
2171 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.antennaPathLoss);
2172 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.antennaPathLoss[0];
2173 break;
2174
2175 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2176 pHddCtx->ftm.targetNVTableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2177 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)&nvContents->tables.pktTypePwrLimits[0][0];
2178 break;
2179
2180 default:
2181 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2182 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002183 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 break;
2185 }
2186
2187 /* Set Current Processing NV table type */
2188 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2189 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
2190 {
2191 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2192 "Invalid Table Size %d", nvTable->tableSize);
2193 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2194 pHddCtx->ftm.targetNVTableSize = 0;
2195 pHddCtx->ftm.processedNVTableSize = 0;
2196 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002197 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002198 }
2199 }
2200
2201 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2202 {
2203 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2204 "Invalid NV Table, now Processing %d, not %d",
2205 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2206 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2207 pHddCtx->ftm.targetNVTableSize = 0;
2208 pHddCtx->ftm.processedNVTableSize = 0;
2209 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002210 return -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002211 }
2212 vos_mem_copy(pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002213 &nvTable->tableData,
Jeff Johnson295189b2012-06-20 16:38:30 -07002214 nvTable->chunkSize);
2215
2216 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2217 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2218 {
2219 vos_mem_copy(pHddCtx->ftm.targetNVTablePointer,
2220 pHddCtx->ftm.tempNVTableBuffer,
2221 pHddCtx->ftm.targetNVTableSize);
2222 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2223 pHddCtx->ftm.targetNVTableSize = 0;
2224 pHddCtx->ftm.processedNVTableSize = 0;
2225 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2226 }
2227
2228 return 1;
2229}
2230
2231/**---------------------------------------------------------------------------
2232
2233 \brief wlan_hdd_ftm_blank_nv() -
2234 Set all NV table value as default
Leo Chang80de3c22013-11-26 10:52:12 -08002235 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002236
2237 \param - ftmCmd - Pointer FTM Commad Buffer
2238
2239 \return - int
2240 -1, Process Host command fail, vail out
2241 0, Process Host command success
2242
2243 --------------------------------------------------------------------------*/
2244int wlan_hdd_ftm_blank_nv_table
2245(
2246 tPttMsgbuffer *ftmCmd
2247)
2248{
Leo Chang80de3c22013-11-26 10:52:12 -08002249 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002250 v_SIZE_t nvSize;
2251 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002252 sHalNvV2 *nvContents = NULL;
2253 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002254
2255 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2256 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2257 {
c_hpothuffdb5272013-10-02 16:42:35 +05302258 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2259 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002260 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002261 }
2262
Leo Chang80de3c22013-11-26 10:52:12 -08002263 nvVersion = vos_nv_getNvVersion();
2264 if (E_NV_V2 != nvVersion)
2265 {
2266 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2267 "%s : Not valid NV Version %d", __func__, nvVersion);
2268 return -EINVAL;
2269 }
2270
Jeff Johnson295189b2012-06-20 16:38:30 -07002271 itemSize = sizeof(nvContents->tables.pwrOptimum);
2272 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002273 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002274 itemSize);
2275
2276 itemSize = sizeof(nvContents->tables.regDomains);
2277 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002278 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002279 itemSize);
2280
2281 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2282 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002283 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002284 itemSize);
2285
2286 itemSize = sizeof(nvContents->tables.plutCharacterized);
2287 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002288 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002289 itemSize);
2290
2291 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2292 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002293 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002294 itemSize);
2295
2296 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2297 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002298 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002299 itemSize);
2300
2301 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2302 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002303 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002304 itemSize);
2305
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002306 itemSize = sizeof(nvContents->tables.hwCalValues);
2307 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002308 &nvDefaultsV2.tables.hwCalValues,
Jeff Johnson295189b2012-06-20 16:38:30 -07002309 itemSize);
2310
2311 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2312 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002313 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002314 itemSize);
2315
2316 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2317 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002318 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002319 itemSize);
2320
2321 return 1;
2322}
2323
2324/**---------------------------------------------------------------------------
2325
2326 \brief wlan_hdd_ftm_delete_nv_table() -
2327 Delete Specific NV table
Leo Chang80de3c22013-11-26 10:52:12 -08002328 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002329
2330 \param - ftmCmd - Pointer FTM Commad Buffer
2331
2332 \return - int
2333 -1, Process Host command fail, vail out
2334 1, Process Host command success
2335
2336 --------------------------------------------------------------------------*/
2337int wlan_hdd_ftm_delete_nv_table
2338(
2339 tPttMsgbuffer *ftmCmd
2340)
2341{
Leo Chang80de3c22013-11-26 10:52:12 -08002342 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002343 tMsgPttDelNvTable *nvTable = (tMsgPttDelNvTable *)&ftmCmd->msgBody.DelNvTable;
2344 v_SIZE_t nvSize;
2345 v_SIZE_t itemSize;
Leo Chang80de3c22013-11-26 10:52:12 -08002346 sHalNvV2 *nvContents = NULL;
2347 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002348
2349 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2350 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2351 {
c_hpothuffdb5272013-10-02 16:42:35 +05302352 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2353 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002354 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002355 }
2356
Leo Chang80de3c22013-11-26 10:52:12 -08002357 nvVersion = vos_nv_getNvVersion();
2358 if (E_NV_V2 != nvVersion)
2359 {
2360 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2361 "%s : Not valid NV Version %d", __func__, nvVersion);
2362 return -EINVAL;
2363 }
2364
Jeff Johnson295189b2012-06-20 16:38:30 -07002365 switch (nvTable->nvTable)
2366 {
2367 case NV_TABLE_RATE_POWER_SETTINGS:
2368 itemSize = sizeof(nvContents->tables.pwrOptimum);
2369 memcpy(&nvContents->tables.pwrOptimum,
Leo Chang80de3c22013-11-26 10:52:12 -08002370 &nvDefaultsV2.tables.pwrOptimum,
Jeff Johnson295189b2012-06-20 16:38:30 -07002371 itemSize);
2372 break;
2373
2374 case NV_TABLE_REGULATORY_DOMAINS:
2375 itemSize = sizeof(nvContents->tables.regDomains);
2376 memcpy(&nvContents->tables.regDomains,
Leo Chang80de3c22013-11-26 10:52:12 -08002377 &nvDefaultsV2.tables.regDomains,
Jeff Johnson295189b2012-06-20 16:38:30 -07002378 itemSize);
2379 break;
2380
2381 case NV_TABLE_DEFAULT_COUNTRY:
2382 itemSize = sizeof(nvContents->tables.defaultCountryTable);
2383 memcpy(&nvContents->tables.defaultCountryTable,
Leo Chang80de3c22013-11-26 10:52:12 -08002384 &nvDefaultsV2.tables.defaultCountryTable,
Jeff Johnson295189b2012-06-20 16:38:30 -07002385 itemSize);
2386 break;
2387
2388 case NV_TABLE_TPC_POWER_TABLE:
2389 itemSize = sizeof(nvContents->tables.plutCharacterized);
2390 memcpy(&nvContents->tables.plutCharacterized[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002391 &nvDefaultsV2.tables.plutCharacterized[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002392 itemSize);
2393 break;
2394
2395 case NV_TABLE_TPC_PDADC_OFFSETS:
2396 itemSize = sizeof(nvContents->tables.plutPdadcOffset);
2397 memcpy(&nvContents->tables.plutPdadcOffset[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002398 &nvDefaultsV2.tables.plutPdadcOffset[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002399 itemSize);
2400 break;
2401
2402 case NV_TABLE_VIRTUAL_RATE:
2403 itemSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2404 memcpy(&nvContents->tables.pwrOptimum_virtualRate[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002405 &nvDefaultsV2.tables.pwrOptimum_virtualRate[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002406 itemSize);
2407 break;
2408
2409 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2410 itemSize = sizeof(nvContents->tables.rssiChanOffsets);
2411 memcpy(&nvContents->tables.rssiChanOffsets[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002412 &nvDefaultsV2.tables.rssiChanOffsets[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002413 itemSize);
2414 break;
2415
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002416 case NV_TABLE_HW_CAL_VALUES:
2417 itemSize = sizeof(nvContents->tables.hwCalValues);
2418 memcpy(&nvContents->tables.hwCalValues,
Leo Chang80de3c22013-11-26 10:52:12 -08002419 &nvDefaultsV2.tables.hwCalValues,
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002420 itemSize);
2421 break;
2422
2423 case NV_TABLE_FW_CONFIG:
2424 itemSize = sizeof(nvContents->tables.fwConfig);
2425 memcpy(&nvContents->tables.fwConfig,
Leo Chang80de3c22013-11-26 10:52:12 -08002426 &nvDefaultsV2.tables.fwConfig,
Jeff Johnson295189b2012-06-20 16:38:30 -07002427 itemSize);
2428 break;
2429
2430 case NV_TABLE_ANTENNA_PATH_LOSS:
2431 itemSize = sizeof(nvContents->tables.antennaPathLoss);
2432 memcpy(&nvContents->tables.antennaPathLoss[0],
Leo Chang80de3c22013-11-26 10:52:12 -08002433 &nvDefaultsV2.tables.antennaPathLoss[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002434 itemSize);
2435 break;
2436
2437 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2438 itemSize = sizeof(nvContents->tables.pktTypePwrLimits);
2439 memcpy(&nvContents->tables.pktTypePwrLimits[0][0],
Leo Chang80de3c22013-11-26 10:52:12 -08002440 &nvDefaultsV2.tables.pktTypePwrLimits[0][0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002441 itemSize);
2442 break;
2443
2444 default:
2445 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2446 "Not Valid NV Table %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002447 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002448 break;
2449 }
2450
2451 return 1;
2452}
2453
2454/**---------------------------------------------------------------------------
2455
2456 \brief wlan_hdd_ftm_get_nv_field() -
2457 Get Specific NV field
2458
2459 \param - ftmCmd - Pointer FTM Commad Buffer
2460
2461 \return - int
2462 -1, Process Host command fail, vail out
2463 1, Process Host command success
2464
2465 --------------------------------------------------------------------------*/
2466int wlan_hdd_ftm_get_nv_field
2467(
2468 tPttMsgbuffer *ftmCmd
2469)
2470{
2471 sNvFields nvFieldDataBuffer;
2472 tMsgPttGetNvField *nvField = (tMsgPttGetNvField *)&ftmCmd->msgBody.GetNvField;
2473 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2474 sHalNv *nvContents = NULL;
2475 v_SIZE_t nvSize;
2476
2477 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2478 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2479 {
c_hpothuffdb5272013-10-02 16:42:35 +05302480 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2481 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002482 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002483 }
2484 memcpy(&nvFieldDataBuffer, &nvContents->fields, sizeof(sNvFields));
2485
2486 switch (nvField->nvField)
2487 {
2488 case NV_COMMON_PRODUCT_ID:
2489 memcpy((void *)&nvField->fieldData,
2490 &nvFieldDataBuffer.productId,
2491 sizeof(nvFieldDataBuffer.productId));
2492 break;
2493
2494 case NV_COMMON_PRODUCT_BANDS:
2495 memcpy((void *)&nvField->fieldData,
2496 &nvFieldDataBuffer.productBands,
2497 sizeof(nvFieldDataBuffer.productBands));
2498 break;
2499
2500 case NV_COMMON_NUM_OF_TX_CHAINS:
2501 memcpy((void *)&nvField->fieldData,
2502 &nvFieldDataBuffer.numOfTxChains,
2503 sizeof(nvFieldDataBuffer.numOfTxChains));
2504 break;
2505
2506 case NV_COMMON_NUM_OF_RX_CHAINS:
2507 memcpy((void *)&nvField->fieldData,
2508 &nvFieldDataBuffer.numOfRxChains,
2509 sizeof(nvFieldDataBuffer.numOfRxChains));
2510 break;
2511
2512 case NV_COMMON_MAC_ADDR:
2513 memcpy((void *)&nvField->fieldData,
2514 &nvFieldDataBuffer.macAddr[0],
2515 NV_FIELD_MAC_ADDR_SIZE);
2516 break;
2517
2518 case NV_COMMON_MFG_SERIAL_NUMBER:
2519 memcpy((void *)&nvField->fieldData,
2520 &nvFieldDataBuffer.mfgSN[0],
2521 NV_FIELD_MFG_SN_SIZE);
2522 break;
2523
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002524 case NV_COMMON_WLAN_NV_REV_ID:
2525 memcpy((void *)&nvField->fieldData,
2526 &nvFieldDataBuffer.wlanNvRevId,
2527 sizeof(nvFieldDataBuffer.wlanNvRevId));
2528 break;
2529
Jeff Johnson295189b2012-06-20 16:38:30 -07002530 case NV_COMMON_COUPLER_TYPE:
2531 memcpy((void *)&nvField->fieldData,
2532 &nvFieldDataBuffer.couplerType,
2533 sizeof(nvFieldDataBuffer.couplerType));
2534 break;
2535
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002536 case NV_COMMON_NV_VERSION:
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002537 {
2538 VOS_STATUS nvEmbededStatus = VOS_STATUS_SUCCESS;
2539 v_U8_t nvVersion = nvFieldDataBuffer.nvVersion;
2540
2541 nvEmbededStatus = vos_nv_isEmbeddedNV();
2542
2543 if ( nvEmbededStatus == VOS_STATUS_SUCCESS )
2544 {
2545 // High bit is set to indicate embedded NV..
2546 nvVersion = nvVersion | NV_EMBEDDED_VERSION;
2547 }
2548
2549 memcpy((void *)&nvField->fieldData,
2550 &nvVersion,
2551 sizeof(nvFieldDataBuffer.nvVersion));
2552 }
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002553 break;
2554
Jeff Johnson295189b2012-06-20 16:38:30 -07002555 default:
2556 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2557 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002558 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002559 break;
2560 }
2561
2562 return 1;
2563}
2564
2565/**---------------------------------------------------------------------------
2566
2567 \brief wlan_hdd_ftm_set_nv_field() -
2568 Set Specific NV field
2569
2570 \param - ftmCmd - Pointer FTM Commad Buffer
2571
2572 \return - int
2573 -1, Process Host command fail, vail out
2574 1, Process Host command success
2575
2576 --------------------------------------------------------------------------*/
2577int wlan_hdd_ftm_set_nv_field
2578(
2579 tPttMsgbuffer *ftmCmd
2580)
2581{
2582 tMsgPttSetNvField *nvField = (tMsgPttSetNvField *)&ftmCmd->msgBody.SetNvField;
2583 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2584 v_SIZE_t nvSize;
2585 sHalNv *nvContents = NULL;
2586 v_U8_t macLoop;
2587 v_U8_t *pNVMac;
2588 v_U8_t lastByteMAC;
2589
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002590
Jeff Johnson295189b2012-06-20 16:38:30 -07002591 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2592 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2593 {
c_hpothuffdb5272013-10-02 16:42:35 +05302594 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2595 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002596 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002597 }
2598
2599 switch (nvField->nvField)
2600 {
2601 case NV_COMMON_PRODUCT_ID:
2602 memcpy(&nvContents->fields.productId,
2603 &nvField->fieldData,
2604 sizeof(nvContents->fields.productId));
2605 break;
2606
2607 case NV_COMMON_PRODUCT_BANDS:
2608 memcpy(&nvContents->fields.productBands,
2609 &nvField->fieldData,
2610 sizeof(nvContents->fields.productBands));
2611 break;
2612
2613 case NV_COMMON_NUM_OF_TX_CHAINS:
2614 memcpy(&nvContents->fields.numOfTxChains,
2615 &nvField->fieldData,
2616 sizeof(nvContents->fields.numOfTxChains));
2617 break;
2618
2619 case NV_COMMON_NUM_OF_RX_CHAINS:
2620 memcpy(&nvContents->fields.numOfRxChains,
2621 &nvField->fieldData,
2622 sizeof(nvContents->fields.numOfRxChains));
2623 break;
2624
2625 case NV_COMMON_MAC_ADDR:
2626 /* If Last byte is larger than 252 (0xFC), return Error,
2627 * Since 3MACs should be derived from first MAC */
2628 if(QWLAN_MAX_MAC_LAST_BYTE_VALUE <
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002629 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1])
Jeff Johnson295189b2012-06-20 16:38:30 -07002630 {
2631 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2632 "Last Byte of the seed MAC is too large 0x%x",
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002633 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1]);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002634 return -EILSEQ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002635 }
2636
2637 pNVMac = (v_U8_t *)nvContents->fields.macAddr;
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002638 lastByteMAC = nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1];
Jeff Johnson295189b2012-06-20 16:38:30 -07002639 for(macLoop = 0; macLoop < VOS_MAX_CONCURRENCY_PERSONA; macLoop++)
2640 {
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002641 nvField->fieldData.macAddr.macAddr1[VOS_MAC_ADDRESS_LEN - 1] =
Jeff Johnson295189b2012-06-20 16:38:30 -07002642 lastByteMAC + macLoop;
2643 vos_mem_copy(pNVMac + (macLoop * NV_FIELD_MAC_ADDR_SIZE),
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07002644 &nvField->fieldData.macAddr.macAddr1[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07002645 NV_FIELD_MAC_ADDR_SIZE);
2646 }
2647 break;
2648
2649 case NV_COMMON_MFG_SERIAL_NUMBER:
2650 memcpy(&nvContents->fields.mfgSN[0],
2651 &nvField->fieldData,
2652 NV_FIELD_MFG_SN_SIZE);
2653 break;
2654
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002655 case NV_COMMON_WLAN_NV_REV_ID:
2656 memcpy(&nvContents->fields.wlanNvRevId,
2657 &nvField->fieldData,
2658 sizeof(nvContents->fields.wlanNvRevId));
2659 break;
2660
Jeff Johnson295189b2012-06-20 16:38:30 -07002661 case NV_COMMON_COUPLER_TYPE:
2662 memcpy(&nvContents->fields.couplerType,
2663 &nvField->fieldData,
2664 sizeof(nvContents->fields.couplerType));
2665 break;
2666
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002667 case NV_COMMON_NV_VERSION:
2668 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2669 "Cannot modify NV version field %d", nvField->nvField);
2670 return -EIO;
2671 break;
2672
Jeff Johnson295189b2012-06-20 16:38:30 -07002673 default:
2674 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2675 "Not Valid NV field %d", nvField->nvField);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002676 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002677 break;
2678 }
2679
2680 return 1;
2681}
2682
2683/**---------------------------------------------------------------------------
2684
2685 \brief wlan_hdd_ftm_store_nv_table() -
2686 Store Cached NV information into Flash Memory, file
Leo Chang80de3c22013-11-26 10:52:12 -08002687 NV V2 dedicated API
Jeff Johnson295189b2012-06-20 16:38:30 -07002688
2689 \param - ftmCmd - Pointer FTM Commad Buffer
2690
2691 \return - int
2692 -1, Process Host command fail, vail out
2693 0, Process Host command success
2694
2695 --------------------------------------------------------------------------*/
2696int wlan_hdd_ftm_store_nv_table
2697(
2698 tPttMsgbuffer *ftmCmd
2699)
2700{
2701 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2702 v_SIZE_t nvSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07002703 tMsgPttStoreNvTable *nvTable = (tMsgPttStoreNvTable *)&ftmCmd->msgBody.StoreNvTable;
2704 void *tablePtr = NULL;
2705 unsigned int tableSize = 0;
2706 VNV_TYPE tableVNVType = VNV_FIELD_IMAGE;
Leo Chang80de3c22013-11-26 10:52:12 -08002707 sHalNvV2 *nvContents = NULL;
2708 eNvVersionType nvVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07002709
2710 nvStatus = vos_nv_getNVBuffer((void **)&nvContents, &nvSize);
2711 if((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2712 {
c_hpothuffdb5272013-10-02 16:42:35 +05302713 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2714 FL("Fail to get cached NV value Status %d"), nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002715 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002716 }
2717
Leo Chang80de3c22013-11-26 10:52:12 -08002718 nvVersion = vos_nv_getNvVersion();
2719 if (E_NV_V2 != nvVersion)
2720 {
2721 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2722 "%s : Not valid NV Version %d", __func__, nvVersion);
2723 return -EINVAL;
2724 }
2725
Jeff Johnson295189b2012-06-20 16:38:30 -07002726 /* Set Platform type as PRIMA */
2727 nvContents->fields.wlanNvRevId = 2;
2728
2729 switch(nvTable->nvTable)
2730 {
2731 case NV_FIELDS_IMAGE:
2732 tablePtr = (void *)&nvContents->fields;
2733 tableSize = sizeof(nvContents->fields);
2734 tableVNVType = VNV_FIELD_IMAGE;
2735 break;
2736
2737 case NV_TABLE_RATE_POWER_SETTINGS:
2738 tablePtr = (void *)&nvContents->tables.pwrOptimum[0];
2739 tableSize = sizeof(nvContents->tables.pwrOptimum);
2740 tableVNVType = VNV_RATE_TO_POWER_TABLE;
2741 break;
2742
2743 case NV_TABLE_REGULATORY_DOMAINS:
2744 tablePtr = (void *)&nvContents->tables.regDomains[0];
2745 tableSize = sizeof(nvContents->tables.regDomains);
2746 tableVNVType = VNV_REGULARTORY_DOMAIN_TABLE;
2747 break;
2748
2749 case NV_TABLE_DEFAULT_COUNTRY:
2750 tablePtr = (void *)&nvContents->tables.defaultCountryTable;
2751 tableSize = sizeof(nvContents->tables.defaultCountryTable);
2752 tableVNVType = VNV_DEFAULT_LOCATION;
2753 break;
2754
2755 case NV_TABLE_TPC_POWER_TABLE:
2756 tablePtr = (void *)&nvContents->tables.plutCharacterized[0];
2757 tableSize = sizeof(nvContents->tables.plutCharacterized);
2758 tableVNVType = VNV_TPC_POWER_TABLE;
2759 break;
2760
2761 case NV_TABLE_TPC_PDADC_OFFSETS:
2762 tablePtr = (void *)&nvContents->tables.plutPdadcOffset[0];
2763 tableSize = sizeof(nvContents->tables.plutPdadcOffset);
2764 tableVNVType = VNV_TPC_PDADC_OFFSETS;
2765 break;
2766
2767 case NV_TABLE_VIRTUAL_RATE:
2768 tablePtr = (void *)&nvContents->tables.pwrOptimum_virtualRate[0];
2769 tableSize = sizeof(nvContents->tables.pwrOptimum_virtualRate);
2770 tableVNVType = VNV_TABLE_VIRTUAL_RATE;
2771 break;
2772
2773 case NV_TABLE_RSSI_CHANNEL_OFFSETS:
2774 tablePtr = (void *)&nvContents->tables.rssiChanOffsets[0];
2775 tableSize = sizeof(nvContents->tables.rssiChanOffsets);
2776 tableVNVType = VNV_RSSI_CHANNEL_OFFSETS;
2777 break;
2778
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002779 case NV_TABLE_HW_CAL_VALUES:
2780 tablePtr = (void *)&nvContents->tables.hwCalValues;
2781 tableSize = sizeof(nvContents->tables.hwCalValues);
2782 tableVNVType = VNV_HW_CAL_VALUES;
Jeff Johnson295189b2012-06-20 16:38:30 -07002783 break;
2784
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002785 case NV_TABLE_FW_CONFIG:
2786 tablePtr = (void *)&nvContents->tables.fwConfig;
2787 tableSize = sizeof(nvContents->tables.fwConfig);
2788 tableVNVType = VNV_FW_CONFIG;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002789 break;
Gopichand Nakkala90bcf7a2013-01-04 11:45:31 -08002790
Jeff Johnson295189b2012-06-20 16:38:30 -07002791 case NV_TABLE_ANTENNA_PATH_LOSS:
2792 tablePtr = (void *)&nvContents->tables.antennaPathLoss[0];
2793 tableSize = sizeof(nvContents->tables.antennaPathLoss);
2794 tableVNVType = VNV_ANTENNA_PATH_LOSS;
2795 break;
2796
2797 case NV_TABLE_PACKET_TYPE_POWER_LIMITS:
2798 tablePtr = (void *)&nvContents->tables.pktTypePwrLimits[0][0];
2799 tableSize = sizeof(nvContents->tables.pktTypePwrLimits);
2800 tableVNVType = VNV_PACKET_TYPE_POWER_LIMITS;
2801 break;
2802
2803 default:
2804 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2805 "Not Supported Table Type %d", nvTable->nvTable);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002806 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002807 break;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002808
Jeff Johnson295189b2012-06-20 16:38:30 -07002809 }
2810
2811 nvStatus = vos_nv_write(tableVNVType,
2812 tablePtr,
2813 tableSize);
2814 if(VOS_STATUS_SUCCESS != nvStatus)
2815 {
c_hpothuffdb5272013-10-02 16:42:35 +05302816 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2817 "Failed update nv item %d", nvStatus);
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08002818 return -EIO;
Jeff Johnson295189b2012-06-20 16:38:30 -07002819 }
2820
2821 return 1;
2822}
2823
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002824/* --------------------------------------------------------------------------
2825 \brief wlan_hdd_ftm_get_nv_bin() -
2826 Get NV bin read from Flash Memory, file
2827
2828 \param - ftmCmd - Pointer FTM Commad Buffer
2829
2830 \return - int
2831 -1, Process Host command fail, vail out
2832 0, Process Host command success
2833--------------------------------------------------------------------------*/
2834
2835static int wlan_hdd_ftm_get_nv_bin
2836(
2837 v_U16_t msgId,
2838 hdd_context_t *pHddCtx,
2839 tPttMsgbuffer *ftmCmd
2840)
2841{
2842 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2843 pttGetNvTable *nvTable = (pttGetNvTable *)&ftmCmd->msgBody.GetNvBin;
2844 v_SIZE_t nvSize;
2845 v_U8_t *nvContents;
2846 v_U16_t offset = 0;
Leo Chang80de3c22013-11-26 10:52:12 -08002847 eNvVersionType nvVersion;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002848
Leo Chang80de3c22013-11-26 10:52:12 -08002849 nvVersion = vos_nv_getNvVersion();
2850 if (E_NV_V3 != nvVersion)
2851 {
2852 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2853 "%s : Not valid NV Version %d", __func__, nvVersion);
2854 return -EINVAL;
2855 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002856
2857 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2858 (0 == pHddCtx->ftm.processedNVTableSize))
2859 {
2860 if ( msgId == PTT_MSG_GET_NV_BIN )
2861 {
2862 nvStatus = vos_nv_getNVEncodedBuffer((void **)&nvContents, &nvSize);
2863 }
2864 else
2865 {
2866 nvStatus = vos_nv_getNVDictionary((void **)&nvContents, &nvSize);
2867 }
2868
2869 if ((VOS_STATUS_SUCCESS != nvStatus) || (NULL == nvContents))
2870 {
c_hpothuffdb5272013-10-02 16:42:35 +05302871 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2872 FL("Fail to get cached NV value Status %d"), nvStatus);
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002873 return -EIO;
2874 }
2875
2876 switch (nvTable->nvTable)
2877 {
2878 case NV_BINARY_IMAGE:
2879 pHddCtx->ftm.targetNVTablePointer = (v_U8_t *)nvContents;
2880 break;
2881 default:
2882 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
2883 "Not Valid NV Table %d", nvTable->nvTable);
2884 return -EIO;
2885 break;
2886 }
2887
2888 /* Set Current Processing NV table type */
2889 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
2890 if ( msgId == PTT_MSG_GET_NV_BIN )
2891 {
2892 pHddCtx->ftm.targetNVTableSize = nvSize + sizeof(v_U32_t);
2893 /* Validity Period */
2894 pHddCtx->ftm.tempNVTableBuffer[0] = 0xFF;
2895 pHddCtx->ftm.tempNVTableBuffer[1] = 0xFF;
2896 pHddCtx->ftm.tempNVTableBuffer[2] = 0xFF;
2897 pHddCtx->ftm.tempNVTableBuffer[3] = 0xFF;
2898 offset = sizeof(v_U32_t);
2899 }
2900 else
2901 {
2902 pHddCtx->ftm.targetNVTableSize = nvSize;
2903 offset = 0;
2904 }
2905
2906 /* Copy target NV table value into temp context buffer */
2907 vos_mem_copy(&pHddCtx->ftm.tempNVTableBuffer[offset],
2908 pHddCtx->ftm.targetNVTablePointer,
2909 pHddCtx->ftm.targetNVTableSize);
2910 }
2911
2912
2913 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
2914 {
2915 /* Invalid table type */
2916 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2917 "Invalid NV Table, now Processing %d, not %d",
2918 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
2919
2920 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2921 pHddCtx->ftm.targetNVTableSize = 0;
2922 pHddCtx->ftm.processedNVTableSize = 0;
2923 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2924
2925 return -EINVAL;
2926 }
2927
2928 nvTable->tableSize = pHddCtx->ftm.targetNVTableSize;
2929
2930 /* Update processed pointer to prepare next chunk copy */
2931 if ( (nvTable->chunkSize + pHddCtx->ftm.processedNVTableSize) >
2932 pHddCtx->ftm.targetNVTableSize )
2933 {
2934 nvTable->chunkSize =
2935 (pHddCtx->ftm.targetNVTableSize - pHddCtx->ftm.processedNVTableSize);
2936 }
2937
2938 /* Copy next chunk of NV table value into response buffer */
2939 vos_mem_copy(
2940 &nvTable->tableData,
2941 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
2942 nvTable->chunkSize);
2943
2944 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
2945
2946 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
2947 {
2948 /* Finished to process last chunk of data, initialize buffer */
2949 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
2950 pHddCtx->ftm.targetNVTableSize = 0;
2951 pHddCtx->ftm.processedNVTableSize = 0;
2952 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
2953 }
2954
2955 return 1;
2956}
2957
2958/**---------------------------------------------------------------------------
2959
2960 \brief wlan_hdd_ftm_set_nv_bin() -
2961 Set NV bin to Flash Memory, file
2962
2963 \param - ftmCmd - Pointer FTM Commad Buffer
2964
2965 \return - int
2966 -1, Process Host command fail, vail out
2967 0, Process Host command success
2968
2969+----------------------------------------------------------------------------*/
2970
2971static int wlan_hdd_ftm_set_nv_bin
2972(
2973 hdd_context_t *pHddCtx,
2974 tPttMsgbuffer *ftmCmd
2975)
2976{
2977 VOS_STATUS nvStatus = VOS_STATUS_SUCCESS;
2978 pttSetNvTable *nvTable = (pttSetNvTable *)&ftmCmd->msgBody.SetNvBin;
Leo Chang80de3c22013-11-26 10:52:12 -08002979 eNvVersionType nvVersion;
2980
2981 nvVersion = vos_nv_getNvVersion();
2982 if (E_NV_V3 != nvVersion)
2983 {
2984 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
2985 "%s : Not valid NV Version %d", __func__, nvVersion);
2986 return -EINVAL;
2987 }
2988
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07002989
2990 /* Test first chunk of NV table */
2991 if ((NV_MAX_TABLE == pHddCtx->ftm.processingNVTable) ||
2992 (0 == pHddCtx->ftm.processedNVTableSize))
2993 {
2994 switch (nvTable->nvTable)
2995 {
2996 case NV_BINARY_IMAGE:
2997 pHddCtx->ftm.targetNVTableSize = nvTable->tableSize;
2998 break;
2999 default:
3000 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3001 "Not Valid NV Table %d", nvTable->nvTable);
3002 return -EIO;
3003 break;
3004 }
3005
3006 /* Set Current Processing NV table type */
3007 pHddCtx->ftm.processingNVTable = nvTable->nvTable;
3008 pHddCtx->ftm.processedNVTableSize = 0;
3009
3010 if (pHddCtx->ftm.targetNVTableSize != nvTable->tableSize)
3011 {
3012 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3013 "Invalid Table Size %d", nvTable->tableSize);
3014 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3015 pHddCtx->ftm.targetNVTableSize = 0;
3016 pHddCtx->ftm.processedNVTableSize = 0;
3017 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3018 return -EINVAL;
3019 }
3020 }
3021
3022 if (pHddCtx->ftm.processingNVTable != nvTable->nvTable)
3023 {
3024 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3025 "Invalid NV Table, now Processing %d, not %d",
3026 pHddCtx->ftm.processingNVTable, nvTable->nvTable);
3027 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3028 pHddCtx->ftm.targetNVTableSize = 0;
3029 pHddCtx->ftm.processedNVTableSize = 0;
3030 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3031 return -EINVAL;
3032 }
3033
3034 vos_mem_copy(
3035 pHddCtx->ftm.tempNVTableBuffer + pHddCtx->ftm.processedNVTableSize,
3036 &nvTable->tableData,
3037 nvTable->chunkSize);
3038
3039 pHddCtx->ftm.processedNVTableSize += nvTable->chunkSize;
3040
3041 if (pHddCtx->ftm.targetNVTableSize == pHddCtx->ftm.processedNVTableSize)
3042 {
3043 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3044 "Processing Done!! write encoded Buffer %d",
3045 pHddCtx->ftm.targetNVTableSize);
3046
3047 nvStatus = wlan_write_to_efs ((v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3048 (v_U16_t)pHddCtx->ftm.targetNVTableSize);
3049
3050 if ((VOS_STATUS_SUCCESS != nvStatus))
3051 {
3052 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3053 "Fail to set NV Binary %d", nvStatus);
3054 return -EIO;
3055 }
3056
3057 nvStatus = vos_nv_setNVEncodedBuffer(
3058 (v_U8_t*)pHddCtx->ftm.tempNVTableBuffer,
3059 (v_SIZE_t)pHddCtx->ftm.targetNVTableSize);
3060
3061 if ((VOS_STATUS_SUCCESS != nvStatus))
3062 {
3063 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
3064 "Fail to set NV Binary %d", nvStatus);
3065 return -EIO;
3066 }
3067
3068 pHddCtx->ftm.processingNVTable = NV_MAX_TABLE;
3069 pHddCtx->ftm.targetNVTableSize = 0;
3070 pHddCtx->ftm.processedNVTableSize = 0;
3071 vos_mem_zero(pHddCtx->ftm.tempNVTableBuffer, MAX_NV_TABLE_SIZE);
3072 }
3073
3074 return 1;
3075}
3076
Jeff Johnson295189b2012-06-20 16:38:30 -07003077/**---------------------------------------------------------------------------
3078
3079 \brief wlan_hdd_ftm_temp_get_rel_num() -
3080 Get internal release number
3081
3082 \param - ftmCmd - Pointer FTM Commad Buffer
3083
3084 \return - int
3085 -1, Process Host command fail, vail out
3086 0, Process Host command success
3087
3088 --------------------------------------------------------------------------*/
3089int wlan_hdd_ftm_temp_get_rel_num
3090(
3091 tPttMsgbuffer *ftmCmd
3092)
3093{
3094 tMsgPttGetBuildReleaseNumber *relNum = (tMsgPttGetBuildReleaseNumber *)&ftmCmd->msgBody.GetBuildReleaseNumber;
3095
3096 relNum->relParams.drvMjr = QWLAN_VERSION_MAJOR;
3097 relNum->relParams.drvMnr = QWLAN_VERSION_MINOR;
3098 relNum->relParams.drvPtch = QWLAN_VERSION_PATCH;
3099 relNum->relParams.drvBld = QWLAN_VERSION_BUILD;
3100 relNum->relParams.pttMax = 10;
3101 relNum->relParams.pttMin = 1;
3102
3103 return 1;
3104}
3105
3106/**---------------------------------------------------------------------------
3107
3108 \brief wlan_hdd_process_ftm_host_cmd() -
3109 process any command should be handled within host.
3110 decide any command should be send to HAL or not
3111
3112 \param - ftmCmd - Pointer FTM Commad Buffer
3113
3114 \return - int
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003115 < 0, Process Host command fail, bail out
Jeff Johnson295189b2012-06-20 16:38:30 -07003116 0, Process Host command success, not need to send CMD to HAL
3117 1, Process Host command success, need to send CMD to HAL
3118
3119 --------------------------------------------------------------------------*/
3120int wlan_hdd_process_ftm_host_cmd
3121(
3122 hdd_context_t *pHddCtx,
3123 void *ftmCmd
3124)
3125{
3126 tPttMsgbuffer *pFTMCmd = (tPttMsgbuffer *)ftmCmd;
3127 int needToRouteHal = 1;
3128 int hostState = 1;
3129
3130 switch(pFTMCmd->msgId)
3131 {
3132 case PTT_MSG_GET_NV_TABLE:
3133 hostState = wlan_hdd_ftm_get_nv_table(pHddCtx, pFTMCmd);
3134 needToRouteHal = 0;
3135 break;
3136
3137 case PTT_MSG_SET_NV_TABLE:
3138 hostState = wlan_hdd_ftm_set_nv_table(pHddCtx, pFTMCmd);
3139 /* Temp NV Operation will be isolated to host
3140 needToRouteHal = 1; */
3141 needToRouteHal = 0;
3142 break;
3143
3144 case PTT_MSG_BLANK_NV:
3145 hostState = wlan_hdd_ftm_blank_nv_table(pFTMCmd);
3146 needToRouteHal = 1;
3147 break;
3148
3149 case PTT_MSG_DEL_NV_TABLE:
3150 hostState = wlan_hdd_ftm_delete_nv_table(pFTMCmd);
3151 needToRouteHal = 1;
3152 break;
3153
3154 case PTT_MSG_GET_NV_FIELD:
3155 hostState = wlan_hdd_ftm_get_nv_field(pFTMCmd);
3156 needToRouteHal = 0;
3157 break;
3158
3159 case PTT_MSG_SET_NV_FIELD:
3160 hostState = wlan_hdd_ftm_set_nv_field(pFTMCmd);
3161 needToRouteHal = 0;
3162 break;
3163
3164 case PTT_MSG_STORE_NV_TABLE:
3165 hostState = wlan_hdd_ftm_store_nv_table(pFTMCmd);
3166 needToRouteHal = 0;
3167 break;
3168
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003169 case PTT_MSG_GET_NV_BIN:
3170 case PTT_MSG_GET_DICTIONARY:
3171 hostState = wlan_hdd_ftm_get_nv_bin(pFTMCmd->msgId, pHddCtx, pFTMCmd);
3172 needToRouteHal = 0;
3173 break;
3174
3175 case PTT_MSG_SET_NV_BIN:
3176 hostState = wlan_hdd_ftm_set_nv_bin(pHddCtx, pFTMCmd);
3177 needToRouteHal = 0;
3178 break;
3179
Jeff Johnson295189b2012-06-20 16:38:30 -07003180 case PTT_MSG_DBG_READ_REGISTER:
3181 wpalReadRegister(pFTMCmd->msgBody.DbgReadRegister.regAddr,
3182 &pFTMCmd->msgBody.DbgReadRegister.regValue);
3183 needToRouteHal = 0;
3184 break;
3185
3186 case PTT_MSG_DBG_WRITE_REGISTER:
3187 wpalWriteRegister(pFTMCmd->msgBody.DbgWriteRegister.regAddr,
3188 pFTMCmd->msgBody.DbgWriteRegister.regValue);
3189 needToRouteHal = 0;
3190 break;
3191
3192 case PTT_MSG_DBG_READ_MEMORY:
3193 wpalReadDeviceMemory(pFTMCmd->msgBody.DbgReadMemory.memAddr,
3194 (unsigned char *)pFTMCmd->msgBody.DbgReadMemory.pMemBuf,
3195 pFTMCmd->msgBody.DbgReadMemory.nBytes);
3196 needToRouteHal = 0;
3197 break;
3198
3199 case PTT_MSG_DBG_WRITE_MEMORY:
3200 wpalWriteDeviceMemory(pFTMCmd->msgBody.DbgWriteMemory.memAddr,
3201 (unsigned char *)pFTMCmd->msgBody.DbgWriteMemory.pMemBuf,
3202 pFTMCmd->msgBody.DbgWriteMemory.nBytes);
3203 needToRouteHal = 0;
3204 break;
3205
3206 case PTT_MSG_GET_BUILD_RELEASE_NUMBER:
3207 wlan_hdd_ftm_temp_get_rel_num(pFTMCmd);
3208 needToRouteHal = 0;
3209 break;
3210
3211 default:
3212 needToRouteHal = 1;
3213 break;
3214 }
3215
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003216 if( 0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003217 {
3218 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
3219 "Host Command Handle Fail, Bailout");
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003220 return hostState;
Jeff Johnson295189b2012-06-20 16:38:30 -07003221 }
3222
3223 return needToRouteHal;
3224}
Jeff Johnson295189b2012-06-20 16:38:30 -07003225
3226/**---------------------------------------------------------------------------
3227
3228 \brief wlan_hdd_process_ftm_cmd() -
3229
3230 This function process the commands received from the ptt socket application.
3231
3232 \param - pAdapter - Pointer HDD Context.
3233
3234 \param - wnl - Pointer to the ANI netlink header.
3235
3236 \return - none
3237
3238 --------------------------------------------------------------------------*/
3239
3240void wlan_hdd_process_ftm_cmd
3241(
3242 hdd_context_t *pHddCtx,
3243 tAniNlHdr *wnl
3244)
3245{
3246 wlan_hdd_ftm_request_t *pRequestBuf = (wlan_hdd_ftm_request_t*)(((v_U8_t*)(&wnl->wmsg))+sizeof(tAniHdr)) ;
3247 v_U16_t cmd_len;
3248 v_U8_t *pftm_data;
3249 pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003250 int hostState;
3251 tPttMsgbuffer *tempRspBuffer = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003252
3253 ENTER();
3254
Jeff Johnsone7245742012-09-05 17:12:55 -07003255 //Delay to fix NV write failure on JB
3256 vos_busy_wait(10000); //10ms
3257
Jeff Johnson295189b2012-06-20 16:38:30 -07003258 if (!pRequestBuf) {
3259
Arif Hussain6d2a3322013-11-17 19:50:10 -08003260 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: request buffer is null",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003261 return ;
3262 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303263
3264 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3265 {
3266 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3267 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3268 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3269 return ;
3270 }
3271
Jeff Johnson295189b2012-06-20 16:38:30 -07003272 /*Save the received request*/
3273 pHddCtx->ftm.pRequestBuf = pRequestBuf;
3274
3275 pHddCtx->ftm.pResponseBuf = (wlan_hdd_ftm_response_t*)pRequestBuf;
3276 /*Save the received request netlink header used for sending the response*/
3277 pHddCtx->ftm.wnl = wnl;
3278 if (pRequestBuf->module_type != QUALCOMM_MODULE_TYPE) {
3279
Arif Hussain6d2a3322013-11-17 19:50:10 -08003280 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Invalid Module Type =%d",__func__,pRequestBuf->module_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003281
3282 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3283 wlan_ftm_send_response(pHddCtx);
3284 return ;
3285 }
3286
3287 switch (pRequestBuf->ftmpkt.ftm_cmd_type)
3288 {
3289 case WLAN_FTM_START:
3290 if (pHddCtx->ftm.ftm_state == WLAN_FTM_STARTED) {
3291
Arif Hussain6d2a3322013-11-17 19:50:10 -08003292 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: FTM has already started =%d",__func__,pRequestBuf->ftmpkt.ftm_cmd_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07003293 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3294 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3295 wlan_ftm_send_response(pHddCtx);
3296 return;
3297 }
3298
3299 if (wlan_hdd_ftm_start(pVosContext->pHDDContext) != VOS_STATUS_SUCCESS)
3300 {
3301 hddLog(VOS_TRACE_LEVEL_ERROR, "%s: : Failed to start WLAN FTM"
3302 ,__func__);
3303 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3304 wlan_ftm_send_response(pHddCtx);
3305 return;
3306 }
3307 /* Ptt application running on the host PC expects the length to be one byte less that what we have received*/
3308 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len -= 1;
3309 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3310 pHddCtx->ftm.pResponseBuf->ftmpkt.ftm_cmd_type = 0;
3311
3312 wlan_ftm_send_response(pHddCtx);
3313
3314 break;
3315
3316 case WLAN_FTM_STOP:
3317 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3318
Arif Hussain6d2a3322013-11-17 19:50:10 -08003319 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003320 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3321 wlan_ftm_send_response(pHddCtx);
3322 return;
3323 }
3324
3325 if (VOS_STATUS_SUCCESS != wlan_ftm_stop(pHddCtx)) {
3326
3327 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3328 wlan_ftm_send_response(pHddCtx);
3329 return;
3330 }
3331
3332 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3333 /* This would send back the Command Success Status */
3334 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3335
3336 wlan_ftm_send_response(pHddCtx);
3337
3338 break;
3339
3340 case WLAN_FTM_CMD:
3341 /* if it is regular FTM command, pass it to HAL PHY */
3342 if(pHddCtx->ftm.IsCmdPending == TRUE) {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003343 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command pending for process",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003344 return;
3345 }
3346 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) {
3347
Arif Hussain6d2a3322013-11-17 19:50:10 -08003348 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM has not started",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003349
3350 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3351 wlan_ftm_send_response(pHddCtx);
3352 return;
3353
3354 }
3355 vos_event_reset(&pHddCtx->ftm.ftm_vos_event);
3356 cmd_len = pRequestBuf->ftm_hdr.data_len;
3357 cmd_len -= (sizeof(wlan_hdd_ftm_request_t)- sizeof(pRequestBuf->ftmpkt.ftm_cmd_type));
3358 pftm_data = pRequestBuf->ftmpkt.pFtmCmd;
3359
Jeff Johnson295189b2012-06-20 16:38:30 -07003360 hostState = wlan_hdd_process_ftm_host_cmd(pHddCtx, pftm_data);
3361 if (0 == hostState)
3362 {
3363 tempRspBuffer = (tPttMsgbuffer *)vos_mem_malloc(((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3364 if (NULL == tempRspBuffer)
3365 {
3366 hddLog(VOS_TRACE_LEVEL_ERROR,
Arif Hussain6d2a3322013-11-17 19:50:10 -08003367 "%s:: temp Mem Alloc Fail",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003368 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3369 wlan_ftm_send_response(pHddCtx);
3370 return;
3371 }
3372 memcpy(tempRspBuffer, pftm_data, ((tPttMsgbuffer *)pftm_data)->msgBodyLength);
3373 tempRspBuffer->msgResponse = PTT_STATUS_SUCCESS;
3374 memcpy((unsigned char *)&pHddCtx->ftm.pResponseBuf->ftmpkt,
3375 (unsigned char *) tempRspBuffer,
3376 tempRspBuffer->msgBodyLength);
3377 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
3378 wlan_ftm_send_response(pHddCtx);
3379 vos_mem_free(tempRspBuffer);
3380 return;
3381 }
Madan Mohan Koyyalamudicae253a2012-11-06 19:10:35 -08003382 else if (0 > hostState)
Jeff Johnson295189b2012-06-20 16:38:30 -07003383 {
3384 hddLog(VOS_TRACE_LEVEL_ERROR, "*** Host Command Handle Fail ***");
3385 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3386 wlan_ftm_send_response(pHddCtx);
3387 return;
3388 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003389
3390 //HEXDUMP("Request:",(char*)pftm_data,cmd_len);
3391
Jeff Johnson295189b2012-06-20 16:38:30 -07003392
3393 /*Post the command to the HAL*/
3394 if (wlan_ftm_postmsg(pftm_data, cmd_len) != VOS_STATUS_SUCCESS) {
3395
Arif Hussain6d2a3322013-11-17 19:50:10 -08003396 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: FTM command failed",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003397 return;
3398
3399 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303400 /*After successful posting of message the command should be pending*/
3401 pHddCtx->ftm.IsCmdPending = TRUE;
3402
Jeff Johnson295189b2012-06-20 16:38:30 -07003403 /*Wait here until you get the response from HAL*/
3404 if (vos_wait_single_event(&pHddCtx->ftm.ftm_vos_event, FTM_VOS_EVENT_WAIT_TIME)!= VOS_STATUS_SUCCESS)
3405 {
Atul Mittalc41126d2014-03-17 15:10:11 +05303406 hddLog(VOS_TRACE_LEVEL_ERROR,"%s: vos_wait_single_event failed",__func__);
3407 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3408 wlan_ftm_send_response(pHddCtx);
3409 pHddCtx->ftm.IsCmdPending = FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 return;
3411 }
Atul Mittalc41126d2014-03-17 15:10:11 +05303412 /*This check will handle the case where the completion is sent by
3413 wlan_hdd_process_ftm_cmd() and not by the HAL*/
3414 if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HDD, NULL))
3415 {
3416 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
3417 "%s: Load/Unload in Progress. Ignoring FTM Command %d"
3418 , __func__, pRequestBuf->ftmpkt.ftm_cmd_type);
3419
3420 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_FAILURE;
3421 wlan_ftm_send_response(pHddCtx);
3422 pHddCtx->ftm.IsCmdPending = FALSE;
3423 return ;
3424 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003425
3426 cmd_len = be16_to_cpu(pHddCtx->ftm.wnl->wmsg.length);
3427
3428 //HEXDUMP("Response to QXDM:", (char *)&pAdapter->ftm.wnl->wmsg, cmd_len);
3429
3430 wlan_ftm_send_response(pHddCtx);
3431 pHddCtx->ftm.IsCmdPending = FALSE;
3432 break;
3433
3434 default:
3435
Arif Hussain6d2a3322013-11-17 19:50:10 -08003436 hddLog(VOS_TRACE_LEVEL_ERROR,"%s:: Command not supported",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 return;
3438 }
3439
3440 EXIT();
3441 return;
3442} /* wlan_adp_ftm_cmd() */
3443
3444/**---------------------------------------------------------------------------
3445
3446 \brief wlan_ftm_priv_start_stop_ftm() -
3447
3448 This function is used for start/stop the ftm driver.
3449
3450 \param - pAdapter - Pointer HDD Context.
3451 - start - 1/0 to start/stop ftm driver.
3452
3453 \return - 0 for success, non zero for failure
3454
3455 --------------------------------------------------------------------------*/
3456
3457static VOS_STATUS wlan_ftm_priv_start_stop_ftm(hdd_adapter_t *pAdapter,
3458 v_U16_t start)
3459{
3460 VOS_STATUS status;
3461 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3462
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07003463 if (start)
Jeff Johnson295189b2012-06-20 16:38:30 -07003464 {
3465 pHddCtx->ftm.cmd_iwpriv = TRUE;
3466 status = wlan_hdd_ftm_start(pHddCtx);
3467
3468 if (status != VOS_STATUS_SUCCESS)
3469 {
3470 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3471 "FTM Start Failed");
3472 return VOS_STATUS_E_FAILURE;
3473 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303474 if (NULL == pMsgBuf)
3475 {
3476 pMsgBuf = (tPttMsgbuffer *)vos_mem_malloc(sizeof(tPttMsgbuffer));
3477 if (NULL == pMsgBuf)
3478 {
3479 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3480 "%s:pMsgBuf is NULL", __func__);
3481 return VOS_STATUS_E_FAILURE;
3482 }
3483 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003484 }
3485 else
3486 {
3487 status = wlan_ftm_stop(pHddCtx);
3488
3489 if (status != VOS_STATUS_SUCCESS)
3490 {
3491 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3492 "FTM Stop Failed");
3493 return VOS_STATUS_E_FAILURE;
3494 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303495 pHddCtx->ftm.ftm_state = WLAN_FTM_STOPPED;
3496 if (pMsgBuf)
3497 {
3498 vos_mem_free((v_VOID_t * )pMsgBuf);
3499 pMsgBuf = NULL;
3500 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003501 }
3502 return VOS_STATUS_SUCCESS;
3503}
3504
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303505
3506static VOS_STATUS validate_channel(unsigned int channel,unsigned int cb)
3507{
3508 unsigned int *table = NULL;
3509 int index = 0;
3510
3511 if (PHY_SINGLE_CHANNEL_CENTERED == cb)
3512 table = valid_channel;
3513 else if (cb >= PHY_DOUBLE_CHANNEL_LOW_PRIMARY &&
3514 cb <= PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
3515 table = valid_channel_cb40;
3516 else if (cb >= PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED &&
3517 cb <= PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
3518 table = valid_channel_cb80;
3519
3520 if (NULL == table)
c_hpothuffdb5272013-10-02 16:42:35 +05303521 {
3522 hddLog(VOS_TRACE_LEVEL_ERROR, "%s failed to find channel table %d",
3523 __func__, cb);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303524 return VOS_STATUS_E_FAILURE;
c_hpothuffdb5272013-10-02 16:42:35 +05303525 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303526
3527 while (table[index] != 0)
3528 {
3529 if (table[index] == channel)
3530 return VOS_STATUS_SUCCESS;
3531
3532 index++;
3533 }
3534
3535 return VOS_STATUS_E_FAILURE;
3536}
3537
3538
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303539static unsigned int get_primary_channel(unsigned int center_channel,unsigned int cb)
3540{
3541 unsigned int primary_channel = center_channel;
3542
3543 if (center_channel <= 14)
3544 return primary_channel ;
3545
3546 switch (cb)
3547 {
3548 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
3549 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3550 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3551 primary_channel -= 2;
3552 break;
3553
3554
3555 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
3556 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3557 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3558 primary_channel += 2;
3559 break;
3560
3561 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3562 primary_channel -= 6;
3563 break;
3564
3565 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3566 primary_channel += 6;
3567 break;
3568 }
3569
3570 return primary_channel;
3571
3572}
3573
Jeff Johnson295189b2012-06-20 16:38:30 -07003574/**---------------------------------------------------------------------------
3575
3576 \brief wlan_ftm_priv_set_channel() -
3577
3578 This function is used for setting the channel to the halphy ptt module.
3579
3580 \param - pAdapter - Pointer HDD Context.
3581 - channel - Channel Number 1-14.
3582
3583 \return - 0 for success, non zero for failure
3584
3585 --------------------------------------------------------------------------*/
3586
3587static VOS_STATUS wlan_ftm_priv_set_channel(hdd_adapter_t *pAdapter,v_U16_t channel)
3588{
Jeff Johnson295189b2012-06-20 16:38:30 -07003589 uPttMsgs *pMsgBody;
3590 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303591 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003592 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3593
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303594 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003595 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303596 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3597 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003598 return VOS_STATUS_E_FAILURE;
3599 }
3600
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303601 if (VOS_STATUS_SUCCESS != validate_channel(channel, ftm_status.cbmode))
Jeff Johnson295189b2012-06-20 16:38:30 -07003602 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303603 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3604 "%s:Invalid Channel Number. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003605 return VOS_STATUS_E_FAILURE;
3606 }
3607
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303608 vos_mem_set(pMsgBuf, sizeof(*pMsgBuf), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003609 init_completion(&pHddCtx->ftm.ftm_comp_var);
3610 pMsgBuf->msgId = PTT_MSG_SET_CHANNEL;
3611 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetChannel) + PTT_HEADER_LENGTH;
3612
3613 pMsgBody = &pMsgBuf->msgBody;
3614
Zhaoming Shuba6c3052013-11-11 18:29:15 +05303615 pMsgBody->SetChannel.chId = get_primary_channel(channel, ftm_status.cbmode);
Jeff Johnson295189b2012-06-20 16:38:30 -07003616
Arif Hussain6d2a3322013-11-17 19:50:10 -08003617 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel =%d",pMsgBody->SetChannel.chId);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303618 pMsgBody->SetChannel.cbState = ftm_status.cbmode ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003619
3620 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3621
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303622 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003623 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3625 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003626 status = VOS_STATUS_E_FAILURE;
3627 goto done;
3628
3629 }
c_hpothuffdb5272013-10-02 16:42:35 +05303630 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303631 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303632 if (0 >= ret )
3633 {
3634 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3635 FL("wait on ftm_comp_var failed %ld"), ret);
3636 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003637
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303638 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003639 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303640 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3641 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003642 status = VOS_STATUS_E_FAILURE;
3643 goto done;
3644
3645 }
3646done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003647
3648 return status;
3649}
3650
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303651
3652/**---------------------------------------------------------------------------
3653
3654 \brief wlan_ftm_priv_set_pwr_cntl_mode() -
3655
3656 This function is used for setting the power control mode for tx.
3657
3658 \param - pAdapter - Pointer HDD Context.
3659 - pwr_mode - power control mode 0-2.
3660
3661 \return - 0 for success, non zero for failure
3662
3663 --------------------------------------------------------------------------*/
3664
3665static VOS_STATUS wlan_ftm_priv_set_pwr_cntl_mode(hdd_adapter_t *pAdapter,
3666 v_U16_t pwr_mode)
3667{
3668 uPttMsgs *pMsgBody;
3669 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303670 long ret;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303671 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3672
3673 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3674 {
3675 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3676 "%s:Ftm has not started. Please start the ftm. ", __func__);
3677 return VOS_STATUS_E_FAILURE;
3678 }
3679
3680 if (pwr_mode > 2)
3681 {
3682 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3683 "%s:invalid control mode.valid mode is 0 , 1, 2.", __func__);
3684 return VOS_STATUS_E_FAILURE;
3685 }
3686
3687 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3688 init_completion(&pHddCtx->ftm.ftm_comp_var);
3689 pMsgBody = &pMsgBuf->msgBody;
3690 pMsgBuf->msgId = PTT_MSG_CLOSE_TPC_LOOP_PRIMA_V1;
3691 pMsgBuf->msgBodyLength = sizeof(tMsgPttCloseTpcLoop) + PTT_HEADER_LENGTH;
3692
3693 pMsgBody->CloseTpcLoop.tpcClose = pwr_mode;
3694 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf, pMsgBuf->msgBodyLength);
3695
3696 if (status != VOS_STATUS_SUCCESS)
3697 {
3698 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3699 "%s:wlan_ftm_postmsg failed", __func__);
3700 status = VOS_STATUS_E_FAILURE;
3701 goto done;
3702 }
c_hpothuffdb5272013-10-02 16:42:35 +05303703 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303704 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303705 if (0 >= ret )
3706 {
3707 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3708 FL("wait on ftm_comp_var failed %ld"), ret);
3709 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303710
3711 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3712 {
3713 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3714 "%s:Ptt response status failed", __func__);
3715 status = VOS_STATUS_E_FAILURE;
3716 goto done;
3717 }
3718
3719 done:
3720 return status;
3721
3722}
3723
Jeff Johnson295189b2012-06-20 16:38:30 -07003724/**---------------------------------------------------------------------------
3725
3726 \brief wlan_ftm_priv_set_txpower() -
3727
3728 This function is used for setting the txpower to the halphy ptt module.
3729
3730 \param - pAdapter - Pointer HDD Context.
3731 - txpower - txpower Number 1-18.
3732
3733 \return - 0 for success, non zero for failure
3734
3735 --------------------------------------------------------------------------*/
3736
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303737static VOS_STATUS wlan_ftm_priv_set_txpower(hdd_adapter_t *pAdapter,
3738 v_U16_t txpower)
Jeff Johnson295189b2012-06-20 16:38:30 -07003739{
Jeff Johnson295189b2012-06-20 16:38:30 -07003740 uPttMsgs *pMsgBody;
3741 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303742 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07003743 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3744
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303745 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003746 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303747 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3748 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003749 return VOS_STATUS_E_FAILURE;
3750 }
3751
3752 /* do not allow to change setting when tx pktgen is enabled, although halphy does allow changing tx power
3753 * when tx pktgen is enabled
3754 */
3755 if (ftm_status.frameGenEnabled)
3756 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303757 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3758 "%s:cannot set txpower when pktgen is enabled.", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003759 return VOS_STATUS_E_FAILURE;
3760 }
3761
3762 if(!(txpower >= 9 && txpower <= 24))
3763 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303764 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3765 "%s:Invalid tx power. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003766 return VOS_STATUS_E_FAILURE;
3767 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003768
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303769 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3770 init_completion(&pHddCtx->ftm.ftm_comp_var);
Jeff Johnson295189b2012-06-20 16:38:30 -07003771 pMsgBody = &pMsgBuf->msgBody;
Jeff Johnson295189b2012-06-20 16:38:30 -07003772 pMsgBuf->msgId = PTT_MSG_SET_TX_POWER;
3773 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetTxPower) + PTT_HEADER_LENGTH;
3774
3775 pMsgBody->SetTxPower.dbmPwr = txpower*100;
3776
3777 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3778
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303779 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003780 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303781 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3782 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003783 status = VOS_STATUS_E_FAILURE;
3784 goto done;
3785 }
c_hpothuffdb5272013-10-02 16:42:35 +05303786 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303787 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05303788 if (0 >= ret )
3789 {
3790 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
3791 FL("wait on ftm_comp_var failed %ld"), ret);
3792 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003793
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303794 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07003795 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303796 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3797 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003798 status = VOS_STATUS_E_FAILURE;
3799 goto done;
3800 }
3801
Jeff Johnson295189b2012-06-20 16:38:30 -07003802 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07003803
3804 return status;
3805
3806}
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303807
3808
3809static VOS_STATUS wlan_ftm_priv_enable_dpd(hdd_adapter_t *pAdapter,
3810 v_U16_t enable)
3811{
3812 tANI_U32 value = 0;
3813 tANI_U32 reg_addr;
3814 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303815
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303816 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3817 {
3818 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3819 "%s:Ftm has not started. Please start the ftm. ", __func__);
3820 return VOS_STATUS_E_FAILURE;
3821 }
3822
Hardik Kantilal Patel7d143922014-03-06 10:07:52 +05303823 reg_addr = WCNSS_TXFIR_OFFSET;
3824
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303825 wpalReadRegister(reg_addr, &value);
3826 if (enable)
3827 {
3828 value &= (~QWLAN_TXFIR_CFG_DPD_BYPASS_MASK);
3829 }
3830 else
3831 {
3832 value |= QWLAN_TXFIR_CFG_DPD_BYPASS_MASK;
3833 }
3834
3835 wpalWriteRegister(reg_addr, value);
3836
3837 return VOS_STATUS_SUCCESS;
3838}
3839
3840
Jeff Johnson295189b2012-06-20 16:38:30 -07003841/**---------------------------------------------------------------------------
3842
3843 \brief wlan_ftm_priv_set_txrate() -
3844
3845 This function is used for setting the txrate to the halphy ptt module.
3846 It converts the user input string for txrate to the tx rate index.
3847
3848 \param - pAdapter - Pointer HDD Context.
3849 - txrate - Pointer to the tx rate string.
3850
3851 \return - 0 for success, non zero for failure
3852
3853 --------------------------------------------------------------------------*/
3854
3855static VOS_STATUS wlan_ftm_priv_set_txrate(hdd_adapter_t *pAdapter,char *txrate)
3856{
3857 int ii;
3858 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3859 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3860 {
3861 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm.",__func__);
3862 return VOS_STATUS_E_FAILURE;
3863 }
3864
3865 /* do not allow to change setting when tx pktgen is enabled */
3866 if (ftm_status.frameGenEnabled)
3867 {
3868 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:cannot set txrate when pktgen is enabled.",__func__);
3869 return VOS_STATUS_E_FAILURE;
3870 }
3871
3872 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++)
3873 {
3874 if(!strcmp(rateName_rateIndex_tbl[ii].rate_str,txrate))
3875 break;
3876 }
3877 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
3878 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08003879 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate String",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 return VOS_STATUS_E_FAILURE;
3881 }
3882
3883 ftm_status.frameParams.rate = rateName_rateIndex_tbl[ii].rate_index;
3884 ftm_status.frameParams.preamble = rate_index_2_preamble_table[rateName_rateIndex_tbl[ii].rate_index].Preamble;
3885
3886 return VOS_STATUS_SUCCESS;
3887}
3888
Zhaoming Shuaaac0362014-05-14 11:59:41 +05303889
3890
3891static VOS_STATUS wlan_ftm_priv_set_power_index(hdd_adapter_t *pAdapter,
3892 ePowerTempIndexSource pwr_source)
3893{
3894 uPttMsgs *pMsgBody;
3895 VOS_STATUS status;
3896 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3897
3898 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
3899 {
3900 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3901 "%s:Ftm has not started. Please start the ftm. ", __func__);
3902 return VOS_STATUS_E_FAILURE;
3903 }
3904
3905 if (pwr_source > 3)
3906 {
3907 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3908 "%s:invalid power index source. valid mode is 0 , 1, 2. ",
3909 __func__);
3910 return VOS_STATUS_E_FAILURE;
3911 }
3912
3913 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
3914
3915 init_completion(&pHddCtx->ftm.ftm_comp_var);
3916 pMsgBody = &pMsgBuf->msgBody;
3917 pMsgBuf->msgId = PTT_MSG_SET_PWR_INDEX_SOURCE;
3918 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetPwrIndexSource) + PTT_HEADER_LENGTH;
3919
3920 pMsgBody->SetPwrIndexSource.indexSource = pwr_source;
3921 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
3922
3923 if (status != VOS_STATUS_SUCCESS)
3924 {
3925 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3926 "%s:wlan_ftm_postmsg failed", __func__);
3927 status = VOS_STATUS_E_FAILURE;
3928 goto done;
3929 }
3930 wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
3931 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
3932
3933 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
3934 {
3935 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3936 "%s:Ptt response status failed", __func__);
3937 status = VOS_STATUS_E_FAILURE;
3938 goto done;
3939 }
3940
3941done:
3942
3943 return status;
3944}
3945
3946
Jeff Johnson295189b2012-06-20 16:38:30 -07003947/**---------------------------------------------------------------------------
3948
3949 \brief wlan_ftm_priv_start_stop_tx_pktgen() -
3950
3951 This function is used for start/stop the tx packet generation.
3952
3953 \param - pAdapter - Pointer HDD Context.
3954 - startStop - Value( 1/0) start/stop the tx packet generation.
3955
3956 \return - 0 for success, non zero for failure
3957
3958 --------------------------------------------------------------------------*/
3959
3960static VOS_STATUS wlan_ftm_priv_start_stop_tx_pktgen(hdd_adapter_t *pAdapter,v_U16_t startStop)
3961{
Jeff Johnson295189b2012-06-20 16:38:30 -07003962 uPttMsgs *pMsgBody;
3963 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05303964 long ret;
3965
Jeff Johnson295189b2012-06-20 16:38:30 -07003966 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
3967
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303968 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07003969 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303970 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3971 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003972 return VOS_STATUS_E_FAILURE;
3973 }
3974
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303975 if (startStop != 1 && startStop != 0)
Jeff Johnson295189b2012-06-20 16:38:30 -07003976 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303977 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
3978 "%s:Tx value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003979 return VOS_STATUS_E_FAILURE;
3980 }
3981
3982 if ((ftm_status.frameGenEnabled && startStop == 1) ||
3983 (!ftm_status.frameGenEnabled && startStop == 0))
3984 {
3985 return VOS_STATUS_SUCCESS ;
3986 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303987 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003988
Jeff Johnson295189b2012-06-20 16:38:30 -07003989 if (startStop == 1)
3990 {
3991 init_completion(&pHddCtx->ftm.ftm_comp_var);
3992 pMsgBuf->msgId = PTT_MSG_CONFIG_TX_PACKET_GEN;
3993 pMsgBuf->msgBodyLength = sizeof(tMsgPttConfigTxPacketGen) + PTT_HEADER_LENGTH;
3994 pMsgBody = &pMsgBuf->msgBody;
3995 pMsgBody->ConfigTxPacketGen.frameParams = ftm_status.frameParams ;
3996
3997 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05303998 if (status != VOS_STATUS_SUCCESS)
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:posting PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004002 status = VOS_STATUS_E_FAILURE;
4003 goto done;
4004 }
4005
c_hpothuffdb5272013-10-02 16:42:35 +05304006 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304007 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304008 if (0 >= ret )
4009 {
4010 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4011 FL("wait on ftm_comp_var failed %ld"), ret);
4012 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304013 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004014 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304015 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4016 "%s: PTT_MSG_CONFIG_TX_PACKET_GEN failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004017 status = VOS_STATUS_E_FAILURE;
4018 goto done;
4019 }
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304020
4021 if (ftm_status.powerCtlMode == 2) //only for CLPC mode
4022 {
4023 status = wlan_ftm_priv_set_power_index(pAdapter, FIXED_POWER_DBM) != VOS_STATUS_SUCCESS; //power index source set to Fixed
4024 if(status != VOS_STATUS_SUCCESS)
4025 {
4026 goto done;
4027 }
4028 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 }
4030
4031 init_completion(&pHddCtx->ftm.ftm_comp_var);
4032 pMsgBuf->msgId = PTT_MSG_START_STOP_TX_PACKET_GEN;
4033 pMsgBuf->msgBodyLength = sizeof(tMsgPttStartStopTxPacketGen) + PTT_HEADER_LENGTH;
4034 pMsgBody = &pMsgBuf->msgBody;
4035 pMsgBody->StartStopTxPacketGen.startStop = startStop;
4036
4037 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4038 if(status != VOS_STATUS_SUCCESS)
4039 {
4040 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:wlan_ftm_postmsg failed",__func__);
4041 status = VOS_STATUS_E_FAILURE;
4042 goto done;
4043 }
4044
c_hpothuffdb5272013-10-02 16:42:35 +05304045 ret = wait_for_completion_interruptible_timeout(
4046 &pHddCtx->ftm.ftm_comp_var,
4047 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
4048 if (0 >= ret )
4049 {
4050 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4051 FL("wait on ftm_comp_var failed %ld"), ret);
4052 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004053 if(pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
4054 {
4055 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ptt response status failed",__func__);
4056 status = VOS_STATUS_E_FAILURE;
4057 goto done;
4058 }
4059
4060done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004061
4062 if (status == VOS_STATUS_SUCCESS)
4063 {
4064 if (startStop == 1)
4065 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304066 ftm_status.frameGenEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004067 }
4068 else
4069 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304070 ftm_status.frameGenEnabled = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004071 }
4072 }
4073
4074 return status;
4075}
4076
4077
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304078
4079static VOS_STATUS wlan_ftm_priv_set_cb(hdd_adapter_t *pAdapter, v_U16_t cbmode)
4080{
4081
4082 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4083 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4084 {
4085 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4086 "%s:Ftm has not started. Please start the ftm. ", __func__);
4087 return VOS_STATUS_E_FAILURE;
4088 }
4089
4090 if (cbmode > PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH)
4091 {
4092 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4093 "%s:cb mode value is invalid ", __func__);
4094 return VOS_STATUS_E_FAILURE;
4095 }
4096
4097 ftm_status.cbmode = cbmode;
4098
4099 return VOS_STATUS_SUCCESS;
4100
4101}
4102
Jeff Johnson295189b2012-06-20 16:38:30 -07004103/**---------------------------------------------------------------------------
4104
4105 \brief wlan_ftm_rx_mode() -
4106
4107 This function is used for start/stop the rx packet generation.
4108
4109 \param - pAdapter - Pointer HDD Context.
4110 - rxmode - 0-disable RX.
4111 - 1-rx ALL frames
4112 - 2-rx 11 g/n frames
4113 - 3-rx 11b frames
4114
4115 \return - 0 for success, non zero for failure
4116
4117 --------------------------------------------------------------------------*/
4118
4119static VOS_STATUS wlan_ftm_priv_rx_mode(hdd_adapter_t *pAdapter,v_U16_t rxmode)
4120{
Jeff Johnson295189b2012-06-20 16:38:30 -07004121 uPttMsgs *pMsgBody;
4122 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304123 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004124
4125 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304126 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004127 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304128 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4129 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004130 return VOS_STATUS_E_FAILURE;
4131 }
4132
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304133 if (rxmode > 3)
Jeff Johnson295189b2012-06-20 16:38:30 -07004134 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304135 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4136 "%s:Rx mode value is invalid ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004137 return VOS_STATUS_E_FAILURE;
4138 }
4139
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304140 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 init_completion(&pHddCtx->ftm.ftm_comp_var);
4142
4143 pMsgBuf->msgId = PTT_MSG_SET_RX_DISABLE_MODE;
4144 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetRxDisableMode) + PTT_HEADER_LENGTH;
4145
4146 pMsgBody = &pMsgBuf->msgBody;
4147
4148 switch(rxmode)
4149 {
4150 case RXMODE_DISABLE_ALL:
4151 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4152 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4153 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4154 break;
4155
4156 case RXMODE_ENABLE_ALL:
4157 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4158 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4159 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_FALSE;
4160 break;
4161
4162 case RXMODE_ENABLE_11GN:
4163 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_FALSE;
4164 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_TRUE;
4165 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4166 break;
4167
4168 case RXMODE_ENABLE_11B:
4169 pMsgBody->SetRxDisableMode.disabled.agPktsDisabled = VOS_TRUE;
4170 pMsgBody->SetRxDisableMode.disabled.bPktsDisabled = VOS_FALSE;
4171 pMsgBody->SetRxDisableMode.disabled.slrPktsDisabled= VOS_TRUE;
4172 break;
4173
4174 }
4175
4176 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4177
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304178 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004179 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304180 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4181 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004182 status = VOS_STATUS_E_FAILURE;
4183 goto done;
4184 }
c_hpothuffdb5272013-10-02 16:42:35 +05304185 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304186 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304187 if (0 >= ret )
4188 {
4189 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4190 FL(" wait on ftm_comp_var failed %ld"), ret);
4191 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004192
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304193 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004194 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304195 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4196 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004197 status = VOS_STATUS_E_FAILURE;
4198 goto done;
4199 }
4200 ftm_status.rxmode = rxmode ;
4201done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004202
4203 return status;
4204}
4205
4206/**---------------------------------------------------------------------------
4207
4208 \brief wlan_ftm_priv_rx_pkt_clear() -
4209
4210 This function sets the rx pkt count to zero.
4211
4212 \param - pAdapter - Pointer HDD Context.
4213 - rx_pkt_clear - rx_pkt_clear value.
4214
4215 \return - 0 for success, non zero for failure
4216
4217 --------------------------------------------------------------------------*/
4218
4219static VOS_STATUS wlan_ftm_priv_rx_pkt_clear(hdd_adapter_t *pAdapter,v_U16_t rx_pkt_clear)
4220{
Jeff Johnson295189b2012-06-20 16:38:30 -07004221 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304222 long ret;
4223
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4225
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304226 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004227 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304228 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4229 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004230 return VOS_STATUS_E_FAILURE;
4231 }
4232
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304233 if (rx_pkt_clear != 1)
Jeff Johnson295189b2012-06-20 16:38:30 -07004234 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304235 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4236 "%s:Invalid rx_pkt_clear value ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004237 return VOS_STATUS_E_FAILURE;
4238 }
4239
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304240 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004241 init_completion(&pHddCtx->ftm.ftm_comp_var);
4242 pMsgBuf->msgId = PTT_MSG_RESET_RX_PACKET_STATISTICS;
Zhaoming Shuaaac0362014-05-14 11:59:41 +05304243 pMsgBuf->msgBodyLength = /*sizeof(tMsgPttResetRxPacketStatistics) + */PTT_HEADER_LENGTH;
Jeff Johnson295189b2012-06-20 16:38:30 -07004244
Jeff Johnson295189b2012-06-20 16:38:30 -07004245 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4246
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304247 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004248 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304249 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4250 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004251 status = VOS_STATUS_E_FAILURE;
4252 goto done;
4253 }
c_hpothuffdb5272013-10-02 16:42:35 +05304254 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304255 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304256 if (0 >= ret )
4257 {
4258 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4259 FL("wait on ftm_comp_var failed %ld"), ret);
4260 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004261
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304262 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004263 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304264 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4265 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004266 status = VOS_STATUS_E_FAILURE;
4267 goto done;
4268 }
4269done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004270
4271 return status;
4272}
4273
4274/**---------------------------------------------------------------------------
4275
4276 \brief wlan_ftm_priv_get_channel() -
4277
4278 This function gets the channel number from the halphy ptt module and
4279 returns the channel number to the application.
4280
4281 \param - pAdapter - Pointer HDD Context.
4282 - pChannel - Poniter to get the Channel number.
4283
4284 \return - 0 for success, non zero for failure
4285
4286 --------------------------------------------------------------------------*/
4287
4288static VOS_STATUS wlan_ftm_priv_get_channel(hdd_adapter_t *pAdapter,v_U16_t *pChannel)
4289{
Jeff Johnson295189b2012-06-20 16:38:30 -07004290 uPttMsgs *pMsgBody;
4291 VOS_STATUS status;
4292 v_U16_t freq;
4293 v_U8_t indx=0;
c_hpothuffdb5272013-10-02 16:42:35 +05304294 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004295
4296 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4297
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304298 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
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:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004302 return VOS_STATUS_E_FAILURE;
4303 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304304 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004305 init_completion(&pHddCtx->ftm.ftm_comp_var);
4306 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4307 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4308
4309 pMsgBody = &pMsgBuf->msgBody;
4310 pMsgBody->DbgReadRegister.regAddr = QWLAN_AGC_CHANNEL_FREQ_REG;
4311
4312 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4313
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304314 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004315 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304316 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4317 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004318 status = VOS_STATUS_E_FAILURE;
4319 goto done;
4320
4321 }
c_hpothuffdb5272013-10-02 16:42:35 +05304322 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304323 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304324 if (0 >= ret )
4325 {
4326 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4327 FL("wait on ftm_comp_var failed %ld"), ret);
4328 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004329
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304330 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004331 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304332 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4333 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004334 status = VOS_STATUS_E_FAILURE;
4335 goto done;
4336 }
4337
4338 freq = ((v_U16_t)pMsgBody->DbgReadRegister.regValue & QWLAN_AGC_CHANNEL_FREQ_FREQ_MASK);
4339
4340 while ((indx < SIZE_OF_TABLE(freq_chan_tbl)) && (freq != freq_chan_tbl[indx].freq))
4341 indx++;
4342 if (indx >= SIZE_OF_TABLE(freq_chan_tbl))
4343 {
4344 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Frequency!!!",__func__);
4345 status = VOS_STATUS_E_FAILURE;
4346 goto done;
4347 }
4348
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004349 *pChannel = freq_chan_tbl[indx].chan;
Jeff Johnson295189b2012-06-20 16:38:30 -07004350
Arif Hussain6d2a3322013-11-17 19:50:10 -08004351 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Channel = %d freq = %d",*pChannel, freq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004352 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004353
4354 return status;
4355}
4356
4357/**---------------------------------------------------------------------------
4358
4359 \brief wlan_ftm_priv_get_txpower() -
4360
4361 This function gets the TX power from the halphy ptt module and
4362 returns the TX power to the application.
4363
4364 \param - pAdapter - Pointer HDD Context.
4365 - pTxPwr - Poniter to get the Tx power.
4366
4367 \return - 0 for success, non zero for failure
4368
4369 --------------------------------------------------------------------------*/
4370
4371static VOS_STATUS wlan_ftm_priv_get_txpower(hdd_adapter_t *pAdapter,v_U16_t *pTxPwr)
4372{
Jeff Johnson295189b2012-06-20 16:38:30 -07004373 uPttMsgs *pMsgBody;
4374 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304375 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004376 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4377
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304378 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004379 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304380 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4381 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004382 return VOS_STATUS_E_FAILURE;
4383 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304384 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004385 init_completion(&pHddCtx->ftm.ftm_comp_var);
4386 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4387 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4388
4389 pMsgBody = &pMsgBuf->msgBody;
4390
4391 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4392
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304393 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004394 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304395 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4396 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004397 status = VOS_STATUS_E_FAILURE;
4398 goto done;
4399 }
c_hpothuffdb5272013-10-02 16:42:35 +05304400 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304401 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304402 if (0 >= ret )
4403 {
4404 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4405 FL("wait on ftm_comp_var failed %ld"), ret);
4406 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004407
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304408 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004409 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304410 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4411 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004412 status = VOS_STATUS_E_FAILURE;
4413 goto done;
4414 }
4415 *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
4416
4417 done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004418
4419 return status;
4420}
4421
4422/**---------------------------------------------------------------------------
4423
4424 \brief wlan_ftm_priv_get_ftm_version() -
4425
4426 This function gets ftm driver and firmware version.
4427
4428 \param - pAdapter - Pointer HDD Context.
4429 - pTxRate - Poniter to get the Tx rate.
4430
4431 \return - 0 for success, non zero for failure
4432
4433 --------------------------------------------------------------------------*/
4434
4435VOS_STATUS wlan_ftm_priv_get_ftm_version(hdd_adapter_t *pAdapter,char *pftmVer)
4436{
Jeff Johnson295189b2012-06-20 16:38:30 -07004437 uPttMsgs *pMsgBody;
4438 VOS_STATUS status;
4439 v_U32_t reg_val;
4440 char *buf = pftmVer;
Jeff Johnson295189b2012-06-20 16:38:30 -07004441 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4442 int lenRes = 0;
4443 int lenBuf = WE_FTM_MAX_STR_LEN;
c_hpothuffdb5272013-10-02 16:42:35 +05304444 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004445
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304446 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004447 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304448 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4449 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004450 return VOS_STATUS_E_FAILURE;
4451 }
4452
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304453 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004454 init_completion(&pHddCtx->ftm.ftm_comp_var);
4455 pMsgBuf->msgId = PTT_MSG_DBG_READ_REGISTER;
4456 pMsgBuf->msgBodyLength = sizeof(tMsgPttDbgReadRegister) + PTT_HEADER_LENGTH;
4457
4458 pMsgBody = &pMsgBuf->msgBody;
4459 pMsgBody->DbgReadRegister.regAddr = QWLAN_RFAPB_REV_ID_REG;
4460
4461 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4462
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304463 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004464 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304465 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4466 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004467 status = VOS_STATUS_E_FAILURE;
4468 goto done;
4469
4470 }
c_hpothuffdb5272013-10-02 16:42:35 +05304471 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304472 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304473 if (0 >= ret )
4474 {
4475 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4476 FL("wait on ftm_comp_var failed %ld"), ret);
4477 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004478
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304479 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004480 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304481 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4482 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004483 status = VOS_STATUS_E_FAILURE;
4484 goto done;
4485 }
4486
4487 reg_val = (v_U16_t)pMsgBody->DbgReadRegister.regValue;
4488
4489 init_completion(&pHddCtx->ftm.ftm_comp_var);
4490
4491 pMsgBuf->msgId = PTT_MSG_GET_BUILD_RELEASE_NUMBER;
4492 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetBuildReleaseNumber) + PTT_HEADER_LENGTH;
4493
4494 pMsgBody = &pMsgBuf->msgBody;
4495
4496 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4497
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304498 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004499 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304500 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4501 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004502 status = VOS_STATUS_E_FAILURE;
4503 goto done;
4504 }
c_hpothuffdb5272013-10-02 16:42:35 +05304505 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304506 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304507 if (0 >= ret )
4508 {
4509 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4510 FL("wait on ftm_comp_var failed %ld"), ret);
4511 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004512
4513 lenRes = snprintf(buf, lenBuf, "%s_",WLAN_CHIP_VERSION);
4514 if(lenRes < 0 || lenRes >= lenBuf)
4515 {
4516 status = VOS_STATUS_E_FAILURE;
4517 goto done;
4518 }
4519
4520 buf += lenRes;
4521 lenBuf -= lenRes;
4522
4523 /*Read the RevID*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004524 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 -07004525 if(lenRes < 0 || lenRes >= lenBuf)
4526 {
4527 status = VOS_STATUS_E_FAILURE;
4528 goto done;
4529 }
4530
4531 buf += lenRes;
4532 lenBuf -= lenRes;
4533
4534 lenRes = snprintf(buf, lenBuf, "%s-", QWLAN_VERSIONSTR);
4535 if(lenRes < 0 || lenRes >= lenBuf)
4536 {
4537 status = VOS_STATUS_E_FAILURE;
4538 goto done;
4539 }
4540
4541 buf += lenRes;
4542 lenBuf -= lenRes;
4543
Jeff Johnson295189b2012-06-20 16:38:30 -07004544
4545done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004546
4547 return status;
4548
4549}
4550
4551/**---------------------------------------------------------------------------
4552
4553 \brief wlan_ftm_priv_get_txrate() -
4554
4555 This function gets the TX rate from the halphy ptt module and
4556 returns the TX rate to the application.
4557
4558 \param - pAdapter - Pointer HDD Context.
4559 - pTxRate - Poniter to get the Tx rate.
4560
4561 \return - 0 for success, non zero for failure
4562
4563 --------------------------------------------------------------------------*/
4564
4565static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
4566{
Jeff Johnson295189b2012-06-20 16:38:30 -07004567 uPttMsgs *pMsgBody;
4568 VOS_STATUS status;
4569 v_U16_t rate_index,ii;
c_hpothuffdb5272013-10-02 16:42:35 +05304570 long ret;
4571
Jeff Johnson295189b2012-06-20 16:38:30 -07004572 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4573
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304574 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004575 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304576 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4577 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004578 return VOS_STATUS_E_FAILURE;
4579 }
4580
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304581 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004582 init_completion(&pHddCtx->ftm.ftm_comp_var);
4583 pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
4584 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
4585
4586 pMsgBody = &pMsgBuf->msgBody;
4587
4588 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4589
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304590 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004591 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304592 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4593 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004594 status = VOS_STATUS_E_FAILURE;
4595 goto done;
4596 }
c_hpothuffdb5272013-10-02 16:42:35 +05304597 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304598 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304599 if (0 >= ret )
4600 {
4601 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4602 FL("wait on ftm_comp_var failed %ld"), ret);
4603 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004604
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304605 if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
Jeff Johnson295189b2012-06-20 16:38:30 -07004606
4607 rate_index = pMsgBody->GetTxPowerReport.rate;
4608 }
4609 else {
4610 /*Return the default rate*/
4611 //rate_index = HAL_PHY_RATE_11A_6_MBPS;
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304612 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4613 "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004614 status = VOS_STATUS_E_FAILURE;
4615 goto done;
4616 }
4617
4618 for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
4619 if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
4620 break;
4621 }
4622 if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
4623 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08004624 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Invalid Rate Index",__func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004625 status = VOS_STATUS_E_FAILURE;
4626 goto done;
4627 }
4628 strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
4629done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004630
4631 return status;
4632
4633}
4634
4635/**---------------------------------------------------------------------------
4636
4637 \brief wlan_ftm_priv_get_rx_pkt_count() -
4638
4639 This function gets the rx pkt count from the halphy ptt module and
4640 returns the rx pkt count to the application.
4641
4642 \param - pAdapter - Pointer HDD Context.
4643 - pRxPktCnt - Poniter to get the rx pkt count.
4644
4645 \return - 0 for success, non zero for failure
4646
4647 --------------------------------------------------------------------------*/
4648
4649static VOS_STATUS wlan_ftm_priv_get_rx_pkt_count(hdd_adapter_t *pAdapter,v_U16_t *pRxPktCnt)
4650{
Jeff Johnson295189b2012-06-20 16:38:30 -07004651 uPttMsgs *pMsgBody;
4652 VOS_STATUS status;
c_hpothuffdb5272013-10-02 16:42:35 +05304653 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004654 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4655
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304656 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004657 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304658 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4659 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004660 return VOS_STATUS_E_FAILURE;
4661 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304662 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004663 init_completion(&pHddCtx->ftm.ftm_comp_var);
4664 pMsgBuf->msgId = PTT_MSG_GET_RX_PKT_COUNTS;
4665 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxPktCounts) + PTT_HEADER_LENGTH;
4666
4667 pMsgBody = &pMsgBuf->msgBody;
4668
4669 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4670
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304671 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004672 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304673 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4674 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004675 status = VOS_STATUS_E_FAILURE;
4676 goto done;
4677 }
c_hpothuffdb5272013-10-02 16:42:35 +05304678 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304679 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304680 if (0 >= ret )
4681 {
4682 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4683 FL("wait on ftm_comp_var failed %ld"), ret);
4684 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004685
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304686 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004687 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304688 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4689 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004690 status = VOS_STATUS_E_FAILURE;
4691 goto done;
4692 }
4693 *pRxPktCnt = pMsgBody->GetRxPktCounts.counters.totalRxPackets;
4694done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004695
4696 return status;
4697}
4698
4699/**---------------------------------------------------------------------------
4700
4701 \brief wlan_ftm_priv_get_rx_rssi() -
4702
4703 This function gets the rx rssi from the halphy ptt module and
4704 returns the rx rssi to the application.
4705
4706 \param - pAdapter - Pointer HDD Context.
4707 - buf - Poniter to get rssi of Rx chains
4708
4709 \return - 0 for success, non zero for failure
4710
4711 --------------------------------------------------------------------------*/
4712
4713static VOS_STATUS wlan_ftm_priv_get_rx_rssi(hdd_adapter_t *pAdapter,char *buf)
4714{
Jeff Johnson295189b2012-06-20 16:38:30 -07004715 uPttMsgs *pMsgBody;
4716 VOS_STATUS status;
4717 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304718 long ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004719
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304720 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004721 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304722 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4723 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004724 return VOS_STATUS_E_FAILURE;
4725 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304726 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004727 init_completion(&pHddCtx->ftm.ftm_comp_var);
4728 pMsgBuf->msgId = PTT_MSG_GET_RX_RSSI;
4729 pMsgBuf->msgBodyLength = sizeof(tMsgPttGetRxRssi) + PTT_HEADER_LENGTH;
4730
4731 pMsgBody = &pMsgBuf->msgBody;
4732
4733 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4734
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304735 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004736 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304737 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4738 "%s:wlan_ftm_postmsg failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004739 status = VOS_STATUS_E_FAILURE;
4740 goto done;
4741 }
c_hpothuffdb5272013-10-02 16:42:35 +05304742 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304743 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304744 if (0 >= ret )
4745 {
4746 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4747 FL("wait on ftm_comp_var failed %ld"), ret);
4748 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004749
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304750 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004751 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304752 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4753 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004754 status = VOS_STATUS_E_FAILURE;
4755 goto done;
4756 }
4757
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004758 ret = snprintf(buf, WE_FTM_MAX_STR_LEN, " R0:%d, R1:%d",
4759 pMsgBody->GetRxRssi.rssi.rx[0],
Jeff Johnson295189b2012-06-20 16:38:30 -07004760 pMsgBody->GetRxRssi.rssi.rx[1]);
4761
4762 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4763 {
4764 status = VOS_STATUS_E_FAILURE;
4765 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004766
Jeff Johnson295189b2012-06-20 16:38:30 -07004767done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004768
4769 return status;
4770}
4771
4772/**---------------------------------------------------------------------------
4773
4774 \brief wlan_ftm_priv_get_mac_address() -
4775
4776 This function gets the mac address from the halphy ptt module and
4777 returns the mac address to the application.
4778
4779 \param - pAdapter - Pointer HDD Context.
4780 - buf - Poniter to get the mac address.
4781
4782 \return - 0 for success, non zero for failure
4783
4784 --------------------------------------------------------------------------*/
4785
4786static VOS_STATUS wlan_ftm_priv_get_mac_address(hdd_adapter_t *pAdapter,char *buf)
4787{
4788 v_BOOL_t itemIsValid = VOS_FALSE;
4789 v_U8_t macAddr[VOS_MAC_ADDRESS_LEN] = {0, 0x0a, 0xf5, 4,5, 6};
4790 int ret;
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004791
Jeff Johnson295189b2012-06-20 16:38:30 -07004792 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
4793
4794 if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
4795 {
4796 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:Ftm has not started. Please start the ftm. ",__func__);
4797 return VOS_STATUS_E_FAILURE;
4798 }
4799 /*Check the NV FIELD is valid or not*/
4800 if (vos_nv_getValidity(VNV_FIELD_IMAGE, &itemIsValid) == VOS_STATUS_SUCCESS)
4801 {
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004802 if (itemIsValid == VOS_TRUE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004803 {
4804 vos_nv_readMacAddress(macAddr);
4805
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004806 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4807 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004808 MAC_ADDR_ARRAY(macAddr));
4809 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4810 {
4811 return VOS_STATUS_E_FAILURE;
4812 }
4813 }
4814 }
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004815 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004816 {
4817 /*Return Hard coded mac address*/
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07004818 ret = snprintf(buf, WE_FTM_MAX_STR_LEN,
4819 "%02x:%02x:%02x:%02x:%02x:%02x",
Jeff Johnson295189b2012-06-20 16:38:30 -07004820 MAC_ADDR_ARRAY(macAddr));
4821
4822 if( ret < 0 || ret >= WE_FTM_MAX_STR_LEN )
4823 {
4824 return VOS_STATUS_E_FAILURE;
4825 }
4826 }
4827 return VOS_STATUS_SUCCESS;
4828}
4829
4830/**---------------------------------------------------------------------------
4831
4832 \brief wlan_ftm_priv_set_mac_address() -
4833
4834 This function sets the mac address to the halphy ptt module and
4835 sends the netlink message to the ptt socket application which writes
4836 the macaddress to the qcom_wlan_nv.bin file
4837
4838 \param - pAdapter - Pointer HDD Context.
4839 - buf - Poniter to the macaddress.
4840
4841 \return - 0 for success, non zero for failure
4842
4843 --------------------------------------------------------------------------*/
4844
4845static VOS_STATUS wlan_ftm_priv_set_mac_address(hdd_adapter_t *pAdapter,char *buf)
4846{
Jeff Johnson295189b2012-06-20 16:38:30 -07004847 uPttMsgs *pMsgBody;
4848 VOS_STATUS status;
4849 int macAddr[VOS_MAC_ADDRESS_LEN];
4850 v_U8_t *pMacAddress;
4851 v_U8_t ii;
4852 hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
c_hpothuffdb5272013-10-02 16:42:35 +05304853 long ret;
Jeff Johnson295189b2012-06-20 16:38:30 -07004854
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304855 if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
Jeff Johnson295189b2012-06-20 16:38:30 -07004856 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304857 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4858 "%s:Ftm has not started. Please start the ftm. ", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004859 return VOS_STATUS_E_FAILURE;
4860 }
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304861 vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004862 init_completion(&pHddCtx->ftm.ftm_comp_var);
4863 pMsgBuf->msgId = PTT_MSG_SET_NV_FIELD;
4864 pMsgBuf->msgBodyLength = sizeof(tMsgPttSetNvField) + PTT_HEADER_LENGTH;
4865
4866 pMsgBody = &pMsgBuf->msgBody;
4867 pMsgBody->SetNvField.nvField = NV_COMMON_MAC_ADDR;
4868
4869 /*We get the mac address in string format "XX:XX:XX:XX:XX:XX" convert to hex*/
Wilson Yang02fd6232013-10-23 11:18:46 -07004870 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]))
4871 {
4872 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4873 "Invalid MacAddress Input %s", buf);
4874 return VOS_STATUS_E_FAILURE;
4875 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004876
Arif Hussain24bafea2013-11-15 15:10:03 -08004877 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4878 "MacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004879
4880
Shailender Karmuchi07f514b2013-06-25 01:14:09 -07004881 pMacAddress = &pMsgBody->SetNvField.fieldData.macAddr.macAddr1[0];
Jeff Johnson295189b2012-06-20 16:38:30 -07004882
4883 for(ii = 0; ii < VOS_MAC_ADDRESS_LEN; ii++)
4884 pMacAddress[ii] = (v_U8_t)macAddr[ii];
4885
4886
Arif Hussain24bafea2013-11-15 15:10:03 -08004887 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
4888 "pMacAddress = " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMacAddress));
Jeff Johnson295189b2012-06-20 16:38:30 -07004889 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4890
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304891 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004892 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304893 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4894 "%s:wlan_ftm_postmsg failed!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004895 status = VOS_STATUS_E_FAILURE;
4896 goto done;
4897 }
c_hpothuffdb5272013-10-02 16:42:35 +05304898 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304899 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304900 if (0 >= ret )
4901 {
4902 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4903 FL("wait on ftm_comp_var failed %ld"), ret);
4904 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004905
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304906 if (pMsgBuf->msgResponse != PTT_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004907 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304908 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4909 "%s:Ptt response status failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004910 status = VOS_STATUS_E_FAILURE;
4911 goto done;
4912 }
4913
Arif Hussain6d2a3322013-11-17 19:50:10 -08004914 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "NV_COMMON_MAC_ADDR Success!!!");
Jeff Johnson295189b2012-06-20 16:38:30 -07004915
4916 init_completion(&pHddCtx->ftm.ftm_comp_var);
4917 memset( pMsgBuf,0,sizeof(tPttMsgbuffer));
4918
4919 pMsgBuf->msgId = PTT_MSG_STORE_NV_TABLE;
4920 pMsgBuf->msgBodyLength = sizeof(tMsgPttStoreNvTable) + PTT_HEADER_LENGTH;
4921
4922 pMsgBody = &pMsgBuf->msgBody;
4923
4924 pMsgBody->StoreNvTable.nvTable = NV_FIELDS_IMAGE;
4925
4926 status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
4927
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304928 if (status != VOS_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -07004929 {
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304930 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
4931 "%s:wlan_ftm_postmsg failed!!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004932 status = VOS_STATUS_E_FAILURE;
4933 goto done;
4934 }
4935
c_hpothuffdb5272013-10-02 16:42:35 +05304936 ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05304937 msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
c_hpothuffdb5272013-10-02 16:42:35 +05304938 if (0 >= ret )
4939 {
4940 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
4941 FL("wait on ftm_comp_var failed %ld"), ret);
4942 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004943done:
Jeff Johnson295189b2012-06-20 16:38:30 -07004944
4945 return VOS_STATUS_SUCCESS;
4946}
4947
4948/* set param sub-ioctls */
4949static int iw_ftm_setchar_getnone(struct net_device *dev, struct iw_request_info *info,
4950 union iwreq_data *wrqu, char *extra)
4951{
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004952 int ret,sub_cmd;
4953 unsigned int length;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004954 char *pointer,*param;
Jeff Johnson295189b2012-06-20 16:38:30 -07004955 VOS_STATUS status;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004956 hdd_adapter_t *pAdapter;
Jeff Johnson295189b2012-06-20 16:38:30 -07004957
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004958 ret =0;
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004959 pointer = wrqu->data.pointer;
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004960 length = wrqu->data.length;
4961 sub_cmd = wrqu->data.flags;
4962 pAdapter = (hdd_adapter_t *)netdev_priv(dev);
4963
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004964 /* we cannot use iotctl_private_iw_point in kernel to allocate memory
4965 * to store data from userspace as IW_SETCHAR_GETNONE is defined as
4966 * odd number which assigns set_args to zero.we assisgn memory using
4967 * kzalloc here to hold userspace data
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004968 */
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004969 param = kzalloc(length + 1, GFP_KERNEL);
4970 if (!param)
4971 return -EINVAL;
Wilson Yang7c471652013-12-20 16:36:44 -08004972
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004973 if (copy_from_user(param, pointer, length))
4974 {
4975 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4976 "%s:Failed to get user data %s", __func__, param);
4977
4978 ret = -EINVAL;
4979 goto OUT;
4980 }
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004981
4982 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
4983 "%s: Received length %d", __func__, length);
4984
4985 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004986 "%s: Received parameters %s", __func__,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004987
4988 switch(sub_cmd)
4989 {
4990 case WE_SET_MAC_ADDRESS:
4991 {
4992
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07004993 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Arif Hussain6d2a3322013-11-17 19:50:10 -08004994 "SET MAC ADDRESS");
Jeff Johnson295189b2012-06-20 16:38:30 -07004995
Wilson Yang8cbdaa42014-01-20 11:37:28 -08004996 status = wlan_ftm_priv_set_mac_address(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07004997
4998 if(status != VOS_STATUS_SUCCESS)
4999 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005000 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005001 "wlan_ftm_priv_set_mac_address Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005002
Jeff Johnson295189b2012-06-20 16:38:30 -07005003 ret = -EINVAL;
5004 }
5005
Wilson Yang7c471652013-12-20 16:36:44 -08005006 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005007 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005008 case WE_SET_TX_RATE:
5009 {
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005010 status = wlan_ftm_priv_set_txrate(pAdapter,param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005011
5012 if(status != VOS_STATUS_SUCCESS)
5013 {
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005014 hddLog(VOS_TRACE_LEVEL_FATAL,
Arif Hussain6d2a3322013-11-17 19:50:10 -08005015 "wlan_ftm_priv_set_txrate Failed =%d",status);
Wilson Yang0eb2d5b2013-10-17 12:55:31 -07005016
5017 ret = -EINVAL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005018 }
5019
5020 break;
Wilson Yang7c471652013-12-20 16:36:44 -08005021 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005022 default:
5023 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005024 hddLog(LOGE, "%s: Invalid sub command %d",__func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005025 ret = -EINVAL;
5026 break;
5027 }
5028 }
Wilson Yang8cbdaa42014-01-20 11:37:28 -08005029
5030OUT:
5031 kfree(param);
Jeff Johnson295189b2012-06-20 16:38:30 -07005032 return ret;
5033}
5034
5035static int iw_ftm_setint_getnone(struct net_device *dev, struct iw_request_info *info,
5036 union iwreq_data *wrqu, char *extra)
5037{
5038 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5039 int *value = (int *)extra;
5040 int sub_cmd = value[0];
5041 int set_value = value[1];
5042 int ret = 0; /* success */
5043 VOS_STATUS status;
5044
5045 switch(sub_cmd)
5046 {
5047 case WE_FTM_ON_OFF:
5048 {
5049 status = wlan_ftm_priv_start_stop_ftm(pAdapter,set_value);
5050
5051 if(status != VOS_STATUS_SUCCESS)
5052 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005053 hddLog(VOS_TRACE_LEVEL_FATAL,"%s Failed =%d",__func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005054 ret = -EINVAL;
5055 }
5056
5057 break;
5058 }
5059
5060 case WE_TX_PKT_GEN:
5061 status = wlan_ftm_priv_start_stop_tx_pktgen(pAdapter,set_value);
5062
5063 if(status != VOS_STATUS_SUCCESS)
5064 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005065 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_start_stop_tx_pktgen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005066 ret = -EINVAL;
5067 }
5068 break;
5069
5070 case WE_SET_TX_IFS:
5071 status = wlan_ftm_priv_set_txifs(pAdapter,set_value);
5072
5073 if(status != VOS_STATUS_SUCCESS)
5074 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005075 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txifs Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005076 ret = -EINVAL;
5077 }
5078 break;
5079
5080 case WE_SET_TX_PKT_CNT:
5081 status = wlan_ftm_priv_set_txpktcnt(pAdapter,set_value);
5082
5083 if(status != VOS_STATUS_SUCCESS)
5084 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005085 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktcnt Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005086 ret = -EINVAL;
5087 }
5088 break;
5089
5090 case WE_SET_TX_PKT_LEN:
5091 status = wlan_ftm_priv_set_txpktlen(pAdapter,set_value);
5092
5093 if(status != VOS_STATUS_SUCCESS)
5094 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005095 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpktlen Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005096 ret = -EINVAL;
5097 }
5098 break;
5099
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305100 case WE_TX_CW_RF_GEN:
5101 status = wlan_ftm_priv_cw_rf_gen(pAdapter,set_value);
5102
5103 if(status != VOS_STATUS_SUCCESS)
5104 {
5105 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_cw_gen Failed =%d\n",status);
5106 ret = -EINVAL;
5107 }
5108 break;
5109
Jeff Johnson295189b2012-06-20 16:38:30 -07005110 case WE_SET_CHANNEL:
5111 {
5112 status = wlan_ftm_priv_set_channel(pAdapter,set_value);
5113
5114 if(status != VOS_STATUS_SUCCESS)
5115 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005116 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005117 ret = -EINVAL;
5118 }
5119 break;
5120 }
5121 case WE_SET_TX_POWER:
5122 {
5123 status = wlan_ftm_priv_set_txpower(pAdapter,set_value);
5124
5125 if(status != VOS_STATUS_SUCCESS)
5126 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005127 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_set_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005128 ret = -EINVAL;
5129 }
5130 break;
5131 }
5132 case WE_CLEAR_RX_PKT_CNT:
5133 {
5134 status = wlan_ftm_priv_rx_pkt_clear(pAdapter,set_value);
5135
5136 if(status != VOS_STATUS_SUCCESS)
5137 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005138 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_pkt_clear Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005139 ret = -EINVAL;
5140 }
5141 break;
5142 }
5143 case WE_RX:
5144 {
5145 status = wlan_ftm_priv_rx_mode(pAdapter,set_value);
5146
5147 if(status != VOS_STATUS_SUCCESS)
5148 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005149 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_rx_mode Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005150 ret = -EINVAL;
5151 }
5152 break;
5153 }
5154 case WE_ENABLE_CHAIN:
5155 {
5156 status = wlan_ftm_priv_enable_chain(pAdapter,set_value);
5157
5158 if(status != VOS_STATUS_SUCCESS)
5159 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005160 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_enable_chain Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005161 ret = -EINVAL;
5162 }
5163 break;
5164 }
5165
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305166 case WE_SET_PWR_CNTL_MODE:
5167 {
5168 status = wlan_ftm_priv_set_pwr_cntl_mode(pAdapter, set_value);
5169 if (status != VOS_STATUS_SUCCESS)
5170 {
5171 hddLog(VOS_TRACE_LEVEL_FATAL, "set_pwr_cntl_mode failed = %d",
5172 status);
5173 ret = -EINVAL;
5174 }
5175 break;
5176 }
5177
5178 case WE_ENABLE_DPD:
5179 {
5180 status = wlan_ftm_priv_enable_dpd(pAdapter, set_value);
5181 if (status != VOS_STATUS_SUCCESS)
5182 {
5183 hddLog(VOS_TRACE_LEVEL_FATAL, "enable_dpd failed = %d", status);
5184 ret = -EINVAL;
5185 }
5186 break;
5187 }
5188
5189 case WE_SET_CB:
5190 {
5191 status = wlan_ftm_priv_set_cb(pAdapter, set_value);
5192 if (status != VOS_STATUS_SUCCESS)
5193 {
5194 hddLog(VOS_TRACE_LEVEL_FATAL, "set_cb failed = %d", status);
5195 ret = -EINVAL;
5196 }
5197 break;
5198 }
5199
Jeff Johnson295189b2012-06-20 16:38:30 -07005200 default:
5201 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005202 hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07005203 sub_cmd, set_value);
5204 break;
5205 }
5206 }
5207
5208 return ret;
5209}
5210
5211/* get param sub-ioctls */
5212static int iw_ftm_setnone_getint(struct net_device *dev, struct iw_request_info *info,
5213 union iwreq_data *wrqu, char *extra)
5214{
5215 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5216 int *value = (int *)extra;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005217 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005218 VOS_STATUS status;
5219
5220 switch (value[0])
5221 {
5222 case WE_GET_CHANNEL:
5223 {
5224 status = wlan_ftm_priv_get_channel(pAdapter,(v_U16_t*)value);
5225
5226 if(status != VOS_STATUS_SUCCESS)
5227 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005228 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_channel Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005229 ret = -EINVAL;
5230 }
5231 break;
5232 }
5233 case WE_GET_TX_POWER:
5234 {
5235 status = wlan_ftm_priv_get_txpower(pAdapter,(v_U16_t*)value);
5236
5237 if(status != VOS_STATUS_SUCCESS)
5238 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005239 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_txpower Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005240 ret = -EINVAL;
5241 }
5242 break;
5243 }
5244 case WE_GET_RX_PKT_CNT:
5245 {
5246 status = wlan_ftm_priv_get_rx_pkt_count(pAdapter,(v_U16_t*)value);
5247
5248 if(status != VOS_STATUS_SUCCESS)
5249 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005250 hddLog(VOS_TRACE_LEVEL_FATAL,"wlan_ftm_priv_get_rx_pkt_count Failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005251 ret = -EINVAL;
5252 }
5253 break;
5254 }
5255 default:
5256 {
5257 hddLog(LOGE, "Invalid IOCTL get_value command %d ",value[0]);
5258 break;
5259 }
5260 }
5261
5262 return ret;
5263}
5264
5265static int iw_ftm_get_char_setnone(struct net_device *dev, struct iw_request_info *info,
5266 union iwreq_data *wrqu, char *extra)
5267{
5268 int sub_cmd = wrqu->data.flags;
5269 VOS_STATUS status;
5270 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5271
5272 switch(sub_cmd)
5273 {
5274 case WE_GET_MAC_ADDRESS:
5275 {
5276 status = wlan_ftm_priv_get_mac_address(pAdapter, extra);
5277
5278 if(status != VOS_STATUS_SUCCESS)
5279 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005280 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005281 return -EINVAL;
5282 }
5283 wrqu->data.length = strlen(extra)+1;
5284 break;
5285 }
5286 case WE_GET_TX_RATE:
5287 {
5288 status = wlan_ftm_priv_get_txrate(pAdapter, extra);
5289
5290 if(status != VOS_STATUS_SUCCESS)
5291 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005292 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_txrate failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005293 return -EINVAL;
5294 }
5295
5296 wrqu->data.length = strlen(extra)+1;
5297 break;
5298 }
5299 case WE_GET_FTM_VERSION:
5300 {
5301 status = wlan_ftm_priv_get_ftm_version(pAdapter, extra);
5302
5303 if(status != VOS_STATUS_SUCCESS)
5304 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005305 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_mac_address failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005306 return -EINVAL;
5307 }
5308 wrqu->data.length = strlen(extra)+1;
5309 break;
5310 }
5311 case WE_GET_FTM_STATUS:
5312 {
5313 status = wlan_ftm_priv_get_status(pAdapter, extra);
5314
5315 if(status != VOS_STATUS_SUCCESS)
5316 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005317 hddLog(VOS_TRACE_LEVEL_FATAL, "wlan_ftm_priv_get_status failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005318 return -EINVAL;
5319 }
5320
5321 wrqu->data.length = strlen(extra)+1;
5322 break;
5323 }
5324 case WE_GET_RX_RSSI:
5325 {
5326 status = wlan_ftm_priv_get_rx_rssi(pAdapter, extra);
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_rx_rssi failed =%d",status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005331 return -EINVAL;
5332 }
5333
5334 wrqu->data.length = strlen(extra)+1;
5335 break;
5336 }
5337 default:
5338 {
Jeff Johnson11e77032014-02-14 13:22:22 -08005339 hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd );
Jeff Johnson295189b2012-06-20 16:38:30 -07005340 break;
5341 }
5342 }
5343
5344 return 0;
5345}
Jeff Johnson295189b2012-06-20 16:38:30 -07005346
5347VOS_STATUS wlan_write_to_efs (v_U8_t *pData, v_U16_t data_len)
5348{
Jeff Johnson88ba7742013-02-27 14:36:02 -08005349#if defined(MSM_PLATFORM)
Jeff Johnson295189b2012-06-20 16:38:30 -07005350 tAniHdr *wmsg = NULL;
5351 v_U8_t *pBuf;
5352 hdd_context_t *pHddCtx = NULL;
5353 v_CONTEXT_t pVosContext= NULL;
5354
5355 pBuf = (v_U8_t*)vos_mem_malloc(sizeof(tAniHdr) + sizeof(v_U32_t)+ data_len);
5356 if(pBuf == NULL)
5357 {
5358 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pBuf is NULL",__func__);
5359 return VOS_STATUS_E_NOMEM;
5360 }
5361 wmsg = (tAniHdr*)pBuf;
5362 wmsg->type = PTT_MSG_FTM_CMDS_TYPE;
5363 wmsg->length = data_len + sizeof(tAniHdr)+ sizeof(v_U32_t);
5364 wmsg->length = FTM_SWAP16(wmsg->length);
5365 pBuf += sizeof(tAniHdr);
5366
5367 /*Get the global context */
5368 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5369
5370 /*Get the Hdd Context */
5371 //pAdapter = ((VosContextType*)(pVosContext))->pHDDContext;
5372 pHddCtx = (hdd_context_t *)(((VosContextType*)(pVosContext))->pHDDContext);
5373
5374 /* EfS command Code */
5375 *(v_U32_t*)pBuf = 0x000000EF;
5376
5377 pBuf += sizeof(v_U32_t);
5378
5379 memcpy(pBuf, pData,data_len);
5380
5381 if(pHddCtx->ftm.cmd_iwpriv == TRUE) {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305382 if( ptt_sock_send_msg_to_app(wmsg, 0,
5383 ANI_NL_MSG_PUMAC, pHddCtx->ptt_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005384
Arif Hussain6d2a3322013-11-17 19:50:10 -08005385 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 -07005386 vos_mem_free((v_VOID_t*)wmsg);
5387 return VOS_STATUS_E_FAILURE;
5388 }
5389 }
5390 else {
Hardik Kantilal Patel9a52d272014-04-29 14:24:55 +05305391 if( ptt_sock_send_msg_to_app(wmsg, 0,
5392 ANI_NL_MSG_PUMAC, pHddCtx->ftm.wnl->nlh.nlmsg_pid, 0) < 0) {
Jeff Johnson295189b2012-06-20 16:38:30 -07005393
Arif Hussain6d2a3322013-11-17 19:50:10 -08005394 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 -07005395 vos_mem_free((v_VOID_t*)wmsg);
5396 return VOS_STATUS_E_FAILURE;
5397 }
5398 }
5399
5400 vos_mem_free((v_VOID_t*)wmsg);
5401#endif //FTM and ANDROID
5402
5403 return VOS_STATUS_SUCCESS;
5404}
5405
Jeff Johnson295189b2012-06-20 16:38:30 -07005406/* action sub-ioctls */
5407static int iw_ftm_setnone_getnone(struct net_device *dev, struct iw_request_info *info,
5408 union iwreq_data *wrqu, char *extra)
5409{
5410 int sub_cmd = wrqu->data.flags;
Jeff Johnsonfeddb2d2012-12-10 14:41:22 -08005411 int ret = 0; /* success */
Jeff Johnson295189b2012-06-20 16:38:30 -07005412
5413 switch (sub_cmd)
5414 {
5415 case WE_SET_NV_DEFAULTS:
5416 {
5417 v_U8_t *pu8buf,*pTempBuf;
5418 v_U16_t size;
5419 size = sizeof(v_U32_t) + sizeof(sHalNv);
Arif Hussain6d2a3322013-11-17 19:50:10 -08005420 hddLog(VOS_TRACE_LEVEL_INFO_HIGH,"HAL NV Size =%d",size);
Jeff Johnson295189b2012-06-20 16:38:30 -07005421 pu8buf = vos_mem_malloc(size);
5422 if(pu8buf == NULL)
5423 {
5424 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pu8buf is NULL",__func__);
5425 return VOS_STATUS_E_NOMEM;
5426 }
5427 memset(pu8buf,0,size);
5428 pTempBuf = pu8buf;
5429 pTempBuf += sizeof(v_U32_t);
5430 memcpy(pTempBuf,&nvDefaults,sizeof(sHalNv));
5431
5432 wlan_write_to_efs(pu8buf,size);
5433 vos_mem_free(pu8buf);
5434 }
5435
5436 default:
5437 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07005438 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: unknown ioctl %d", __func__, sub_cmd);
Jeff Johnson295189b2012-06-20 16:38:30 -07005439 hddLog(LOGE, "Invalid IOCTL action command %d ", sub_cmd);
5440 break;
5441 }
5442 }
5443
5444 return ret;
5445}
5446
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305447static int iw_ftm_set_var_ints_getnone(struct net_device *dev, struct iw_request_info *info,
5448 union iwreq_data *wrqu, char *extra)
5449{
5450 hdd_adapter_t *pAdapter = (netdev_priv(dev));
5451 int sub_cmd = wrqu->data.flags;
5452 int *value = (int*)wrqu->data.pointer;
5453
5454 if(wrqu->data.length != 2)
5455 {
5456 hddLog(LOGE, "Invalid number of Arguments %d \n", wrqu->data.length);
5457 return -EINVAL;
5458 }
5459 switch (sub_cmd)
5460 {
5461 case WE_SET_TX_WF_GAIN:
5462 {
5463 v_S15_t dGain = 0;
5464 v_U16_t rfGain = 0;
5465 VOS_STATUS status;
5466
5467 dGain = *(v_S15_t*) value++;
5468 rfGain = *(v_U16_t*) value;
5469 status = wlan_ftm_priv_set_wfgain(pAdapter,dGain,rfGain);
5470
5471 if(status != VOS_STATUS_SUCCESS)
5472 {
5473 hddLog(VOS_TRACE_LEVEL_FATAL,
5474 "wlan_ftm_priv_set_wfgain Failed =%d\n", status);
5475 return -EINVAL;
5476 }
5477 }
5478 break;
5479
5480 default:
5481 {
5482 hddLog(LOGE, "Invalid IOCTL command %d \n", sub_cmd );
5483 break;
5484 }
5485 }
5486
5487 return 0;
5488}
5489
5490
Jeff Johnson295189b2012-06-20 16:38:30 -07005491static const iw_handler we_ftm_private[] = {
5492
5493 [WLAN_FTM_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setint_getnone, //set priv ioctl
5494 [WLAN_FTM_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getint, //get priv ioctl
5495 [WLAN_FTM_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setchar_getnone, //get priv ioctl
5496 [WLAN_FTM_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_get_char_setnone,
5497 [WLAN_FTM_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_setnone_getnone, //action priv ioctl
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305498 [WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_ftm_set_var_ints_getnone,
Jeff Johnson295189b2012-06-20 16:38:30 -07005499};
5500
5501/*Maximum command length can be only 15 */
5502static const struct iw_priv_args we_ftm_private_args[] = {
5503
5504 /* handlers for main ioctl */
5505 { WLAN_FTM_PRIV_SET_INT_GET_NONE,
5506 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5507 0,
5508 "" },
5509
5510 { WE_FTM_ON_OFF,
5511 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5512 0,
5513 "ftm" },
5514
5515 { WE_TX_PKT_GEN,
5516 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5517 0,
5518 "tx" },
5519
5520 { WE_SET_TX_IFS,
5521 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5522 0,
5523 "set_txifs" },
5524
5525 { WE_SET_TX_PKT_CNT,
5526 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5527 0,
5528 "set_txpktcnt" },
5529
5530 { WE_SET_TX_PKT_LEN,
5531 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5532 0,
5533 "set_txpktlen" },
5534
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305535 { WE_SET_TX_WF_GAIN,
5536 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5537 0,
5538 "set_tx_wf_gain" },
5539
5540 { WE_TX_CW_RF_GEN,
5541 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5542 0,
5543 "tx_cw_rf_gen" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005544 { WE_SET_CHANNEL,
5545 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5546 0,
5547 "set_channel" },
5548
5549 { WE_SET_TX_POWER,
5550 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5551 0,
5552 "set_txpower" },
5553
5554 { WE_CLEAR_RX_PKT_CNT,
5555 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5556 0,
5557 "clr_rxpktcnt" },
5558
5559 { WE_RX,
5560 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5561 0,
5562 "rx" },
5563
5564 { WE_ENABLE_CHAIN,
5565 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5566 0,
5567 "ena_chain" },
5568
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305569 { WE_SET_PWR_CNTL_MODE,
5570 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5571 0,
5572 "pwr_cntl_mode" },
5573
5574 { WE_ENABLE_DPD,
5575 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5576 0,
5577 "ena_dpd" },
5578
5579 { WE_SET_CB,
5580 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5581 0,
5582 "set_cb" },
5583
Jeff Johnson295189b2012-06-20 16:38:30 -07005584 /* handlers for main ioctl */
5585 { WLAN_FTM_PRIV_SET_NONE_GET_INT,
5586 0,
5587 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5588 "" },
5589
5590 { WE_GET_CHANNEL,
5591 0,
5592 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5593 "get_channel" },
5594
5595 { WE_GET_TX_POWER,
5596 0,
5597 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5598 "get_txpower" },
5599
5600 { WE_GET_RX_PKT_CNT,
5601 0,
5602 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
5603 "get_rxpktcnt" },
5604
5605 /* handlers for main ioctl */
5606 { WLAN_FTM_PRIV_SET_CHAR_GET_NONE,
5607 IW_PRIV_TYPE_CHAR| 512,
5608 0,
5609 "" },
5610
5611 { WE_SET_MAC_ADDRESS,
5612 IW_PRIV_TYPE_CHAR| 512,
5613 0,
5614 "set_mac_address" },
5615
5616 { WE_SET_TX_RATE,
5617 IW_PRIV_TYPE_CHAR | 512,
5618 0,
5619 "set_txrate" },
5620
5621 /* handlers for main ioctl */
5622 { WLAN_FTM_PRIV_GET_CHAR_SET_NONE,
5623 0,
5624 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5625 "" },
5626
5627 { WE_GET_MAC_ADDRESS,
5628 0,
5629 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5630 "get_mac_address" },
5631
5632 { WE_GET_FTM_VERSION,
5633 0,
5634 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5635 "ftm_version" },
5636
5637 { WE_GET_TX_RATE,
5638 0,
5639 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5640 "get_txrate" },
5641
5642 { WE_GET_FTM_STATUS,
5643 0,
5644 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5645 "get_status" },
5646
5647 { WE_GET_RX_RSSI,
5648 0,
5649 IW_PRIV_TYPE_CHAR| WE_FTM_MAX_STR_LEN,
5650 "get_rx_rssi" },
5651
Zhaoming Shuaaac0362014-05-14 11:59:41 +05305652 { WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE,
5653 IW_PRIV_TYPE_INT | MAX_FTM_VAR_ARGS,
5654 0,
5655 "" },
Jeff Johnson295189b2012-06-20 16:38:30 -07005656 /* handlers for main ioctl */
5657 { WLAN_FTM_PRIV_SET_NONE_GET_NONE,
5658 0,
5659 0,
5660 "" },
5661
5662 /* handlers for sub-ioctl */
5663 { WE_SET_NV_DEFAULTS,
5664 0,
5665 0,
5666 "set_nv_defaults" },
5667
5668};
5669
5670const struct iw_handler_def we_ftm_handler_def = {
5671 .num_standard = 0,
5672 .num_private = sizeof(we_ftm_private) / sizeof(we_ftm_private[0]),
5673 .num_private_args = sizeof(we_ftm_private_args) / sizeof(we_ftm_private_args[0]),
5674
5675 .standard = (iw_handler *)NULL,
5676 .private = (iw_handler *)we_ftm_private,
5677 .private_args = we_ftm_private_args,
5678 .get_wireless_stats = NULL,
5679};
5680
5681static int wlan_ftm_register_wext(hdd_adapter_t *pAdapter)
5682{
5683
5684 //hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5685
5686 // Zero the memory. This zeros the profile structure.
5687 //memset(pwextBuf, 0,sizeof(hdd_wext_state_t));
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005688
Jeff Johnson295189b2012-06-20 16:38:30 -07005689 pAdapter->dev->wireless_handlers = (struct iw_handler_def *)&we_ftm_handler_def;
5690
5691 return 0;
5692}
5693
Jeff Johnson295189b2012-06-20 16:38:30 -07005694
5695VOS_STATUS WLANFTM_McProcessMsg (v_VOID_t *message)
5696{
Jeff Johnson295189b2012-06-20 16:38:30 -07005697 ftm_rsp_msg_t *pFtmMsgRsp;
5698
5699 VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
5700 hdd_context_t *pHddCtx;
5701 v_CONTEXT_t pVosContext= NULL;
5702
5703 ENTER();
5704
5705 pFtmMsgRsp = (ftm_rsp_msg_t *)message;
5706
5707 if (!message )
5708 {
5709 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
5710 "WLAN FTM:Invalid parameter sent on WLANFTM_ProcessMainMessage");
5711 return VOS_STATUS_E_INVAL;
5712 }
5713 /*Get the global context */
5714 pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
5715
5716 /*Get the Hdd Context */
5717 pHddCtx = ((VosContextType*)(pVosContext))->pHDDContext;
5718
5719 if (pHddCtx->ftm.cmd_iwpriv == TRUE) {
5720
Madan Mohan Koyyalamudi4a18ef22013-08-21 12:10:34 +05305721 memcpy((char*)pMsgBuf, (char*)message, pFtmMsgRsp->msgBodyLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07005722 complete(&pHddCtx->ftm.ftm_comp_var);
5723 }
5724 else {
5725 /*Response length to Ptt App*/
5726 pHddCtx->ftm.wnl->wmsg.length = sizeof(tAniHdr)+ SIZE_OF_FTM_DIAG_HEADER_LEN + pFtmMsgRsp->msgBodyLength;
5727
5728 /*Ptt App expects the response length in LE */
5729 pHddCtx->ftm.wnl->wmsg.length = FTM_SWAP16(pHddCtx->ftm.wnl->wmsg.length);
5730
5731 /*Response expects the length to be in */
Prasanna Kumarf6c94ae2013-04-11 20:05:21 -07005732 pHddCtx->ftm.pResponseBuf->ftm_hdr.data_len = pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len -
Jeff Johnson295189b2012-06-20 16:38:30 -07005733 sizeof(pHddCtx->ftm.pRequestBuf->ftm_hdr.data_len);
5734
5735 /*Copy the message*/
5736 memcpy((char*)&pHddCtx->ftm.pResponseBuf->ftmpkt,(char*)message,pFtmMsgRsp->msgBodyLength);
5737
5738 /*Update the error code*/
5739 pHddCtx->ftm.pResponseBuf->ftm_err_code = WLAN_FTM_SUCCESS;
5740
5741 vos_status = vos_event_set(&pHddCtx->ftm.ftm_vos_event);
5742
5743 if (!VOS_IS_STATUS_SUCCESS(vos_status))
5744 {
Arif Hussain6d2a3322013-11-17 19:50:10 -08005745 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos_event_set failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005746 return VOS_STATUS_E_FAILURE;
5747 }
5748 }
5749 EXIT();
Jeff Johnson295189b2012-06-20 16:38:30 -07005750 return VOS_STATUS_SUCCESS;
5751
5752}