2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/os/linux/gl_wext_priv.c#4 $
5 /*! \file gl_wext_priv.c
6 \brief This file includes private ioctl support.
12 ** $Log: gl_wext_priv.c $
14 * 07 17 2012 yuche.tsai
16 * Let netdev bring up.
18 * 06 13 2012 yuche.tsai
20 * Update maintrunk driver.
21 * Add support for driver compose assoc request frame.
24 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function[WCXRP00001202] [MT6628 Wi-Fi][FW] Adding the New PN init code
25 * use return to avoid the ioctl return not supported
29 * Snc CFG80211 modification for ICS migration from branch 2.2.
32 * [WCXRP00001170] [MT6620 Wi-Fi][Driver] Adding the related code for set/get band ioctl
33 * Adding the template code for set / get band IOCTL (with ICS supplicant_6)..
36 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
37 * Adding the related ioctl / wlan oid function to set the Tx power cfg.
40 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
41 * Adding the proto type function for set_int set_tx_power and get int get_ch_list.
44 * [WCXRP00001098] [MT6620 Wi-Fi][Driver] Replace printk by DBG LOG macros in linux porting layer
45 * 1. eliminaite direct calls to printk in porting layer.
46 * 2. replaced by DBGLOG, which would be XLOG on ALPS platforms.
48 * 11 02 2011 chinghwa.yu
49 * [WCXRP00000063] Update BCM CoEx design and settings
52 * 09 20 2011 chinglan.wang
53 * [WCXRP00000989] [WiFi Direct] [Driver] Add a new io control API to start the formation for the sigma test.
56 * 07 28 2011 chinghwa.yu
57 * [WCXRP00000063] Update BCM CoEx design and settings
58 * Add BWCS cmd and event.
60 * 07 18 2011 chinghwa.yu
61 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
62 * Add CMD/Event for RDD and BWCS.
64 * 03 17 2011 chinglan.wang
65 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
69 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
70 * Toggle non-standard debug messages to comments.
73 * [WCXRP00000402] [MT6620 Wi-Fi][Driver] Enable MCR read/write by iwpriv by default
77 * [WCXRP00000396] [MT6620 Wi-Fi][Driver] Support Sw Ctrl ioctl at linux
78 * adding the SW cmd ioctl support, use set/get structure ioctl.
80 * 01 20 2011 eddie.chen
81 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
84 * 01 20 2011 eddie.chen
85 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
86 * Add Oid for sw control debug command
89 * [WCXRP00000336] [MT6620 Wi-Fi][Driver] Add test mode commands in normal phone operation
90 * Add a new compiling option to control if MCR read/write is permitted
93 * [WCXRP00000336] [MT6620 Wi-Fi][Driver] Add test mode commands in normal phone operation
94 * Add some iwpriv commands to support test mode operation
96 * 12 15 2010 george.huang
97 * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
98 * Support set PS profile and set WMM-PS related iwpriv.
101 * [WCXRP00000171] [MT6620 Wi-Fi][Driver] Add message check code same behavior as mt5921
102 * add the message check code from mt5921.
105 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android
106 * complete implementation of Android NVRAM access
109 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
110 * correct typo for NVRAM access.
113 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
114 * add skeleton for NVRAM integration
118 * revert changelist #15371, efuse read/write access will be done by RF test approach
122 * add OID definitions for EFUSE read/write access.
126 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
128 * 06 06 2010 kevin.huang
129 * [WPD00003832][MT6620 5931] Create driver base
130 * [MT6620 5931] Create driver base
133 * [WPD00001943]Create WiFi test driver framework on WinXP
134 * enable OID_CUSTOM_MTK_WIFI_TEST for RFTest & META tool
136 * 05 29 2010 jeffrey.chang
137 * [WPD00003826]Initial import for Linux port
138 * fix private ioctl for rftest
140 * 04 21 2010 jeffrey.chang
141 * [WPD00003826]Initial import for Linux port
142 * add for private ioctl support
143 ** \main\maintrunk.MT5921\32 2009-10-08 10:33:25 GMT mtk01090
144 ** Avoid accessing private data of net_device directly. Replace with netdev_priv(). Add more checking for input parameters and pointers.
145 ** \main\maintrunk.MT5921\31 2009-09-29 16:46:21 GMT mtk01090
146 ** Remove unused functions
147 ** \main\maintrunk.MT5921\30 2009-09-29 14:46:47 GMT mtk01090
148 ** Fix compile warning
149 ** \main\maintrunk.MT5921\29 2009-09-29 14:28:48 GMT mtk01090
150 ** Fix compile warning
151 ** \main\maintrunk.MT5921\28 2009-09-28 22:21:38 GMT mtk01090
152 ** Refine lines to supress compile warning
153 ** \main\maintrunk.MT5921\27 2009-09-28 20:19:14 GMT mtk01090
154 ** Add private ioctl to carry OID structures. Restructure public/private ioctl interfaces to Linux kernel.
155 ** \main\maintrunk.MT5921\26 2009-08-18 22:56:53 GMT mtk01090
156 ** Add Linux SDIO (with mmc core) support.
157 ** Add Linux 2.6.21, 2.6.25, 2.6.26.
158 ** Fix compile warning in Linux.
159 ** \main\maintrunk.MT5921\25 2009-05-07 22:26:15 GMT mtk01089
160 ** Add mandatory and private IO control for Linux BWCS
161 ** \main\maintrunk.MT5921\24 2009-04-29 10:07:05 GMT mtk01088
162 ** fixed the compiling error at linux
163 ** \main\maintrunk.MT5921\23 2009-04-24 09:09:45 GMT mtk01088
164 ** mark the code not used at linux supplicant v0.6.7
165 ** \main\maintrunk.MT5921\22 2008-11-24 21:03:51 GMT mtk01425
166 ** 1. Add PTA_ENABLED flag
167 ** \main\maintrunk.MT5921\21 2008-08-29 14:55:59 GMT mtk01088
168 ** adjust the code for meet the coding style, and add assert check
169 ** \main\maintrunk.MT5921\20 2008-07-16 15:23:20 GMT mtk01104
170 ** Support GPIO2 mode
171 ** \main\maintrunk.MT5921\19 2008-07-15 17:43:11 GMT mtk01084
172 ** modify variable name
173 ** \main\maintrunk.MT5921\18 2008-07-14 14:37:58 GMT mtk01104
174 ** Add exception handle about length in function priv_set_struct()
175 ** \main\maintrunk.MT5921\17 2008-07-14 13:55:32 GMT mtk01104
176 ** Support PRIV_CMD_BT_COEXIST
177 ** \main\maintrunk.MT5921\16 2008-07-09 00:20:15 GMT mtk01461
178 ** Add priv oid to support WMM_PS_TEST
179 ** \main\maintrunk.MT5921\15 2008-06-02 11:15:22 GMT mtk01461
180 ** Update after wlanoidSetPowerMode changed
181 ** \main\maintrunk.MT5921\14 2008-05-30 19:31:07 GMT mtk01461
182 ** Add IOCTL for Power Mode
183 ** \main\maintrunk.MT5921\13 2008-05-30 18:57:15 GMT mtk01461
184 ** Not use wlanoidSetCSUMOffloadForLinux()
185 ** \main\maintrunk.MT5921\12 2008-05-30 15:13:18 GMT mtk01084
187 ** \main\maintrunk.MT5921\11 2008-05-29 14:16:31 GMT mtk01084
188 ** rename for wlanoidSetBeaconIntervalForLinux
189 ** \main\maintrunk.MT5921\10 2008-04-17 23:06:37 GMT mtk01461
190 ** Add iwpriv support for AdHocMode setting
191 ** \main\maintrunk.MT5921\9 2008-03-31 21:00:55 GMT mtk01461
192 ** Add priv IOCTL for VOIP setting
193 ** \main\maintrunk.MT5921\8 2008-03-31 13:49:43 GMT mtk01461
194 ** Add priv ioctl to turn on / off roaming
195 ** \main\maintrunk.MT5921\7 2008-03-26 15:35:14 GMT mtk01461
196 ** Add CSUM offload priv ioctl for Linux
197 ** \main\maintrunk.MT5921\6 2008-03-11 14:50:59 GMT mtk01461
199 ** \main\maintrunk.MT5921\5 2007-11-06 19:32:30 GMT mtk01088
201 ** \main\maintrunk.MT5921\4 2007-10-30 12:01:39 GMT MTK01425
202 ** 1. Update wlanQueryInformation and wlanSetInformation
205 /*******************************************************************************
206 * C O M P I L E R F L A G S
207 ********************************************************************************
210 /*******************************************************************************
211 * E X T E R N A L R E F E R E N C E S
212 ********************************************************************************
215 #include "gl_wext_priv.h"
219 #if CFG_ENABLE_WIFI_DIRECT
220 #include "gl_p2p_os.h"
223 /*******************************************************************************
225 ********************************************************************************
227 #define NUM_SUPPORTED_OIDS (sizeof(arWlanOidReqTable) / sizeof(WLAN_REQ_ENTRY))
229 /*******************************************************************************
230 * F U N C T I O N D E C L A R A T I O N S
231 ********************************************************************************
236 IN struct net_device *prNetDev,
237 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
238 OUT PUINT_32 pu4OutputLen
243 IN struct net_device *prNetDev,
244 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
245 OUT PUINT_32 pu4OutputLen
248 #if 0 /* CFG_SUPPORT_WPS */
251 IN struct net_device *prNetDev,
252 IN struct iw_request_info *prIwReqInfo,
253 IN union iwreq_data *prIwReqData,
259 IN struct net_device *prNetDev,
260 IN struct iw_request_info *prIwReqInfo,
261 IN union iwreq_data *prIwReqData,
264 #endif /* CFG_SUPPORT_WPS */
267 reqSearchSupportedOidEntry (
269 OUT P_WLAN_REQ_ENTRY *ppWlanReqEntry
274 reqExtQueryConfiguration (
275 IN P_GLUE_INFO_T prGlueInfo,
276 OUT PVOID pvQueryBuffer,
277 IN UINT_32 u4QueryBufferLen,
278 OUT PUINT_32 pu4QueryInfoLen
282 reqExtSetConfiguration (
283 IN P_GLUE_INFO_T prGlueInfo,
284 IN PVOID pvSetBuffer,
285 IN UINT_32 u4SetBufferLen,
286 OUT PUINT_32 pu4SetInfoLen
291 reqExtSetAcpiDevicePowerState (
292 IN P_GLUE_INFO_T prGlueInfo,
293 IN PVOID pvSetBuffer,
294 IN UINT_32 u4SetBufferLen,
295 OUT PUINT_32 pu4SetInfoLen
298 /*******************************************************************************
299 * P R I V A T E D A T A
300 ********************************************************************************
302 static UINT_8 aucOidBuf[4096] = {0};
304 /* OID processing table */
305 /* Order is important here because the OIDs should be in order of
306 increasing value for binary searching. */
307 static WLAN_REQ_ENTRY arWlanOidReqTable[] = {
311 fgQryBufLenChecking, fgSetBufLenChecking, fgIsHandleInGlueLayerOnly, u4InfoBufLen,
315 /* General Operational Characteristics */
317 /* Ethernet Operational Characteristics */
318 {OID_802_3_CURRENT_ADDRESS,
319 DISP_STRING("OID_802_3_CURRENT_ADDRESS"),
320 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 6,
321 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCurrentAddr,
324 /* OID_802_3_MULTICAST_LIST */
325 /* OID_802_3_MAXIMUM_LIST_SIZE */
326 /* Ethernet Statistics */
328 /* NDIS 802.11 Wireless LAN OIDs */
329 {OID_802_11_SUPPORTED_RATES,
330 DISP_STRING("OID_802_11_SUPPORTED_RATES"),
331 TRUE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_RATES_EX),
332 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySupportedRates,
335 {OID_802_11_CONFIGURATION,
336 DISP_STRING("OID_802_11_CONFIGURATION"),
337 TRUE, TRUE, ENUM_OID_GLUE_EXTENSION, sizeof(PARAM_802_11_CONFIG_T),
338 (PFN_OID_HANDLER_FUNC_REQ)reqExtQueryConfiguration,
339 (PFN_OID_HANDLER_FUNC_REQ)reqExtSetConfiguration},
342 DISP_STRING("OID_PNP_SET_POWER"),
343 TRUE, FALSE, ENUM_OID_GLUE_EXTENSION, sizeof(PARAM_DEVICE_POWER_STATE),
345 (PFN_OID_HANDLER_FUNC_REQ)reqExtSetAcpiDevicePowerState},
348 {OID_CUSTOM_OID_INTERFACE_VERSION,
349 DISP_STRING("OID_CUSTOM_OID_INTERFACE_VERSION"),
350 TRUE, FALSE, ENUM_OID_DRIVER_CORE, 4,
351 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryOidInterfaceVersion,
356 {OID_CUSTOM_BT_COEXIST_CTRL,
357 DISP_STRING("OID_CUSTOM_BT_COEXIST_CTRL"),
358 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_BT_COEXIST_T),
360 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtCoexistCtrl},
365 {OID_CUSTOM_POWER_MANAGEMENT_PROFILE,
366 DISP_STRING("OID_CUSTOM_POWER_MANAGEMENT_PROFILE"),
367 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
368 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPwrMgmtProfParam,
369 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPwrMgmtProfParam},
370 {OID_CUSTOM_PATTERN_CONFIG,
371 DISP_STRING("OID_CUSTOM_PATTERN_CONFIG"),
372 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_PATTERN_SEARCH_CONFIG_STRUC_T),
374 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPatternConfig},
375 {OID_CUSTOM_BG_SSID_SEARCH_CONFIG,
376 DISP_STRING("OID_CUSTOM_BG_SSID_SEARCH_CONFIG"),
377 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
379 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBgSsidParam},
380 {OID_CUSTOM_VOIP_SETUP,
381 DISP_STRING("OID_CUSTOM_VOIP_SETUP"),
382 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
383 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryVoipConnectionStatus,
384 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetVoipConnectionStatus},
386 DISP_STRING("OID_CUSTOM_ADD_TS"),
387 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
389 (PFN_OID_HANDLER_FUNC_REQ)wlanoidAddTS},
391 DISP_STRING("OID_CUSTOM_DEL_TS"),
392 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
394 (PFN_OID_HANDLER_FUNC_REQ)wlanoidDelTS},
398 #if CFG_LP_PATTERN_SEARCH_SLT
400 DISP_STRING("OID_CUSTOM_SLT"),
401 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
402 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySltResult,
403 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSltMode},
406 {OID_CUSTOM_ROAMING_EN,
407 DISP_STRING("OID_CUSTOM_ROAMING_EN"),
408 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
409 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRoamingFunction,
410 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetRoamingFunction},
411 {OID_CUSTOM_WMM_PS_TEST,
412 DISP_STRING("OID_CUSTOM_WMM_PS_TEST"),
413 TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
415 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWiFiWmmPsTest},
416 {OID_CUSTOM_COUNTRY_STRING,
417 DISP_STRING("OID_CUSTOM_COUNTRY_STRING"),
418 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
419 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCurrentCountry,
420 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetCurrentCountry},
422 #if CFG_SUPPORT_802_11D
423 {OID_CUSTOM_MULTI_DOMAIN_CAPABILITY,
424 DISP_STRING("OID_CUSTOM_MULTI_DOMAIN_CAPABILITY"),
425 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
426 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMultiDomainCap,
427 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMultiDomainCap},
430 {OID_CUSTOM_GPIO2_MODE,
431 DISP_STRING("OID_CUSTOM_GPIO2_MODE"),
432 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_PARAM_GPIO2_MODE_T),
434 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetGPIO2Mode},
435 {OID_CUSTOM_CONTINUOUS_POLL,
436 DISP_STRING("OID_CUSTOM_CONTINUOUS_POLL"),
437 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CONTINUOUS_POLL_T),
438 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryContinuousPollInterval,
439 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetContinuousPollProfile},
440 {OID_CUSTOM_DISABLE_BEACON_DETECTION,
441 DISP_STRING("OID_CUSTOM_DISABLE_BEACON_DETECTION"),
442 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
443 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryDisableBeaconDetectionFunc,
444 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisableBeaconDetectionFunc},
449 {OID_CUSTOM_DISABLE_PRIVACY_CHECK,
450 DISP_STRING("OID_CUSTOM_DISABLE_PRIVACY_CHECK"),
451 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
453 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisablePriavcyCheck},
457 DISP_STRING("OID_CUSTOM_MCR_RW"),
458 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T),
459 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMcrRead,
460 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMcrWrite},
462 {OID_CUSTOM_EEPROM_RW,
463 DISP_STRING("OID_CUSTOM_EEPROM_RW"),
464 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T),
465 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryEepromRead,
466 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetEepromWrite},
469 DISP_STRING("OID_CUSTOM_SW_CTRL"),
470 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T),
471 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySwCtrlRead,
472 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSwCtrlWrite},
474 {OID_CUSTOM_MEM_DUMP,
475 DISP_STRING("OID_CUSTOM_MEM_DUMP"),
476 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_MEM_DUMP_STRUC_T),
477 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMemDump,
480 {OID_CUSTOM_TEST_MODE,
481 DISP_STRING("OID_CUSTOM_TEST_MODE"),
482 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
484 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetTestMode},
487 {OID_CUSTOM_TEST_RX_STATUS,
488 DISP_STRING("OID_CUSTOM_TEST_RX_STATUS"),
489 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_RFTEST_RX_STATUS_STRUC_T),
490 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestRxStatus,
492 {OID_CUSTOM_TEST_TX_STATUS,
493 DISP_STRING("OID_CUSTOM_TEST_TX_STATUS"),
494 FALSE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_RFTEST_TX_STATUS_STRUC_T),
495 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestTxStatus,
498 {OID_CUSTOM_ABORT_TEST_MODE,
499 DISP_STRING("OID_CUSTOM_ABORT_TEST_MODE"),
500 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
502 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetAbortTestMode},
503 {OID_CUSTOM_MTK_WIFI_TEST,
504 DISP_STRING("OID_CUSTOM_MTK_WIFI_TEST"),
505 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_MTK_WIFI_TEST_STRUC_T),
506 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestQueryAutoTest,
507 (PFN_OID_HANDLER_FUNC_REQ)wlanoidRftestSetAutoTest},
509 /* OID_CUSTOM_EMULATION_VERSION_CONTROL */
512 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
513 {OID_CUSTOM_BWCS_CMD,
514 DISP_STRING("OID_CUSTOM_BWCS_CMD"),
515 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PTA_IPC_T),
516 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryBT,
517 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBT},
520 /* {OID_CUSTOM_SINGLE_ANTENNA,
521 DISP_STRING("OID_CUSTOM_SINGLE_ANTENNA"),
522 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
523 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryBtSingleAntenna,
524 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtSingleAntenna},
526 DISP_STRING("OID_CUSTOM_SET_PTA"),
527 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
528 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPta,
529 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPta},
532 { OID_CUSTOM_MTK_NVRAM_RW,
533 DISP_STRING("OID_CUSTOM_MTK_NVRAM_RW"),
534 TRUE, TRUE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T),
535 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryNvramRead,
536 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetNvramWrite },
538 { OID_CUSTOM_CFG_SRC_TYPE,
539 DISP_STRING("OID_CUSTOM_CFG_SRC_TYPE"),
540 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_CFG_SRC_TYPE_T),
541 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCfgSrcType,
544 { OID_CUSTOM_EEPROM_TYPE,
545 DISP_STRING("OID_CUSTOM_EEPROM_TYPE"),
546 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(ENUM_EEPROM_TYPE_T),
547 (PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryEepromType,
551 {OID_802_11_WAPI_MODE,
552 DISP_STRING("OID_802_11_WAPI_MODE"),
553 FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
555 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiMode},
556 {OID_802_11_WAPI_ASSOC_INFO,
557 DISP_STRING("OID_802_11_WAPI_ASSOC_INFO"),
558 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
560 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiAssocInfo},
561 {OID_802_11_SET_WAPI_KEY,
562 DISP_STRING("OID_802_11_SET_WAPI_KEY"),
563 FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(PARAM_WPI_KEY_T),
565 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWapiKey},
569 {OID_802_11_WSC_ASSOC_INFO,
570 DISP_STRING("OID_802_11_WSC_ASSOC_INFO"),
571 FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
573 (PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWSCAssocInfo},
577 /*******************************************************************************
579 ********************************************************************************
582 /*----------------------------------------------------------------------------*/
584 * \brief Dispatching function for private ioctl region (SIOCIWFIRSTPRIV ~
587 * \param[in] prNetDev Net device requested.
588 * \param[in] prIfReq Pointer to ifreq structure.
589 * \param[in] i4Cmd Command ID between SIOCIWFIRSTPRIV and SIOCIWLASTPRIV.
591 * \retval 0 for success.
592 * \retval -EOPNOTSUPP If cmd is not supported.
593 * \retval -EFAULT For fail.
596 /*----------------------------------------------------------------------------*/
599 IN struct net_device *prNetDev,
600 IN OUT struct ifreq *prIfReq,
604 /* prIfReq is verified in the caller function wlanDoIOCTL() */
605 struct iwreq *prIwReq = (struct iwreq *)prIfReq;
606 struct iw_request_info rIwReqInfo;
608 /* prDev is verified in the caller function wlanDoIOCTL() */
610 /* Prepare the call */
611 rIwReqInfo.cmd = (__u16)i4Cmd;
612 rIwReqInfo.flags = 0;
616 /* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need copy_from/to_user() */
617 return priv_set_int(prNetDev, &rIwReqInfo, &(prIwReq->u), (char *) &(prIwReq->u));
620 /* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need copy_from/to_user() */
621 return priv_get_int(prNetDev, &rIwReqInfo, &(prIwReq->u), (char *) &(prIwReq->u));
623 case IOCTL_SET_STRUCT:
624 case IOCTL_SET_STRUCT_FOR_EM:
625 return priv_set_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
627 case IOCTL_GET_STRUCT:
628 return priv_get_struct(prNetDev, &rIwReqInfo, &prIwReq->u, (char *) &(prIwReq->u));
633 } /* end of switch */
635 }/* priv_support_ioctl */
638 /*----------------------------------------------------------------------------*/
640 * \brief Private ioctl set int handler.
642 * \param[in] prNetDev Net device requested.
643 * \param[in] prIwReqInfo Pointer to iwreq structure.
644 * \param[in] prIwReqData The ioctl data structure, use the field of sub-command.
645 * \param[in] pcExtra The buffer with input value
647 * \retval 0 For success.
648 * \retval -EOPNOTSUPP If cmd is not supported.
649 * \retval -EINVAL If a value is out of range.
652 /*----------------------------------------------------------------------------*/
655 IN struct net_device *prNetDev,
656 IN struct iw_request_info *prIwReqInfo,
657 IN union iwreq_data *prIwReqData,
663 P_NDIS_TRANSPORT_STRUCT prNdisReq;
664 P_GLUE_INFO_T prGlueInfo;
665 UINT_32 u4BufLen = 0;
667 P_PTA_IPC_T prPtaIpc;
674 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
677 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
679 u4SubCmd = (UINT_32) prIwReqData->mode;
680 pu4IntBuf = (PUINT_32) pcExtra;
683 case PRIV_CMD_TEST_MODE:
684 //printk("TestMode=%ld\n", pu4IntBuf[1]);
685 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
687 if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY) {
688 prNdisReq->ndisOidCmd = OID_CUSTOM_TEST_MODE;
690 else if (pu4IntBuf[1] == 0) {
691 prNdisReq->ndisOidCmd = OID_CUSTOM_ABORT_TEST_MODE;
697 prNdisReq->inNdisOidlength = 0;
698 prNdisReq->outNdisOidLength = 0;
700 /* Execute this OID */
701 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
704 case PRIV_CMD_TEST_CMD:
705 //printk("CMD=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
706 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
708 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
710 prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
711 prNdisReq->inNdisOidlength = 8;
712 prNdisReq->outNdisOidLength = 8;
714 /* Execute this OID */
715 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
718 #if CFG_SUPPORT_PRIV_MCR_RW
719 case PRIV_CMD_ACCESS_MCR:
720 //printk("addr=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
721 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
723 if (!prGlueInfo->fgMcrAccessAllowed) {
724 if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY &&
725 pu4IntBuf[2] == PRIV_CMD_TEST_MAGIC_KEY) {
726 prGlueInfo->fgMcrAccessAllowed = TRUE;
732 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
734 prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
735 prNdisReq->inNdisOidlength = 8;
736 prNdisReq->outNdisOidLength = 8;
738 /* Execute this OID */
739 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
743 case PRIV_CMD_SW_CTRL:
744 //printk("addr=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
745 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
747 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
749 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
750 prNdisReq->inNdisOidlength = 8;
751 prNdisReq->outNdisOidLength = 8;
753 /* Execute this OID */
754 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
759 case PRIV_CMD_BEACON_PERIOD:
760 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
761 wlanoidSetBeaconInterval,
762 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
768 #if CFG_TCP_IP_CHKSUM_OFFLOAD
769 case PRIV_CMD_CSUM_OFFLOAD:
774 if (pu4IntBuf[1] == 1) {
775 u4CSUMFlags = CSUM_OFFLOAD_EN_ALL;
777 else if (pu4IntBuf[1] == 0) {
784 if (kalIoctl(prGlueInfo,
785 wlanoidSetCSUMOffload,
793 ) == WLAN_STATUS_SUCCESS) {
794 if (pu4IntBuf[1] == 1) {
795 prNetDev->features |= NETIF_F_HW_CSUM;
796 } else if (pu4IntBuf[1] == 0) {
797 prNetDev->features &= ~NETIF_F_HW_CSUM;
802 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
804 case PRIV_CMD_POWER_MODE:
806 wlanoidSet802dot11PowerSaveProfile,
807 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
816 case PRIV_CMD_WMM_PS:
818 PARAM_CUSTOM_WMM_PS_TEST_STRUC_T rWmmPsTest;
820 rWmmPsTest.bmfgApsdEnAc = (UINT_8)pu4IntBuf[1];
821 rWmmPsTest.ucIsEnterPsAtOnce = (UINT_8)pu4IntBuf[2];
822 rWmmPsTest.ucIsDisableUcTrigger = (UINT_8)pu4IntBuf[3];
823 rWmmPsTest.reserved = 0;
826 wlanoidSetWiFiWmmPsTest,
828 sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUC_T),
838 case PRIV_CMD_ADHOC_MODE:
839 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
841 (PVOID)&pu4IntBuf[1], /* pu4IntBuf[0] is used as input SubCmd */
847 case PRIV_CUSTOM_BWCS_CMD:
849 DBGLOG(REQ, INFO, ("pu4IntBuf[1] = %x, size of PTA_IPC_T = %d.\n", pu4IntBuf[1], sizeof(PARAM_PTA_IPC_T)));
851 prPtaIpc = (P_PTA_IPC_T) aucOidBuf;
852 prPtaIpc->u.aucBTPParams[0] = (UINT_8) (pu4IntBuf[1] >> 24);
853 prPtaIpc->u.aucBTPParams[1] = (UINT_8) (pu4IntBuf[1] >> 16);
854 prPtaIpc->u.aucBTPParams[2] = (UINT_8) (pu4IntBuf[1] >> 8);
855 prPtaIpc->u.aucBTPParams[3] = (UINT_8) (pu4IntBuf[1]);
857 DBGLOG(REQ, INFO, ("BCM BWCS CMD : PRIV_CUSTOM_BWCS_CMD : aucBTPParams[0] = %02x, aucBTPParams[1] = %02x, aucBTPParams[2] = %02x, aucBTPParams[3] = %02x.\n",
858 prPtaIpc->u.aucBTPParams[0],
859 prPtaIpc->u.aucBTPParams[1],
860 prPtaIpc->u.aucBTPParams[2],
861 prPtaIpc->u.aucBTPParams[3]));
864 status = wlanSetInformation(prGlueInfo->prAdapter,
866 (PVOID)&aucOidBuf[0],
871 status = wlanoidSetBT(prGlueInfo->prAdapter,
872 (PVOID)&aucOidBuf[0],
873 sizeof(PARAM_PTA_IPC_T),
876 if (WLAN_STATUS_SUCCESS != status) {
882 case PRIV_CMD_BAND_CONFIG:
884 DBGLOG(INIT, INFO, ("CMD set_band=%u\n", pu4IntBuf[1]));
888 #if CFG_ENABLE_WIFI_DIRECT
889 case PRIV_CMD_P2P_MODE:
891 PARAM_CUSTOM_P2P_SET_STRUC_T rSetP2P;
892 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
894 rSetP2P.u4Enable = pu4IntBuf[1];
895 rSetP2P.u4Mode = pu4IntBuf[2];
897 if(!rSetP2P.u4Enable) {
898 p2pNetUnregister(prGlueInfo, TRUE);
901 rWlanStatus = kalIoctl(prGlueInfo,
903 (PVOID)&rSetP2P, /* pu4IntBuf[0] is used as input SubCmd */
904 sizeof(PARAM_CUSTOM_P2P_SET_STRUC_T),
911 if(rSetP2P.u4Enable) {
912 p2pNetRegister(prGlueInfo, TRUE);
928 /*----------------------------------------------------------------------------*/
930 * \brief Private ioctl get int handler.
932 * \param[in] pDev Net device requested.
933 * \param[out] pIwReq Pointer to iwreq structure.
934 * \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
935 * \param[out] pcExtra The buffer with put the return value
937 * \retval 0 For success.
938 * \retval -EOPNOTSUPP If cmd is not supported.
939 * \retval -EFAULT For fail.
942 /*----------------------------------------------------------------------------*/
945 IN struct net_device *prNetDev,
946 IN struct iw_request_info *prIwReqInfo,
947 IN union iwreq_data *prIwReqData,
953 P_GLUE_INFO_T prGlueInfo;
954 UINT_32 u4BufLen = 0;
956 P_NDIS_TRANSPORT_STRUCT prNdisReq;
963 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
966 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
968 u4SubCmd = (UINT_32) prIwReqData->mode;
969 pu4IntBuf = (PUINT_32) pcExtra;
972 case PRIV_CMD_TEST_CMD:
973 //printk("CMD=0x%08lx, data=0x%08lx\n", pu4IntBuf[1], pu4IntBuf[2]);
974 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
976 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
978 prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
979 prNdisReq->inNdisOidlength = 8;
980 prNdisReq->outNdisOidLength = 8;
982 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
984 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
985 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
987 if (copy_to_user(prIwReqData->data.pointer,
988 &prNdisReq->ndisOidContent[4], 4)) {
989 printk(KERN_NOTICE "priv_get_int() copy_to_user oidBuf fail(3)\n");
996 #if CFG_SUPPORT_PRIV_MCR_RW
997 case PRIV_CMD_ACCESS_MCR:
998 //printk("addr=0x%08lx\n", pu4IntBuf[1]);
999 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1001 if (!prGlueInfo->fgMcrAccessAllowed) {
1006 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1008 prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
1009 prNdisReq->inNdisOidlength = 8;
1010 prNdisReq->outNdisOidLength = 8;
1012 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1014 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1015 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1020 case PRIV_CMD_DUMP_MEM:
1021 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1024 if (!prGlueInfo->fgMcrAccessAllowed) {
1029 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1031 prNdisReq->ndisOidCmd = OID_CUSTOM_MEM_DUMP;
1032 prNdisReq->inNdisOidlength = 8;
1033 prNdisReq->outNdisOidLength = 8;
1035 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1037 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[0];
1041 case PRIV_CMD_SW_CTRL:
1042 //printk(" addr=0x%08lx\n", pu4IntBuf[1]);
1044 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1046 kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
1048 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1049 prNdisReq->inNdisOidlength = 8;
1050 prNdisReq->outNdisOidLength = 8;
1052 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1054 //printk("Result=%ld\n", *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1055 prIwReqData->mode = *(PUINT_32)&prNdisReq->ndisOidContent[4];
1060 case PRIV_CMD_BEACON_PERIOD:
1061 status = wlanQueryInformation(prGlueInfo->prAdapter,
1062 wlanoidQueryBeaconInterval,
1068 case PRIV_CMD_POWER_MODE:
1069 status = wlanQueryInformation(prGlueInfo->prAdapter,
1070 wlanoidQuery802dot11PowerSaveProfile,
1076 case PRIV_CMD_ADHOC_MODE:
1077 status = wlanQueryInformation(prGlueInfo->prAdapter,
1078 wlanoidQueryAdHocMode,
1085 case PRIV_CMD_BAND_CONFIG:
1086 DBGLOG(INIT, INFO, ("CMD get_band=\n"));
1087 prIwReqData->mode = 0;
1094 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1097 case PRIV_CMD_GET_CH_LIST:
1100 UINT_8 NumOfChannel = 50;
1101 UINT_8 ucMaxChannelNum = 50;
1102 RF_CHANNEL_INFO_T aucChannelList[50];
1104 kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1105 if (NumOfChannel > 50)
1108 if (kalIsAPmode(prGlueInfo)) {
1109 for (i = 0; i < NumOfChannel; i++) {
1110 if ((aucChannelList[i].ucChannelNum <= 13) ||
1111 (aucChannelList[i].ucChannelNum == 36 || aucChannelList[i].ucChannelNum == 40 ||
1112 aucChannelList[i].ucChannelNum == 44 || aucChannelList[i].ucChannelNum == 48)) {
1113 ch[j] = (INT_32)aucChannelList[i].ucChannelNum;
1119 for (j = 0; j < NumOfChannel; j++) {
1120 ch[j] = (INT_32)aucChannelList[j].ucChannelNum;
1124 prIwReqData->data.length = j;
1125 if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1136 } /* priv_get_int */
1139 /*----------------------------------------------------------------------------*/
1141 * \brief Private ioctl set int array handler.
1143 * \param[in] prNetDev Net device requested.
1144 * \param[in] prIwReqInfo Pointer to iwreq structure.
1145 * \param[in] prIwReqData The ioctl data structure, use the field of sub-command.
1146 * \param[in] pcExtra The buffer with input value
1148 * \retval 0 For success.
1149 * \retval -EOPNOTSUPP If cmd is not supported.
1150 * \retval -EINVAL If a value is out of range.
1153 /*----------------------------------------------------------------------------*/
1156 IN struct net_device *prNetDev,
1157 IN struct iw_request_info *prIwReqInfo,
1158 IN union iwreq_data *prIwReqData,
1162 UINT_32 u4SubCmd, u4BufLen;
1163 P_GLUE_INFO_T prGlueInfo;
1165 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1166 P_SET_TXPWR_CTRL_T prTxpwr;
1169 ASSERT(prIwReqInfo);
1170 ASSERT(prIwReqData);
1173 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1176 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1178 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1181 case PRIV_CMD_SET_TX_POWER:
1183 INT_32 *setting = prIwReqData->data.pointer;
1187 printk("Tx power num = %d\n", prIwReqData->data.length);
1189 printk("Tx power setting = %d %d %d %d\n",
1190 setting[0], setting[1], setting[2], setting[3]);
1192 prTxpwr = &prGlueInfo->rTxPwr;
1193 if (setting[0] == 0 && prIwReqData->data.length == 4 /* argc num */) {
1194 /* 0 (All networks), 1 (legacy STA), 2 (Hotspot AP), 3 (P2P), 4 (BT over Wi-Fi) */
1195 if (setting[1] == 1 || setting[1] == 0) {
1196 if (setting[2] == 0 || setting[2] == 1)
1197 prTxpwr->c2GLegacyStaPwrOffset = setting[3];
1198 if (setting[2] == 0 || setting[2] == 2)
1199 prTxpwr->c5GLegacyStaPwrOffset = setting[3];
1201 if (setting[1] == 2 || setting[1] == 0) {
1202 if (setting[2] == 0 || setting[2] == 1)
1203 prTxpwr->c2GHotspotPwrOffset = setting[3];
1204 if (setting[2] == 0 || setting[2] == 2)
1205 prTxpwr->c5GHotspotPwrOffset = setting[3];
1207 if (setting[1] == 3 || setting[1] == 0) {
1208 if (setting[2] == 0 || setting[2] == 1)
1209 prTxpwr->c2GP2pPwrOffset = setting[3];
1210 if (setting[2] == 0 || setting[2] == 2)
1211 prTxpwr->c5GP2pPwrOffset = setting[3];
1213 if (setting[1] == 4 || setting[1] == 0) {
1214 if (setting[2] == 0 || setting[2] == 1)
1215 prTxpwr->c2GBowPwrOffset = setting[3];
1216 if (setting[2] == 0 || setting[2] == 2)
1217 prTxpwr->c5GBowPwrOffset = setting[3];
1220 else if (setting[0] == 1 && prIwReqData->data.length == 2) {
1221 prTxpwr->ucConcurrencePolicy = setting[1];
1223 else if (setting[0] == 2 && prIwReqData->data.length == 3) {
1224 if (setting[1] == 0) {
1225 for (i=0; i<14; i++)
1226 prTxpwr->acTxPwrLimit2G[i] = setting[2];
1228 else if (setting[1] <= 14)
1229 prTxpwr->acTxPwrLimit2G[setting[1] - 1] = setting[2];
1231 else if (setting[0] == 3 && prIwReqData->data.length == 3) {
1232 if (setting[1] == 0) {
1234 prTxpwr->acTxPwrLimit5G[i] = setting[2];
1236 else if (setting[1] <= 4)
1237 prTxpwr->acTxPwrLimit5G[setting[1] - 1] = setting[2];
1239 else if (setting[0] == 4 && prIwReqData->data.length == 2) {
1240 if (setting[1] == 0) {
1241 wlanDefTxPowerCfg(prGlueInfo->prAdapter);
1243 rStatus = kalIoctl(prGlueInfo,
1246 sizeof(SET_TXPWR_CTRL_T),
1265 /*----------------------------------------------------------------------------*/
1267 * \brief Private ioctl get int array handler.
1269 * \param[in] pDev Net device requested.
1270 * \param[out] pIwReq Pointer to iwreq structure.
1271 * \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
1272 * \param[out] pcExtra The buffer with put the return value
1274 * \retval 0 For success.
1275 * \retval -EOPNOTSUPP If cmd is not supported.
1276 * \retval -EFAULT For fail.
1279 /*----------------------------------------------------------------------------*/
1282 IN struct net_device *prNetDev,
1283 IN struct iw_request_info *prIwReqInfo,
1284 IN union iwreq_data *prIwReqData,
1285 IN OUT char *pcExtra
1289 P_GLUE_INFO_T prGlueInfo;
1294 ASSERT(prIwReqInfo);
1295 ASSERT(prIwReqData);
1297 if (FALSE == GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra)) {
1300 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1302 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1305 case PRIV_CMD_GET_CH_LIST:
1308 UINT_8 NumOfChannel = 50;
1309 UINT_8 ucMaxChannelNum = 50;
1310 RF_CHANNEL_INFO_T aucChannelList[50];
1312 kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum, &NumOfChannel, aucChannelList);
1313 if (NumOfChannel > 50)
1316 for (i = 0; i < NumOfChannel; i++) {
1317 ch[i] = (INT_32)aucChannelList[i].ucChannelNum;
1320 prIwReqData->data.length = NumOfChannel;
1321 if (copy_to_user(prIwReqData->data.pointer, ch, NumOfChannel*sizeof(INT_32))) {
1332 } /* priv_get_int */
1334 /*----------------------------------------------------------------------------*/
1336 * \brief Private ioctl set structure handler.
1338 * \param[in] pDev Net device requested.
1339 * \param[in] prIwReqData Pointer to iwreq_data structure.
1341 * \retval 0 For success.
1342 * \retval -EOPNOTSUPP If cmd is not supported.
1343 * \retval -EINVAL If a value is out of range.
1346 /*----------------------------------------------------------------------------*/
1349 IN struct net_device *prNetDev,
1350 IN struct iw_request_info *prIwReqInfo,
1351 IN union iwreq_data *prIwReqData,
1355 UINT_32 u4SubCmd = 0;
1357 //WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1358 UINT_32 u4CmdLen = 0;
1359 P_NDIS_TRANSPORT_STRUCT prNdisReq;
1360 PUINT_32 pu4IntBuf = NULL;
1362 P_GLUE_INFO_T prGlueInfo = NULL;
1363 UINT_32 u4BufLen = 0;
1366 //ASSERT(prIwReqInfo);
1367 ASSERT(prIwReqData);
1370 kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1372 if (FALSE == GLUE_CHK_PR2(prNetDev, prIwReqData)) {
1375 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1377 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1380 printk(KERN_INFO DRV_NAME"priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1388 case PRIV_CMD_BT_COEXIST:
1389 u4CmdLen = prIwReqData->data.length * sizeof(UINT_32);
1390 ASSERT(sizeof(PARAM_CUSTOM_BT_COEXIST_T) >= u4CmdLen);
1391 if (sizeof(PARAM_CUSTOM_BT_COEXIST_T) < u4CmdLen) {
1395 if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1396 status = -EFAULT; //return -EFAULT;
1400 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
1401 wlanoidSetBtCoexistCtrl,
1402 (PVOID)&aucOidBuf[0],
1405 if (WLAN_STATUS_SUCCESS != rStatus) {
1411 case PRIV_CUSTOM_BWCS_CMD:
1412 u4CmdLen = prIwReqData->data.length * sizeof(UINT_32);
1413 ASSERT(sizeof(PARAM_PTA_IPC_T) >= u4CmdLen);
1414 if (sizeof(PARAM_PTA_IPC_T) < u4CmdLen) {
1417 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
1418 DBGLOG(REQ, INFO, ("ucCmdLen = %d, size of PTA_IPC_T = %d, prIwReqData->data = 0x%x.\n", u4CmdLen, sizeof(PARAM_PTA_IPC_T), prIwReqData->data));
1420 DBGLOG(REQ, INFO, ("priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1425 DBGLOG(REQ, INFO, ("*pcExtra = 0x%x\n", *pcExtra));
1428 if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer, u4CmdLen)) {
1429 status = -EFAULT; //return -EFAULT;
1432 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
1433 DBGLOG(REQ, INFO, ("priv_set_struct(): BWCS CMD = %02x%02x%02x%02x\n",
1434 aucOidBuf[2], aucOidBuf[3], aucOidBuf[4], aucOidBuf[5]));
1438 status = wlanSetInformation(prGlueInfo->prAdapter,
1440 (PVOID)&aucOidBuf[0],
1446 status = wlanoidSetBT(prGlueInfo->prAdapter,
1447 (PVOID)&aucOidBuf[0],
1452 if (WLAN_STATUS_SUCCESS != status) {
1458 #if CFG_SUPPORT_WPS2
1459 case PRIV_CMD_WSC_PROBE_REQ:
1461 /* retrieve IE for Probe Request */
1462 if (prIwReqData->data.length > 0) {
1463 if (copy_from_user(prGlueInfo->aucWSCIE, prIwReqData->data.pointer,
1464 prIwReqData->data.length)) {
1468 prGlueInfo->u2WSCIELen = prIwReqData->data.length;
1471 prGlueInfo->u2WSCIELen = 0;
1477 if (copy_from_user(&aucOidBuf[0],
1478 prIwReqData->data.pointer,
1479 prIwReqData->data.length)) {
1483 if (!kalMemCmp(&aucOidBuf[0], pcExtra, prIwReqData->data.length)) {
1484 DBGLOG(REQ, INFO, ("pcExtra buffer is valid\n"));
1487 DBGLOG(REQ, INFO, ("pcExtra 0x%p\n", pcExtra));
1489 /* Execute this OID */
1490 status = priv_set_ndis(prNetDev, (P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0], &u4BufLen);
1491 /* Copy result to user space */
1492 ((P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0])->outNdisOidLength = u4BufLen;
1494 if (copy_to_user(prIwReqData->data.pointer,
1496 OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1497 DBGLOG(REQ, INFO, ("copy_to_user oidBuf fail\n"));
1503 case PRIV_CMD_SW_CTRL:
1504 pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1505 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1507 //kalMemCopy(&prNdisReq->ndisOidContent[0], prIwReqData->data.pointer, 8);
1508 if (copy_from_user(&prNdisReq->ndisOidContent[0],
1509 prIwReqData->data.pointer,
1510 prIwReqData->data.length)) {
1514 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1515 prNdisReq->inNdisOidlength = 8;
1516 prNdisReq->outNdisOidLength = 8;
1518 /* Execute this OID */
1519 status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
1529 /*----------------------------------------------------------------------------*/
1531 * \brief Private ioctl get struct handler.
1533 * \param[in] pDev Net device requested.
1534 * \param[out] pIwReq Pointer to iwreq structure.
1535 * \param[in] cmd Private sub-command.
1537 * \retval 0 For success.
1538 * \retval -EFAULT If copy from user space buffer fail.
1539 * \retval -EOPNOTSUPP Parameter "cmd" not recognized.
1542 /*----------------------------------------------------------------------------*/
1545 IN struct net_device *prNetDev,
1546 IN struct iw_request_info *prIwReqInfo,
1547 IN union iwreq_data *prIwReqData,
1548 IN OUT char *pcExtra
1551 UINT_32 u4SubCmd = 0;
1552 P_NDIS_TRANSPORT_STRUCT prNdisReq= NULL;
1554 P_GLUE_INFO_T prGlueInfo = NULL;
1555 UINT_32 u4BufLen = 0;
1556 PUINT_32 pu4IntBuf = NULL;
1559 kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
1562 ASSERT(prIwReqData);
1563 if (!prNetDev || !prIwReqData) {
1564 DBGLOG(REQ, INFO, ("priv_get_struct(): invalid param(0x%p, 0x%p)\n",
1565 prNetDev, prIwReqData));
1569 u4SubCmd = (UINT_32) prIwReqData->data.flags;
1570 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1573 DBGLOG(REQ, INFO, ("priv_get_struct(): invalid prGlueInfo(0x%p, 0x%p)\n",
1574 prNetDev, *((P_GLUE_INFO_T *) netdev_priv(prNetDev))));
1579 printk(KERN_INFO DRV_NAME"priv_get_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
1584 memset(aucOidBuf, 0, sizeof(aucOidBuf));
1588 if (copy_from_user(&aucOidBuf[0],
1589 prIwReqData->data.pointer,
1590 sizeof(NDIS_TRANSPORT_STRUCT))) {
1591 DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n"));
1595 prNdisReq = (P_NDIS_TRANSPORT_STRUCT)&aucOidBuf[0];
1597 printk(KERN_NOTICE "\n priv_get_struct cmd 0x%02x len:%d OID:0x%08x OID Len:%d\n",
1599 pIwReq->u.data.length,
1600 ndisReq->ndisOidCmd,
1601 ndisReq->inNdisOidlength);
1603 if (priv_get_ndis(prNetDev, prNdisReq, &u4BufLen) == 0) {
1604 prNdisReq->outNdisOidLength = u4BufLen;
1605 if (copy_to_user(prIwReqData->data.pointer,
1607 u4BufLen + sizeof(NDIS_TRANSPORT_STRUCT) - sizeof(prNdisReq->ndisOidContent))) {
1608 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(1)\n"));
1614 prNdisReq->outNdisOidLength = u4BufLen;
1615 if (copy_to_user(prIwReqData->data.pointer,
1617 OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
1618 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(2)\n"));
1624 case PRIV_CMD_SW_CTRL:
1625 pu4IntBuf = (PUINT_32)prIwReqData->data.pointer;
1626 prNdisReq = (P_NDIS_TRANSPORT_STRUCT) &aucOidBuf[0];
1628 if (copy_from_user(&prNdisReq->ndisOidContent[0],
1629 prIwReqData->data.pointer,
1630 prIwReqData->data.length)) {
1631 DBGLOG(REQ, INFO, ("priv_get_struct() copy_from_user oidBuf fail\n"));
1635 prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
1636 prNdisReq->inNdisOidlength = 8;
1637 prNdisReq->outNdisOidLength = 8;
1639 status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
1641 prNdisReq->outNdisOidLength = u4BufLen;
1642 //printk("len=%d Result=%08lx\n", u4BufLen, *(PUINT_32)&prNdisReq->ndisOidContent[4]);
1644 if (copy_to_user(prIwReqData->data.pointer,
1645 &prNdisReq->ndisOidContent[4],
1646 4 /* OFFSET_OF(NDIS_TRANSPORT_STRUCT, ndisOidContent)*/)) {
1647 DBGLOG(REQ, INFO, ("priv_get_struct() copy_to_user oidBuf fail(2)\n"));
1653 DBGLOG(REQ, WARN, ("get struct cmd:0x%lx\n", u4SubCmd));
1656 } /* priv_get_struct */
1658 /*----------------------------------------------------------------------------*/
1660 * \brief The routine handles a set operation for a single OID.
1662 * \param[in] pDev Net device requested.
1663 * \param[in] ndisReq Ndis request OID information copy from user.
1664 * \param[out] outputLen_p If the call is successful, returns the number of
1665 * bytes written into the query buffer. If the
1666 * call failed due to invalid length of the query
1667 * buffer, returns the amount of storage needed..
1669 * \retval 0 On success.
1670 * \retval -EOPNOTSUPP If cmd is not supported.
1673 /*----------------------------------------------------------------------------*/
1676 IN struct net_device *prNetDev,
1677 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1678 OUT PUINT_32 pu4OutputLen
1681 P_WLAN_REQ_ENTRY prWlanReqEntry = NULL;
1682 WLAN_STATUS status = WLAN_STATUS_SUCCESS;
1683 P_GLUE_INFO_T prGlueInfo = NULL;
1684 UINT_32 u4SetInfoLen = 0;
1688 ASSERT(pu4OutputLen);
1690 if (!prNetDev || !prNdisReq || !pu4OutputLen) {
1691 DBGLOG(REQ, INFO, ("priv_set_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
1692 prNetDev, prNdisReq, pu4OutputLen));
1696 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1699 DBGLOG(REQ, INFO, ("priv_set_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1700 prNetDev, *((P_GLUE_INFO_T *) netdev_priv(prNetDev))));
1705 printk(KERN_INFO DRV_NAME"priv_set_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1706 prNdisReq->ndisOidCmd
1710 if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1712 //WARNLOG(("Set OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1716 if (NULL == prWlanReqEntry->pfOidSetHandler) {
1717 //WARNLOG(("Set %s: Null set handler\n", prWlanReqEntry->pucOidName));
1722 printk(KERN_INFO DRV_NAME"priv_set_ndis(): %s\n",
1723 prWlanReqEntry->pucOidName
1727 if (prWlanReqEntry->fgSetBufLenChecking) {
1728 if (prNdisReq->inNdisOidlength != prWlanReqEntry->u4InfoBufLen) {
1729 DBGLOG(REQ, WARN, ("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1730 prWlanReqEntry->pucOidName,
1731 prNdisReq->inNdisOidlength,
1732 prWlanReqEntry->u4InfoBufLen));
1734 *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1739 if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1740 /* GLUE sw info only */
1741 status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1742 prNdisReq->ndisOidContent,
1743 prNdisReq->inNdisOidlength,
1746 else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1747 /* multiple sw operations */
1748 status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
1749 prNdisReq->ndisOidContent,
1750 prNdisReq->inNdisOidlength,
1753 else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1756 status = kalIoctl(prGlueInfo,
1757 (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidSetHandler,
1758 prNdisReq->ndisOidContent,
1759 prNdisReq->inNdisOidlength,
1767 DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1768 prWlanReqEntry->eOidMethod));
1772 *pu4OutputLen = u4SetInfoLen;
1775 case WLAN_STATUS_SUCCESS:
1778 case WLAN_STATUS_INVALID_LENGTH:
1779 //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1780 // prWlanReqEntry->pucOidName,
1781 //prNdisReq->inNdisOidlength,
1786 if (WLAN_STATUS_SUCCESS != status) {
1791 } /* priv_set_ndis */
1793 /*----------------------------------------------------------------------------*/
1795 * \brief The routine handles a query operation for a single OID. Basically we
1796 * return information about the current state of the OID in question.
1798 * \param[in] pDev Net device requested.
1799 * \param[in] ndisReq Ndis request OID information copy from user.
1800 * \param[out] outputLen_p If the call is successful, returns the number of
1801 * bytes written into the query buffer. If the
1802 * call failed due to invalid length of the query
1803 * buffer, returns the amount of storage needed..
1805 * \retval 0 On success.
1806 * \retval -EOPNOTSUPP If cmd is not supported.
1807 * \retval -EINVAL invalid input parameters
1810 /*----------------------------------------------------------------------------*/
1813 IN struct net_device *prNetDev,
1814 IN NDIS_TRANSPORT_STRUCT* prNdisReq,
1815 OUT PUINT_32 pu4OutputLen
1818 P_WLAN_REQ_ENTRY prWlanReqEntry = NULL;
1819 UINT_32 u4BufLen = 0;
1820 WLAN_STATUS status = WLAN_STATUS_SUCCESS;
1821 P_GLUE_INFO_T prGlueInfo = NULL;
1825 ASSERT(pu4OutputLen);
1827 if (!prNetDev || !prNdisReq || !pu4OutputLen) {
1828 DBGLOG(REQ, INFO, ("priv_get_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
1829 prNetDev, prNdisReq, pu4OutputLen));
1833 prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
1836 DBGLOG(REQ, INFO, ("priv_get_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
1837 prNetDev, *((P_GLUE_INFO_T *) netdev_priv(prNetDev))));
1842 printk(KERN_INFO DRV_NAME"priv_get_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
1843 prNdisReq->ndisOidCmd
1847 if (FALSE == reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
1849 //WARNLOG(("Query OID: 0x%08lx (unknown)\n", prNdisReq->ndisOidCmd));
1854 if (NULL == prWlanReqEntry->pfOidQueryHandler) {
1855 //WARNLOG(("Query %s: Null query handler\n", prWlanReqEntry->pucOidName));
1860 printk(KERN_INFO DRV_NAME"priv_get_ndis(): %s\n",
1861 prWlanReqEntry->pucOidName
1865 if (prWlanReqEntry->fgQryBufLenChecking) {
1866 if (prNdisReq->inNdisOidlength < prWlanReqEntry->u4InfoBufLen) {
1867 /* Not enough room in InformationBuffer. Punt */
1868 //WARNLOG(("Query %s: Buffer too short (current=%ld, needed=%ld)\n",
1869 //prWlanReqEntry->pucOidName,
1870 //prNdisReq->inNdisOidlength,
1871 //prWlanReqEntry->u4InfoBufLen));
1873 *pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
1875 status = WLAN_STATUS_INVALID_LENGTH;
1881 if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
1882 /* GLUE sw info only */
1883 status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1884 prNdisReq->ndisOidContent,
1885 prNdisReq->inNdisOidlength,
1888 else if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_EXTENSION) {
1889 /* multiple sw operations */
1890 status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
1891 prNdisReq->ndisOidContent,
1892 prNdisReq->inNdisOidlength,
1895 else if (prWlanReqEntry->eOidMethod == ENUM_OID_DRIVER_CORE) {
1898 status = kalIoctl(prGlueInfo,
1899 (PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidQueryHandler,
1900 prNdisReq->ndisOidContent,
1901 prNdisReq->inNdisOidlength,
1909 DBGLOG(REQ, INFO, ("priv_set_ndis(): unsupported OID method:0x%x\n",
1910 prWlanReqEntry->eOidMethod));
1914 *pu4OutputLen = u4BufLen;
1917 case WLAN_STATUS_SUCCESS:
1920 case WLAN_STATUS_INVALID_LENGTH:
1921 //WARNLOG(("Set %s: Invalid length (current=%ld, needed=%ld)\n",
1922 // prWlanReqEntry->pucOidName,
1923 //prNdisReq->inNdisOidlength,
1928 if (WLAN_STATUS_SUCCESS != status) {
1933 } /* priv_get_ndis */
1935 /*----------------------------------------------------------------------------*/
1937 * \brief This routine is called to search desired OID.
1939 * \param rOid[in] Desired NDIS_OID
1940 * \param ppWlanReqEntry[out] Found registered OID entry
1942 * \retval TRUE: Matched OID is found
1943 * \retval FALSE: No matched OID is found
1945 /*----------------------------------------------------------------------------*/
1947 reqSearchSupportedOidEntry (
1949 OUT P_WLAN_REQ_ENTRY *ppWlanReqEntry
1955 j = NUM_SUPPORTED_OIDS - 1;
1960 if (rOid == arWlanOidReqTable[k].rOid) {
1961 *ppWlanReqEntry = &arWlanOidReqTable[k];
1963 } else if (rOid < arWlanOidReqTable[k].rOid) {
1971 } /* reqSearchSupportedOidEntry */
1974 /*----------------------------------------------------------------------------*/
1976 * \brief This routine is called to query the radio configuration used in IBSS
1977 * mode and RF test mode.
1979 * \param[in] prGlueInfo Pointer to the GLUE_INFO_T structure.
1980 * \param[out] pvQueryBuffer Pointer to the buffer that holds the result of the query.
1981 * \param[in] u4QueryBufferLen The length of the query buffer.
1982 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1983 * bytes written into the query buffer. If the call
1984 * failed due to invalid length of the query buffer,
1985 * returns the amount of storage needed.
1987 * \retval WLAN_STATUS_SUCCESS
1988 * \retval WLAN_STATUS_INVALID_LENGTH
1990 /*----------------------------------------------------------------------------*/
1992 reqExtQueryConfiguration (
1993 IN P_GLUE_INFO_T prGlueInfo,
1994 OUT PVOID pvQueryBuffer,
1995 IN UINT_32 u4QueryBufferLen,
1996 OUT PUINT_32 pu4QueryInfoLen
1999 P_PARAM_802_11_CONFIG_T prQueryConfig = (P_PARAM_802_11_CONFIG_T)pvQueryBuffer;
2000 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2001 UINT_32 u4QueryInfoLen = 0;
2003 DEBUGFUNC("wlanoidQueryConfiguration");
2007 ASSERT(pu4QueryInfoLen);
2009 *pu4QueryInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2010 if (u4QueryBufferLen < sizeof(PARAM_802_11_CONFIG_T)) {
2011 return WLAN_STATUS_INVALID_LENGTH;
2014 ASSERT(pvQueryBuffer);
2016 kalMemZero(prQueryConfig, sizeof(PARAM_802_11_CONFIG_T));
2018 /* Update the current radio configuration. */
2019 prQueryConfig->u4Length = sizeof(PARAM_802_11_CONFIG_T);
2021 #if defined(_HIF_SDIO)
2022 rStatus = sdio_io_ctrl(prGlueInfo,
2023 wlanoidSetBeaconInterval,
2024 &prQueryConfig->u4BeaconPeriod,
2030 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2031 wlanoidQueryBeaconInterval,
2032 &prQueryConfig->u4BeaconPeriod,
2036 if (rStatus != WLAN_STATUS_SUCCESS) {
2040 #if defined(_HIF_SDIO)
2041 rStatus = sdio_io_ctrl(prGlueInfo,
2042 wlanoidQueryAtimWindow,
2043 &prQueryConfig->u4ATIMWindow,
2049 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2050 wlanoidQueryAtimWindow,
2051 &prQueryConfig->u4ATIMWindow,
2055 if (rStatus != WLAN_STATUS_SUCCESS) {
2059 #if defined(_HIF_SDIO)
2060 rStatus = sdio_io_ctrl(prGlueInfo,
2061 wlanoidQueryFrequency,
2062 &prQueryConfig->u4DSConfig,
2068 rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
2069 wlanoidQueryFrequency,
2070 &prQueryConfig->u4DSConfig,
2074 if (rStatus != WLAN_STATUS_SUCCESS) {
2078 prQueryConfig->rFHConfig.u4Length = sizeof(PARAM_802_11_CONFIG_FH_T);
2082 } /* end of reqExtQueryConfiguration() */
2085 /*----------------------------------------------------------------------------*/
2087 * \brief This routine is called to set the radio configuration used in IBSS
2090 * \param[in] prGlueInfo Pointer to the GLUE_INFO_T structure.
2091 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2092 * \param[in] u4SetBufferLen The length of the set buffer.
2093 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2094 * bytes read from the set buffer. If the call failed
2095 * due to invalid length of the set buffer, returns
2096 * the amount of storage needed.
2098 * \retval WLAN_STATUS_SUCCESS
2099 * \retval WLAN_STATUS_INVALID_LENGTH
2100 * \retval WLAN_STATUS_NOT_ACCEPTED
2102 /*----------------------------------------------------------------------------*/
2104 reqExtSetConfiguration (
2105 IN P_GLUE_INFO_T prGlueInfo,
2106 IN PVOID pvSetBuffer,
2107 IN UINT_32 u4SetBufferLen,
2108 OUT PUINT_32 pu4SetInfoLen
2111 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2112 P_PARAM_802_11_CONFIG_T prNewConfig = (P_PARAM_802_11_CONFIG_T)pvSetBuffer;
2113 UINT_32 u4SetInfoLen = 0;
2115 DEBUGFUNC("wlanoidSetConfiguration");
2119 ASSERT(pu4SetInfoLen);
2121 *pu4SetInfoLen = sizeof(PARAM_802_11_CONFIG_T);
2123 if (u4SetBufferLen < *pu4SetInfoLen) {
2124 return WLAN_STATUS_INVALID_LENGTH;
2127 /* OID_802_11_CONFIGURATION. If associated, NOT_ACCEPTED shall be returned. */
2128 if (prGlueInfo->eParamMediaStateIndicated == PARAM_MEDIA_STATE_CONNECTED) {
2129 return WLAN_STATUS_NOT_ACCEPTED;
2132 ASSERT(pvSetBuffer);
2134 #if defined(_HIF_SDIO)
2135 rStatus = sdio_io_ctrl(prGlueInfo,
2136 wlanoidSetBeaconInterval,
2137 &prNewConfig->u4BeaconPeriod,
2143 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2144 wlanoidSetBeaconInterval,
2145 &prNewConfig->u4BeaconPeriod,
2149 if (rStatus != WLAN_STATUS_SUCCESS) {
2153 #if defined(_HIF_SDIO)
2154 rStatus = sdio_io_ctrl(prGlueInfo,
2155 wlanoidSetAtimWindow,
2156 &prNewConfig->u4ATIMWindow,
2162 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2163 wlanoidSetAtimWindow,
2164 &prNewConfig->u4ATIMWindow,
2168 if (rStatus != WLAN_STATUS_SUCCESS) {
2172 #if defined(_HIF_SDIO)
2173 rStatus = sdio_io_ctrl(prGlueInfo,
2174 wlanoidSetFrequency,
2175 &prNewConfig->u4DSConfig,
2181 rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2182 wlanoidSetFrequency,
2183 &prNewConfig->u4DSConfig,
2188 if (rStatus != WLAN_STATUS_SUCCESS) {
2194 } /* end of reqExtSetConfiguration() */
2197 /*----------------------------------------------------------------------------*/
2199 * \brief This routine is called to set beacon detection function enable/disable state
2200 * This is mainly designed for usage under BT inquiry state (disable function).
2202 * \param[in] pvAdapter Pointer to the Adapter structure
2203 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
2204 * \param[in] u4SetBufferLen The length of the set buffer
2205 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2206 * bytes read from the set buffer. If the call failed due to invalid length of
2207 * the set buffer, returns the amount of storage needed.
2209 * \retval WLAN_STATUS_SUCCESS
2210 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
2211 * \retval WLAN_STATUS_INVALID_LENGTH
2214 /*----------------------------------------------------------------------------*/
2216 reqExtSetAcpiDevicePowerState (
2217 IN P_GLUE_INFO_T prGlueInfo,
2218 IN PVOID pvSetBuffer,
2219 IN UINT_32 u4SetBufferLen,
2220 OUT PUINT_32 pu4SetInfoLen
2223 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2226 ASSERT(pvSetBuffer);
2227 ASSERT(pu4SetInfoLen);
2229 /* WIFI is enabled, when ACPI is D0 (ParamDeviceStateD0 = 1). And vice versa */
2231 //rStatus = wlanSetInformation(prGlueInfo->prAdapter,
2232 // wlanoidSetAcpiDevicePowerState,