2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_2/os/linux/gl_wext_priv.c#1 $
5 /*! \file gl_wext_priv.c
6 \brief This file includes private ioctl support.
9 /*******************************************************************************
10 * Copyright (c) 2007 MediaTek Inc.
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
16 ********************************************************************************
19 /*******************************************************************************
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.
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.
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
48 ********************************************************************************
52 ** $Log: gl_wext_priv.c $
55 * [ALPS00109161] [Need Patch] [Volunteer Patch] [Wi-Fi] Support the set tx power driver cmd
56 * Adding the AP mode channel query filter.
59 * [ALPS00096191] [MT6620 Wi-Fi][Driver][Firmware] Porting to ALPS4.0_DEV branch
60 * sync to up-to-date changes including:
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.
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.
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.
77 * 11 03 2011 chinghwa.yu
78 * [WCXRP00000063] Update BCM CoEx design and settings
83 * Rollback to previous verson due to misbranch check-in
85 * 10 19 2011 yuche.tsai
86 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
88 * Davinci Maintrunk Label: MT6620_WIFI_DRIVER_FW_TRUNK_MT6620E5_111019_0926.
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
94 * 03 17 2011 chinglan.wang
95 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
99 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
100 * Toggle non-standard debug messages to comments.
102 * 01 27 2011 cm.chang
103 * [WCXRP00000402] [MT6620 Wi-Fi][Driver] Enable MCR read/write by iwpriv by default
107 * [WCXRP00000396] [MT6620 Wi-Fi][Driver] Support Sw Ctrl ioctl at linux
108 * adding the SW cmd ioctl support, use set/get structure ioctl.
110 * 01 20 2011 eddie.chen
111 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
114 * 01 20 2011 eddie.chen
115 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
116 * Add Oid for sw control debug command
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
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
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.
131 * [WCXRP00000171] [MT6620 Wi-Fi][Driver] Add message check code same behavior as mt5921
132 * add the message check code from mt5921.
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
139 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
140 * correct typo for NVRAM access.
143 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
144 * add skeleton for NVRAM integration
148 * revert changelist #15371, efuse read/write access will be done by RF test approach
152 * add OID definitions for EFUSE read/write access.
156 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
158 * 06 06 2010 kevin.huang
159 * [WPD00003832][MT6620 5931] Create driver base
160 * [MT6620 5931] Create driver base
163 * [WPD00001943]Create WiFi test driver framework on WinXP
164 * enable OID_CUSTOM_MTK_WIFI_TEST for RFTest & META tool
166 * 05 29 2010 jeffrey.chang
167 * [WPD00003826]Initial import for Linux port
168 * fix private ioctl for rftest
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
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
229 ** \main\maintrunk.MT5921\5 2007-11-06 19:32:30 GMT mtk01088
231 ** \main\maintrunk.MT5921\4 2007-10-30 12:01:39 GMT MTK01425
232 ** 1. Update wlanQueryInformation and wlanSetInformation
235 /*******************************************************************************
236 * C O M P I L E R F L A G S
237 ********************************************************************************
240 /*******************************************************************************
241 * E X T E R N A L R E F E R E N C E S
242 ********************************************************************************
245 #include "gl_wext_priv.h"
250 /*******************************************************************************
252 ********************************************************************************
254 #define NUM_SUPPORTED_OIDS (sizeof(arWlanOidReqTable) / sizeof(WLAN_REQ_ENTRY))
256 /*******************************************************************************
257 * F U N C T I O N D E C L A R A T I O N S
258 ********************************************************************************
263 IN struct net_device *prNetDev,
264 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
265 OUT PUINT_32 pu4OutputLen
270 IN struct net_device *prNetDev,
271 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
272 OUT PUINT_32 pu4OutputLen
275 #if 0 /* CFG_SUPPORT_WPS */
278 IN struct net_device *prNetDev,
279 IN struct iw_request_info *prIwReqInfo,
280 IN union iwreq_data *prIwReqData,
286 IN struct net_device *prNetDev,
287 IN struct iw_request_info *prIwReqInfo,
288 IN union iwreq_data *prIwReqData,
291 #endif /* CFG_SUPPORT_WPS */
294 reqSearchSupportedOidEntry (
296 OUT P_WLAN_REQ_ENTRY *ppWlanReqEntry
301 reqExtQueryConfiguration (
302 IN P_GLUE_INFO_T prGlueInfo,
303 OUT PVOID pvQueryBuffer,
304 IN UINT_32 u4QueryBufferLen,
305 OUT PUINT_32 pu4QueryInfoLen
309 reqExtSetConfiguration (
310 IN P_GLUE_INFO_T prGlueInfo,
311 IN PVOID pvSetBuffer,
312 IN UINT_32 u4SetBufferLen,
313 OUT PUINT_32 pu4SetInfoLen
318 reqExtSetAcpiDevicePowerState (
319 IN P_GLUE_INFO_T prGlueInfo,
320 IN PVOID pvSetBuffer,
321 IN UINT_32 u4SetBufferLen,
322 OUT PUINT_32 pu4SetInfoLen
325 /*******************************************************************************
326 * P R I V A T E D A T A
327 ********************************************************************************
329 static UINT_8 aucOidBuf[4096] = {0};
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[] = {
338 fgQryBufLenChecking, fgSetBufLenChecking, fgIsHandleInGlueLayerOnly, u4InfoBufLen,
342 /* General Operational Characteristics */
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,
351 /* OID_802_3_MULTICAST_LIST */
352 /* OID_802_3_MAXIMUM_LIST_SIZE */
353 /* Ethernet Statistics */
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,
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},
369 DISP_STRING("OID_PNP_SET_POWER"),
370 TRUE, FALSE, ENUM_OID_GLUE_EXTENSION, sizeof(PARAM_DEVICE_POWER_STATE),
372 (PFN_OID_HANDLER_FUNC_REQ)reqExtSetAcpiDevicePowerState},
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,
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),
387 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtCoexistCtrl},
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),
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,
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},
413 DISP_STRING("OID_CUSTOM_ADD_TS"),
414 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
416 (PFN_OID_HANDLER_FUNC_REQ)wlanoidAddTS},
418 DISP_STRING("OID_CUSTOM_DEL_TS"),
419 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
421 (PFN_OID_HANDLER_FUNC_REQ)wlanoidDelTS},
425 #if CFG_LP_PATTERN_SEARCH_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},
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,
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},
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},
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),
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},
476 {OID_CUSTOM_DISABLE_PRIVACY_CHECK,
477 DISP_STRING("OID_CUSTOM_DISABLE_PRIVACY_CHECK"),
478 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
480 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisablePriavcyCheck},
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},
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},
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},
501 {OID_CUSTOM_TEST_MODE,
502 DISP_STRING("OID_CUSTOM_TEST_MODE"),
503 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
505 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetTestMode},
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,
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,
519 {OID_CUSTOM_ABORT_TEST_MODE,
520 DISP_STRING("OID_CUSTOM_ABORT_TEST_MODE"),
521 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
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},
530 /* OID_CUSTOM_EMULATION_VERSION_CONTROL */
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},
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},
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},
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 },
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,
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,
572 {OID_802_11_WAPI_MODE,
573 DISP_STRING("OID_802_11_WAPI_MODE"),
574 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
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,
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),
586 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiKey},
590 {OID_802_11_WSC_ASSOC_INFO,
591 DISP_STRING("OID_802_11_WSC_ASSOC_INFO"),
592 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
594 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWSCAssocInfo},
599 /*******************************************************************************
601 ********************************************************************************
604 /*----------------------------------------------------------------------------*/
606 * \brief Dispatching function for private ioctl region (SIOCIWFIRSTPRIV ~
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.
613 * \retval 0 for success.
614 * \retval -EOPNOTSUPP If cmd is not supported.
615 * \retval -EFAULT For fail.
618 /*----------------------------------------------------------------------------*/
621 IN struct net_device *prNetDev,
622 IN OUT struct ifreq *prIfReq,
626 /* prIfReq is verified in the caller function wlanDoIOCTL() */
627 struct iwreq *prIwReq = (struct iwreq *)prIfReq;
628 struct iw_request_info rIwReqInfo;
630 /* prDev is verified in the caller function wlanDoIOCTL() */
632 /* Prepare the call */
633 rIwReqInfo.cmd = (__u16)i4Cmd;
634 rIwReqInfo.flags = 0;
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));
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));
645 case IOCTL_SET_STRUCT:
646 case IOCTL_SET_STRUCT_FOR_EM:
647 return priv_set_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
649 case IOCTL_GET_STRUCT:
650 return priv_get_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
655 } /* end of switch */
657 }/* priv_support_ioctl */
660 /*----------------------------------------------------------------------------*/
662 * \brief Private ioctl set int handler.
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
669 * \retval 0 For success.
670 * \retval -EOPNOTSUPP If cmd is not supported.
671 * \retval -EINVAL If a value is out of range.
674 /*----------------------------------------------------------------------------*/
677 IN struct net_device *prNetDev,
678 IN struct iw_request_info *prIwReqInfo,
679 IN union iwreq_data *prIwReqData,
685 P_NDIS_TRANSPORT_STRUCT prNdisReq;
686 P_GLUE_INFO_T prGlueInfo;
687 UINT_32 u4BufLen = 0;
689 P_PTA_IPC_T prPtaIpc;
696 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
699 prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
701 u4SubCmd = (UINT_32) prIwReqData->mode;
702 pu4IntBuf = (PUINT_32) pcExtra;
705 case PRIV_CMD_TEST_MODE:
706 //printk("TestMode=%ld\n", pu4IntBuf[1]);
707 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
709 if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY) {
710 prNdisReq->ndisOidCmd = OID_CUSTOM_TEST_MODE;
712 else if (pu4IntBuf[1] == 0) {
713 prNdisReq->ndisOidCmd = OID_CUSTOM_ABORT_TEST_MODE;
719 prNdisReq->inNdisOidlength = 0;
720 prNdisReq->outNdisOidLength = 0;
722 /* Execute this OID */
723 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
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];
730 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
732 prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
733 prNdisReq->inNdisOidlength = 8;
734 prNdisReq->outNdisOidLength = 8;
736 /* Execute this OID */
737 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
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];
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;
754 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
756 prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
757 prNdisReq->inNdisOidlength = 8;
758 prNdisReq->outNdisOidLength = 8;
760 /* Execute this OID */
761 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
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];
769 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
771 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
772 prNdisReq->inNdisOidlength = 8;
773 prNdisReq->outNdisOidLength = 8;
775 /* Execute this OID */
776 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
781 case PRIV_CMD_BEACON_PERIOD:
782 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
783 wlanoidSetBeaconInterval,
784 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
790 #if CFG_TCP_IP_CHKSUM_OFFLOAD
791 case PRIV_CMD_CSUM_OFFLOAD:
796 if (pu4IntBuf[1] == 1) {
797 u4CSUMFlags = CSUM_OFFLOAD_EN_ALL;
799 else if (pu4IntBuf[1] == 0) {
806 if (kalIoctl(prGlueInfo,
807 wlanoidSetCSUMOffload,
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;
824 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
826 case PRIV_CMD_POWER_MODE:
828 wlanoidSet802dot11PowerSaveProfile,
829 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
838 case PRIV_CMD_WMM_PS:
840 PARAM_CUSTOM_WMM_PS_TEST_STRUC_T rWmmPsTest;
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;
848 wlanoidSetWiFiWmmPsTest,
850 sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUC_T),
860 case PRIV_CMD_ADHOC_MODE:
861 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
863 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
869 case PRIV_CUSTOM_BWCS_CMD:
871 DBGLOG(REQ, INFO, ("pu4IntBuf[1] = %x, size of PTA_IPC_T = %d.\n", pu4IntBuf[1], sizeof(PARAM_PTA_IPC_T)));
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]);
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]));
886 status = wlanSetInformation(prGlueInfo->prAdapter,
888 (PVOID)&aucOidBuf[0],
893 status = wlanoidSetBT(prGlueInfo->prAdapter,
894 (PVOID)&aucOidBuf[0],
895 sizeof(PARAM_PTA_IPC_T),
898 if (WLAN_STATUS_SUCCESS != status) {
912 /*----------------------------------------------------------------------------*/
914 * \brief Private ioctl get int handler.
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
921 * \retval 0 For success.
922 * \retval -EOPNOTSUPP If cmd is not supported.
923 * \retval -EFAULT For fail.
926 /*----------------------------------------------------------------------------*/
929 IN struct net_device *prNetDev,
930 IN struct iw_request_info *prIwReqInfo,
931 IN union iwreq_data *prIwReqData,
937 P_GLUE_INFO_T prGlueInfo;
938 UINT_32 u4BufLen = 0;
940 P_NDIS_TRANSPORT_STRUCT prNdisReq;
947 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
950 prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
952 u4SubCmd = (UINT_32) prIwReqData->mode;
953 pu4IntBuf = (PUINT_32) pcExtra;
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];
960 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
962 prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
963 prNdisReq->inNdisOidlength = 8;
964 prNdisReq->outNdisOidLength = 8;
966 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
968 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
969 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
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");
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];
985 if (!prGlueInfo->fgMcrAccessAllowed) {
990 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
992 prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
993 prNdisReq->inNdisOidlength = 8;
994 prNdisReq->outNdisOidLength = 8;
996 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
998 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
999 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1004 case PRIV_CMD_SW_CTRL:
1005 //printk(" addr=0x%08lx\n", pu4IntBuf[1]);
1007 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1009 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1011 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1012 prNdisReq->inNdisOidlength = 8;
1013 prNdisReq->outNdisOidLength = 8;
1015 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1017 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1018 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1023 case PRIV_CMD_BEACON_PERIOD:
1024 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
1025 wlanoidQueryBeaconInterval,
1031 case PRIV_CMD_POWER_MODE:
1032 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
1033 wlanoidQuery802dot11PowerSaveProfile,
1039 case PRIV_CMD_ADHOC_MODE:
1040 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
1041 wlanoidQueryAdHocMode,
1052 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1055 case PRIV_CMD_GET_CH_LIST:
1058 UINT_8 NumOfChannel = 50;
1059 UINT_8 ucMaxChannelNum = 50;
1060 RF_CHANNEL_INFO_T aucChannelList[50];
1062 kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1063 if (NumOfChannel > 50)
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;
1077 for (j = 0; j < NumOfChannel; j++) {
1078 ch[j] = (INT_32)aucChannelList[j].ucChannelNum;
1082 prIwReqData->data.length = j;
1083 if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1094 } /* priv_get_int */
1097 /*----------------------------------------------------------------------------*/
1099 * \brief Private ioctl set int array handler.
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
1106 * \retval 0 For success.
1107 * \retval -EOPNOTSUPP If cmd is not supported.
1108 * \retval -EINVAL If a value is out of range.
1111 /*----------------------------------------------------------------------------*/
1114 IN struct net_device *prNetDev,
1115 IN struct iw_request_info *prIwReqInfo,
1116 IN union iwreq_data *prIwReqData,
1120 UINT_32 u4SubCmd, u4BufLen;
1121 P_GLUE_INFO_T prGlueInfo;
1123 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1124 P_SET_TXPWR_CTRL_T prTxpwr;
1127 ASSERT(prIwReqInfo);
1128 ASSERT(prIwReqData);
1131 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1134 prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
1136 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1139 case PRIV_CMD_SET_TX_POWER:
1141 INT_32 *setting = prIwReqData->data.pointer;
1145 printk("Tx power num = %d\n", prIwReqData->data.length);
1147 printk("Tx power setting = %d %d %d %d\n",
1148 setting[0], setting[1], setting[2], setting[3]);
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];
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];
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];
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];
1178 else if (setting[0] == 1 && prIwReqData->data.length == 2) {
1179 prTxpwr->ucConcurrencePolicy = setting[1];
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];
1186 else if (setting[1] <= 14)
1187 prTxpwr->acTxPwrLimit2G[setting[1] - 1] = setting[2];
1189 else if (setting[0] == 3 && prIwReqData->data.length == 3) {
1190 if (setting[1] == 0) {
1192 prTxpwr->acTxPwrLimit5G[i] = setting[2];
1194 else if (setting[1] <= 4)
1195 prTxpwr->acTxPwrLimit5G[setting[1] - 1] = setting[2];
1197 else if (setting[0] == 4 && prIwReqData->data.length == 2) {
1198 if (setting[1] == 0) {
1199 wlanDefTxPowerCfg(prGlueInfo->prAdapter);
1201 rStatus = kalIoctl(prGlueInfo,
1204 sizeof(SET_TXPWR_CTRL_T),
1223 /*----------------------------------------------------------------------------*/
1225 * \brief Private ioctl get int array handler.
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
1232 * \retval 0 For success.
1233 * \retval -EOPNOTSUPP If cmd is not supported.
1234 * \retval -EFAULT For fail.
1237 /*----------------------------------------------------------------------------*/
1240 IN struct net_device *prNetDev,
1241 IN struct iw_request_info *prIwReqInfo,
1242 IN union iwreq_data *prIwReqData,
1243 IN OUT char *pcExtra
1247 P_GLUE_INFO_T prGlueInfo;
1252 ASSERT(prIwReqInfo);
1253 ASSERT(prIwReqData);
1255 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1258 prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prNetDev);
1260 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1263 case PRIV_CMD_GET_CH_LIST:
1266 UINT_8 NumOfChannel = 50;
1267 UINT_8 ucMaxChannelNum = 50;
1268 RF_CHANNEL_INFO_T aucChannelList[50];
1270 kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1271 if (NumOfChannel > 50)
1274 for (i = 0; i < NumOfChannel; i++) {
1275 ch[i] = (INT_32)aucChannelList[i].ucChannelNum;
1278 prIwReqData->data.length = NumOfChannel;
1279 if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1290 } /* priv_get_int */
1292 /*----------------------------------------------------------------------------*/
1294 * \brief Private ioctl set structure handler.
1296 * \param[in] pDev Net device requested.
1297 * \param[in] prIwReqData Pointer to iwreq_data structure.
1299 * \retval 0 For success.
1300 * \retval -EOPNOTSUPP If cmd is not supported.
1301 * \retval -EINVAL If a value is out of range.
1304 /*----------------------------------------------------------------------------*/
1307 IN struct net_device *prNetDev,
1308 IN struct iw_request_info *prIwReqInfo,
1309 IN union iwreq_data *prIwReqData,
1313 UINT_32 u4SubCmd = 0;
1315 //WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1316 UINT_32 u4CmdLen = 0;
1317 P_NDIS_TRANSPORT_STRUCT prNdisReq;
1318 PUINT_32 pu4IntBuf = NULL;
1320 P_GLUE_INFO_T prGlueInfo = NULL;
1321 UINT_32 u4BufLen = 0;
1324 //ASSERT(prIwReqInfo);
1325 ASSERT(prIwReqData);
1328 kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1330 if (FALSE == GLUE_CHK_PR2(prNetDev, prIwReqData)) {
1333 prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1335 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1338 printk(KERN_INFO DRV_NAME"priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
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) {
1353 if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1354 status = -EFAULT; //return -EFAULT;
1358 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
1359 wlanoidSetBtCoexistCtrl,
1360 (PVOID)&aucOidBuf[0],
1363 if (WLAN_STATUS_SUCCESS != rStatus) {
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) {
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));
1378 DBGLOG(REQ, INFO, ("priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1383 DBGLOG(REQ, INFO, ("*pcExtra = 0x%x\n", *pcExtra));
1386 if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1387 status = -EFAULT; //return -EFAULT;
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]));
1396 status = wlanSetInformation(prGlueInfo->prAdapter,
1398 (PVOID)&aucOidBuf[0],
1404 status = wlanoidSetBT(prGlueInfo->prAdapter,
1405 (PVOID)&aucOidBuf[0],
1410 if (WLAN_STATUS_SUCCESS != status) {
1416 #if CFG_SUPPORT_WPS2
1417 case PRIV_CMD_WSC_PROBE_REQ:
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)) {
1426 prGlueInfo->u2WSCIELen = prIwReqData->data.length;
1429 prGlueInfo->u2WSCIELen = 0;
1434 #if CFG_SUPPORT_WAPI
1435 case PRIV_SEC_MSG_OID:
1438 int msg_out_len = 0;
1439 unsigned char msg_out[1000];
1441 DBGLOG(WAPI, TRACE, ("Set msg private ioctl!!!\n"));
1443 if (copy_from_user(&aucOidBuf[0],
1444 prIwReqData->data.pointer,
1445 prIwReqData->data.length)) { //+2
1449 msg_in_len = prIwReqData->data.length;
1451 if(aucOidBuf[0] == 0x01) {
1453 handle_sec_msg_1(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1455 prIwReqData->data.length = msg_out_len;
1456 if (copy_to_user(prIwReqData->data.pointer,
1457 &(prIwReqData->data.length),
1459 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1464 if (copy_to_user((char *)prIwReqData->data.pointer + sizeof(__u16),
1466 prIwReqData->data.length)) {
1467 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1473 else if(aucOidBuf[0] == 0x02){
1475 handle_sec_msg_2(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1477 prIwReqData->data.length = 0;
1478 if (copy_to_user(prIwReqData->data.pointer,
1479 &(prIwReqData->data.length),
1481 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1486 else if(aucOidBuf[0] == 0x03){
1488 handle_sec_msg_3(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1490 prIwReqData->data.length = 0;
1491 if (copy_to_user(prIwReqData->data.pointer,
1492 &(prIwReqData->data.length),
1494 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1499 else if(aucOidBuf[0] == 0x04){
1501 handle_sec_msg_4(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1503 prIwReqData->data.length = 0;
1504 if (copy_to_user(prIwReqData->data.pointer,
1505 &(prIwReqData->data.length),
1507 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1512 else if(aucOidBuf[0] == 0x05){
1514 handle_sec_msg_5(aucOidBuf, msg_in_len, msg_out , &msg_out_len);
1516 prIwReqData->data.length = 0;
1517 if (copy_to_user(prIwReqData->data.pointer,
1518 &(prIwReqData->data.length),
1520 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1530 if (copy_from_user(&aucOidBuf[0],
1531 prIwReqData->data.pointer,
1532 prIwReqData->data.length)) {
1536 if (!kalMemCmp(&aucOidBuf[0], pcExtra, prIwReqData->data.length)) {
1537 DBGLOG(REQ, INFO, ("pcExtra buffer is valid\n"));
1540 DBGLOG(REQ, INFO, ("pcExtra 0x%p\n", pcExtra));
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;
1547 if (copy_to_user(prIwReqData->data.pointer,
1549 OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1550 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1556 case PRIV_CMD_SW_CTRL:
1557 pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1558 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
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)) {
1567 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1568 prNdisReq->inNdisOidlength = 8;
1569 prNdisReq->outNdisOidLength = 8;
1571 /* Execute this OID */
1572 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
1582 /*----------------------------------------------------------------------------*/
1584 * \brief Private ioctl get struct handler.
1586 * \param[in] pDev Net device requested.
1587 * \param[out] pIwReq Pointer to iwreq structure.
1588 * \param[in] cmd Private sub-command.
1590 * \retval 0 For success.
1591 * \retval -EFAULT If copy from user space buffer fail.
1592 * \retval -EOPNOTSUPP Parameter "cmd" not recognized.
1595 /*----------------------------------------------------------------------------*/
1598 IN struct net_device *prNetDev,
1599 IN struct iw_request_info *prIwReqInfo,
1600 IN union iwreq_data *prIwReqData,
1601 IN OUT char *pcExtra
1604 UINT_32 u4SubCmd = 0;
1605 P_NDIS_TRANSPORT_STRUCT prNdisReq= NULL;
1607 P_GLUE_INFO_T prGlueInfo = NULL;
1608 UINT_32 u4BufLen = 0;
1609 PUINT_32 pu4IntBuf = NULL;
1612 kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1615 ASSERT(prIwReqData);
1616 if (!prNetDev || !prIwReqData) {
1617 DBGLOG(REQ, INFO, ("priv_get_struct(): invalid param(0x%p, 0x%p)\n",
1618 prNetDev, prIwReqData));
1622 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1623 prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1626 DBGLOG(REQ, INFO, ("priv_get_struct(): invalid prGlueInfo(0x%p, 0x%p)\n",
1627 prNetDev, netdev_priv(prNetDev)));
1632 printk(KERN_INFO DRV_NAME"priv_get_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1637 memset(aucOidBuf, 0, sizeof(aucOidBuf));
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"));
1648 prNdisReq = (P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0];
1650 printk(KERN_NOTICE "\n priv_get_struct cmd 0x%02x len:%d OID:0x%08x OID Len:%d\n",
1652 pIwReq->u.data.length,
1653 ndisReq->ndisOidCmd,
1654 ndisReq->inNdisOidlength);
1656 if (priv_get_ndis(prNetDev, prNdisReq, &u4BufLen) == 0) {
1657 prNdisReq->outNdisOidLength = u4BufLen;
1658 if (copy_to_user(prIwReqData->data.pointer,
1660 u4BufLen + sizeof(NDIS_TRANSPORT_STRUCT) - sizeof(prNdisReq->ndisOidContent))) {
1661 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(1)\n"));
1667 prNdisReq->outNdisOidLength = u4BufLen;
1668 if (copy_to_user(prIwReqData->data.pointer,
1670 OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1671 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(2)\n"));
1677 case PRIV_CMD_SW_CTRL:
1678 pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1679 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
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"));
1688 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1689 prNdisReq->inNdisOidlength = 8;
1690 prNdisReq->outNdisOidLength = 8;
1692 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1694 prNdisReq->outNdisOidLength = u4BufLen;
1695 //printk("len=%d Result=%08lx\n", u4BufLen, *(PUINT_32)&prNdisReq->ndisOidContent[4]);
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"));
1707 DBGLOG(REQ, WARN, ("get struct cmd:0x%lx\n", u4SubCmd));
1710 } /* priv_get_struct */
1712 /*----------------------------------------------------------------------------*/
1714 * \brief The routine handles a set operation for a single OID.
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..
1723 * \retval 0 On success.
1724 * \retval -EOPNOTSUPP If cmd is not supported.
1727 /*----------------------------------------------------------------------------*/
1730 IN struct net_device *prNetDev,
1731 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1732 OUT PUINT_32 pu4OutputLen
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;
1742 ASSERT(pu4OutputLen);
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));
1750 prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1753 DBGLOG(REQ, INFO, ("priv_set_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1754 prNetDev, netdev_priv(prNetDev)));
1759 printk(KERN_INFO DRV_NAME"priv_set_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1760 prNdisReq->ndisOidCmd
1764 if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1766 //WARNLOG(("Set OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1770 if (NULL == prWlanReqEntry->pfOidSetHandler) {
1771 //WARNLOG(("Set %s: Null set handler\n", prWlanReqEntry->pucOidName));
1776 printk(KERN_INFO DRV_NAME"priv_set_ndis(): %s\n",
1777 prWlanReqEntry->pucOidName
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));
1788 *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1793 if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1794 /* GLUE sw info only */
1795 status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1796 prNdisReq->ndisOidContent,
1797 prNdisReq->inNdisOidlength,
1800 else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1801 /* multiple sw operations */
1802 status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1803 prNdisReq->ndisOidContent,
1804 prNdisReq->inNdisOidlength,
1807 else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1810 status = kalIoctl(prGlueInfo,
1811 (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidSetHandler,
1812 prNdisReq->ndisOidContent,
1813 prNdisReq->inNdisOidlength,
1821 DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1822 prWlanReqEntry->eOidMethod));
1826 *pu4OutputLen = u4SetInfoLen;
1829 case WLAN_STATUS_SUCCESS:
1832 case WLAN_STATUS_INVALID_LENGTH:
1833 //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1834 // prWlanReqEntry->pucOidName,
1835 //prNdisReq->inNdisOidlength,
1840 if (WLAN_STATUS_SUCCESS != status) {
1845 } /* priv_set_ndis */
1847 /*----------------------------------------------------------------------------*/
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.
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..
1859 * \retval 0 On success.
1860 * \retval -EOPNOTSUPP If cmd is not supported.
1861 * \retval -EINVAL invalid input parameters
1864 /*----------------------------------------------------------------------------*/
1867 IN struct net_device *prNetDev,
1868 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1869 OUT PUINT_32 pu4OutputLen
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;
1879 ASSERT(pu4OutputLen);
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));
1887 prGlueInfo = (P_GLUE_INFO_T)netdev_priv(prNetDev);
1890 DBGLOG(REQ, INFO, ("priv_get_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1891 prNetDev, netdev_priv(prNetDev)));
1896 printk(KERN_INFO DRV_NAME"priv_get_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1897 prNdisReq->ndisOidCmd
1901 if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1903 //WARNLOG(("Query OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1908 if (NULL == prWlanReqEntry->pfOidQueryHandler) {
1909 //WARNLOG(("Query %s: Null query handler\n", prWlanReqEntry->pucOidName));
1914 printk(KERN_INFO DRV_NAME"priv_get_ndis(): %s\n",
1915 prWlanReqEntry->pucOidName
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));
1927 *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1929 status = WLAN_STATUS_INVALID_LENGTH;
1935 if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1936 /* GLUE sw info only */
1937 status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1938 prNdisReq->ndisOidContent,
1939 prNdisReq->inNdisOidlength,
1942 else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1943 /* multiple sw operations */
1944 status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1945 prNdisReq->ndisOidContent,
1946 prNdisReq->inNdisOidlength,
1949 else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1952 status = kalIoctl(prGlueInfo,
1953 (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidQueryHandler,
1954 prNdisReq->ndisOidContent,
1955 prNdisReq->inNdisOidlength,
1963 DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1964 prWlanReqEntry->eOidMethod));
1968 *pu4OutputLen = u4BufLen;
1971 case WLAN_STATUS_SUCCESS:
1974 case WLAN_STATUS_INVALID_LENGTH:
1975 //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1976 // prWlanReqEntry->pucOidName,
1977 //prNdisReq->inNdisOidlength,
1982 if (WLAN_STATUS_SUCCESS != status) {
1987 } /* priv_get_ndis */
1989 /*----------------------------------------------------------------------------*/
1991 * \brief This routine is called to search desired OID.
1993 * \param rOid[in] Desired NDIS_OID
1994 * \param ppWlanReqEntry[out] Found registered OID entry
1996 * \retval TRUE: Matched OID is found
1997 * \retval FALSE: No matched OID is found
1999 /*----------------------------------------------------------------------------*/
2001 reqSearchSupportedOidEntry (
2003 OUT P_WLAN_REQ_ENTRY *ppWlanReqEntry
2009 j = NUM_SUPPORTED_OIDS - 1;
2014 if (rOid == arWlanOidReqTable[k].rOid) {
2015 *ppWlanReqEntry = &arWlanOidReqTable[k];
2017 } else if (rOid < arWlanOidReqTable[k].rOid) {
2025 } /* reqSearchSupportedOidEntry */
2028 /*----------------------------------------------------------------------------*/
2030 * \brief This routine is called to query the radio configuration used in IBSS
2031 * mode and RF test mode.
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.
2041 * \retval WLAN_STATUS_SUCCESS
2042 * \retval WLAN_STATUS_INVALID_LENGTH
2044 /*----------------------------------------------------------------------------*/
2046 reqExtQueryConfiguration (
2047 IN P_GLUE_INFO_T prGlueInfo,
2048 OUT PVOID pvQueryBuffer,
2049 IN UINT_32 u4QueryBufferLen,
2050 OUT PUINT_32 pu4QueryInfoLen
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;
2057 DEBUGFUNC("wlanoidQueryConfiguration");
2061 ASSERT(pu4QueryInfoLen);
2063 *pu4QueryInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2064 if (u4QueryBufferLen < sizeof(PARAM_802_11_CONFIG_T)) {
2065 return WLAN_STATUS_INVALID_LENGTH;
2068 ASSERT(pvQueryBuffer);
2070 kalMemZero(prQueryConfig, sizeof(PARAM_802_11_CONFIG_T));
2072 /* Update the current radio configuration. */
2073 prQueryConfig->u4Length = sizeof(PARAM_802_11_CONFIG_T);
2075 #if defined(_HIF_SDIO)
2076 rStatus = sdio_io_ctrl(prGlueInfo,
2077 wlanoidSetBeaconInterval,
2078 &prQueryConfig->u4BeaconPeriod,
2084 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2085 wlanoidQueryBeaconInterval,
2086 &prQueryConfig->u4BeaconPeriod,
2090 if (rStatus != WLAN_STATUS_SUCCESS) {
2094 #if defined(_HIF_SDIO)
2095 rStatus = sdio_io_ctrl(prGlueInfo,
2096 wlanoidQueryAtimWindow,
2097 &prQueryConfig->u4ATIMWindow,
2103 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2104 wlanoidQueryAtimWindow,
2105 &prQueryConfig->u4ATIMWindow,
2109 if (rStatus != WLAN_STATUS_SUCCESS) {
2113 #if defined(_HIF_SDIO)
2114 rStatus = sdio_io_ctrl(prGlueInfo,
2115 wlanoidQueryFrequency,
2116 &prQueryConfig->u4DSConfig,
2122 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2123 wlanoidQueryFrequency,
2124 &prQueryConfig->u4DSConfig,
2128 if (rStatus != WLAN_STATUS_SUCCESS) {
2132 prQueryConfig->rFHConfig.u4Length = sizeof(PARAM_802_11_CONFIG_FH_T);
2136 } /* end of reqExtQueryConfiguration() */
2139 /*----------------------------------------------------------------------------*/
2141 * \brief This routine is called to set the radio configuration used in IBSS
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.
2152 * \retval WLAN_STATUS_SUCCESS
2153 * \retval WLAN_STATUS_INVALID_LENGTH
2154 * \retval WLAN_STATUS_NOT_ACCEPTED
2156 /*----------------------------------------------------------------------------*/
2158 reqExtSetConfiguration (
2159 IN P_GLUE_INFO_T prGlueInfo,
2160 IN PVOID pvSetBuffer,
2161 IN UINT_32 u4SetBufferLen,
2162 OUT PUINT_32 pu4SetInfoLen
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;
2169 DEBUGFUNC("wlanoidSetConfiguration");
2173 ASSERT(pu4SetInfoLen);
2175 *pu4SetInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2177 if (u4SetBufferLen < *pu4SetInfoLen) {
2178 return WLAN_STATUS_INVALID_LENGTH;
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;
2186 ASSERT(pvSetBuffer);
2188 #if defined(_HIF_SDIO)
2189 rStatus = sdio_io_ctrl(prGlueInfo,
2190 wlanoidSetBeaconInterval,
2191 &prNewConfig->u4BeaconPeriod,
2197 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2198 wlanoidSetBeaconInterval,
2199 &prNewConfig->u4BeaconPeriod,
2203 if (rStatus != WLAN_STATUS_SUCCESS) {
2207 #if defined(_HIF_SDIO)
2208 rStatus = sdio_io_ctrl(prGlueInfo,
2209 wlanoidSetAtimWindow,
2210 &prNewConfig->u4ATIMWindow,
2216 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2217 wlanoidSetAtimWindow,
2218 &prNewConfig->u4ATIMWindow,
2222 if (rStatus != WLAN_STATUS_SUCCESS) {
2226 #if defined(_HIF_SDIO)
2227 rStatus = sdio_io_ctrl(prGlueInfo,
2228 wlanoidSetFrequency,
2229 &prNewConfig->u4DSConfig,
2235 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2236 wlanoidSetFrequency,
2237 &prNewConfig->u4DSConfig,
2242 if (rStatus != WLAN_STATUS_SUCCESS) {
2248 } /* end of reqExtSetConfiguration() */
2251 /*----------------------------------------------------------------------------*/
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).
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.
2263 * \retval WLAN_STATUS_SUCCESS
2264 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
2265 * \retval WLAN_STATUS_INVALID_LENGTH
2268 /*----------------------------------------------------------------------------*/
2270 reqExtSetAcpiDevicePowerState (
2271 IN P_GLUE_INFO_T prGlueInfo,
2272 IN PVOID pvSetBuffer,
2273 IN UINT_32 u4SetBufferLen,
2274 OUT PUINT_32 pu4SetInfoLen
2277 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2280 ASSERT(pvSetBuffer);
2281 ASSERT(pu4SetInfoLen);
2283 /* WIFI is enabled, when ACPI is D0 (ParamDeviceStateD0 = 1). And vice versa */
2285 //rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2286 // wlanoidSetAcpiDevicePowerState,