2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/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 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
59 ** [WCXRP00001269] [MT6620 Wi-Fi][Driver] cfg80211 porting merge back to DaVinci
60 ** cfg80211 support merge back from ALPS.JB to DaVinci - MT6620 Driver v2.3 branch.
62 * 07 17 2012 yuche.tsai
64 * Let netdev bring up.
66 * 06 13 2012 yuche.tsai
68 * Update maintrunk driver.
69 * Add support for driver compose assoc request frame.
72 * [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
73 * use return to avoid the ioctl return not supported
77 * Snc CFG80211 modification for ICS migration from branch 2.2.
80 * [WCXRP00001170] [MT6620 Wi-Fi][Driver] Adding the related code for set/get band ioctl
81 * Adding the template code for set / get band IOCTL (with ICS supplicant_6)..
84 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
85 * Adding the related ioctl / wlan oid function to set the Tx power cfg.
88 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
89 * Adding the proto type function for set_int set_tx_power and get int get_ch_list.
92 * [WCXRP00001098] [MT6620 Wi-Fi][Driver] Replace printk by DBG LOG macros in linux porting layer
93 * 1. eliminaite direct calls to printk in porting layer.
94 * 2. replaced by DBGLOG, which would be XLOG on ALPS platforms.
96 * 11 02 2011 chinghwa.yu
97 * [WCXRP00000063] Update BCM CoEx design and settings
100 * 09 20 2011 chinglan.wang
101 * [WCXRP00000989] [WiFi Direct] [Driver] Add a new io control API to start the formation for the sigma test.
104 * 07 28 2011 chinghwa.yu
105 * [WCXRP00000063] Update BCM CoEx design and settings
106 * Add BWCS cmd and event.
108 * 07 18 2011 chinghwa.yu
109 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
110 * Add CMD/Event for RDD and BWCS.
112 * 03 17 2011 chinglan.wang
113 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
116 * 03 07 2011 terry.wu
117 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
118 * Toggle non-standard debug messages to comments.
120 * 01 27 2011 cm.chang
121 * [WCXRP00000402] [MT6620 Wi-Fi][Driver] Enable MCR read/write by iwpriv by default
125 * [WCXRP00000396] [MT6620 Wi-Fi][Driver] Support Sw Ctrl ioctl at linux
126 * adding the SW cmd ioctl support, use set/get structure ioctl.
128 * 01 20 2011 eddie.chen
129 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
132 * 01 20 2011 eddie.chen
133 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
134 * Add Oid for sw control debug command
136 * 01 07 2011 cm.chang
137 * [WCXRP00000336] [MT6620 Wi-Fi][Driver] Add test mode commands in normal phone operation
138 * Add a new compiling option to control if MCR read/write is permitted
140 * 12 31 2010 cm.chang
141 * [WCXRP00000336] [MT6620 Wi-Fi][Driver] Add test mode commands in normal phone operation
142 * Add some iwpriv commands to support test mode operation
144 * 12 15 2010 george.huang
145 * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
146 * Support set PS profile and set WMM-PS related iwpriv.
149 * [WCXRP00000171] [MT6620 Wi-Fi][Driver] Add message check code same behavior as mt5921
150 * add the message check code from mt5921.
153 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android
154 * complete implementation of Android NVRAM access
157 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
158 * correct typo for NVRAM access.
161 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
162 * add skeleton for NVRAM integration
166 * revert changelist #15371, efuse read/write access will be done by RF test approach
170 * add OID definitions for EFUSE read/write access.
174 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
176 * 06 06 2010 kevin.huang
177 * [WPD00003832][MT6620 5931] Create driver base
178 * [MT6620 5931] Create driver base
181 * [WPD00001943]Create WiFi test driver framework on WinXP
182 * enable OID_CUSTOM_MTK_WIFI_TEST for RFTest & META tool
184 * 05 29 2010 jeffrey.chang
185 * [WPD00003826]Initial import for Linux port
186 * fix private ioctl for rftest
188 * 04 21 2010 jeffrey.chang
189 * [WPD00003826]Initial import for Linux port
190 * add for private ioctl support
191 ** \main\maintrunk.MT5921\32 2009-10-08 10:33:25 GMT mtk01090
192 ** Avoid accessing private data of net_device directly. Replace with netdev_priv(). Add more checking for input parameters and pointers.
193 ** \main\maintrunk.MT5921\31 2009-09-29 16:46:21 GMT mtk01090
194 ** Remove unused functions
195 ** \main\maintrunk.MT5921\30 2009-09-29 14:46:47 GMT mtk01090
196 ** Fix compile warning
197 ** \main\maintrunk.MT5921\29 2009-09-29 14:28:48 GMT mtk01090
198 ** Fix compile warning
199 ** \main\maintrunk.MT5921\28 2009-09-28 22:21:38 GMT mtk01090
200 ** Refine lines to supress compile warning
201 ** \main\maintrunk.MT5921\27 2009-09-28 20:19:14 GMT mtk01090
202 ** Add private ioctl to carry OID structures. Restructure public/private ioctl interfaces to Linux kernel.
203 ** \main\maintrunk.MT5921\26 2009-08-18 22:56:53 GMT mtk01090
204 ** Add Linux SDIO (with mmc core) support.
205 ** Add Linux 2.6.21, 2.6.25, 2.6.26.
206 ** Fix compile warning in Linux.
207 ** \main\maintrunk.MT5921\25 2009-05-07 22:26:15 GMT mtk01089
208 ** Add mandatory and private IO control for Linux BWCS
209 ** \main\maintrunk.MT5921\24 2009-04-29 10:07:05 GMT mtk01088
210 ** fixed the compiling error at linux
211 ** \main\maintrunk.MT5921\23 2009-04-24 09:09:45 GMT mtk01088
212 ** mark the code not used at linux supplicant v0.6.7
213 ** \main\maintrunk.MT5921\22 2008-11-24 21:03:51 GMT mtk01425
214 ** 1. Add PTA_ENABLED flag
215 ** \main\maintrunk.MT5921\21 2008-08-29 14:55:59 GMT mtk01088
216 ** adjust the code for meet the coding style, and add assert check
217 ** \main\maintrunk.MT5921\20 2008-07-16 15:23:20 GMT mtk01104
218 ** Support GPIO2 mode
219 ** \main\maintrunk.MT5921\19 2008-07-15 17:43:11 GMT mtk01084
220 ** modify variable name
221 ** \main\maintrunk.MT5921\18 2008-07-14 14:37:58 GMT mtk01104
222 ** Add exception handle about length in function priv_set_struct()
223 ** \main\maintrunk.MT5921\17 2008-07-14 13:55:32 GMT mtk01104
224 ** Support PRIV_CMD_BT_COEXIST
225 ** \main\maintrunk.MT5921\16 2008-07-09 00:20:15 GMT mtk01461
226 ** Add priv oid to support WMM_PS_TEST
227 ** \main\maintrunk.MT5921\15 2008-06-02 11:15:22 GMT mtk01461
228 ** Update after wlanoidSetPowerMode changed
229 ** \main\maintrunk.MT5921\14 2008-05-30 19:31:07 GMT mtk01461
230 ** Add IOCTL for Power Mode
231 ** \main\maintrunk.MT5921\13 2008-05-30 18:57:15 GMT mtk01461
232 ** Not use wlanoidSetCSUMOffloadForLinux()
233 ** \main\maintrunk.MT5921\12 2008-05-30 15:13:18 GMT mtk01084
235 ** \main\maintrunk.MT5921\11 2008-05-29 14:16:31 GMT mtk01084
236 ** rename for wlanoidSetBeaconIntervalForLinux
237 ** \main\maintrunk.MT5921\10 2008-04-17 23:06:37 GMT mtk01461
238 ** Add iwpriv support for AdHocMode setting
239 ** \main\maintrunk.MT5921\9 2008-03-31 21:00:55 GMT mtk01461
240 ** Add priv IOCTL for VOIP setting
241 ** \main\maintrunk.MT5921\8 2008-03-31 13:49:43 GMT mtk01461
242 ** Add priv ioctl to turn on / off roaming
243 ** \main\maintrunk.MT5921\7 2008-03-26 15:35:14 GMT mtk01461
244 ** Add CSUM offload priv ioctl for Linux
245 ** \main\maintrunk.MT5921\6 2008-03-11 14:50:59 GMT mtk01461
247 ** \main\maintrunk.MT5921\5 2007-11-06 19:32:30 GMT mtk01088
249 ** \main\maintrunk.MT5921\4 2007-10-30 12:01:39 GMT MTK01425
250 ** 1. Update wlanQueryInformation and wlanSetInformation
253 /*******************************************************************************
254 * C O M P I L E R F L A G S
255 ********************************************************************************
258 /*******************************************************************************
259 * E X T E R N A L R E F E R E N C E S
260 ********************************************************************************
263 #include "gl_wext_priv.h"
267 #if CFG_ENABLE_WIFI_DIRECT
268 #include "gl_p2p_os.h"
271 /*******************************************************************************
273 ********************************************************************************
275 #define NUM_SUPPORTED_OIDS (sizeof(arWlanOidReqTable) / sizeof(WLAN_REQ_ENTRY))
277 /*******************************************************************************
278 * F U N C T I O N D E C L A R A T I O N S
279 ********************************************************************************
284 IN struct net_device *prNetDev,
285 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
286 OUT PUINT_32 pu4OutputLen
291 IN struct net_device *prNetDev,
292 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
293 OUT PUINT_32 pu4OutputLen
296 #if 0 /* CFG_SUPPORT_WPS */
299 IN struct net_device *prNetDev,
300 IN struct iw_request_info *prIwReqInfo,
301 IN union iwreq_data *prIwReqData,
307 IN struct net_device *prNetDev,
308 IN struct iw_request_info *prIwReqInfo,
309 IN union iwreq_data *prIwReqData,
312 #endif /* CFG_SUPPORT_WPS */
315 reqSearchSupportedOidEntry (
317 OUT P_WLAN_REQ_ENTRY *ppWlanReqEntry
322 reqExtQueryConfiguration (
323 IN P_GLUE_INFO_T prGlueInfo,
324 OUT PVOID pvQueryBuffer,
325 IN UINT_32 u4QueryBufferLen,
326 OUT PUINT_32 pu4QueryInfoLen
330 reqExtSetConfiguration (
331 IN P_GLUE_INFO_T prGlueInfo,
332 IN PVOID pvSetBuffer,
333 IN UINT_32 u4SetBufferLen,
334 OUT PUINT_32 pu4SetInfoLen
339 reqExtSetAcpiDevicePowerState (
340 IN P_GLUE_INFO_T prGlueInfo,
341 IN PVOID pvSetBuffer,
342 IN UINT_32 u4SetBufferLen,
343 OUT PUINT_32 pu4SetInfoLen
346 /*******************************************************************************
347 * P R I V A T E D A T A
348 ********************************************************************************
350 static UINT_8 aucOidBuf[4096] = {0};
352 /* OID processing table */
353 /* Order is important here because the OIDs should be in order of
354 increasing value for binary searching. */
355 static WLAN_REQ_ENTRY arWlanOidReqTable[] = {
359 fgQryBufLenChecking, fgSetBufLenChecking, fgIsHandleInGlueLayerOnly, u4InfoBufLen,
363 /* General Operational Characteristics */
365 /* Ethernet Operational Characteristics */
366 {OID_802_3_CURRENT_ADDRESS,
367 DISP_STRING("OID_802_3_CURRENT_ADDRESS"),
368 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 6,
369 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCurrentAddr,
372 /* OID_802_3_MULTICAST_LIST */
373 /* OID_802_3_MAXIMUM_LIST_SIZE */
374 /* Ethernet Statistics */
376 /* NDIS 802.11 Wireless LAN OIDs */
377 {OID_802_11_SUPPORTED_RATES,
378 DISP_STRING("OID_802_11_SUPPORTED_RATES"),
379 TRUE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_RATES_EX),
380 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySupportedRates,
383 {OID_802_11_CONFIGURATION,
384 DISP_STRING("OID_802_11_CONFIGURATION"),
385 TRUE, TRUE, ENUM_OID_GLUE_EXTENSION, sizeof(PARAM_802_11_CONFIG_T),
386 (PFN_OID_HANDLER_FUNC_REQ)reqExtQueryConfiguration,
387 (PFN_OID_HANDLER_FUNC_REQ)reqExtSetConfiguration},
390 DISP_STRING("OID_PNP_SET_POWER"),
391 TRUE, FALSE, ENUM_OID_GLUE_EXTENSION, sizeof(PARAM_DEVICE_POWER_STATE),
393 (PFN_OID_HANDLER_FUNC_REQ)reqExtSetAcpiDevicePowerState},
396 {OID_CUSTOM_OID_INTERFACE_VERSION,
397 DISP_STRING("OID_CUSTOM_OID_INTERFACE_VERSION"),
398 TRUE, FALSE, ENUM_OID_DRIVER_CORE, 4,
399 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryOidInterfaceVersion,
404 {OID_CUSTOM_BT_COEXIST_CTRL,
405 DISP_STRING("OID_CUSTOM_BT_COEXIST_CTRL"),
406 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_BT_COEXIST_T),
408 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtCoexistCtrl},
413 {OID_CUSTOM_POWER_MANAGEMENT_PROFILE,
414 DISP_STRING("OID_CUSTOM_POWER_MANAGEMENT_PROFILE"),
415 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
416 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPwrMgmtProfParam,
417 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPwrMgmtProfParam},
418 {OID_CUSTOM_PATTERN_CONFIG,
419 DISP_STRING("OID_CUSTOM_PATTERN_CONFIG"),
420 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_PATTERN_SEARCH_CONFIG_STRUC_T),
422 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPatternConfig},
423 {OID_CUSTOM_BG_SSID_SEARCH_CONFIG,
424 DISP_STRING("OID_CUSTOM_BG_SSID_SEARCH_CONFIG"),
425 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
427 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBgSsidParam},
428 {OID_CUSTOM_VOIP_SETUP,
429 DISP_STRING("OID_CUSTOM_VOIP_SETUP"),
430 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
431 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryVoipConnectionStatus,
432 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetVoipConnectionStatus},
434 DISP_STRING("OID_CUSTOM_ADD_TS"),
435 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
437 (PFN_OID_HANDLER_FUNC_REQ)wlanoidAddTS},
439 DISP_STRING("OID_CUSTOM_DEL_TS"),
440 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
442 (PFN_OID_HANDLER_FUNC_REQ)wlanoidDelTS},
446 #if CFG_LP_PATTERN_SEARCH_SLT
448 DISP_STRING("OID_CUSTOM_SLT"),
449 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
450 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySltResult,
451 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSltMode},
454 {OID_CUSTOM_ROAMING_EN,
455 DISP_STRING("OID_CUSTOM_ROAMING_EN"),
456 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
457 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRoamingFunction,
458 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetRoamingFunction},
459 {OID_CUSTOM_WMM_PS_TEST,
460 DISP_STRING("OID_CUSTOM_WMM_PS_TEST"),
461 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
463 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWiFiWmmPsTest},
464 {OID_CUSTOM_COUNTRY_STRING,
465 DISP_STRING("OID_CUSTOM_COUNTRY_STRING"),
466 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
467 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCurrentCountry,
468 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetCurrentCountry},
470 #if CFG_SUPPORT_802_11D
471 {OID_CUSTOM_MULTI_DOMAIN_CAPABILITY,
472 DISP_STRING("OID_CUSTOM_MULTI_DOMAIN_CAPABILITY"),
473 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
474 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMultiDomainCap,
475 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMultiDomainCap},
478 {OID_CUSTOM_GPIO2_MODE,
479 DISP_STRING("OID_CUSTOM_GPIO2_MODE"),
480 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_PARAM_GPIO2_MODE_T),
482 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetGPIO2Mode},
483 {OID_CUSTOM_CONTINUOUS_POLL,
484 DISP_STRING("OID_CUSTOM_CONTINUOUS_POLL"),
485 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CONTINUOUS_POLL_T),
486 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryContinuousPollInterval,
487 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetContinuousPollProfile},
488 {OID_CUSTOM_DISABLE_BEACON_DETECTION,
489 DISP_STRING("OID_CUSTOM_DISABLE_BEACON_DETECTION"),
490 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
491 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryDisableBeaconDetectionFunc,
492 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisableBeaconDetectionFunc},
497 {OID_CUSTOM_DISABLE_PRIVACY_CHECK,
498 DISP_STRING("OID_CUSTOM_DISABLE_PRIVACY_CHECK"),
499 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
501 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisablePriavcyCheck},
505 DISP_STRING("OID_CUSTOM_MCR_RW"),
506 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T),
507 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMcrRead,
508 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMcrWrite},
510 {OID_CUSTOM_EEPROM_RW,
511 DISP_STRING("OID_CUSTOM_EEPROM_RW"),
512 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T),
513 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryEepromRead,
514 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetEepromWrite},
517 DISP_STRING("OID_CUSTOM_SW_CTRL"),
518 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T),
519 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySwCtrlRead,
520 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSwCtrlWrite},
522 {OID_CUSTOM_MEM_DUMP,
523 DISP_STRING("OID_CUSTOM_MEM_DUMP"),
524 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_MEM_DUMP_STRUC_T),
525 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMemDump,
528 {OID_CUSTOM_TEST_MODE,
529 DISP_STRING("OID_CUSTOM_TEST_MODE"),
530 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
532 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetTestMode},
535 {OID_CUSTOM_TEST_RX_STATUS,
536 DISP_STRING("OID_CUSTOM_TEST_RX_STATUS"),
537 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_RFTEST_RX_STATUS_STRUC_T),
538 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestRxStatus,
540 {OID_CUSTOM_TEST_TX_STATUS,
541 DISP_STRING("OID_CUSTOM_TEST_TX_STATUS"),
542 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_RFTEST_TX_STATUS_STRUC_T),
543 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestTxStatus,
546 {OID_CUSTOM_ABORT_TEST_MODE,
547 DISP_STRING("OID_CUSTOM_ABORT_TEST_MODE"),
548 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
550 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetAbortTestMode},
551 {OID_CUSTOM_MTK_WIFI_TEST,
552 DISP_STRING("OID_CUSTOM_MTK_WIFI_TEST"),
553 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_MTK_WIFI_TEST_STRUC_T),
554 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestQueryAutoTest,
555 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetAutoTest},
557 /* OID_CUSTOM_EMULATION_VERSION_CONTROL */
560 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
561 {OID_CUSTOM_BWCS_CMD,
562 DISP_STRING("OID_CUSTOM_BWCS_CMD"),
563 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PTA_IPC_T),
564 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryBT,
565 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBT},
568 /* {OID_CUSTOM_SINGLE_ANTENNA,
569 DISP_STRING("OID_CUSTOM_SINGLE_ANTENNA"),
570 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
571 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryBtSingleAntenna,
572 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtSingleAntenna},
574 DISP_STRING("OID_CUSTOM_SET_PTA"),
575 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
576 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPta,
577 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPta},
580 { OID_CUSTOM_MTK_NVRAM_RW,
581 DISP_STRING("OID_CUSTOM_MTK_NVRAM_RW"),
582 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T),
583 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryNvramRead,
584 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetNvramWrite },
586 { OID_CUSTOM_CFG_SRC_TYPE,
587 DISP_STRING("OID_CUSTOM_CFG_SRC_TYPE"),
588 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_CFG_SRC_TYPE_T),
589 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCfgSrcType,
592 { OID_CUSTOM_EEPROM_TYPE,
593 DISP_STRING("OID_CUSTOM_EEPROM_TYPE"),
594 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_EEPROM_TYPE_T),
595 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryEepromType,
599 {OID_802_11_WAPI_MODE,
600 DISP_STRING("OID_802_11_WAPI_MODE"),
601 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
603 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiMode},
604 {OID_802_11_WAPI_ASSOC_INFO,
605 DISP_STRING("OID_802_11_WAPI_ASSOC_INFO"),
606 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
608 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiAssocInfo},
609 {OID_802_11_SET_WAPI_KEY,
610 DISP_STRING("OID_802_11_SET_WAPI_KEY"),
611 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_WPI_KEY_T),
613 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiKey},
617 {OID_802_11_WSC_ASSOC_INFO,
618 DISP_STRING("OID_802_11_WSC_ASSOC_INFO"),
619 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
621 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWSCAssocInfo},
625 /*******************************************************************************
627 ********************************************************************************
630 /*----------------------------------------------------------------------------*/
632 * \brief Dispatching function for private ioctl region (SIOCIWFIRSTPRIV ~
635 * \param[in] prNetDev Net device requested.
636 * \param[in] prIfReq Pointer to ifreq structure.
637 * \param[in] i4Cmd Command ID between SIOCIWFIRSTPRIV and SIOCIWLASTPRIV.
639 * \retval 0 for success.
640 * \retval -EOPNOTSUPP If cmd is not supported.
641 * \retval -EFAULT For fail.
644 /*----------------------------------------------------------------------------*/
647 IN struct net_device *prNetDev,
648 IN OUT struct ifreq *prIfReq,
652 /* prIfReq is verified in the caller function wlanDoIOCTL() */
653 struct iwreq *prIwReq = (struct iwreq *)prIfReq;
654 struct iw_request_info rIwReqInfo;
656 /* prDev is verified in the caller function wlanDoIOCTL() */
658 /* Prepare the call */
659 rIwReqInfo.cmd = (__u16)i4Cmd;
660 rIwReqInfo.flags = 0;
664 /* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need copy_from/to_user() */
665 return priv_set_int(prNetDev, &rIwReqInfo, &(prIwReq->u), (char *) &(prIwReq->u));
668 /* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need copy_from/to_user() */
669 return priv_get_int(prNetDev, &rIwReqInfo, &(prIwReq->u), (char *) &(prIwReq->u));
671 case IOCTL_SET_STRUCT:
672 case IOCTL_SET_STRUCT_FOR_EM:
673 return priv_set_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
675 case IOCTL_GET_STRUCT:
676 return priv_get_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
681 } /* end of switch */
683 }/* priv_support_ioctl */
686 /*----------------------------------------------------------------------------*/
688 * \brief Private ioctl set int handler.
690 * \param[in] prNetDev Net device requested.
691 * \param[in] prIwReqInfo Pointer to iwreq structure.
692 * \param[in] prIwReqData The ioctl data structure, use the field of sub-command.
693 * \param[in] pcExtra The buffer with input value
695 * \retval 0 For success.
696 * \retval -EOPNOTSUPP If cmd is not supported.
697 * \retval -EINVAL If a value is out of range.
700 /*----------------------------------------------------------------------------*/
703 IN struct net_device *prNetDev,
704 IN struct iw_request_info *prIwReqInfo,
705 IN union iwreq_data *prIwReqData,
711 P_NDIS_TRANSPORT_STRUCT prNdisReq;
712 P_GLUE_INFO_T prGlueInfo;
713 UINT_32 u4BufLen = 0;
715 P_PTA_IPC_T prPtaIpc;
722 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
725 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
727 u4SubCmd = (UINT_32) prIwReqData->mode;
728 pu4IntBuf = (PUINT_32) pcExtra;
731 case PRIV_CMD_TEST_MODE:
732 //printk("TestMode=%ld\n", pu4IntBuf[1]);
733 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
735 if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY) {
736 prNdisReq->ndisOidCmd = OID_CUSTOM_TEST_MODE;
738 else if (pu4IntBuf[1] == 0) {
739 prNdisReq->ndisOidCmd = OID_CUSTOM_ABORT_TEST_MODE;
745 prNdisReq->inNdisOidlength = 0;
746 prNdisReq->outNdisOidLength = 0;
748 /* Execute this OID */
749 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
752 case PRIV_CMD_TEST_CMD:
753 //printk("CMD=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
754 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
756 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
758 prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
759 prNdisReq->inNdisOidlength = 8;
760 prNdisReq->outNdisOidLength = 8;
762 /* Execute this OID */
763 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
766 #if CFG_SUPPORT_PRIV_MCR_RW
767 case PRIV_CMD_ACCESS_MCR:
768 //printk("addr=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
769 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
771 if (!prGlueInfo->fgMcrAccessAllowed) {
772 if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY &&
773 pu4IntBuf[2] == PRIV_CMD_TEST_MAGIC_KEY) {
774 prGlueInfo->fgMcrAccessAllowed = TRUE;
780 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
782 prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
783 prNdisReq->inNdisOidlength = 8;
784 prNdisReq->outNdisOidLength = 8;
786 /* Execute this OID */
787 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
791 case PRIV_CMD_SW_CTRL:
792 //printk("addr=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
793 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
795 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
797 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
798 prNdisReq->inNdisOidlength = 8;
799 prNdisReq->outNdisOidLength = 8;
801 /* Execute this OID */
802 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
807 case PRIV_CMD_BEACON_PERIOD:
808 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
809 wlanoidSetBeaconInterval,
810 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
816 #if CFG_TCP_IP_CHKSUM_OFFLOAD
817 case PRIV_CMD_CSUM_OFFLOAD:
822 if (pu4IntBuf[1] == 1) {
823 u4CSUMFlags = CSUM_OFFLOAD_EN_ALL;
825 else if (pu4IntBuf[1] == 0) {
832 if (kalIoctl(prGlueInfo,
833 wlanoidSetCSUMOffload,
841 ) == WLAN_STATUS_SUCCESS) {
842 if (pu4IntBuf[1] == 1) {
843 prNetDev->features |= NETIF_F_HW_CSUM;
844 } else if (pu4IntBuf[1] == 0) {
845 prNetDev->features &= ~NETIF_F_HW_CSUM;
850 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
852 case PRIV_CMD_POWER_MODE:
854 wlanoidSet802dot11PowerSaveProfile,
855 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
864 case PRIV_CMD_WMM_PS:
866 PARAM_CUSTOM_WMM_PS_TEST_STRUC_T rWmmPsTest;
868 rWmmPsTest.bmfgApsdEnAc = (UINT_8)pu4IntBuf[1];
869 rWmmPsTest.ucIsEnterPsAtOnce = (UINT_8)pu4IntBuf[2];
870 rWmmPsTest.ucIsDisableUcTrigger = (UINT_8)pu4IntBuf[3];
871 rWmmPsTest.reserved = 0;
874 wlanoidSetWiFiWmmPsTest,
876 sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUC_T),
886 case PRIV_CMD_ADHOC_MODE:
887 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
889 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
895 case PRIV_CUSTOM_BWCS_CMD:
897 DBGLOG(REQ, INFO, ("pu4IntBuf[1] = %x, size of PTA_IPC_T = %d.\n", pu4IntBuf[1], sizeof(PARAM_PTA_IPC_T)));
899 prPtaIpc = (P_PTA_IPC_T) aucOidBuf;
900 prPtaIpc->u.aucBTPParams[0] = (UINT_8) (pu4IntBuf[1] >> 24);
901 prPtaIpc->u.aucBTPParams[1] = (UINT_8) (pu4IntBuf[1] >> 16);
902 prPtaIpc->u.aucBTPParams[2] = (UINT_8) (pu4IntBuf[1] >> 8);
903 prPtaIpc->u.aucBTPParams[3] = (UINT_8) (pu4IntBuf[1]);
905 DBGLOG(REQ, INFO, ("BCM BWCS CMD : PRIV_CUSTOM_BWCS_CMD : aucBTPParams[0] = %02x, aucBTPParams[1] = %02x, aucBTPParams[2] = %02x, aucBTPParams[3] = %02x.\n",
906 prPtaIpc->u.aucBTPParams[0],
907 prPtaIpc->u.aucBTPParams[1],
908 prPtaIpc->u.aucBTPParams[2],
909 prPtaIpc->u.aucBTPParams[3]));
912 status = wlanSetInformation(prGlueInfo->prAdapter,
914 (PVOID)&aucOidBuf[0],
919 status = wlanoidSetBT(prGlueInfo->prAdapter,
920 (PVOID)&aucOidBuf[0],
921 sizeof(PARAM_PTA_IPC_T),
924 if (WLAN_STATUS_SUCCESS != status) {
930 case PRIV_CMD_BAND_CONFIG:
932 DBGLOG(INIT, INFO, ("CMD set_band=%u\n", pu4IntBuf[1]));
936 #if CFG_ENABLE_WIFI_DIRECT
937 case PRIV_CMD_P2P_MODE:
939 PARAM_CUSTOM_P2P_SET_STRUC_T rSetP2P;
940 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
942 rSetP2P.u4Enable = pu4IntBuf[1];
943 rSetP2P.u4Mode = pu4IntBuf[2];
945 if(!rSetP2P.u4Enable) {
946 p2pNetUnregister(prGlueInfo, TRUE);
949 rWlanStatus = kalIoctl(prGlueInfo,
951 (PVOID)&rSetP2P, /* pu4IntBuf[0] is used as input SubCmd */
952 sizeof(PARAM_CUSTOM_P2P_SET_STRUC_T),
959 if(rSetP2P.u4Enable) {
960 p2pNetRegister(prGlueInfo, TRUE);
976 /*----------------------------------------------------------------------------*/
978 * \brief Private ioctl get int handler.
980 * \param[in] pDev Net device requested.
981 * \param[out] pIwReq Pointer to iwreq structure.
982 * \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
983 * \param[out] pcExtra The buffer with put the return value
985 * \retval 0 For success.
986 * \retval -EOPNOTSUPP If cmd is not supported.
987 * \retval -EFAULT For fail.
990 /*----------------------------------------------------------------------------*/
993 IN struct net_device *prNetDev,
994 IN struct iw_request_info *prIwReqInfo,
995 IN union iwreq_data *prIwReqData,
1001 P_GLUE_INFO_T prGlueInfo;
1002 UINT_32 u4BufLen = 0;
1004 P_NDIS_TRANSPORT_STRUCT prNdisReq;
1008 ASSERT(prIwReqInfo);
1009 ASSERT(prIwReqData);
1011 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1014 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1016 u4SubCmd = (UINT_32) prIwReqData->mode;
1017 pu4IntBuf = (PUINT_32) pcExtra;
1020 case PRIV_CMD_TEST_CMD:
1021 //printk("CMD=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
1022 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1024 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1026 prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
1027 prNdisReq->inNdisOidlength = 8;
1028 prNdisReq->outNdisOidLength = 8;
1030 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1032 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1033 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1035 if (copy_to_user(prIwReqData->data.pointer,
1036 &prNdisReq->ndisOidContent[4], 4)) {
1037 printk(KERN_NOTICE "priv_get_int() copy_to_user oidBuf fail(3)\n");
1044 #if CFG_SUPPORT_PRIV_MCR_RW
1045 case PRIV_CMD_ACCESS_MCR:
1046 //printk("addr=0x%08lx\n", pu4IntBuf[1]);
1047 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1049 if (!prGlueInfo->fgMcrAccessAllowed) {
1054 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1056 prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
1057 prNdisReq->inNdisOidlength = 8;
1058 prNdisReq->outNdisOidLength = 8;
1060 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1062 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1063 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1068 case PRIV_CMD_DUMP_MEM:
1069 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1072 if (!prGlueInfo->fgMcrAccessAllowed) {
1077 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1079 prNdisReq->ndisOidCmd = OID_CUSTOM_MEM_DUMP;
1080 prNdisReq->inNdisOidlength = 8;
1081 prNdisReq->outNdisOidLength = 8;
1083 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1085 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[0];
1089 case PRIV_CMD_SW_CTRL:
1090 //printk(" addr=0x%08lx\n", pu4IntBuf[1]);
1092 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1094 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1096 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1097 prNdisReq->inNdisOidlength = 8;
1098 prNdisReq->outNdisOidLength = 8;
1100 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1102 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1103 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1108 case PRIV_CMD_BEACON_PERIOD:
1109 status = wlanQueryInformation(prGlueInfo->prAdapter,
1110 wlanoidQueryBeaconInterval,
1116 case PRIV_CMD_POWER_MODE:
1117 status = wlanQueryInformation(prGlueInfo->prAdapter,
1118 wlanoidQuery802dot11PowerSaveProfile,
1124 case PRIV_CMD_ADHOC_MODE:
1125 status = wlanQueryInformation(prGlueInfo->prAdapter,
1126 wlanoidQueryAdHocMode,
1133 case PRIV_CMD_BAND_CONFIG:
1134 DBGLOG(INIT, INFO, ("CMD get_band=\n"));
1135 prIwReqData->mode = 0;
1142 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1145 case PRIV_CMD_GET_CH_LIST:
1148 UINT_8 NumOfChannel = 50;
1149 UINT_8 ucMaxChannelNum = 50;
1150 RF_CHANNEL_INFO_T aucChannelList[50];
1152 kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1153 if (NumOfChannel > 50)
1156 if (kalIsAPmode(prGlueInfo)) {
1157 for (i = 0; i < NumOfChannel; i++) {
1158 if ((aucChannelList[i].ucChannelNum <= 13) ||
1159 (aucChannelList[i].ucChannelNum == 36 || aucChannelList[i].ucChannelNum == 40 ||
1160 aucChannelList[i].ucChannelNum == 44 || aucChannelList[i].ucChannelNum == 48)) {
1161 ch[j] = (INT_32)aucChannelList[i].ucChannelNum;
1167 for (j = 0; j < NumOfChannel; j++) {
1168 ch[j] = (INT_32)aucChannelList[j].ucChannelNum;
1172 prIwReqData->data.length = j;
1173 if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1179 #if CFG_SUPPORT_BUILD_DATE_CODE
1180 case PRIV_CMD_GET_BUILD_DATE_CODE:
1182 UINT_8 aucBuffer[16];
1184 if(kalIoctl(prGlueInfo,
1185 wlanoidQueryBuildDateCode,
1187 sizeof(UINT_8) * 16,
1192 &u4BufLen) == WLAN_STATUS_SUCCESS) {
1193 prIwReqData->data.length = sizeof(UINT_8) * 16;
1195 if (copy_to_user(prIwReqData->data.pointer, aucBuffer, prIwReqData->data.length)) {
1211 } /* priv_get_int */
1214 /*----------------------------------------------------------------------------*/
1216 * \brief Private ioctl set int array handler.
1218 * \param[in] prNetDev Net device requested.
1219 * \param[in] prIwReqInfo Pointer to iwreq structure.
1220 * \param[in] prIwReqData The ioctl data structure, use the field of sub-command.
1221 * \param[in] pcExtra The buffer with input value
1223 * \retval 0 For success.
1224 * \retval -EOPNOTSUPP If cmd is not supported.
1225 * \retval -EINVAL If a value is out of range.
1228 /*----------------------------------------------------------------------------*/
1231 IN struct net_device *prNetDev,
1232 IN struct iw_request_info *prIwReqInfo,
1233 IN union iwreq_data *prIwReqData,
1237 UINT_32 u4SubCmd, u4BufLen;
1238 P_GLUE_INFO_T prGlueInfo;
1240 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1241 P_SET_TXPWR_CTRL_T prTxpwr;
1244 ASSERT(prIwReqInfo);
1245 ASSERT(prIwReqData);
1248 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1251 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1253 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1256 case PRIV_CMD_SET_TX_POWER:
1258 INT_32 *setting = prIwReqData->data.pointer;
1262 printk("Tx power num = %d\n", prIwReqData->data.length);
1264 printk("Tx power setting = %d %d %d %d\n",
1265 setting[0], setting[1], setting[2], setting[3]);
1267 prTxpwr = &prGlueInfo->rTxPwr;
1268 if (setting[0] == 0 && prIwReqData->data.length == 4 /* argc num */) {
1269 /* 0 (All networks), 1 (legacy STA), 2 (Hotspot AP), 3 (P2P), 4 (BT over Wi-Fi) */
1270 if (setting[1] == 1 || setting[1] == 0) {
1271 if (setting[2] == 0 || setting[2] == 1)
1272 prTxpwr->c2GLegacyStaPwrOffset = setting[3];
1273 if (setting[2] == 0 || setting[2] == 2)
1274 prTxpwr->c5GLegacyStaPwrOffset = setting[3];
1276 if (setting[1] == 2 || setting[1] == 0) {
1277 if (setting[2] == 0 || setting[2] == 1)
1278 prTxpwr->c2GHotspotPwrOffset = setting[3];
1279 if (setting[2] == 0 || setting[2] == 2)
1280 prTxpwr->c5GHotspotPwrOffset = setting[3];
1282 if (setting[1] == 3 || setting[1] == 0) {
1283 if (setting[2] == 0 || setting[2] == 1)
1284 prTxpwr->c2GP2pPwrOffset = setting[3];
1285 if (setting[2] == 0 || setting[2] == 2)
1286 prTxpwr->c5GP2pPwrOffset = setting[3];
1288 if (setting[1] == 4 || setting[1] == 0) {
1289 if (setting[2] == 0 || setting[2] == 1)
1290 prTxpwr->c2GBowPwrOffset = setting[3];
1291 if (setting[2] == 0 || setting[2] == 2)
1292 prTxpwr->c5GBowPwrOffset = setting[3];
1295 else if (setting[0] == 1 && prIwReqData->data.length == 2) {
1296 prTxpwr->ucConcurrencePolicy = setting[1];
1298 else if (setting[0] == 2 && prIwReqData->data.length == 3) {
1299 if (setting[1] == 0) {
1300 for (i=0; i<14; i++)
1301 prTxpwr->acTxPwrLimit2G[i] = setting[2];
1303 else if (setting[1] <= 14)
1304 prTxpwr->acTxPwrLimit2G[setting[1] - 1] = setting[2];
1306 else if (setting[0] == 3 && prIwReqData->data.length == 3) {
1307 if (setting[1] == 0) {
1309 prTxpwr->acTxPwrLimit5G[i] = setting[2];
1311 else if (setting[1] <= 4)
1312 prTxpwr->acTxPwrLimit5G[setting[1] - 1] = setting[2];
1314 else if (setting[0] == 4 && prIwReqData->data.length == 2) {
1315 if (setting[1] == 0) {
1316 wlanDefTxPowerCfg(prGlueInfo->prAdapter);
1318 rStatus = kalIoctl(prGlueInfo,
1321 sizeof(SET_TXPWR_CTRL_T),
1340 /*----------------------------------------------------------------------------*/
1342 * \brief Private ioctl get int array handler.
1344 * \param[in] pDev Net device requested.
1345 * \param[out] pIwReq Pointer to iwreq structure.
1346 * \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
1347 * \param[out] pcExtra The buffer with put the return value
1349 * \retval 0 For success.
1350 * \retval -EOPNOTSUPP If cmd is not supported.
1351 * \retval -EFAULT For fail.
1354 /*----------------------------------------------------------------------------*/
1357 IN struct net_device *prNetDev,
1358 IN struct iw_request_info *prIwReqInfo,
1359 IN union iwreq_data *prIwReqData,
1360 IN OUT char *pcExtra
1364 P_GLUE_INFO_T prGlueInfo;
1369 ASSERT(prIwReqInfo);
1370 ASSERT(prIwReqData);
1372 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1375 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1377 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1380 case PRIV_CMD_GET_CH_LIST:
1383 UINT_8 NumOfChannel = 50;
1384 UINT_8 ucMaxChannelNum = 50;
1385 RF_CHANNEL_INFO_T aucChannelList[50];
1387 kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1388 if (NumOfChannel > 50)
1391 for (i = 0; i < NumOfChannel; i++) {
1392 ch[i] = (INT_32)aucChannelList[i].ucChannelNum;
1395 prIwReqData->data.length = NumOfChannel;
1396 if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1407 } /* priv_get_int */
1409 /*----------------------------------------------------------------------------*/
1411 * \brief Private ioctl set structure handler.
1413 * \param[in] pDev Net device requested.
1414 * \param[in] prIwReqData Pointer to iwreq_data structure.
1416 * \retval 0 For success.
1417 * \retval -EOPNOTSUPP If cmd is not supported.
1418 * \retval -EINVAL If a value is out of range.
1421 /*----------------------------------------------------------------------------*/
1424 IN struct net_device *prNetDev,
1425 IN struct iw_request_info *prIwReqInfo,
1426 IN union iwreq_data *prIwReqData,
1430 UINT_32 u4SubCmd = 0;
1432 //WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1433 UINT_32 u4CmdLen = 0;
1434 P_NDIS_TRANSPORT_STRUCT prNdisReq;
1435 PUINT_32 pu4IntBuf = NULL;
1437 P_GLUE_INFO_T prGlueInfo = NULL;
1438 UINT_32 u4BufLen = 0;
1441 //ASSERT(prIwReqInfo);
1442 ASSERT(prIwReqData);
1445 kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1447 if (FALSE == GLUE_CHK_PR2(prNetDev, prIwReqData)) {
1450 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1452 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1455 printk(KERN_INFO DRV_NAME"priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1463 case PRIV_CMD_BT_COEXIST:
1464 u4CmdLen = prIwReqData->data.length * sizeof(UINT_32);
1465 ASSERT(sizeof(PARAM_CUSTOM_BT_COEXIST_T) >= u4CmdLen);
1466 if (sizeof(PARAM_CUSTOM_BT_COEXIST_T) < u4CmdLen) {
1470 if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1471 status = -EFAULT; //return -EFAULT;
1475 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
1476 wlanoidSetBtCoexistCtrl,
1477 (PVOID)&aucOidBuf[0],
1480 if (WLAN_STATUS_SUCCESS != rStatus) {
1486 case PRIV_CUSTOM_BWCS_CMD:
1487 u4CmdLen = prIwReqData->data.length * sizeof(UINT_32);
1488 ASSERT(sizeof(PARAM_PTA_IPC_T) >= u4CmdLen);
1489 if (sizeof(PARAM_PTA_IPC_T) < u4CmdLen) {
1492 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
1493 DBGLOG(REQ, INFO, ("ucCmdLen = %d, size of PTA_IPC_T = %d, prIwReqData->data = 0x%x.\n", u4CmdLen, sizeof(PARAM_PTA_IPC_T), prIwReqData->data));
1495 DBGLOG(REQ, INFO, ("priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1500 DBGLOG(REQ, INFO, ("*pcExtra = 0x%x\n", *pcExtra));
1503 if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1504 status = -EFAULT; //return -EFAULT;
1507 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
1508 DBGLOG(REQ, INFO, ("priv_set_struct(): BWCS CMD = %02x%02x%02x%02x\n",
1509 aucOidBuf[2], aucOidBuf[3], aucOidBuf[4], aucOidBuf[5]));
1513 status = wlanSetInformation(prGlueInfo->prAdapter,
1515 (PVOID)&aucOidBuf[0],
1521 status = wlanoidSetBT(prGlueInfo->prAdapter,
1522 (PVOID)&aucOidBuf[0],
1527 if (WLAN_STATUS_SUCCESS != status) {
1533 #if CFG_SUPPORT_WPS2
1534 case PRIV_CMD_WSC_PROBE_REQ:
1536 /* retrieve IE for Probe Request */
1537 if (prIwReqData->data.length > 0) {
1538 if (copy_from_user(prGlueInfo->aucWSCIE, prIwReqData->data.pointer,
1539 prIwReqData->data.length)) {
1543 prGlueInfo->u2WSCIELen = prIwReqData->data.length;
1546 prGlueInfo->u2WSCIELen = 0;
1552 if (copy_from_user(&aucOidBuf[0],
1553 prIwReqData->data.pointer,
1554 prIwReqData->data.length)) {
1558 if (!kalMemCmp(&aucOidBuf[0], pcExtra, prIwReqData->data.length)) {
1559 DBGLOG(REQ, INFO, ("pcExtra buffer is valid\n"));
1562 DBGLOG(REQ, INFO, ("pcExtra 0x%p\n", pcExtra));
1564 /* Execute this OID */
1565 status = priv_set_ndis(prNetDev, (P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0], &u4BufLen);
1566 /* Copy result to user space */
1567 ((P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0])->outNdisOidLength = u4BufLen;
1569 if (copy_to_user(prIwReqData->data.pointer,
1571 OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1572 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1578 case PRIV_CMD_SW_CTRL:
1579 pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1580 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1582 //kalMemCopy(&prNdisReq->ndisOidContent[0], prIwReqData->data.pointer, 8);
1583 if (copy_from_user(&prNdisReq->ndisOidContent[0],
1584 prIwReqData->data.pointer,
1585 prIwReqData->data.length)) {
1589 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1590 prNdisReq->inNdisOidlength = 8;
1591 prNdisReq->outNdisOidLength = 8;
1593 /* Execute this OID */
1594 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
1604 /*----------------------------------------------------------------------------*/
1606 * \brief Private ioctl get struct handler.
1608 * \param[in] pDev Net device requested.
1609 * \param[out] pIwReq Pointer to iwreq structure.
1610 * \param[in] cmd Private sub-command.
1612 * \retval 0 For success.
1613 * \retval -EFAULT If copy from user space buffer fail.
1614 * \retval -EOPNOTSUPP Parameter "cmd" not recognized.
1617 /*----------------------------------------------------------------------------*/
1620 IN struct net_device *prNetDev,
1621 IN struct iw_request_info *prIwReqInfo,
1622 IN union iwreq_data *prIwReqData,
1623 IN OUT char *pcExtra
1626 UINT_32 u4SubCmd = 0;
1627 P_NDIS_TRANSPORT_STRUCT prNdisReq= NULL;
1629 P_GLUE_INFO_T prGlueInfo = NULL;
1630 UINT_32 u4BufLen = 0;
1631 PUINT_32 pu4IntBuf = NULL;
1634 kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1637 ASSERT(prIwReqData);
1638 if (!prNetDev || !prIwReqData) {
1639 DBGLOG(REQ, INFO, ("priv_get_struct(): invalid param(0x%p, 0x%p)\n",
1640 prNetDev, prIwReqData));
1644 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1645 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1648 DBGLOG(REQ, INFO, ("priv_get_struct(): invalid prGlueInfo(0x%p, 0x%p)\n",
1649 prNetDev, *((P_GLUE_INFO_T *) netdev_priv(prNetDev))));
1654 printk(KERN_INFO DRV_NAME"priv_get_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1659 memset(aucOidBuf, 0, sizeof(aucOidBuf));
1663 if (copy_from_user(&aucOidBuf[0],
1664 prIwReqData->data.pointer,
1665 sizeof(NDIS_TRANSPORT_STRUCT))) {
1666 DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n"));
1670 prNdisReq = (P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0];
1672 printk(KERN_NOTICE "\n priv_get_struct cmd 0x%02x len:%d OID:0x%08x OID Len:%d\n",
1674 pIwReq->u.data.length,
1675 ndisReq->ndisOidCmd,
1676 ndisReq->inNdisOidlength);
1678 if (priv_get_ndis(prNetDev, prNdisReq, &u4BufLen) == 0) {
1679 prNdisReq->outNdisOidLength = u4BufLen;
1680 if (copy_to_user(prIwReqData->data.pointer,
1682 u4BufLen + sizeof(NDIS_TRANSPORT_STRUCT) - sizeof(prNdisReq->ndisOidContent))) {
1683 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(1)\n"));
1689 prNdisReq->outNdisOidLength = u4BufLen;
1690 if (copy_to_user(prIwReqData->data.pointer,
1692 OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1693 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(2)\n"));
1699 case PRIV_CMD_SW_CTRL:
1700 pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1701 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1703 if (copy_from_user(&prNdisReq->ndisOidContent[0],
1704 prIwReqData->data.pointer,
1705 prIwReqData->data.length)) {
1706 DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n"));
1710 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1711 prNdisReq->inNdisOidlength = 8;
1712 prNdisReq->outNdisOidLength = 8;
1714 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1716 prNdisReq->outNdisOidLength = u4BufLen;
1717 //printk("len=%d Result=%08lx\n", u4BufLen, *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1719 if (copy_to_user(prIwReqData->data.pointer,
1720 &prNdisReq->ndisOidContent[4],
1721 4 /* OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent)*/)) {
1722 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(2)\n"));
1728 DBGLOG(REQ, WARN, ("get struct cmd:0x%lx\n", u4SubCmd));
1731 } /* priv_get_struct */
1733 /*----------------------------------------------------------------------------*/
1735 * \brief The routine handles a set operation for a single OID.
1737 * \param[in] pDev Net device requested.
1738 * \param[in] ndisReq Ndis request OID information copy from user.
1739 * \param[out] outputLen_p If the call is successful, returns the number of
1740 * bytes written into the query buffer. If the
1741 * call failed due to invalid length of the query
1742 * buffer, returns the amount of storage needed..
1744 * \retval 0 On success.
1745 * \retval -EOPNOTSUPP If cmd is not supported.
1748 /*----------------------------------------------------------------------------*/
1751 IN struct net_device *prNetDev,
1752 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1753 OUT PUINT_32 pu4OutputLen
1756 P_WLAN_REQ_ENTRY prWlanReqEntry = NULL;
1757 WLAN_STATUS status = WLAN_STATUS_SUCCESS;
1758 P_GLUE_INFO_T prGlueInfo = NULL;
1759 UINT_32 u4SetInfoLen = 0;
1763 ASSERT(pu4OutputLen);
1765 if (!prNetDev || !prNdisReq || !pu4OutputLen) {
1766 DBGLOG(REQ, INFO, ("priv_set_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
1767 prNetDev, prNdisReq, pu4OutputLen));
1771 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1774 DBGLOG(REQ, INFO, ("priv_set_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1775 prNetDev, *((P_GLUE_INFO_T *) netdev_priv(prNetDev))));
1780 printk(KERN_INFO DRV_NAME"priv_set_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1781 prNdisReq->ndisOidCmd
1785 if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1787 //WARNLOG(("Set OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1791 if (NULL == prWlanReqEntry->pfOidSetHandler) {
1792 //WARNLOG(("Set %s: Null set handler\n", prWlanReqEntry->pucOidName));
1797 printk(KERN_INFO DRV_NAME"priv_set_ndis(): %s\n",
1798 prWlanReqEntry->pucOidName
1802 if (prWlanReqEntry->fgSetBufLenChecking) {
1803 if (prNdisReq->inNdisOidlength != prWlanReqEntry->u4InfoBufLen) {
1804 DBGLOG(REQ, WARN, ("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1805 prWlanReqEntry->pucOidName,
1806 prNdisReq->inNdisOidlength,
1807 prWlanReqEntry->u4InfoBufLen));
1809 *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1814 if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1815 /* GLUE sw info only */
1816 status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1817 prNdisReq->ndisOidContent,
1818 prNdisReq->inNdisOidlength,
1821 else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1822 /* multiple sw operations */
1823 status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1824 prNdisReq->ndisOidContent,
1825 prNdisReq->inNdisOidlength,
1828 else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1831 status = kalIoctl(prGlueInfo,
1832 (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidSetHandler,
1833 prNdisReq->ndisOidContent,
1834 prNdisReq->inNdisOidlength,
1842 DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1843 prWlanReqEntry->eOidMethod));
1847 *pu4OutputLen = u4SetInfoLen;
1850 case WLAN_STATUS_SUCCESS:
1853 case WLAN_STATUS_INVALID_LENGTH:
1854 //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1855 // prWlanReqEntry->pucOidName,
1856 //prNdisReq->inNdisOidlength,
1861 if (WLAN_STATUS_SUCCESS != status) {
1866 } /* priv_set_ndis */
1868 /*----------------------------------------------------------------------------*/
1870 * \brief The routine handles a query operation for a single OID. Basically we
1871 * return information about the current state of the OID in question.
1873 * \param[in] pDev Net device requested.
1874 * \param[in] ndisReq Ndis request OID information copy from user.
1875 * \param[out] outputLen_p If the call is successful, returns the number of
1876 * bytes written into the query buffer. If the
1877 * call failed due to invalid length of the query
1878 * buffer, returns the amount of storage needed..
1880 * \retval 0 On success.
1881 * \retval -EOPNOTSUPP If cmd is not supported.
1882 * \retval -EINVAL invalid input parameters
1885 /*----------------------------------------------------------------------------*/
1888 IN struct net_device *prNetDev,
1889 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1890 OUT PUINT_32 pu4OutputLen
1893 P_WLAN_REQ_ENTRY prWlanReqEntry = NULL;
1894 UINT_32 u4BufLen = 0;
1895 WLAN_STATUS status = WLAN_STATUS_SUCCESS;
1896 P_GLUE_INFO_T prGlueInfo = NULL;
1900 ASSERT(pu4OutputLen);
1902 if (!prNetDev || !prNdisReq || !pu4OutputLen) {
1903 DBGLOG(REQ, INFO, ("priv_get_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
1904 prNetDev, prNdisReq, pu4OutputLen));
1908 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1911 DBGLOG(REQ, INFO, ("priv_get_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1912 prNetDev, *((P_GLUE_INFO_T *) netdev_priv(prNetDev))));
1917 printk(KERN_INFO DRV_NAME"priv_get_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1918 prNdisReq->ndisOidCmd
1922 if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1924 //WARNLOG(("Query OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1929 if (NULL == prWlanReqEntry->pfOidQueryHandler) {
1930 //WARNLOG(("Query %s: Null query handler\n", prWlanReqEntry->pucOidName));
1935 printk(KERN_INFO DRV_NAME"priv_get_ndis(): %s\n",
1936 prWlanReqEntry->pucOidName
1940 if (prWlanReqEntry->fgQryBufLenChecking) {
1941 if (prNdisReq->inNdisOidlength < prWlanReqEntry->u4InfoBufLen) {
1942 /* Not enough room in InformationBuffer. Punt */
1943 //WARNLOG(("Query %s: Buffer too short (current=%ld, needed=%ld)\n",
1944 //prWlanReqEntry->pucOidName,
1945 //prNdisReq->inNdisOidlength,
1946 //prWlanReqEntry->u4InfoBufLen));
1948 *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1950 status = WLAN_STATUS_INVALID_LENGTH;
1956 if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1957 /* GLUE sw info only */
1958 status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1959 prNdisReq->ndisOidContent,
1960 prNdisReq->inNdisOidlength,
1963 else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1964 /* multiple sw operations */
1965 status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1966 prNdisReq->ndisOidContent,
1967 prNdisReq->inNdisOidlength,
1970 else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1973 status = kalIoctl(prGlueInfo,
1974 (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidQueryHandler,
1975 prNdisReq->ndisOidContent,
1976 prNdisReq->inNdisOidlength,
1984 DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1985 prWlanReqEntry->eOidMethod));
1989 *pu4OutputLen = u4BufLen;
1992 case WLAN_STATUS_SUCCESS:
1995 case WLAN_STATUS_INVALID_LENGTH:
1996 //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1997 // prWlanReqEntry->pucOidName,
1998 //prNdisReq->inNdisOidlength,
2003 if (WLAN_STATUS_SUCCESS != status) {
2008 } /* priv_get_ndis */
2010 /*----------------------------------------------------------------------------*/
2012 * \brief This routine is called to search desired OID.
2014 * \param rOid[in] Desired NDIS_OID
2015 * \param ppWlanReqEntry[out] Found registered OID entry
2017 * \retval TRUE: Matched OID is found
2018 * \retval FALSE: No matched OID is found
2020 /*----------------------------------------------------------------------------*/
2022 reqSearchSupportedOidEntry (
2024 OUT P_WLAN_REQ_ENTRY *ppWlanReqEntry
2030 j = NUM_SUPPORTED_OIDS - 1;
2035 if (rOid == arWlanOidReqTable[k].rOid) {
2036 *ppWlanReqEntry = &arWlanOidReqTable[k];
2038 } else if (rOid < arWlanOidReqTable[k].rOid) {
2046 } /* reqSearchSupportedOidEntry */
2049 /*----------------------------------------------------------------------------*/
2051 * \brief This routine is called to query the radio configuration used in IBSS
2052 * mode and RF test mode.
2054 * \param[in] prGlueInfo Pointer to the GLUE_INFO_T structure.
2055 * \param[out] pvQueryBuffer Pointer to the buffer that holds the result of the query.
2056 * \param[in] u4QueryBufferLen The length of the query buffer.
2057 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
2058 * bytes written into the query buffer. If the call
2059 * failed due to invalid length of the query buffer,
2060 * returns the amount of storage needed.
2062 * \retval WLAN_STATUS_SUCCESS
2063 * \retval WLAN_STATUS_INVALID_LENGTH
2065 /*----------------------------------------------------------------------------*/
2067 reqExtQueryConfiguration (
2068 IN P_GLUE_INFO_T prGlueInfo,
2069 OUT PVOID pvQueryBuffer,
2070 IN UINT_32 u4QueryBufferLen,
2071 OUT PUINT_32 pu4QueryInfoLen
2074 P_PARAM_802_11_CONFIG_T prQueryConfig = (P_PARAM_802_11_CONFIG_T)pvQueryBuffer;
2075 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2076 UINT_32 u4QueryInfoLen = 0;
2078 DEBUGFUNC("wlanoidQueryConfiguration");
2082 ASSERT(pu4QueryInfoLen);
2084 *pu4QueryInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2085 if (u4QueryBufferLen < sizeof(PARAM_802_11_CONFIG_T)) {
2086 return WLAN_STATUS_INVALID_LENGTH;
2089 ASSERT(pvQueryBuffer);
2091 kalMemZero(prQueryConfig, sizeof(PARAM_802_11_CONFIG_T));
2093 /* Update the current radio configuration. */
2094 prQueryConfig->u4Length = sizeof(PARAM_802_11_CONFIG_T);
2096 #if defined(_HIF_SDIO)
2097 rStatus = sdio_io_ctrl(prGlueInfo,
2098 wlanoidSetBeaconInterval,
2099 &prQueryConfig->u4BeaconPeriod,
2105 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2106 wlanoidQueryBeaconInterval,
2107 &prQueryConfig->u4BeaconPeriod,
2111 if (rStatus != WLAN_STATUS_SUCCESS) {
2115 #if defined(_HIF_SDIO)
2116 rStatus = sdio_io_ctrl(prGlueInfo,
2117 wlanoidQueryAtimWindow,
2118 &prQueryConfig->u4ATIMWindow,
2124 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2125 wlanoidQueryAtimWindow,
2126 &prQueryConfig->u4ATIMWindow,
2130 if (rStatus != WLAN_STATUS_SUCCESS) {
2134 #if defined(_HIF_SDIO)
2135 rStatus = sdio_io_ctrl(prGlueInfo,
2136 wlanoidQueryFrequency,
2137 &prQueryConfig->u4DSConfig,
2143 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2144 wlanoidQueryFrequency,
2145 &prQueryConfig->u4DSConfig,
2149 if (rStatus != WLAN_STATUS_SUCCESS) {
2153 prQueryConfig->rFHConfig.u4Length = sizeof(PARAM_802_11_CONFIG_FH_T);
2157 } /* end of reqExtQueryConfiguration() */
2160 /*----------------------------------------------------------------------------*/
2162 * \brief This routine is called to set the radio configuration used in IBSS
2165 * \param[in] prGlueInfo Pointer to the GLUE_INFO_T structure.
2166 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2167 * \param[in] u4SetBufferLen The length of the set buffer.
2168 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2169 * bytes read from the set buffer. If the call failed
2170 * due to invalid length of the set buffer, returns
2171 * the amount of storage needed.
2173 * \retval WLAN_STATUS_SUCCESS
2174 * \retval WLAN_STATUS_INVALID_LENGTH
2175 * \retval WLAN_STATUS_NOT_ACCEPTED
2177 /*----------------------------------------------------------------------------*/
2179 reqExtSetConfiguration (
2180 IN P_GLUE_INFO_T prGlueInfo,
2181 IN PVOID pvSetBuffer,
2182 IN UINT_32 u4SetBufferLen,
2183 OUT PUINT_32 pu4SetInfoLen
2186 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2187 P_PARAM_802_11_CONFIG_T prNewConfig = (P_PARAM_802_11_CONFIG_T)pvSetBuffer;
2188 UINT_32 u4SetInfoLen = 0;
2190 DEBUGFUNC("wlanoidSetConfiguration");
2194 ASSERT(pu4SetInfoLen);
2196 *pu4SetInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2198 if (u4SetBufferLen < *pu4SetInfoLen) {
2199 return WLAN_STATUS_INVALID_LENGTH;
2202 /* OID_802_11_CONFIGURATION. If associated, NOT_ACCEPTED shall be returned. */
2203 if (prGlueInfo->eParamMediaStateIndicated == PARAM_MEDIA_STATE_CONNECTED) {
2204 return WLAN_STATUS_NOT_ACCEPTED;
2207 ASSERT(pvSetBuffer);
2209 #if defined(_HIF_SDIO)
2210 rStatus = sdio_io_ctrl(prGlueInfo,
2211 wlanoidSetBeaconInterval,
2212 &prNewConfig->u4BeaconPeriod,
2218 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2219 wlanoidSetBeaconInterval,
2220 &prNewConfig->u4BeaconPeriod,
2224 if (rStatus != WLAN_STATUS_SUCCESS) {
2228 #if defined(_HIF_SDIO)
2229 rStatus = sdio_io_ctrl(prGlueInfo,
2230 wlanoidSetAtimWindow,
2231 &prNewConfig->u4ATIMWindow,
2237 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2238 wlanoidSetAtimWindow,
2239 &prNewConfig->u4ATIMWindow,
2243 if (rStatus != WLAN_STATUS_SUCCESS) {
2247 #if defined(_HIF_SDIO)
2248 rStatus = sdio_io_ctrl(prGlueInfo,
2249 wlanoidSetFrequency,
2250 &prNewConfig->u4DSConfig,
2256 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2257 wlanoidSetFrequency,
2258 &prNewConfig->u4DSConfig,
2263 if (rStatus != WLAN_STATUS_SUCCESS) {
2269 } /* end of reqExtSetConfiguration() */
2272 /*----------------------------------------------------------------------------*/
2274 * \brief This routine is called to set beacon detection function enable/disable state
2275 * This is mainly designed for usage under BT inquiry state (disable function).
2277 * \param[in] pvAdapter Pointer to the Adapter structure
2278 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
2279 * \param[in] u4SetBufferLen The length of the set buffer
2280 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2281 * bytes read from the set buffer. If the call failed due to invalid length of
2282 * the set buffer, returns the amount of storage needed.
2284 * \retval WLAN_STATUS_SUCCESS
2285 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
2286 * \retval WLAN_STATUS_INVALID_LENGTH
2289 /*----------------------------------------------------------------------------*/
2291 reqExtSetAcpiDevicePowerState (
2292 IN P_GLUE_INFO_T prGlueInfo,
2293 IN PVOID pvSetBuffer,
2294 IN UINT_32 u4SetBufferLen,
2295 OUT PUINT_32 pu4SetInfoLen
2298 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2301 ASSERT(pvSetBuffer);
2302 ASSERT(pu4SetInfoLen);
2304 /* WIFI is enabled, when ACPI is D0 (ParamDeviceStateD0 = 1). And vice versa */
2306 //rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2307 // wlanoidSetAcpiDevicePowerState,