add MTK-combo-module,continue with commit 17f39ed917874e77e80411f33faba1b7ee8138c8
[firefly-linux-kernel-4.4.55.git] / drivers / mtk_wcn_combo / drv_wlan / wlan / os / linux / gl_wext_priv.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_2/os/linux/gl_wext_priv.c#1 $
3 */
4
5 /*! \file gl_wext_priv.c
6     \brief This file includes private ioctl support.
7 */
8
9 /*******************************************************************************
10 * Copyright (c) 2007 MediaTek Inc.
11 *
12 * All rights reserved. Copying, compilation, modification, distribution
13 * or any other use whatsoever of this material is strictly prohibited
14 * except in accordance with a Software License Agreement with
15 * MediaTek Inc.
16 ********************************************************************************
17 */
18
19 /*******************************************************************************
20 * LEGAL DISCLAIMER
21 *
22 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
23 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
24 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
25 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
26 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
27 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
28 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
29 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
30 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
31 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
32 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
33 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
34 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
35 *
36 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
37 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
38 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
39 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
40 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
41 *
42 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
43 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
44 * OF LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
45 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
46 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
47 * (ICC).
48 ********************************************************************************
49 */
50
51 /*
52 ** $Log: gl_wext_priv.c $
53  *
54  * 02 06 2012 wh.su
55  * [ALPS00109161] [Need Patch] [Volunteer Patch] [Wi-Fi] Support the set tx power driver cmd
56  * Adding the AP mode channel query filter.
57  *
58  * 01 20 2012 cp.wu
59  * [ALPS00096191] [MT6620 Wi-Fi][Driver][Firmware] Porting to ALPS4.0_DEV branch
60  * sync to up-to-date changes including:
61  * 1. BOW bugfix
62  * 2. XLOG
63  *
64  * 01 09 2012 wh.su
65  * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
66  * Check in the Add Tx power Cmd to driver.
67  *
68  * 01 02 2012 wh.su
69  * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
70  * Adding the proto type function for set_int set_tx_power and get int get_ch_list.
71  *
72  * 11 10 2011 cp.wu
73  * [WCXRP00001098] [MT6620 Wi-Fi][Driver] Replace printk by DBG LOG macros in linux porting layer
74  * 1. eliminaite direct calls to printk in porting layer.
75  * 2. replaced by DBGLOG, which would be XLOG on ALPS platforms.
76  *
77  * 11 03 2011 chinghwa.yu
78  * [WCXRP00000063] Update BCM CoEx design and settings
79  * Fixed typo.
80  *
81  * 10 24 2011 terry.wu
82  * NULL
83  * Rollback to previous verson due to misbranch check-in
84  *
85  * 10 19 2011 yuche.tsai
86  * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
87  * Branch 2.1
88  * Davinci Maintrunk Label: MT6620_WIFI_DRIVER_FW_TRUNK_MT6620E5_111019_0926.
89  *
90  * 03 18 2011 cp.wu
91  * [WCXRP00000577] [MT6620 Wi-Fi][Driver][FW] Create V2.0 branch for firmware and driver
92  * create V2.0 driver release based on label "MT6620_WIFI_DRIVER_V2_0_110318_1600" from main trunk
93  *
94  * 03 17 2011 chinglan.wang
95  * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
96  * .
97  *
98  * 03 07 2011 terry.wu
99  * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
100  * Toggle non-standard debug messages to comments.
101  *
102  * 01 27 2011 cm.chang
103  * [WCXRP00000402] [MT6620 Wi-Fi][Driver] Enable MCR read/write by iwpriv by default
104  * .
105  *
106  * 01 26 2011 wh.su
107  * [WCXRP00000396] [MT6620 Wi-Fi][Driver] Support Sw Ctrl ioctl at linux
108  * adding the SW cmd ioctl support, use set/get structure ioctl.
109  *
110  * 01 20 2011 eddie.chen
111  * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
112  * Adjust OID order.
113  *
114  * 01 20 2011 eddie.chen
115  * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
116  * Add Oid for sw control debug command
117  *
118  * 01 07 2011 cm.chang
119  * [WCXRP00000336] [MT6620 Wi-Fi][Driver] Add test mode commands in normal phone operation
120  * Add a new compiling option to control if MCR read/write is permitted
121  *
122  * 12 31 2010 cm.chang
123  * [WCXRP00000336] [MT6620 Wi-Fi][Driver] Add test mode commands in normal phone operation
124  * Add some iwpriv commands to support test mode operation
125  *
126  * 12 15 2010 george.huang
127  * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
128  * Support set PS profile and set WMM-PS related iwpriv.
129  *
130  * 11 08 2010 wh.su
131  * [WCXRP00000171] [MT6620 Wi-Fi][Driver] Add message check code same behavior as mt5921
132  * add the message check code from mt5921.
133  *
134  * 10 18 2010 cp.wu
135  * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android
136  * complete implementation of Android NVRAM access
137  *
138  * 09 24 2010 cp.wu
139  * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
140  * correct typo for NVRAM access.
141  *
142  * 09 23 2010 cp.wu
143  * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
144  * add skeleton for NVRAM integration
145  *
146  * 08 04 2010 cp.wu
147  * NULL
148  * revert changelist #15371, efuse read/write access will be done by RF test approach
149  *
150  * 08 04 2010 cp.wu
151  * NULL
152  * add OID definitions for EFUSE read/write access.
153  *
154  * 07 08 2010 cp.wu
155  *
156  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
157  *
158  * 06 06 2010 kevin.huang
159  * [WPD00003832][MT6620 5931] Create driver base
160  * [MT6620 5931] Create driver base
161  *
162  * 06 01 2010 cp.wu
163  * [WPD00001943]Create WiFi test driver framework on WinXP
164  * enable OID_CUSTOM_MTK_WIFI_TEST for RFTest & META tool
165  *
166  * 05 29 2010 jeffrey.chang
167  * [WPD00003826]Initial import for Linux port
168  * fix private ioctl for rftest
169  *
170  * 04 21 2010 jeffrey.chang
171  * [WPD00003826]Initial import for Linux port
172  * add for private ioctl support
173 **  \main\maintrunk.MT5921\32 2009-10-08 10:33:25 GMT mtk01090
174 **  Avoid accessing private data of net_device directly. Replace with netdev_priv(). Add more checking for input parameters and pointers.
175 **  \main\maintrunk.MT5921\31 2009-09-29 16:46:21 GMT mtk01090
176 **  Remove unused functions
177 **  \main\maintrunk.MT5921\30 2009-09-29 14:46:47 GMT mtk01090
178 **  Fix compile warning
179 **  \main\maintrunk.MT5921\29 2009-09-29 14:28:48 GMT mtk01090
180 **  Fix compile warning
181 **  \main\maintrunk.MT5921\28 2009-09-28 22:21:38 GMT mtk01090
182 **  Refine lines to supress compile warning
183 **  \main\maintrunk.MT5921\27 2009-09-28 20:19:14 GMT mtk01090
184 **  Add private ioctl to carry OID structures. Restructure public/private ioctl interfaces to Linux kernel.
185 **  \main\maintrunk.MT5921\26 2009-08-18 22:56:53 GMT mtk01090
186 **  Add Linux SDIO (with mmc core) support.
187 **  Add Linux 2.6.21, 2.6.25, 2.6.26.
188 **  Fix compile warning in Linux.
189 **  \main\maintrunk.MT5921\25 2009-05-07 22:26:15 GMT mtk01089
190 **  Add mandatory and private IO control for Linux BWCS
191 **  \main\maintrunk.MT5921\24 2009-04-29 10:07:05 GMT mtk01088
192 **  fixed the compiling error at linux
193 **  \main\maintrunk.MT5921\23 2009-04-24 09:09:45 GMT mtk01088
194 **  mark the code not used at linux supplicant v0.6.7
195 **  \main\maintrunk.MT5921\22 2008-11-24 21:03:51 GMT mtk01425
196 **  1. Add PTA_ENABLED flag
197 **  \main\maintrunk.MT5921\21 2008-08-29 14:55:59 GMT mtk01088
198 **  adjust the code for meet the coding style, and add assert check
199 **  \main\maintrunk.MT5921\20 2008-07-16 15:23:20 GMT mtk01104
200 **  Support GPIO2 mode
201 **  \main\maintrunk.MT5921\19 2008-07-15 17:43:11 GMT mtk01084
202 **  modify variable name
203 **  \main\maintrunk.MT5921\18 2008-07-14 14:37:58 GMT mtk01104
204 **  Add exception handle about length in function priv_set_struct()
205 **  \main\maintrunk.MT5921\17 2008-07-14 13:55:32 GMT mtk01104
206 **  Support PRIV_CMD_BT_COEXIST
207 **  \main\maintrunk.MT5921\16 2008-07-09 00:20:15 GMT mtk01461
208 **  Add priv oid to support WMM_PS_TEST
209 **  \main\maintrunk.MT5921\15 2008-06-02 11:15:22 GMT mtk01461
210 **  Update after wlanoidSetPowerMode changed
211 **  \main\maintrunk.MT5921\14 2008-05-30 19:31:07 GMT mtk01461
212 **  Add IOCTL for Power Mode
213 **  \main\maintrunk.MT5921\13 2008-05-30 18:57:15 GMT mtk01461
214 **  Not use wlanoidSetCSUMOffloadForLinux()
215 **  \main\maintrunk.MT5921\12 2008-05-30 15:13:18 GMT mtk01084
216 **  rename wlanoid
217 **  \main\maintrunk.MT5921\11 2008-05-29 14:16:31 GMT mtk01084
218 **  rename for wlanoidSetBeaconIntervalForLinux
219 **  \main\maintrunk.MT5921\10 2008-04-17 23:06:37 GMT mtk01461
220 **  Add iwpriv support for AdHocMode setting
221 **  \main\maintrunk.MT5921\9 2008-03-31 21:00:55 GMT mtk01461
222 **  Add priv IOCTL for VOIP setting
223 **  \main\maintrunk.MT5921\8 2008-03-31 13:49:43 GMT mtk01461
224 **  Add priv ioctl to turn on / off roaming
225 **  \main\maintrunk.MT5921\7 2008-03-26 15:35:14 GMT mtk01461
226 **  Add CSUM offload priv ioctl for Linux
227 **  \main\maintrunk.MT5921\6 2008-03-11 14:50:59 GMT mtk01461
228 **  Unify priv ioctl
229 **  \main\maintrunk.MT5921\5 2007-11-06 19:32:30 GMT mtk01088
230 **  add WPS code
231 **  \main\maintrunk.MT5921\4 2007-10-30 12:01:39 GMT MTK01425
232 **  1. Update wlanQueryInformation and wlanSetInformation
233 */
234
235 /*******************************************************************************
236 *                         C O M P I L E R   F L A G S
237 ********************************************************************************
238 */
239
240 /*******************************************************************************
241 *                    E X T E R N A L   R E F E R E N C E S
242 ********************************************************************************
243 */
244 #include "gl_os.h"
245 #include "gl_wext_priv.h"
246 #if CFG_SUPPORT_WAPI
247 #include "gl_sec.h"
248 #endif
249
250 /*******************************************************************************
251 *                              C O N S T A N T S
252 ********************************************************************************
253 */
254 #define NUM_SUPPORTED_OIDS      (sizeof(arWlanOidReqTable) / sizeof(WLAN_REQ_ENTRY))
255
256 /*******************************************************************************
257 *                  F U N C T I O N   D E C L A R A T I O N S
258 ********************************************************************************
259 */
260
261 static int
262 priv_get_ndis (
263     IN struct net_device *prNetDev,
264     IN NDIS_TRANSPORT_STRUCT* prNdisReq,
265     OUT PUINT_32 pu4OutputLen
266     );
267
268 static int
269 priv_set_ndis (
270     IN struct net_device *prNetDev,
271     IN NDIS_TRANSPORT_STRUCT* prNdisReq,
272     OUT PUINT_32 pu4OutputLen
273     );
274
275 #if 0 /* CFG_SUPPORT_WPS */
276 static int
277 priv_set_appie (
278     IN struct net_device *prNetDev,
279     IN struct iw_request_info *prIwReqInfo,
280     IN union iwreq_data *prIwReqData,
281     OUT char *pcExtra
282     );
283
284 static int
285 priv_set_filter (
286     IN struct net_device *prNetDev,
287     IN struct iw_request_info *prIwReqInfo,
288     IN union iwreq_data *prIwReqData,
289     OUT char *pcExtra
290     );
291 #endif /* CFG_SUPPORT_WPS */
292
293 static BOOLEAN
294 reqSearchSupportedOidEntry (
295     IN  UINT_32            rOid,
296     OUT P_WLAN_REQ_ENTRY    *ppWlanReqEntry
297     );
298
299 #if 0
300 static WLAN_STATUS
301 reqExtQueryConfiguration (
302     IN  P_GLUE_INFO_T   prGlueInfo,
303     OUT PVOID           pvQueryBuffer,
304     IN UINT_32          u4QueryBufferLen,
305     OUT PUINT_32        pu4QueryInfoLen
306     );
307
308 static WLAN_STATUS
309 reqExtSetConfiguration (
310     IN  P_GLUE_INFO_T prGlueInfo,
311     IN  PVOID         pvSetBuffer,
312     IN  UINT_32       u4SetBufferLen,
313     OUT PUINT_32      pu4SetInfoLen
314     );
315 #endif
316
317 static WLAN_STATUS
318 reqExtSetAcpiDevicePowerState (
319     IN  P_GLUE_INFO_T prGlueInfo,
320     IN  PVOID         pvSetBuffer,
321     IN  UINT_32       u4SetBufferLen,
322     OUT PUINT_32      pu4SetInfoLen
323     );
324
325 /*******************************************************************************
326 *                       P R I V A T E   D A T A
327 ********************************************************************************
328 */
329 static UINT_8 aucOidBuf[4096] = {0};
330
331 /* OID processing table */
332 /* Order is important here because the OIDs should be in order of
333    increasing value for binary searching. */
334 static WLAN_REQ_ENTRY arWlanOidReqTable[] = {
335     /*
336     {(NDIS_OID)rOid,
337         (PUINT_8)pucOidName,
338         fgQryBufLenChecking, fgSetBufLenChecking, fgIsHandleInGlueLayerOnly, u4InfoBufLen,
339         pfOidQueryHandler,
340         pfOidSetHandler}
341     */
342     /* General Operational Characteristics */
343
344     /* Ethernet Operational Characteristics */
345     {OID_802_3_CURRENT_ADDRESS,
346         DISP_STRING("OID_802_3_CURRENT_ADDRESS"),
347         TRUE, TRUE, ENUM_OID_DRIVER_CORE, 6,
348         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCurrentAddr,
349         NULL},
350
351     /* OID_802_3_MULTICAST_LIST */
352     /* OID_802_3_MAXIMUM_LIST_SIZE */
353     /* Ethernet Statistics */
354
355     /* NDIS 802.11 Wireless LAN OIDs */
356     {OID_802_11_SUPPORTED_RATES,
357         DISP_STRING("OID_802_11_SUPPORTED_RATES"),
358         TRUE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_RATES_EX),
359         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySupportedRates,
360         NULL},
361     /*
362     {OID_802_11_CONFIGURATION,
363         DISP_STRING("OID_802_11_CONFIGURATION"),
364         TRUE, TRUE, ENUM_OID_GLUE_EXTENSION, sizeof(PARAM_802_11_CONFIG_T),
365         (PFN_OID_HANDLER_FUNC_REQ)reqExtQueryConfiguration,
366         (PFN_OID_HANDLER_FUNC_REQ)reqExtSetConfiguration},
367     */
368     {OID_PNP_SET_POWER,
369         DISP_STRING("OID_PNP_SET_POWER"),
370         TRUE, FALSE, ENUM_OID_GLUE_EXTENSION, sizeof(PARAM_DEVICE_POWER_STATE),
371         NULL,
372         (PFN_OID_HANDLER_FUNC_REQ)reqExtSetAcpiDevicePowerState},
373
374     /* Custom OIDs */
375     {OID_CUSTOM_OID_INTERFACE_VERSION,
376         DISP_STRING("OID_CUSTOM_OID_INTERFACE_VERSION"),
377         TRUE, FALSE, ENUM_OID_DRIVER_CORE, 4,
378         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryOidInterfaceVersion,
379         NULL},
380
381     /*
382 #if PTA_ENABLED
383     {OID_CUSTOM_BT_COEXIST_CTRL,
384         DISP_STRING("OID_CUSTOM_BT_COEXIST_CTRL"),
385         FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_BT_COEXIST_T),
386         NULL,
387         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtCoexistCtrl},
388 #endif
389     */
390
391     /*
392     {OID_CUSTOM_POWER_MANAGEMENT_PROFILE,
393         DISP_STRING("OID_CUSTOM_POWER_MANAGEMENT_PROFILE"),
394         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
395         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPwrMgmtProfParam,
396         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPwrMgmtProfParam},
397     {OID_CUSTOM_PATTERN_CONFIG,
398         DISP_STRING("OID_CUSTOM_PATTERN_CONFIG"),
399         TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_PATTERN_SEARCH_CONFIG_STRUC_T),
400         NULL,
401         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPatternConfig},
402     {OID_CUSTOM_BG_SSID_SEARCH_CONFIG,
403         DISP_STRING("OID_CUSTOM_BG_SSID_SEARCH_CONFIG"),
404         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
405         NULL,
406         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBgSsidParam},
407     {OID_CUSTOM_VOIP_SETUP,
408         DISP_STRING("OID_CUSTOM_VOIP_SETUP"),
409         TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
410         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryVoipConnectionStatus,
411         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetVoipConnectionStatus},
412     {OID_CUSTOM_ADD_TS,
413         DISP_STRING("OID_CUSTOM_ADD_TS"),
414         TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
415         NULL,
416         (PFN_OID_HANDLER_FUNC_REQ)wlanoidAddTS},
417     {OID_CUSTOM_DEL_TS,
418         DISP_STRING("OID_CUSTOM_DEL_TS"),
419         TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
420         NULL,
421         (PFN_OID_HANDLER_FUNC_REQ)wlanoidDelTS},
422     */
423
424     /*
425 #if CFG_LP_PATTERN_SEARCH_SLT
426     {OID_CUSTOM_SLT,
427         DISP_STRING("OID_CUSTOM_SLT"),
428         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
429         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySltResult,
430         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSltMode},
431 #endif
432
433     {OID_CUSTOM_ROAMING_EN,
434         DISP_STRING("OID_CUSTOM_ROAMING_EN"),
435         TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
436         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRoamingFunction,
437         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetRoamingFunction},
438     {OID_CUSTOM_WMM_PS_TEST,
439         DISP_STRING("OID_CUSTOM_WMM_PS_TEST"),
440         TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
441         NULL,
442         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWiFiWmmPsTest},
443     {OID_CUSTOM_COUNTRY_STRING,
444         DISP_STRING("OID_CUSTOM_COUNTRY_STRING"),
445         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
446         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCurrentCountry,
447         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetCurrentCountry},
448
449 #if CFG_SUPPORT_802_11D
450     {OID_CUSTOM_MULTI_DOMAIN_CAPABILITY,
451         DISP_STRING("OID_CUSTOM_MULTI_DOMAIN_CAPABILITY"),
452         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
453         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMultiDomainCap,
454         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMultiDomainCap},
455 #endif
456
457     {OID_CUSTOM_GPIO2_MODE,
458         DISP_STRING("OID_CUSTOM_GPIO2_MODE"),
459         FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_PARAM_GPIO2_MODE_T),
460         NULL,
461         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetGPIO2Mode},
462     {OID_CUSTOM_CONTINUOUS_POLL,
463         DISP_STRING("OID_CUSTOM_CONTINUOUS_POLL"),
464         FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CONTINUOUS_POLL_T),
465         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryContinuousPollInterval,
466         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetContinuousPollProfile},
467     {OID_CUSTOM_DISABLE_BEACON_DETECTION,
468         DISP_STRING("OID_CUSTOM_DISABLE_BEACON_DETECTION"),
469         FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
470         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryDisableBeaconDetectionFunc,
471         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisableBeaconDetectionFunc},
472     */
473
474     /* WPS */
475     /*
476     {OID_CUSTOM_DISABLE_PRIVACY_CHECK,
477         DISP_STRING("OID_CUSTOM_DISABLE_PRIVACY_CHECK"),
478         FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
479         NULL,
480         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisablePriavcyCheck},
481     */
482
483     {OID_CUSTOM_MCR_RW,
484         DISP_STRING("OID_CUSTOM_MCR_RW"),
485         TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T),
486         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMcrRead,
487         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMcrWrite},
488
489     {OID_CUSTOM_EEPROM_RW,
490         DISP_STRING("OID_CUSTOM_EEPROM_RW"),
491         TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T),
492         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryEepromRead,
493         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetEepromWrite},
494
495     {OID_CUSTOM_SW_CTRL,
496         DISP_STRING("OID_CUSTOM_SW_CTRL"),
497         TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T),
498         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySwCtrlRead,
499         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSwCtrlWrite},
500
501     {OID_CUSTOM_TEST_MODE,
502         DISP_STRING("OID_CUSTOM_TEST_MODE"),
503         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
504         NULL,
505         (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetTestMode},
506
507     /*
508     {OID_CUSTOM_TEST_RX_STATUS,
509         DISP_STRING("OID_CUSTOM_TEST_RX_STATUS"),
510         FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_RFTEST_RX_STATUS_STRUC_T),
511         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestRxStatus,
512         NULL},
513     {OID_CUSTOM_TEST_TX_STATUS,
514         DISP_STRING("OID_CUSTOM_TEST_TX_STATUS"),
515         FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_RFTEST_TX_STATUS_STRUC_T),
516         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestTxStatus,
517         NULL},
518     */
519     {OID_CUSTOM_ABORT_TEST_MODE,
520         DISP_STRING("OID_CUSTOM_ABORT_TEST_MODE"),
521         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
522         NULL,
523         (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetAbortTestMode},
524     {OID_CUSTOM_MTK_WIFI_TEST,
525         DISP_STRING("OID_CUSTOM_MTK_WIFI_TEST"),
526         TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_MTK_WIFI_TEST_STRUC_T),
527         (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestQueryAutoTest,
528         (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetAutoTest},
529
530     /* OID_CUSTOM_EMULATION_VERSION_CONTROL */
531
532     /* BWCS */
533 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
534     {OID_CUSTOM_BWCS_CMD,
535         DISP_STRING("OID_CUSTOM_BWCS_CMD"),
536         FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PTA_IPC_T),
537         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryBT,
538         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBT},
539 #endif
540
541 /*    {OID_CUSTOM_SINGLE_ANTENNA,
542         DISP_STRING("OID_CUSTOM_SINGLE_ANTENNA"),
543         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
544         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryBtSingleAntenna,
545         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtSingleAntenna},
546     {OID_CUSTOM_SET_PTA,
547         DISP_STRING("OID_CUSTOM_SET_PTA"),
548         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
549         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPta,
550         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPta},
551     */
552
553     { OID_CUSTOM_MTK_NVRAM_RW,
554         DISP_STRING("OID_CUSTOM_MTK_NVRAM_RW"),
555         TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T),
556         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryNvramRead,
557         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetNvramWrite },
558
559     { OID_CUSTOM_CFG_SRC_TYPE,
560         DISP_STRING("OID_CUSTOM_CFG_SRC_TYPE"),
561         FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_CFG_SRC_TYPE_T),
562         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCfgSrcType,
563         NULL },
564
565     { OID_CUSTOM_EEPROM_TYPE,
566         DISP_STRING("OID_CUSTOM_EEPROM_TYPE"),
567         FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_EEPROM_TYPE_T),
568         (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryEepromType,
569         NULL },
570
571 #if CFG_SUPPORT_WAPI
572     {OID_802_11_WAPI_MODE,
573         DISP_STRING("OID_802_11_WAPI_MODE"),
574         FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
575         NULL,
576         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiMode},
577     {OID_802_11_WAPI_ASSOC_INFO,
578         DISP_STRING("OID_802_11_WAPI_ASSOC_INFO"),
579         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
580         NULL,
581         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiAssocInfo},
582     {OID_802_11_SET_WAPI_KEY,
583         DISP_STRING("OID_802_11_SET_WAPI_KEY"),
584         FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_WPI_KEY_T),
585         NULL,
586         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiKey},
587 #endif
588
589 #if CFG_SUPPORT_WPS2
590     {OID_802_11_WSC_ASSOC_INFO,
591         DISP_STRING("OID_802_11_WSC_ASSOC_INFO"),
592         FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
593         NULL,
594         (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWSCAssocInfo},
595 #endif
596
597 };
598
599 /*******************************************************************************
600 *                              F U N C T I O N S
601 ********************************************************************************
602 */
603
604 /*----------------------------------------------------------------------------*/
605 /*!
606 * \brief Dispatching function for private ioctl region (SIOCIWFIRSTPRIV ~
607 *   SIOCIWLASTPRIV).
608 *
609 * \param[in] prNetDev Net device requested.
610 * \param[in] prIfReq Pointer to ifreq structure.
611 * \param[in] i4Cmd Command ID between SIOCIWFIRSTPRIV and SIOCIWLASTPRIV.
612 *
613 * \retval 0 for success.
614 * \retval -EOPNOTSUPP If cmd is not supported.
615 * \retval -EFAULT For fail.
616 *
617 */
618 /*----------------------------------------------------------------------------*/
619 int
620 priv_support_ioctl (
621     IN struct net_device *prNetDev,
622     IN OUT struct ifreq *prIfReq,
623     IN int i4Cmd
624     )
625 {
626     /* prIfReq is verified in the caller function wlanDoIOCTL() */
627     struct iwreq *prIwReq = (struct iwreq *)prIfReq;
628     struct iw_request_info rIwReqInfo;
629
630     /* prDev is verified in the caller function wlanDoIOCTL() */
631
632     /* Prepare the call */
633     rIwReqInfo.cmd = (__u16)i4Cmd;
634     rIwReqInfo.flags = 0;
635
636     switch (i4Cmd) {
637     case IOCTL_SET_INT:
638         /* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need copy_from/to_user() */
639         return priv_set_int(prNetDev, &rIwReqInfo, &(prIwReq->u), (char *) &(prIwReq->u));
640
641     case IOCTL_GET_INT:
642         /* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need copy_from/to_user() */
643         return priv_get_int(prNetDev, &rIwReqInfo, &(prIwReq->u), (char *) &(prIwReq->u));
644
645     case IOCTL_SET_STRUCT:
646     case IOCTL_SET_STRUCT_FOR_EM:
647         return priv_set_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
648
649     case IOCTL_GET_STRUCT:
650         return priv_get_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
651
652     default:
653         return -EOPNOTSUPP;
654
655     } /* end of switch */
656
657 }/* priv_support_ioctl */
658
659
660 /*----------------------------------------------------------------------------*/
661 /*!
662 * \brief Private ioctl set int handler.
663 *
664 * \param[in] prNetDev Net device requested.
665 * \param[in] prIwReqInfo Pointer to iwreq structure.
666 * \param[in] prIwReqData The ioctl data structure, use the field of sub-command.
667 * \param[in] pcExtra The buffer with input value
668 *
669 * \retval 0 For success.
670 * \retval -EOPNOTSUPP If cmd is not supported.
671 * \retval -EINVAL If a value is out of range.
672 *
673 */
674 /*----------------------------------------------------------------------------*/
675 int
676 priv_set_int (
677     IN struct net_device *prNetDev,
678     IN struct iw_request_info *prIwReqInfo,
679     IN union iwreq_data *prIwReqData,
680     IN char *pcExtra
681     )
682 {
683     UINT_32                     u4SubCmd;
684     PUINT_32                    pu4IntBuf;
685     P_NDIS_TRANSPORT_STRUCT     prNdisReq;
686     P_GLUE_INFO_T               prGlueInfo;
687     UINT_32                     u4BufLen = 0;
688     int                         status = 0;
689     P_PTA_IPC_T         prPtaIpc;
690
691     ASSERT(prNetDev);
692     ASSERT(prIwReqInfo);
693     ASSERT(prIwReqData);
694     ASSERT(pcExtra);
695
696     if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
697         return -EINVAL;
698     }
699     prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
700
701     u4SubCmd = (UINT_32) prIwReqData->mode;
702     pu4IntBuf = (PUINT_32) pcExtra;
703
704     switch (u4SubCmd) {
705     case PRIV_CMD_TEST_MODE:
706         //printk("TestMode=%ld\n", pu4IntBuf[1]);
707         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
708
709         if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY) {
710             prNdisReq->ndisOidCmd = OID_CUSTOM_TEST_MODE;
711         }
712         else if (pu4IntBuf[1] == 0) {
713             prNdisReq->ndisOidCmd = OID_CUSTOM_ABORT_TEST_MODE;
714         }
715         else {
716             status = 0;
717             break;
718         }
719         prNdisReq->inNdisOidlength = 0;
720         prNdisReq->outNdisOidLength = 0;
721
722         /* Execute this OID */
723         status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
724         break;
725
726     case PRIV_CMD_TEST_CMD:
727         //printk("CMD=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
728         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
729
730         kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
731
732         prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
733         prNdisReq->inNdisOidlength = 8;
734         prNdisReq->outNdisOidLength = 8;
735
736         /* Execute this OID */
737         status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
738         break;
739
740 #if CFG_SUPPORT_PRIV_MCR_RW
741     case PRIV_CMD_ACCESS_MCR:
742         //printk("addr=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
743         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
744
745         if (!prGlueInfo->fgMcrAccessAllowed) {
746             if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY &&
747                 pu4IntBuf[2] == PRIV_CMD_TEST_MAGIC_KEY) {
748                 prGlueInfo->fgMcrAccessAllowed = TRUE;
749             }
750             status = 0;
751             break;
752         }
753
754         kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
755
756         prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
757         prNdisReq->inNdisOidlength = 8;
758         prNdisReq->outNdisOidLength = 8;
759
760         /* Execute this OID */
761         status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
762         break;
763 #endif
764
765     case PRIV_CMD_SW_CTRL:
766         //printk("addr=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
767         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
768
769         kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
770
771         prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
772         prNdisReq->inNdisOidlength = 8;
773         prNdisReq->outNdisOidLength = 8;
774
775         /* Execute this OID */
776         status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
777         break;
778
779
780     #if 0
781     case PRIV_CMD_BEACON_PERIOD:
782         rStatus = wlanSetInformation(prGlueInfo->prAdapter,
783                            wlanoidSetBeaconInterval,
784                            (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
785                            sizeof(UINT_32),
786                            &u4BufLen);
787         break;
788     #endif
789
790 #if CFG_TCP_IP_CHKSUM_OFFLOAD
791     case PRIV_CMD_CSUM_OFFLOAD:
792         {
793             UINT_32 u4CSUMFlags;
794
795
796             if (pu4IntBuf[1] == 1) {
797                 u4CSUMFlags = CSUM_OFFLOAD_EN_ALL;
798             }
799             else if (pu4IntBuf[1] == 0) {
800                 u4CSUMFlags = 0;
801             }
802             else {
803                 return -EINVAL;
804             }
805
806             if (kalIoctl(prGlueInfo,
807                         wlanoidSetCSUMOffload,
808                         (PVOID)&u4CSUMFlags,
809                         sizeof(UINT_32),
810                         FALSE,
811                         FALSE,
812                         TRUE,
813                         FALSE,
814                         &u4BufLen
815             ) == WLAN_STATUS_SUCCESS) {
816                 if (pu4IntBuf[1] == 1) {
817                     prNetDev->features |= NETIF_F_HW_CSUM;
818                 } else if (pu4IntBuf[1] == 0) {
819                     prNetDev->features &= ~NETIF_F_HW_CSUM;
820                 }
821             }
822         }
823         break;
824 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
825
826     case PRIV_CMD_POWER_MODE:
827             kalIoctl(prGlueInfo,
828                         wlanoidSet802dot11PowerSaveProfile,
829                         (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
830                         sizeof(UINT_32),
831                         FALSE,
832                         FALSE,
833                         TRUE,
834                         FALSE,
835                         &u4BufLen);
836         break;
837
838     case PRIV_CMD_WMM_PS:
839         {
840             PARAM_CUSTOM_WMM_PS_TEST_STRUC_T rWmmPsTest;
841
842             rWmmPsTest.bmfgApsdEnAc = (UINT_8)pu4IntBuf[1];
843             rWmmPsTest.ucIsEnterPsAtOnce = (UINT_8)pu4IntBuf[2];
844             rWmmPsTest.ucIsDisableUcTrigger = (UINT_8)pu4IntBuf[3];
845             rWmmPsTest.reserved = 0;
846
847             kalIoctl(prGlueInfo,
848                         wlanoidSetWiFiWmmPsTest,
849                         (PVOID)&rWmmPsTest,
850                         sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUC_T),
851                         FALSE,
852                         FALSE,
853                         TRUE,
854                         FALSE,
855                         &u4BufLen);
856         }
857         break;
858
859     #if 0
860     case PRIV_CMD_ADHOC_MODE:
861         rStatus = wlanSetInformation(prGlueInfo->prAdapter,
862                            wlanoidSetAdHocMode,
863                            (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
864                            sizeof(UINT_32),
865                            &u4BufLen);
866         break;
867     #endif
868
869     case PRIV_CUSTOM_BWCS_CMD:
870
871         DBGLOG(REQ, INFO, ("pu4IntBuf[1] = %x, size of PTA_IPC_T = %d.\n", pu4IntBuf[1], sizeof(PARAM_PTA_IPC_T)));
872
873         prPtaIpc = (P_PTA_IPC_T) aucOidBuf;
874         prPtaIpc->u.aucBTPParams[0] = (UINT_8) (pu4IntBuf[1] >> 24);
875         prPtaIpc->u.aucBTPParams[1] = (UINT_8) (pu4IntBuf[1] >> 16);
876         prPtaIpc->u.aucBTPParams[2] = (UINT_8) (pu4IntBuf[1] >> 8);
877         prPtaIpc->u.aucBTPParams[3] = (UINT_8) (pu4IntBuf[1]);
878
879         DBGLOG(REQ, INFO, ("BCM BWCS CMD : PRIV_CUSTOM_BWCS_CMD : aucBTPParams[0] = %02x, aucBTPParams[1] = %02x, aucBTPParams[2] = %02x, aucBTPParams[3] = %02x.\n",
880             prPtaIpc->u.aucBTPParams[0],
881             prPtaIpc->u.aucBTPParams[1],
882             prPtaIpc->u.aucBTPParams[2],
883             prPtaIpc->u.aucBTPParams[3]));
884         
885 #if 0
886         status = wlanSetInformation(prGlueInfo->prAdapter,
887                             wlanoidSetBT,
888                             (PVOID)&aucOidBuf[0],
889                             u4CmdLen,
890                             &u4BufLen);
891 #endif
892
893         status = wlanoidSetBT(prGlueInfo->prAdapter,
894                             (PVOID)&aucOidBuf[0],
895                             sizeof(PARAM_PTA_IPC_T),
896                             &u4BufLen);
897         
898         if (WLAN_STATUS_SUCCESS != status) {
899             status = -EFAULT;
900         }
901         
902         break;
903
904     default:
905         return -EOPNOTSUPP;
906     }
907
908     return status;
909 }
910
911
912 /*----------------------------------------------------------------------------*/
913 /*!
914 * \brief Private ioctl get int handler.
915 *
916 * \param[in] pDev Net device requested.
917 * \param[out] pIwReq Pointer to iwreq structure.
918 * \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
919 * \param[out] pcExtra The buffer with put the return value
920 *
921 * \retval 0 For success.
922 * \retval -EOPNOTSUPP If cmd is not supported.
923 * \retval -EFAULT For fail.
924 *
925 */
926 /*----------------------------------------------------------------------------*/
927 int
928 priv_get_int (
929     IN struct net_device *prNetDev,
930     IN struct iw_request_info *prIwReqInfo,
931     IN union iwreq_data *prIwReqData,
932     IN OUT char *pcExtra
933     )
934 {
935     UINT_32                     u4SubCmd;
936     PUINT_32                    pu4IntBuf;
937     P_GLUE_INFO_T               prGlueInfo;
938     UINT_32                     u4BufLen = 0;
939     int                         status = 0;
940     P_NDIS_TRANSPORT_STRUCT     prNdisReq;
941     INT_32                      ch[50];
942
943     ASSERT(prNetDev);
944     ASSERT(prIwReqInfo);
945     ASSERT(prIwReqData);
946     ASSERT(pcExtra);
947     if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
948         return -EINVAL;
949     }
950     prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
951
952     u4SubCmd = (UINT_32) prIwReqData->mode;
953     pu4IntBuf = (PUINT_32) pcExtra;
954
955     switch (u4SubCmd) {
956     case PRIV_CMD_TEST_CMD:
957         //printk("CMD=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
958         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
959
960         kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
961
962         prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
963         prNdisReq->inNdisOidlength = 8;
964         prNdisReq->outNdisOidLength = 8;
965
966         status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
967         if (status == 0) {
968             //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
969             prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
970             /*
971             if (copy_to_user(prIwReqData->data.pointer,
972                              &prNdisReq->ndisOidContent[4], 4)) {
973                 printk(KERN_NOTICE "priv_get_int() copy_to_user oidBuf fail(3)\n");
974                 return -EFAULT;
975             }
976             */
977         }
978         return status;
979
980 #if CFG_SUPPORT_PRIV_MCR_RW
981     case PRIV_CMD_ACCESS_MCR:
982         //printk("addr=0x%08lx\n", pu4IntBuf[1]);
983         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
984
985         if (!prGlueInfo->fgMcrAccessAllowed) {
986             status = 0;
987             break;
988         }
989
990         kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
991
992         prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
993         prNdisReq->inNdisOidlength = 8;
994         prNdisReq->outNdisOidLength = 8;
995
996         status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
997         if (status == 0) {
998             //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
999             prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1000         }
1001         return status;
1002 #endif
1003
1004     case PRIV_CMD_SW_CTRL:
1005         //printk(" addr=0x%08lx\n", pu4IntBuf[1]);
1006
1007         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1008
1009         kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1010
1011         prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1012         prNdisReq->inNdisOidlength = 8;
1013         prNdisReq->outNdisOidLength = 8;
1014
1015         status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1016         if (status == 0) {
1017             //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1018             prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1019         }
1020         return status;
1021
1022     #if 0
1023     case PRIV_CMD_BEACON_PERIOD:
1024         rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
1025                              wlanoidQueryBeaconInterval,
1026                              (PVOID)pu4IntBuf,
1027                              sizeof(UINT_32),
1028                              &u4BufLen);
1029         break;
1030
1031     case PRIV_CMD_POWER_MODE:
1032         rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
1033                              wlanoidQuery802dot11PowerSaveProfile,
1034                              (PVOID)pu4IntBuf,
1035                              sizeof(UINT_32),
1036                              &u4BufLen);
1037         break;
1038
1039     case PRIV_CMD_ADHOC_MODE:
1040         rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
1041                              wlanoidQueryAdHocMode,
1042                              (PVOID)pu4IntBuf,
1043                              sizeof(UINT_32),
1044                              &u4BufLen);
1045         break;
1046     #endif
1047
1048     default:
1049         break;
1050     }
1051
1052     u4SubCmd = (UINT_32) prIwReqData->data.flags;
1053
1054     switch (u4SubCmd) {
1055     case PRIV_CMD_GET_CH_LIST:
1056         {
1057             UINT_16 i, j = 0;
1058             UINT_8 NumOfChannel = 50;
1059             UINT_8 ucMaxChannelNum = 50;
1060             RF_CHANNEL_INFO_T aucChannelList[50];
1061
1062             kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1063             if (NumOfChannel > 50)
1064                 NumOfChannel = 50;
1065
1066             if (kalIsAPmode(prGlueInfo)) {
1067                 for (i = 0; i < NumOfChannel; i++) {
1068                     if ((aucChannelList[i].ucChannelNum <= 13) ||
1069                         (aucChannelList[i].ucChannelNum == 36 || aucChannelList[i].ucChannelNum == 40 ||
1070                         aucChannelList[i].ucChannelNum == 44 || aucChannelList[i].ucChannelNum == 48)) {
1071                         ch[j] = (INT_32)aucChannelList[i].ucChannelNum;
1072                         j++;
1073                     }
1074                 }
1075             }
1076             else {
1077                 for (j = 0; j < NumOfChannel; j++) {
1078                     ch[j] = (INT_32)aucChannelList[j].ucChannelNum;
1079                 }
1080             }
1081
1082             prIwReqData->data.length = j;
1083             if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1084                  return -EFAULT;
1085             }
1086             else
1087                  return status;
1088         }
1089     default:
1090         return -EOPNOTSUPP;
1091     }
1092
1093     return status;
1094 } /* priv_get_int */
1095
1096
1097 /*----------------------------------------------------------------------------*/
1098 /*!
1099 * \brief Private ioctl set int array handler.
1100 *
1101 * \param[in] prNetDev Net device requested.
1102 * \param[in] prIwReqInfo Pointer to iwreq structure.
1103 * \param[in] prIwReqData The ioctl data structure, use the field of sub-command.
1104 * \param[in] pcExtra The buffer with input value
1105 *
1106 * \retval 0 For success.
1107 * \retval -EOPNOTSUPP If cmd is not supported.
1108 * \retval -EINVAL If a value is out of range.
1109 *
1110 */
1111 /*----------------------------------------------------------------------------*/
1112 int
1113 priv_set_ints (
1114     IN struct net_device *prNetDev,
1115     IN struct iw_request_info *prIwReqInfo,
1116     IN union iwreq_data *prIwReqData,
1117     IN char *pcExtra
1118     )
1119 {
1120     UINT_32                     u4SubCmd, u4BufLen;
1121     P_GLUE_INFO_T               prGlueInfo;
1122     int                         status = 0;
1123     WLAN_STATUS                 rStatus = WLAN_STATUS_SUCCESS;
1124     P_SET_TXPWR_CTRL_T          prTxpwr;
1125
1126     ASSERT(prNetDev);
1127     ASSERT(prIwReqInfo);
1128     ASSERT(prIwReqData);
1129     ASSERT(pcExtra);
1130
1131     if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1132         return -EINVAL;
1133     }
1134     prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
1135
1136     u4SubCmd = (UINT_32) prIwReqData->data.flags;
1137
1138     switch (u4SubCmd) {
1139     case PRIV_CMD_SET_TX_POWER:
1140         {
1141         INT_32 *setting = prIwReqData->data.pointer;
1142         UINT_16 i;
1143
1144 #if 0
1145         printk("Tx power num = %d\n", prIwReqData->data.length);
1146
1147         printk("Tx power setting = %d %d %d %d\n",
1148                             setting[0], setting[1], setting[2], setting[3]);
1149 #endif
1150         prTxpwr = &prGlueInfo->rTxPwr;
1151         if (setting[0] == 0 && prIwReqData->data.length == 4 /* argc num */) {
1152             /* 0 (All networks), 1 (legacy STA), 2 (Hotspot AP), 3 (P2P), 4 (BT over Wi-Fi) */
1153             if (setting[1] == 1 || setting[1] == 0) {
1154                 if (setting[2] == 0 || setting[2] == 1)
1155                     prTxpwr->c2GLegacyStaPwrOffset = setting[3];
1156                 if (setting[2] == 0 || setting[2] == 2)
1157                     prTxpwr->c5GLegacyStaPwrOffset = setting[3];
1158             }
1159             if (setting[1] == 2 || setting[1] == 0) {
1160                 if (setting[2] == 0 || setting[2] == 1)
1161                     prTxpwr->c2GHotspotPwrOffset = setting[3];
1162                 if (setting[2] == 0 || setting[2] == 2)
1163                     prTxpwr->c5GHotspotPwrOffset = setting[3];
1164             }
1165             if (setting[1] == 3 || setting[1] == 0) {
1166                 if (setting[2] == 0 || setting[2] == 1)
1167                     prTxpwr->c2GP2pPwrOffset = setting[3];
1168                 if (setting[2] == 0 || setting[2] == 2)
1169                     prTxpwr->c5GP2pPwrOffset = setting[3];
1170             }
1171             if (setting[1] == 4 || setting[1] == 0) {
1172                 if (setting[2] == 0 || setting[2] == 1)
1173                     prTxpwr->c2GBowPwrOffset = setting[3];
1174                 if (setting[2] == 0 || setting[2] == 2)
1175                     prTxpwr->c5GBowPwrOffset = setting[3];
1176             }
1177         }
1178         else if (setting[0] == 1 && prIwReqData->data.length == 2) {
1179             prTxpwr->ucConcurrencePolicy = setting[1];
1180         }
1181         else if (setting[0] == 2 && prIwReqData->data.length == 3) {
1182             if (setting[1] == 0) {
1183                 for (i=0; i<14; i++)
1184                     prTxpwr->acTxPwrLimit2G[i] = setting[2];
1185             }
1186             else if (setting[1] <= 14)
1187                 prTxpwr->acTxPwrLimit2G[setting[1] - 1] = setting[2];
1188         }
1189         else if (setting[0] == 3 && prIwReqData->data.length == 3) {
1190             if (setting[1] == 0) {
1191                 for (i=0; i<4; i++)
1192                     prTxpwr->acTxPwrLimit5G[i] = setting[2];
1193             }
1194             else if (setting[1] <= 4)
1195                 prTxpwr->acTxPwrLimit5G[setting[1] - 1] = setting[2];
1196         }
1197         else if (setting[0] == 4 && prIwReqData->data.length == 2) {
1198             if (setting[1] == 0) {
1199                 wlanDefTxPowerCfg(prGlueInfo->prAdapter);
1200             }
1201             rStatus = kalIoctl(prGlueInfo,
1202                 wlanoidSetTxPower,
1203                 prTxpwr,
1204                 sizeof(SET_TXPWR_CTRL_T),
1205                 TRUE,
1206                 FALSE,
1207                 FALSE,
1208                 FALSE,
1209                 &u4BufLen);
1210         }
1211         else
1212             return -EFAULT;
1213         }
1214         return status;
1215     default:
1216         break;
1217     }
1218
1219     return status;
1220 }
1221
1222
1223 /*----------------------------------------------------------------------------*/
1224 /*!
1225 * \brief Private ioctl get int array handler.
1226 *
1227 * \param[in] pDev Net device requested.
1228 * \param[out] pIwReq Pointer to iwreq structure.
1229 * \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
1230 * \param[out] pcExtra The buffer with put the return value
1231 *
1232 * \retval 0 For success.
1233 * \retval -EOPNOTSUPP If cmd is not supported.
1234 * \retval -EFAULT For fail.
1235 *
1236 */
1237 /*----------------------------------------------------------------------------*/
1238 int
1239 priv_get_ints (
1240     IN struct net_device *prNetDev,
1241     IN struct iw_request_info *prIwReqInfo,
1242     IN union iwreq_data *prIwReqData,
1243     IN OUT char *pcExtra
1244     )
1245 {
1246     UINT_32                     u4SubCmd;
1247     P_GLUE_INFO_T               prGlueInfo;
1248     int                         status = 0;
1249     INT_32                      ch[50];
1250
1251     ASSERT(prNetDev);
1252     ASSERT(prIwReqInfo);
1253     ASSERT(prIwReqData);
1254     ASSERT(pcExtra);
1255     if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1256         return -EINVAL;
1257     }
1258     prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
1259
1260     u4SubCmd = (UINT_32) prIwReqData->data.flags;
1261
1262     switch (u4SubCmd) {
1263     case PRIV_CMD_GET_CH_LIST:
1264         {
1265             UINT_16 i;
1266             UINT_8 NumOfChannel = 50;
1267             UINT_8 ucMaxChannelNum = 50;
1268             RF_CHANNEL_INFO_T aucChannelList[50];
1269
1270             kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1271             if (NumOfChannel > 50)
1272                 NumOfChannel = 50;
1273
1274             for (i = 0; i < NumOfChannel; i++) {
1275                 ch[i] = (INT_32)aucChannelList[i].ucChannelNum;
1276             }
1277
1278             prIwReqData->data.length = NumOfChannel;
1279             if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1280                  return -EFAULT;
1281             }
1282             else
1283                  return status;
1284         }
1285     default:
1286         break;
1287     }
1288
1289     return status;
1290 } /* priv_get_int */
1291
1292 /*----------------------------------------------------------------------------*/
1293 /*!
1294 * \brief Private ioctl set structure handler.
1295 *
1296 * \param[in] pDev Net device requested.
1297 * \param[in] prIwReqData Pointer to iwreq_data structure.
1298 *
1299 * \retval 0 For success.
1300 * \retval -EOPNOTSUPP If cmd is not supported.
1301 * \retval -EINVAL If a value is out of range.
1302 *
1303 */
1304 /*----------------------------------------------------------------------------*/
1305 int
1306 priv_set_struct (
1307     IN struct net_device *prNetDev,
1308     IN struct iw_request_info *prIwReqInfo,
1309     IN union iwreq_data *prIwReqData,
1310     IN char *pcExtra
1311     )
1312 {
1313     UINT_32 u4SubCmd = 0;
1314     int                 status = 0;
1315     //WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1316     UINT_32         u4CmdLen = 0;
1317     P_NDIS_TRANSPORT_STRUCT     prNdisReq;
1318     PUINT_32 pu4IntBuf = NULL;
1319
1320     P_GLUE_INFO_T   prGlueInfo = NULL;
1321     UINT_32         u4BufLen = 0;
1322
1323     ASSERT(prNetDev);
1324     //ASSERT(prIwReqInfo);
1325     ASSERT(prIwReqData);
1326     //ASSERT(pcExtra);
1327
1328         kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1329
1330     if (FALSE == GLUE_CHK_PR2(prNetDev, prIwReqData)) {
1331         return -EINVAL;
1332     }
1333     prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1334
1335     u4SubCmd = (UINT_32) prIwReqData->data.flags;
1336
1337 #if 0
1338     printk(KERN_INFO DRV_NAME"priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1339         prIwReqInfo->cmd,
1340         u4SubCmd
1341         );
1342 #endif
1343
1344     switch (u4SubCmd) {
1345 #if 0 //PTA_ENABLED
1346     case PRIV_CMD_BT_COEXIST:
1347         u4CmdLen = prIwReqData->data.length * sizeof(UINT_32);
1348         ASSERT(sizeof(PARAM_CUSTOM_BT_COEXIST_T) >= u4CmdLen);
1349         if (sizeof(PARAM_CUSTOM_BT_COEXIST_T) < u4CmdLen) {
1350             return -EFAULT;
1351         }
1352
1353         if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1354             status = -EFAULT; //return -EFAULT;
1355             break;
1356         }
1357
1358         rStatus = wlanSetInformation(prGlueInfo->prAdapter,
1359                             wlanoidSetBtCoexistCtrl,
1360                             (PVOID)&aucOidBuf[0],
1361                             u4CmdLen,
1362                             &u4BufLen);
1363         if (WLAN_STATUS_SUCCESS != rStatus) {
1364             status = -EFAULT;
1365         }
1366         break;
1367 #endif
1368
1369     case PRIV_CUSTOM_BWCS_CMD:
1370         u4CmdLen = prIwReqData->data.length * sizeof(UINT_32);
1371         ASSERT(sizeof(PARAM_PTA_IPC_T) >= u4CmdLen);
1372         if (sizeof(PARAM_PTA_IPC_T) < u4CmdLen) {
1373             return -EFAULT;
1374         }
1375 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
1376         DBGLOG(REQ, INFO, ("ucCmdLen = %d, size of PTA_IPC_T = %d, prIwReqData->data = 0x%x.\n", u4CmdLen, sizeof(PARAM_PTA_IPC_T), prIwReqData->data));
1377
1378         DBGLOG(REQ, INFO, ("priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1379             prIwReqInfo->cmd,
1380             u4SubCmd
1381             ));
1382
1383         DBGLOG(REQ, INFO, ("*pcExtra = 0x%x\n", *pcExtra));
1384  #endif
1385
1386         if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1387             status = -EFAULT; //return -EFAULT;
1388             break;
1389         }
1390 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
1391         DBGLOG(REQ, INFO, ("priv_set_struct(): BWCS CMD = %02x%02x%02x%02x\n",
1392             aucOidBuf[2], aucOidBuf[3], aucOidBuf[4], aucOidBuf[5]));
1393 #endif
1394         
1395 #if 0
1396         status = wlanSetInformation(prGlueInfo->prAdapter,
1397                             wlanoidSetBT,
1398                             (PVOID)&aucOidBuf[0],
1399                             u4CmdLen,
1400                             &u4BufLen);
1401 #endif
1402
1403 #if 1
1404         status = wlanoidSetBT(prGlueInfo->prAdapter,
1405                             (PVOID)&aucOidBuf[0],
1406                             u4CmdLen,
1407                             &u4BufLen);
1408 #endif
1409         
1410         if (WLAN_STATUS_SUCCESS != status) {
1411             status = -EFAULT;
1412         }
1413         
1414         break;
1415
1416 #if CFG_SUPPORT_WPS2
1417     case PRIV_CMD_WSC_PROBE_REQ:
1418                 {
1419                         /* retrieve IE for Probe Request */
1420             if (prIwReqData->data.length > 0) {
1421                                 if (copy_from_user(prGlueInfo->aucWSCIE, prIwReqData->data.pointer, 
1422                                         prIwReqData->data.length)) {
1423                     status = -EFAULT;
1424                                     break;
1425                 }
1426                                 prGlueInfo->u2WSCIELen = prIwReqData->data.length;
1427             }
1428                         else {
1429                             prGlueInfo->u2WSCIELen = 0;
1430                         }            
1431         }
1432                 break;
1433 #endif
1434 #if CFG_SUPPORT_WAPI
1435     case PRIV_SEC_MSG_OID:
1436         {
1437             int msg_in_len =0;
1438             int msg_out_len = 0;
1439             unsigned char msg_out[1000];
1440
1441             DBGLOG(WAPI, TRACE, ("Set msg private ioctl!!!\n"));
1442
1443             if (copy_from_user(&aucOidBuf[0],
1444                 prIwReqData->data.pointer,
1445                 prIwReqData->data.length)) { //+2
1446                 status = -EFAULT;
1447                 break;
1448             }
1449             msg_in_len = prIwReqData->data.length;
1450
1451             if(aucOidBuf[0] == 0x01) {
1452
1453                 handle_sec_msg_1(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1454
1455                 prIwReqData->data.length =  msg_out_len;
1456                 if (copy_to_user(prIwReqData->data.pointer,
1457                     &(prIwReqData->data.length),
1458                     sizeof(__u16))) {
1459                     DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1460                     status = -EFAULT;
1461                     break;
1462                 }
1463
1464                 if (copy_to_user((char *)prIwReqData->data.pointer + sizeof(__u16),
1465                     &msg_out[0],
1466                     prIwReqData->data.length)) {
1467                     DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1468                     status = -EFAULT;
1469                     break;
1470                 }
1471
1472             }
1473             else if(aucOidBuf[0] == 0x02){
1474
1475                 handle_sec_msg_2(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1476
1477                 prIwReqData->data.length =  0;
1478                 if (copy_to_user(prIwReqData->data.pointer,
1479                     &(prIwReqData->data.length),
1480                     sizeof(__u16))) {
1481                     DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1482                     status = -EFAULT;
1483                     break;
1484                 }
1485             }
1486             else if(aucOidBuf[0] == 0x03){
1487
1488                 handle_sec_msg_3(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1489
1490                 prIwReqData->data.length =  0;
1491                 if (copy_to_user(prIwReqData->data.pointer,
1492                         &(prIwReqData->data.length),
1493                         sizeof(__u16))) {
1494                         DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1495                         status = -EFAULT;
1496                         break;
1497                 }
1498             }
1499             else if(aucOidBuf[0] == 0x04){
1500
1501                 handle_sec_msg_4(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1502
1503                 prIwReqData->data.length =  0;
1504                 if (copy_to_user(prIwReqData->data.pointer,
1505                     &(prIwReqData->data.length),
1506                     sizeof(__u16))) {
1507                     DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1508                     status = -EFAULT;
1509                     break;
1510                 }
1511             }
1512             else if(aucOidBuf[0] == 0x05){
1513
1514                 handle_sec_msg_5(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1515
1516                 prIwReqData->data.length =  0;
1517                 if (copy_to_user(prIwReqData->data.pointer,
1518                         &(prIwReqData->data.length),
1519                         sizeof(__u16))) {
1520                     DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1521                     status = -EFAULT;
1522                     break;
1523                 }
1524            }
1525
1526         }
1527         break;
1528 #endif
1529     case PRIV_CMD_OID:
1530         if (copy_from_user(&aucOidBuf[0],
1531                             prIwReqData->data.pointer,
1532                             prIwReqData->data.length)) {
1533             status = -EFAULT;
1534             break;
1535         }
1536         if (!kalMemCmp(&aucOidBuf[0], pcExtra, prIwReqData->data.length)) {
1537             DBGLOG(REQ, INFO, ("pcExtra buffer is valid\n"));
1538         }
1539         else
1540             DBGLOG(REQ, INFO, ("pcExtra 0x%p\n", pcExtra));
1541
1542         /* Execute this OID */
1543         status = priv_set_ndis(prNetDev, (P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0], &u4BufLen);
1544         /* Copy result to user space */
1545         ((P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0])->outNdisOidLength = u4BufLen;
1546
1547         if (copy_to_user(prIwReqData->data.pointer,
1548                         &aucOidBuf[0],
1549                         OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1550             DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1551             status = -EFAULT;
1552         }
1553
1554         break;
1555
1556     case PRIV_CMD_SW_CTRL:
1557         pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1558         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1559
1560         //kalMemCopy(&prNdisReq->ndisOidContent[0], prIwReqData->data.pointer, 8);
1561         if (copy_from_user(&prNdisReq->ndisOidContent[0],
1562                            prIwReqData->data.pointer,
1563                            prIwReqData->data.length)) {
1564             status = -EFAULT;
1565             break;
1566         }
1567         prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1568         prNdisReq->inNdisOidlength = 8;
1569         prNdisReq->outNdisOidLength = 8;
1570
1571         /* Execute this OID */
1572         status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
1573         break;
1574
1575     default:
1576         return -EOPNOTSUPP;
1577     }
1578
1579     return status;
1580 }
1581
1582 /*----------------------------------------------------------------------------*/
1583 /*!
1584 * \brief Private ioctl get struct handler.
1585 *
1586 * \param[in] pDev Net device requested.
1587 * \param[out] pIwReq Pointer to iwreq structure.
1588 * \param[in] cmd Private sub-command.
1589 *
1590 * \retval 0 For success.
1591 * \retval -EFAULT If copy from user space buffer fail.
1592 * \retval -EOPNOTSUPP Parameter "cmd" not recognized.
1593 *
1594 */
1595 /*----------------------------------------------------------------------------*/
1596 int
1597 priv_get_struct (
1598     IN struct net_device *prNetDev,
1599     IN struct iw_request_info *prIwReqInfo,
1600     IN union iwreq_data *prIwReqData,
1601     IN OUT char *pcExtra
1602     )
1603 {
1604     UINT_32 u4SubCmd = 0;
1605     P_NDIS_TRANSPORT_STRUCT prNdisReq= NULL;
1606
1607     P_GLUE_INFO_T   prGlueInfo = NULL;
1608     UINT_32         u4BufLen = 0;
1609     PUINT_32        pu4IntBuf = NULL;
1610     int             status = 0;
1611
1612     kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1613
1614     ASSERT(prNetDev);
1615     ASSERT(prIwReqData);
1616     if (!prNetDev || !prIwReqData) {
1617         DBGLOG(REQ, INFO, ("priv_get_struct(): invalid param(0x%p, 0x%p)\n",
1618             prNetDev, prIwReqData));
1619         return -EINVAL;
1620     }
1621
1622     u4SubCmd = (UINT_32) prIwReqData->data.flags;
1623     prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1624     ASSERT(prGlueInfo);
1625     if (!prGlueInfo) {
1626         DBGLOG(REQ, INFO, ("priv_get_struct(): invalid prGlueInfo(0x%p, 0x%p)\n",
1627             prNetDev, netdev_priv(prNetDev)));
1628         return -EINVAL;
1629     }
1630
1631 #if 0
1632     printk(KERN_INFO DRV_NAME"priv_get_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1633         prIwReqInfo->cmd,
1634         u4SubCmd
1635         );
1636 #endif
1637     memset(aucOidBuf, 0, sizeof(aucOidBuf));
1638
1639     switch (u4SubCmd) {
1640     case PRIV_CMD_OID:
1641         if (copy_from_user(&aucOidBuf[0],
1642                 prIwReqData->data.pointer,
1643                 sizeof(NDIS_TRANSPORT_STRUCT))) {
1644             DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n"));
1645             return -EFAULT;
1646         }
1647
1648         prNdisReq = (P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0];
1649 #if 0
1650         printk(KERN_NOTICE "\n priv_get_struct cmd 0x%02x len:%d OID:0x%08x OID Len:%d\n",
1651             cmd,
1652             pIwReq->u.data.length,
1653             ndisReq->ndisOidCmd,
1654             ndisReq->inNdisOidlength);
1655 #endif
1656         if (priv_get_ndis(prNetDev, prNdisReq, &u4BufLen) == 0) {
1657             prNdisReq->outNdisOidLength = u4BufLen;
1658             if (copy_to_user(prIwReqData->data.pointer,
1659                     &aucOidBuf[0],
1660                     u4BufLen + sizeof(NDIS_TRANSPORT_STRUCT) - sizeof(prNdisReq->ndisOidContent))) {
1661                 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(1)\n"));
1662                 return -EFAULT;
1663             }
1664             return 0;
1665         }
1666         else {
1667             prNdisReq->outNdisOidLength = u4BufLen;
1668             if (copy_to_user(prIwReqData->data.pointer,
1669                     &aucOidBuf[0],
1670                     OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1671                 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(2)\n"));
1672             }
1673             return -EFAULT;
1674         }
1675         break;
1676
1677     case PRIV_CMD_SW_CTRL:
1678         pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1679         prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1680
1681         if (copy_from_user(&prNdisReq->ndisOidContent[0],
1682                 prIwReqData->data.pointer,
1683                 prIwReqData->data.length)) {
1684             DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n"));
1685             return -EFAULT;
1686         }
1687
1688         prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1689         prNdisReq->inNdisOidlength = 8;
1690         prNdisReq->outNdisOidLength = 8;
1691
1692         status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1693         if (status == 0) {
1694             prNdisReq->outNdisOidLength = u4BufLen;
1695             //printk("len=%d Result=%08lx\n", u4BufLen, *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1696
1697             if (copy_to_user(prIwReqData->data.pointer,
1698                     &prNdisReq->ndisOidContent[4],
1699                     4 /* OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent)*/)) {
1700                 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(2)\n"));
1701             }
1702         }
1703         return 0;
1704         break;
1705
1706     default:
1707         DBGLOG(REQ, WARN, ("get struct cmd:0x%lx\n", u4SubCmd));
1708         return -EOPNOTSUPP;
1709     }
1710 } /* priv_get_struct */
1711
1712 /*----------------------------------------------------------------------------*/
1713 /*!
1714 * \brief The routine handles a set operation for a single OID.
1715 *
1716 * \param[in] pDev Net device requested.
1717 * \param[in] ndisReq Ndis request OID information copy from user.
1718 * \param[out] outputLen_p If the call is successful, returns the number of
1719 *                         bytes written into the query buffer. If the
1720 *                         call failed due to invalid length of the query
1721 *                         buffer, returns the amount of storage needed..
1722 *
1723 * \retval 0 On success.
1724 * \retval -EOPNOTSUPP If cmd is not supported.
1725 *
1726 */
1727 /*----------------------------------------------------------------------------*/
1728 static int
1729 priv_set_ndis (
1730     IN struct net_device *prNetDev,
1731     IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1732     OUT PUINT_32 pu4OutputLen
1733     )
1734 {
1735     P_WLAN_REQ_ENTRY prWlanReqEntry = NULL;
1736     WLAN_STATUS status = WLAN_STATUS_SUCCESS;
1737     P_GLUE_INFO_T prGlueInfo = NULL;
1738     UINT_32             u4SetInfoLen = 0;
1739
1740     ASSERT(prNetDev);
1741     ASSERT(prNdisReq);
1742     ASSERT(pu4OutputLen);
1743
1744     if (!prNetDev || !prNdisReq || !pu4OutputLen) {
1745         DBGLOG(REQ, INFO, ("priv_set_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
1746             prNetDev, prNdisReq, pu4OutputLen));
1747         return -EINVAL;
1748     }
1749
1750     prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1751     ASSERT(prGlueInfo);
1752     if (!prGlueInfo) {
1753         DBGLOG(REQ, INFO, ("priv_set_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1754             prNetDev, netdev_priv(prNetDev)));
1755         return -EINVAL;
1756     }
1757
1758 #if 0
1759     printk(KERN_INFO DRV_NAME"priv_set_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1760         prNdisReq->ndisOidCmd
1761         );
1762 #endif
1763
1764     if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1765                                             &prWlanReqEntry)) {
1766         //WARNLOG(("Set OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1767         return -EOPNOTSUPP;
1768     }
1769
1770     if (NULL == prWlanReqEntry->pfOidSetHandler) {
1771         //WARNLOG(("Set %s: Null set handler\n", prWlanReqEntry->pucOidName));
1772         return -EOPNOTSUPP;
1773     }
1774
1775 #if 0
1776     printk(KERN_INFO DRV_NAME"priv_set_ndis(): %s\n",
1777         prWlanReqEntry->pucOidName
1778         );
1779 #endif
1780
1781     if (prWlanReqEntry->fgSetBufLenChecking) {
1782         if (prNdisReq->inNdisOidlength != prWlanReqEntry->u4InfoBufLen) {
1783             DBGLOG(REQ, WARN, ("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1784                 prWlanReqEntry->pucOidName,
1785                 prNdisReq->inNdisOidlength,
1786                 prWlanReqEntry->u4InfoBufLen));
1787
1788             *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1789             return -EINVAL;
1790         }
1791     }
1792
1793     if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1794         /* GLUE sw info only */
1795         status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1796                                                     prNdisReq->ndisOidContent,
1797                                                     prNdisReq->inNdisOidlength,
1798                                                     &u4SetInfoLen);
1799     }
1800     else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1801         /* multiple sw operations */
1802         status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1803                                                     prNdisReq->ndisOidContent,
1804                                                     prNdisReq->inNdisOidlength,
1805                                                     &u4SetInfoLen);
1806     }
1807     else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1808         /* driver core*/
1809
1810         status = kalIoctl(prGlueInfo,
1811             (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidSetHandler,
1812             prNdisReq->ndisOidContent,
1813             prNdisReq->inNdisOidlength,
1814             FALSE,
1815             FALSE,
1816             TRUE,
1817             FALSE,
1818             &u4SetInfoLen);
1819     }
1820     else {
1821         DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1822                     prWlanReqEntry->eOidMethod));
1823         return -EOPNOTSUPP;
1824     }
1825
1826     *pu4OutputLen = u4SetInfoLen;
1827
1828     switch (status) {
1829     case WLAN_STATUS_SUCCESS:
1830         break;
1831
1832     case WLAN_STATUS_INVALID_LENGTH:
1833         //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1834            // prWlanReqEntry->pucOidName,
1835             //prNdisReq->inNdisOidlength,
1836             //u4SetInfoLen));
1837         break;
1838     }
1839
1840     if (WLAN_STATUS_SUCCESS != status) {
1841         return -EFAULT;
1842     }
1843
1844     return 0;
1845 } /* priv_set_ndis */
1846
1847 /*----------------------------------------------------------------------------*/
1848 /*!
1849 * \brief The routine handles a query operation for a single OID. Basically we
1850 *   return information about the current state of the OID in question.
1851 *
1852 * \param[in] pDev Net device requested.
1853 * \param[in] ndisReq Ndis request OID information copy from user.
1854 * \param[out] outputLen_p If the call is successful, returns the number of
1855 *                        bytes written into the query buffer. If the
1856 *                        call failed due to invalid length of the query
1857 *                        buffer, returns the amount of storage needed..
1858 *
1859 * \retval 0 On success.
1860 * \retval -EOPNOTSUPP If cmd is not supported.
1861 * \retval -EINVAL invalid input parameters
1862 *
1863 */
1864 /*----------------------------------------------------------------------------*/
1865 static int
1866 priv_get_ndis (
1867     IN struct net_device *prNetDev,
1868     IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1869     OUT PUINT_32 pu4OutputLen
1870     )
1871 {
1872     P_WLAN_REQ_ENTRY prWlanReqEntry = NULL;
1873     UINT_32 u4BufLen = 0;
1874     WLAN_STATUS status = WLAN_STATUS_SUCCESS;
1875     P_GLUE_INFO_T prGlueInfo = NULL;
1876
1877     ASSERT(prNetDev);
1878     ASSERT(prNdisReq);
1879     ASSERT(pu4OutputLen);
1880
1881     if (!prNetDev || !prNdisReq || !pu4OutputLen) {
1882         DBGLOG(REQ, INFO, ("priv_get_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
1883             prNetDev, prNdisReq, pu4OutputLen));
1884         return -EINVAL;
1885     }
1886
1887     prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1888     ASSERT(prGlueInfo);
1889     if (!prGlueInfo) {
1890         DBGLOG(REQ, INFO, ("priv_get_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1891             prNetDev, netdev_priv(prNetDev)));
1892         return -EINVAL;
1893     }
1894
1895 #if 0
1896     printk(KERN_INFO DRV_NAME"priv_get_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1897         prNdisReq->ndisOidCmd
1898         );
1899 #endif
1900
1901     if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1902                                             &prWlanReqEntry)) {
1903         //WARNLOG(("Query OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1904         return -EOPNOTSUPP;
1905     }
1906
1907
1908     if (NULL == prWlanReqEntry->pfOidQueryHandler) {
1909         //WARNLOG(("Query %s: Null query handler\n", prWlanReqEntry->pucOidName));
1910         return -EOPNOTSUPP;
1911     }
1912
1913 #if 0
1914     printk(KERN_INFO DRV_NAME"priv_get_ndis(): %s\n",
1915         prWlanReqEntry->pucOidName
1916         );
1917 #endif
1918
1919     if (prWlanReqEntry->fgQryBufLenChecking) {
1920         if (prNdisReq->inNdisOidlength < prWlanReqEntry->u4InfoBufLen) {
1921             /* Not enough room in InformationBuffer. Punt */
1922             //WARNLOG(("Query %s: Buffer too short (current=%ld, needed=%ld)\n",
1923                 //prWlanReqEntry->pucOidName,
1924                 //prNdisReq->inNdisOidlength,
1925                 //prWlanReqEntry->u4InfoBufLen));
1926
1927             *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1928
1929             status = WLAN_STATUS_INVALID_LENGTH;
1930             return -EINVAL;
1931         }
1932     }
1933
1934
1935     if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1936         /* GLUE sw info only */
1937         status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1938                                                     prNdisReq->ndisOidContent,
1939                                                     prNdisReq->inNdisOidlength,
1940                                                     &u4BufLen);
1941     }
1942     else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1943         /* multiple sw operations */
1944         status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1945                                                     prNdisReq->ndisOidContent,
1946                                                     prNdisReq->inNdisOidlength,
1947                                                     &u4BufLen);
1948     }
1949     else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1950         /* driver core*/
1951
1952         status = kalIoctl(prGlueInfo,
1953             (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidQueryHandler,
1954             prNdisReq->ndisOidContent,
1955             prNdisReq->inNdisOidlength,
1956             TRUE,
1957             TRUE,
1958             TRUE,
1959             FALSE,
1960             &u4BufLen);
1961     }
1962     else {
1963         DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1964                     prWlanReqEntry->eOidMethod));
1965         return -EOPNOTSUPP;
1966     }
1967
1968     *pu4OutputLen = u4BufLen;
1969
1970     switch (status) {
1971     case WLAN_STATUS_SUCCESS:
1972         break;
1973
1974     case WLAN_STATUS_INVALID_LENGTH:
1975         //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1976            // prWlanReqEntry->pucOidName,
1977             //prNdisReq->inNdisOidlength,
1978             //u4BufLen));
1979         break;
1980     }
1981
1982     if (WLAN_STATUS_SUCCESS != status) {
1983         return -EOPNOTSUPP;
1984     }
1985
1986     return 0;
1987 } /* priv_get_ndis */
1988
1989 /*----------------------------------------------------------------------------*/
1990 /*!
1991 * \brief This routine is called to search desired OID.
1992 *
1993 * \param rOid[in]               Desired NDIS_OID
1994 * \param ppWlanReqEntry[out]    Found registered OID entry
1995 *
1996 * \retval TRUE: Matched OID is found
1997 * \retval FALSE: No matched OID is found
1998 */
1999 /*----------------------------------------------------------------------------*/
2000 static BOOLEAN
2001 reqSearchSupportedOidEntry (
2002     IN  UINT_32            rOid,
2003     OUT P_WLAN_REQ_ENTRY    *ppWlanReqEntry
2004     )
2005 {
2006     INT_32 i, j, k;
2007
2008     i = 0;
2009     j = NUM_SUPPORTED_OIDS - 1;
2010
2011     while (i <= j) {
2012         k = (i + j) / 2;
2013
2014         if (rOid == arWlanOidReqTable[k].rOid) {
2015             *ppWlanReqEntry = &arWlanOidReqTable[k];
2016             return TRUE;
2017         } else if (rOid < arWlanOidReqTable[k].rOid) {
2018             j = k - 1;
2019         } else {
2020             i = k + 1;
2021         }
2022     }
2023
2024     return FALSE;
2025 }   /* reqSearchSupportedOidEntry */
2026
2027 #if 0
2028 /*----------------------------------------------------------------------------*/
2029 /*!
2030 * \brief This routine is called to query the radio configuration used in IBSS
2031 *        mode and RF test mode.
2032 *
2033 * \param[in] prGlueInfo         Pointer to the GLUE_INFO_T structure.
2034 * \param[out] pvQueryBuffer     Pointer to the buffer that holds the result of the query.
2035 * \param[in] u4QueryBufferLen   The length of the query buffer.
2036 * \param[out] pu4QueryInfoLen   If the call is successful, returns the number of
2037 *                               bytes written into the query buffer. If the call
2038 *                               failed due to invalid length of the query buffer,
2039 *                               returns the amount of storage needed.
2040 *
2041 * \retval WLAN_STATUS_SUCCESS
2042 * \retval WLAN_STATUS_INVALID_LENGTH
2043 */
2044 /*----------------------------------------------------------------------------*/
2045 static WLAN_STATUS
2046 reqExtQueryConfiguration (
2047     IN  P_GLUE_INFO_T   prGlueInfo,
2048     OUT PVOID           pvQueryBuffer,
2049     IN UINT_32          u4QueryBufferLen,
2050     OUT PUINT_32        pu4QueryInfoLen
2051     )
2052 {
2053     P_PARAM_802_11_CONFIG_T prQueryConfig = (P_PARAM_802_11_CONFIG_T)pvQueryBuffer;
2054     WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2055     UINT_32 u4QueryInfoLen = 0;
2056
2057     DEBUGFUNC("wlanoidQueryConfiguration");
2058
2059
2060     ASSERT(prGlueInfo);
2061     ASSERT(pu4QueryInfoLen);
2062
2063     *pu4QueryInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2064     if (u4QueryBufferLen < sizeof(PARAM_802_11_CONFIG_T)) {
2065         return WLAN_STATUS_INVALID_LENGTH;
2066     }
2067
2068     ASSERT(pvQueryBuffer);
2069
2070     kalMemZero(prQueryConfig, sizeof(PARAM_802_11_CONFIG_T));
2071
2072     /* Update the current radio configuration. */
2073     prQueryConfig->u4Length = sizeof(PARAM_802_11_CONFIG_T);
2074
2075 #if defined(_HIF_SDIO)
2076     rStatus = sdio_io_ctrl(prGlueInfo,
2077                             wlanoidSetBeaconInterval,
2078                             &prQueryConfig->u4BeaconPeriod,
2079                             sizeof(UINT_32),
2080                             TRUE,
2081                             TRUE,
2082                             &u4QueryInfoLen);
2083 #else
2084     rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2085                                    wlanoidQueryBeaconInterval,
2086                                    &prQueryConfig->u4BeaconPeriod,
2087                                    sizeof(UINT_32),
2088                                    &u4QueryInfoLen);
2089 #endif
2090     if (rStatus != WLAN_STATUS_SUCCESS) {
2091         return rStatus;
2092     }
2093
2094 #if defined(_HIF_SDIO)
2095     rStatus = sdio_io_ctrl(prGlueInfo,
2096                             wlanoidQueryAtimWindow,
2097                             &prQueryConfig->u4ATIMWindow,
2098                             sizeof(UINT_32),
2099                             TRUE,
2100                             TRUE,
2101                             &u4QueryInfoLen);
2102 #else
2103     rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2104                                    wlanoidQueryAtimWindow,
2105                                    &prQueryConfig->u4ATIMWindow,
2106                                    sizeof(UINT_32),
2107                                    &u4QueryInfoLen);
2108 #endif
2109     if (rStatus != WLAN_STATUS_SUCCESS) {
2110         return rStatus;
2111     }
2112
2113 #if defined(_HIF_SDIO)
2114     rStatus = sdio_io_ctrl(prGlueInfo,
2115                             wlanoidQueryFrequency,
2116                             &prQueryConfig->u4DSConfig,
2117                             sizeof(UINT_32),
2118                             TRUE,
2119                             TRUE,
2120                             &u4QueryInfoLen);
2121 #else
2122     rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2123                                    wlanoidQueryFrequency,
2124                                    &prQueryConfig->u4DSConfig,
2125                                    sizeof(UINT_32),
2126                                    &u4QueryInfoLen);
2127 #endif
2128     if (rStatus != WLAN_STATUS_SUCCESS) {
2129         return rStatus;
2130     }
2131
2132     prQueryConfig->rFHConfig.u4Length = sizeof(PARAM_802_11_CONFIG_FH_T);
2133
2134     return rStatus;
2135
2136 } /* end of reqExtQueryConfiguration() */
2137
2138
2139 /*----------------------------------------------------------------------------*/
2140 /*!
2141 * \brief This routine is called to set the radio configuration used in IBSS
2142 *        mode.
2143 *
2144 * \param[in] prGlueInfo     Pointer to the GLUE_INFO_T structure.
2145 * \param[in] pvSetBuffer    A pointer to the buffer that holds the data to be set.
2146 * \param[in] u4SetBufferLen The length of the set buffer.
2147 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2148 *                           bytes read from the set buffer. If the call failed
2149 *                           due to invalid length of the set buffer, returns
2150 *                           the amount of storage needed.
2151 *
2152 * \retval WLAN_STATUS_SUCCESS
2153 * \retval WLAN_STATUS_INVALID_LENGTH
2154 * \retval WLAN_STATUS_NOT_ACCEPTED
2155 */
2156 /*----------------------------------------------------------------------------*/
2157 static WLAN_STATUS
2158 reqExtSetConfiguration (
2159     IN  P_GLUE_INFO_T prGlueInfo,
2160     IN  PVOID         pvSetBuffer,
2161     IN  UINT_32       u4SetBufferLen,
2162     OUT PUINT_32      pu4SetInfoLen
2163     )
2164 {
2165     WLAN_STATUS  rStatus = WLAN_STATUS_SUCCESS;
2166     P_PARAM_802_11_CONFIG_T prNewConfig = (P_PARAM_802_11_CONFIG_T)pvSetBuffer;
2167     UINT_32 u4SetInfoLen = 0;
2168
2169     DEBUGFUNC("wlanoidSetConfiguration");
2170
2171
2172     ASSERT(prGlueInfo);
2173     ASSERT(pu4SetInfoLen);
2174
2175     *pu4SetInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2176
2177     if (u4SetBufferLen < *pu4SetInfoLen) {
2178         return WLAN_STATUS_INVALID_LENGTH;
2179     }
2180
2181     /* OID_802_11_CONFIGURATION. If associated, NOT_ACCEPTED shall be returned. */
2182     if (prGlueInfo->eParamMediaStateIndicated == PARAM_MEDIA_STATE_CONNECTED) {
2183         return WLAN_STATUS_NOT_ACCEPTED;
2184     }
2185
2186     ASSERT(pvSetBuffer);
2187
2188 #if defined(_HIF_SDIO)
2189     rStatus = sdio_io_ctrl(prGlueInfo,
2190                             wlanoidSetBeaconInterval,
2191                             &prNewConfig->u4BeaconPeriod,
2192                             sizeof(UINT_32),
2193                             FALSE,
2194                             TRUE,
2195                             &u4SetInfoLen);
2196 #else
2197     rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2198                                  wlanoidSetBeaconInterval,
2199                                  &prNewConfig->u4BeaconPeriod,
2200                                  sizeof(UINT_32),
2201                                  &u4SetInfoLen);
2202 #endif
2203     if (rStatus != WLAN_STATUS_SUCCESS) {
2204         return rStatus;
2205     }
2206
2207 #if defined(_HIF_SDIO)
2208     rStatus = sdio_io_ctrl(prGlueInfo,
2209                             wlanoidSetAtimWindow,
2210                              &prNewConfig->u4ATIMWindow,
2211                             sizeof(UINT_32),
2212                             FALSE,
2213                             TRUE,
2214                             &u4SetInfoLen);
2215 #else
2216     rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2217                                  wlanoidSetAtimWindow,
2218                                  &prNewConfig->u4ATIMWindow,
2219                                  sizeof(UINT_32),
2220                                  &u4SetInfoLen);
2221 #endif
2222     if (rStatus != WLAN_STATUS_SUCCESS) {
2223         return rStatus;
2224     }
2225
2226 #if defined(_HIF_SDIO)
2227     rStatus = sdio_io_ctrl(prGlueInfo,
2228                             wlanoidSetFrequency,
2229                             &prNewConfig->u4DSConfig,
2230                             sizeof(UINT_32),
2231                             FALSE,
2232                             TRUE,
2233                             &u4SetInfoLen);
2234 #else
2235     rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2236                                  wlanoidSetFrequency,
2237                                  &prNewConfig->u4DSConfig,
2238                                  sizeof(UINT_32),
2239                                  &u4SetInfoLen);
2240 #endif
2241
2242     if (rStatus != WLAN_STATUS_SUCCESS) {
2243         return rStatus;
2244     }
2245
2246     return rStatus;
2247
2248 } /* end of reqExtSetConfiguration() */
2249
2250 #endif
2251 /*----------------------------------------------------------------------------*/
2252 /*!
2253 * \brief This routine is called to set beacon detection function enable/disable state
2254 *        This is mainly designed for usage under BT inquiry state (disable function).
2255 *
2256 * \param[in] pvAdapter Pointer to the Adapter structure
2257 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
2258 * \param[in] u4SetBufferLen The length of the set buffer
2259 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2260 *   bytes read from the set buffer. If the call failed due to invalid length of
2261 *   the set buffer, returns the amount of storage needed.
2262 *
2263 * \retval WLAN_STATUS_SUCCESS
2264 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
2265 * \retval WLAN_STATUS_INVALID_LENGTH
2266 *
2267 */
2268 /*----------------------------------------------------------------------------*/
2269 static WLAN_STATUS
2270 reqExtSetAcpiDevicePowerState (
2271     IN  P_GLUE_INFO_T prGlueInfo,
2272     IN  PVOID         pvSetBuffer,
2273     IN  UINT_32       u4SetBufferLen,
2274     OUT PUINT_32      pu4SetInfoLen
2275     )
2276 {
2277     WLAN_STATUS  rStatus = WLAN_STATUS_SUCCESS;
2278
2279     ASSERT(prGlueInfo);
2280     ASSERT(pvSetBuffer);
2281     ASSERT(pu4SetInfoLen);
2282
2283     /* WIFI is enabled, when ACPI is D0 (ParamDeviceStateD0 = 1). And vice versa */
2284
2285     //rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2286     //                   wlanoidSetAcpiDevicePowerState,
2287     //                   pvSetBuffer,
2288     //                   u4SetBufferLen,
2289     //                   pu4SetInfoLen);
2290     return rStatus;
2291 }
2292