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