2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/common/wlan_oid.c#5 $
6 \brief This file contains the WLAN OID processing routines of Windows driver for
7 MediaTek Inc. 802.11 Wireless LAN Adapters.
15 ** 07 19 2012 yuche.tsai
17 ** Code update for JB.
19 * 07 17 2012 yuche.tsai
21 * Let netdev bring up.
23 * 07 17 2012 yuche.tsai
25 * Compile no error before trial run.
29 * Sync CFG80211 modification from branch 2,2.
32 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
33 * using the wlanSendSetQueryCmd to set the tx power control cmd.
36 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
37 * change the set tx power cmd name.
40 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
41 * Adding the related ioctl / wlan oid function to set the Tx power cfg.
44 * [WCXRP00001144] [MT6620 Wi-Fi][Driver][Firmware] Add RF_FUNC_ID for exposing device and related version information
45 * add driver implementations for RF_AT_FUNCID_FW_INFO & RF_AT_FUNCID_DRV_INFO
46 * to expose version information
49 * [WCXRP00001131] [MT6620 Wi-Fi][Driver][AIS] Implement connect-by-BSSID path
50 * add CONNECT_BY_BSSID policy
53 * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous approach to avoid incomplete state termination
54 * 1. change RDD related compile option brace position.
55 * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without join timeout timer ticking
56 * 3. otherwise, insert AIS_REQUEST into pending request queue
59 * [WCXRP00001118] [MT6620 Wi-Fi][Driver] Corner case protections to pass Monkey testing
60 * 1. wlanoidQueryBssIdList might be passed with a non-zero length but a NULL pointer of buffer
61 * add more checking for such cases
63 * 2. kalSendComplete() might be invoked with a packet belongs to P2P network right after P2P is unregistered.
64 * add some tweaking to protect such cases because that net device has become invalid.
68 * Fix compiling warning
71 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
72 * modify the xlog related code.
74 * 11 11 2011 tsaiyuan.hsu
75 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
76 * add debug counters of bb and ar for xlog.
79 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
80 * change the debug module level.
82 * 11 09 2011 george.huang
83 * [WCXRP00000871] [MT6620 Wi-Fi][FW] Include additional wakeup condition, which is by consequent DTIM unicast indication
84 * add XLOG for Set PS mode entry
86 * 11 08 2011 tsaiyuan.hsu
87 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
88 * check if CFG_SUPPORT_SWCR is defined to aoid compiler error.
90 * 11 07 2011 tsaiyuan.hsu
91 * [WCXRP00001083] [MT6620 Wi-Fi][DRV]] dump debug counter or frames when debugging is triggered
92 * add debug counters and periodically dump counters for debugging.
95 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
96 * change the DBGLOG for "\n" and "\r\n". LABEL to LOUD for XLOG
98 * 11 02 2011 chinghwa.yu
99 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
100 * Add RDD certification features.
102 * 10 21 2011 eddie.chen
103 * [WCXRP00001051] [MT6620 Wi-Fi][Driver/Fw] Adjust the STA aging timeout
104 * Add switch to ignore the STA aging timeout.
107 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
108 * adding the 802.11w related function and define .
110 * 09 15 2011 tsaiyuan.hsu
111 * [WCXRP00000938] [MT6620 Wi-Fi][FW] add system config for CTIA
112 * correct fifo full control from query to set operation for CTIA.
114 * 08 31 2011 cm.chang
115 * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
118 * 08 17 2011 tsaiyuan.hsu
119 * [WCXRP00000938] [MT6620 Wi-Fi][FW] add system config for CTIA
120 * add system config for CTIA.
122 * 08 15 2011 george.huang
123 * [MT6620 Wi-Fi][FW] handle TSF drift for connection detection
126 * 07 28 2011 chinghwa.yu
127 * [WCXRP00000063] Update BCM CoEx design and settings
128 * Add BWCS cmd and event.
130 * 07 18 2011 chinghwa.yu
131 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
132 * Add CMD/Event for RDD and BWCS.
135 * [WCXRP00000849] [MT6620 Wi-Fi][Driver] Remove some of the WAPI define for make sure the value is initialize, for customer not enable WAPI
136 * For make sure wapi initial value is set.
139 * [WCXRP00000812] [MT6620 Wi-Fi][Driver] not show NVRAM when there is no valid MAC address in NVRAM content
140 * check with firmware for valid MAC address.
142 * 05 02 2011 eddie.chen
143 * [WCXRP00000373] [MT6620 Wi-Fi][FW] SW debug control
144 * Fix compile warning.
146 * 04 29 2011 george.huang
147 * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
150 * 04 27 2011 george.huang
151 * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
152 * add more debug message
154 * 04 26 2011 eddie.chen
155 * [WCXRP00000373] [MT6620 Wi-Fi][FW] SW debug control
156 * Add rx path profiling.
158 * 04 12 2011 eddie.chen
159 * [WCXRP00000617] [MT6620 Wi-Fi][DRV/FW] Fix for sigma
160 * Fix the sta index in processing security frame
161 * Simple flow control for TC4 to avoid mgt frames for PS STA to occupy the TC4
164 * 04 08 2011 george.huang
165 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
166 * separate settings of P2P and AIS
168 * 03 31 2011 puff.wen
172 * 03 29 2011 puff.wen
174 * Add chennel switch for stress test
177 * [WCXRP00000604] [MT6620 Wi-Fi][Driver] Surpress Klockwork Warning
178 * surpress klock warning with code path rewritten
181 * [WCXRP00000595] [MT6620 Wi-Fi][Driver] at CTIA indicate disconnect to make the ps profile can apply
182 * use disconnect event instead of ais abort for CTIA testing.
184 * 03 23 2011 george.huang
185 * [WCXRP00000586] [MT6620 Wi-Fi][FW] Modify for blocking absence request right after connected
186 * revise for CTIA power mode setting
188 * 03 22 2011 george.huang
189 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
190 * link with supplicant commands
192 * 03 17 2011 chinglan.wang
193 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
196 * 03 17 2011 yarco.yang
197 * [WCXRP00000569] [MT6620 Wi-Fi][F/W][Driver] Set multicast address support current network usage
200 * 03 15 2011 george.huang
201 * [WCXRP00000557] [MT6620 Wi-Fi] Support current consumption test mode commands
202 * Support current consumption measurement mode command
204 * 03 15 2011 eddie.chen
205 * [WCXRP00000554] [MT6620 Wi-Fi][DRV] Add sw control debug counter
206 * Add sw debug counter for QM.
209 * [WCXRP00000532] [MT6620 Wi-Fi][Driver] Migrate NVRAM configuration procedures from MT6620 E2 to MT6620 E3
210 * deprecate configuration used by MT6620 E2
212 * 03 07 2011 terry.wu
213 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
214 * Toggle non-standard debug messages to comments.
217 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
218 * surpress compile warning occured when compiled by GNU compiler collection.
221 * [WCXRP00000510] [MT6620 Wi-Fi] [Driver] Fixed the CTIA enter test mode issue
222 * fixed the enter ctia test mode issue.
224 * 03 02 2011 george.huang
225 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
226 * Update sigma CAPI for U-APSD setting
228 * 03 02 2011 george.huang
229 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
230 * Support UAPSD/OppPS/NoA parameter setting
233 * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as initial RSSI right after connection is built.
234 * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
236 * 01 27 2011 george.huang
237 * [WCXRP00000400] [MT6620 Wi-Fi] support CTIA power mode setting
238 * Support CTIA power mode setting.
241 * [WCXRP00000396] [MT6620 Wi-Fi][Driver] Support Sw Ctrl ioctl at linux
242 * adding the SW cmd ioctl support, use set/get structure ioctl.
245 * [WCXRP00000394] [MT6620 Wi-Fi][Driver] Count space needed for generating error message in scanning list into buffer size checking
246 * when doing size prechecking, check illegal MAC address as well
248 * 01 20 2011 eddie.chen
249 * [WCXRP00000374] [MT6620 Wi-Fi][DRV] SW debug control
250 * Add Oid for sw control debug command
252 * 01 15 2011 puff.wen
257 * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
258 * check if allow to switch to IBSS mode via concurrent module before setting to IBSS mode
260 * 01 12 2011 cm.chang
261 * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
262 * User-defined bandwidth is for 2.4G and 5G individually
265 * [WCXRP00000342] [MT6620 Wi-Fi][Driver] show error code in scanning list when MAC address is not correctly configured in NVRAM
266 * show error code 0x10 when MAC address in NVRAM is not configured correctly.
269 * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to ease physically continous memory demands
270 * separate kalMemAlloc() into virtually-continous and physically-continous type to ease slab system pressure
272 * 12 28 2010 george.huang
273 * [WCXRP00000232] [MT5931 Wi-Fi][FW] Modifications for updated HW power on sequence and related design
274 * support WMM-PS U-APSD AC assignment.
277 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
278 * report EEPROM used flag via NIC_CAPABILITY
281 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
282 * integrate with 'EEPROM used' flag for reporting correct capability to Engineer Mode/META and other tools
285 * [WCXRP00000268] [MT6620 Wi-Fi][Driver] correction for WHQL failed items
286 * correction for OID_802_11_NETWORK_TYPES_SUPPORTED handlers
289 * [WCXRP00000256] [MT6620 Wi-Fi][Driver] Eliminate potential issues which is identified by Klockwork
290 * suppress warning reported by Klockwork.
292 * 12 07 2010 cm.chang
293 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
294 * 1. BSSINFO include RLM parameter
295 * 2. free all sta records when network is disconnected
297 * 12 07 2010 cm.chang
298 * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
299 * 1. Country code is from NVRAM or supplicant
300 * 2. Change band definition in CMD/EVENT.
303 * [WCXRP00000213] [MT6620 Wi-Fi][Driver] Implement scanning with specified SSID for wpa_supplicant with ap_scan=1
307 * [WCXRP00000209] [MT6620 Wi-Fi][Driver] Modify NVRAM checking mechanism to warning only with necessary data field checking
308 * 1. NVRAM error is now treated as warning only, thus normal operation is still available but extra scan result used to indicate user is attached
309 * 2. DPD and TX-PWR are needed fields from now on, if these 2 fields are not availble then warning message is shown
312 * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
313 * add scanning with specified SSID facility to AIS-FSM
316 * [WCXRP00000192] [MT6620 Wi-Fi][Driver] Fixed fail trying to build connection with Security AP while enable WAPI message check
317 * Not set the wapi mode while the wapi assoc info set non-wapi ie.
320 * [WCXRP00000165] [MT6620 Wi-Fi] [Pre-authentication] Assoc req rsn ie use wrong pmkid value
321 * fixed the.pmkid value mismatch issue
324 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000150] [MT6620 Wi-Fi][Driver] Add implementation for querying current TX rate from firmware auto rate module
325 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
326 * 2) Remove CNM CH-RECOVER event handling
327 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
330 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
331 * 1) update NVRAM content template to ver 1.02
332 * 2) add compile option for querying NIC capability (default: off)
333 * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
334 * 4) correct auto-rate compiler error under linux (treat warning as error)
335 * 5) simplify usage of NVRAM and REG_INFO_T
336 * 6) add version checking between driver and firmware
339 * [WCXRP00000122] [MT6620 Wi-Fi][Driver] Preparation for YuSu source tree integration
340 * dos2unix conversion.
343 * [WCXRP00000117] [MT6620 Wi-Fi][Driver] Add logic for suspending driver when MT6620 is not responding anymore
344 * use OID_CUSTOM_TEST_MODE as indication for driver reset
345 * by dropping pending TX packets
348 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android
349 * complete implementation of Android NVRAM access
351 * 10 06 2010 yuche.tsai
353 * Update SLT 5G Test Channel Set.
356 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
357 * code reorganization to improve isolation between GLUE and CORE layers.
359 * 10 06 2010 yuche.tsai
361 * Update For SLT 5G Test Channel Selection Rule.
364 * [WCXRP00000075] [MT6620 Wi-Fi][Driver] Fill query buffer for OID_802_11_BSSID_LIST in 4-bytes aligned form
365 * Query buffer size needs to be enlarged due to result is filled in 4-bytes alignment boundary
368 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
369 * 1) add NVRAM access API
370 * 2) fake scanning result when NVRAM doesn't exist and/or version mismatch. (off by compiler option)
371 * 3) add OID implementation for NVRAM read/write service
374 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
375 * remove ENUM_NETWORK_TYPE_T definitions
378 * [WCXRP00000075] [MT6620 Wi-Fi][Driver] Fill query buffer for OID_802_11_BSSID_LIST in 4-bytes aligned form
379 * Extend result length to multiples of 4-bytes
382 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
383 * eliminate unused variables which lead gcc to argue
386 * [WCXRP00000057] [MT6620 Wi-Fi][Driver] Modify online scan to a run-time switchable feature
387 * Modify online scan as a run-time adjustable option (for Windows, in registry)
390 * [WCXRP00000051] [MT6620 Wi-Fi][Driver] WHQL test fail in MAC address changed item
391 * use firmware reported mac address right after wlanAdapterStart() as permanent address
394 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
395 * add skeleton for NVRAM integration
399 * use static memory pool for storing IEs of scanning result.
401 * 09 07 2010 yuche.tsai
403 * Update SLT due to API change of SCAN module.
407 * Androi/Linux: return current operating channel information
411 * 1) initialize for correct parameter even for disassociation.
412 * 2) AIS-FSM should have a limit on trials to build connection
414 * 09 03 2010 yuche.tsai
416 * Refine SLT IO control handler.
418 * 09 03 2010 kevin.huang
420 * Refine #include sequence and solve recursive/nested #include issue
424 * adding the wapi support for integration test.
426 * 08 30 2010 chinglan.wang
428 * Modify the rescan condition.
430 * 08 29 2010 yuche.tsai
432 * Finish SLT TX/RX & Rate Changing Support.
434 * 08 27 2010 chinglan.wang
436 * Update configuration for MT6620_E1_PRE_ALPHA_1832_0827_2010
438 * 08 25 2010 george.huang
440 * update OID/ registry control path for PM related settings
444 * 1) initialize variable for enabling short premable/short time slot.
445 * 2) add compile option for disabling online scan
447 * 08 16 2010 george.huang
451 * 08 16 2010 george.huang
453 * upate params defined in CMD_SET_NETWORK_ADDRESS_LIST
457 * fix for check build WHQL testing:
458 * 1) do not assert query buffer if indicated buffer length is zero
459 * 2) sdio.c has bugs which cause freeing same pointer twice
463 * revert changelist #15371, efuse read/write access will be done by RF test approach
467 * add OID definitions for EFUSE read/write access.
469 * 08 04 2010 george.huang
471 * handle change PS mode OID/ CMD
475 * add an extra parameter to rftestQueryATInfo 'cause it's necessary to pass u4FuncData for query request.
479 * bypass u4FuncData for RF-Test query request as well.
481 * 08 04 2010 yarco.yang
483 * Add TX_AMPDU and ADDBA_REJECT command
487 * surpress compilation warning.
489 * 08 02 2010 george.huang
491 * add WMM-PS test related OID/ CMD handlers
495 * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
499 * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
500 * 2) change nicMediaStateChange() API prototype
504 * re-commit code logic being overwriten.
508 * .support the Wi-Fi RSN
512 * 1) change BG_SCAN to ONLINE_SCAN for consistent term
513 * 2) only clear scanning result when scan is permitted to do
517 * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
518 * 2) refine disconnection behaviour when issued during BG-SCAN process
522 * modify the auth and encry status variable.
526 * remove work-around in case SCN is not available.
530 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
533 * [WPD00003833][MT6620 and MT5931] Driver migration
534 * 1) change fake BSS_DESC from channel 6 to channel 1 due to channel switching is not done yet.
535 * 2) after MAC address is queried from firmware, all related variables in driver domain should be updated as well
538 * [WPD00003833][MT6620 and MT5931] Driver migration
539 * AIS-FSM integration with CNM channel request messages
542 * [WPD00003833][MT6620 and MT5931] Driver migration
543 * implementation of DRV-SCN and related mailbox message handling.
546 * [WPD00003833][MT6620 and MT5931] Driver migration
547 * 1) sync to. CMD/EVENT document v0.03
548 * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
549 * 3) send command packet to indicate FW-PM after
550 * a) 1st beacon is received after AIS has connected to an AP
551 * b) IBSS-ALONE has been created
552 * c) IBSS-MERGE has occured
555 * [WPD00003833][MT6620 and MT5931] Driver migration
556 * add API in que_mgt to retrieve sta-rec index for security frames.
559 * [WPD00003833][MT6620 and MT5931] Driver migration
560 * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
563 * [WPD00003833][MT6620 and MT5931] Driver migration
564 * 1) add SCN compilation option.
565 * 2) when SCN is not turned on, BSSID_SCAN will generate a fake entry for 1st connection
568 * [WPD00003833][MT6620 and MT5931] Driver migration
569 * implement SCAN-REQUEST oid as mailbox message dispatching.
572 * [WPD00003833][MT6620 and MT5931] Driver migration
576 * [WPD00003833][MT6620 and MT5931] Driver migration
577 * 1) add command warpper for STA-REC/BSS-INFO sync.
578 * 2) enhance command packet sending procedure for non-oid part
579 * 3) add command packet definitions for STA-REC/BSS-INFO sync.
582 * [WPD00003840][MT6620 5931] Security migration
583 * remove duplicate variable for migration.
586 * [WPD00003840][MT6620 5931] Security migration
587 * adding the compiling flag for oid pmkid.
590 * [WPD00003833][MT6620 and MT5931] Driver migration
591 * enable RX management frame handling.
594 * [WPD00003840][MT6620 5931] Security migration
595 * migration the security related function from firmware.
598 * [WPD00003833][MT6620 and MT5931] Driver migration
599 * 1) migrate assoc.c.
600 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
601 * 3) add configuration options for CNM_MEM and RSN modules
602 * 4) add data path for management frames
603 * 5) eliminate rPacketInfo of MSDU_INFO_T
606 * [WPD00003833][MT6620 and MT5931] Driver migration
607 * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
608 * 2) when disconnected, indicate nic directly (no event is needed)
611 * [WPD00003833][MT6620 and MT5931] Driver migration
615 * [WPD00003833][MT6620 and MT5931] Driver migration
616 * merge wifi_var.h, precomp.h, cnm_timer.h (data type only)
618 * 06 06 2010 kevin.huang
619 * [WPD00003832][MT6620 5931] Create driver base
620 * [MT6620 5931] Create driver base
623 * [WPD00001943]Create WiFi test driver framework on WinXP
624 * move timer callback to glue layer.
627 * [WPD00001943]Create WiFi test driver framework on WinXP
628 * simplify cmd packet sending for RF test and MCR access OIDs
631 * [WPD00001943]Create WiFi test driver framework on WinXP
632 * disable radio even when STA is not associated.
635 * [WPD00001943]Create WiFi test driver framework on WinXP
636 * correct 2 OID behaviour to meet WHQL requirement.
638 * 05 26 2010 jeffrey.chang
639 * [WPD00003826]Initial import for Linux port
640 * 1) Modify set mac address code
641 * 2) remove power managment macro
644 * [WPD00001943]Create WiFi test driver framework on WinXP
645 * correct BSSID_LIST oid when radio if turned off.
648 * [WPD00001943]Create WiFi test driver framework on WinXP
649 * 1) when acquiring LP-own, write for clr-own with lower frequency compared to read poll
650 * 2) correct address list parsing
653 * [WPD00001943]Create WiFi test driver framework on WinXP
654 * disable wlanoidSetNetworkAddress() temporally.
657 * [WPD00001943]Create WiFi test driver framework on WinXP
658 * some OIDs should be DRIVER_CORE instead of GLUE_EXTENSION
661 * [WPD00001943]Create WiFi test driver framework on WinXP
662 * 1) disable NETWORK_LAYER_ADDRESSES handling temporally.
663 * 2) finish statistics OIDs
666 * [WPD00001943]Create WiFi test driver framework on WinXP
667 * change OID behavior to meet WHQL requirement.
670 * [WPD00001943]Create WiFi test driver framework on WinXP
671 * 1) integrate OID_GEN_NETWORK_LAYER_ADDRESSES with CMD_ID_SET_IP_ADDRESS
672 * 2) buffer statistics data for 2 seconds
673 * 3) use default value for adhoc parameters instead of 0
676 * [WPD00001943]Create WiFi test driver framework on WinXP
677 * 1) do not take timeout mechanism for power mode oids
678 * 2) retrieve network type from connection status
679 * 3) after disassciation, set radio state to off
680 * 4) TCP option over IPv6 is supported
683 * [WPD00001943]Create WiFi test driver framework on WinXP
684 * implement Wakeup-on-LAN except firmware integration part
687 * [WPD00001943]Create WiFi test driver framework on WinXP
688 * correct wlanoidSet802dot11PowerSaveProfile implementation.
691 * [WPD00001943]Create WiFi test driver framework on WinXP
692 * 1) enable CMD/EVENT ver 0.9 definition.
693 * 2) abandon use of ENUM_MEDIA_STATE
696 * [WPD00001943]Create WiFi test driver framework on WinXP
697 * correct OID_802_11_DISASSOCIATE handling.
700 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
701 * 1) add timeout handler mechanism for pending command packets
702 * 2) add p2p add/removal key
704 * 05 14 2010 jeffrey.chang
705 * [WPD00003826]Initial import for Linux port
706 * Add dissassocation support for wpa supplicant
709 * [WPD00001943]Create WiFi test driver framework on WinXP
710 * correct return value.
713 * [WPD00001943]Create WiFi test driver framework on WinXP
714 * add NULL OID implementation for WOL-related OIDs.
717 * [WPD00001943]Create WiFi test driver framework on WinXP
718 * for disassociation, still use parameter with current setting.
721 * [WPD00001943]Create WiFi test driver framework on WinXP
722 * for disassociation, generate a WZC-compatible invalid SSID.
725 * [WPD00001943]Create WiFi test driver framework on WinXP
726 * associate to illegal SSID when handling OID_802_11_DISASSOCIATE
729 * [WPD00001943]Create WiFi test driver framework on WinXP
730 * reserve field of privacy filter and RTS threshold setting.
733 * [WPD00001943]Create WiFi test driver framework on WinXP
734 * surpress compiler warning
737 * [WPD00001943]Create WiFi test driver framework on WinXP
741 * [WPD00003830]add OID_802_11_PRIVACY_FILTER support
742 * enable RX filter OID
744 * 04 19 2010 jeffrey.chang
745 * [WPD00003826]Initial import for Linux port
746 * Add ioctl of power management
749 * [WPD00001943]Create WiFi test driver framework on WinXP
750 * information buffer for query oid/ioctl is now buffered in prCmdInfo
751 * * instead of glue-layer variable to improve multiple oid/ioctl capability
754 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
755 * add framework for BT-over-Wi-Fi support.
756 * * * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
757 * * * * 2) command sequence number is now increased atomically
758 * * * * 3) private data could be hold and taken use for other purpose
761 * [WPD00001943]Create WiFi test driver framework on WinXP
762 * correct OID_802_11_CONFIGURATION query for infrastructure mode.
764 * 04 09 2010 jeffrey.chang
765 * [WPD00003826]Initial import for Linux port
766 * 1) remove unused spin lock declaration
769 * [WPD00001943]Create WiFi test driver framework on WinXP
770 * finish non-glue layer access to glue variables
773 * [WPD00001943]Create WiFi test driver framework on WinXP
774 * rWlanInfo should be placed at adapter rather than glue due to most operations
775 * * are done in adapter layer.
777 * 04 07 2010 jeffrey.chang
778 * [WPD00003826]Initial import for Linux port
779 * (1)improve none-glue code portability
780 * (2) disable set Multicast address during atomic context
783 * [WPD00001943]Create WiFi test driver framework on WinXP
784 * eliminate direct access to prGlueInfo->eParamMediaStateIndicated from non-glue layer
787 * [WPD00001943]Create WiFi test driver framework on WinXP
788 * ePowerCtrl is not necessary as a glue variable.
791 * [WPD00001943]Create WiFi test driver framework on WinXP
792 * eliminate direct access to prGlueInfo->rWlanInfo.eLinkAttr.ucMediaStreamMode from non-glue layer.
794 * 04 06 2010 jeffrey.chang
795 * [WPD00003826]Initial import for Linux port
796 * improve none-glue code portability
799 * [WPD00001943]Create WiFi test driver framework on WinXP
800 * code refine: fgTestMode should be at adapter rather than glue due to the device/fw is also involved
803 * [WPD00001943]Create WiFi test driver framework on WinXP
807 * [WPD00003816][MT6620 Wi-Fi] Adding the security support
808 * modify the wapi related code for new driver's design.
811 * [WPD00001943]Create WiFi test driver framework on WinXP
812 * statistics information OIDs are now handled by querying from firmware domain
814 * 03 28 2010 jeffrey.chang
815 * [WPD00003826]Initial import for Linux port
816 * improve glue code portability
819 * [WPD00001943]Create WiFi test driver framework on WinXP
820 * indicate media stream mode after set is done
823 * [WPD00001943]Create WiFi test driver framework on WinXP
824 * add a temporary flag for integration with CMD/EVENT v0.9.
827 * [WPD00001943]Create WiFi test driver framework on WinXP
828 * 1) correct OID_802_11_CONFIGURATION with frequency setting behavior.
829 * the frequency is used for adhoc connection only
830 * 2) update with SD1 v0.9 CMD/EVENT documentation
832 * 03 24 2010 jeffrey.chang
833 * [WPD00003826]Initial import for Linux port
834 * [WPD00003826] Initial import for Linux port
835 * initial import for Linux port
837 * 03 24 2010 jeffrey.chang
838 * [WPD00003826]Initial import for Linux port
839 * initial import for Linux port
842 * [WPD00001943]Create WiFi test driver framework on WinXP
843 * generate information for OID_GEN_RCV_OK & OID_GEN_XMIT_OK
847 * [WPD00003824][MT6620 Wi-Fi][New Feature] Add support of large scan list
848 * Implement feature needed by CR: WPD00003824: refining association command by pasting scanning result
851 * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
852 * adding the check for pass WHQL test item.
855 * [WPD00001943]Create WiFi test driver framework on WinXP
856 * 1) add ACPI D0/D3 state switching support
857 * * 2) use more formal way to handle interrupt when the status is retrieved from enhanced RX response
860 * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
861 * fixed some whql pre-test fail case.
864 * [WPD00001943]Create WiFi test driver framework on WinXP
865 * implement custom OID: EEPROM read/write access
868 * [WPD00001943]Create WiFi test driver framework on WinXP
869 * implement OID_802_3_MULTICAST_LIST oid handling
872 * [WPD00001943]Create WiFi test driver framework on WinXP
873 * 1) the use of prPendingOid revised, all accessing are now protected by spin lock
874 * * 2) ensure wlanReleasePendingOid will clear all command queues
877 * [WPD00001943]Create WiFi test driver framework on WinXP
878 * send CMD_ID_INFRASTRUCTURE when handling OID_802_11_INFRASTRUCTURE_MODE set.
881 * [WPD00003820][MT6620 Wi-Fi] Modify the code for meet the WHQL test
882 * Don't needed to check the auth mode, WHQL testing not specific at auth wpa2.
885 * [WPD00001943]Create WiFi test driver framework on WinXP
886 * do not check SSID validity anymore.
889 * [WPD00001943]Create WiFi test driver framework on WinXP
890 * add checksum offloading support.
893 * [WPD00001943]Create WiFi test driver framework on WinXP
894 * 1. Permanent and current MAC address are now retrieved by CMD/EVENT packets instead of hard-coded address
895 * * 2. follow MSDN defined behavior when associates to another AP
896 * * 3. for firmware download, packet size could be up to 2048 bytes
899 * [WPD00001943]Create WiFi test driver framework on WinXP
900 * move ucCmdSeqNum as instance variable
903 * [WPD00001943]Create WiFi test driver framework on WinXP
904 * when OID_CUSTOM_OID_INTERFACE_VERSION is queried, do modify connection states
907 * [WPD00001943]Create WiFi test driver framework on WinXP
908 * 1) implement timeout mechanism when OID is pending for longer than 1 second
909 * * 2) allow OID_802_11_CONFIGURATION to be executed when RF test mode is turned on
912 * [WPD00003816][MT6620 Wi-Fi] Adding the security support
916 * [WPD00001943]Create WiFi test driver framework on WinXP
917 * 1. eliminate improper variable in rHifInfo
918 * * 2. block TX/ordinary OID when RF test mode is engaged
919 * * 3. wait until firmware finish operation when entering into and leaving from RF test mode
920 * * 4. correct some HAL implementation
923 * [WPD00001943]Create WiFi test driver framework on WinXP
924 * implement following 802.11 OIDs:
926 * OID_802_11_RSSI_TRIGGER,
927 * OID_802_11_STATISTICS,
928 * OID_802_11_DISASSOCIATE,
929 * OID_802_11_POWER_MODE
932 * [WPD00001943]Create WiFi test driver framework on WinXP
933 * implement OID_802_11_MEDIA_STREAM_MODE
936 * [WPD00001943]Create WiFi test driver framework on WinXP
937 * implement OID_802_11_SUPPORTED_RATES / OID_802_11_DESIRED_RATES
940 * [WPD00001943]Create WiFi test driver framework on WinXP
941 * do not fill ucJoinOnly currently
944 * [WPD00001943]Create WiFi test driver framework on WinXP
945 * enable to connect to ad-hoc network
948 * [WPD00001943]Create WiFi test driver framework on WinXP
949 * .implement Set/Query BeaconInterval/AtimWindow
952 * [WPD00001943]Create WiFi test driver framework on WinXP
953 * .Set/Get AT Info is not blocked even when driver is not in fg test mode
956 * [WPD00001943]Create WiFi test driver framework on WinXP
957 * 1) According to CMD/EVENT documentation v0.8,
958 * OID_CUSTOM_TEST_RX_STATUS & OID_CUSTOM_TEST_TX_STATUS is no longer used,
959 * and result is retrieved by get ATInfo instead
960 * 2) add 4 counter for recording aggregation statistics
963 * [WPD00001943]Create WiFi test driver framework on WinXP
964 * eliminate redundant variables for connection_state
965 ** \main\maintrunk.MT6620WiFiDriver_Prj\32 2009-12-16 22:13:36 GMT mtk02752
966 ** change hard-coded MAC address to match with FW (temporally)
967 ** \main\maintrunk.MT6620WiFiDriver_Prj\31 2009-12-10 16:49:50 GMT mtk02752
969 ** \main\maintrunk.MT6620WiFiDriver_Prj\30 2009-12-08 17:38:49 GMT mtk02752
970 ** + add OID for RF test
971 ** * MCR RD/WR are modified to match with cmd/event definition
972 ** \main\maintrunk.MT6620WiFiDriver_Prj\29 2009-12-08 11:32:20 GMT mtk02752
973 ** add skeleton for RF test implementation
974 ** \main\maintrunk.MT6620WiFiDriver_Prj\28 2009-12-03 16:43:24 GMT mtk01461
975 ** Modify query SCAN list oid by adding prEventScanResult
977 ** \main\maintrunk.MT6620WiFiDriver_Prj\27 2009-12-03 16:39:27 GMT mtk01461
978 ** Sync CMD data structure in set ssid oid
979 ** \main\maintrunk.MT6620WiFiDriver_Prj\26 2009-12-03 16:28:22 GMT mtk01461
980 ** Add invalid check of set SSID oid and fix query scan list oid
981 ** \main\maintrunk.MT6620WiFiDriver_Prj\25 2009-11-30 17:33:08 GMT mtk02752
982 ** implement wlanoidSetInfrastructureMode/wlanoidQueryInfrastructureMode
983 ** \main\maintrunk.MT6620WiFiDriver_Prj\24 2009-11-30 10:53:49 GMT mtk02752
984 ** 1st DW of WIFI_CMD_T is shared with HIF_TX_HEADER_T
985 ** \main\maintrunk.MT6620WiFiDriver_Prj\23 2009-11-30 09:22:48 GMT mtk02752
986 ** correct wifi cmd length mismatch
987 ** \main\maintrunk.MT6620WiFiDriver_Prj\22 2009-11-25 21:34:33 GMT mtk02752
988 ** sync EVENT_SCAN_RESULT_T with firmware
989 ** \main\maintrunk.MT6620WiFiDriver_Prj\21 2009-11-25 21:03:27 GMT mtk02752
990 ** implement wlanoidQueryBssidList()
991 ** \main\maintrunk.MT6620WiFiDriver_Prj\20 2009-11-25 18:17:17 GMT mtk02752
992 ** refine GL_WLAN_INFO_T for buffering scan result
993 ** \main\maintrunk.MT6620WiFiDriver_Prj\19 2009-11-23 20:28:51 GMT mtk02752
994 ** some OID will be set to WLAN_STATUS_PENDING until it is sent via wlanSendCommand()
995 ** \main\maintrunk.MT6620WiFiDriver_Prj\18 2009-11-23 17:56:36 GMT mtk02752
996 ** implement wlanoidSetBssidListScan(), wlanoidSetBssid() and wlanoidSetSsid()
998 ** \main\maintrunk.MT6620WiFiDriver_Prj\17 2009-11-13 17:20:53 GMT mtk02752
999 ** add Set BSSID/SSID path but disabled temporally due to FW is not ready yet
1000 ** \main\maintrunk.MT6620WiFiDriver_Prj\16 2009-11-13 12:28:58 GMT mtk02752
1001 ** add wlanoidSetBssidListScan -> cmd_info path
1002 ** \main\maintrunk.MT6620WiFiDriver_Prj\15 2009-11-09 22:48:07 GMT mtk01084
1003 ** modify test cases entry
1004 ** \main\maintrunk.MT6620WiFiDriver_Prj\14 2009-11-04 14:10:58 GMT mtk01084
1005 ** add new test interfaces
1006 ** \main\maintrunk.MT6620WiFiDriver_Prj\13 2009-10-30 18:17:10 GMT mtk01084
1007 ** fix compiler warning
1008 ** \main\maintrunk.MT6620WiFiDriver_Prj\12 2009-10-29 19:46:26 GMT mtk01084
1009 ** add test functions
1010 ** \main\maintrunk.MT6620WiFiDriver_Prj\11 2009-10-23 16:07:56 GMT mtk01084
1012 ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-10-13 21:58:29 GMT mtk01084
1013 ** modify for new HW architecture
1014 ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-10-02 13:48:49 GMT mtk01725
1015 ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-09-09 17:26:04 GMT mtk01084
1016 ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-04-21 12:09:50 GMT mtk01461
1017 ** Update for MCR Write OID
1018 ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-04-21 09:35:18 GMT mtk01461
1019 ** Update wlanoidQueryMcrRead() for composing CMD_INFO_T
1020 ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-04-17 18:09:51 GMT mtk01426
1021 ** Remove kalIndicateStatusAndComplete() in wlanoidQueryOidInterfaceVersion()
1022 ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-04-14 15:51:50 GMT mtk01426
1023 ** Add MCR read/write support
1024 ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-03-19 18:32:40 GMT mtk01084
1025 ** update for basic power management functions
1026 ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 20:06:31 GMT mtk01426
1031 /******************************************************************************
1032 * C O M P I L E R F L A G S
1033 *******************************************************************************
1036 /******************************************************************************
1037 * E X T E R N A L R E F E R E N C E S
1038 *******************************************************************************
1040 #include "precomp.h"
1041 #include "mgmt/rsn.h"
1045 /******************************************************************************
1047 *******************************************************************************
1050 /******************************************************************************
1052 *******************************************************************************
1055 /******************************************************************************
1056 * P U B L I C D A T A
1057 *******************************************************************************
1060 extern UINT_8 aucDebugModule[DBG_MODULE_NUM];
1061 extern UINT_32 u4DebugModule;
1062 UINT_32 u4DebugModuleTemp;
1065 /******************************************************************************
1066 * P R I V A T E D A T A
1067 *******************************************************************************
1070 /******************************************************************************
1072 *******************************************************************************
1075 /******************************************************************************
1076 * F U N C T I O N D E C L A R A T I O N S
1077 *******************************************************************************
1079 extern int sprintf(char * buf, const char * fmt, ...);
1081 /******************************************************************************
1083 *******************************************************************************
1085 #if CFG_ENABLE_STATISTICS_BUFFERING
1087 IsBufferedStatisticsUsable(
1088 P_ADAPTER_T prAdapter)
1092 if(prAdapter->fgIsStatValid == TRUE &&
1093 (kalGetTimeTick() - prAdapter->rStatUpdateTime) <= CFG_STATISTICS_VALID_CYCLE)
1101 /*----------------------------------------------------------------------------*/
1103 * \brief This routine is called to query the supported physical layer network
1104 * type that can be used by the driver.
1106 * \param[in] prAdapter Pointer to the Adapter structure.
1107 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1109 * \param[in] u4QueryBufferLen The length of the query buffer.
1110 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1111 * bytes written into the query buffer. If the call
1112 * failed due to invalid length of the query buffer,
1113 * returns the amount of storage needed.
1115 * \retval WLAN_STATUS_SUCCESS
1116 * \retval WLAN_STATUS_INVALID_LENGTH
1118 /*----------------------------------------------------------------------------*/
1120 wlanoidQueryNetworkTypesSupported (
1121 IN P_ADAPTER_T prAdapter,
1122 OUT PVOID pvQueryBuffer,
1123 IN UINT_32 u4QueryBufferLen,
1124 OUT PUINT_32 pu4QueryInfoLen
1127 UINT_32 u4NumItem = 0;
1128 ENUM_PARAM_NETWORK_TYPE_T eSupportedNetworks[PARAM_NETWORK_TYPE_NUM];
1129 PPARAM_NETWORK_TYPE_LIST prSupported;
1131 /* The array of all physical layer network subtypes that the driver supports. */
1133 DEBUGFUNC("wlanoidQueryNetworkTypesSupported");
1136 ASSERT(pu4QueryInfoLen);
1137 if (u4QueryBufferLen) {
1138 ASSERT(pvQueryBuffer);
1142 for (u4NumItem = 0; u4NumItem < PARAM_NETWORK_TYPE_NUM ; u4NumItem++) {
1143 eSupportedNetworks[u4NumItem] = 0;
1148 eSupportedNetworks[u4NumItem] = PARAM_NETWORK_TYPE_DS;
1151 eSupportedNetworks[u4NumItem] = PARAM_NETWORK_TYPE_OFDM24;
1155 (UINT_32)OFFSET_OF(PARAM_NETWORK_TYPE_LIST, eNetworkType) +
1156 (u4NumItem * sizeof(ENUM_PARAM_NETWORK_TYPE_T));
1158 if (u4QueryBufferLen < *pu4QueryInfoLen) {
1159 return WLAN_STATUS_INVALID_LENGTH;
1162 prSupported = (PPARAM_NETWORK_TYPE_LIST)pvQueryBuffer;
1163 prSupported->NumberOfItems = u4NumItem;
1164 kalMemCopy(prSupported->eNetworkType,
1166 u4NumItem * sizeof(ENUM_PARAM_NETWORK_TYPE_T));
1168 DBGLOG(REQ, TRACE, ("NDIS supported network type list: %ld\n",
1169 prSupported->NumberOfItems));
1170 DBGLOG_MEM8(REQ, INFO, prSupported, *pu4QueryInfoLen);
1172 return WLAN_STATUS_SUCCESS;
1173 } /* wlanoidQueryNetworkTypesSupported */
1176 /*----------------------------------------------------------------------------*/
1178 * \brief This routine is called to query the current physical layer network
1179 * type used by the driver.
1181 * \param[in] prAdapter Pointer to the Adapter structure.
1182 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1184 * \param[in] u4QueryBufferLen The length of the query buffer.
1185 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1186 * bytes written into the query buffer. If the
1187 * call failed due to invalid length of the query
1188 * buffer, returns the amount of storage needed.
1190 * \retval WLAN_STATUS_SUCCESS
1191 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
1193 /*----------------------------------------------------------------------------*/
1195 wlanoidQueryNetworkTypeInUse (
1196 IN P_ADAPTER_T prAdapter,
1197 OUT PVOID pvQueryBuffer,
1198 IN UINT_32 u4QueryBufferLen,
1199 OUT PUINT_32 pu4QueryInfoLen
1202 // TODO: need to check the OID handler content again!!
1204 ENUM_PARAM_NETWORK_TYPE_T rCurrentNetworkTypeInUse = PARAM_NETWORK_TYPE_OFDM24;
1206 DEBUGFUNC("wlanoidQueryNetworkTypeInUse");
1209 ASSERT(pu4QueryInfoLen);
1210 if (u4QueryBufferLen) {
1211 ASSERT(pvQueryBuffer);
1214 if (u4QueryBufferLen < sizeof(ENUM_PARAM_NETWORK_TYPE_T)) {
1215 *pu4QueryInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
1216 return WLAN_STATUS_BUFFER_TOO_SHORT;
1220 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
1221 rCurrentNetworkTypeInUse =
1222 (ENUM_PARAM_NETWORK_TYPE_T)(prAdapter->rWlanInfo.ucNetworkType);
1225 rCurrentNetworkTypeInUse =
1226 (ENUM_PARAM_NETWORK_TYPE_T)(prAdapter->rWlanInfo.ucNetworkTypeInUse);
1229 *(P_ENUM_PARAM_NETWORK_TYPE_T)pvQueryBuffer = rCurrentNetworkTypeInUse;
1230 *pu4QueryInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
1232 DBGLOG(REQ, TRACE, ("Network type in use: %d\n", rCurrentNetworkTypeInUse));
1234 return WLAN_STATUS_SUCCESS;
1235 } /* wlanoidQueryNetworkTypeInUse */
1238 /*----------------------------------------------------------------------------*/
1240 * \brief This routine is called to set the physical layer network type used
1243 * \param[in] pvAdapter Pointer to the Adapter structure.
1244 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
1245 * \param[in] u4SetBufferLen The length of the set buffer.
1246 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1247 * bytes read from the set buffer. If the call failed
1248 * due to invalid length of the set buffer, returns the
1249 * amount of storage needed.
1251 * \retval WLAN_STATUS_SUCCESS The given network type is supported and accepted.
1252 * \retval WLAN_STATUS_INVALID_DATA The given network type is not in the
1255 /*----------------------------------------------------------------------------*/
1257 wlanoidSetNetworkTypeInUse (
1258 IN P_ADAPTER_T prAdapter,
1259 IN PVOID pvSetBuffer,
1260 IN UINT_32 u4SetBufferLen,
1261 OUT PUINT_32 pu4SetInfoLen
1264 // TODO: need to check the OID handler content again!!
1266 ENUM_PARAM_NETWORK_TYPE_T eNewNetworkType;
1267 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1268 DEBUGFUNC("wlanoidSetNetworkTypeInUse");
1271 ASSERT(pvSetBuffer);
1272 ASSERT(pu4SetInfoLen);
1274 if (u4SetBufferLen < sizeof(ENUM_PARAM_NETWORK_TYPE_T)) {
1275 *pu4SetInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
1276 return WLAN_STATUS_INVALID_LENGTH;
1279 eNewNetworkType = *(P_ENUM_PARAM_NETWORK_TYPE_T)pvSetBuffer;
1280 *pu4SetInfoLen = sizeof(ENUM_PARAM_NETWORK_TYPE_T);
1284 ("New network type: %d mode\n", eNewNetworkType));
1286 switch (eNewNetworkType) {
1288 case PARAM_NETWORK_TYPE_DS:
1289 prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_DS;
1292 case PARAM_NETWORK_TYPE_OFDM5:
1293 prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_OFDM5;
1296 case PARAM_NETWORK_TYPE_OFDM24:
1297 prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_OFDM24;
1300 case PARAM_NETWORK_TYPE_AUTOMODE:
1301 prAdapter->rWlanInfo.ucNetworkTypeInUse = (UINT_8) PARAM_NETWORK_TYPE_AUTOMODE;
1304 case PARAM_NETWORK_TYPE_FH:
1305 DBGLOG(REQ, INFO, ("Not support network type: %d\n", eNewNetworkType));
1306 rStatus = WLAN_STATUS_NOT_SUPPORTED;
1310 DBGLOG(REQ, INFO, ("Unknown network type: %d\n", eNewNetworkType));
1311 rStatus = WLAN_STATUS_INVALID_DATA;
1315 /* Verify if we support the new network type. */
1316 if (rStatus != WLAN_STATUS_SUCCESS) {
1317 DBGLOG(REQ, WARN, ("Unknown network type: %d\n", eNewNetworkType));
1321 } /* wlanoidSetNetworkTypeInUse */
1324 /*----------------------------------------------------------------------------*/
1326 * \brief This routine is called to query the current BSSID.
1328 * \param[in] prAdapter Pointer to the Adapter structure.
1329 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1331 * \param[in] u4QueryBufferLen The length of the query buffer.
1332 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1333 * bytes written into the query buffer. If the call
1334 * failed due to invalid length of the query buffer,
1335 * returns the amount of storage needed.
1337 * \retval WLAN_STATUS_SUCCESS
1338 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1340 /*----------------------------------------------------------------------------*/
1343 IN P_ADAPTER_T prAdapter,
1344 OUT PVOID pvQueryBuffer,
1345 IN UINT_32 u4QueryBufferLen,
1346 OUT PUINT_32 pu4QueryInfoLen
1349 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1351 DEBUGFUNC("wlanoidQueryBssid");
1355 if (u4QueryBufferLen < MAC_ADDR_LEN) {
1356 ASSERT(pu4QueryInfoLen);
1357 *pu4QueryInfoLen = MAC_ADDR_LEN;
1358 return WLAN_STATUS_BUFFER_TOO_SHORT;
1361 ASSERT(u4QueryBufferLen >= MAC_ADDR_LEN);
1362 if (u4QueryBufferLen) {
1363 ASSERT(pvQueryBuffer);
1365 ASSERT(pu4QueryInfoLen);
1367 if(kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
1368 kalMemCopy(pvQueryBuffer, prAdapter->rWlanInfo.rCurrBssId.arMacAddress, MAC_ADDR_LEN);
1370 else if(prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS) {
1371 PARAM_MAC_ADDRESS aucTemp; /*!< BSSID */
1372 COPY_MAC_ADDR(aucTemp, prAdapter->rWlanInfo.rCurrBssId.arMacAddress);
1373 aucTemp[0] &= ~BIT(0);
1374 aucTemp[1] |= BIT(1);
1375 COPY_MAC_ADDR(pvQueryBuffer, aucTemp);
1378 rStatus = WLAN_STATUS_ADAPTER_NOT_READY;
1381 *pu4QueryInfoLen = MAC_ADDR_LEN;
1383 } /* wlanoidQueryBssid */
1387 /*----------------------------------------------------------------------------*/
1389 * \brief This routine is called to query the list of all BSSIDs detected by
1392 * \param[in] prAdapter Pointer to the Adapter structure.
1393 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1395 * \param[in] u4QueryBufferLen The length of the query buffer.
1396 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1397 * bytes written into the query buffer. If the call
1398 * failed due to invalid length of the query buffer,
1399 * returns the amount of storage needed.
1401 * \retval WLAN_STATUS_SUCCESS
1402 * \retval WLAN_STATUS_INVALID_LENGTH
1403 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1405 /*----------------------------------------------------------------------------*/
1407 wlanoidQueryBssidList (
1408 IN P_ADAPTER_T prAdapter,
1409 OUT PVOID pvQueryBuffer,
1410 IN UINT_32 u4QueryBufferLen,
1411 OUT PUINT_32 pu4QueryInfoLen
1414 P_GLUE_INFO_T prGlueInfo;
1415 UINT_32 i, u4BssidListExLen;
1416 P_PARAM_BSSID_LIST_EX_T prList;
1417 P_PARAM_BSSID_EX_T prBssidEx;
1420 DEBUGFUNC("wlanoidQueryBssidList");
1423 ASSERT(pu4QueryInfoLen);
1425 if (u4QueryBufferLen) {
1426 ASSERT(pvQueryBuffer);
1428 if(!pvQueryBuffer) {
1429 return WLAN_STATUS_INVALID_DATA;
1433 prGlueInfo = prAdapter->prGlueInfo;
1435 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
1436 DBGLOG(REQ, WARN, ("Fail in qeury BSSID list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
1437 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1438 return WLAN_STATUS_ADAPTER_NOT_READY;
1441 u4BssidListExLen = 0;
1443 if(prAdapter->fgIsRadioOff == FALSE) {
1444 for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) {
1445 u4BssidListExLen += ALIGN_4(prAdapter->rWlanInfo.arScanResult[i].u4Length);
1449 if(u4BssidListExLen) {
1450 u4BssidListExLen += 4; // u4NumberOfItems.
1453 u4BssidListExLen = sizeof(PARAM_BSSID_LIST_EX_T);
1456 *pu4QueryInfoLen = u4BssidListExLen;
1458 if (u4QueryBufferLen < *pu4QueryInfoLen) {
1459 return WLAN_STATUS_INVALID_LENGTH;
1462 /* Clear the buffer */
1463 kalMemZero(pvQueryBuffer, u4BssidListExLen);
1465 prList = (P_PARAM_BSSID_LIST_EX_T) pvQueryBuffer;
1466 cp = (PUINT_8)&prList->arBssid[0];
1468 if(prAdapter->fgIsRadioOff == FALSE && prAdapter->rWlanInfo.u4ScanResultNum > 0) {
1469 // fill up for each entry
1470 for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) {
1471 prBssidEx = (P_PARAM_BSSID_EX_T)cp;
1474 kalMemCopy(prBssidEx,
1475 &(prAdapter->rWlanInfo.arScanResult[i]),
1476 OFFSET_OF(PARAM_BSSID_EX_T, aucIEs));
1478 /*For WHQL test, Rssi should be in range -10 ~ -200 dBm*/
1479 if(prBssidEx->rRssi > PARAM_WHQL_RSSI_MAX_DBM) {
1480 prBssidEx->rRssi = PARAM_WHQL_RSSI_MAX_DBM;
1483 if(prAdapter->rWlanInfo.arScanResult[i].u4IELength > 0) {
1485 kalMemCopy(prBssidEx->aucIEs,
1486 prAdapter->rWlanInfo.apucScanResultIEs[i],
1487 prAdapter->rWlanInfo.arScanResult[i].u4IELength);
1490 // 4-bytes alignement
1491 prBssidEx->u4Length = ALIGN_4(prBssidEx->u4Length);
1493 cp += prBssidEx->u4Length;
1494 prList->u4NumberOfItems++;
1498 return WLAN_STATUS_SUCCESS;
1499 } /* wlanoidQueryBssidList */
1502 /*----------------------------------------------------------------------------*/
1504 * \brief This routine is called to request the driver to perform
1507 * \param[in] prAdapter Pointer to the Adapter structure.
1508 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1509 * \param[in] u4SetBufferLen The length of the set buffer.
1510 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1511 * bytes read from the set buffer. If the call failed
1512 * due to invalid length of the set buffer, returns
1513 * the amount of storage needed.
1515 * \retval WLAN_STATUS_SUCCESS
1516 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1517 * \retval WLAN_STATUS_FAILURE
1519 /*----------------------------------------------------------------------------*/
1521 wlanoidSetBssidListScan (
1522 IN P_ADAPTER_T prAdapter,
1523 IN PVOID pvSetBuffer,
1524 IN UINT_32 u4SetBufferLen,
1525 OUT PUINT_32 pu4SetInfoLen
1528 P_PARAM_SSID_T prSsid;
1531 DEBUGFUNC("wlanoidSetBssidListScan()");
1533 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
1534 DBGLOG(REQ, WARN, ("Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
1535 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1536 return WLAN_STATUS_ADAPTER_NOT_READY;
1539 ASSERT(pu4SetInfoLen);
1542 if (prAdapter->fgIsRadioOff) {
1543 DBGLOG(REQ, WARN, ("Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
1544 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1545 return WLAN_STATUS_SUCCESS;
1548 if(pvSetBuffer != NULL && u4SetBufferLen != 0) {
1549 COPY_SSID(rSsid.aucSsid,
1559 #if CFG_SUPPORT_RDD_TEST_MODE
1560 if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
1561 if((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)){
1562 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED){
1563 aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
1570 if(prAdapter->fgEnOnlineScan == TRUE) {
1571 aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
1573 else if(kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
1574 aisFsmScanRequest(prAdapter, prSsid, NULL, 0);
1578 return WLAN_STATUS_SUCCESS;
1579 } /* wlanoidSetBssidListScan */
1582 /*----------------------------------------------------------------------------*/
1584 * \brief This routine is called to request the driver to perform
1585 * scanning with attaching information elements(IEs) specified from user space
1587 * \param[in] prAdapter Pointer to the Adapter structure.
1588 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1589 * \param[in] u4SetBufferLen The length of the set buffer.
1590 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1591 * bytes read from the set buffer. If the call failed
1592 * due to invalid length of the set buffer, returns
1593 * the amount of storage needed.
1595 * \retval WLAN_STATUS_SUCCESS
1596 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1597 * \retval WLAN_STATUS_FAILURE
1599 /*----------------------------------------------------------------------------*/
1601 wlanoidSetBssidListScanExt (
1602 IN P_ADAPTER_T prAdapter,
1603 IN PVOID pvSetBuffer,
1604 IN UINT_32 u4SetBufferLen,
1605 OUT PUINT_32 pu4SetInfoLen
1608 P_PARAM_SCAN_REQUEST_EXT_T prScanRequest;
1609 P_PARAM_SSID_T prSsid;
1613 DEBUGFUNC("wlanoidSetBssidListScanExt()");
1615 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
1616 DBGLOG(REQ, WARN, ("Fail in set BSSID list scan! (Adapter not ready). ACPI=D%d, Radio=%d\n",
1617 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1618 return WLAN_STATUS_ADAPTER_NOT_READY;
1621 ASSERT(pu4SetInfoLen);
1624 if(u4SetBufferLen != sizeof(PARAM_SCAN_REQUEST_EXT_T)) {
1625 return WLAN_STATUS_INVALID_LENGTH;
1628 if (prAdapter->fgIsRadioOff) {
1629 DBGLOG(REQ, WARN, ("Return from BSSID list scan! (radio off). ACPI=D%d, Radio=%d\n",
1630 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1631 return WLAN_STATUS_SUCCESS;
1634 if(pvSetBuffer != NULL && u4SetBufferLen != 0) {
1635 prScanRequest = (P_PARAM_SCAN_REQUEST_EXT_T)pvSetBuffer;
1636 prSsid = &(prScanRequest->rSsid);
1637 pucIe = prScanRequest->pucIE;
1638 u4IeLength = prScanRequest->u4IELength;
1641 prScanRequest = NULL;
1647 #if CFG_SUPPORT_RDD_TEST_MODE
1648 if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
1649 if((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)){
1650 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED){
1651 aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
1658 if(prAdapter->fgEnOnlineScan == TRUE) {
1659 aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
1661 else if(kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
1662 aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
1666 return WLAN_STATUS_SUCCESS;
1667 } /* wlanoidSetBssidListScanWithIE */
1671 /*----------------------------------------------------------------------------*/
1673 * \brief This routine will initiate the join procedure to attempt to associate
1674 * with the specified BSSID.
1676 * \param[in] pvAdapter Pointer to the Adapter structure.
1677 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
1678 * \param[in] u4SetBufferLen The length of the set buffer.
1679 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1680 * bytes read from the set buffer. If the call failed
1681 * due to invalid length of the set buffer, returns
1682 * the amount of storage needed.
1684 * \retval WLAN_STATUS_SUCCESS
1685 * \retval WLAN_STATUS_INVALID_LENGTH
1686 * \retval WLAN_STATUS_INVALID_DATA
1687 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1689 /*----------------------------------------------------------------------------*/
1692 IN P_ADAPTER_T prAdapter,
1693 IN PVOID pvSetBuffer,
1694 IN UINT_32 u4SetBufferLen,
1695 OUT PUINT_32 pu4SetInfoLen
1698 P_GLUE_INFO_T prGlueInfo;
1702 P_MSG_AIS_ABORT_T prAisAbortMsg;
1705 ASSERT(pu4SetInfoLen);
1707 *pu4SetInfoLen = MAC_ADDR_LEN;;
1708 if (u4SetBufferLen != MAC_ADDR_LEN){
1709 *pu4SetInfoLen = MAC_ADDR_LEN;
1710 return WLAN_STATUS_INVALID_LENGTH;
1712 else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
1713 DBGLOG(REQ, WARN, ("Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
1714 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1715 return WLAN_STATUS_ADAPTER_NOT_READY;
1718 prGlueInfo = prAdapter->prGlueInfo;
1719 pAddr = (P_UINT_8)pvSetBuffer;
1721 // re-association check
1722 if(kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
1723 if(EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pAddr)) {
1724 kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
1727 kalIndicateStatusAndComplete(prGlueInfo,
1728 WLAN_STATUS_MEDIA_DISCONNECT,
1734 // check if any scanned result matchs with the BSSID
1735 for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) {
1736 if(EQUAL_MAC_ADDR(prAdapter->rWlanInfo.arScanResult[i].arMacAddress, pAddr)) {
1742 /* prepare message to AIS */
1743 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
1744 || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
1745 /* IBSS */ /* beacon period */
1746 prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
1747 prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
1750 /* Set Connection Request Issued Flag */
1751 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
1752 prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_BSSID;
1754 /* Send AIS Abort Message */
1755 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
1756 if (!prAisAbortMsg) {
1758 return WLAN_STATUS_FAILURE;
1761 prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
1762 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
1764 if (EQUAL_MAC_ADDR(prAdapter->rWifiVar.rConnSettings.aucBSSID, pAddr)) {
1765 prAisAbortMsg->fgDelayIndication = TRUE;
1768 /* Update the information to CONNECTION_SETTINGS_T */
1769 prAdapter->rWifiVar.rConnSettings.ucSSIDLen = 0;
1770 prAdapter->rWifiVar.rConnSettings.aucSSID[0] = '\0';
1772 COPY_MAC_ADDR(prAdapter->rWifiVar.rConnSettings.aucBSSID, pAddr);
1773 prAisAbortMsg->fgDelayIndication = FALSE;
1776 mboxSendMsg(prAdapter,
1778 (P_MSG_HDR_T) prAisAbortMsg,
1779 MSG_SEND_METHOD_BUF);
1781 return WLAN_STATUS_SUCCESS;
1782 } /* end of wlanoidSetBssid() */
1785 /*----------------------------------------------------------------------------*/
1787 * \brief This routine will initiate the join procedure to attempt
1788 * to associate with the new SSID. If the previous scanning
1789 * result is aged, we will scan the channels at first.
1791 * \param[in] prAdapter Pointer to the Adapter structure.
1792 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1793 * \param[in] u4SetBufferLen The length of the set buffer.
1794 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1795 * bytes read from the set buffer. If the call failed
1796 * due to invalid length of the set buffer, returns
1797 * the amount of storage needed.
1799 * \retval WLAN_STATUS_SUCCESS
1800 * \retval WLAN_STATUS_INVALID_DATA
1801 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1802 * \retval WLAN_STATUS_INVALID_LENGTH
1804 /*----------------------------------------------------------------------------*/
1807 IN P_ADAPTER_T prAdapter,
1808 IN PVOID pvSetBuffer,
1809 IN UINT_32 u4SetBufferLen,
1810 OUT PUINT_32 pu4SetInfoLen
1813 P_GLUE_INFO_T prGlueInfo;
1814 P_PARAM_SSID_T pParamSsid;
1816 INT_32 i4Idx = -1, i4MaxRSSI = INT_MIN;
1817 P_MSG_AIS_ABORT_T prAisAbortMsg;
1818 BOOLEAN fgIsValidSsid = TRUE;
1821 ASSERT(pu4SetInfoLen);
1824 * Powering on the radio if the radio is powered off through a setting of OID_802_11_DISASSOCIATE
1826 if(prAdapter->fgIsRadioOff == TRUE) {
1827 prAdapter->fgIsRadioOff = FALSE;
1830 if(u4SetBufferLen < sizeof(PARAM_SSID_T) || u4SetBufferLen > sizeof(PARAM_SSID_T)) {
1831 return WLAN_STATUS_INVALID_LENGTH;
1833 else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
1834 DBGLOG(REQ, WARN, ("Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
1835 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1836 return WLAN_STATUS_ADAPTER_NOT_READY;
1839 pParamSsid = (P_PARAM_SSID_T) pvSetBuffer;
1841 if (pParamSsid->u4SsidLen > 32) {
1842 return WLAN_STATUS_INVALID_LENGTH;
1845 prGlueInfo = prAdapter->prGlueInfo;
1847 // prepare for CMD_BUILD_CONNECTION & CMD_GET_CONNECTION_STATUS
1848 // re-association check
1849 if(kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
1850 if(EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
1851 prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen,
1852 pParamSsid->aucSsid,
1853 pParamSsid->u4SsidLen)) {
1854 kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
1857 kalIndicateStatusAndComplete(prGlueInfo,
1858 WLAN_STATUS_MEDIA_DISCONNECT,
1864 // check if any scanned result matchs with the SSID
1865 for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) {
1866 PUINT_8 aucSsid = prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid;
1867 UINT_8 ucSsidLength = (UINT_8) prAdapter->rWlanInfo.arScanResult[i].rSsid.u4SsidLen;
1868 INT_32 i4RSSI = prAdapter->rWlanInfo.arScanResult[i].rRssi;
1870 if(EQUAL_SSID(aucSsid, ucSsidLength, pParamSsid->aucSsid, pParamSsid->u4SsidLen) &&
1871 i4RSSI >= i4MaxRSSI) {
1877 /* prepare message to AIS */
1878 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
1879 || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
1880 /* IBSS */ /* beacon period */
1881 prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
1882 prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
1885 if (prAdapter->rWifiVar.fgSupportWZCDisassociation) {
1886 if (pParamSsid->u4SsidLen == ELEM_MAX_LEN_SSID) {
1887 fgIsValidSsid = FALSE;
1889 for (i = 0; i < ELEM_MAX_LEN_SSID; i++) {
1890 if ( !((0 < pParamSsid->aucSsid[i]) && (pParamSsid->aucSsid[i] <= 0x1F)) ) {
1891 fgIsValidSsid = TRUE;
1898 /* Set Connection Request Issued Flag */
1899 if (fgIsValidSsid) {
1900 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
1902 if(pParamSsid->u4SsidLen) {
1903 prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1907 prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_ANY;
1911 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
1914 /* Send AIS Abort Message */
1915 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
1916 if (!prAisAbortMsg) {
1918 return WLAN_STATUS_FAILURE;
1921 prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
1922 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
1924 if (EQUAL_SSID(prAdapter->rWifiVar.rConnSettings.aucSSID,
1925 prAdapter->rWifiVar.rConnSettings.ucSSIDLen,
1926 pParamSsid->aucSsid,
1927 pParamSsid->u4SsidLen)) {
1928 prAisAbortMsg->fgDelayIndication = TRUE;
1931 /* Update the information to CONNECTION_SETTINGS_T */
1932 COPY_SSID(prAdapter->rWifiVar.rConnSettings.aucSSID,
1933 prAdapter->rWifiVar.rConnSettings.ucSSIDLen,
1934 pParamSsid->aucSsid,
1935 (UINT_8)pParamSsid->u4SsidLen);
1937 prAisAbortMsg->fgDelayIndication = FALSE;
1939 DBGLOG(SCN, INFO, ("SSID %s\n", prAdapter->rWifiVar.rConnSettings.aucSSID));
1941 mboxSendMsg(prAdapter,
1943 (P_MSG_HDR_T) prAisAbortMsg,
1944 MSG_SEND_METHOD_BUF);
1946 return WLAN_STATUS_SUCCESS;
1948 } /* end of wlanoidSetSsid() */
1951 /*----------------------------------------------------------------------------*/
1953 * \brief This routine is called to query the currently associated SSID.
1955 * \param[in] prAdapter Pointer to the Adapter structure.
1956 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
1958 * \param[in] u4QueryBufferLen The length of the query buffer.
1959 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1960 * bytes written into the query buffer. If the call
1961 * failed due to invalid length of the query buffer,
1962 * returns the amount of storage needed.
1964 * \retval WLAN_STATUS_SUCCESS
1965 * \retval WLAN_STATUS_INVALID_LENGTH
1967 /*----------------------------------------------------------------------------*/
1970 IN P_ADAPTER_T prAdapter,
1971 OUT PVOID pvQueryBuffer,
1972 IN UINT_32 u4QueryBufferLen,
1973 OUT PUINT_32 pu4QueryInfoLen
1976 P_PARAM_SSID_T prAssociatedSsid;
1978 DEBUGFUNC("wlanoidQuerySsid");
1981 ASSERT(pu4QueryInfoLen);
1983 if (u4QueryBufferLen) {
1984 ASSERT(pvQueryBuffer);
1987 *pu4QueryInfoLen = sizeof(PARAM_SSID_T);
1989 /* Check for query buffer length */
1990 if (u4QueryBufferLen < *pu4QueryInfoLen) {
1991 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
1992 return WLAN_STATUS_INVALID_LENGTH;
1995 prAssociatedSsid = (P_PARAM_SSID_T)pvQueryBuffer;
1997 kalMemZero(prAssociatedSsid->aucSsid, sizeof(prAssociatedSsid->aucSsid));
1999 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
2000 prAssociatedSsid->u4SsidLen = prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen;
2002 if (prAssociatedSsid->u4SsidLen) {
2003 kalMemCopy(prAssociatedSsid->aucSsid,
2004 prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
2005 prAssociatedSsid->u4SsidLen);
2009 prAssociatedSsid->u4SsidLen = 0;
2011 DBGLOG(REQ, TRACE, ("Null SSID\n"));
2014 return WLAN_STATUS_SUCCESS;
2015 } /* wlanoidQuerySsid */
2018 /*----------------------------------------------------------------------------*/
2020 * \brief This routine is called to query the current 802.11 network type.
2022 * \param[in] prAdapter Pointer to the Adapter structure.
2023 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
2025 * \param[in] u4QueryBufferLen The length of the query buffer.
2026 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
2027 * bytes written into the query buffer. If the call
2028 * failed due to invalid length of the query buffer,
2029 * returns the amount of storage needed.
2031 * \retval WLAN_STATUS_SUCCESS
2032 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2034 /*----------------------------------------------------------------------------*/
2036 wlanoidQueryInfrastructureMode (
2037 IN P_ADAPTER_T prAdapter,
2038 OUT PVOID pvQueryBuffer,
2039 IN UINT_32 u4QueryBufferLen,
2040 OUT PUINT_32 pu4QueryInfoLen
2043 DEBUGFUNC("wlanoidQueryInfrastructureMode");
2046 ASSERT(pu4QueryInfoLen);
2048 *pu4QueryInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
2050 if (u4QueryBufferLen < sizeof(ENUM_PARAM_OP_MODE_T)) {
2051 return WLAN_STATUS_BUFFER_TOO_SHORT;
2054 if (u4QueryBufferLen) {
2055 ASSERT(pvQueryBuffer);
2058 *(P_ENUM_PARAM_OP_MODE_T)pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eOPMode;
2061 ** According to OID_802_11_INFRASTRUCTURE_MODE
2062 ** If there is no prior OID_802_11_INFRASTRUCTURE_MODE,
2063 ** NDIS_STATUS_ADAPTER_NOT_READY shall be returned.
2066 switch (*(P_ENUM_PARAM_OP_MODE_T)pvQueryBuffer) {
2068 DBGLOG(REQ, INFO, ("IBSS mode\n"));
2070 case NET_TYPE_INFRA:
2071 DBGLOG(REQ, INFO, ("Infrastructure mode\n"));
2074 DBGLOG(REQ, INFO, ("Automatic mode\n"));
2078 return WLAN_STATUS_SUCCESS;
2079 } /* wlanoidQueryInfrastructureMode */
2082 /*----------------------------------------------------------------------------*/
2084 * \brief This routine is called to set mode to infrastructure or
2085 * IBSS, or automatic switch between the two.
2087 * \param[in] prAdapter Pointer to the Adapter structure.
2088 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
2089 * \param[in] u4SetBufferLen The length of the set buffer.
2090 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2091 * bytes read from the set buffer. If the call failed due to invalid
2092 * length of the set buffer, returns the amount of storage needed.
2094 * \retval WLAN_STATUS_SUCCESS
2095 * \retval WLAN_STATUS_INVALID_DATA
2096 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2097 * \retval WLAN_STATUS_INVALID_LENGTH
2099 /*----------------------------------------------------------------------------*/
2101 wlanoidSetInfrastructureMode (
2102 IN P_ADAPTER_T prAdapter,
2103 IN PVOID pvSetBuffer,
2104 IN UINT_32 u4SetBufferLen,
2105 OUT PUINT_32 pu4SetInfoLen
2108 P_GLUE_INFO_T prGlueInfo;
2109 ENUM_PARAM_OP_MODE_T eOpMode;
2111 DEBUGFUNC("wlanoidSetInfrastructureMode");
2114 ASSERT(pvSetBuffer);
2115 ASSERT(pu4SetInfoLen);
2117 prGlueInfo = prAdapter->prGlueInfo;
2119 if (u4SetBufferLen < sizeof(ENUM_PARAM_OP_MODE_T))
2120 return WLAN_STATUS_BUFFER_TOO_SHORT;
2122 *pu4SetInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
2125 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2126 DBGLOG(REQ, WARN, ("Fail in set infrastructure mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2127 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2128 return WLAN_STATUS_ADAPTER_NOT_READY;
2131 eOpMode = *(P_ENUM_PARAM_OP_MODE_T)pvSetBuffer;
2132 /* Verify the new infrastructure mode. */
2133 if (eOpMode >= NET_TYPE_NUM) {
2134 DBGLOG(REQ, TRACE, ("Invalid mode value %d\n", eOpMode));
2135 return WLAN_STATUS_INVALID_DATA;
2138 /* check if possible to switch to AdHoc mode */
2139 if(eOpMode == NET_TYPE_IBSS || eOpMode == NET_TYPE_DEDICATED_IBSS) {
2140 if(cnmAisIbssIsPermitted(prAdapter) == FALSE) {
2141 DBGLOG(REQ, TRACE, ("Mode value %d unallowed\n", eOpMode));
2142 return WLAN_STATUS_FAILURE;
2146 /* Save the new infrastructure mode setting. */
2147 prAdapter->rWifiVar.rConnSettings.eOPMode = eOpMode;
2149 /* Clean up the Tx key flag */
2150 prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = FALSE;
2152 prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
2153 #if CFG_SUPPORT_WAPI
2154 prAdapter->prGlueInfo->u2WapiAssocInfoIESz = 0;
2155 kalMemZero(&prAdapter->prGlueInfo->aucWapiAssocInfoIEs, 42);
2158 #if CFG_SUPPORT_802_11W
2159 prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = FALSE;
2160 prAdapter->rWifiVar.rAisSpecificBssInfo.fgBipKeyInstalled = FALSE;
2163 #if CFG_SUPPORT_WPS2
2164 kalMemZero(&prAdapter->prGlueInfo->aucWSCAssocInfoIE, 200);
2165 prAdapter->prGlueInfo->u2WSCAssocInfoIELen = 0;
2168 return wlanSendSetQueryCmd(prAdapter,
2169 CMD_ID_INFRASTRUCTURE,
2173 nicCmdEventSetCommon,
2174 nicOidCmdTimeoutCommon,
2181 } /* wlanoidSetInfrastructureMode */
2184 /*----------------------------------------------------------------------------*/
2186 * \brief This routine is called to query the current 802.11 authentication
2189 * \param[in] prAdapter Pointer to the Adapter structure.
2190 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
2192 * \param[in] u4QueryBufferLen The length of the query buffer.
2193 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
2194 * bytes written into the query buffer. If the call
2195 * failed due to invalid length of the query buffer,
2196 * returns the amount of storage needed.
2198 * \retval WLAN_STATUS_SUCCESS
2199 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2201 /*----------------------------------------------------------------------------*/
2203 wlanoidQueryAuthMode (
2204 IN P_ADAPTER_T prAdapter,
2205 OUT PVOID pvQueryBuffer,
2206 IN UINT_32 u4QueryBufferLen,
2207 OUT PUINT_32 pu4QueryInfoLen
2210 DEBUGFUNC("wlanoidQueryAuthMode");
2213 if (u4QueryBufferLen) {
2214 ASSERT(pvQueryBuffer);
2216 ASSERT(pu4QueryInfoLen);
2218 *pu4QueryInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
2220 if (u4QueryBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T)) {
2221 return WLAN_STATUS_BUFFER_TOO_SHORT;
2224 *(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eAuthMode;
2227 switch (*(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer) {
2228 case AUTH_MODE_OPEN:
2229 DBGLOG(REQ, INFO, ("Current auth mode: Open\n"));
2232 case AUTH_MODE_SHARED:
2233 DBGLOG(REQ, INFO, ("Current auth mode: Shared\n"));
2236 case AUTH_MODE_AUTO_SWITCH:
2237 DBGLOG(REQ, INFO, ("Current auth mode: Auto-switch\n"));
2241 DBGLOG(REQ, INFO, ("Current auth mode: WPA\n"));
2244 case AUTH_MODE_WPA_PSK:
2245 DBGLOG(REQ, INFO, ("Current auth mode: WPA PSK\n"));
2248 case AUTH_MODE_WPA_NONE:
2249 DBGLOG(REQ, INFO, ("Current auth mode: WPA None\n"));
2252 case AUTH_MODE_WPA2:
2253 DBGLOG(REQ, INFO, ("Current auth mode: WPA2\n"));
2256 case AUTH_MODE_WPA2_PSK:
2257 DBGLOG(REQ, INFO, ("Current auth mode: WPA2 PSK\n"));
2261 DBGLOG(REQ, INFO, ("Current auth mode: %d\n",
2262 *(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer));
2265 return WLAN_STATUS_SUCCESS;
2266 } /* wlanoidQueryAuthMode */
2269 /*----------------------------------------------------------------------------*/
2271 * \brief This routine is called to set the IEEE 802.11 authentication mode
2274 * \param[in] prAdapter Pointer to the Adapter structure.
2275 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2276 * \param[in] u4SetBufferLen The length of the set buffer.
2277 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2278 * bytes read from the set buffer. If the call failed
2279 * due to invalid length of the set buffer, returns
2280 * the amount of storage needed.
2282 * \retval WLAN_STATUS_SUCCESS
2283 * \retval WLAN_STATUS_INVALID_DATA
2284 * \retval WLAN_STATUS_INVALID_LENGTH
2285 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2286 * \retval WLAN_STATUS_NOT_ACCEPTED
2288 /*----------------------------------------------------------------------------*/
2290 wlanoidSetAuthMode (
2291 IN P_ADAPTER_T prAdapter,
2292 IN PVOID pvSetBuffer,
2293 IN UINT_32 u4SetBufferLen,
2294 OUT PUINT_32 pu4SetInfoLen
2297 P_GLUE_INFO_T prGlueInfo;
2298 UINT_32 i, u4AkmSuite;
2299 P_DOT11_RSNA_CONFIG_AUTHENTICATION_SUITES_ENTRY prEntry;
2301 DEBUGFUNC("wlanoidSetAuthMode");
2304 ASSERT(pu4SetInfoLen);
2305 ASSERT(pvSetBuffer);
2307 prGlueInfo = prAdapter->prGlueInfo;
2309 *pu4SetInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
2311 if (u4SetBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T)) {
2312 return WLAN_STATUS_INVALID_LENGTH;
2316 //if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
2317 // return WLAN_STATUS_SUCCESS;
2320 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2321 DBGLOG(REQ, WARN, ("Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2322 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2323 return WLAN_STATUS_ADAPTER_NOT_READY;
2326 /* Check if the new authentication mode is valid. */
2327 if (*(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer >= AUTH_MODE_NUM) {
2328 DBGLOG(REQ, TRACE, ("Invalid auth mode %d\n",
2329 *(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer));
2330 return WLAN_STATUS_INVALID_DATA;
2333 switch (*(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer) {
2335 case AUTH_MODE_WPA_PSK:
2336 case AUTH_MODE_WPA2:
2337 case AUTH_MODE_WPA2_PSK:
2338 /* infrastructure mode only */
2339 if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_INFRA) {
2340 return WLAN_STATUS_NOT_ACCEPTED;
2344 case AUTH_MODE_WPA_NONE:
2345 /* ad hoc mode only */
2346 if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_IBSS) {
2347 return WLAN_STATUS_NOT_ACCEPTED;
2355 /* Save the new authentication mode. */
2356 prAdapter->rWifiVar.rConnSettings.eAuthMode = *(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer;
2359 switch (prAdapter->rWifiVar.rConnSettings.eAuthMode) {
2360 case AUTH_MODE_OPEN:
2361 DBGLOG(RSN, TRACE, ("New auth mode: open\n"));
2364 case AUTH_MODE_SHARED:
2365 DBGLOG(RSN, TRACE, ("New auth mode: shared\n"));
2368 case AUTH_MODE_AUTO_SWITCH:
2369 DBGLOG(RSN, TRACE, ("New auth mode: auto-switch\n"));
2373 DBGLOG(RSN, TRACE, ("New auth mode: WPA\n"));
2376 case AUTH_MODE_WPA_PSK:
2377 DBGLOG(RSN, TRACE, ("New auth mode: WPA PSK\n"));
2380 case AUTH_MODE_WPA_NONE:
2381 DBGLOG(RSN, TRACE, ("New auth mode: WPA None\n"));
2384 case AUTH_MODE_WPA2:
2385 DBGLOG(RSN, TRACE, ("New auth mode: WPA2\n"));
2388 case AUTH_MODE_WPA2_PSK:
2389 DBGLOG(RSN, TRACE, ("New auth mode: WPA2 PSK\n"));
2393 DBGLOG(RSN, TRACE, ("New auth mode: unknown (%d)\n",
2394 prAdapter->rWifiVar.rConnSettings.eAuthMode));
2398 if (prAdapter->rWifiVar.rConnSettings.eAuthMode >= AUTH_MODE_WPA) {
2399 switch(prAdapter->rWifiVar.rConnSettings.eAuthMode) {
2401 u4AkmSuite = WPA_AKM_SUITE_802_1X;
2404 case AUTH_MODE_WPA_PSK:
2405 u4AkmSuite = WPA_AKM_SUITE_PSK;
2408 case AUTH_MODE_WPA_NONE:
2409 u4AkmSuite = WPA_AKM_SUITE_NONE;
2412 case AUTH_MODE_WPA2:
2413 u4AkmSuite = RSN_AKM_SUITE_802_1X;
2416 case AUTH_MODE_WPA2_PSK:
2417 u4AkmSuite = RSN_AKM_SUITE_PSK;
2428 /* Enable the specific AKM suite only. */
2429 for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++) {
2430 prEntry = &prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[i];
2432 if (prEntry->dot11RSNAConfigAuthenticationSuite == u4AkmSuite) {
2433 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
2436 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = FALSE;
2438 #if CFG_SUPPORT_802_11W
2439 if (kalGetMfpSetting(prAdapter->prGlueInfo) != RSN_AUTH_MFP_DISABLED) {
2440 if ((u4AkmSuite == RSN_AKM_SUITE_PSK) &&
2441 prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_PSK_SHA256) {
2442 DBGLOG(RSN, TRACE, ("Enable RSN_AKM_SUITE_PSK_SHA256 AKM support\n"));
2443 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
2446 if ((u4AkmSuite == RSN_AKM_SUITE_802_1X) &&
2447 prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_802_1X_SHA256) {
2448 DBGLOG(RSN, TRACE, ("Enable RSN_AKM_SUITE_802_1X_SHA256 AKM support\n"));
2449 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
2456 return WLAN_STATUS_SUCCESS;
2458 } /* wlanoidSetAuthMode */
2462 /*----------------------------------------------------------------------------*/
2464 * \brief This routine is called to query the current 802.11 privacy filter
2466 * \param[in] prAdapter Pointer to the Adapter structure.
2467 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
2469 * \param[in] u4QueryBufferLen The length of the query buffer.
2470 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
2471 * bytes written into the query buffer. If the call
2472 * failed due to invalid length of the query buffer,
2473 * returns the amount of storage needed.
2475 * \retval WLAN_STATUS_SUCCESS
2476 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2478 /*----------------------------------------------------------------------------*/
2480 wlanoidQueryPrivacyFilter (
2481 IN P_ADAPTER_T prAdapter,
2482 OUT PVOID pvQueryBuffer,
2483 IN UINT_32 u4QueryBufferLen,
2484 OUT PUINT_32 pu4QueryInfoLen
2487 DEBUGFUNC("wlanoidQueryPrivacyFilter");
2491 ASSERT(pvQueryBuffer);
2492 ASSERT(pu4QueryInfoLen);
2494 *pu4QueryInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
2496 if (u4QueryBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T)) {
2497 return WLAN_STATUS_BUFFER_TOO_SHORT;
2500 *(P_ENUM_PARAM_PRIVACY_FILTER_T)pvQueryBuffer = prAdapter->rWlanInfo.ePrivacyFilter;
2503 switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T)pvQueryBuffer) {
2504 case PRIVACY_FILTER_ACCEPT_ALL:
2505 DBGLOG(REQ, INFO, ("Current privacy mode: open mode\n"));
2508 case PRIVACY_FILTER_8021xWEP:
2509 DBGLOG(REQ, INFO, ("Current privacy mode: filtering mode\n"));
2513 DBGLOG(REQ, INFO, ("Current auth mode: %d\n",
2514 *(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer));
2517 return WLAN_STATUS_SUCCESS;
2518 } /* wlanoidQueryPrivacyFilter */
2521 /*----------------------------------------------------------------------------*/
2523 * \brief This routine is called to set the IEEE 802.11 privacy filter
2526 * \param[in] prAdapter Pointer to the Adapter structure.
2527 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2528 * \param[in] u4SetBufferLen The length of the set buffer.
2529 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2530 * bytes read from the set buffer. If the call failed
2531 * due to invalid length of the set buffer, returns
2532 * the amount of storage needed.
2534 * \retval WLAN_STATUS_SUCCESS
2535 * \retval WLAN_STATUS_INVALID_DATA
2536 * \retval WLAN_STATUS_INVALID_LENGTH
2537 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2538 * \retval WLAN_STATUS_NOT_ACCEPTED
2540 /*----------------------------------------------------------------------------*/
2542 wlanoidSetPrivacyFilter (
2543 IN P_ADAPTER_T prAdapter,
2544 IN PVOID pvSetBuffer,
2545 IN UINT_32 u4SetBufferLen,
2546 OUT PUINT_32 pu4SetInfoLen
2549 P_GLUE_INFO_T prGlueInfo;
2551 DEBUGFUNC("wlanoidSetPrivacyFilter");
2554 ASSERT(pu4SetInfoLen);
2555 ASSERT(pvSetBuffer);
2557 prGlueInfo = prAdapter->prGlueInfo;
2559 *pu4SetInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
2561 if (u4SetBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T)) {
2562 return WLAN_STATUS_INVALID_LENGTH;
2565 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2566 DBGLOG(REQ, WARN, ("Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2567 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2568 return WLAN_STATUS_ADAPTER_NOT_READY;
2571 /* Check if the new authentication mode is valid. */
2572 if (*(P_ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer >= PRIVACY_FILTER_NUM) {
2573 DBGLOG(REQ, TRACE, ("Invalid privacy filter %d\n",
2574 *(P_ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer));
2575 return WLAN_STATUS_INVALID_DATA;
2578 switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer) {
2583 /* Save the new authentication mode. */
2584 prAdapter->rWlanInfo.ePrivacyFilter = *(ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer;
2586 return WLAN_STATUS_SUCCESS;
2588 } /* wlanoidSetPrivacyFilter */
2592 /*----------------------------------------------------------------------------*/
2594 * \brief This routine is called to reload the available default settings for
2595 * the specified type field.
2597 * \param[in] prAdapter Pointer to the Adapter structure.
2598 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2599 * \param[in] u4SetBufferLen The length of the set buffer.
2600 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2601 * bytes read from the set buffer. If the call failed
2602 * due to invalid length of the set buffer, returns
2603 * the amount of storage needed.
2605 * \retval WLAN_STATUS_SUCCESS
2606 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2607 * \retval WLAN_STATUS_INVALID_DATA
2609 /*----------------------------------------------------------------------------*/
2611 wlanoidSetReloadDefaults (
2612 IN P_ADAPTER_T prAdapter,
2613 IN PVOID pvSetBuffer,
2614 IN UINT_32 u4SetBufferLen,
2615 OUT PUINT_32 pu4SetInfoLen
2618 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2619 ENUM_PARAM_NETWORK_TYPE_T eNetworkType;
2624 DEBUGFUNC("wlanoidSetReloadDefaults");
2628 ASSERT(pu4SetInfoLen);
2629 *pu4SetInfoLen = sizeof(PARAM_RELOAD_DEFAULTS);
2631 //if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
2632 // return WLAN_STATUS_SUCCESS;
2635 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2636 DBGLOG(REQ, WARN, ("Fail in set Reload default! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2637 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2638 return WLAN_STATUS_ADAPTER_NOT_READY;
2641 ASSERT(pvSetBuffer);
2642 /* Verify the available reload options and reload the settings. */
2643 switch (*(P_PARAM_RELOAD_DEFAULTS)pvSetBuffer) {
2644 case ENUM_RELOAD_WEP_KEYS:
2645 /* Reload available default WEP keys from the permanent
2647 prAdapter->rWifiVar.rConnSettings.eAuthMode = AUTH_MODE_OPEN;
2648 prAdapter->rWifiVar.rConnSettings.eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;//ENUM_ENCRYPTION_DISABLED;
2650 P_GLUE_INFO_T prGlueInfo;
2651 P_CMD_INFO_T prCmdInfo;
2652 P_WIFI_CMD_T prWifiCmd;
2653 P_CMD_802_11_KEY prCmdKey;
2654 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2656 prGlueInfo = prAdapter->prGlueInfo;
2657 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
2660 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
2661 return WLAN_STATUS_FAILURE;
2663 // increase command sequence number
2664 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
2666 // compose CMD_802_11_KEY cmd pkt
2667 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
2668 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
2669 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
2670 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
2671 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
2672 prCmdInfo->fgIsOid = TRUE;
2673 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
2674 prCmdInfo->fgSetQuery = TRUE;
2675 prCmdInfo->fgNeedResp = FALSE;
2676 prCmdInfo->fgDriverDomainMCR = FALSE;
2677 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
2678 prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
2679 prCmdInfo->pvInformationBuffer = pvSetBuffer;
2680 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
2683 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
2684 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
2685 prWifiCmd->ucCID = prCmdInfo->ucCID;
2686 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
2687 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
2689 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
2691 kalMemZero((PUINT_8)prCmdKey, sizeof(CMD_802_11_KEY));
2693 prCmdKey->ucAddRemove = 0; /* Remove */
2694 prCmdKey->ucKeyId = 0;//(UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff);
2695 kalMemCopy(prCmdKey->aucPeerAddr, aucBCAddr, MAC_ADDR_LEN);
2697 ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM);
2699 prCmdKey->ucKeyType = 0;
2701 // insert into prCmdQueue
2702 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
2704 // wakeup txServiceThread later
2705 GLUE_SET_EVENT(prGlueInfo);
2707 return WLAN_STATUS_PENDING;
2713 DBGLOG(REQ, TRACE, ("Invalid reload option %d\n",
2714 *(P_PARAM_RELOAD_DEFAULTS)pvSetBuffer));
2715 rStatus = WLAN_STATUS_INVALID_DATA;
2718 /* OID_802_11_RELOAD_DEFAULTS requiest to reset to auto mode */
2719 eNetworkType = PARAM_NETWORK_TYPE_AUTOMODE;
2720 wlanoidSetNetworkTypeInUse(prAdapter, &eNetworkType, sizeof(eNetworkType), &u4Len);
2723 } /* wlanoidSetReloadDefaults */
2726 /*----------------------------------------------------------------------------*/
2728 * \brief This routine is called to set a WEP key to the driver.
2730 * \param[in] prAdapter Pointer to the Adapter structure.
2731 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2732 * \param[in] u4SetBufferLen The length of the set buffer.
2733 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2734 * bytes read from the set buffer. If the call failed
2735 * due to invalid length of the set buffer, returns
2736 * the amount of storage needed.
2738 * \retval WLAN_STATUS_SUCCESS
2739 * \retval WLAN_STATUS_INVALID_LENGTH
2740 * \retval WLAN_STATUS_INVALID_DATA
2741 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2742 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2744 /*----------------------------------------------------------------------------*/
2746 UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN*/];
2747 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2751 IN P_ADAPTER_T prAdapter,
2752 IN PVOID pvSetBuffer,
2753 IN UINT_32 u4SetBufferLen,
2754 OUT PUINT_32 pu4SetInfoLen
2758 UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN*/];
2759 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2761 P_PARAM_WEP_T prNewWepKey;
2762 P_PARAM_KEY_T prParamKey = (P_PARAM_KEY_T)keyBuffer;
2763 UINT_32 u4KeyId, u4SetLen;
2765 DEBUGFUNC("wlanoidSetAddWep");
2769 *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
2771 if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial)) {
2772 ASSERT(pu4SetInfoLen);
2773 return WLAN_STATUS_BUFFER_TOO_SHORT;
2776 ASSERT(pvSetBuffer);
2777 ASSERT(pu4SetInfoLen);
2779 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2780 DBGLOG(REQ, WARN, ("Fail in set add WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2781 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2782 return WLAN_STATUS_ADAPTER_NOT_READY;
2785 prNewWepKey = (P_PARAM_WEP_T)pvSetBuffer;
2787 /* Verify the total buffer for minimum length. */
2788 if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial) + prNewWepKey->u4KeyLength) {
2789 DBGLOG(REQ, WARN, ("Invalid total buffer length (%d) than minimum length (%d)\n",
2790 (UINT_8)u4SetBufferLen,
2791 (UINT_8)OFFSET_OF(PARAM_WEP_T, aucKeyMaterial)));
2793 *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
2794 return WLAN_STATUS_INVALID_DATA;
2797 /* Verify the key structure length. */
2798 if (prNewWepKey->u4Length > u4SetBufferLen) {
2799 DBGLOG(REQ, WARN, ("Invalid key structure length (%d) greater than total buffer length (%d)\n",
2800 (UINT_8)prNewWepKey->u4Length,
2801 (UINT_8)u4SetBufferLen));
2803 *pu4SetInfoLen = u4SetBufferLen;
2804 return WLAN_STATUS_INVALID_DATA;
2807 /* Verify the key material length for maximum key material length:16 */
2808 if (prNewWepKey->u4KeyLength > 16 /* LEGACY_KEY_MAX_LEN */) {
2809 DBGLOG(REQ, WARN, ("Invalid key material length (%d) greater than maximum key material length (16)\n",
2810 (UINT_8)prNewWepKey->u4KeyLength));
2812 *pu4SetInfoLen = u4SetBufferLen;
2813 return WLAN_STATUS_INVALID_DATA;
2816 *pu4SetInfoLen = u4SetBufferLen;
2818 u4KeyId = prNewWepKey->u4KeyIndex & BITS(0,29) /* WEP_KEY_ID_FIELD */;
2820 /* Verify whether key index is valid or not, current version
2821 driver support only 4 global WEP keys setting by this OID */
2822 if (u4KeyId > MAX_KEY_NUM - 1) {
2823 DBGLOG(REQ, ERROR, ("Error, invalid WEP key ID: %d\n", (UINT_8)u4KeyId));
2824 return WLAN_STATUS_INVALID_DATA;
2827 prParamKey->u4KeyIndex = u4KeyId;
2830 if (prNewWepKey->u4KeyIndex & IS_TRANSMIT_KEY) {
2831 prParamKey->u4KeyIndex |= IS_TRANSMIT_KEY;
2834 /* Per client key */
2835 if (prNewWepKey->u4KeyIndex & IS_UNICAST_KEY) {
2836 prParamKey->u4KeyIndex |= IS_UNICAST_KEY;
2839 prParamKey->u4KeyLength = prNewWepKey->u4KeyLength;
2841 kalMemCopy(prParamKey->arBSSID, aucBCAddr, MAC_ADDR_LEN);
2843 kalMemCopy(prParamKey->aucKeyMaterial,
2844 prNewWepKey->aucKeyMaterial,
2845 prNewWepKey->u4KeyLength);
2847 prParamKey->u4Length = OFFSET_OF(PARAM_KEY_T, aucKeyMaterial) + prNewWepKey->u4KeyLength;
2849 wlanoidSetAddKey(prAdapter,
2851 prParamKey->u4Length,
2854 return WLAN_STATUS_PENDING;
2855 } /* wlanoidSetAddWep */
2858 /*----------------------------------------------------------------------------*/
2860 * \brief This routine is called to request the driver to remove the WEP key
2861 * at the specified key index.
2863 * \param[in] prAdapter Pointer to the Adapter structure.
2864 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2865 * \param[in] u4SetBufferLen The length of the set buffer.
2866 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2867 * bytes read from the set buffer. If the call failed
2868 * due to invalid length of the set buffer, returns
2869 * the amount of storage needed.
2871 * \retval WLAN_STATUS_SUCCESS
2872 * \retval WLAN_STATUS_INVALID_DATA
2873 * \retval WLAN_STATUS_INVALID_LENGTH
2874 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2876 /*----------------------------------------------------------------------------*/
2878 wlanoidSetRemoveWep (
2879 IN P_ADAPTER_T prAdapter,
2880 IN PVOID pvSetBuffer,
2881 IN UINT_32 u4SetBufferLen,
2882 OUT PUINT_32 pu4SetInfoLen
2885 UINT_32 u4KeyId, u4SetLen;
2886 PARAM_REMOVE_KEY_T rRemoveKey;
2887 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2889 DEBUGFUNC("wlanoidSetRemoveWep");
2892 ASSERT(pu4SetInfoLen);
2894 *pu4SetInfoLen = sizeof(PARAM_KEY_INDEX);
2896 if (u4SetBufferLen < sizeof(PARAM_KEY_INDEX)) {
2897 return WLAN_STATUS_INVALID_LENGTH;
2900 ASSERT(pvSetBuffer);
2901 u4KeyId = *(PUINT_32)pvSetBuffer;
2903 /* Dump PARAM_WEP content. */
2904 DBGLOG(REQ, INFO, ("Set: Dump PARAM_KEY_INDEX content\n"));
2905 DBGLOG(REQ, INFO, ("Index : 0x%08lx\n", u4KeyId));
2907 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2908 DBGLOG(REQ, WARN, ("Fail in set remove WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2909 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2910 return WLAN_STATUS_ADAPTER_NOT_READY;
2913 if (u4KeyId & IS_TRANSMIT_KEY) {
2914 /* Bit 31 should not be set */
2915 DBGLOG(REQ, ERROR, ("Invalid WEP key index: 0x%08lx\n", u4KeyId));
2916 return WLAN_STATUS_INVALID_DATA;
2919 u4KeyId &= BITS(0,7);
2921 /* Verify whether key index is valid or not. Current version
2922 driver support only 4 global WEP keys. */
2923 if (u4KeyId > MAX_KEY_NUM - 1) {
2924 DBGLOG(REQ, ERROR, ("invalid WEP key ID %lu\n", u4KeyId));
2925 return WLAN_STATUS_INVALID_DATA;
2928 rRemoveKey.u4Length = sizeof(PARAM_REMOVE_KEY_T);
2929 rRemoveKey.u4KeyIndex = *(PUINT_32)pvSetBuffer;
2931 kalMemCopy(rRemoveKey.arBSSID, aucBCAddr, MAC_ADDR_LEN);
2933 wlanoidSetRemoveKey(prAdapter,
2935 sizeof(PARAM_REMOVE_KEY_T),
2938 return WLAN_STATUS_PENDING;
2939 } /* wlanoidSetRemoveWep */
2942 /*----------------------------------------------------------------------------*/
2944 * \brief This routine is called to set a key to the driver.
2946 * \param[in] prAdapter Pointer to the Adapter structure.
2947 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2948 * \param[in] u4SetBufferLen The length of the set buffer.
2949 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2950 * bytes read from the set buffer. If the call failed
2951 * due to invalid length of the set buffer, returns
2952 * the amount of storage needed.
2954 * \retval WLAN_STATUS_SUCCESS
2955 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2956 * \retval WLAN_STATUS_INVALID_LENGTH
2957 * \retval WLAN_STATUS_INVALID_DATA
2959 * \note The setting buffer PARAM_KEY_T, which is set by NDIS, is unpacked.
2961 /*----------------------------------------------------------------------------*/
2964 IN P_ADAPTER_T prAdapter,
2965 IN PVOID pvSetBuffer,
2966 IN UINT_32 u4SetBufferLen,
2967 OUT PUINT_32 pu4SetInfoLen
2970 P_GLUE_INFO_T prGlueInfo;
2971 P_CMD_INFO_T prCmdInfo;
2972 P_WIFI_CMD_T prWifiCmd;
2973 P_PARAM_KEY_T prNewKey;
2974 P_CMD_802_11_KEY prCmdKey;
2977 DEBUGFUNC("wlanoidSetAddKey");
2978 DBGLOG(REQ, LOUD, ("\n"));
2981 ASSERT(pvSetBuffer);
2982 ASSERT(pu4SetInfoLen);
2984 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2985 DBGLOG(REQ, WARN, ("Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2986 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2987 return WLAN_STATUS_ADAPTER_NOT_READY;
2990 prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
2992 /* Verify the key structure length. */
2993 if (prNewKey->u4Length > u4SetBufferLen) {
2994 DBGLOG(REQ, WARN, ("Invalid key structure length (%d) greater than total buffer length (%d)\n",
2995 (UINT_8)prNewKey->u4Length,
2996 (UINT_8)u4SetBufferLen));
2998 *pu4SetInfoLen = u4SetBufferLen;
2999 return WLAN_STATUS_INVALID_LENGTH;
3002 /* Verify the key material length for key material buffer */
3003 if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
3004 DBGLOG(REQ, WARN, ("Invalid key material length (%d)\n", (UINT_8)prNewKey->u4KeyLength));
3005 *pu4SetInfoLen = u4SetBufferLen;
3006 return WLAN_STATUS_INVALID_DATA;
3009 /* Exception check */
3010 if (prNewKey->u4KeyIndex & 0x0fffff00) {
3011 return WLAN_STATUS_INVALID_DATA;
3014 /* Exception check, pairwise key must with transmit bit enabled */
3015 if ((prNewKey->u4KeyIndex & BITS(30,31)) == IS_UNICAST_KEY) {
3016 return WLAN_STATUS_INVALID_DATA;
3019 if (!(prNewKey->u4KeyLength == WEP_40_LEN || prNewKey->u4KeyLength == WEP_104_LEN ||
3020 prNewKey->u4KeyLength == CCMP_KEY_LEN || prNewKey->u4KeyLength == TKIP_KEY_LEN))
3022 return WLAN_STATUS_INVALID_DATA;
3025 /* Exception check, pairwise key must with transmit bit enabled */
3026 if ((prNewKey->u4KeyIndex & BITS(30,31)) == BITS(30,31)) {
3027 if (((prNewKey->u4KeyIndex & 0xff) != 0) ||
3028 ((prNewKey->arBSSID[0] == 0xff) && (prNewKey->arBSSID[1] == 0xff) && (prNewKey->arBSSID[2] == 0xff) &&
3029 (prNewKey->arBSSID[3] == 0xff) && (prNewKey->arBSSID[4] == 0xff) && (prNewKey->arBSSID[5] == 0xff))) {
3030 return WLAN_STATUS_INVALID_DATA;
3034 *pu4SetInfoLen = u4SetBufferLen;
3036 /* Dump PARAM_KEY content. */
3037 DBGLOG(REQ, TRACE, ("Set: Dump PARAM_KEY content\n"));
3038 DBGLOG(REQ, TRACE, ("Length : 0x%08lx\n", prNewKey->u4Length));
3039 DBGLOG(REQ, TRACE, ("Key Index : 0x%08lx\n", prNewKey->u4KeyIndex));
3040 DBGLOG(REQ, TRACE, ("Key Length: 0x%08lx\n", prNewKey->u4KeyLength));
3041 DBGLOG(REQ, TRACE, ("BSSID:\n"));
3042 DBGLOG_MEM8(REQ, TRACE, prNewKey->arBSSID, sizeof(PARAM_MAC_ADDRESS));
3043 DBGLOG(REQ, TRACE, ("Key RSC:\n"));
3044 DBGLOG_MEM8(REQ, TRACE, &prNewKey->rKeyRSC, sizeof(PARAM_KEY_RSC));
3045 DBGLOG(REQ, TRACE, ("Key Material:\n"));
3046 DBGLOG_MEM8(REQ, TRACE, prNewKey->aucKeyMaterial, prNewKey->u4KeyLength);
3048 if (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA) {
3049 /* Todo:: Store the legacy wep key for OID_802_11_RELOAD_DEFAULTS */
3052 if (prNewKey->u4KeyIndex & IS_TRANSMIT_KEY)
3053 prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = TRUE;
3055 prGlueInfo = prAdapter->prGlueInfo;
3056 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
3059 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3060 return WLAN_STATUS_FAILURE;
3063 // increase command sequence number
3064 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3065 DBGLOG(REQ, INFO, ("ucCmdSeqNum = %d\n", ucCmdSeqNum));
3067 // compose CMD_802_11_KEY cmd pkt
3068 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
3069 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
3070 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
3071 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
3072 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
3073 prCmdInfo->fgIsOid = TRUE;
3074 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
3075 prCmdInfo->fgSetQuery = TRUE;
3076 prCmdInfo->fgNeedResp = FALSE;
3077 prCmdInfo->fgDriverDomainMCR = FALSE;
3078 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
3079 prCmdInfo->u4SetInfoLen = u4SetBufferLen;
3080 prCmdInfo->pvInformationBuffer = pvSetBuffer;
3081 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
3084 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
3085 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
3086 prWifiCmd->ucCID = prCmdInfo->ucCID;
3087 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
3088 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
3090 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
3092 kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
3094 prCmdKey->ucAddRemove = 1; /* Add */
3096 prCmdKey->ucTxKey = ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) == IS_TRANSMIT_KEY) ? 1 : 0;
3097 prCmdKey->ucKeyType = ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
3098 prCmdKey->ucIsAuthenticator = ((prNewKey->u4KeyIndex & IS_AUTHENTICATOR) == IS_AUTHENTICATOR) ? 1 : 0;
3100 kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8)prNewKey->arBSSID, MAC_ADDR_LEN);
3102 prCmdKey->ucNetType = 0; /* AIS */
3104 prCmdKey->ucKeyId = (UINT_8)(prNewKey->u4KeyIndex & 0xff);
3106 /* Note: adjust the key length for WPA-None */
3107 prCmdKey->ucKeyLen = (UINT_8)prNewKey->u4KeyLength;
3109 kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8)prNewKey->aucKeyMaterial, prCmdKey->ucKeyLen);
3111 if (prNewKey->u4KeyLength == 5) {
3112 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP40;
3114 else if (prNewKey->u4KeyLength == 13) {
3115 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP104;
3117 else if (prNewKey->u4KeyLength == 16) {
3118 if (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA)
3119 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP128;
3121 #if CFG_SUPPORT_802_11W
3122 if (prCmdKey->ucKeyId >= 4) {
3123 prCmdKey->ucAlgorithmId = CIPHER_SUITE_BIP;
3124 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3126 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3127 prAisSpecBssInfo->fgBipKeyInstalled = TRUE;
3131 prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
3134 else if (prNewKey->u4KeyLength == 32) {
3135 if (prAdapter->rWifiVar.rConnSettings.eAuthMode == AUTH_MODE_WPA_NONE) {
3136 if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION2_ENABLED) {
3137 prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
3139 else if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3140 prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
3141 prCmdKey->ucKeyLen = CCMP_KEY_LEN;
3145 if (rsnCheckPmkidCandicate(prAdapter)) {
3146 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3148 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3149 DBGLOG(RSN, TRACE, ("Add key: Prepare a timer to indicate candidate PMKID Candidate\n"));
3150 cnmTimerStopTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer);
3151 cnmTimerStartTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer,
3152 SEC_TO_MSEC(WAIT_TIME_IND_PMKID_CANDICATE_SEC));
3154 prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
3158 // insert into prCmdQueue
3159 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
3161 // wakeup txServiceThread later
3162 GLUE_SET_EVENT(prGlueInfo);
3164 return WLAN_STATUS_PENDING;
3165 } /* wlanoidSetAddKey */
3168 /*----------------------------------------------------------------------------*/
3170 * \brief This routine is called to request the driver to remove the key at
3171 * the specified key index.
3173 * \param[in] prAdapter Pointer to the Adapter structure.
3174 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3175 * \param[in] u4SetBufferLen The length of the set buffer.
3176 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3177 * bytes read from the set buffer. If the call failed
3178 * due to invalid length of the set buffer, returns
3179 * the amount of storage needed.
3181 * \retval WLAN_STATUS_SUCCESS
3182 * \retval WLAN_STATUS_INVALID_DATA
3183 * \retval WLAN_STATUS_INVALID_LENGTH
3184 * \retval WLAN_STATUS_ADAPTER_NOT_READY
3186 /*----------------------------------------------------------------------------*/
3188 wlanoidSetRemoveKey (
3189 IN P_ADAPTER_T prAdapter,
3190 IN PVOID pvSetBuffer,
3191 IN UINT_32 u4SetBufferLen,
3192 OUT PUINT_32 pu4SetInfoLen
3195 P_GLUE_INFO_T prGlueInfo;
3196 P_CMD_INFO_T prCmdInfo;
3197 P_WIFI_CMD_T prWifiCmd;
3198 P_PARAM_REMOVE_KEY_T prRemovedKey;
3199 P_CMD_802_11_KEY prCmdKey;
3202 DEBUGFUNC("wlanoidSetRemoveKey");
3205 ASSERT(pu4SetInfoLen);
3207 *pu4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
3209 if (u4SetBufferLen < sizeof(PARAM_REMOVE_KEY_T)) {
3210 return WLAN_STATUS_INVALID_LENGTH;
3213 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
3214 DBGLOG(REQ, WARN, ("Fail in set remove key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
3215 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
3216 return WLAN_STATUS_ADAPTER_NOT_READY;
3219 ASSERT(pvSetBuffer);
3220 prRemovedKey = (P_PARAM_REMOVE_KEY_T)pvSetBuffer;
3222 /* Dump PARAM_REMOVE_KEY content. */
3223 DBGLOG(REQ, INFO, ("Set: Dump PARAM_REMOVE_KEY content\n"));
3224 DBGLOG(REQ, INFO, ("Length : 0x%08lx\n", prRemovedKey->u4Length));
3225 DBGLOG(REQ, INFO, ("Key Index : 0x%08lx\n", prRemovedKey->u4KeyIndex));
3226 DBGLOG(REQ, INFO, ("BSSID:\n"));
3227 DBGLOG_MEM8(REQ, INFO, prRemovedKey->arBSSID, MAC_ADDR_LEN);
3229 /* Check bit 31: this bit should always 0 */
3230 if (prRemovedKey->u4KeyIndex & IS_TRANSMIT_KEY) {
3231 /* Bit 31 should not be set */
3232 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
3233 prRemovedKey->u4KeyIndex));
3234 return WLAN_STATUS_INVALID_DATA;
3237 /* Check bits 8 ~ 29 should always be 0 */
3238 if (prRemovedKey->u4KeyIndex & BITS(8, 29)) {
3239 /* Bit 31 should not be set */
3240 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
3241 prRemovedKey->u4KeyIndex));
3242 return WLAN_STATUS_INVALID_DATA;
3245 /* Clean up the Tx key flag */
3246 if (prRemovedKey->u4KeyIndex & IS_UNICAST_KEY) {
3247 prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = FALSE;
3250 prGlueInfo = prAdapter->prGlueInfo;
3251 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
3254 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3255 return WLAN_STATUS_FAILURE;
3258 // increase command sequence number
3259 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3261 // compose CMD_802_11_KEY cmd pkt
3262 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
3263 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
3264 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
3265 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
3266 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
3267 prCmdInfo->fgIsOid = TRUE;
3268 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
3269 prCmdInfo->fgSetQuery = TRUE;
3270 prCmdInfo->fgNeedResp = FALSE;
3271 prCmdInfo->fgDriverDomainMCR = FALSE;
3272 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
3273 prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
3274 prCmdInfo->pvInformationBuffer = pvSetBuffer;
3275 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
3278 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
3279 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
3280 prWifiCmd->ucCID = prCmdInfo->ucCID;
3281 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
3282 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
3284 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
3286 kalMemZero((PUINT_8)prCmdKey, sizeof(CMD_802_11_KEY));
3288 prCmdKey->ucAddRemove = 0; /* Remove */
3289 prCmdKey->ucKeyId = (UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff);
3290 kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8)prRemovedKey->arBSSID, MAC_ADDR_LEN);
3292 #if CFG_SUPPORT_802_11W
3293 ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM + 2);
3295 //ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM);
3298 if (prRemovedKey->u4KeyIndex & IS_UNICAST_KEY) {
3299 prCmdKey->ucKeyType = 1;
3302 // insert into prCmdQueue
3303 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
3305 // wakeup txServiceThread later
3306 GLUE_SET_EVENT(prGlueInfo);
3308 return WLAN_STATUS_PENDING;
3309 } /* wlanoidSetRemoveKey */
3312 /*----------------------------------------------------------------------------*/
3314 * \brief This routine is called to query the current encryption status.
3316 * \param[in] prAdapter Pointer to the Adapter structure.
3317 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3319 * \param[in] u4QueryBufferLen The length of the query buffer.
3320 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3321 * bytes written into the query buffer. If the call
3322 * failed due to invalid length of the query buffer,
3323 * returns the amount of storage needed.
3325 * \retval WLAN_STATUS_SUCCESS
3327 /*----------------------------------------------------------------------------*/
3329 wlanoidQueryEncryptionStatus (
3330 IN P_ADAPTER_T prAdapter,
3331 IN PVOID pvQueryBuffer,
3332 IN UINT_32 u4QueryBufferLen,
3333 OUT PUINT_32 pu4QueryInfoLen
3336 BOOLEAN fgTransmitKeyAvailable = TRUE;
3337 ENUM_PARAM_ENCRYPTION_STATUS_T eEncStatus = 0;
3339 DEBUGFUNC("wlanoidQueryEncryptionStatus");
3342 ASSERT(pu4QueryInfoLen);
3343 if (u4QueryBufferLen) {
3344 ASSERT(pvQueryBuffer);
3347 *pu4QueryInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
3349 fgTransmitKeyAvailable = prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist;
3351 switch (prAdapter->rWifiVar.rConnSettings.eEncStatus) {
3352 case ENUM_ENCRYPTION3_ENABLED:
3353 if (fgTransmitKeyAvailable) {
3354 eEncStatus = ENUM_ENCRYPTION3_ENABLED;
3357 eEncStatus = ENUM_ENCRYPTION3_KEY_ABSENT;
3361 case ENUM_ENCRYPTION2_ENABLED:
3362 if (fgTransmitKeyAvailable) {
3363 eEncStatus = ENUM_ENCRYPTION2_ENABLED;
3367 eEncStatus = ENUM_ENCRYPTION2_KEY_ABSENT;
3371 case ENUM_ENCRYPTION1_ENABLED:
3372 if (fgTransmitKeyAvailable) {
3373 eEncStatus = ENUM_ENCRYPTION1_ENABLED;
3376 eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;
3380 case ENUM_ENCRYPTION_DISABLED:
3381 eEncStatus = ENUM_ENCRYPTION_DISABLED;
3385 DBGLOG(REQ, ERROR, ("Unknown Encryption Status Setting:%d\n",
3386 prAdapter->rWifiVar.rConnSettings.eEncStatus));
3391 ("Encryption status: %d Return:%d\n",
3392 prAdapter->rWifiVar.rConnSettings.eEncStatus,
3396 *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvQueryBuffer = eEncStatus;
3398 return WLAN_STATUS_SUCCESS;
3399 } /* wlanoidQueryEncryptionStatus */
3402 /*----------------------------------------------------------------------------*/
3404 * \brief This routine is called to set the encryption status to the driver.
3406 * \param[in] prAdapter Pointer to the Adapter structure.
3407 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3408 * \param[in] u4SetBufferLen The length of the set buffer.
3409 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3410 * bytes read from the set buffer. If the call failed
3411 * due to invalid length of the set buffer, returns
3412 * the amount of storage needed.
3414 * \retval WLAN_STATUS_SUCCESS
3415 * \retval WLAN_STATUS_ADAPTER_NOT_READY
3416 * \retval WLAN_STATUS_NOT_SUPPORTED
3418 /*----------------------------------------------------------------------------*/
3420 wlanoidSetEncryptionStatus (
3421 IN P_ADAPTER_T prAdapter,
3422 IN PVOID pvSetBuffer,
3423 IN UINT_32 u4SetBufferLen,
3424 OUT PUINT_32 pu4SetInfoLen
3427 P_GLUE_INFO_T prGlueInfo;
3428 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3429 ENUM_PARAM_ENCRYPTION_STATUS_T eEewEncrypt;
3431 DEBUGFUNC("wlanoidSetEncryptionStatus");
3434 ASSERT(pvSetBuffer);
3435 ASSERT(pu4SetInfoLen);
3437 prGlueInfo = prAdapter->prGlueInfo;
3439 *pu4SetInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
3441 //if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
3442 // return WLAN_STATUS_SUCCESS;
3445 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
3446 DBGLOG(REQ, WARN, ("Fail in set encryption status! (Adapter not ready). ACPI=D%d, Radio=%d\n",
3447 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
3448 return WLAN_STATUS_ADAPTER_NOT_READY;
3451 eEewEncrypt = *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvSetBuffer;
3452 DBGLOG(REQ, TRACE, ("ENCRYPTION_STATUS %d\n", eEewEncrypt));
3454 switch (eEewEncrypt) {
3455 case ENUM_ENCRYPTION_DISABLED: /* Disable WEP, TKIP, AES */
3456 DBGLOG(RSN, TRACE, ("Disable Encryption\n"));
3457 secSetCipherSuite(prAdapter,
3459 CIPHER_FLAG_WEP104 |
3460 CIPHER_FLAG_WEP128);
3463 case ENUM_ENCRYPTION1_ENABLED: /* Enable WEP. Disable TKIP, AES */
3464 DBGLOG(RSN, TRACE, ("Enable Encryption1\n"));
3465 secSetCipherSuite(prAdapter,
3467 CIPHER_FLAG_WEP104 |
3468 CIPHER_FLAG_WEP128);
3471 case ENUM_ENCRYPTION2_ENABLED: /* Enable WEP, TKIP. Disable AES */
3472 secSetCipherSuite(prAdapter,
3474 CIPHER_FLAG_WEP104 |
3475 CIPHER_FLAG_WEP128 |
3477 DBGLOG(RSN, TRACE, ("Enable Encryption2\n"));
3480 case ENUM_ENCRYPTION3_ENABLED: /* Enable WEP, TKIP, AES */
3481 secSetCipherSuite(prAdapter,
3483 CIPHER_FLAG_WEP104 |
3484 CIPHER_FLAG_WEP128 |
3487 DBGLOG(RSN, TRACE, ("Enable Encryption3\n"));
3491 DBGLOG(RSN, WARN, ("Unacceptible encryption status: %d\n",
3492 *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvSetBuffer));
3494 rStatus = WLAN_STATUS_NOT_SUPPORTED;
3497 if (rStatus == WLAN_STATUS_SUCCESS) {
3498 /* Save the new encryption status. */
3499 prAdapter->rWifiVar.rConnSettings.eEncStatus =
3500 *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvSetBuffer;
3504 } /* wlanoidSetEncryptionStatus */
3507 /*----------------------------------------------------------------------------*/
3509 * \brief This routine is called to test the driver.
3511 * \param[in] prAdapter Pointer to the Adapter structure.
3512 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3513 * \param[in] u4SetBufferLen The length of the set buffer.
3514 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3515 * bytes read from the set buffer. If the call failed
3516 * due to invalid length of the set buffer, returns
3517 * the amount of storage needed.
3519 * \retval WLAN_STATUS_SUCCESS
3520 * \retval WLAN_STATUS_INVALID_LENGTH
3521 * \retval WLAN_STATUS_INVALID_DATA
3523 /*----------------------------------------------------------------------------*/
3526 IN P_ADAPTER_T prAdapter,
3527 IN PVOID pvSetBuffer,
3528 IN UINT_32 u4SetBufferLen,
3529 OUT PUINT_32 pu4SetInfoLen
3532 P_PARAM_802_11_TEST_T prTest;
3534 PVOID pvStatusBuffer;
3535 UINT_32 u4StatusBufferSize;
3537 DEBUGFUNC("wlanoidSetTest");
3541 ASSERT(pu4SetInfoLen);
3542 ASSERT(pvSetBuffer);
3544 *pu4SetInfoLen = u4SetBufferLen;
3546 prTest = (P_PARAM_802_11_TEST_T)pvSetBuffer;
3548 DBGLOG(REQ, TRACE, ("Test - Type %ld\n", prTest->u4Type));
3550 switch (prTest->u4Type) {
3551 case 1: /* Type 1: generate an authentication event */
3552 pvTestData = (PVOID)&prTest->u.AuthenticationEvent;
3553 pvStatusBuffer = (PVOID)prAdapter->aucIndicationEventBuffer;
3554 u4StatusBufferSize = prTest->u4Length - 8;
3557 case 2: /* Type 2: generate an RSSI status indication */
3558 pvTestData = (PVOID)&prTest->u.RssiTrigger;
3559 pvStatusBuffer = (PVOID)&prAdapter->rWlanInfo.rCurrBssId.rRssi;
3560 u4StatusBufferSize = sizeof(PARAM_RSSI);
3564 return WLAN_STATUS_INVALID_DATA;
3567 ASSERT(u4StatusBufferSize <= 180);
3568 if (u4StatusBufferSize > 180) {
3569 return WLAN_STATUS_INVALID_LENGTH;
3572 /* Get the contents of the StatusBuffer from the test structure. */
3573 kalMemCopy(pvStatusBuffer, pvTestData, u4StatusBufferSize);
3575 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
3576 WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
3578 u4StatusBufferSize);
3580 return WLAN_STATUS_SUCCESS;
3581 } /* wlanoidSetTest */
3584 /*----------------------------------------------------------------------------*/
3586 * \brief This routine is called to query the driver's WPA2 status.
3588 * \param[in] prAdapter Pointer to the Adapter structure.
3589 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3591 * \param[in] u4QueryBufferLen The length of the query buffer.
3592 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3593 * bytes written into the query buffer. If the call
3594 * failed due to invalid length of the query buffer,
3595 * returns the amount of storage needed.
3597 * \retval WLAN_STATUS_SUCCESS
3598 * \retval WLAN_STATUS_INVALID_LENGTH
3600 /*----------------------------------------------------------------------------*/
3602 wlanoidQueryCapability (
3603 IN P_ADAPTER_T prAdapter,
3604 OUT PVOID pvQueryBuffer,
3605 IN UINT_32 u4QueryBufferLen,
3606 OUT PUINT_32 pu4QueryInfoLen
3609 P_PARAM_CAPABILITY_T prCap;
3610 P_PARAM_AUTH_ENCRYPTION_T prAuthenticationEncryptionSupported;
3612 DEBUGFUNC("wlanoidQueryCapability");
3615 ASSERT(pu4QueryInfoLen);
3616 if (u4QueryBufferLen) {
3617 ASSERT(pvQueryBuffer);
3620 *pu4QueryInfoLen = 4 * sizeof(UINT_32) + 14 * sizeof(PARAM_AUTH_ENCRYPTION_T);
3622 if (u4QueryBufferLen < *pu4QueryInfoLen) {
3623 return WLAN_STATUS_INVALID_LENGTH;
3626 prCap = (P_PARAM_CAPABILITY_T)pvQueryBuffer;
3628 prCap->u4Length = *pu4QueryInfoLen;
3629 prCap->u4Version = 2; /* WPA2 */
3630 prCap->u4NoOfPMKIDs = CFG_MAX_PMKID_CACHE;
3631 prCap->u4NoOfAuthEncryptPairsSupported = 14;
3633 prAuthenticationEncryptionSupported =
3634 &prCap->arAuthenticationEncryptionSupported[0];
3636 // fill 14 entries of supported settings
3637 prAuthenticationEncryptionSupported[0].eAuthModeSupported =
3640 prAuthenticationEncryptionSupported[0].eEncryptStatusSupported =
3641 ENUM_ENCRYPTION_DISABLED;
3643 prAuthenticationEncryptionSupported[1].eAuthModeSupported =
3645 prAuthenticationEncryptionSupported[1].eEncryptStatusSupported =
3646 ENUM_ENCRYPTION1_ENABLED;
3648 prAuthenticationEncryptionSupported[2].eAuthModeSupported =
3650 prAuthenticationEncryptionSupported[2].eEncryptStatusSupported =
3651 ENUM_ENCRYPTION_DISABLED;
3653 prAuthenticationEncryptionSupported[3].eAuthModeSupported =
3655 prAuthenticationEncryptionSupported[3].eEncryptStatusSupported =
3656 ENUM_ENCRYPTION1_ENABLED;
3658 prAuthenticationEncryptionSupported[4].eAuthModeSupported =
3660 prAuthenticationEncryptionSupported[4].eEncryptStatusSupported =
3661 ENUM_ENCRYPTION2_ENABLED;
3663 prAuthenticationEncryptionSupported[5].eAuthModeSupported =
3665 prAuthenticationEncryptionSupported[5].eEncryptStatusSupported =
3666 ENUM_ENCRYPTION3_ENABLED;
3668 prAuthenticationEncryptionSupported[6].eAuthModeSupported =
3670 prAuthenticationEncryptionSupported[6].eEncryptStatusSupported =
3671 ENUM_ENCRYPTION2_ENABLED;
3673 prAuthenticationEncryptionSupported[7].eAuthModeSupported =
3675 prAuthenticationEncryptionSupported[7].eEncryptStatusSupported =
3676 ENUM_ENCRYPTION3_ENABLED;
3678 prAuthenticationEncryptionSupported[8].eAuthModeSupported =
3680 prAuthenticationEncryptionSupported[8].eEncryptStatusSupported =
3681 ENUM_ENCRYPTION2_ENABLED;
3683 prAuthenticationEncryptionSupported[9].eAuthModeSupported =
3685 prAuthenticationEncryptionSupported[9].eEncryptStatusSupported =
3686 ENUM_ENCRYPTION3_ENABLED;
3688 prAuthenticationEncryptionSupported[10].eAuthModeSupported =
3690 prAuthenticationEncryptionSupported[10].eEncryptStatusSupported =
3691 ENUM_ENCRYPTION2_ENABLED;
3693 prAuthenticationEncryptionSupported[11].eAuthModeSupported =
3695 prAuthenticationEncryptionSupported[11].eEncryptStatusSupported =
3696 ENUM_ENCRYPTION3_ENABLED;
3698 prAuthenticationEncryptionSupported[12].eAuthModeSupported =
3700 prAuthenticationEncryptionSupported[12].eEncryptStatusSupported =
3701 ENUM_ENCRYPTION2_ENABLED;
3703 prAuthenticationEncryptionSupported[13].eAuthModeSupported =
3705 prAuthenticationEncryptionSupported[13].eEncryptStatusSupported =
3706 ENUM_ENCRYPTION3_ENABLED;
3708 return WLAN_STATUS_SUCCESS;
3710 } /* wlanoidQueryCapability */
3713 /*----------------------------------------------------------------------------*/
3715 * \brief This routine is called to query the PMKID in the PMK cache.
3717 * \param[in] prAdapter Pointer to the Adapter structure.
3718 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3720 * \param[in] u4QueryBufferLen The length of the query buffer.
3721 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3722 * bytes written into the query buffer. If the call
3723 * failed due to invalid length of the query buffer,
3724 * returns the amount of storage needed.
3726 * \retval WLAN_STATUS_SUCCESS
3727 * \retval WLAN_STATUS_INVALID_LENGTH
3729 /*----------------------------------------------------------------------------*/
3732 IN P_ADAPTER_T prAdapter,
3733 OUT PVOID pvQueryBuffer,
3734 IN UINT_32 u4QueryBufferLen,
3735 OUT PUINT_32 pu4QueryInfoLen
3739 P_PARAM_PMKID_T prPmkid;
3740 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3742 DEBUGFUNC("wlanoidQueryPmkid");
3745 ASSERT(pu4QueryInfoLen);
3746 if (u4QueryBufferLen) {
3747 ASSERT(pvQueryBuffer);
3750 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3752 *pu4QueryInfoLen = OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo) +
3753 prAisSpecBssInfo->u4PmkidCacheCount * sizeof(PARAM_BSSID_INFO_T);
3755 if (u4QueryBufferLen < *pu4QueryInfoLen) {
3756 return WLAN_STATUS_INVALID_LENGTH;
3759 prPmkid = (P_PARAM_PMKID_T)pvQueryBuffer;
3761 prPmkid->u4Length = *pu4QueryInfoLen;
3762 prPmkid->u4BSSIDInfoCount = prAisSpecBssInfo->u4PmkidCacheCount;
3764 for (i = 0; i < prAisSpecBssInfo->u4PmkidCacheCount; i++) {
3765 kalMemCopy(prPmkid->arBSSIDInfo[i].arBSSID,
3766 prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arBSSID,
3767 sizeof(PARAM_MAC_ADDRESS));
3768 kalMemCopy(prPmkid->arBSSIDInfo[i].arPMKID,
3769 prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arPMKID,
3770 sizeof(PARAM_PMKID_VALUE));
3773 return WLAN_STATUS_SUCCESS;
3775 } /* wlanoidQueryPmkid */
3778 /*----------------------------------------------------------------------------*/
3780 * \brief This routine is called to set the PMKID to the PMK cache in the driver.
3782 * \param[in] prAdapter Pointer to the Adapter structure.
3783 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3784 * \param[in] u4SetBufferLen The length of the set buffer.
3785 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3786 * bytes read from the set buffer. If the call failed
3787 * due to invalid length of the set buffer, returns
3788 * the amount of storage needed.
3790 * \retval WLAN_STATUS_SUCCESS
3791 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
3792 * \retval WLAN_STATUS_INVALID_DATA
3794 /*----------------------------------------------------------------------------*/
3797 IN P_ADAPTER_T prAdapter,
3798 IN PVOID pvSetBuffer,
3799 IN UINT_32 u4SetBufferLen,
3800 OUT PUINT_32 pu4SetInfoLen
3804 P_PARAM_PMKID_T prPmkid;
3805 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3807 DEBUGFUNC("wlanoidSetPmkid");
3810 ASSERT(pu4SetInfoLen);
3812 *pu4SetInfoLen = u4SetBufferLen;
3814 /* It's possibble BSSIDInfoCount is zero, because OS wishes to clean PMKID */
3815 if (u4SetBufferLen < OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo)) {
3816 return WLAN_STATUS_BUFFER_TOO_SHORT;
3819 ASSERT(pvSetBuffer);
3820 prPmkid = (P_PARAM_PMKID_T)pvSetBuffer;
3822 if (u4SetBufferLen <
3823 ((prPmkid->u4BSSIDInfoCount * sizeof(PARAM_BSSID_INFO_T)) +
3824 OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo))) {
3825 return WLAN_STATUS_INVALID_DATA;
3828 if (prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE) {
3829 return WLAN_STATUS_INVALID_DATA;
3832 DBGLOG(REQ, INFO, ("Count %lu\n", prPmkid->u4BSSIDInfoCount));
3834 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3836 /* This OID replace everything in the PMKID cache. */
3837 if (prPmkid->u4BSSIDInfoCount == 0) {
3838 prAisSpecBssInfo->u4PmkidCacheCount = 0;
3839 kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
3841 if ((prAisSpecBssInfo->u4PmkidCacheCount + prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE)) {
3842 prAisSpecBssInfo->u4PmkidCacheCount = 0;
3843 kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
3847 The driver can only clear its PMKID cache whenever it make a media disconnect
3848 indication. Otherwise, it must change the PMKID cache only when set through this OID.
3850 #if CFG_RSN_MIGRATION
3851 for (i = 0; i < prPmkid->u4BSSIDInfoCount; i++) {
3852 /* Search for desired BSSID. If desired BSSID is found,
3853 then set the PMKID */
3854 if (!rsnSearchPmkidEntry(prAdapter,
3855 (PUINT_8)prPmkid->arBSSIDInfo[i].arBSSID,
3857 /* No entry found for the specified BSSID, so add one entry */
3858 if (prAisSpecBssInfo->u4PmkidCacheCount < CFG_MAX_PMKID_CACHE - 1) {
3859 j = prAisSpecBssInfo->u4PmkidCacheCount;
3860 kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID,
3861 prPmkid->arBSSIDInfo[i].arBSSID,
3862 sizeof(PARAM_MAC_ADDRESS));
3863 prAisSpecBssInfo->u4PmkidCacheCount++;
3866 j = CFG_MAX_PMKID_CACHE;
3870 if (j < CFG_MAX_PMKID_CACHE) {
3871 kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID,
3872 prPmkid->arBSSIDInfo[i].arPMKID,
3873 sizeof(PARAM_PMKID_VALUE));
3874 DBGLOG(RSN, TRACE, ("Add BSSID "MACSTR" idx=%d PMKID value "MACSTR"\n",
3875 MAC2STR(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID),j, MAC2STR(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID)));
3876 prAisSpecBssInfo->arPmkidCache[j].fgPmkidExist = TRUE;
3880 return WLAN_STATUS_SUCCESS;
3882 } /* wlanoidSetPmkid */
3885 /*----------------------------------------------------------------------------*/
3887 * \brief This routine is called to query the set of supported data rates that
3888 * the radio is capable of running
3890 * \param[in] prAdapter Pointer to the Adapter structure
3891 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3893 * \param[in] u4QueryBufferLen The length of the query buffer
3894 * \param[out] pu4QueryInfoLen If the call is successful, returns the number
3895 * of bytes written into the query buffer. If the
3896 * call failed due to invalid length of the query
3897 * buffer, returns the amount of storage needed.
3899 * \retval WLAN_STATUS_SUCCESS
3900 * \retval WLAN_STATUS_INVALID_LENGTH
3902 /*----------------------------------------------------------------------------*/
3904 wlanoidQuerySupportedRates (
3905 IN P_ADAPTER_T prAdapter,
3906 OUT PVOID pvQueryBuffer,
3907 IN UINT_32 u4QueryBufferLen,
3908 OUT PUINT_32 pu4QueryInfoLen
3911 PARAM_RATES eRate = {
3912 // BSSBasicRateSet for 802.11n Non-HT rates
3923 DEBUGFUNC("wlanoidQuerySupportedRates");
3926 ASSERT(pu4QueryInfoLen);
3927 if (u4QueryBufferLen) {
3928 ASSERT(pvQueryBuffer);
3931 *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
3933 if (u4QueryBufferLen < *pu4QueryInfoLen ) {
3934 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4QueryBufferLen));
3935 return WLAN_STATUS_INVALID_LENGTH;
3938 kalMemCopy(pvQueryBuffer,
3940 sizeof(PARAM_RATES));
3942 return WLAN_STATUS_SUCCESS;
3943 } /* end of wlanoidQuerySupportedRates() */
3946 /*----------------------------------------------------------------------------*/
3948 * \brief This routine is called to query current desired rates.
3950 * \param[in] prAdapter Pointer to the Adapter structure.
3951 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
3953 * \param[in] u4QueryBufferLen The length of the query buffer.
3954 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3955 * bytes written into the query buffer. If the call
3956 * failed due to invalid length of the query buffer,
3957 * returns the amount of storage needed.
3959 * \retval WLAN_STATUS_SUCCESS
3960 * \retval WLAN_STATUS_INVALID_LENGTH
3962 /*----------------------------------------------------------------------------*/
3964 wlanoidQueryDesiredRates (
3965 IN P_ADAPTER_T prAdapter,
3966 OUT PVOID pvQueryBuffer,
3967 IN UINT_32 u4QueryBufferLen,
3968 OUT PUINT_32 pu4QueryInfoLen
3971 DEBUGFUNC("wlanoidQueryDesiredRates");
3974 ASSERT(pu4QueryInfoLen);
3975 if (u4QueryBufferLen) {
3976 ASSERT(pvQueryBuffer);
3979 *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
3981 if (u4QueryBufferLen < *pu4QueryInfoLen ) {
3982 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4QueryBufferLen));
3983 return WLAN_STATUS_INVALID_LENGTH;
3986 kalMemCopy(pvQueryBuffer,
3987 (PVOID)&(prAdapter->rWlanInfo.eDesiredRates),
3988 sizeof(PARAM_RATES));
3990 return WLAN_STATUS_SUCCESS;
3992 } /* end of wlanoidQueryDesiredRates() */
3995 /*----------------------------------------------------------------------------*/
3997 * \brief This routine is called to Set the desired rates.
3999 * \param[in] prAdapter Pointer to the Adapter structure.
4000 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
4001 * \param[in] u4SetBufferLen The length of the set buffer.
4002 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
4003 * bytes read from the set buffer. If the call failed
4004 * due to invalid length of the set buffer, returns
4005 * the amount of storage needed.
4008 * \retval WLAN_STATUS_SUCCESS
4009 * \retval WLAN_STATUS_INVALID_LENGTH
4010 * \retval WLAN_STATUS_INVALID_DATA
4011 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4013 /*----------------------------------------------------------------------------*/
4015 wlanoidSetDesiredRates (
4016 IN P_ADAPTER_T prAdapter,
4017 IN PVOID pvSetBuffer,
4018 IN UINT_32 u4SetBufferLen,
4019 OUT PUINT_32 pu4SetInfoLen
4023 DEBUGFUNC("wlanoidSetDesiredRates");
4026 ASSERT(pvSetBuffer);
4027 ASSERT(pu4SetInfoLen);
4029 if (u4SetBufferLen < sizeof(PARAM_RATES)) {
4030 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
4031 return WLAN_STATUS_INVALID_LENGTH;
4034 *pu4SetInfoLen = sizeof(PARAM_RATES);
4036 if (u4SetBufferLen < sizeof(PARAM_RATES)) {
4037 return WLAN_STATUS_INVALID_LENGTH;
4040 kalMemCopy((PVOID)&(prAdapter->rWlanInfo.eDesiredRates),
4042 sizeof(PARAM_RATES));
4044 prAdapter->rWlanInfo.eLinkAttr.ucDesiredRateLen = PARAM_MAX_LEN_RATES;
4045 for (i = 0 ; i < PARAM_MAX_LEN_RATES ; i++) {
4046 prAdapter->rWlanInfo.eLinkAttr.u2DesiredRate[i] =
4047 (UINT_16) (prAdapter->rWlanInfo.eDesiredRates[i]);
4050 return wlanSendSetQueryCmd(prAdapter,
4055 nicCmdEventSetCommon,
4056 nicOidCmdTimeoutCommon,
4057 sizeof(CMD_LINK_ATTRIB),
4058 (PUINT_8)&(prAdapter->rWlanInfo.eLinkAttr),
4063 } /* end of wlanoidSetDesiredRates() */
4066 /*----------------------------------------------------------------------------*/
4068 * \brief This routine is called to query the maximum frame size in bytes,
4069 * not including the header.
4071 * \param[in] prAdapter Pointer to the Adapter structure.
4072 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
4074 * \param[in] u4QueryBufferLen The length of the query buffer.
4075 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4076 * bytes written into the query buffer. If the
4077 * call failed due to invalid length of the query
4078 * buffer, returns the amount of storage needed.
4080 * \retval WLAN_STATUS_SUCCESS
4081 * \retval WLAN_STATUS_INVALID_LENGTH
4083 /*----------------------------------------------------------------------------*/
4085 wlanoidQueryMaxFrameSize (
4086 IN P_ADAPTER_T prAdapter,
4087 OUT PVOID pvQueryBuffer,
4088 IN UINT_32 u4QueryBufferLen,
4089 OUT PUINT_32 pu4QueryInfoLen
4092 DEBUGFUNC("wlanoidQueryMaxFrameSize");
4096 ASSERT(pu4QueryInfoLen);
4097 if (u4QueryBufferLen) {
4098 ASSERT(pvQueryBuffer);
4102 if (u4QueryBufferLen < sizeof(UINT_32)) {
4103 *pu4QueryInfoLen = sizeof(UINT_32);
4104 return WLAN_STATUS_INVALID_LENGTH;
4107 *(PUINT_32)pvQueryBuffer = ETHERNET_MAX_PKT_SZ - ETHERNET_HEADER_SZ;
4108 *pu4QueryInfoLen = sizeof(UINT_32);
4110 return WLAN_STATUS_SUCCESS;
4111 } /* wlanoidQueryMaxFrameSize */
4114 /*----------------------------------------------------------------------------*/
4116 * \brief This routine is called to query the maximum total packet length
4119 * \param[in] prAdapter Pointer to the Adapter structure.
4120 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
4122 * \param[in] u4QueryBufferLen The length of the query buffer.
4123 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4124 * bytes written into the query buffer. If the call
4125 * failed due to invalid length of the query buffer,
4126 * returns the amount of storage needed.
4128 * \retval WLAN_STATUS_SUCCESS
4129 * \retval WLAN_STATUS_INVALID_LENGTH
4131 /*----------------------------------------------------------------------------*/
4133 wlanoidQueryMaxTotalSize (
4134 IN P_ADAPTER_T prAdapter,
4135 OUT PVOID pvQueryBuffer,
4136 IN UINT_32 u4QueryBufferLen,
4137 OUT PUINT_32 pu4QueryInfoLen
4140 DEBUGFUNC("wlanoidQueryMaxTotalSize");
4143 ASSERT(pu4QueryInfoLen);
4144 if (u4QueryBufferLen) {
4145 ASSERT(pvQueryBuffer);
4148 if (u4QueryBufferLen < sizeof(UINT_32)) {
4149 *pu4QueryInfoLen = sizeof(UINT_32);
4150 return WLAN_STATUS_INVALID_LENGTH;
4153 *(PUINT_32)pvQueryBuffer = ETHERNET_MAX_PKT_SZ;
4154 *pu4QueryInfoLen = sizeof(UINT_32);
4156 return WLAN_STATUS_SUCCESS;
4157 } /* wlanoidQueryMaxTotalSize */
4160 /*----------------------------------------------------------------------------*/
4162 * \brief This routine is called to query the vendor ID of the NIC.
4164 * \param[in] prAdapter Pointer to the Adapter structure.
4165 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
4167 * \param[in] u4QueryBufferLen The length of the query buffer.
4168 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4169 * bytes written into the query buffer. If the call
4170 * failed due to invalid length of the query buffer,
4171 * returns the amount of storage needed.
4173 * \retval WLAN_STATUS_SUCCESS
4174 * \retval WLAN_STATUS_INVALID_LENGTH
4176 /*----------------------------------------------------------------------------*/
4178 wlanoidQueryVendorId (
4179 IN P_ADAPTER_T prAdapter,
4180 OUT PVOID pvQueryBuffer,
4181 IN UINT_32 u4QueryBufferLen,
4182 OUT PUINT_32 pu4QueryInfoLen
4188 DEBUGFUNC("wlanoidQueryVendorId");
4191 ASSERT(pu4QueryInfoLen);
4192 if (u4QueryBufferLen) {
4193 ASSERT(pvQueryBuffer);
4196 if (u4QueryBufferLen < sizeof(UINT_32)) {
4197 *pu4QueryInfoLen = sizeof(UINT_32);
4198 return WLAN_STATUS_INVALID_LENGTH;
4201 kalMemCopy(pvQueryBuffer, prAdapter->aucMacAddress, 3);
4202 *((PUINT_8)pvQueryBuffer + 3) = 1;
4203 *pu4QueryInfoLen = sizeof(UINT_32);
4206 cp = (PUINT_8)pvQueryBuffer;
4207 DBGLOG(REQ, LOUD, ("Vendor ID=%02x-%02x-%02x-%02x\n", cp[0], cp[1], cp[2], cp[3]));
4210 return WLAN_STATUS_SUCCESS;
4211 } /* wlanoidQueryVendorId */
4214 /*----------------------------------------------------------------------------*/
4216 * \brief This routine is called to query the current RSSI value.
4218 * \param[in] prAdapter Pointer to the Adapter structure.
4219 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
4220 * \param[in] u4QueryBufferLen The length of the query buffer.
4221 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4222 * bytes written into the query buffer. If the call failed due to invalid length of
4223 * the query buffer, returns the amount of storage needed.
4225 * \retval WLAN_STATUS_SUCCESS
4226 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
4227 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4229 /*----------------------------------------------------------------------------*/
4232 IN P_ADAPTER_T prAdapter,
4233 OUT PVOID pvQueryBuffer,
4234 IN UINT_32 u4QueryBufferLen,
4235 OUT PUINT_32 pu4QueryInfoLen
4238 DEBUGFUNC("wlanoidQueryRssi");
4241 ASSERT(pu4QueryInfoLen);
4242 if (u4QueryBufferLen) {
4243 ASSERT(pvQueryBuffer);
4246 *pu4QueryInfoLen = sizeof(PARAM_RSSI);
4248 /* Check for query buffer length */
4249 if (u4QueryBufferLen < *pu4QueryInfoLen) {
4250 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
4251 return WLAN_STATUS_BUFFER_TOO_SHORT;
4254 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_DISCONNECTED) {
4255 return WLAN_STATUS_ADAPTER_NOT_READY;
4257 else if (prAdapter->fgIsLinkQualityValid == TRUE &&
4258 (kalGetTimeTick() - prAdapter->rLinkQualityUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
4261 rRssi = (PARAM_RSSI)prAdapter->rLinkQuality.cRssi; // ranged from (-128 ~ 30) in unit of dBm
4263 if(rRssi > PARAM_WHQL_RSSI_MAX_DBM)
4264 rRssi = PARAM_WHQL_RSSI_MAX_DBM;
4265 else if(rRssi < PARAM_WHQL_RSSI_MIN_DBM)
4266 rRssi = PARAM_WHQL_RSSI_MIN_DBM;
4268 kalMemCopy(pvQueryBuffer, &rRssi, sizeof(PARAM_RSSI));
4269 return WLAN_STATUS_SUCCESS;
4273 return wlanSendSetQueryCmd(prAdapter,
4274 CMD_ID_GET_LINK_QUALITY,
4278 nicCmdEventQueryLinkQuality,
4279 nicOidCmdTimeoutCommon,
4286 return wlanSendSetQueryCmd(prAdapter,
4287 CMD_ID_GET_LINK_QUALITY,
4291 nicCmdEventQueryLinkQuality,
4292 nicOidCmdTimeoutCommon,
4300 } /* end of wlanoidQueryRssi() */
4303 /*----------------------------------------------------------------------------*/
4305 * \brief This routine is called to query the current RSSI trigger value.
4307 * \param[in] prAdapter Pointer to the Adapter structure.
4308 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
4309 * \param[in] u4QueryBufferLen The length of the query buffer.
4310 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4311 * bytes written into the query buffer. If the call failed due to invalid length of
4312 * the query buffer, returns the amount of storage needed.
4314 * \retval WLAN_STATUS_SUCCESS
4315 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
4317 /*----------------------------------------------------------------------------*/
4319 wlanoidQueryRssiTrigger (
4320 IN P_ADAPTER_T prAdapter,
4321 OUT PVOID pvQueryBuffer,
4322 IN UINT_32 u4QueryBufferLen,
4323 OUT PUINT_32 pu4QueryInfoLen
4326 DEBUGFUNC("wlanoidQueryRssiTrigger");
4329 ASSERT(pu4QueryInfoLen);
4330 if (u4QueryBufferLen) {
4331 ASSERT(pvQueryBuffer);
4335 if(prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_NONE)
4336 return WLAN_STATUS_ADAPTER_NOT_READY;
4338 *pu4QueryInfoLen = sizeof(PARAM_RSSI);
4340 /* Check for query buffer length */
4341 if (u4QueryBufferLen < *pu4QueryInfoLen) {
4342 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
4343 return WLAN_STATUS_BUFFER_TOO_SHORT;
4346 *(PARAM_RSSI *) pvQueryBuffer = prAdapter->rWlanInfo.rRssiTriggerValue;
4347 DBGLOG(REQ, INFO, ("RSSI trigger: %ld dBm\n", *(PARAM_RSSI *) pvQueryBuffer));
4349 return WLAN_STATUS_SUCCESS;
4350 } /* wlanoidQueryRssiTrigger */
4353 /*----------------------------------------------------------------------------*/
4355 * \brief This routine is called to set a trigger value of the RSSI event.
4357 * \param[in] prAdapter Pointer to the Adapter structure
4358 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
4359 * \param[in] u4SetBufferLen The length of the set buffer.
4360 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
4361 * bytes read from the set buffer. If the call failed
4362 * due to invalid length of the set buffer, returns the
4363 * amount of storage needed.
4365 * \retval WLAN_STATUS_SUCCESS
4368 /*----------------------------------------------------------------------------*/
4370 wlanoidSetRssiTrigger (
4371 IN P_ADAPTER_T prAdapter,
4372 IN PVOID pvSetBuffer,
4373 IN UINT_32 u4SetBufferLen,
4374 OUT PUINT_32 pu4SetInfoLen
4377 PARAM_RSSI rRssiTriggerValue;
4378 DEBUGFUNC("wlanoidSetRssiTrigger");
4381 ASSERT(pvSetBuffer);
4382 ASSERT(pu4SetInfoLen);
4385 *pu4SetInfoLen = sizeof(PARAM_RSSI);
4386 rRssiTriggerValue = *(PARAM_RSSI *) pvSetBuffer;
4388 if(rRssiTriggerValue > PARAM_WHQL_RSSI_MAX_DBM
4389 || rRssiTriggerValue < PARAM_WHQL_RSSI_MIN_DBM)
4392 /* Save the RSSI trigger value to the Adapter structure */
4393 prAdapter->rWlanInfo.rRssiTriggerValue = rRssiTriggerValue;
4395 /* If the RSSI trigger value is equal to the current RSSI value, the
4396 * indication triggers immediately. We need to indicate the protocol
4397 * that an RSSI status indication event triggers. */
4398 if (rRssiTriggerValue == (PARAM_RSSI)(prAdapter->rLinkQuality.cRssi)) {
4399 prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
4401 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
4402 WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
4403 (PVOID) &prAdapter->rWlanInfo.rRssiTriggerValue, sizeof(PARAM_RSSI));
4405 else if(rRssiTriggerValue < (PARAM_RSSI)(prAdapter->rLinkQuality.cRssi))
4406 prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_GREATER;
4407 else if(rRssiTriggerValue > (PARAM_RSSI)(prAdapter->rLinkQuality.cRssi))
4408 prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_LESS;
4410 return WLAN_STATUS_SUCCESS;
4411 } /* wlanoidSetRssiTrigger */
4414 /*----------------------------------------------------------------------------*/
4416 * \brief This routine is called to set a suggested value for the number of
4417 * bytes of received packet data that will be indicated to the protocol
4418 * driver. We just accept the set and ignore this value.
4420 * \param[in] prAdapter Pointer to the Adapter structure.
4421 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
4422 * \param[in] u4SetBufferLen The length of the set buffer.
4423 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
4424 * bytes read from the set buffer. If the call failed
4425 * due to invalid length of the set buffer, returns
4426 * the amount of storage needed.
4428 * \retval WLAN_STATUS_SUCCESS
4429 * \retval WLAN_STATUS_INVALID_LENGTH
4431 /*----------------------------------------------------------------------------*/
4433 wlanoidSetCurrentLookahead (
4434 IN P_ADAPTER_T prAdapter,
4435 IN PVOID pvSetBuffer,
4436 IN UINT_32 u4SetBufferLen,
4437 OUT PUINT_32 pu4SetInfoLen
4440 DEBUGFUNC("wlanoidSetCurrentLookahead");
4443 ASSERT(pvSetBuffer);
4444 ASSERT(pu4SetInfoLen);
4446 if (u4SetBufferLen < sizeof(UINT_32)) {
4447 *pu4SetInfoLen = sizeof(UINT_32);
4448 return WLAN_STATUS_INVALID_LENGTH;
4451 *pu4SetInfoLen = sizeof(UINT_32);
4452 return WLAN_STATUS_SUCCESS;
4453 } /* wlanoidSetCurrentLookahead */
4456 /*----------------------------------------------------------------------------*/
4458 * \brief This routine is called to query the number of frames that the driver
4459 * receives but does not indicate to the protocols due to errors.
4461 * \param[in] pvAdapter Pointer to the Adapter structure.
4462 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
4464 * \param[in] u4QueryBufLen The length of the query buffer.
4465 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4466 * bytes written into the query buffer. If the call
4467 * failed due to invalid length of the query buffer,
4468 * returns the amount of storage needed.
4470 * \retval WLAN_STATUS_SUCCESS
4471 * \retval WLAN_STATUS_INVALID_LENGTH
4472 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4474 /*----------------------------------------------------------------------------*/
4476 wlanoidQueryRcvError (
4477 IN P_ADAPTER_T prAdapter,
4478 IN PVOID pvQueryBuffer,
4479 IN UINT_32 u4QueryBufferLen,
4480 OUT PUINT_32 pu4QueryInfoLen
4483 DEBUGFUNC("wlanoidQueryRcvError");
4484 DBGLOG(REQ, LOUD, ("\n"));
4487 if (u4QueryBufferLen) {
4488 ASSERT(pvQueryBuffer);
4490 ASSERT(pu4QueryInfoLen);
4492 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4493 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4494 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4495 *pu4QueryInfoLen = sizeof(UINT_32);
4496 return WLAN_STATUS_ADAPTER_NOT_READY;
4498 else if (u4QueryBufferLen < sizeof(UINT_32)
4499 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
4500 *pu4QueryInfoLen = sizeof(UINT_64);
4501 return WLAN_STATUS_INVALID_LENGTH;
4504 #if CFG_ENABLE_STATISTICS_BUFFERING
4505 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4506 // @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated
4507 if(u4QueryBufferLen == sizeof(UINT_32)) {
4508 *pu4QueryInfoLen = sizeof(UINT_32);
4509 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4512 *pu4QueryInfoLen = sizeof(UINT_64);
4513 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4516 return WLAN_STATUS_SUCCESS;
4521 return wlanSendSetQueryCmd(prAdapter,
4522 CMD_ID_GET_STATISTICS,
4526 nicCmdEventQueryRecvError,
4527 nicOidCmdTimeoutCommon,
4534 } /* wlanoidQueryRcvError */
4537 /*----------------------------------------------------------------------------*/
4538 /*! \brief This routine is called to query the number of frames that the NIC
4539 * cannot receive due to lack of NIC receive buffer space.
4541 * \param[in] pvAdapter Pointer to the Adapter structure
4542 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4544 * \param[in] u4QueryBufLen The length of the query buffer
4545 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4546 * bytes written into the query buffer. If the call
4547 * failed due to invalid length of the query buffer,
4548 * returns the amount of storage needed.
4550 * \retval WLAN_STATUS_SUCCESS If success;
4551 * \retval WLAN_STATUS_INVALID_LENGTH
4552 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4554 /*----------------------------------------------------------------------------*/
4556 wlanoidQueryRcvNoBuffer (
4557 IN P_ADAPTER_T prAdapter,
4558 IN PVOID pvQueryBuffer,
4559 IN UINT_32 u4QueryBufferLen,
4560 OUT PUINT_32 pu4QueryInfoLen
4563 DEBUGFUNC("wlanoidQueryRcvNoBuffer");
4564 DBGLOG(REQ, LOUD, ("\n"));
4567 if (u4QueryBufferLen) {
4568 ASSERT(pvQueryBuffer);
4570 ASSERT(pu4QueryInfoLen);
4572 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4573 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4574 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4575 *pu4QueryInfoLen = sizeof(UINT_32);
4576 return WLAN_STATUS_ADAPTER_NOT_READY;
4578 else if (u4QueryBufferLen < sizeof(UINT_32)
4579 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
4580 *pu4QueryInfoLen = sizeof(UINT_64);
4581 return WLAN_STATUS_INVALID_LENGTH;
4584 #if CFG_ENABLE_STATISTICS_BUFFERING
4585 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4586 if(u4QueryBufferLen == sizeof(UINT_32)) {
4587 *pu4QueryInfoLen = sizeof(UINT_32);
4588 *(PUINT_32) pvQueryBuffer = (UINT_32) 0; //@FIXME
4591 *pu4QueryInfoLen = sizeof(UINT_64);
4592 *(PUINT_64) pvQueryBuffer = (UINT_64) 0; //@FIXME
4595 return WLAN_STATUS_SUCCESS;
4600 return wlanSendSetQueryCmd(prAdapter,
4601 CMD_ID_GET_STATISTICS,
4605 nicCmdEventQueryRecvNoBuffer,
4606 nicOidCmdTimeoutCommon,
4613 } /* wlanoidQueryRcvNoBuffer */
4616 /*----------------------------------------------------------------------------*/
4617 /*! \brief This routine is called to query the number of frames that the NIC
4618 * received and it is CRC error.
4620 * \param[in] pvAdapter Pointer to the Adapter structure
4621 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4623 * \param[in] u4QueryBufLen The length of the query buffer
4624 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4625 * bytes written into the query buffer. If the call
4626 * failed due to invalid length of the query buffer,
4627 * returns the amount of storage needed.
4629 * \retval WLAN_STATUS_SUCCESS If success;
4630 * \retval WLAN_STATUS_INVALID_LENGTH
4631 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4633 /*----------------------------------------------------------------------------*/
4635 wlanoidQueryRcvCrcError (
4636 IN P_ADAPTER_T prAdapter,
4637 IN PVOID pvQueryBuffer,
4638 IN UINT_32 u4QueryBufferLen,
4639 OUT PUINT_32 pu4QueryInfoLen
4642 DEBUGFUNC("wlanoidQueryRcvCrcError");
4643 DBGLOG(REQ, LOUD, ("\n"));
4646 if (u4QueryBufferLen) {
4647 ASSERT(pvQueryBuffer);
4649 ASSERT(pu4QueryInfoLen);
4651 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4652 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4653 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4654 *pu4QueryInfoLen = sizeof(UINT_32);
4655 return WLAN_STATUS_ADAPTER_NOT_READY;
4657 else if (u4QueryBufferLen < sizeof(UINT_32)
4658 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
4659 *pu4QueryInfoLen = sizeof(UINT_64);
4660 return WLAN_STATUS_INVALID_LENGTH;
4662 #if CFG_ENABLE_STATISTICS_BUFFERING
4663 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4664 if(u4QueryBufferLen == sizeof(UINT_32)) {
4665 *pu4QueryInfoLen = sizeof(UINT_32);
4666 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4669 *pu4QueryInfoLen = sizeof(UINT_64);
4670 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4673 return WLAN_STATUS_SUCCESS;
4678 return wlanSendSetQueryCmd(prAdapter,
4679 CMD_ID_GET_STATISTICS,
4683 nicCmdEventQueryRecvCrcError,
4684 nicOidCmdTimeoutCommon,
4691 } /* wlanoidQueryRcvCrcError */
4694 /*----------------------------------------------------------------------------*/
4695 /*! \brief This routine is called to query the current 802.11 statistics.
4697 * \param[in] pvAdapter Pointer to the Adapter structure
4698 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4700 * \param[in] u4QueryBufLen The length of the query buffer
4701 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4702 * bytes written into the query buffer. If the call
4703 * failed due to invalid length of the query buffer,
4704 * returns the amount of storage needed.
4706 * \retval WLAN_STATUS_SUCCESS
4707 * \retval WLAN_STATUS_INVALID_LENGTH
4709 /*----------------------------------------------------------------------------*/
4711 wlanoidQueryStatistics (
4712 IN P_ADAPTER_T prAdapter,
4713 IN PVOID pvQueryBuffer,
4714 IN UINT_32 u4QueryBufferLen,
4715 OUT PUINT_32 pu4QueryInfoLen
4718 DEBUGFUNC("wlanoidQueryStatistics");
4719 DBGLOG(REQ, LOUD, ("\n"));
4722 if (u4QueryBufferLen) {
4723 ASSERT(pvQueryBuffer);
4725 ASSERT(pu4QueryInfoLen);
4727 *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
4729 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4730 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4731 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4732 *pu4QueryInfoLen = sizeof(UINT_32);
4733 return WLAN_STATUS_ADAPTER_NOT_READY;
4735 else if (u4QueryBufferLen < sizeof(PARAM_802_11_STATISTICS_STRUCT_T)) {
4736 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
4737 return WLAN_STATUS_INVALID_LENGTH;
4740 #if CFG_ENABLE_STATISTICS_BUFFERING
4741 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4742 P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
4744 *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
4745 prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) pvQueryBuffer;
4747 prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
4748 prStatistics->rTransmittedFragmentCount
4749 = prAdapter->rStatStruct.rTransmittedFragmentCount;
4750 prStatistics->rMulticastTransmittedFrameCount
4751 = prAdapter->rStatStruct.rMulticastTransmittedFrameCount;
4752 prStatistics->rFailedCount
4753 = prAdapter->rStatStruct.rFailedCount;
4754 prStatistics->rRetryCount
4755 = prAdapter->rStatStruct.rRetryCount;
4756 prStatistics->rMultipleRetryCount
4757 = prAdapter->rStatStruct.rMultipleRetryCount;
4758 prStatistics->rRTSSuccessCount
4759 = prAdapter->rStatStruct.rRTSSuccessCount;
4760 prStatistics->rRTSFailureCount
4761 = prAdapter->rStatStruct.rRTSFailureCount;
4762 prStatistics->rACKFailureCount
4763 = prAdapter->rStatStruct.rACKFailureCount;
4764 prStatistics->rFrameDuplicateCount
4765 = prAdapter->rStatStruct.rFrameDuplicateCount;
4766 prStatistics->rReceivedFragmentCount
4767 = prAdapter->rStatStruct.rReceivedFragmentCount;
4768 prStatistics->rMulticastReceivedFrameCount
4769 = prAdapter->rStatStruct.rMulticastReceivedFrameCount;
4770 prStatistics->rFCSErrorCount
4771 = prAdapter->rStatStruct.rFCSErrorCount;
4772 prStatistics->rTKIPLocalMICFailures.QuadPart
4774 prStatistics->rTKIPICVErrors.QuadPart
4776 prStatistics->rTKIPCounterMeasuresInvoked.QuadPart
4778 prStatistics->rTKIPReplays.QuadPart
4780 prStatistics->rCCMPFormatErrors.QuadPart
4782 prStatistics->rCCMPReplays.QuadPart
4784 prStatistics->rCCMPDecryptErrors.QuadPart
4786 prStatistics->rFourWayHandshakeFailures.QuadPart
4788 prStatistics->rWEPUndecryptableCount.QuadPart
4790 prStatistics->rWEPICVErrorCount.QuadPart
4792 prStatistics->rDecryptSuccessCount.QuadPart
4794 prStatistics->rDecryptFailureCount.QuadPart
4797 return WLAN_STATUS_SUCCESS;
4802 return wlanSendSetQueryCmd(prAdapter,
4803 CMD_ID_GET_STATISTICS,
4807 nicCmdEventQueryStatistics,
4808 nicOidCmdTimeoutCommon,
4815 } /* wlanoidQueryStatistics */
4818 /*----------------------------------------------------------------------------*/
4819 /*! \brief This routine is called to query current media streaming status.
4821 * \param[in] pvAdapter Pointer to the Adapter structure
4822 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4824 * \param[in] u4QueryBufLen The length of the query buffer
4825 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4826 * bytes written into the query buffer. If the call
4827 * failed due to invalid length of the query buffer,
4828 * returns the amount of storage needed.
4830 * \retval WLAN_STATUS_SUCCESS
4832 /*----------------------------------------------------------------------------*/
4834 wlanoidQueryMediaStreamMode(
4835 IN P_ADAPTER_T prAdapter,
4836 IN PVOID pvQueryBuffer,
4837 IN UINT_32 u4QueryBufferLen,
4838 OUT PUINT_32 pu4QueryInfoLen
4841 DEBUGFUNC("wlanoidQueryMediaStreamMode");
4844 ASSERT(pu4QueryInfoLen);
4845 if (u4QueryBufferLen) {
4846 ASSERT(pvQueryBuffer);
4849 *pu4QueryInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
4851 if (u4QueryBufferLen < *pu4QueryInfoLen ) {
4852 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4QueryBufferLen));
4853 return WLAN_STATUS_INVALID_LENGTH;
4856 *(P_ENUM_MEDIA_STREAM_MODE)pvQueryBuffer =
4857 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode == 0 ?
4858 ENUM_MEDIA_STREAM_OFF : ENUM_MEDIA_STREAM_ON;
4860 return WLAN_STATUS_SUCCESS;
4862 } /* wlanoidQueryMediaStreamMode */
4864 /*----------------------------------------------------------------------------*/
4865 /*! \brief This routine is called to enter media streaming mode or exit media streaming mode
4867 * \param[in] pvAdapter Pointer to the Adapter structure
4868 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4870 * \param[in] u4QueryBufLen The length of the query buffer
4871 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4872 * bytes written into the query buffer. If the call
4873 * failed due to invalid length of the query buffer,
4874 * returns the amount of storage needed.
4876 * \retval WLAN_STATUS_SUCCESS
4878 /*----------------------------------------------------------------------------*/
4880 wlanoidSetMediaStreamMode(
4881 IN P_ADAPTER_T prAdapter,
4882 IN PVOID pvSetBuffer,
4883 IN UINT_32 u4SetBufferLen,
4884 OUT PUINT_32 pu4SetInfoLen
4887 ENUM_MEDIA_STREAM_MODE eStreamMode;
4889 DEBUGFUNC("wlanoidSetMediaStreamMode");
4892 ASSERT(pvSetBuffer);
4893 ASSERT(pu4SetInfoLen);
4895 if (u4SetBufferLen < sizeof(ENUM_MEDIA_STREAM_MODE)) {
4896 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
4897 return WLAN_STATUS_INVALID_LENGTH;
4900 *pu4SetInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
4902 eStreamMode = *(P_ENUM_MEDIA_STREAM_MODE)pvSetBuffer;
4904 if(eStreamMode == ENUM_MEDIA_STREAM_OFF)
4905 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 0;
4907 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 1;
4909 return wlanSendSetQueryCmd(prAdapter,
4914 nicCmdEventSetMediaStreamMode,
4915 nicOidCmdTimeoutCommon,
4916 sizeof(CMD_LINK_ATTRIB),
4917 (PUINT_8)&(prAdapter->rWlanInfo.eLinkAttr),
4921 } /* wlanoidSetMediaStreamMode */
4923 /*----------------------------------------------------------------------------*/
4924 /*! \brief This routine is called to query the permanent MAC address of the NIC.
4926 * \param[in] pvAdapter Pointer to the Adapter structure
4927 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4929 * \param[in] u4QueryBufLen The length of the query buffer
4930 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4931 * bytes written into the query buffer. If the call
4932 * failed due to invalid length of the query buffer,
4933 * returns the amount of storage needed.
4935 * \retval WLAN_STATUS_SUCCESS
4937 /*----------------------------------------------------------------------------*/
4939 wlanoidQueryPermanentAddr (
4940 IN P_ADAPTER_T prAdapter,
4941 IN PVOID pvQueryBuffer,
4942 IN UINT_32 u4QueryBufferLen,
4943 OUT PUINT_32 pu4QueryInfoLen
4946 DEBUGFUNC("wlanoidQueryPermanentAddr");
4947 DBGLOG(INIT, LOUD, ("\n"));
4950 ASSERT(pu4QueryInfoLen);
4951 if (u4QueryBufferLen) {
4952 ASSERT(pvQueryBuffer);
4955 if (u4QueryBufferLen < MAC_ADDR_LEN) {
4956 return WLAN_STATUS_BUFFER_TOO_SHORT;
4959 COPY_MAC_ADDR(pvQueryBuffer, prAdapter->rWifiVar.aucPermanentAddress);
4960 *pu4QueryInfoLen = MAC_ADDR_LEN;
4962 return WLAN_STATUS_SUCCESS;
4963 } /* wlanoidQueryPermanentAddr */
4966 /*----------------------------------------------------------------------------*/
4967 /*! \brief This routine is called to query the MAC address the NIC is currently using.
4969 * \param[in] pvAdapter Pointer to the Adapter structure
4970 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4972 * \param[in] u4QueryBufLen The length of the query buffer
4973 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4974 * bytes written into the query buffer. If the call
4975 * failed due to invalid length of the query buffer,
4976 * returns the amount of storage needed.
4978 * \retval WLAN_STATUS_SUCCESS
4979 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
4981 /*----------------------------------------------------------------------------*/
4983 wlanoidQueryCurrentAddr (
4984 IN P_ADAPTER_T prAdapter,
4985 IN PVOID pvQueryBuffer,
4986 IN UINT_32 u4QueryBufferLen,
4987 OUT PUINT_32 pu4QueryInfoLen
4990 CMD_BASIC_CONFIG rCmdBasicConfig;
4992 DEBUGFUNC("wlanoidQueryCurrentAddr");
4993 DBGLOG(INIT, LOUD, ("\n"));
4996 ASSERT(pu4QueryInfoLen);
4997 if (u4QueryBufferLen) {
4998 ASSERT(pvQueryBuffer);
5001 if (u4QueryBufferLen < MAC_ADDR_LEN) {
5002 return WLAN_STATUS_BUFFER_TOO_SHORT;
5005 kalMemZero(&rCmdBasicConfig, sizeof(CMD_BASIC_CONFIG));
5007 return wlanSendSetQueryCmd(prAdapter,
5008 CMD_ID_BASIC_CONFIG,
5012 nicCmdEventQueryAddress,
5013 nicOidCmdTimeoutCommon,
5014 sizeof(CMD_BASIC_CONFIG),
5015 (PUINT_8)&rCmdBasicConfig,
5020 } /* wlanoidQueryCurrentAddr */
5023 /*----------------------------------------------------------------------------*/
5024 /*! \brief This routine is called to query NIC link speed.
5026 * \param[in] pvAdapter Pointer to the Adapter structure
5027 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
5029 * \param[in] u4QueryBufLen The length of the query buffer
5030 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
5031 * bytes written into the query buffer. If the call
5032 * failed due to invalid length of the query buffer,
5033 * returns the amount of storage needed.
5035 * \retval WLAN_STATUS_SUCCESS
5036 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
5039 /*----------------------------------------------------------------------------*/
5041 wlanoidQueryLinkSpeed(
5042 IN P_ADAPTER_T prAdapter,
5043 IN PVOID pvQueryBuffer,
5044 IN UINT_32 u4QueryBufferLen,
5045 OUT PUINT_32 pu4QueryInfoLen
5048 DEBUGFUNC("wlanoidQueryLinkSpeed");
5052 ASSERT(pu4QueryInfoLen);
5053 if (u4QueryBufferLen) {
5054 ASSERT(pvQueryBuffer);
5057 *pu4QueryInfoLen = sizeof(UINT_32);
5059 if (u4QueryBufferLen < sizeof(UINT_32)) {
5060 return WLAN_STATUS_BUFFER_TOO_SHORT;
5063 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
5064 *(PUINT_32)pvQueryBuffer = 10000; // change to unit of 100bps
5065 return WLAN_STATUS_SUCCESS;
5067 else if (prAdapter->fgIsLinkRateValid == TRUE &&
5068 (kalGetTimeTick() - prAdapter->rLinkRateUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
5069 *(PUINT_32)pvQueryBuffer = prAdapter->rLinkQuality.u2LinkSpeed * 5000; // change to unit of 100bps
5070 return WLAN_STATUS_SUCCESS;
5073 return wlanSendSetQueryCmd(prAdapter,
5074 CMD_ID_GET_LINK_QUALITY,
5078 nicCmdEventQueryLinkSpeed,
5079 nicOidCmdTimeoutCommon,
5086 } /* end of wlanoidQueryLinkSpeed() */
5089 /*----------------------------------------------------------------------------*/
5091 * \brief This routine is called to query MCR value.
5093 * \param[in] pvAdapter Pointer to the Adapter structure.
5094 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
5096 * \param[in] u4QueryBufLen The length of the query buffer.
5097 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
5098 * bytes written into the query buffer. If the call
5099 * failed due to invalid length of the query buffer,
5100 * returns the amount of storage needed.
5102 * \retval WLAN_STATUS_SUCCESS
5103 * \retval WLAN_STATUS_INVALID_LENGTH
5105 /*----------------------------------------------------------------------------*/
5107 wlanoidQueryMcrRead (
5108 IN P_ADAPTER_T prAdapter,
5109 IN PVOID pvQueryBuffer,
5110 IN UINT_32 u4QueryBufferLen,
5111 OUT PUINT_32 pu4QueryInfoLen
5114 P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrRdInfo;
5115 CMD_ACCESS_REG rCmdAccessReg;
5117 DEBUGFUNC("wlanoidQueryMcrRead");
5118 DBGLOG(INIT, LOUD,("\n"));
5121 ASSERT(pu4QueryInfoLen);
5122 if (u4QueryBufferLen) {
5123 ASSERT(pvQueryBuffer);
5126 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T);
5128 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T)) {
5129 return WLAN_STATUS_INVALID_LENGTH;
5132 prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T)pvQueryBuffer;
5134 /* 0x9000 - 0x9EFF reserved for FW */
5135 #if CFG_SUPPORT_SWCR
5136 if((prMcrRdInfo->u4McrOffset >>16) == 0x9F00) {
5137 swCrReadWriteCmd(prAdapter,
5139 (UINT_16) (prMcrRdInfo->u4McrOffset & BITS(0,15)),
5140 &prMcrRdInfo->u4McrData);
5141 return WLAN_STATUS_SUCCESS;
5143 #endif /* CFG_SUPPORT_SWCR */
5145 /* Check if access F/W Domain MCR (due to WiFiSYS is placed from 0x6000-0000*/
5146 if (prMcrRdInfo->u4McrOffset & 0xFFFF0000){
5148 rCmdAccessReg.u4Address = prMcrRdInfo->u4McrOffset;
5149 rCmdAccessReg.u4Data = 0;
5151 return wlanSendSetQueryCmd(prAdapter,
5156 nicCmdEventQueryMcrRead,
5157 nicOidCmdTimeoutCommon,
5158 sizeof(CMD_ACCESS_REG),
5159 (PUINT_8)&rCmdAccessReg,
5165 HAL_MCR_RD(prAdapter,
5166 prMcrRdInfo->u4McrOffset & BITS(2,31), //address is in DWORD unit
5167 &prMcrRdInfo->u4McrData);
5169 DBGLOG(INIT, TRACE, ("MCR Read: Offset = %#08lx, Data = %#08lx\n",
5170 prMcrRdInfo->u4McrOffset, prMcrRdInfo->u4McrData));
5171 return WLAN_STATUS_SUCCESS;
5173 } /* end of wlanoidQueryMcrRead() */
5176 /*----------------------------------------------------------------------------*/
5178 * \brief This routine is called to write MCR and enable specific function.
5180 * \param[in] prAdapter Pointer to the Adapter structure.
5181 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
5182 * \param[in] u4SetBufferLen The length of the set buffer.
5183 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
5184 * bytes read from the set buffer. If the call failed
5185 * due to invalid length of the set buffer, returns
5186 * the amount of storage needed.
5188 * \retval WLAN_STATUS_SUCCESS
5189 * \retval WLAN_STATUS_INVALID_LENGTH
5191 /*----------------------------------------------------------------------------*/
5193 wlanoidSetMcrWrite (
5194 IN P_ADAPTER_T prAdapter,
5195 IN PVOID pvSetBuffer,
5196 IN UINT_32 u4SetBufferLen,
5197 OUT PUINT_32 pu4SetInfoLen
5200 P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrWrInfo;
5201 CMD_ACCESS_REG rCmdAccessReg;
5203 #if CFG_STRESS_TEST_SUPPORT
5204 P_AIS_FSM_INFO_T prAisFsmInfo;
5205 P_BSS_INFO_T prBssInfo = &(prAdapter->rWifiVar.arBssInfo[(NETWORK_TYPE_AIS_INDEX)]);
5206 P_STA_RECORD_T prStaRec = prBssInfo->prStaRecOfAP;
5207 UINT_32 u4McrOffset, u4McrData;
5210 DEBUGFUNC("wlanoidSetMcrWrite");
5211 DBGLOG(INIT, LOUD,("\n"));
5214 ASSERT(pu4SetInfoLen);
5216 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T);
5218 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T)) {
5219 return WLAN_STATUS_INVALID_LENGTH;
5222 ASSERT(pvSetBuffer);
5224 prMcrWrInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T)pvSetBuffer;
5226 /* 0x9000 - 0x9EFF reserved for FW */
5227 /* 0xFFFE reserved for FW */
5229 // -- Puff Stress Test Begin
5230 #if CFG_STRESS_TEST_SUPPORT
5232 // 0xFFFFFFFE for Control Rate
5233 if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFE){
5234 if(prMcrWrInfo->u4McrData < FIXED_RATE_NUM && prMcrWrInfo->u4McrData > 0){
5235 prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T)(prMcrWrInfo->u4McrData);
5237 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
5238 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
5239 DEBUGFUNC("[Stress Test]Complete Rate is Changed...\n");
5240 DBGLOG(INIT, TRACE, ("[Stress Test] Rate is Changed to index %d...\n", prAdapter->rWifiVar.eRateSetting));
5243 // 0xFFFFFFFD for Switch Channel
5244 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFD){
5245 if(prMcrWrInfo->u4McrData <= 11 && prMcrWrInfo->u4McrData >= 1){
5246 prBssInfo->ucPrimaryChannel = prMcrWrInfo->u4McrData;
5248 nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
5249 DBGLOG(INIT, TRACE, ("[Stress Test] Channel is switched to %d ...\n", prBssInfo->ucPrimaryChannel));
5251 return WLAN_STATUS_SUCCESS;
5254 // 0xFFFFFFFFC for Control RF Band and SCO
5255 else if(prMcrWrInfo->u4McrOffset == 0xFFFFFFFC){
5257 if(prMcrWrInfo->u4McrData & 0x80000000){
5258 //prBssInfo->eBand = BAND_5G;
5259 //prBssInfo->ucPrimaryChannel = 52; // Bond to Channel 52
5261 prBssInfo->eBand = BAND_2G4;
5262 prBssInfo->ucPrimaryChannel = 8; // Bond to Channel 6
5266 if(prMcrWrInfo->u4McrData & 0x00010000){
5267 prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
5268 prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT;
5270 if(prMcrWrInfo->u4McrData == 0x00010002){
5271 prBssInfo->eBssSCO = CHNL_EXT_SCB; // U20
5272 prBssInfo->ucPrimaryChannel += 2;
5273 } else if (prMcrWrInfo->u4McrData == 0x00010001){
5274 prBssInfo->eBssSCO = CHNL_EXT_SCA; // L20
5275 prBssInfo->ucPrimaryChannel -= 2;
5277 prBssInfo->eBssSCO = CHNL_EXT_SCA; // 40
5281 if(prMcrWrInfo->u4McrData & 0x00000000){
5282 prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
5283 prBssInfo->eBssSCO = CHNL_EXT_SCN;
5285 rlmBssInitForAPandIbss(prAdapter, prBssInfo);
5288 // 0xFFFFFFFB for HT Capability
5289 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFB){
5290 /* Enable HT Capability */
5291 if(prMcrWrInfo->u4McrData & 0x00000001){
5292 prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
5293 DEBUGFUNC("[Stress Test]Enable HT capability...\n");
5295 prStaRec->u2HtCapInfo &= (~HT_CAP_INFO_HT_GF);
5296 DEBUGFUNC("[Stress Test]Disable HT capability...\n");
5298 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
5299 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
5302 // 0xFFFFFFFA for Enable Random Rx Reset
5303 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFA){
5304 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5305 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5307 return wlanSendSetQueryCmd(
5309 CMD_ID_RANDOM_RX_RESET_EN,
5313 nicCmdEventSetCommon,
5314 nicOidCmdTimeoutCommon,
5315 sizeof(CMD_ACCESS_REG),
5316 (PUINT_8)&rCmdAccessReg,
5322 // 0xFFFFFFF9 for Disable Random Rx Reset
5323 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF9){
5324 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5325 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5327 return wlanSendSetQueryCmd(
5329 CMD_ID_RANDOM_RX_RESET_DE,
5333 nicCmdEventSetCommon,
5334 nicOidCmdTimeoutCommon,
5335 sizeof(CMD_ACCESS_REG),
5336 (PUINT_8)&rCmdAccessReg,
5342 // 0xFFFFFFF8 for Enable SAPP
5343 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF8){
5344 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5345 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5347 return wlanSendSetQueryCmd(
5353 nicCmdEventSetCommon,
5354 nicOidCmdTimeoutCommon,
5355 sizeof(CMD_ACCESS_REG),
5356 (PUINT_8)&rCmdAccessReg,
5362 // 0xFFFFFFF7 for Disable SAPP
5363 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF7){
5364 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5365 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5367 return wlanSendSetQueryCmd(
5373 nicCmdEventSetCommon,
5374 nicOidCmdTimeoutCommon,
5375 sizeof(CMD_ACCESS_REG),
5376 (PUINT_8)&rCmdAccessReg,
5384 // -- Puff Stress Test End
5387 /* Check if access F/W Domain MCR */
5388 if (prMcrWrInfo->u4McrOffset & 0xFFFF0000){
5390 /* 0x9000 - 0x9EFF reserved for FW */
5391 #if CFG_SUPPORT_SWCR
5392 if((prMcrWrInfo->u4McrOffset >> 16) == 0x9F00) {
5393 swCrReadWriteCmd(prAdapter,
5395 (UINT_16) (prMcrWrInfo->u4McrOffset & BITS(0,15)),
5396 &prMcrWrInfo->u4McrData);
5397 return WLAN_STATUS_SUCCESS;
5399 #endif /* CFG_SUPPORT_SWCR */
5403 // low power test special command
5404 if (prMcrWrInfo->u4McrOffset == 0x11111110){
5405 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5406 //DbgPrint("Enter test mode\n");
5407 prAdapter->fgTestMode = TRUE;
5410 if (prMcrWrInfo->u4McrOffset == 0x11111111){
5411 //DbgPrint("nicpmSetAcpiPowerD3\n");
5413 nicpmSetAcpiPowerD3(prAdapter);
5414 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD3);
5415 return WLAN_STATUS_SUCCESS;
5417 if (prMcrWrInfo->u4McrOffset == 0x11111112){
5419 //DbgPrint("LP enter sleep\n");
5422 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5423 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5425 return wlanSendSetQueryCmd(prAdapter,
5430 nicCmdEventSetCommon,
5431 nicOidCmdTimeoutCommon,
5432 sizeof(CMD_ACCESS_REG),
5433 (PUINT_8)&rCmdAccessReg,
5441 // low power test special command
5442 if (prMcrWrInfo->u4McrOffset == 0x11111110){
5443 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5444 //DbgPrint("Enter test mode\n");
5445 prAdapter->fgTestMode = TRUE;
5448 if (prMcrWrInfo->u4McrOffset == 0x11111111){
5449 //DbgPrint("nicpmSetAcpiPowerD3\n");
5451 nicpmSetAcpiPowerD3(prAdapter);
5452 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD3);
5453 return WLAN_STATUS_SUCCESS;
5455 if (prMcrWrInfo->u4McrOffset == 0x11111112){
5457 //DbgPrint("LP enter sleep\n");
5460 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5461 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5463 return wlanSendSetQueryCmd(prAdapter,
5468 nicCmdEventSetCommon,
5469 nicOidCmdTimeoutCommon,
5470 sizeof(CMD_ACCESS_REG),
5471 (PUINT_8)&rCmdAccessReg,
5479 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5480 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5482 return wlanSendSetQueryCmd(prAdapter,
5487 nicCmdEventSetCommon,
5488 nicOidCmdTimeoutCommon,
5489 sizeof(CMD_ACCESS_REG),
5490 (PUINT_8)&rCmdAccessReg,
5496 HAL_MCR_WR(prAdapter,
5497 (prMcrWrInfo->u4McrOffset & BITS(2,31)), //address is in DWORD unit
5498 prMcrWrInfo->u4McrData);
5500 DBGLOG(INIT, TRACE, ("MCR Write: Offset = %#08lx, Data = %#08lx\n",
5501 prMcrWrInfo->u4McrOffset, prMcrWrInfo->u4McrData));
5503 return WLAN_STATUS_SUCCESS;
5505 } /* wlanoidSetMcrWrite */
5507 /*----------------------------------------------------------------------------*/
5509 * \brief This routine is called to query SW CTRL
5511 * \param[in] pvAdapter Pointer to the Adapter structure.
5512 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
5514 * \param[in] u4QueryBufLen The length of the query buffer.
5515 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
5516 * bytes written into the query buffer. If the call
5517 * failed due to invalid length of the query buffer,
5518 * returns the amount of storage needed.
5520 * \retval WLAN_STATUS_SUCCESS
5521 * \retval WLAN_STATUS_INVALID_LENGTH
5523 /*----------------------------------------------------------------------------*/
5525 wlanoidQuerySwCtrlRead (
5526 IN P_ADAPTER_T prAdapter,
5527 IN PVOID pvQueryBuffer,
5528 IN UINT_32 u4QueryBufferLen,
5529 OUT PUINT_32 pu4QueryInfoLen
5532 P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo;
5533 WLAN_STATUS rWlanStatus;
5534 UINT_16 u2Id, u2SubId;
5537 CMD_SW_DBG_CTRL_T rCmdSwCtrl;
5539 DEBUGFUNC("wlanoidQuerySwCtrlRead");
5540 DBGLOG(INIT, LOUD,("\n"));
5543 ASSERT(pu4QueryInfoLen);
5544 if (u4QueryBufferLen) {
5545 ASSERT(pvQueryBuffer);
5548 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T);
5550 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T)) {
5551 return WLAN_STATUS_INVALID_LENGTH;
5554 prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T)pvQueryBuffer;
5556 u2Id = (UINT_16)(prSwCtrlInfo->u4Id >> 16);
5557 u2SubId = (UINT_16)(prSwCtrlInfo->u4Id & BITS(0,15));
5559 rWlanStatus = WLAN_STATUS_SUCCESS;
5562 /* 0x9000 - 0x9EFF reserved for FW */
5563 /* 0xFFFE reserved for FW */
5565 #if CFG_SUPPORT_SWCR
5567 swCrReadWriteCmd(prAdapter,
5568 SWCR_READ/* Read */,
5572 #endif /* CFG_SUPPORT_SWCR */
5576 u4Data = 0x5AA56620;
5583 rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
5584 rCmdSwCtrl.u4Data = 0;
5585 rWlanStatus = wlanSendSetQueryCmd(prAdapter,
5590 nicCmdEventQuerySwCtrlRead,
5591 nicOidCmdTimeoutCommon,
5592 sizeof(CMD_SW_DBG_CTRL_T),
5593 (PUINT_8)&rCmdSwCtrl,
5600 prSwCtrlInfo->u4Data = u4Data;
5605 /* end of wlanoidQuerySwCtrlRead() */
5608 /*----------------------------------------------------------------------------*/
5610 * \brief This routine is called to write SW CTRL
5612 * \param[in] prAdapter Pointer to the Adapter structure.
5613 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
5614 * \param[in] u4SetBufferLen The length of the set buffer.
5615 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
5616 * bytes read from the set buffer. If the call failed
5617 * due to invalid length of the set buffer, returns
5618 * the amount of storage needed.
5620 * \retval WLAN_STATUS_SUCCESS
5621 * \retval WLAN_STATUS_INVALID_LENGTH
5623 /*----------------------------------------------------------------------------*/
5625 wlanoidSetSwCtrlWrite (
5626 IN P_ADAPTER_T prAdapter,
5627 IN PVOID pvSetBuffer,
5628 IN UINT_32 u4SetBufferLen,
5629 OUT PUINT_32 pu4SetInfoLen
5632 P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo;
5633 CMD_SW_DBG_CTRL_T rCmdSwCtrl;
5634 WLAN_STATUS rWlanStatus;
5635 UINT_16 u2Id, u2SubId;
5638 DEBUGFUNC("wlanoidSetSwCtrlWrite");
5639 DBGLOG(INIT, LOUD,("\n"));
5642 ASSERT(pu4SetInfoLen);
5644 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T);
5646 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T)) {
5647 return WLAN_STATUS_INVALID_LENGTH;
5650 ASSERT(pvSetBuffer);
5652 prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T)pvSetBuffer;
5654 u2Id = (UINT_16)(prSwCtrlInfo->u4Id >> 16);
5655 u2SubId = (UINT_16)(prSwCtrlInfo->u4Id & BITS(0,15));
5656 u4Data = prSwCtrlInfo->u4Data;
5657 rWlanStatus = WLAN_STATUS_SUCCESS;
5661 /* 0x9000 - 0x9EFF reserved for FW */
5662 /* 0xFFFE reserved for FW */
5664 #if CFG_SUPPORT_SWCR
5666 swCrReadWriteCmd(prAdapter,
5671 #endif /* CFG_SUPPORT_SWCR */
5674 if (u2SubId == 0x8000) {
5675 // CTIA power save mode setting (code: 0x10008000)
5676 prAdapter->u4CtiaPowerMode = u4Data;
5677 prAdapter->fgEnCtiaPowerMode = TRUE;
5681 PARAM_POWER_MODE ePowerMode;
5683 if (prAdapter->u4CtiaPowerMode == 0) {
5684 // force to keep in CAM mode
5685 ePowerMode = Param_PowerModeCAM;
5686 } else if (prAdapter->u4CtiaPowerMode == 1) {
5687 ePowerMode = Param_PowerModeMAX_PSP;
5689 ePowerMode = Param_PowerModeFast_PSP;
5692 nicConfigPowerSaveProfile(
5694 NETWORK_TYPE_AIS_INDEX,
5701 if(u2SubId == 0x0) {
5702 prAdapter->fgEnOnlineScan = (BOOLEAN)u4Data;
5704 else if(u2SubId == 0x1) {
5705 prAdapter->fgDisBcnLostDetection = (BOOLEAN)u4Data;
5707 else if(u2SubId == 0x2) {
5708 prAdapter->rWifiVar.fgSupportUAPSD = (BOOLEAN)u4Data;
5710 else if(u2SubId == 0x3) {
5711 prAdapter->u4UapsdAcBmp = u4Data & BITS(0,15);
5712 prAdapter->rWifiVar.arBssInfo[u4Data>>16].rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
5713 prAdapter->rWifiVar.arBssInfo[u4Data>>16].rPmProfSetupInfo.ucBmpTriggerAC = (UINT_8)prAdapter->u4UapsdAcBmp;
5715 else if(u2SubId == 0x4) {
5716 prAdapter->fgDisStaAgingTimeoutDetection = (BOOLEAN)u4Data;
5718 else if(u2SubId == 0x5) {
5719 prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode = (UINT_8)u4Data;
5725 #if CFG_SUPPORT_SWCR
5727 if(u2SubId == 0x0) {
5729 u4Data = BIT(HIF_RX_PKT_TYPE_MANAGEMENT);
5731 swCrFrameCheckEnable(prAdapter, u4Data);
5733 else if(u2SubId == 0x1) {
5738 fgIsEnable = (BOOLEAN)(u4Data & 0xff);
5739 ucType = 0;//((u4Data>>4) & 0xf);
5740 u4Timeout = ((u4Data>>8) & 0xff);
5741 swCrDebugCheckEnable(prAdapter, fgIsEnable, ucType, u4Timeout);
5746 #if CFG_SUPPORT_802_11W
5748 DBGLOG(RSN, INFO, ("802.11w test 0x%x\n", u2SubId));
5749 if (u2SubId == 0x0) {
5750 rsnStartSaQuery(prAdapter);
5752 if (u2SubId == 0x1) {
5753 rsnStopSaQuery(prAdapter);
5755 if (u2SubId == 0x2) {
5756 rsnSaQueryRequest(prAdapter, NULL);
5758 if (u2SubId == 0x3) {
5759 P_BSS_INFO_T prBssInfo = &(prAdapter->rWifiVar.arBssInfo[(NETWORK_TYPE_AIS_INDEX)]);
5760 authSendDeauthFrame(prAdapter, prBssInfo->prStaRecOfAP , NULL, 7, NULL);
5764 if (u2SubId == 0x3) {
5765 prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_DISABLED;
5767 if (u2SubId == 0x4) {
5768 //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
5769 prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_OPTIONAL;
5771 if (u2SubId == 0x5) {
5772 //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
5773 prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_REQUIRED;
5780 CMD_ACCESS_REG rCmdAccessReg;
5781 #if 1 //CFG_MT6573_SMT_TEST
5782 if (u2SubId == 0x0123) {
5784 DBGLOG(HAL, INFO, ("set smt fixed rate: %d \n", u4Data));
5786 if((ENUM_REGISTRY_FIXED_RATE_T)(u4Data) < FIXED_RATE_NUM) {
5787 prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T)(u4Data);
5790 prAdapter->rWifiVar.eRateSetting = FIXED_RATE_NONE;
5793 if(prAdapter->rWifiVar.eRateSetting == FIXED_RATE_NONE) {
5794 /* Enable Auto (Long/Short) Preamble */
5795 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_AUTO;
5797 else if((prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_20M_400NS &&
5798 prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS7_20M_400NS)
5799 || (prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_40M_400NS &&
5800 prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS32_400NS)) {
5801 /* Force Short Preamble */
5802 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_SHORT;
5805 /* Force Long Preamble */
5806 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_LONG;
5809 /* abort to re-connect */
5811 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
5812 WLAN_STATUS_MEDIA_DISCONNECT,
5816 aisBssBeaconTimeout(prAdapter);
5819 return WLAN_STATUS_SUCCESS;
5822 else if (u2SubId == 0x1234) {
5823 // 1. Disable On-Lin Scan
5824 prAdapter->fgEnOnlineScan = FALSE;
5826 // 3. Disable FIFO FULL no ack
5827 rCmdAccessReg.u4Address = 0x60140028;
5828 rCmdAccessReg.u4Data = 0x904;
5829 wlanSendSetQueryCmd(prAdapter,
5834 nicCmdEventSetCommon,
5835 nicOidCmdTimeoutCommon,
5836 sizeof(CMD_ACCESS_REG),
5837 (PUINT_8)&rCmdAccessReg,
5842 // 4. Disable Roaming
5843 rCmdSwCtrl.u4Id = 0x90000204;
5844 rCmdSwCtrl.u4Data = 0x0;
5845 wlanSendSetQueryCmd(prAdapter,
5850 nicCmdEventSetCommon,
5851 nicOidCmdTimeoutCommon,
5852 sizeof(CMD_SW_DBG_CTRL_T),
5853 (PUINT_8)&rCmdSwCtrl,
5858 rCmdSwCtrl.u4Id = 0x90000200;
5859 rCmdSwCtrl.u4Data = 0x820000;
5860 wlanSendSetQueryCmd(prAdapter,
5865 nicCmdEventSetCommon,
5866 nicOidCmdTimeoutCommon,
5867 sizeof(CMD_SW_DBG_CTRL_T),
5868 (PUINT_8)&rCmdSwCtrl,
5873 // Disalbe auto tx power
5875 rCmdSwCtrl.u4Id = 0xa0100003;
5876 rCmdSwCtrl.u4Data = 0x0;
5877 wlanSendSetQueryCmd(prAdapter,
5882 nicCmdEventSetCommon,
5883 nicOidCmdTimeoutCommon,
5884 sizeof(CMD_SW_DBG_CTRL_T),
5885 (PUINT_8)&rCmdSwCtrl,
5892 // 2. Keep at CAM mode
5894 PARAM_POWER_MODE ePowerMode;
5896 prAdapter->u4CtiaPowerMode = 0;
5897 prAdapter->fgEnCtiaPowerMode = TRUE;
5899 ePowerMode = Param_PowerModeCAM;
5900 rWlanStatus = nicConfigPowerSaveProfile(
5902 NETWORK_TYPE_AIS_INDEX,
5907 // 5. Disable Beacon Timeout Detection
5908 prAdapter->fgDisBcnLostDetection = TRUE;
5910 else if (u2SubId == 0x1235) {
5912 // 1. Enaable On-Lin Scan
5913 prAdapter->fgEnOnlineScan = TRUE;
5915 // 3. Enable FIFO FULL no ack
5916 rCmdAccessReg.u4Address = 0x60140028;
5917 rCmdAccessReg.u4Data = 0x905;
5918 wlanSendSetQueryCmd(prAdapter,
5923 nicCmdEventSetCommon,
5924 nicOidCmdTimeoutCommon,
5925 sizeof(CMD_ACCESS_REG),
5926 (PUINT_8)&rCmdAccessReg,
5931 // 4. Enable Roaming
5932 rCmdSwCtrl.u4Id = 0x90000204;
5933 rCmdSwCtrl.u4Data = 0x1;
5934 wlanSendSetQueryCmd(prAdapter,
5939 nicCmdEventSetCommon,
5940 nicOidCmdTimeoutCommon,
5941 sizeof(CMD_SW_DBG_CTRL_T),
5942 (PUINT_8)&rCmdSwCtrl,
5947 rCmdSwCtrl.u4Id = 0x90000200;
5948 rCmdSwCtrl.u4Data = 0x820000;
5949 wlanSendSetQueryCmd(prAdapter,
5954 nicCmdEventSetCommon,
5955 nicOidCmdTimeoutCommon,
5956 sizeof(CMD_SW_DBG_CTRL_T),
5957 (PUINT_8)&rCmdSwCtrl,
5962 // Enable auto tx power
5965 rCmdSwCtrl.u4Id = 0xa0100003;
5966 rCmdSwCtrl.u4Data = 0x1;
5967 wlanSendSetQueryCmd(prAdapter,
5972 nicCmdEventSetCommon,
5973 nicOidCmdTimeoutCommon,
5974 sizeof(CMD_SW_DBG_CTRL_T),
5975 (PUINT_8)&rCmdSwCtrl,
5981 // 2. Keep at Fast PS
5983 PARAM_POWER_MODE ePowerMode;
5985 prAdapter->u4CtiaPowerMode = 2;
5986 prAdapter->fgEnCtiaPowerMode = TRUE;
5988 ePowerMode = Param_PowerModeFast_PSP;
5989 rWlanStatus = nicConfigPowerSaveProfile(
5991 NETWORK_TYPE_AIS_INDEX,
5996 // 5. Enable Beacon Timeout Detection
5997 prAdapter->fgDisBcnLostDetection = FALSE;
6006 rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
6007 rCmdSwCtrl.u4Data = prSwCtrlInfo->u4Data;
6008 rWlanStatus = wlanSendSetQueryCmd(prAdapter,
6013 nicCmdEventSetCommon,
6014 nicOidCmdTimeoutCommon,
6015 sizeof(CMD_SW_DBG_CTRL_T),
6016 (PUINT_8)&rCmdSwCtrl,
6021 } /* switch(u2Id) */
6025 /* wlanoidSetSwCtrlWrite */
6028 /*----------------------------------------------------------------------------*/
6030 * \brief This routine is called to query EEPROM value.
6032 * \param[in] pvAdapter Pointer to the Adapter structure.
6033 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6035 * \param[in] u4QueryBufLen The length of the query buffer.
6036 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6037 * bytes written into the query buffer. If the call
6038 * failed due to invalid length of the query buffer,
6039 * returns the amount of storage needed.
6041 * \retval WLAN_STATUS_SUCCESS
6042 * \retval WLAN_STATUS_FAILURE
6044 /*----------------------------------------------------------------------------*/
6046 wlanoidQueryEepromRead (
6047 IN P_ADAPTER_T prAdapter,
6048 IN PVOID pvQueryBuffer,
6049 IN UINT_32 u4QueryBufferLen,
6050 OUT PUINT_32 pu4QueryInfoLen
6053 P_PARAM_CUSTOM_EEPROM_RW_STRUC_T prEepromRwInfo;
6054 CMD_ACCESS_EEPROM rCmdAccessEeprom;
6056 DEBUGFUNC("wlanoidQueryEepromRead");
6059 ASSERT(pu4QueryInfoLen);
6060 if (u4QueryBufferLen) {
6061 ASSERT(pvQueryBuffer);
6064 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T);
6066 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T)) {
6067 return WLAN_STATUS_INVALID_LENGTH;
6070 prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUC_T)pvQueryBuffer;
6072 kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
6073 rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
6075 return wlanSendSetQueryCmd(prAdapter,
6076 CMD_ID_ACCESS_EEPROM,
6080 nicCmdEventQueryEepromRead,
6081 nicOidCmdTimeoutCommon,
6082 sizeof(CMD_ACCESS_EEPROM),
6083 (PUINT_8)&rCmdAccessEeprom,
6088 } /* wlanoidQueryEepromRead */
6091 /*----------------------------------------------------------------------------*/
6093 * \brief This routine is called to write EEPROM value.
6095 * \param[in] prAdapter Pointer to the Adapter structure.
6096 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
6097 * \param[in] u4SetBufferLen The length of the set buffer.
6098 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
6099 * bytes read from the set buffer. If the call failed
6100 * due to invalid length of the set buffer, returns
6101 * the amount of storage needed.
6103 * \retval WLAN_STATUS_SUCCESS
6104 * \retval WLAN_STATUS_FAILURE
6106 /*----------------------------------------------------------------------------*/
6108 wlanoidSetEepromWrite (
6109 IN P_ADAPTER_T prAdapter,
6110 IN PVOID pvSetBuffer,
6111 IN UINT_32 u4SetBufferLen,
6112 OUT PUINT_32 pu4SetInfoLen
6115 P_PARAM_CUSTOM_EEPROM_RW_STRUC_T prEepromRwInfo;
6116 CMD_ACCESS_EEPROM rCmdAccessEeprom;
6118 DEBUGFUNC("wlanoidSetEepromWrite");
6119 DBGLOG(INIT, LOUD,("\n"));
6122 ASSERT(pu4SetInfoLen);
6124 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T);
6126 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T)) {
6127 return WLAN_STATUS_INVALID_LENGTH;
6130 ASSERT(pvSetBuffer);
6132 prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUC_T)pvSetBuffer;
6134 kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
6135 rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
6136 rCmdAccessEeprom.u2Data = prEepromRwInfo->u2EepromData;
6138 return wlanSendSetQueryCmd(prAdapter,
6139 CMD_ID_ACCESS_EEPROM,
6143 nicCmdEventSetCommon,
6144 nicOidCmdTimeoutCommon,
6145 sizeof(CMD_ACCESS_EEPROM),
6146 (PUINT_8)&rCmdAccessEeprom,
6151 } /* wlanoidSetEepromWrite */
6154 /*----------------------------------------------------------------------------*/
6156 * \brief This routine is called to query the number of the successfully transmitted
6159 * \param[in] pvAdapter Pointer to the Adapter structure.
6160 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6162 * \param[in] u4QueryBufLen The length of the query buffer.
6163 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6164 * bytes written into the query buffer. If the call
6165 * failed due to invalid length of the query buffer,
6166 * returns the amount of storage needed.
6168 * \retval WLAN_STATUS_SUCCESS
6169 * \retval WLAN_STATUS_INVALID_LENGTH
6171 /*----------------------------------------------------------------------------*/
6173 wlanoidQueryXmitOk (
6174 IN P_ADAPTER_T prAdapter,
6175 IN PVOID pvQueryBuffer,
6176 IN UINT_32 u4QueryBufferLen,
6177 OUT PUINT_32 pu4QueryInfoLen
6180 DEBUGFUNC("wlanoidQueryXmitOk");
6181 DBGLOG(REQ, LOUD, ("\n"));
6184 if (u4QueryBufferLen) {
6185 ASSERT(pvQueryBuffer);
6187 ASSERT(pu4QueryInfoLen);
6189 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6190 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6191 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6192 *pu4QueryInfoLen = sizeof(UINT_32);
6193 return WLAN_STATUS_ADAPTER_NOT_READY;
6195 else if (u4QueryBufferLen < sizeof(UINT_32)
6196 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6197 *pu4QueryInfoLen = sizeof(UINT_64);
6198 return WLAN_STATUS_INVALID_LENGTH;
6201 #if CFG_ENABLE_STATISTICS_BUFFERING
6202 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6203 if(u4QueryBufferLen == sizeof(UINT_32)) {
6204 *pu4QueryInfoLen = sizeof(UINT_32);
6205 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
6208 *pu4QueryInfoLen = sizeof(UINT_64);
6209 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
6212 return WLAN_STATUS_SUCCESS;
6217 return wlanSendSetQueryCmd(prAdapter,
6218 CMD_ID_GET_STATISTICS,
6222 nicCmdEventQueryXmitOk,
6223 nicOidCmdTimeoutCommon,
6230 } /* wlanoidQueryXmitOk */
6233 /*----------------------------------------------------------------------------*/
6235 * \brief This routine is called to query the number of the successfully received
6238 * \param[in] pvAdapter Pointer to the Adapter structure.
6239 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6241 * \param[in] u4QueryBufLen The length of the query buffer.
6242 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6243 * bytes written into the query buffer. If the call
6244 * failed due to invalid length of the query buffer,
6245 * returns the amount of storage needed.
6247 * \retval WLAN_STATUS_SUCCESS
6248 * \retval WLAN_STATUS_INVALID_LENGTH
6250 /*----------------------------------------------------------------------------*/
6253 IN P_ADAPTER_T prAdapter,
6254 IN PVOID pvQueryBuffer,
6255 IN UINT_32 u4QueryBufferLen,
6256 OUT PUINT_32 pu4QueryInfoLen
6259 DEBUGFUNC("wlanoidQueryRcvOk");
6260 DBGLOG(REQ, LOUD, ("\n"));
6263 if (u4QueryBufferLen) {
6264 ASSERT(pvQueryBuffer);
6266 ASSERT(pu4QueryInfoLen);
6268 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6269 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6270 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6271 *pu4QueryInfoLen = sizeof(UINT_32);
6272 return WLAN_STATUS_ADAPTER_NOT_READY;
6274 else if (u4QueryBufferLen < sizeof(UINT_32)
6275 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6276 *pu4QueryInfoLen = sizeof(UINT_64);
6277 return WLAN_STATUS_INVALID_LENGTH;
6280 #if CFG_ENABLE_STATISTICS_BUFFERING
6281 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6282 if(u4QueryBufferLen == sizeof(UINT_32)) {
6283 *pu4QueryInfoLen = sizeof(UINT_32);
6284 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
6287 *pu4QueryInfoLen = sizeof(UINT_64);
6288 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
6291 return WLAN_STATUS_SUCCESS;
6296 return wlanSendSetQueryCmd(prAdapter,
6297 CMD_ID_GET_STATISTICS,
6301 nicCmdEventQueryRecvOk,
6302 nicOidCmdTimeoutCommon,
6309 } /* wlanoidQueryRcvOk */
6312 /*----------------------------------------------------------------------------*/
6314 * \brief This routine is called to query the number of frames that the driver
6315 * fails to transmit.
6317 * \param[in] pvAdapter Pointer to the Adapter structure.
6318 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6320 * \param[in] u4QueryBufLen The length of the query buffer.
6321 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6322 * bytes written into the query buffer. If the call
6323 * failed due to invalid length of the query buffer,
6324 * returns the amount of storage needed.
6326 * \retval WLAN_STATUS_SUCCESS
6327 * \retval WLAN_STATUS_INVALID_LENGTH
6329 /*----------------------------------------------------------------------------*/
6331 wlanoidQueryXmitError (
6332 IN P_ADAPTER_T prAdapter,
6333 IN PVOID pvQueryBuffer,
6334 IN UINT_32 u4QueryBufferLen,
6335 OUT PUINT_32 pu4QueryInfoLen
6338 DEBUGFUNC("wlanoidQueryXmitError");
6339 DBGLOG(REQ, LOUD, ("\n"));
6342 if (u4QueryBufferLen) {
6343 ASSERT(pvQueryBuffer);
6345 ASSERT(pu4QueryInfoLen);
6347 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6348 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6349 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6350 *pu4QueryInfoLen = sizeof(UINT_32);
6351 return WLAN_STATUS_ADAPTER_NOT_READY;
6353 else if (u4QueryBufferLen < sizeof(UINT_32)
6354 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6355 *pu4QueryInfoLen = sizeof(UINT_64);
6356 return WLAN_STATUS_INVALID_LENGTH;
6359 #if CFG_ENABLE_STATISTICS_BUFFERING
6360 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6361 if(u4QueryBufferLen == sizeof(UINT_32)) {
6362 *pu4QueryInfoLen = sizeof(UINT_32);
6363 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
6366 *pu4QueryInfoLen = sizeof(UINT_64);
6367 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
6370 return WLAN_STATUS_SUCCESS;
6375 return wlanSendSetQueryCmd(prAdapter,
6376 CMD_ID_GET_STATISTICS,
6380 nicCmdEventQueryXmitError,
6381 nicOidCmdTimeoutCommon,
6388 } /* wlanoidQueryXmitError */
6391 /*----------------------------------------------------------------------------*/
6393 * \brief This routine is called to query the number of frames successfully
6394 * transmitted after exactly one collision.
6396 * \param[in] prAdapter Pointer to the Adapter structure.
6397 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6399 * \param[in] u4QueryBufLen The length of the query buffer.
6400 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6401 * bytes written into the query buffer. If the call
6402 * failed due to invalid length of the query buffer,
6403 * returns the amount of storage needed.
6405 * \retval WLAN_STATUS_SUCCESS
6406 * \retval WLAN_STATUS_INVALID_LENGTH
6408 /*----------------------------------------------------------------------------*/
6410 wlanoidQueryXmitOneCollision (
6411 IN P_ADAPTER_T prAdapter,
6412 IN PVOID pvQueryBuffer,
6413 IN UINT_32 u4QueryBufferLen,
6414 OUT PUINT_32 pu4QueryInfoLen
6417 DEBUGFUNC("wlanoidQueryXmitOneCollision");
6418 DBGLOG(REQ, LOUD, ("\n"));
6421 if (u4QueryBufferLen) {
6422 ASSERT(pvQueryBuffer);
6424 ASSERT(pu4QueryInfoLen);
6426 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6427 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6428 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6429 *pu4QueryInfoLen = sizeof(UINT_32);
6430 return WLAN_STATUS_ADAPTER_NOT_READY;
6432 else if (u4QueryBufferLen < sizeof(UINT_32)
6433 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6434 *pu4QueryInfoLen = sizeof(UINT_64);
6435 return WLAN_STATUS_INVALID_LENGTH;
6438 #if CFG_ENABLE_STATISTICS_BUFFERING
6439 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6440 if(u4QueryBufferLen == sizeof(UINT_32)) {
6441 *pu4QueryInfoLen = sizeof(UINT_32);
6442 *(PUINT_32) pvQueryBuffer = (UINT_32)
6443 (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart - prAdapter->rStatStruct.rRetryCount.QuadPart);
6446 *pu4QueryInfoLen = sizeof(UINT_64);
6447 *(PUINT_64) pvQueryBuffer = (UINT_64)
6448 (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart - prAdapter->rStatStruct.rRetryCount.QuadPart);
6451 return WLAN_STATUS_SUCCESS;
6456 return wlanSendSetQueryCmd(prAdapter,
6457 CMD_ID_GET_STATISTICS,
6461 nicCmdEventQueryXmitOneCollision,
6462 nicOidCmdTimeoutCommon,
6469 } /* wlanoidQueryXmitOneCollision */
6472 /*----------------------------------------------------------------------------*/
6474 * \brief This routine is called to query the number of frames successfully
6475 * transmitted after more than one collision.
6477 * \param[in] prAdapter Pointer to the Adapter structure.
6478 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6480 * \param[in] u4QueryBufLen The length of the query buffer.
6481 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6482 * bytes written into the query buffer. If the call
6483 * failed due to invalid length of the query buffer,
6484 * returns the amount of storage needed.
6486 * \retval WLAN_STATUS_SUCCESS
6487 * \retval WLAN_STATUS_INVALID_LENGTH
6489 /*----------------------------------------------------------------------------*/
6491 wlanoidQueryXmitMoreCollisions (
6492 IN P_ADAPTER_T prAdapter,
6493 IN PVOID pvQueryBuffer,
6494 IN UINT_32 u4QueryBufferLen,
6495 OUT PUINT_32 pu4QueryInfoLen
6498 DEBUGFUNC("wlanoidQueryXmitMoreCollisions");
6499 DBGLOG(REQ, LOUD, ("\n"));
6502 if (u4QueryBufferLen) {
6503 ASSERT(pvQueryBuffer);
6505 ASSERT(pu4QueryInfoLen);
6507 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6508 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6509 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6510 *pu4QueryInfoLen = sizeof(UINT_32);
6511 return WLAN_STATUS_ADAPTER_NOT_READY;
6513 else if (u4QueryBufferLen < sizeof(UINT_32)
6514 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6515 *pu4QueryInfoLen = sizeof(UINT_64);
6516 return WLAN_STATUS_INVALID_LENGTH;
6519 #if CFG_ENABLE_STATISTICS_BUFFERING
6520 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6521 if(u4QueryBufferLen == sizeof(UINT_32)) {
6522 *pu4QueryInfoLen = sizeof(UINT_32);
6523 *(PUINT_32) pvQueryBuffer = (UINT_32) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
6526 *pu4QueryInfoLen = sizeof(UINT_64);
6527 *(PUINT_64) pvQueryBuffer = (UINT_64) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
6530 return WLAN_STATUS_SUCCESS;
6535 return wlanSendSetQueryCmd(prAdapter,
6536 CMD_ID_GET_STATISTICS,
6540 nicCmdEventQueryXmitMoreCollisions,
6541 nicOidCmdTimeoutCommon,
6548 } /* wlanoidQueryXmitMoreCollisions */
6551 /*----------------------------------------------------------------------------*/
6553 * \brief This routine is called to query the number of frames
6554 * not transmitted due to excessive collisions.
6556 * \param[in] prAdapter Pointer to the Adapter structure.
6557 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6559 * \param[in] u4QueryBufferLen The length of the query buffer.
6560 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6561 * bytes written into the query buffer. If the call
6562 * failed due to invalid length of the query buffer,
6563 * returns the amount of storage needed.
6565 * \retval WLAN_STATUS_SUCCESS
6566 * \retval WLAN_STATUS_INVALID_LENGTH
6568 /*----------------------------------------------------------------------------*/
6570 wlanoidQueryXmitMaxCollisions (
6571 IN P_ADAPTER_T prAdapter,
6572 IN PVOID pvQueryBuffer,
6573 IN UINT_32 u4QueryBufferLen,
6574 OUT PUINT_32 pu4QueryInfoLen
6577 DEBUGFUNC("wlanoidQueryXmitMaxCollisions");
6578 DBGLOG(REQ, LOUD, ("\n"));
6581 if (u4QueryBufferLen) {
6582 ASSERT(pvQueryBuffer);
6584 ASSERT(pu4QueryInfoLen);
6586 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6587 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6588 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6589 *pu4QueryInfoLen = sizeof(UINT_32);
6590 return WLAN_STATUS_ADAPTER_NOT_READY;
6592 else if (u4QueryBufferLen < sizeof(UINT_32)
6593 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6594 *pu4QueryInfoLen = sizeof(UINT_64);
6595 return WLAN_STATUS_INVALID_LENGTH;
6598 #if CFG_ENABLE_STATISTICS_BUFFERING
6599 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6600 if(u4QueryBufferLen == sizeof(UINT_32)) {
6601 *pu4QueryInfoLen = sizeof(UINT_32);
6602 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
6605 *pu4QueryInfoLen = sizeof(UINT_64);
6606 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
6609 return WLAN_STATUS_SUCCESS;
6614 return wlanSendSetQueryCmd(prAdapter,
6615 CMD_ID_GET_STATISTICS,
6619 nicCmdEventQueryXmitMaxCollisions,
6620 nicOidCmdTimeoutCommon,
6627 } /* wlanoidQueryXmitMaxCollisions */
6630 #define MTK_CUSTOM_OID_INTERFACE_VERSION 0x00006620 // for WPDWifi DLL
6631 /*----------------------------------------------------------------------------*/
6633 * \brief This routine is called to query current the OID interface version,
6634 * which is the interface between the application and driver.
6636 * \param[in] prAdapter Pointer to the Adapter structure.
6637 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6639 * \param[in] u4QueryBufferLen The length of the query buffer.
6640 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6641 * bytes written into the query buffer. If the call
6642 * failed due to invalid length of the query buffer,
6643 * returns the amount of storage needed.
6645 * \retval WLAN_STATUS_SUCCESS
6647 /*----------------------------------------------------------------------------*/
6649 wlanoidQueryOidInterfaceVersion (
6650 IN P_ADAPTER_T prAdapter,
6651 IN PVOID pvQueryBuffer,
6652 IN UINT_32 u4QueryBufferLen,
6653 OUT PUINT_32 pu4QueryInfoLen)
6655 DEBUGFUNC("wlanoidQueryOidInterfaceVersion");
6658 if (u4QueryBufferLen) {
6659 ASSERT(pvQueryBuffer);
6661 ASSERT(pu4QueryInfoLen);
6663 *(PUINT_32) pvQueryBuffer = MTK_CUSTOM_OID_INTERFACE_VERSION ;
6664 *pu4QueryInfoLen = sizeof(UINT_32);
6666 DBGLOG(REQ, WARN, ("Custom OID interface version: %#08lX\n",
6667 *(PUINT_32) pvQueryBuffer));
6669 return WLAN_STATUS_SUCCESS;
6670 } /* wlanoidQueryOidInterfaceVersion */
6673 /*----------------------------------------------------------------------------*/
6675 * \brief This routine is called to query current Multicast Address List.
6677 * \param[in] prAdapter Pointer to the Adapter structure.
6678 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6680 * \param[in] u4QueryBufferLen The length of the query buffer.
6681 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6682 * bytes written into the query buffer. If the call
6683 * failed due to invalid length of the query buffer,
6684 * returns the amount of storage needed.
6686 * \retval WLAN_STATUS_SUCCESS
6687 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
6689 /*----------------------------------------------------------------------------*/
6691 wlanoidQueryMulticastList(
6692 IN P_ADAPTER_T prAdapter,
6693 OUT PVOID pvQueryBuffer,
6694 IN UINT_32 u4QueryBufferLen,
6695 OUT PUINT_32 pu4QueryInfoLen
6700 ASSERT(pu4QueryInfoLen);
6701 if (u4QueryBufferLen) {
6702 ASSERT(pvQueryBuffer);
6705 return wlanSendSetQueryCmd(prAdapter,
6706 CMD_ID_MAC_MCAST_ADDR,
6710 nicCmdEventQueryMcastAddr,
6711 nicOidCmdTimeoutCommon,
6718 return WLAN_STATUS_SUCCESS;
6720 } /* end of wlanoidQueryMulticastList() */
6723 /*----------------------------------------------------------------------------*/
6725 * \brief This routine is called to set Multicast Address List.
6727 * \param[in] prAdapter Pointer to the Adapter structure.
6728 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
6729 * \param[in] u4SetBufferLen The length of the set buffer.
6730 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
6731 * bytes read from the set buffer. If the call failed
6732 * due to invalid length of the set buffer, returns
6733 * the amount of storage needed.
6735 * \retval WLAN_STATUS_SUCCESS
6736 * \retval WLAN_STATUS_INVALID_LENGTH
6737 * \retval WLAN_STATUS_ADAPTER_NOT_READY
6738 * \retval WLAN_STATUS_MULTICAST_FULL
6740 /*----------------------------------------------------------------------------*/
6742 wlanoidSetMulticastList(
6743 IN P_ADAPTER_T prAdapter,
6744 IN PVOID pvSetBuffer,
6745 IN UINT_32 u4SetBufferLen,
6746 OUT PUINT_32 pu4SetInfoLen
6749 UINT_8 ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Caller should provide this information */
6750 CMD_MAC_MCAST_ADDR rCmdMacMcastAddr;
6752 ASSERT(pu4SetInfoLen);
6754 /* The data must be a multiple of the Ethernet address size. */
6755 if ((u4SetBufferLen % MAC_ADDR_LEN)) {
6756 DBGLOG(REQ, WARN, ("Invalid MC list length %ld\n", u4SetBufferLen));
6758 *pu4SetInfoLen = (((u4SetBufferLen + MAC_ADDR_LEN) - 1) /
6759 MAC_ADDR_LEN) * MAC_ADDR_LEN;
6761 return WLAN_STATUS_INVALID_LENGTH;
6764 *pu4SetInfoLen = u4SetBufferLen;
6766 /* Verify if we can support so many multicast addresses. */
6767 if ((u4SetBufferLen / MAC_ADDR_LEN) > MAX_NUM_GROUP_ADDR) {
6768 DBGLOG(REQ, WARN, ("Too many MC addresses\n"));
6770 return WLAN_STATUS_MULTICAST_FULL;
6773 /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
6774 * pvSetBuffer == NULL to clear exist Multicast List.
6776 if (u4SetBufferLen) {
6777 ASSERT(pvSetBuffer);
6780 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6781 DBGLOG(REQ, WARN, ("Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6782 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6783 return WLAN_STATUS_ADAPTER_NOT_READY;
6786 rCmdMacMcastAddr.u4NumOfGroupAddr = u4SetBufferLen / MAC_ADDR_LEN;
6787 rCmdMacMcastAddr.ucNetTypeIndex = ucNetTypeIndex;
6788 kalMemCopy(rCmdMacMcastAddr.arAddress, pvSetBuffer, u4SetBufferLen);
6790 return wlanSendSetQueryCmd(prAdapter,
6791 CMD_ID_MAC_MCAST_ADDR,
6795 nicCmdEventSetCommon,
6796 nicOidCmdTimeoutCommon,
6797 sizeof(CMD_MAC_MCAST_ADDR),
6798 (PUINT_8)&rCmdMacMcastAddr,
6802 } /* end of wlanoidSetMulticastList() */
6806 /*----------------------------------------------------------------------------*/
6808 * \brief This routine is called to set Packet Filter.
6810 * \param[in] prAdapter Pointer to the Adapter structure.
6811 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
6812 * \param[in] u4SetBufferLen The length of the set buffer.
6813 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
6814 * bytes read from the set buffer. If the call failed
6815 * due to invalid length of the set buffer, returns
6816 * the amount of storage needed.
6818 * \retval WLAN_STATUS_SUCCESS
6819 * \retval WLAN_STATUS_INVALID_LENGTH
6820 * \retval WLAN_STATUS_NOT_SUPPORTED
6821 * \retval WLAN_STATUS_ADAPTER_NOT_READY
6823 /*----------------------------------------------------------------------------*/
6825 wlanoidSetCurrentPacketFilter (
6826 IN P_ADAPTER_T prAdapter,
6827 IN PVOID pvSetBuffer,
6828 IN UINT_32 u4SetBufferLen,
6829 OUT PUINT_32 pu4SetInfoLen
6832 UINT_32 u4NewPacketFilter;
6833 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
6835 DEBUGFUNC("wlanoidSetCurrentPacketFilter");
6838 ASSERT(pu4SetInfoLen);
6840 if (u4SetBufferLen < sizeof(UINT_32)) {
6841 *pu4SetInfoLen = sizeof(UINT_32);
6842 return WLAN_STATUS_INVALID_LENGTH;
6844 ASSERT(pvSetBuffer);
6846 /* Set the new packet filter. */
6847 u4NewPacketFilter = *(PUINT_32) pvSetBuffer;
6849 DBGLOG(REQ, INFO, ("New packet filter: %#08lx\n", u4NewPacketFilter));
6851 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6852 DBGLOG(REQ, WARN, ("Fail in set current packet filter! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6853 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6854 return WLAN_STATUS_ADAPTER_NOT_READY;
6858 /* Verify the bits of the new packet filter. If any bits are set that
6859 we don't support, leave. */
6860 if (u4NewPacketFilter & ~(PARAM_PACKET_FILTER_SUPPORTED)) {
6861 rStatus = WLAN_STATUS_NOT_SUPPORTED;
6866 /* Need to enable or disable promiscuous support depending on the new
6868 if (u4NewPacketFilter & PARAM_PACKET_FILTER_PROMISCUOUS) {
6869 DBGLOG(REQ, INFO, ("Enable promiscuous mode\n"));
6872 DBGLOG(REQ, INFO, ("Disable promiscuous mode\n"));
6875 if (u4NewPacketFilter & PARAM_PACKET_FILTER_ALL_MULTICAST) {
6876 DBGLOG(REQ, INFO, ("Enable all-multicast mode\n"));
6878 else if (u4NewPacketFilter & PARAM_PACKET_FILTER_MULTICAST) {
6879 DBGLOG(REQ, INFO, ("Enable multicast\n"));
6882 DBGLOG(REQ, INFO, ("Disable multicast\n"));
6885 if (u4NewPacketFilter & PARAM_PACKET_FILTER_BROADCAST) {
6886 DBGLOG(REQ, INFO, ("Enable Broadcast\n"));
6889 DBGLOG(REQ, INFO, ("Disable Broadcast\n"));
6894 if(rStatus == WLAN_STATUS_SUCCESS) {
6895 // Store the packet filter
6897 prAdapter->u4OsPacketFilter &= PARAM_PACKET_FILTER_P2P_MASK;
6898 prAdapter->u4OsPacketFilter |= u4NewPacketFilter;
6900 return wlanSendSetQueryCmd(prAdapter,
6901 CMD_ID_SET_RX_FILTER,
6905 nicCmdEventSetCommon,
6906 nicOidCmdTimeoutCommon,
6908 (PUINT_8)&prAdapter->u4OsPacketFilter,
6916 } /* wlanoidSetCurrentPacketFilter */
6919 /*----------------------------------------------------------------------------*/
6921 * \brief This routine is called to query current packet filter.
6923 * \param[in] prAdapter Pointer to the Adapter structure.
6924 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6926 * \param[in] u4QueryBufferLen The length of the query buffer.
6927 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6928 * bytes written into the query buffer. If the call
6929 * failed due to invalid length of the query buffer,
6930 * returns the amount of storage needed.
6932 * \retval WLAN_STATUS_SUCCESS
6934 /*----------------------------------------------------------------------------*/
6936 wlanoidQueryCurrentPacketFilter (
6937 IN P_ADAPTER_T prAdapter,
6938 OUT PVOID pvQueryBuffer,
6939 IN UINT_32 u4QueryBufferLen,
6940 OUT PUINT_32 pu4QueryInfoLen
6943 DEBUGFUNC("wlanoidQueryCurrentPacketFilter");
6945 ASSERT(pu4QueryInfoLen);
6947 *pu4QueryInfoLen = sizeof(UINT_32);
6949 if (u4QueryBufferLen >= sizeof(UINT_32)) {
6950 ASSERT(pvQueryBuffer);
6951 *(PUINT_32) pvQueryBuffer = prAdapter->u4OsPacketFilter;
6954 return WLAN_STATUS_SUCCESS;
6955 } /* wlanoidQueryCurrentPacketFilter */
6957 /*----------------------------------------------------------------------------*/
6959 * \brief This routine is called to query ACPI device power state.
6961 * \param[in] prAdapter Pointer to the Adapter structure.
6962 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6964 * \param[in] u4QueryBufferLen The length of the query buffer.
6965 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6966 * bytes written into the query buffer. If the call
6967 * failed due to invalid length of the query buffer,
6968 * returns the amount of storage needed.
6970 * \retval WLAN_STATUS_SUCCESS
6972 /*----------------------------------------------------------------------------*/
6974 wlanoidQueryAcpiDevicePowerState (
6975 IN P_ADAPTER_T prAdapter,
6976 IN PVOID pvQueryBuffer,
6977 IN UINT_32 u4QueryBufferLen,
6978 OUT PUINT_32 pu4QueryInfoLen
6982 PPARAM_DEVICE_POWER_STATE prPowerState;
6985 DEBUGFUNC("wlanoidQueryAcpiDevicePowerState");
6987 ASSERT(pu4QueryInfoLen);
6988 if (u4QueryBufferLen) {
6989 ASSERT(pvQueryBuffer);
6992 *pu4QueryInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
6995 prPowerState = (PPARAM_DEVICE_POWER_STATE) pvQueryBuffer;
6996 switch (*prPowerState) {
6997 case ParamDeviceStateD0:
6998 DBGLOG(REQ, INFO, ("Query Power State: D0\n"));
7000 case ParamDeviceStateD1:
7001 DBGLOG(REQ, INFO, ("Query Power State: D1\n"));
7003 case ParamDeviceStateD2:
7004 DBGLOG(REQ, INFO, ("Query Power State: D2\n"));
7006 case ParamDeviceStateD3:
7007 DBGLOG(REQ, INFO, ("Query Power State: D3\n"));
7014 /* Since we will disconnect the newwork, therefore we do not
7015 need to check queue empty */
7016 *(PPARAM_DEVICE_POWER_STATE) pvQueryBuffer = ParamDeviceStateD3;
7017 //WARNLOG(("Ready to transition to D3\n"));
7018 return WLAN_STATUS_SUCCESS;
7020 } /* pwrmgtQueryPower */
7023 /*----------------------------------------------------------------------------*/
7025 * \brief This routine is called to set ACPI device power state.
7027 * \param[in] pvAdapter Pointer to the Adapter structure.
7028 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7029 * \param[in] u4SetBufferLen The length of the set buffer.
7030 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7031 * bytes read from the set buffer. If the call failed
7032 * due to invalid length of the set buffer, returns
7033 * the amount of storage needed.
7035 * \retval WLAN_STATUS_SUCCESS
7037 /*----------------------------------------------------------------------------*/
7039 wlanoidSetAcpiDevicePowerState (
7040 IN P_ADAPTER_T prAdapter,
7041 IN PVOID pvSetBuffer,
7042 IN UINT_32 u4SetBufferLen,
7043 OUT PUINT_32 pu4SetInfoLen
7046 PPARAM_DEVICE_POWER_STATE prPowerState;
7047 BOOLEAN fgRetValue = TRUE;
7049 DEBUGFUNC("wlanoidSetAcpiDevicePowerState");
7051 ASSERT(pu4SetInfoLen);
7053 *pu4SetInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
7055 ASSERT(pvSetBuffer);
7056 prPowerState = (PPARAM_DEVICE_POWER_STATE) pvSetBuffer;
7057 switch (*prPowerState) {
7058 case ParamDeviceStateD0:
7059 DBGLOG(REQ, INFO, ("Set Power State: D0\n"));
7060 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD0);
7061 fgRetValue = nicpmSetAcpiPowerD0(prAdapter);
7063 case ParamDeviceStateD1:
7064 DBGLOG(REQ, INFO, ("Set Power State: D1\n"));
7066 case ParamDeviceStateD2:
7067 DBGLOG(REQ, INFO, ("Set Power State: D2\n"));
7069 case ParamDeviceStateD3:
7070 DBGLOG(REQ, INFO, ("Set Power State: D3\n"));
7071 fgRetValue = nicpmSetAcpiPowerD3(prAdapter);
7072 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD3);
7078 if(fgRetValue == TRUE)
7079 return WLAN_STATUS_SUCCESS;
7081 return WLAN_STATUS_FAILURE;
7082 } /* end of wlanoidSetAcpiDevicePowerState() */
7084 /*----------------------------------------------------------------------------*/
7086 * \brief This routine is called to query the current fragmentation threshold.
7088 * \param[in] pvAdapter Pointer to the Adapter structure.
7089 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
7091 * \param[in] u4QueryBufferLen The length of the query buffer.
7092 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7093 * bytes written into the query buffer. If the call
7094 * failed due to invalid length of the query buffer,
7095 * returns the amount of storage needed.
7097 * \retval WLAN_STATUS_SUCCESS
7098 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7100 /*----------------------------------------------------------------------------*/
7102 wlanoidQueryFragThreshold (
7103 IN P_ADAPTER_T prAdapter,
7104 OUT PVOID pvQueryBuffer,
7105 IN UINT_32 u4QueryBufferLen,
7106 OUT PUINT_32 pu4QueryInfoLen
7109 DEBUGFUNC("wlanoidQueryFragThreshold");
7112 if (u4QueryBufferLen) {
7113 ASSERT(pvQueryBuffer);
7115 ASSERT(pu4QueryInfoLen);
7117 DBGLOG(REQ, LOUD, ("\n"));
7121 return WLAN_STATUS_SUCCESS;
7125 return WLAN_STATUS_NOT_SUPPORTED;
7126 #endif /* CFG_TX_FRAGMENT */
7128 } /* end of wlanoidQueryFragThreshold() */
7131 /*----------------------------------------------------------------------------*/
7133 * \brief This routine is called to set a new fragmentation threshold to the
7136 * \param[in] pvAdapter Pointer to the Adapter structure.
7137 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7138 * \param[in] u4SetBufferLen The length of the set buffer.
7139 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7140 * bytes read from the set buffer. If the call failed
7141 * due to invalid length of the set buffer, returns
7142 * the amount of storage needed.
7144 * \retval WLAN_STATUS_SUCCESS
7145 * \retval WLAN_STATUS_INVALID_DATA
7146 * \retval WLAN_STATUS_INVALID_LENGTH
7148 /*----------------------------------------------------------------------------*/
7150 wlanoidSetFragThreshold (
7151 IN P_ADAPTER_T prAdapter,
7152 IN PVOID pvSetBuffer,
7153 IN UINT_32 u4SetBufferLen,
7154 OUT PUINT_32 pu4SetInfoLen
7159 return WLAN_STATUS_SUCCESS;
7163 return WLAN_STATUS_NOT_SUPPORTED;
7164 #endif /* CFG_TX_FRAGMENT */
7166 } /* end of wlanoidSetFragThreshold() */
7169 /*----------------------------------------------------------------------------*/
7171 * \brief This routine is called to query the current RTS threshold.
7173 * \param[in] pvAdapter Pointer to the Adapter structure.
7174 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
7176 * \param[in] u4QueryBufferLen The length of the query buffer.
7177 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7178 * bytes written into the query buffer. If the call
7179 * failed due to invalid length of the query buffer,
7180 * returns the amount of storage needed.
7182 * \retval WLAN_STATUS_SUCCESS
7183 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7185 /*----------------------------------------------------------------------------*/
7187 wlanoidQueryRtsThreshold (
7188 IN P_ADAPTER_T prAdapter,
7189 OUT PVOID pvQueryBuffer,
7190 IN UINT_32 u4QueryBufferLen,
7191 OUT PUINT_32 pu4QueryInfoLen
7194 DEBUGFUNC("wlanoidQueryRtsThreshold");
7197 if (u4QueryBufferLen) {
7198 ASSERT(pvQueryBuffer);
7200 ASSERT(pu4QueryInfoLen);
7202 DBGLOG(REQ, LOUD, ("\n"));
7204 if (u4QueryBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
7205 *pu4QueryInfoLen = sizeof(PARAM_RTS_THRESHOLD);
7206 return WLAN_STATUS_BUFFER_TOO_SHORT;
7209 *((PARAM_RTS_THRESHOLD *)pvQueryBuffer) = prAdapter->rWlanInfo.eRtsThreshold;
7211 return WLAN_STATUS_SUCCESS;
7213 } /* wlanoidQueryRtsThreshold */
7216 /*----------------------------------------------------------------------------*/
7218 * \brief This routine is called to set a new RTS threshold to the driver.
7220 * \param[in] pvAdapter Pointer to the Adapter structure.
7221 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7222 * \param[in] u4SetBufferLen The length of the set buffer.
7223 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7224 * bytes read from the set buffer. If the call failed
7225 * due to invalid length of the set buffer, returns
7226 * the amount of storage needed.
7228 * \retval WLAN_STATUS_SUCCESS
7229 * \retval WLAN_STATUS_INVALID_DATA
7230 * \retval WLAN_STATUS_INVALID_LENGTH
7232 /*----------------------------------------------------------------------------*/
7234 wlanoidSetRtsThreshold (
7235 IN P_ADAPTER_T prAdapter,
7236 IN PVOID pvSetBuffer,
7237 IN UINT_32 u4SetBufferLen,
7238 OUT PUINT_32 pu4SetInfoLen
7241 PARAM_RTS_THRESHOLD *prRtsThreshold;
7244 ASSERT(pu4SetInfoLen);
7246 *pu4SetInfoLen = sizeof(PARAM_RTS_THRESHOLD);
7247 if (u4SetBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
7248 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
7249 return WLAN_STATUS_INVALID_LENGTH;
7252 prRtsThreshold = (PARAM_RTS_THRESHOLD *)pvSetBuffer;
7253 *prRtsThreshold = prAdapter->rWlanInfo.eRtsThreshold;
7255 return WLAN_STATUS_SUCCESS;
7257 } /* wlanoidSetRtsThreshold */
7259 /*----------------------------------------------------------------------------*/
7261 * \brief This routine is used to turn radio off.
7263 * \param[in] pvAdapter Pointer to the Adapter structure.
7264 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7265 * \param[in] u4SetBufferLen The length of the set buffer.
7266 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7267 * bytes read from the set buffer. If the call failed
7268 * due to invalid length of the set buffer, returns
7269 * the amount of storage needed.
7271 * \retval WLAN_STATUS_SUCCESS
7272 * \retval WLAN_STATUS_ADAPTER_NOT_READY
7274 /*----------------------------------------------------------------------------*/
7276 wlanoidSetDisassociate (
7277 IN P_ADAPTER_T prAdapter,
7278 IN PVOID pvSetBuffer,
7279 IN UINT_32 u4SetBufferLen,
7280 OUT PUINT_32 pu4SetInfoLen
7283 P_MSG_AIS_ABORT_T prAisAbortMsg;
7285 DEBUGFUNC("wlanoidSetDisassociate");
7288 ASSERT(pu4SetInfoLen);
7292 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
7293 DBGLOG(REQ, WARN, ("Fail in set disassociate! (Adapter not ready). ACPI=D%d, Radio=%d\n",
7294 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
7295 return WLAN_STATUS_ADAPTER_NOT_READY;
7298 /* prepare message to AIS */
7299 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
7301 /* Send AIS Abort Message */
7302 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
7303 if (!prAisAbortMsg) {
7305 return WLAN_STATUS_FAILURE;
7308 prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
7309 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
7310 prAisAbortMsg->fgDelayIndication = FALSE;
7312 mboxSendMsg(prAdapter,
7314 (P_MSG_HDR_T) prAisAbortMsg,
7315 MSG_SEND_METHOD_BUF);
7317 /* indicate for disconnection */
7318 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
7319 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
7320 WLAN_STATUS_MEDIA_DISCONNECT,
7326 prAdapter->fgIsRadioOff = TRUE;
7329 return WLAN_STATUS_SUCCESS;
7330 } /* wlanoidSetDisassociate */
7334 /*----------------------------------------------------------------------------*/
7336 * \brief This routine is used to query the power save profile.
7338 * \param[in] prAdapter Pointer to the Adapter structure.
7339 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
7341 * \param[in] u4QueryBufLen The length of the query buffer.
7342 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7343 * bytes written into the query buffer. If the call
7344 * failed due to invalid length of the query buffer,
7345 * returns the amount of storage needed.
7347 * \return WLAN_STATUS_SUCCESS
7349 /*----------------------------------------------------------------------------*/
7351 wlanoidQuery802dot11PowerSaveProfile (
7352 IN P_ADAPTER_T prAdapter,
7353 IN PVOID pvQueryBuffer,
7354 IN UINT_32 u4QueryBufferLen,
7355 OUT PUINT_32 pu4QueryInfoLen
7358 DEBUGFUNC("wlanoidQuery802dot11PowerSaveProfile");
7361 ASSERT(pu4QueryInfoLen);
7363 if (u4QueryBufferLen!=0) {
7364 ASSERT(pvQueryBuffer);
7366 // *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.ePowerSaveMode.ucPsProfile);
7367 *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_AIS_INDEX].ucPsProfile);
7368 *pu4QueryInfoLen = sizeof(PARAM_POWER_MODE);
7370 // hack for CTIA power mode setting function
7371 if (prAdapter->fgEnCtiaPowerMode) {
7372 // set to non-zero value (to prevent MMI query 0, before it intends to set 0, which will skip its following state machine)
7373 *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)2;
7377 return WLAN_STATUS_SUCCESS;
7381 /*----------------------------------------------------------------------------*/
7383 * \brief This routine is used to set the power save profile.
7385 * \param[in] pvAdapter Pointer to the Adapter structure.
7386 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7387 * \param[in] u4SetBufferLen The length of the set buffer.
7388 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7389 * bytes read from the set buffer. If the call failed
7390 * due to invalid length of the set buffer, returns
7391 * the amount of storage needed.
7393 * \retval WLAN_STATUS_SUCCESS
7394 * \retval WLAN_STATUS_INVALID_LENGTH
7396 /*----------------------------------------------------------------------------*/
7398 wlanoidSet802dot11PowerSaveProfile (
7399 IN P_ADAPTER_T prAdapter,
7400 IN PVOID pvSetBuffer,
7401 IN UINT_32 u4SetBufferLen,
7402 OUT PUINT_32 pu4SetInfoLen
7406 PARAM_POWER_MODE ePowerMode;
7407 DEBUGFUNC("wlanoidSet802dot11PowerSaveProfile");
7410 ASSERT(pu4SetInfoLen);
7412 *pu4SetInfoLen = sizeof(PARAM_POWER_MODE);
7413 if (u4SetBufferLen < sizeof(PARAM_POWER_MODE)) {
7414 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
7415 return WLAN_STATUS_INVALID_LENGTH;
7417 else if (*(PPARAM_POWER_MODE) pvSetBuffer >= Param_PowerModeMax) {
7418 //WARNLOG(("Invalid power mode %d\n",
7419 //*(PPARAM_POWER_MODE) pvSetBuffer));
7420 return WLAN_STATUS_INVALID_DATA;
7423 ePowerMode = *(PPARAM_POWER_MODE) pvSetBuffer;
7425 if (prAdapter->fgEnCtiaPowerMode) {
7426 if (ePowerMode == Param_PowerModeCAM) {
7429 // User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP)
7431 if (prAdapter->u4CtiaPowerMode == 0) {
7432 // force to keep in CAM mode
7433 ePowerMode = Param_PowerModeCAM;
7434 } else if (prAdapter->u4CtiaPowerMode == 1) {
7435 ePowerMode = Param_PowerModeMAX_PSP;
7436 } else if (prAdapter->u4CtiaPowerMode == 2) {
7437 ePowerMode = Param_PowerModeFast_PSP;
7442 status = nicConfigPowerSaveProfile(
7444 NETWORK_TYPE_AIS_INDEX,
7448 switch (ePowerMode) {
7449 case Param_PowerModeCAM:
7450 DBGLOG(INIT, INFO, ("Set Wi-Fi PS mode to CAM (%d)\n", ePowerMode));
7452 case Param_PowerModeMAX_PSP:
7453 DBGLOG(INIT, INFO, ("Set Wi-Fi PS mode to MAX PS (%d)\n", ePowerMode));
7455 case Param_PowerModeFast_PSP:
7456 DBGLOG(INIT, INFO, ("Set Wi-Fi PS mode to FAST PS (%d)\n", ePowerMode));
7459 DBGLOG(INIT, INFO, ("invalid Wi-Fi PS mode setting (%d)\n", ePowerMode));
7465 } /* end of wlanoidSetAcpiDevicePowerStateMode() */
7468 /*----------------------------------------------------------------------------*/
7470 * \brief This routine is called to query current status of AdHoc Mode.
7472 * \param[in] prAdapter Pointer to the Adapter structure.
7473 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7475 * \param[in] u4QueryBufferLen The length of the query buffer.
7476 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7477 * bytes written into the query buffer. If the call
7478 * failed due to invalid length of the query buffer,
7479 * returns the amount of storage needed.
7481 * \retval WLAN_STATUS_SUCCESS
7482 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7484 /*----------------------------------------------------------------------------*/
7486 wlanoidQueryAdHocMode (
7487 IN P_ADAPTER_T prAdapter,
7488 OUT PVOID pvQueryBuffer,
7489 IN UINT_32 u4QueryBufferLen,
7490 OUT PUINT_32 pu4QueryInfoLen
7493 return WLAN_STATUS_SUCCESS;
7494 } /* end of wlanoidQueryAdHocMode() */
7497 /*----------------------------------------------------------------------------*/
7499 * \brief This routine is called to set AdHoc Mode.
7501 * \param[in] prAdapter Pointer to the Adapter structure.
7502 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7503 * \param[in] u4SetBufferLen The length of the set buffer.
7504 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7505 * bytes read from the set buffer. If the call failed
7506 * due to invalid length of the set buffer, returns
7507 * the amount of storage needed.
7509 * \retval WLAN_STATUS_SUCCESS
7510 * \retval WLAN_STATUS_INVALID_LENGTH
7511 * \retval WLAN_STATUS_INVALID_DATA
7513 /*----------------------------------------------------------------------------*/
7515 wlanoidSetAdHocMode (
7516 IN P_ADAPTER_T prAdapter,
7517 IN PVOID pvSetBuffer,
7518 IN UINT_32 u4SetBufferLen,
7519 OUT PUINT_32 pu4SetInfoLen
7522 return WLAN_STATUS_SUCCESS;
7523 } /* end of wlanoidSetAdHocMode() */
7526 /*----------------------------------------------------------------------------*/
7528 * \brief This routine is called to query RF frequency.
7530 * \param[in] prAdapter Pointer to the Adapter structure.
7531 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7533 * \param[in] u4QueryBufferLen The length of the query buffer.
7534 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7535 * bytes written into the query buffer. If the call
7536 * failed due to invalid length of the query buffer,
7537 * returns the amount of storage needed.
7539 * \retval WLAN_STATUS_SUCCESS
7540 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7542 /*----------------------------------------------------------------------------*/
7544 wlanoidQueryFrequency (
7545 IN P_ADAPTER_T prAdapter,
7546 OUT PVOID pvQueryBuffer,
7547 IN UINT_32 u4QueryBufferLen,
7548 OUT PUINT_32 pu4QueryInfoLen
7551 DEBUGFUNC("wlanoidQueryFrequency");
7554 ASSERT(pu4QueryInfoLen);
7555 if (u4QueryBufferLen) {
7556 ASSERT(pvQueryBuffer);
7559 if (u4QueryBufferLen < sizeof(UINT_32)) {
7560 return WLAN_STATUS_BUFFER_TOO_SHORT;
7563 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7564 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
7565 *(PUINT_32)pvQueryBuffer =
7566 nicChannelNum2Freq(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX].ucPrimaryChannel);
7569 *(PUINT_32)pvQueryBuffer = 0;
7573 *(PUINT_32)pvQueryBuffer =
7574 nicChannelNum2Freq(prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum);
7577 return WLAN_STATUS_SUCCESS;
7578 } /* end of wlanoidQueryFrequency() */
7581 /*----------------------------------------------------------------------------*/
7583 * \brief This routine is called to set RF frequency by User Settings.
7585 * \param[in] prAdapter Pointer to the Adapter structure.
7586 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7588 * \param[in] u4QueryBufferLen The length of the query buffer.
7589 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7590 * bytes written into the query buffer. If the call
7591 * failed due to invalid length of the query buffer,
7592 * returns the amount of storage needed.
7594 * \retval WLAN_STATUS_SUCCESS
7595 * \retval WLAN_STATUS_INVALID_LENGTH
7596 * \retval WLAN_STATUS_INVALID_DATA
7598 /*----------------------------------------------------------------------------*/
7600 wlanoidSetFrequency (
7601 IN P_ADAPTER_T prAdapter,
7602 IN PVOID pvSetBuffer,
7603 IN UINT_32 u4SetBufferLen,
7604 OUT PUINT_32 pu4SetInfoLen
7607 PUINT_32 pu4FreqInKHz;
7609 DEBUGFUNC("wlanoidSetFrequency");
7612 ASSERT(pu4SetInfoLen);
7614 *pu4SetInfoLen = sizeof(UINT_32);
7616 if (u4SetBufferLen < sizeof(UINT_32)) {
7617 return WLAN_STATUS_INVALID_LENGTH;
7620 ASSERT(pvSetBuffer);
7621 pu4FreqInKHz = (PUINT_32)pvSetBuffer;
7623 prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum
7624 = (UINT_8)nicFreq2ChannelNum(*pu4FreqInKHz);
7625 prAdapter->rWifiVar.rConnSettings.eAdHocBand
7626 = *pu4FreqInKHz < 5000000 ? BAND_2G4 : BAND_5G;
7628 return WLAN_STATUS_SUCCESS;
7629 } /* end of wlanoidSetFrequency() */
7632 /*----------------------------------------------------------------------------*/
7634 * \brief This routine is called to set 802.11 channel of the radio frequency.
7635 * This is a proprietary function call to Lunux currently.
7637 * \param[in] prAdapter Pointer to the Adapter structure.
7638 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7639 * \param[in] u4SetBufferLen The length of the set buffer.
7640 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7641 * bytes read from the set buffer. If the call failed
7642 * due to invalid length of the set buffer, returns
7643 * the amount of storage needed.
7645 * \retval WLAN_STATUS_SUCCESS
7646 * \retval WLAN_STATUS_INVALID_LENGTH
7647 * \retval WLAN_STATUS_INVALID_DATA
7649 /*----------------------------------------------------------------------------*/
7652 IN P_ADAPTER_T prAdapter,
7653 IN PVOID pvSetBuffer,
7654 IN UINT_32 u4SetBufferLen,
7655 OUT PUINT_32 pu4SetInfoLen
7660 return WLAN_STATUS_SUCCESS;
7664 /*----------------------------------------------------------------------------*/
7666 * \brief This routine is called to query the Beacon Interval from User Settings.
7668 * \param[in] prAdapter Pointer to the Adapter structure.
7669 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7671 * \param[in] u4QueryBufferLen The length of the query buffer.
7672 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7673 * bytes written into the query buffer. If the call
7674 * failed due to invalid length of the query buffer,
7675 * returns the amount of storage needed.
7677 * \retval WLAN_STATUS_SUCCESS
7678 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7680 /*----------------------------------------------------------------------------*/
7682 wlanoidQueryBeaconInterval (
7683 IN P_ADAPTER_T prAdapter,
7684 OUT PVOID pvQueryBuffer,
7685 IN UINT_32 u4QueryBufferLen,
7686 OUT PUINT_32 pu4QueryInfoLen
7689 DEBUGFUNC("wlanoidQueryBeaconInterval");
7691 ASSERT(pu4QueryInfoLen);
7692 if (u4QueryBufferLen) {
7693 ASSERT(pvQueryBuffer);
7696 *pu4QueryInfoLen = sizeof(UINT_32);
7698 if (u4QueryBufferLen < sizeof(UINT_32)) {
7699 return WLAN_STATUS_BUFFER_TOO_SHORT;
7702 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
7703 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7704 *(PUINT_32)pvQueryBuffer =
7705 prAdapter->rWlanInfo.rCurrBssId.rConfiguration.u4BeaconPeriod;
7708 *(PUINT_32)pvQueryBuffer =
7709 (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
7713 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7714 *(PUINT_32)pvQueryBuffer = 0;
7717 *(PUINT_32)pvQueryBuffer =
7718 (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
7722 return WLAN_STATUS_SUCCESS;
7723 } /* end of wlanoidQueryBeaconInterval() */
7726 /*----------------------------------------------------------------------------*/
7728 * \brief This routine is called to set the Beacon Interval to User Settings.
7730 * \param[in] prAdapter Pointer to the Adapter structure.
7731 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7732 * \param[in] u4SetBufferLen The length of the set buffer.
7733 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7734 * bytes read from the set buffer. If the call failed
7735 * due to invalid length of the set buffer, returns
7736 * the amount of storage needed.
7738 * \retval WLAN_STATUS_SUCCESS
7739 * \retval WLAN_STATUS_INVALID_LENGTH
7740 * \retval WLAN_STATUS_INVALID_DATA
7742 /*----------------------------------------------------------------------------*/
7744 wlanoidSetBeaconInterval (
7745 IN P_ADAPTER_T prAdapter,
7746 IN PVOID pvSetBuffer,
7747 IN UINT_32 u4SetBufferLen,
7748 OUT PUINT_32 pu4SetInfoLen
7751 PUINT_32 pu4BeaconInterval;
7753 DEBUGFUNC("wlanoidSetBeaconInterval");
7756 ASSERT(pu4SetInfoLen);
7758 *pu4SetInfoLen = sizeof(UINT_32);
7759 if (u4SetBufferLen < sizeof(UINT_32)) {
7760 return WLAN_STATUS_INVALID_LENGTH;
7763 ASSERT(pvSetBuffer);
7764 pu4BeaconInterval = (PUINT_32)pvSetBuffer;
7766 if ((*pu4BeaconInterval < DOT11_BEACON_PERIOD_MIN) ||
7767 (*pu4BeaconInterval > DOT11_BEACON_PERIOD_MAX)) {
7768 DBGLOG(REQ, TRACE, ("Invalid Beacon Interval = %ld\n", *pu4BeaconInterval));
7769 return WLAN_STATUS_INVALID_DATA;
7772 prAdapter->rWlanInfo.u2BeaconPeriod = (UINT_16)*pu4BeaconInterval;
7774 DBGLOG(REQ, INFO, ("Set beacon interval: %d\n",
7775 prAdapter->rWlanInfo.u2BeaconPeriod));
7778 return WLAN_STATUS_SUCCESS;
7779 } /* end of wlanoidSetBeaconInterval() */
7782 /*----------------------------------------------------------------------------*/
7784 * \brief This routine is called to query the ATIM window from User Settings.
7786 * \param[in] prAdapter Pointer to the Adapter structure.
7787 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7789 * \param[in] u4QueryBufferLen The length of the query buffer.
7790 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7791 * bytes written into the query buffer. If the call
7792 * failed due to invalid length of the query buffer,
7793 * returns the amount of storage needed.
7795 * \retval WLAN_STATUS_SUCCESS
7796 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7798 /*----------------------------------------------------------------------------*/
7800 wlanoidQueryAtimWindow (
7801 IN P_ADAPTER_T prAdapter,
7802 OUT PVOID pvQueryBuffer,
7803 IN UINT_32 u4QueryBufferLen,
7804 OUT PUINT_32 pu4QueryInfoLen
7807 DEBUGFUNC("wlanoidQueryAtimWindow");
7810 ASSERT(pu4QueryInfoLen);
7811 if (u4QueryBufferLen) {
7812 ASSERT(pvQueryBuffer);
7815 *pu4QueryInfoLen = sizeof(UINT_32);
7817 if (u4QueryBufferLen < sizeof(UINT_32)) {
7818 return WLAN_STATUS_BUFFER_TOO_SHORT;
7821 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7822 *(PUINT_32)pvQueryBuffer = 0;
7825 *(PUINT_32)pvQueryBuffer =
7826 (UINT_32) prAdapter->rWlanInfo.u2AtimWindow;
7829 return WLAN_STATUS_SUCCESS;
7831 } /* end of wlanoidQueryAtimWindow() */
7834 /*----------------------------------------------------------------------------*/
7836 * \brief This routine is called to set the ATIM window to User Settings.
7838 * \param[in] prAdapter Pointer to the Adapter structure.
7839 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7840 * \param[in] u4SetBufferLen The length of the set buffer.
7841 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7842 * bytes read from the set buffer. If the call failed
7843 * due to invalid length of the set buffer, returns
7844 * the amount of storage needed.
7846 * \retval WLAN_STATUS_SUCCESS
7847 * \retval WLAN_STATUS_INVALID_LENGTH
7848 * \retval WLAN_STATUS_INVALID_DATA
7850 /*----------------------------------------------------------------------------*/
7852 wlanoidSetAtimWindow (
7853 IN P_ADAPTER_T prAdapter,
7854 IN PVOID pvSetBuffer,
7855 IN UINT_32 u4SetBufferLen,
7856 OUT PUINT_32 pu4SetInfoLen
7859 PUINT_32 pu4AtimWindow;
7861 DEBUGFUNC("wlanoidSetAtimWindow");
7864 ASSERT(pu4SetInfoLen);
7866 *pu4SetInfoLen = sizeof(UINT_32);
7868 if (u4SetBufferLen < sizeof(UINT_32)) {
7869 return WLAN_STATUS_INVALID_LENGTH;
7872 ASSERT(pvSetBuffer);
7873 pu4AtimWindow = (PUINT_32)pvSetBuffer;
7875 prAdapter->rWlanInfo.u2AtimWindow = (UINT_16)*pu4AtimWindow;
7877 return WLAN_STATUS_SUCCESS;
7878 } /* end of wlanoidSetAtimWindow() */
7880 /*----------------------------------------------------------------------------*/
7882 * \brief This routine is called to Set the MAC address which is currently used by the NIC.
7884 * \param[in] prAdapter Pointer to the Adapter structure.
7885 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7886 * \param[in] u4SetBufferLen The length of the set buffer.
7887 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7888 * bytes read from the set buffer. If the call failed
7889 * due to invalid length of the set buffer, returns
7890 * the amount of storage needed.
7893 * \retval WLAN_STATUS_SUCCESS
7894 * \retval WLAN_STATUS_INVALID_LENGTH
7895 * \retval WLAN_STATUS_INVALID_DATA
7897 /*----------------------------------------------------------------------------*/
7899 wlanoidSetCurrentAddr (
7900 IN P_ADAPTER_T prAdapter,
7901 IN PVOID pvSetBuffer,
7902 IN UINT_32 u4SetBufferLen,
7903 OUT PUINT_32 pu4SetInfoLen
7908 return WLAN_STATUS_SUCCESS;
7909 } /* end of wlanoidSetCurrentAddr() */
7912 #if CFG_TCP_IP_CHKSUM_OFFLOAD
7913 /*----------------------------------------------------------------------------*/
7915 * \brief Setting the checksum offload function.
7917 * \param[in] prAdapter Pointer to the Adapter structure.
7918 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7919 * \param[in] u4SetBufferLen The length of the set buffer.
7920 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7921 * bytes read from the set buffer. If the call failed
7922 * due to invalid length of the set buffer, returns
7923 * the amount of storage needed.
7925 * \retval WLAN_STATUS_SUCCESS
7926 * \retval WLAN_STATUS_INVALID_LENGTH
7927 * \retval WLAN_STATUS_ADAPTER_NOT_READY
7929 /*----------------------------------------------------------------------------*/
7931 wlanoidSetCSUMOffload (
7932 IN P_ADAPTER_T prAdapter,
7933 IN PVOID pvSetBuffer,
7934 IN UINT_32 u4SetBufferLen,
7935 OUT PUINT_32 pu4SetInfoLen
7938 UINT_32 i, u4CSUMFlags;
7939 CMD_BASIC_CONFIG rCmdBasicConfig;
7941 DEBUGFUNC("wlanoidSetCSUMOffload");
7942 DBGLOG(INIT, LOUD, ("\n"));
7945 ASSERT(pu4SetInfoLen);
7947 *pu4SetInfoLen = sizeof(UINT_32);
7949 if (u4SetBufferLen < sizeof(UINT_32)) {
7950 return WLAN_STATUS_INVALID_LENGTH;
7953 ASSERT(pvSetBuffer);
7954 u4CSUMFlags = *(PUINT_32)pvSetBuffer;
7956 kalMemZero(&rCmdBasicConfig, sizeof(CMD_BASIC_CONFIG));
7958 for(i = 0 ; i < 6 ; i++) { // set to broadcast address for not-specified
7959 rCmdBasicConfig.rMyMacAddr[i] = 0xff;
7962 rCmdBasicConfig.ucNative80211 = 0; //@FIXME: for Vista
7964 if(u4CSUMFlags & CSUM_OFFLOAD_EN_TX_TCP)
7965 rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(2);
7967 if(u4CSUMFlags & CSUM_OFFLOAD_EN_TX_UDP)
7968 rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(1);
7970 if(u4CSUMFlags & CSUM_OFFLOAD_EN_TX_IP)
7971 rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(0);
7973 if(u4CSUMFlags & CSUM_OFFLOAD_EN_RX_TCP)
7974 rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(2);
7976 if(u4CSUMFlags & CSUM_OFFLOAD_EN_RX_UDP)
7977 rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(1);
7979 if(u4CSUMFlags & (CSUM_OFFLOAD_EN_RX_IPv4 | CSUM_OFFLOAD_EN_RX_IPv6))
7980 rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(0);
7982 prAdapter->u4CSUMFlags = u4CSUMFlags;
7984 return wlanSendSetQueryCmd(prAdapter,
7985 CMD_ID_BASIC_CONFIG,
7989 nicCmdEventSetCommon,
7990 nicOidCmdTimeoutCommon,
7991 sizeof(CMD_BASIC_CONFIG),
7992 (PUINT_8)&rCmdBasicConfig,
7997 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
8000 /*----------------------------------------------------------------------------*/
8002 * \brief Setting the IP address for pattern search function.
8004 * \param[in] prAdapter Pointer to the Adapter structure.
8005 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
8006 * \param[in] u4SetBufferLen The length of the set buffer.
8007 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8008 * bytes read from the set buffer. If the call failed
8009 * due to invalid length of the set buffer, returns
8010 * the amount of storage needed.
8012 * \return WLAN_STATUS_SUCCESS
8013 * \return WLAN_STATUS_ADAPTER_NOT_READY
8014 * \return WLAN_STATUS_INVALID_LENGTH
8016 /*----------------------------------------------------------------------------*/
8018 wlanoidSetNetworkAddress(
8019 IN P_ADAPTER_T prAdapter,
8020 IN PVOID pvSetBuffer,
8021 IN UINT_32 u4SetBufferLen,
8022 OUT PUINT_32 pu4SetInfoLen
8025 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
8027 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
8028 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST)pvSetBuffer;
8029 P_PARAM_NETWORK_ADDRESS prNetworkAddress;
8030 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
8031 UINT_32 u4IpAddressCount, u4CmdSize;
8032 PUINT_8 pucBuf = (PUINT_8)pvSetBuffer;
8034 DEBUGFUNC("wlanoidSetNetworkAddress");
8035 DBGLOG(INIT, LOUD, ("\n"));
8038 ASSERT(pu4SetInfoLen);
8042 if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST)) {
8043 return WLAN_STATUS_INVALID_DATA;
8047 u4IpAddressCount = 0;
8049 prNetworkAddress = prNetworkAddressList->arAddress;
8050 for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
8051 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
8052 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
8056 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
8057 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
8060 // construct payload of command packet
8061 u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
8062 sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
8063 if (u4IpAddressCount == 0) {
8064 u4CmdSize = sizeof(CMD_SET_NETWORK_ADDRESS_LIST);
8067 prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
8069 if(prCmdNetworkAddressList == NULL)
8070 return WLAN_STATUS_FAILURE;
8072 // fill P_CMD_SET_NETWORK_ADDRESS_LIST
8073 prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
8075 /* only to set IP address to FW once ARP filter is enabled */
8076 if (prAdapter->fgEnArpFilter) {
8077 prCmdNetworkAddressList->ucAddressCount = (UINT_8)u4IpAddressCount;
8078 prNetworkAddress = prNetworkAddressList->arAddress;
8080 DBGLOG(REQ, INFO, ("u4IpAddressCount (%d)\n", u4IpAddressCount));
8082 for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
8083 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
8084 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
8085 prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP)prNetworkAddress->aucAddress;
8087 kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
8088 &(prNetAddrIp->in_addr),
8093 pucBuf = (PUINT_8)&prNetAddrIp->in_addr;
8094 DBGLOG(REQ, INFO, ("prNetAddrIp->in_addr:%d:%d:%d:%d\n", pucBuf[0], pucBuf[1],pucBuf[2],pucBuf[3]));
8097 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
8098 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
8102 prCmdNetworkAddressList->ucAddressCount = 0;
8105 rStatus = wlanSendSetQueryCmd(prAdapter,
8106 CMD_ID_SET_IP_ADDRESS,
8110 nicCmdEventSetIpAddress,
8111 nicOidCmdTimeoutCommon,
8113 (PUINT_8)prCmdNetworkAddressList,
8118 kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
8123 /*----------------------------------------------------------------------------*/
8125 * \brief Set driver to switch into RF test mode
8127 * \param[in] prAdapter Pointer to the Adapter structure.
8128 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set,
8130 * \param[in] u4SetBufferLen The length of the set buffer, should be 0
8131 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8132 * bytes read from the set buffer. If the call failed
8133 * due to invalid length of the set buffer, returns
8134 * the amount of storage needed.
8136 * \return WLAN_STATUS_SUCCESS
8137 * \return WLAN_STATUS_ADAPTER_NOT_READY
8138 * \return WLAN_STATUS_INVALID_DATA
8139 * \return WLAN_STATUS_INVALID_LENGTH
8141 /*----------------------------------------------------------------------------*/
8143 wlanoidRftestSetTestMode (
8144 IN P_ADAPTER_T prAdapter,
8145 IN PVOID pvSetBuffer,
8146 IN UINT_32 u4SetBufferLen,
8147 OUT PUINT_32 pu4SetInfoLen
8150 WLAN_STATUS rStatus;
8151 CMD_TEST_CTRL_T rCmdTestCtrl;
8153 DEBUGFUNC("wlanoidRftestSetTestMode");
8156 ASSERT(pvSetBuffer);
8157 ASSERT(pu4SetInfoLen);
8161 if(u4SetBufferLen == 0) {
8162 if(prAdapter->fgTestMode == FALSE) {
8163 // switch to RF Test mode
8164 rCmdTestCtrl.ucAction = 0; // Switch mode
8165 rCmdTestCtrl.u.u4OpMode = 1; // RF test mode
8167 rStatus = wlanSendSetQueryCmd(prAdapter,
8172 nicCmdEventEnterRfTest,
8173 nicOidCmdEnterRFTestTimeout,
8174 sizeof(CMD_TEST_CTRL_T),
8175 (PUINT_8)&rCmdTestCtrl,
8180 // already in test mode ..
8181 rStatus = WLAN_STATUS_SUCCESS;
8185 rStatus = WLAN_STATUS_INVALID_DATA;
8191 /*----------------------------------------------------------------------------*/
8193 * \brief Set driver to switch into normal operation mode from RF test mode
8195 * \param[in] prAdapter Pointer to the Adapter structure.
8196 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
8198 * \param[in] u4SetBufferLen The length of the set buffer, should be 0
8199 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8200 * bytes read from the set buffer. If the call failed
8201 * due to invalid length of the set buffer, returns
8202 * the amount of storage needed.
8204 * \return WLAN_STATUS_SUCCESS
8205 * \return WLAN_STATUS_ADAPTER_NOT_READY
8206 * \return WLAN_STATUS_INVALID_DATA
8207 * \return WLAN_STATUS_INVALID_LENGTH
8209 /*----------------------------------------------------------------------------*/
8211 wlanoidRftestSetAbortTestMode (
8212 IN P_ADAPTER_T prAdapter,
8213 IN PVOID pvSetBuffer,
8214 IN UINT_32 u4SetBufferLen,
8215 OUT PUINT_32 pu4SetInfoLen
8218 WLAN_STATUS rStatus;
8219 CMD_TEST_CTRL_T rCmdTestCtrl;
8221 DEBUGFUNC("wlanoidRftestSetTestMode");
8224 ASSERT(pvSetBuffer);
8225 ASSERT(pu4SetInfoLen);
8229 if(u4SetBufferLen == 0) {
8230 if(prAdapter->fgTestMode == TRUE) {
8231 // switch to normal mode
8232 rCmdTestCtrl.ucAction = 0; // Switch mode
8233 rCmdTestCtrl.u.u4OpMode = 0; // normal mode
8235 rStatus = wlanSendSetQueryCmd(prAdapter,
8240 nicCmdEventLeaveRfTest,
8241 nicOidCmdTimeoutCommon,
8242 sizeof(CMD_TEST_CTRL_T),
8243 (PUINT_8)&rCmdTestCtrl,
8248 // already in normal mode ..
8249 rStatus = WLAN_STATUS_SUCCESS;
8253 rStatus = WLAN_STATUS_INVALID_DATA;
8260 /*----------------------------------------------------------------------------*/
8262 * \brief query for RF test parameter
8264 * \param[in] prAdapter Pointer to the Adapter structure.
8265 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
8267 * \param[in] u4QueryBufferLen The length of the query buffer.
8268 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
8269 * bytes written into the query buffer. If the call
8270 * failed due to invalid length of the query buffer,
8271 * returns the amount of storage needed.
8273 * \retval WLAN_STATUS_SUCCESS
8274 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
8275 * \retval WLAN_STATUS_NOT_SUPPORTED
8276 * \retval WLAN_STATUS_NOT_ACCEPTED
8278 /*----------------------------------------------------------------------------*/
8280 wlanoidRftestQueryAutoTest (
8281 IN P_ADAPTER_T prAdapter,
8282 OUT PVOID pvQueryBuffer,
8283 IN UINT_32 u4QueryBufferLen,
8284 OUT PUINT_32 pu4QueryInfoLen
8287 P_PARAM_MTK_WIFI_TEST_STRUC_T prRfATInfo;
8288 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
8290 DEBUGFUNC("wlanoidRftestQueryAutoTest");
8293 if (u4QueryBufferLen) {
8294 ASSERT(pvQueryBuffer);
8296 ASSERT(pu4QueryInfoLen);
8298 *pu4QueryInfoLen = sizeof(PARAM_MTK_WIFI_TEST_STRUC_T);
8300 if (u4QueryBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUC_T)) {
8301 DBGLOG(REQ, ERROR, ("Invalid data. QueryBufferLen: %ld.\n",
8303 return WLAN_STATUS_INVALID_LENGTH;
8306 prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUC_T)pvQueryBuffer;
8307 rStatus = rftestQueryATInfo(prAdapter,
8308 prRfATInfo->u4FuncIndex,
8309 prRfATInfo->u4FuncData,
8316 /*----------------------------------------------------------------------------*/
8318 * \brief Set RF test parameter
8320 * \param[in] prAdapter Pointer to the Adapter structure.
8321 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
8322 * \param[in] u4SetBufferLen The length of the set buffer.
8323 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8324 * bytes read from the set buffer. If the call failed
8325 * due to invalid length of the set buffer, returns
8326 * the amount of storage needed.
8328 * \return WLAN_STATUS_SUCCESS
8329 * \return WLAN_STATUS_ADAPTER_NOT_READY
8330 * \return WLAN_STATUS_INVALID_LENGTH
8332 /*----------------------------------------------------------------------------*/
8334 wlanoidRftestSetAutoTest (
8335 IN P_ADAPTER_T prAdapter,
8336 OUT PVOID pvSetBuffer,
8337 IN UINT_32 u4SetBufferLen,
8338 OUT PUINT_32 pu4SetInfoLen
8341 P_PARAM_MTK_WIFI_TEST_STRUC_T prRfATInfo;
8342 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
8344 DEBUGFUNC("wlanoidRftestSetAutoTest");
8347 ASSERT(pvSetBuffer);
8348 ASSERT(pu4SetInfoLen);
8350 *pu4SetInfoLen = sizeof(PARAM_MTK_WIFI_TEST_STRUC_T);
8352 if (u4SetBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUC_T)) {
8353 DBGLOG(REQ, ERROR, ("Invalid data. SetBufferLen: %ld.\n",
8355 return WLAN_STATUS_INVALID_LENGTH;
8358 prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUC_T)pvSetBuffer;
8359 rStatus = rftestSetATInfo(prAdapter, prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData);
8364 /* RF test OID set handler */
8367 IN P_ADAPTER_T prAdapter,
8368 UINT_32 u4FuncIndex,
8372 P_GLUE_INFO_T prGlueInfo;
8373 P_CMD_INFO_T prCmdInfo;
8374 P_WIFI_CMD_T prWifiCmd;
8375 P_CMD_TEST_CTRL_T pCmdTestCtrl;
8380 prGlueInfo = prAdapter->prGlueInfo;
8381 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
8384 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8385 return WLAN_STATUS_FAILURE;
8388 // increase command sequence number
8389 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8391 // Setup common CMD Info Packet
8392 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
8393 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
8394 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
8395 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
8396 prCmdInfo->fgIsOid = TRUE;
8397 prCmdInfo->ucCID = CMD_ID_TEST_MODE;
8398 prCmdInfo->fgSetQuery = TRUE;
8399 prCmdInfo->fgNeedResp = FALSE;
8400 prCmdInfo->fgDriverDomainMCR = FALSE;
8401 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8402 prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
8403 prCmdInfo->pvInformationBuffer = NULL;
8404 prCmdInfo->u4InformationBufferLength = 0;
8406 // Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T)
8407 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8408 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8409 prWifiCmd->ucCID = prCmdInfo->ucCID;
8410 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8411 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8413 pCmdTestCtrl = (P_CMD_TEST_CTRL_T)(prWifiCmd->aucBuffer);
8414 pCmdTestCtrl->ucAction = 1; // Set ATInfo
8415 pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
8416 pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
8418 // insert into prCmdQueue
8419 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8421 // wakeup txServiceThread later
8422 GLUE_SET_EVENT(prAdapter->prGlueInfo);
8424 return WLAN_STATUS_PENDING;
8429 IN P_ADAPTER_T prAdapter,
8430 UINT_32 u4FuncIndex,
8432 OUT PVOID pvQueryBuffer,
8433 IN UINT_32 u4QueryBufferLen
8436 P_GLUE_INFO_T prGlueInfo;
8437 P_CMD_INFO_T prCmdInfo;
8438 P_WIFI_CMD_T prWifiCmd;
8439 P_CMD_TEST_CTRL_T pCmdTestCtrl;
8441 P_EVENT_TEST_STATUS prTestStatus;
8445 prGlueInfo = prAdapter->prGlueInfo;
8447 if(u4FuncIndex == RF_AT_FUNCID_FW_INFO) {
8448 /* driver implementation */
8449 prTestStatus = (P_EVENT_TEST_STATUS)pvQueryBuffer;
8451 prTestStatus->rATInfo.u4FuncData =
8452 (prAdapter->rVerInfo.u2FwProductID << 16) | (prAdapter->rVerInfo.u2FwOwnVersion);
8453 u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
8455 return WLAN_STATUS_SUCCESS;
8457 else if(u4FuncIndex == RF_AT_FUNCID_DRV_INFO) {
8458 /* driver implementation */
8459 prTestStatus = (P_EVENT_TEST_STATUS)pvQueryBuffer;
8461 prTestStatus->rATInfo.u4FuncData = CFG_DRV_OWN_VERSION;
8462 u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
8464 return WLAN_STATUS_SUCCESS;
8467 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
8470 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8471 return WLAN_STATUS_FAILURE;
8474 // increase command sequence number
8475 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8477 // Setup common CMD Info Packet
8478 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
8479 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
8480 prCmdInfo->pfCmdDoneHandler = nicCmdEventQueryRfTestATInfo;
8481 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
8482 prCmdInfo->fgIsOid = TRUE;
8483 prCmdInfo->ucCID = CMD_ID_TEST_MODE;
8484 prCmdInfo->fgSetQuery = FALSE;
8485 prCmdInfo->fgNeedResp = TRUE;
8486 prCmdInfo->fgDriverDomainMCR = FALSE;
8487 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8488 prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
8489 prCmdInfo->pvInformationBuffer = pvQueryBuffer;
8490 prCmdInfo->u4InformationBufferLength = u4QueryBufferLen;
8492 // Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T)
8493 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8494 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8495 prWifiCmd->ucCID = prCmdInfo->ucCID;
8496 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8497 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8499 pCmdTestCtrl = (P_CMD_TEST_CTRL_T)(prWifiCmd->aucBuffer);
8500 pCmdTestCtrl->ucAction = 2; // Get ATInfo
8501 pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
8502 pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
8504 // insert into prCmdQueue
8505 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8507 // wakeup txServiceThread later
8508 GLUE_SET_EVENT(prAdapter->prGlueInfo);
8510 return WLAN_STATUS_PENDING;
8516 IN P_ADAPTER_T prAdapter,
8517 IN UINT_32 u4FreqInKHz,
8518 IN PUINT_32 pu4SetInfoLen
8521 CMD_TEST_CTRL_T rCmdTestCtrl;
8525 rCmdTestCtrl.ucAction = 5; // Set Channel Frequency
8526 rCmdTestCtrl.u.u4ChannelFreq = u4FreqInKHz;
8528 return wlanSendSetQueryCmd(prAdapter,
8533 nicCmdEventSetCommon,
8534 nicOidCmdTimeoutCommon,
8535 sizeof(CMD_TEST_CTRL_T),
8536 (PUINT_8)&rCmdTestCtrl,
8542 /*----------------------------------------------------------------------------*/
8544 * \brief command packet generation utility
8546 * \param[in] prAdapter Pointer to the Adapter structure.
8547 * \param[in] ucCID Command ID
8548 * \param[in] fgSetQuery Set or Query
8549 * \param[in] fgNeedResp Need for response
8550 * \param[in] pfCmdDoneHandler Function pointer when command is done
8551 * \param[in] u4SetQueryInfoLen The length of the set/query buffer
8552 * \param[in] pucInfoBuffer Pointer to set/query buffer
8555 * \retval WLAN_STATUS_PENDING
8556 * \retval WLAN_STATUS_FAILURE
8558 /*----------------------------------------------------------------------------*/
8560 wlanSendSetQueryCmd (
8561 IN P_ADAPTER_T prAdapter,
8566 PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
8567 PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
8568 UINT_32 u4SetQueryInfoLen,
8569 PUINT_8 pucInfoBuffer,
8570 OUT PVOID pvSetQueryBuffer,
8571 IN UINT_32 u4SetQueryBufferLen
8574 P_GLUE_INFO_T prGlueInfo;
8575 P_CMD_INFO_T prCmdInfo;
8576 P_WIFI_CMD_T prWifiCmd;
8579 prGlueInfo = prAdapter->prGlueInfo;
8580 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
8582 DEBUGFUNC("wlanSendSetQueryCmd");
8585 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8586 return WLAN_STATUS_FAILURE;
8589 // increase command sequence number
8590 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8591 DBGLOG(REQ, TRACE, ("ucCmdSeqNum =%d\n", ucCmdSeqNum));
8593 // Setup common CMD Info Packet
8594 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
8595 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
8596 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + u4SetQueryInfoLen);
8597 prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
8598 prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
8599 prCmdInfo->fgIsOid = fgIsOid;
8600 prCmdInfo->ucCID = ucCID;
8601 prCmdInfo->fgSetQuery = fgSetQuery;
8602 prCmdInfo->fgNeedResp = fgNeedResp;
8603 prCmdInfo->fgDriverDomainMCR = FALSE;
8604 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8605 prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
8606 prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
8607 prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
8609 // Setup WIFI_CMD_T (no payload)
8610 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8611 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8612 prWifiCmd->ucCID = prCmdInfo->ucCID;
8613 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8614 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8616 if(u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL) {
8617 kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
8620 // insert into prCmdQueue
8621 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8623 // wakeup txServiceThread later
8624 GLUE_SET_EVENT(prGlueInfo);
8625 return WLAN_STATUS_PENDING;
8630 #if CFG_SUPPORT_WAPI
8631 /*----------------------------------------------------------------------------*/
8633 * \brief This routine is called by WAPI ui to set wapi mode, which is needed to info the the driver
8634 * to operation at WAPI mode while driver initialize.
8636 * \param[in] prAdapter Pointer to the Adapter structure
8637 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
8638 * \param[in] u4SetBufferLen The length of the set buffer
8639 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8640 * bytes read from the set buffer. If the call failed due to invalid length of
8641 * the set buffer, returns the amount of storage needed.
8643 * \retval WLAN_STATUS_SUCCESS
8644 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
8645 * \retval WLAN_STATUS_INVALID_LENGTH
8648 /*----------------------------------------------------------------------------*/
8650 wlanoidSetWapiMode (
8651 IN P_ADAPTER_T prAdapter,
8652 IN PVOID pvSetBuffer,
8653 IN UINT_32 u4SetBufferLen,
8654 OUT PUINT_32 pu4SetInfoLen
8657 DEBUGFUNC("wlanoidSetWapiMode");
8658 DBGLOG(REQ, LOUD, ("\r\n"));
8661 ASSERT(pu4SetInfoLen);
8662 ASSERT(pvSetBuffer);
8664 /* Todo:: For support WAPI and Wi-Fi at same driver, use the set wapi assoc ie at the check point */
8665 /* The Adapter Connection setting fgUseWapi will cleat whil oid set mode (infra), */
8666 /* And set fgUseWapi True while set wapi assoc ie */
8667 /* policay selection, add key all depend on this flag, */
8668 /* The fgUseWapi may remove later */
8669 if (*(PUINT_32)pvSetBuffer) {
8670 prAdapter->fgUseWapi = TRUE;
8673 prAdapter->fgUseWapi = FALSE;
8677 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + 4));
8680 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8681 return WLAN_STATUS_FAILURE;
8684 // increase command sequence number
8685 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8687 // compose CMD_BUILD_CONNECTION cmd pkt
8688 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
8689 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
8690 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + 4;
8691 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
8692 prCmdInfo->pfCmdTimeoutHandler = NULL;
8693 prCmdInfo->fgIsOid = TRUE;
8694 prCmdInfo->ucCID = CMD_ID_WAPI_MODE;
8695 prCmdInfo->fgSetQuery = TRUE;
8696 prCmdInfo->fgNeedResp = FALSE;
8697 prCmdInfo->fgDriverDomainMCR = FALSE;
8698 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8699 prCmdInfo->u4SetInfoLen = u4SetBufferLen;
8700 prCmdInfo->pvInformationBuffer = pvSetBuffer;
8701 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
8704 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8705 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8706 prWifiCmd->ucCID = prCmdInfo->ucCID;
8707 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8708 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8710 cp = (PUINT_8)(prWifiCmd->aucBuffer);
8712 kalMemCopy(cp, (PUINT_8)pvSetBuffer, 4);
8714 // insert into prCmdQueue
8715 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8717 // wakeup txServiceThread later
8718 GLUE_SET_EVENT(prGlueInfo);
8720 return WLAN_STATUS_PENDING;
8722 return WLAN_STATUS_SUCCESS;
8727 /*----------------------------------------------------------------------------*/
8729 * \brief This routine is called by WAPI to set the assoc info, which is needed to add to
8730 * Association request frame while join WAPI AP.
8732 * \param[in] prAdapter Pointer to the Adapter structure
8733 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
8734 * \param[in] u4SetBufferLen The length of the set buffer
8735 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8736 * bytes read from the set buffer. If the call failed due to invalid length of
8737 * the set buffer, returns the amount of storage needed.
8739 * \retval WLAN_STATUS_SUCCESS
8740 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
8741 * \retval WLAN_STATUS_INVALID_LENGTH
8744 /*----------------------------------------------------------------------------*/
8746 wlanoidSetWapiAssocInfo (
8747 IN P_ADAPTER_T prAdapter,
8748 IN PVOID pvSetBuffer,
8749 IN UINT_32 u4SetBufferLen,
8750 OUT PUINT_32 pu4SetInfoLen
8753 P_WAPI_INFO_ELEM_T prWapiInfo;
8755 UINT_16 u2AuthSuiteCount = 0;
8756 UINT_16 u2PairSuiteCount = 0;
8757 UINT_32 u4AuthKeyMgtSuite = 0;
8758 UINT_32 u4PairSuite = 0;
8759 UINT_32 u4GroupSuite = 0;
8762 ASSERT(pvSetBuffer);
8763 ASSERT(pu4SetInfoLen);
8765 DEBUGFUNC("wlanoidSetWapiAssocInfo");
8766 DBGLOG(REQ, LOUD, ("\r\n"));
8768 if (u4SetBufferLen < 20 /* From EID to Group cipher */) {
8769 prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
8770 return WLAN_STATUS_INVALID_LENGTH;
8773 prAdapter->rWifiVar.rConnSettings.fgWapiMode = TRUE;
8775 //if (prWapiInfo->ucElemId != ELEM_ID_WAPI)
8776 // DBGLOG(SEC, TRACE, ("Not WAPI IE ?!\n"));
8778 //if (prWapiInfo->ucLength < 18)
8779 // return WLAN_STATUS_INVALID_LENGTH;
8781 *pu4SetInfoLen = u4SetBufferLen;
8783 prWapiInfo = (P_WAPI_INFO_ELEM_T)pvSetBuffer;
8785 if (prWapiInfo->ucElemId != ELEM_ID_WAPI) {
8786 DBGLOG(SEC, TRACE, ("Not WAPI IE ?! u4SetBufferLen = %d\n", u4SetBufferLen));
8787 prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
8788 return WLAN_STATUS_INVALID_LENGTH;
8791 if (prWapiInfo->ucLength < 18)
8792 return WLAN_STATUS_INVALID_LENGTH;
8794 /* Skip Version check */
8795 cp = (PUINT_8)&prWapiInfo->u2AuthKeyMgtSuiteCount;
8797 WLAN_GET_FIELD_16(cp, &u2AuthSuiteCount);
8799 if (u2AuthSuiteCount>1)
8800 return WLAN_STATUS_INVALID_LENGTH;
8803 WLAN_GET_FIELD_32(cp, &u4AuthKeyMgtSuite);
8805 DBGLOG(SEC, TRACE, ("WAPI: Assoc Info auth mgt suite [%d]: %02x-%02x-%02x-%02x\n",
8807 (UCHAR) (u4AuthKeyMgtSuite & 0x000000FF),
8808 (UCHAR) ((u4AuthKeyMgtSuite >> 8) & 0x000000FF),
8809 (UCHAR) ((u4AuthKeyMgtSuite >> 16) & 0x000000FF),
8810 (UCHAR) ((u4AuthKeyMgtSuite >> 24) & 0x000000FF)));
8812 if (u4AuthKeyMgtSuite != WAPI_AKM_SUITE_802_1X &&
8813 u4AuthKeyMgtSuite != WAPI_AKM_SUITE_PSK)
8817 WLAN_GET_FIELD_16(cp, &u2PairSuiteCount);
8818 if (u2PairSuiteCount>1)
8819 return WLAN_STATUS_INVALID_LENGTH;
8822 WLAN_GET_FIELD_32(cp, &u4PairSuite);
8823 DBGLOG(SEC, TRACE, ("WAPI: Assoc Info pairwise cipher suite [%d]: %02x-%02x-%02x-%02x\n",
8825 (UCHAR) (u4PairSuite & 0x000000FF),
8826 (UCHAR) ((u4PairSuite >> 8) & 0x000000FF),
8827 (UCHAR) ((u4PairSuite >> 16) & 0x000000FF),
8828 (UCHAR) ((u4PairSuite >> 24) & 0x000000FF)));
8830 if (u4PairSuite != WAPI_CIPHER_SUITE_WPI)
8834 WLAN_GET_FIELD_32(cp, &u4GroupSuite);
8835 DBGLOG(SEC, TRACE, ("WAPI: Assoc Info group cipher suite : %02x-%02x-%02x-%02x\n",
8836 (UCHAR) (u4GroupSuite & 0x000000FF),
8837 (UCHAR) ((u4GroupSuite >> 8) & 0x000000FF),
8838 (UCHAR) ((u4GroupSuite >> 16) & 0x000000FF),
8839 (UCHAR) ((u4GroupSuite >> 24) & 0x000000FF)));
8841 if (u4GroupSuite != WAPI_CIPHER_SUITE_WPI)
8844 prAdapter->rWifiVar.rConnSettings.u4WapiSelectedAKMSuite = u4AuthKeyMgtSuite;
8845 prAdapter->rWifiVar.rConnSettings.u4WapiSelectedPairwiseCipher = u4PairSuite;
8846 prAdapter->rWifiVar.rConnSettings.u4WapiSelectedGroupCipher = u4GroupSuite;
8848 kalMemCopy(prAdapter->prGlueInfo->aucWapiAssocInfoIEs, pvSetBuffer, u4SetBufferLen);
8849 prAdapter->prGlueInfo->u2WapiAssocInfoIESz = (UINT_16)u4SetBufferLen;
8850 DBGLOG(SEC, TRACE, ("Assoc Info IE sz %ld\n", u4SetBufferLen));
8852 return WLAN_STATUS_SUCCESS;
8857 /*----------------------------------------------------------------------------*/
8859 * \brief This routine is called to set the wpi key to the driver.
8861 * \param[in] prAdapter Pointer to the Adapter structure.
8862 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
8863 * \param[in] u4SetBufferLen The length of the set buffer.
8864 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8865 * bytes read from the set buffer. If the call failed
8866 * due to invalid length of the set buffer, returns
8867 * the amount of storage needed.
8869 * \retval WLAN_STATUS_SUCCESS
8870 * \retval WLAN_STATUS_ADAPTER_NOT_READY
8871 * \retval WLAN_STATUS_INVALID_LENGTH
8872 * \retval WLAN_STATUS_INVALID_DATA
8874 * \note The setting buffer P_PARAM_WPI_KEY, which is set by NDIS, is unpacked.
8876 /*----------------------------------------------------------------------------*/
8879 IN P_ADAPTER_T prAdapter,
8880 IN PVOID pvSetBuffer,
8881 IN UINT_32 u4SetBufferLen,
8882 OUT PUINT_32 pu4SetInfoLen
8885 P_GLUE_INFO_T prGlueInfo;
8886 P_CMD_INFO_T prCmdInfo;
8887 P_WIFI_CMD_T prWifiCmd;
8888 P_PARAM_WPI_KEY_T prNewKey;
8889 P_CMD_802_11_KEY prCmdKey;
8893 DEBUGFUNC("wlanoidSetWapiKey");
8894 DBGLOG(REQ, LOUD, ("\r\n"));
8897 ASSERT(pvSetBuffer);
8898 ASSERT(pu4SetInfoLen);
8900 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
8901 DBGLOG(REQ, WARN, ("Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\r\n",
8902 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
8903 return WLAN_STATUS_ADAPTER_NOT_READY;
8906 prNewKey = (P_PARAM_WPI_KEY_T) pvSetBuffer;
8908 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)pvSetBuffer, 560);
8909 pc = (PUINT_8)pvSetBuffer;
8911 *pu4SetInfoLen = u4SetBufferLen;
8913 /* Exception check */
8914 if (prNewKey->ucKeyID != 0x1 ||
8915 prNewKey->ucKeyID != 0x0) {
8916 prNewKey->ucKeyID = prNewKey->ucKeyID & BIT(0);
8917 //DBGLOG(SEC, INFO, ("Invalid WAPI key ID (%d)\r\n", prNewKey->ucKeyID));
8920 /* Dump P_PARAM_WPI_KEY_T content. */
8921 DBGLOG(REQ, TRACE, ("Set: Dump P_PARAM_WPI_KEY_T content\r\n"));
8922 DBGLOG(REQ, TRACE, ("TYPE : %d\r\n", prNewKey->eKeyType));
8923 DBGLOG(REQ, TRACE, ("Direction : %d\r\n", prNewKey->eDirection));
8924 DBGLOG(REQ, TRACE, ("KeyID : %d\r\n", prNewKey->ucKeyID));
8925 DBGLOG(REQ, TRACE, ("AddressIndex:\r\n"));
8926 DBGLOG_MEM8(REQ, TRACE, prNewKey->aucAddrIndex, 12);
8927 prNewKey->u4LenWPIEK = 16;
8929 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)prNewKey->aucWPIEK, (UINT_8)prNewKey->u4LenWPIEK);
8930 prNewKey->u4LenWPICK = 16;
8932 DBGLOG(REQ, TRACE, ("CK Key(%d):\r\n", (UINT_8)prNewKey->u4LenWPICK));
8933 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)prNewKey->aucWPICK, (UINT_8)prNewKey->u4LenWPICK);
8934 DBGLOG(REQ, TRACE, ("PN:\r\n"));
8935 if (prNewKey->eKeyType == 0){
8936 prNewKey->aucPN[0] = 0x5c;
8937 prNewKey->aucPN[1] = 0x36;
8938 prNewKey->aucPN[2] = 0x5c;
8939 prNewKey->aucPN[3] = 0x36;
8940 prNewKey->aucPN[4] = 0x5c;
8941 prNewKey->aucPN[5] = 0x36;
8942 prNewKey->aucPN[6] = 0x5c;
8943 prNewKey->aucPN[7] = 0x36;
8944 prNewKey->aucPN[8] = 0x5c;
8945 prNewKey->aucPN[9] = 0x36;
8946 prNewKey->aucPN[10] = 0x5c;
8947 prNewKey->aucPN[11] = 0x36;
8948 prNewKey->aucPN[12] = 0x5c;
8949 prNewKey->aucPN[13] = 0x36;
8950 prNewKey->aucPN[14] = 0x5c;
8951 prNewKey->aucPN[15] = 0x36;
8954 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)prNewKey->aucPN, 16);
8956 prGlueInfo = prAdapter->prGlueInfo;
8958 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetBufferLen));
8961 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8962 return WLAN_STATUS_FAILURE;
8965 // increase command sequence number
8966 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8968 // compose CMD_ID_ADD_REMOVE_KEY cmd pkt
8969 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
8970 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
8971 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
8972 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
8973 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
8974 prCmdInfo->fgIsOid = TRUE;
8975 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
8976 prCmdInfo->fgSetQuery = TRUE;
8977 prCmdInfo->fgNeedResp = FALSE;
8978 prCmdInfo->fgDriverDomainMCR = FALSE;
8979 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8980 prCmdInfo->u4SetInfoLen = u4SetBufferLen;
8981 prCmdInfo->pvInformationBuffer = pvSetBuffer;
8982 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
8985 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8986 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8987 prWifiCmd->ucCID = prCmdInfo->ucCID;
8988 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8989 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8991 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
8993 kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
8995 prCmdKey->ucAddRemove = 1; /* Add */
8997 if (prNewKey->eKeyType == ENUM_WPI_PAIRWISE_KEY) {
8998 prCmdKey->ucTxKey = 1;
8999 prCmdKey->ucKeyType = 1;
9002 kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8)prNewKey->aucAddrIndex, MAC_ADDR_LEN);
9004 prCmdKey->ucNetType = 0; /* AIS */
9006 prCmdKey->ucKeyId = prNewKey->ucKeyID;
9008 prCmdKey->ucKeyLen = 32;
9010 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WPI;
9012 kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8)prNewKey->aucWPIEK, 16);
9014 kalMemCopy(prCmdKey->aucKeyMaterial+16, (PUINT_8)prNewKey->aucWPICK, 16);
9016 kalMemCopy(prCmdKey->aucKeyRsc, (PUINT_8)prNewKey->aucPN, 16);
9018 // insert into prCmdQueue
9019 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
9021 // wakeup txServiceThread later
9022 GLUE_SET_EVENT(prGlueInfo);
9024 return WLAN_STATUS_PENDING;
9025 } /* wlanoidSetAddKey */
9029 #if CFG_SUPPORT_WPS2
9030 /*----------------------------------------------------------------------------*/
9032 * \brief This routine is called by WSC to set the assoc info, which is needed to add to
9033 * Association request frame while join WPS AP.
9035 * \param[in] prAdapter Pointer to the Adapter structure
9036 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
9037 * \param[in] u4SetBufferLen The length of the set buffer
9038 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9039 * bytes read from the set buffer. If the call failed due to invalid length of
9040 * the set buffer, returns the amount of storage needed.
9042 * \retval WLAN_STATUS_SUCCESS
9043 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
9044 * \retval WLAN_STATUS_INVALID_LENGTH
9047 /*----------------------------------------------------------------------------*/
9049 wlanoidSetWSCAssocInfo (
9050 IN P_ADAPTER_T prAdapter,
9051 IN PVOID pvSetBuffer,
9052 IN UINT_32 u4SetBufferLen,
9053 OUT PUINT_32 pu4SetInfoLen
9057 ASSERT(pvSetBuffer);
9058 ASSERT(pu4SetInfoLen);
9060 DEBUGFUNC("wlanoidSetWSCAssocInfo");
9061 DBGLOG(REQ, LOUD, ("\r\n"));
9063 if(u4SetBufferLen == 0)
9064 return WLAN_STATUS_INVALID_LENGTH;
9066 *pu4SetInfoLen = u4SetBufferLen;
9068 kalMemCopy(prAdapter->prGlueInfo->aucWSCAssocInfoIE, pvSetBuffer, u4SetBufferLen);
9069 prAdapter->prGlueInfo->u2WSCAssocInfoIELen = (UINT_16)u4SetBufferLen;
9070 DBGLOG(SEC, TRACE, ("Assoc Info IE sz %ld\n", u4SetBufferLen));
9072 return WLAN_STATUS_SUCCESS;
9078 #if CFG_ENABLE_WAKEUP_ON_LAN
9080 wlanoidSetAddWakeupPattern (
9081 IN P_ADAPTER_T prAdapter,
9082 IN PVOID pvSetBuffer,
9083 IN UINT_32 u4SetBufferLen,
9084 OUT PUINT_32 pu4SetInfoLen
9087 P_PARAM_PM_PACKET_PATTERN prPacketPattern;
9089 DEBUGFUNC("wlanoidSetAddWakeupPattern");
9090 DBGLOG(REQ, LOUD, ("\r\n"));
9093 ASSERT(pu4SetInfoLen);
9095 *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
9097 if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN)) {
9098 return WLAN_STATUS_INVALID_LENGTH;
9101 ASSERT(pvSetBuffer);
9103 prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
9106 * Send the struct to firmware */
9108 return WLAN_STATUS_FAILURE;
9113 wlanoidSetRemoveWakeupPattern (
9114 IN P_ADAPTER_T prAdapter,
9115 IN PVOID pvSetBuffer,
9116 IN UINT_32 u4SetBufferLen,
9117 OUT PUINT_32 pu4SetInfoLen
9120 P_PARAM_PM_PACKET_PATTERN prPacketPattern;
9122 DEBUGFUNC("wlanoidSetAddWakeupPattern");
9123 DBGLOG(REQ, LOUD, ("\r\n"));
9126 ASSERT(pu4SetInfoLen);
9128 *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
9130 if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN)) {
9131 return WLAN_STATUS_INVALID_LENGTH;
9134 ASSERT(pvSetBuffer);
9136 prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
9139 * Send the struct to firmware */
9141 return WLAN_STATUS_FAILURE;
9146 wlanoidQueryEnableWakeup (
9147 IN P_ADAPTER_T prAdapter,
9148 OUT PVOID pvQueryBuffer,
9149 IN UINT_32 u4QueryBufferLen,
9150 OUT PUINT_32 pu4QueryInfoLen
9153 PUINT_32 pu4WakeupEventEnable;
9155 DEBUGFUNC("wlanoidQueryEnableWakeup");
9156 DBGLOG(REQ, LOUD, ("\r\n"));
9159 ASSERT(pu4QueryInfoLen);
9160 if (u4QueryBufferLen) {
9161 ASSERT(pvQueryBuffer);
9164 *pu4QueryInfoLen = sizeof(UINT_32);
9166 if (u4QueryBufferLen < sizeof(UINT_32)) {
9167 return WLAN_STATUS_BUFFER_TOO_SHORT;
9170 pu4WakeupEventEnable = (PUINT_32)pvQueryBuffer;
9172 *pu4WakeupEventEnable = prAdapter->u4WakeupEventEnable;
9174 return WLAN_STATUS_SUCCESS;
9178 wlanoidSetEnableWakeup (
9179 IN P_ADAPTER_T prAdapter,
9180 IN PVOID pvSetBuffer,
9181 IN UINT_32 u4SetBufferLen,
9182 OUT PUINT_32 pu4SetInfoLen
9185 PUINT_32 pu4WakeupEventEnable;
9187 DEBUGFUNC("wlanoidSetEnableWakup");
9188 DBGLOG(REQ, LOUD, ("\r\n"));
9191 ASSERT(pu4SetInfoLen);
9193 *pu4SetInfoLen = sizeof(UINT_32);
9195 if (u4SetBufferLen < sizeof(UINT_32)) {
9196 return WLAN_STATUS_INVALID_LENGTH;
9199 ASSERT(pvSetBuffer);
9201 pu4WakeupEventEnable = (PUINT_32)pvSetBuffer;
9202 prAdapter->u4WakeupEventEnable = *pu4WakeupEventEnable;
9205 * Send Command Event for setting wakeup-pattern / Magic Packet to firmware
9208 return WLAN_STATUS_FAILURE;
9212 /*----------------------------------------------------------------------------*/
9214 * \brief This routine is called to configure PS related settings for WMM-PS test.
9216 * \param[in] prAdapter Pointer to the Adapter structure.
9217 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9218 * \param[in] u4SetBufferLen The length of the set buffer.
9219 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9220 * bytes read from the set buffer. If the call failed
9221 * due to invalid length of the set buffer, returns
9222 * the amount of storage needed.
9224 * \retval WLAN_STATUS_SUCCESS
9226 /*----------------------------------------------------------------------------*/
9228 wlanoidSetWiFiWmmPsTest (
9229 IN P_ADAPTER_T prAdapter,
9230 IN PVOID pvSetBuffer,
9231 IN UINT_32 u4SetBufferLen,
9232 OUT PUINT_32 pu4SetInfoLen
9235 P_PARAM_CUSTOM_WMM_PS_TEST_STRUC_T prWmmPsTestInfo;
9236 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9237 CMD_SET_WMM_PS_TEST_STRUC_T rSetWmmPsTestParam;
9238 UINT_16 u2CmdBufLen;
9239 P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
9240 P_BSS_INFO_T prBssInfo;
9242 DEBUGFUNC("wlanoidSetWiFiWmmPsTest");
9245 ASSERT(pvSetBuffer);
9246 ASSERT(pu4SetInfoLen);
9249 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUC_T);
9251 prWmmPsTestInfo = (P_PARAM_CUSTOM_WMM_PS_TEST_STRUC_T) pvSetBuffer;
9253 rSetWmmPsTestParam.ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
9254 rSetWmmPsTestParam.bmfgApsdEnAc = prWmmPsTestInfo->bmfgApsdEnAc;
9255 rSetWmmPsTestParam.ucIsEnterPsAtOnce = prWmmPsTestInfo->ucIsEnterPsAtOnce;
9256 rSetWmmPsTestParam.ucIsDisableUcTrigger = prWmmPsTestInfo->ucIsDisableUcTrigger;
9258 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[rSetWmmPsTestParam.ucNetTypeIndex]);
9259 prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
9260 prPmProfSetupInfo->ucBmpDeliveryAC = (rSetWmmPsTestParam.bmfgApsdEnAc >> 4) & BITS(0, 3);
9261 prPmProfSetupInfo->ucBmpTriggerAC = rSetWmmPsTestParam.bmfgApsdEnAc & BITS(0, 3);
9263 u2CmdBufLen = sizeof(CMD_SET_WMM_PS_TEST_STRUC_T);
9266 /* it will apply the disable trig or not immediately */
9267 if (prPmInfo->ucWmmPsDisableUcPoll && prPmInfo->ucWmmPsConnWithTrig) {
9268 // NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, TRUE);
9271 // NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, FALSE);
9275 rStatus = wlanSendSetQueryCmd(prAdapter,
9276 CMD_ID_SET_WMM_PS_TEST_PARMS,
9283 (PUINT_8)&rSetWmmPsTestParam,
9289 } /* wlanoidSetWiFiWmmPsTest */
9292 /*----------------------------------------------------------------------------*/
9294 * \brief This routine is called to configure enable/disable TX A-MPDU feature.
9296 * \param[in] prAdapter Pointer to the Adapter structure.
9297 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9298 * \param[in] u4SetBufferLen The length of the set buffer.
9299 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9300 * bytes read from the set buffer. If the call failed
9301 * due to invalid length of the set buffer, returns
9302 * the amount of storage needed.
9304 * \retval WLAN_STATUS_SUCCESS
9306 /*----------------------------------------------------------------------------*/
9309 IN P_ADAPTER_T prAdapter,
9310 IN PVOID pvSetBuffer,
9311 IN UINT_32 u4SetBufferLen,
9312 OUT PUINT_32 pu4SetInfoLen
9315 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9316 CMD_TX_AMPDU_T rTxAmpdu;
9317 UINT_16 u2CmdBufLen;
9320 DEBUGFUNC("wlanoidSetTxAmpdu");
9323 ASSERT(pvSetBuffer);
9324 ASSERT(pu4SetInfoLen);
9327 *pu4SetInfoLen = sizeof(BOOLEAN);
9329 pfgEnable = (PBOOLEAN) pvSetBuffer;
9331 rTxAmpdu.fgEnable = *pfgEnable;
9333 u2CmdBufLen = sizeof(CMD_TX_AMPDU_T);
9335 rStatus = wlanSendSetQueryCmd(prAdapter,
9349 } /* wlanoidSetTxAmpdu */
9352 /*----------------------------------------------------------------------------*/
9354 * \brief This routine is called to configure reject/accept ADDBA Request.
9356 * \param[in] prAdapter Pointer to the Adapter structure.
9357 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9358 * \param[in] u4SetBufferLen The length of the set buffer.
9359 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9360 * bytes read from the set buffer. If the call failed
9361 * due to invalid length of the set buffer, returns
9362 * the amount of storage needed.
9364 * \retval WLAN_STATUS_SUCCESS
9366 /*----------------------------------------------------------------------------*/
9368 wlanoidSetAddbaReject(
9369 IN P_ADAPTER_T prAdapter,
9370 IN PVOID pvSetBuffer,
9371 IN UINT_32 u4SetBufferLen,
9372 OUT PUINT_32 pu4SetInfoLen
9375 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9376 CMD_ADDBA_REJECT_T rAddbaReject;
9377 UINT_16 u2CmdBufLen;
9380 DEBUGFUNC("wlanoidSetAddbaReject");
9383 ASSERT(pvSetBuffer);
9384 ASSERT(pu4SetInfoLen);
9387 *pu4SetInfoLen = sizeof(BOOLEAN);
9389 pfgEnable = (PBOOLEAN) pvSetBuffer;
9391 rAddbaReject.fgEnable = *pfgEnable;
9393 u2CmdBufLen = sizeof(CMD_ADDBA_REJECT_T);
9395 rStatus = wlanSendSetQueryCmd(prAdapter,
9396 CMD_ID_ADDBA_REJECT,
9403 (PUINT_8)&rAddbaReject,
9409 } /* wlanoidSetAddbaReject */
9415 wlanoidQuerySLTStatus (
9416 IN P_ADAPTER_T prAdapter,
9417 OUT PVOID pvQueryBuffer,
9418 IN UINT_32 u4QueryBufferLen,
9419 OUT PUINT_32 pu4QueryInfoLen
9422 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
9423 P_PARAM_MTK_SLT_TEST_STRUC_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T)NULL;
9424 P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T)NULL;
9426 DEBUGFUNC("wlanoidQuerySLTStatus");
9427 DBGLOG(REQ, LOUD, ("\r\n"));
9430 ASSERT(pu4QueryInfoLen);
9432 *pu4QueryInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUC_T);
9434 if (u4QueryBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUC_T)) {
9435 return WLAN_STATUS_INVALID_LENGTH;
9438 ASSERT(pvQueryBuffer);
9440 prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T)pvQueryBuffer;
9442 prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
9444 switch (prMtkSltInfo->rSltFuncIdx) {
9445 case ENUM_MTK_SLT_FUNC_LP_SET:
9447 P_PARAM_MTK_SLT_LP_TEST_STRUC_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)NULL;
9449 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUC_T));
9451 prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9453 prLpSetting->u4BcnRcvNum = prSltInfo->u4BeaconReceiveCnt;
9462 } /* wlanoidQuerySLTStatus */
9465 wlanoidUpdateSLTMode (
9466 IN P_ADAPTER_T prAdapter,
9467 IN PVOID pvSetBuffer,
9468 IN UINT_32 u4SetBufferLen,
9469 OUT PUINT_32 pu4SetInfoLen
9472 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
9473 P_PARAM_MTK_SLT_TEST_STRUC_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T)NULL;
9474 P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T)NULL;
9475 P_BSS_DESC_T prBssDesc = (P_BSS_DESC_T)NULL;
9476 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
9477 P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T)NULL;
9479 /* 1. Action: Update or Initial Set
9481 * 3. Target MAC address.
9482 * 4. RF BW & Rate Settings
9485 DEBUGFUNC("wlanoidUpdateSLTMode");
9486 DBGLOG(REQ, LOUD, ("\r\n"));
9489 ASSERT(pu4SetInfoLen);
9491 *pu4SetInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUC_T);
9493 if (u4SetBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUC_T)) {
9494 return WLAN_STATUS_INVALID_LENGTH;
9497 ASSERT(pvSetBuffer);
9499 prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T) pvSetBuffer;
9501 prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
9502 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
9504 switch (prMtkSltInfo->rSltFuncIdx) {
9505 case ENUM_MTK_SLT_FUNC_INITIAL: /* Initialize */
9507 P_PARAM_MTK_SLT_INITIAL_STRUC_T prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUC_T)NULL;
9509 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_INITIAL_STRUC_T));
9511 prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9513 if (prSltInfo->prPseudoStaRec != NULL) {
9514 /* The driver has been initialized. */
9515 prSltInfo->prPseudoStaRec = NULL;
9519 prSltInfo->prPseudoBssDesc = scanSearchExistingBssDesc(prAdapter,
9521 prMtkSltInit->aucTargetMacAddr,
9522 prMtkSltInit->aucTargetMacAddr);
9524 prSltInfo->u2SiteID = prMtkSltInit->u2SiteID;
9526 /* Bandwidth 2.4G: Channel 1~14
9527 * Bandwidth 5G: *36, 40, 44, 48, 52, 56, 60, 64,
9528 * *100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
9529 * 149, 153, *157, 161,
9530 * 184, 188, 192, 196, 200, 204, 208, 212, *216
9532 prSltInfo->ucChannel2G4 = 1 + (prSltInfo->u2SiteID % 4) * 5;
9534 switch (prSltInfo->ucChannel2G4) {
9536 prSltInfo->ucChannel5G = 36;
9539 prSltInfo->ucChannel5G = 52;
9542 prSltInfo->ucChannel5G = 104;
9545 prSltInfo->ucChannel2G4 = 14;
9546 prSltInfo->ucChannel5G = 161;
9552 if (prSltInfo->prPseudoBssDesc == NULL) {
9554 prSltInfo->prPseudoBssDesc = scanAllocateBssDesc(prAdapter);
9556 if (prSltInfo->prPseudoBssDesc == NULL) {
9557 rWlanStatus = WLAN_STATUS_FAILURE;
9561 prBssDesc = prSltInfo->prPseudoBssDesc;
9566 prBssDesc = prSltInfo->prPseudoBssDesc;
9570 prBssDesc->eBSSType = BSS_TYPE_IBSS;
9572 COPY_MAC_ADDR(prBssDesc->aucSrcAddr, prMtkSltInit->aucTargetMacAddr);
9573 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
9575 prBssDesc->u2BeaconInterval = 100;
9576 prBssDesc->u2ATIMWindow = 0;
9577 prBssDesc->ucDTIMPeriod = 1;
9579 prBssDesc->u2IELength = 0;
9581 prBssDesc->fgIsERPPresent = TRUE;
9582 prBssDesc->fgIsHTPresent = TRUE;
9584 prBssDesc->u2OperationalRateSet = BIT(RATE_36M_INDEX);
9585 prBssDesc->u2BSSBasicRateSet = BIT(RATE_36M_INDEX);
9586 prBssDesc->fgIsUnknownBssBasicRate = FALSE;
9588 prBssDesc->fgIsLargerTSF = TRUE;
9590 prBssDesc->eBand = BAND_2G4;
9592 prBssDesc->ucChannelNum = prSltInfo->ucChannel2G4;
9594 prBssDesc->ucPhyTypeSet = PHY_TYPE_SET_802_11ABGN;
9596 GET_CURRENT_SYSTIME(&prBssDesc->rUpdateTime);
9600 case ENUM_MTK_SLT_FUNC_RATE_SET: /* Update RF Settings. */
9601 if (prSltInfo->prPseudoStaRec == NULL) {
9602 rWlanStatus = WLAN_STATUS_FAILURE;
9605 P_PARAM_MTK_SLT_TR_TEST_STRUC_T prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUC_T)NULL;
9607 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_TR_TEST_STRUC_T));
9609 prStaRec = prSltInfo->prPseudoStaRec;
9610 prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9612 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
9613 prBssInfo->eBand = BAND_5G;
9614 prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel5G;
9616 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM24) {
9617 prBssInfo->eBand = BAND_2G4;
9618 prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel2G4;
9621 if ((prTRSetting->u4FixedRate & FIXED_BW_DL40) != 0) {
9623 prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH; /* It would controls RFBW capability in WTBL. */
9624 prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT; /* This controls RF BW, RF BW would be 40 only if
9625 * 1. PHY_TYPE_BIT_HT is TRUE.
9626 * 2. SCO is SCA/SCB.
9629 /* U20/L20 Control. */
9630 switch (prTRSetting->u4FixedRate & 0xC000) {
9631 case FIXED_EXT_CHNL_U20:
9632 prBssInfo->eBssSCO = CHNL_EXT_SCB; // +2
9633 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
9634 prBssInfo->ucPrimaryChannel += 2;
9637 if (prBssInfo->ucPrimaryChannel <5) {
9638 prBssInfo->ucPrimaryChannel = 8; // For channel 1, testing L20 at channel 8.
9642 case FIXED_EXT_CHNL_L20:
9644 prBssInfo->eBssSCO = CHNL_EXT_SCA; // -2
9645 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
9646 prBssInfo->ucPrimaryChannel -= 2;
9649 if (prBssInfo->ucPrimaryChannel > 10) {
9650 prBssInfo->ucPrimaryChannel = 3; // For channel 11 / 14. testing U20 at channel 3.
9658 prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
9659 prBssInfo->eBssSCO = CHNL_EXT_SCN;
9662 prBssInfo->fgErpProtectMode = FALSE;
9663 prBssInfo->eHtProtectMode = HT_PROTECT_MODE_NONE;
9664 prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
9666 nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
9668 prStaRec->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
9670 switch (prTRSetting->u4FixedRate & 0xFF) {
9672 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_54M_INDEX);
9675 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_48M_INDEX);
9678 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_INDEX);
9681 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_24M_INDEX);
9684 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_6M_INDEX);
9686 case RATE_CCK_11M_LONG:
9687 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_11M_INDEX);
9689 case RATE_CCK_1M_LONG:
9690 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_1M_INDEX);
9693 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
9694 prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
9697 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
9698 prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_HT_GF;
9699 #if 0 // Only for Current Measurement Mode.
9700 prStaRec->u2HtCapInfo |= (HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
9704 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
9705 prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
9708 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_INDEX);
9712 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
9714 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
9718 case ENUM_MTK_SLT_FUNC_LP_SET: /* Reset LP Test Result. */
9720 P_PARAM_MTK_SLT_LP_TEST_STRUC_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)NULL;
9722 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUC_T));
9724 prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9726 if (prSltInfo->prPseudoBssDesc == NULL) {
9727 /* Please initial SLT Mode first. */
9731 prBssDesc = prSltInfo->prPseudoBssDesc;
9734 switch (prLpSetting->rLpTestMode) {
9735 case ENUM_MTK_LP_TEST_NORMAL:
9736 /* In normal mode, we would use target MAC address to be the BSSID. */
9737 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
9738 prSltInfo->fgIsDUT = FALSE;
9740 case ENUM_MTK_LP_TEST_GOLDEN_SAMPLE:
9741 /* 1. Lower AIFS of BCN queue.
9742 * 2. Fixed Random Number tobe 0.
9744 prSltInfo->fgIsDUT = FALSE;
9745 /* In LP test mode, we would use MAC address of Golden Sample to be the BSSID. */
9746 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
9748 case ENUM_MTK_LP_TEST_DUT:
9749 /* 1. Enter Sleep Mode.
9750 * 2. Fix random number a large value & enlarge AIFN of BCN queue.
9752 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssDesc->aucSrcAddr);
9753 prSltInfo->u4BeaconReceiveCnt = 0;
9754 prSltInfo->fgIsDUT = TRUE;
9768 return WLAN_STATUS_FAILURE;
9772 } /* wlanoidUpdateSLTMode */
9776 /*----------------------------------------------------------------------------*/
9778 * \brief This routine is called to query NVRAM value.
9780 * \param[in] pvAdapter Pointer to the Adapter structure.
9781 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
9783 * \param[in] u4QueryBufLen The length of the query buffer.
9784 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
9785 * bytes written into the query buffer. If the call
9786 * failed due to invalid length of the query buffer,
9787 * returns the amount of storage needed.
9789 * \retval WLAN_STATUS_SUCCESS
9790 * \retval WLAN_STATUS_FAILURE
9792 /*----------------------------------------------------------------------------*/
9794 wlanoidQueryNvramRead (
9795 IN P_ADAPTER_T prAdapter,
9796 OUT PVOID pvQueryBuffer,
9797 IN UINT_32 u4QueryBufferLen,
9798 OUT PUINT_32 pu4QueryInfoLen
9801 P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
9804 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9806 DEBUGFUNC("wlanoidQueryNvramRead");
9809 ASSERT(pu4QueryInfoLen);
9810 if (u4QueryBufferLen) {
9811 ASSERT(pvQueryBuffer);
9814 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
9816 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T)) {
9817 return WLAN_STATUS_INVALID_LENGTH;
9820 prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T)pvQueryBuffer;
9822 if(prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_READ) {
9823 fgStatus = kalCfgDataRead16(prAdapter->prGlueInfo,
9824 prNvramRwInfo->ucEepromIndex << 1, /* change to byte offset */
9828 prNvramRwInfo->u2EepromData = u2Data;
9829 DBGLOG(REQ, INFO, ("NVRAM Read: index=%#X, data=%#02X\r\n",
9830 prNvramRwInfo->ucEepromIndex, u2Data));
9833 DBGLOG(REQ, ERROR, ("NVRAM Read Failed: index=%#x.\r\n",
9834 prNvramRwInfo->ucEepromIndex));
9835 rStatus = WLAN_STATUS_FAILURE;
9838 else if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_GETSIZE) {
9839 prNvramRwInfo->u2EepromData = CFG_FILE_WIFI_REC_SIZE;
9840 DBGLOG(REQ, INFO, ("EEPROM size =%d\r\n", prNvramRwInfo->u2EepromData));
9843 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T);
9846 } /* wlanoidQueryNvramRead */
9849 /*----------------------------------------------------------------------------*/
9851 * \brief This routine is called to write NVRAM value.
9853 * \param[in] prAdapter Pointer to the Adapter structure.
9854 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9855 * \param[in] u4SetBufferLen The length of the set buffer.
9856 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9857 * bytes read from the set buffer. If the call failed
9858 * due to invalid length of the set buffer, returns
9859 * the amount of storage needed.
9861 * \retval WLAN_STATUS_SUCCESS
9862 * \retval WLAN_STATUS_FAILURE
9864 /*----------------------------------------------------------------------------*/
9866 wlanoidSetNvramWrite (
9867 IN P_ADAPTER_T prAdapter,
9868 IN PVOID pvSetBuffer,
9869 IN UINT_32 u4SetBufferLen,
9870 OUT PUINT_32 pu4SetInfoLen
9873 P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
9875 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9878 DEBUGFUNC("wlanoidSetNvramWrite");
9879 DBGLOG(INIT, LOUD,("\n"));
9882 ASSERT(pu4SetInfoLen);
9884 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
9886 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T)) {
9887 return WLAN_STATUS_INVALID_LENGTH;
9890 ASSERT(pvSetBuffer);
9892 prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T)pvSetBuffer;
9894 fgStatus = kalCfgDataWrite16(prAdapter->prGlueInfo,
9895 prNvramRwInfo->ucEepromIndex << 1, /* change to byte offset */
9896 prNvramRwInfo->u2EepromData
9899 if(fgStatus == FALSE){
9900 DBGLOG(REQ, ERROR, ("NVRAM Write Failed.\r\n"));
9901 rStatus = WLAN_STATUS_FAILURE;
9905 } /* wlanoidSetNvramWrite */
9908 /*----------------------------------------------------------------------------*/
9910 * \brief This routine is called to get the config data source type.
9912 * \param[in] prAdapter Pointer to the Adapter structure.
9913 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9914 * \param[in] u4SetBufferLen The length of the set buffer.
9915 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9916 * bytes read from the set buffer. If the call failed
9917 * due to invalid length of the set buffer, returns
9918 * the amount of storage needed.
9920 * \retval WLAN_STATUS_SUCCESS
9921 * \retval WLAN_STATUS_FAILURE
9923 /*----------------------------------------------------------------------------*/
9925 wlanoidQueryCfgSrcType(
9926 IN P_ADAPTER_T prAdapter,
9927 OUT PVOID pvQueryBuffer,
9928 IN UINT_32 u4QueryBufferLen,
9929 OUT PUINT_32 pu4QueryInfoLen
9934 *pu4QueryInfoLen = sizeof(ENUM_CFG_SRC_TYPE_T);
9936 if(kalIsConfigurationExist(prAdapter->prGlueInfo) == TRUE) {
9937 *(P_ENUM_CFG_SRC_TYPE_T)pvQueryBuffer = CFG_SRC_TYPE_NVRAM;
9940 *(P_ENUM_CFG_SRC_TYPE_T)pvQueryBuffer = CFG_SRC_TYPE_EEPROM;
9943 return WLAN_STATUS_SUCCESS;
9947 /*----------------------------------------------------------------------------*/
9949 * \brief This routine is called to get the config data source type.
9951 * \param[in] prAdapter Pointer to the Adapter structure.
9952 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9953 * \param[in] u4SetBufferLen The length of the set buffer.
9954 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9955 * bytes read from the set buffer. If the call failed
9956 * due to invalid length of the set buffer, returns
9957 * the amount of storage needed.
9959 * \retval WLAN_STATUS_SUCCESS
9960 * \retval WLAN_STATUS_FAILURE
9962 /*----------------------------------------------------------------------------*/
9964 wlanoidQueryEepromType(
9965 IN P_ADAPTER_T prAdapter,
9966 OUT PVOID pvQueryBuffer,
9967 IN UINT_32 u4QueryBufferLen,
9968 OUT PUINT_32 pu4QueryInfoLen
9973 *pu4QueryInfoLen = sizeof(P_ENUM_EEPROM_TYPE_T);
9975 #if CFG_SUPPORT_NIC_CAPABILITY
9976 if(prAdapter->fgIsEepromUsed == TRUE) {
9977 *( P_ENUM_EEPROM_TYPE_T )pvQueryBuffer = EEPROM_TYPE_PRESENT;
9980 *( P_ENUM_EEPROM_TYPE_T )pvQueryBuffer = EEPROM_TYPE_NO;
9983 *( P_ENUM_EEPROM_TYPE_T )pvQueryBuffer = EEPROM_TYPE_NO;
9986 return WLAN_STATUS_SUCCESS;
9989 /*----------------------------------------------------------------------------*/
9991 * \brief This routine is called to get the config data source type.
9993 * \param[in] prAdapter Pointer to the Adapter structure.
9994 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9995 * \param[in] u4SetBufferLen The length of the set buffer.
9996 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9997 * bytes read from the set buffer. If the call failed
9998 * due to invalid length of the set buffer, returns
9999 * the amount of storage needed.
10001 * \retval WLAN_STATUS_SUCCESS
10002 * \retval WLAN_STATUS_FAILURE
10004 /*----------------------------------------------------------------------------*/
10006 wlanoidSetCountryCode (
10007 IN P_ADAPTER_T prAdapter,
10008 IN PVOID pvSetBuffer,
10009 IN UINT_32 u4SetBufferLen,
10010 OUT PUINT_32 pu4SetInfoLen
10013 PUINT_8 pucCountry;
10016 ASSERT(pvSetBuffer);
10017 ASSERT(u4SetBufferLen == 2);
10019 *pu4SetInfoLen = 2;
10021 pucCountry = pvSetBuffer;
10023 prAdapter->rWifiVar.rConnSettings.u2CountryCode =
10024 (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]) ;
10026 prAdapter->prDomainInfo = NULL; /* Force to re-search country code */
10027 rlmDomainSendCmd(prAdapter, TRUE);
10029 return WLAN_STATUS_SUCCESS;
10034 wlanoidSetNoaParam (
10035 IN P_ADAPTER_T prAdapter,
10036 IN PVOID pvSetBuffer,
10037 IN UINT_32 u4SetBufferLen,
10038 OUT PUINT_32 pu4SetInfoLen
10041 P_PARAM_CUSTOM_NOA_PARAM_STRUC_T prNoaParam;
10042 CMD_CUSTOM_NOA_PARAM_STRUC_T rCmdNoaParam;
10044 DEBUGFUNC("wlanoidSetNoaParam");
10045 DBGLOG(INIT, LOUD,("\n"));
10048 ASSERT(pu4SetInfoLen);
10050 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T);
10052 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T)) {
10053 return WLAN_STATUS_INVALID_LENGTH;
10056 ASSERT(pvSetBuffer);
10058 prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUC_T)pvSetBuffer;
10060 kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T));
10061 rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
10062 rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
10063 rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
10065 return wlanSendSetQueryCmd(prAdapter,
10066 CMD_ID_SET_NOA_PARAM,
10070 nicCmdEventSetCommon,
10071 nicOidCmdTimeoutCommon,
10072 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T),
10073 (PUINT_8)&rCmdNoaParam,
10080 wlanoidSetOppPsParam (
10081 IN P_ADAPTER_T prAdapter,
10082 IN PVOID pvSetBuffer,
10083 IN UINT_32 u4SetBufferLen,
10084 OUT PUINT_32 pu4SetInfoLen
10087 P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T prOppPsParam;
10088 CMD_CUSTOM_OPPPS_PARAM_STRUC_T rCmdOppPsParam;
10090 DEBUGFUNC("wlanoidSetOppPsParam");
10091 DBGLOG(INIT, LOUD,("\n"));
10094 ASSERT(pu4SetInfoLen);
10096 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T);
10098 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)) {
10099 return WLAN_STATUS_INVALID_LENGTH;
10102 ASSERT(pvSetBuffer);
10104 prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)pvSetBuffer;
10106 kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
10107 rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
10109 return wlanSendSetQueryCmd(prAdapter,
10110 CMD_ID_SET_OPPPS_PARAM,
10114 nicCmdEventSetCommon,
10115 nicOidCmdTimeoutCommon,
10116 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
10117 (PUINT_8)&rCmdOppPsParam,
10124 wlanoidSetUApsdParam (
10125 IN P_ADAPTER_T prAdapter,
10126 IN PVOID pvSetBuffer,
10127 IN UINT_32 u4SetBufferLen,
10128 OUT PUINT_32 pu4SetInfoLen
10131 P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T prUapsdParam;
10132 CMD_CUSTOM_UAPSD_PARAM_STRUC_T rCmdUapsdParam;
10133 P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
10134 P_BSS_INFO_T prBssInfo;
10137 DEBUGFUNC("wlanoidSetUApsdParam");
10138 DBGLOG(INIT, LOUD,("\n"));
10141 ASSERT(pu4SetInfoLen);
10143 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T);
10145 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)) {
10146 return WLAN_STATUS_INVALID_LENGTH;
10149 ASSERT(pvSetBuffer);
10151 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
10152 prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
10154 prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)pvSetBuffer;
10156 kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
10157 rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
10158 prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
10160 rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
10161 rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
10162 rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
10163 rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
10164 prPmProfSetupInfo->ucBmpDeliveryAC =
10165 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
10166 (prUapsdParam->fgEnAPSD_AcBk << 1) |
10167 (prUapsdParam->fgEnAPSD_AcVi << 2) |
10168 (prUapsdParam->fgEnAPSD_AcVo << 3));
10169 prPmProfSetupInfo->ucBmpTriggerAC =
10170 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
10171 (prUapsdParam->fgEnAPSD_AcBk << 1) |
10172 (prUapsdParam->fgEnAPSD_AcVi << 2) |
10173 (prUapsdParam->fgEnAPSD_AcVo << 3));
10175 rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
10176 prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
10178 return wlanSendSetQueryCmd(prAdapter,
10179 CMD_ID_SET_UAPSD_PARAM,
10183 nicCmdEventSetCommon,
10184 nicOidCmdTimeoutCommon,
10185 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
10186 (PUINT_8)&rCmdUapsdParam,
10193 /*----------------------------------------------------------------------------*/
10195 * \brief This routine is called to set BT profile or BT information and the
10196 * driver will set the built-in PTA configuration into chip.
10199 * \param[in] prAdapter Pointer to the Adapter structure.
10200 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
10201 * \param[in] u4SetBufferLen The length of the set buffer.
10202 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
10203 * bytes read from the set buffer. If the call failed
10204 * due to invalid length of the set buffer, returns
10205 * the amount of storage needed.
10207 * \retval WLAN_STATUS_SUCCESS
10208 * \retval WLAN_STATUS_INVALID_LENGTH
10210 /*----------------------------------------------------------------------------*/
10213 IN P_ADAPTER_T prAdapter,
10214 IN PVOID pvSetBuffer,
10215 IN UINT_32 u4SetBufferLen,
10216 OUT PUINT_32 pu4SetInfoLen
10220 P_PTA_IPC_T prPtaIpc;
10222 DEBUGFUNC("wlanoidSetBT.\n");
10225 ASSERT(pu4SetInfoLen);
10227 *pu4SetInfoLen = sizeof(PTA_IPC_T);
10228 if (u4SetBufferLen != sizeof(PTA_IPC_T)) {
10229 WARNLOG(("Invalid length %ld\n", u4SetBufferLen));
10230 return WLAN_STATUS_INVALID_LENGTH;
10233 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
10234 DBGLOG(REQ, WARN, ("Fail to set BT profile because of ACPI_D3\n"));
10235 return WLAN_STATUS_ADAPTER_NOT_READY;
10238 ASSERT(pvSetBuffer);
10239 prPtaIpc = (P_PTA_IPC_T)pvSetBuffer;
10241 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
10242 printk(KERN_INFO DRV_NAME "BCM BWCS CMD: BWCS CMD = %02x%02x%02x%02x\n",
10243 prPtaIpc->u.aucBTPParams[0], prPtaIpc->u.aucBTPParams[1], prPtaIpc->u.aucBTPParams[2], prPtaIpc->u.aucBTPParams[3]);
10245 printk(KERN_INFO DRV_NAME "BCM BWCS CMD: aucBTPParams[0] = %02x, aucBTPParams[1] = %02x, aucBTPParams[2] = %02x, aucBTPParams[3] = %02x.\n",
10246 prPtaIpc->u.aucBTPParams[0],
10247 prPtaIpc->u.aucBTPParams[1],
10248 prPtaIpc->u.aucBTPParams[2],
10249 prPtaIpc->u.aucBTPParams[3]);
10252 wlanSendSetQueryCmd(prAdapter,
10264 return WLAN_STATUS_SUCCESS;
10267 /*----------------------------------------------------------------------------*/
10269 * \brief This routine is called to query current BT profile and BTCR values
10271 * \param[in] prAdapter Pointer to the Adapter structure.
10272 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
10274 * \param[in] u4QueryBufferLen The length of the query buffer.
10275 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
10276 * bytes written into the query buffer. If the call
10277 * failed due to invalid length of the query buffer,
10278 * returns the amount of storage needed.
10280 * \retval WLAN_STATUS_SUCCESS
10281 * \retval WLAN_STATUS_INVALID_LENGTH
10283 /*----------------------------------------------------------------------------*/
10286 IN P_ADAPTER_T prAdapter,
10287 OUT PVOID pvQueryBuffer,
10288 IN UINT_32 u4QueryBufferLen,
10289 OUT PUINT_32 pu4QueryInfoLen
10292 // P_PARAM_PTA_IPC_T prPtaIpc;
10293 // UINT_32 u4QueryBuffLen;
10296 ASSERT(pu4QueryInfoLen);
10297 if (u4QueryBufferLen) {
10298 ASSERT(pvQueryBuffer);
10301 *pu4QueryInfoLen = sizeof(PTA_IPC_T);
10303 /* Check for query buffer length */
10304 if (u4QueryBufferLen != sizeof(PTA_IPC_T)) {
10305 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
10306 return WLAN_STATUS_INVALID_LENGTH;
10309 ASSERT(pvQueryBuffer);
10310 // prPtaIpc = (P_PTA_IPC_T)pvQueryBuffer;
10311 // prPtaIpc->ucCmd = BT_CMD_PROFILE;
10312 // prPtaIpc->ucLen = sizeof(prPtaIpc->u);
10313 // nicPtaGetProfile(prAdapter, (PUINT_8)&prPtaIpc->u, &u4QueryBuffLen);
10315 return WLAN_STATUS_SUCCESS;
10320 wlanoidQueryBtSingleAntenna (
10321 IN P_ADAPTER_T prAdapter,
10322 OUT PVOID pvQueryBuffer,
10323 IN UINT_32 u4QueryBufferLen,
10324 OUT PUINT_32 pu4QueryInfoLen
10327 P_PTA_INFO_T prPtaInfo;
10328 PUINT_32 pu4SingleAntenna;
10331 ASSERT(pu4QueryInfoLen);
10332 if (u4QueryBufferLen) {
10333 ASSERT(pvQueryBuffer);
10336 *pu4QueryInfoLen = sizeof(UINT_32);
10338 /* Check for query buffer length */
10339 if (u4QueryBufferLen != sizeof(UINT_32)) {
10340 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
10341 return WLAN_STATUS_INVALID_LENGTH;
10344 ASSERT(pvQueryBuffer);
10346 prPtaInfo = &prAdapter->rPtaInfo;
10347 pu4SingleAntenna = (PUINT_32)pvQueryBuffer;
10349 if(prPtaInfo->fgSingleAntenna) {
10350 //printk(KERN_WARNING DRV_NAME"Q Single Ant = 1\r\n");
10351 *pu4SingleAntenna = 1;
10353 //printk(KERN_WARNING DRV_NAME"Q Single Ant = 0\r\n");
10354 *pu4SingleAntenna = 0;
10357 return WLAN_STATUS_SUCCESS;
10362 wlanoidSetBtSingleAntenna (
10363 IN P_ADAPTER_T prAdapter,
10364 IN PVOID pvSetBuffer,
10365 IN UINT_32 u4SetBufferLen,
10366 OUT PUINT_32 pu4SetInfoLen
10370 PUINT_32 pu4SingleAntenna;
10371 UINT_32 u4SingleAntenna;
10372 P_PTA_INFO_T prPtaInfo;
10375 ASSERT(pu4SetInfoLen);
10377 prPtaInfo = &prAdapter->rPtaInfo;
10379 *pu4SetInfoLen = sizeof(UINT_32);
10380 if (u4SetBufferLen != sizeof(UINT_32)) {
10381 return WLAN_STATUS_INVALID_LENGTH;
10384 if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
10385 return WLAN_STATUS_SUCCESS;
10388 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
10389 DBGLOG(REQ, WARN, ("Fail to set antenna because of ACPI_D3\n"));
10390 return WLAN_STATUS_ADAPTER_NOT_READY;
10393 ASSERT(pvSetBuffer);
10394 pu4SingleAntenna = (PUINT_32)pvSetBuffer;
10395 u4SingleAntenna = *pu4SingleAntenna;
10397 if (u4SingleAntenna == 0) {
10398 //printk(KERN_WARNING DRV_NAME"Set Single Ant = 0\r\n");
10399 prPtaInfo->fgSingleAntenna = FALSE;
10401 //printk(KERN_WARNING DRV_NAME"Set Single Ant = 1\r\n");
10402 prPtaInfo->fgSingleAntenna = TRUE;
10404 ptaFsmRunEventSetConfig(prAdapter, &prPtaInfo->rPtaParam);
10406 return WLAN_STATUS_SUCCESS;
10410 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
10413 IN P_ADAPTER_T prAdapter,
10414 OUT PVOID pvQueryBuffer,
10415 IN UINT_32 u4QueryBufferLen,
10416 OUT PUINT_32 pu4QueryInfoLen
10419 P_PTA_INFO_T prPtaInfo;
10423 ASSERT(pu4QueryInfoLen);
10424 if (u4QueryBufferLen) {
10425 ASSERT(pvQueryBuffer);
10428 *pu4QueryInfoLen = sizeof(UINT_32);
10430 /* Check for query buffer length */
10431 if (u4QueryBufferLen != sizeof(UINT_32)) {
10432 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
10433 return WLAN_STATUS_INVALID_LENGTH;
10436 ASSERT(pvQueryBuffer);
10438 prPtaInfo = &prAdapter->rPtaInfo;
10439 pu4Pta = (PUINT_32)pvQueryBuffer;
10441 if(prPtaInfo->fgEnabled) {
10442 //printk(KERN_WARNING DRV_NAME"PTA = 1\r\n");
10445 //printk(KERN_WARNING DRV_NAME"PTA = 0\r\n");
10449 return WLAN_STATUS_SUCCESS;
10455 IN P_ADAPTER_T prAdapter,
10456 IN PVOID pvSetBuffer,
10457 IN UINT_32 u4SetBufferLen,
10458 OUT PUINT_32 pu4SetInfoLen
10461 PUINT_32 pu4PtaCtrl;
10465 ASSERT(pu4SetInfoLen);
10467 *pu4SetInfoLen = sizeof(UINT_32);
10468 if (u4SetBufferLen != sizeof(UINT_32)) {
10469 return WLAN_STATUS_INVALID_LENGTH;
10472 if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
10473 return WLAN_STATUS_SUCCESS;
10476 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
10477 DBGLOG(REQ, WARN, ("Fail to set BT setting because of ACPI_D3\n"));
10478 return WLAN_STATUS_ADAPTER_NOT_READY;
10481 ASSERT(pvSetBuffer);
10482 pu4PtaCtrl = (PUINT_32)pvSetBuffer;
10483 u4PtaCtrl = *pu4PtaCtrl;
10485 if (u4PtaCtrl == 0) {
10486 //printk(KERN_WARNING DRV_NAME"Set Pta= 0\r\n");
10487 nicPtaSetFunc(prAdapter, FALSE);
10489 //printk(KERN_WARNING DRV_NAME"Set Pta= 1\r\n");
10490 nicPtaSetFunc(prAdapter, TRUE);
10493 return WLAN_STATUS_SUCCESS;
10499 /*----------------------------------------------------------------------------*/
10501 * \brief This routine is called to set Tx power profile.
10504 * \param[in] prAdapter Pointer to the Adapter structure.
10505 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
10506 * \param[in] u4SetBufferLen The length of the set buffer.
10507 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
10508 * bytes read from the set buffer. If the call failed
10509 * due to invalid length of the set buffer, returns
10510 * the amount of storage needed.
10512 * \retval WLAN_STATUS_SUCCESS
10513 * \retval WLAN_STATUS_INVALID_LENGTH
10515 /*----------------------------------------------------------------------------*/
10517 wlanoidSetTxPower (
10518 IN P_ADAPTER_T prAdapter,
10519 IN PVOID pvSetBuffer,
10520 IN UINT_32 u4SetBufferLen,
10521 OUT PUINT_32 pu4SetInfoLen
10524 //P_SET_TXPWR_CTRL_T pTxPwr = (P_SET_TXPWR_CTRL_T)pvSetBuffer;
10526 WLAN_STATUS rStatus;
10528 DEBUGFUNC("wlanoidSetTxPower");
10529 DBGLOG(REQ, LOUD, ("\r\n"));
10532 ASSERT(pvSetBuffer);
10535 printk("c2GLegacyStaPwrOffset=%d\n", pTxPwr->c2GLegacyStaPwrOffset);
10536 printk("c2GHotspotPwrOffset=%d\n", pTxPwr->c2GHotspotPwrOffset);
10537 printk("c2GP2pPwrOffset=%d\n", pTxPwr->c2GP2pPwrOffset);
10538 printk("c2GBowPwrOffset=%d\n", pTxPwr->c2GBowPwrOffset);
10539 printk("c5GLegacyStaPwrOffset=%d\n", pTxPwr->c5GLegacyStaPwrOffset);
10540 printk("c5GHotspotPwrOffset=%d\n", pTxPwr->c5GHotspotPwrOffset);
10541 printk("c5GP2pPwrOffset=%d\n", pTxPwr->c5GP2pPwrOffset);
10542 printk("c5GBowPwrOffset=%d\n", pTxPwr->c5GBowPwrOffset);
10543 printk("ucConcurrencePolicy=%d\n", pTxPwr->ucConcurrencePolicy);
10545 for (i=0; i<14;i++)
10546 printk("acTxPwrLimit2G[%d]=%d\n", i, pTxPwr->acTxPwrLimit2G[i]);
10549 printk("acTxPwrLimit5G[%d]=%d\n", i, pTxPwr->acTxPwrLimit5G[i]);
10552 rStatus = wlanSendSetQueryCmd (
10553 prAdapter, /* prAdapter */
10554 CMD_ID_SET_TXPWR_CTRL, /* ucCID */
10555 TRUE, /* fgSetQuery */
10556 FALSE, /* fgNeedResp */
10557 TRUE, /* fgIsOid */
10558 NULL, /* pfCmdDoneHandler*/
10559 NULL, /* pfCmdTimeoutHandler */
10560 u4SetBufferLen, /* u4SetQueryInfoLen */
10561 (PUINT_8) pvSetBuffer, /* pucInfoBuffer */
10562 NULL, /* pvSetQueryBuffer */
10563 0 /* u4SetQueryBufferLen */
10566 ASSERT(rStatus == WLAN_STATUS_PENDING);
10573 wlanSendMemDumpCmd (
10574 IN P_ADAPTER_T prAdapter,
10575 IN PVOID pvQueryBuffer,
10576 IN UINT_32 u4QueryBufferLen
10579 P_PARAM_CUSTOM_MEM_DUMP_STRUC_T prMemDumpInfo;
10580 P_CMD_DUMP_MEM prCmdDumpMem;
10581 CMD_DUMP_MEM rCmdDumpMem;
10582 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
10583 UINT_32 u4MemSize = PARAM_MEM_DUMP_MAX_SIZE;
10585 UINT_32 u4RemainLeng = 0;
10586 UINT_32 u4CurAddr = 0;
10587 UINT_8 ucFragNum = 0;
10589 prCmdDumpMem = &rCmdDumpMem;
10590 prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUC_T)pvQueryBuffer;
10592 u4RemainLeng = prMemDumpInfo->u4RemainLength;
10593 u4CurAddr = prMemDumpInfo->u4Address + prMemDumpInfo->u4Length;
10594 ucFragNum = prMemDumpInfo->ucFragNum + 1;
10596 /* Query. If request length is larger than max length, do it as ping pong.
10597 * Send a command and wait for a event. Send next command while the event is received.
10601 UINT_32 u4CurLeng = 0;
10603 if(u4RemainLeng > u4MemSize) {
10604 u4CurLeng = u4MemSize;
10605 u4RemainLeng -= u4MemSize;
10607 u4CurLeng = u4RemainLeng;
10611 prCmdDumpMem->u4Address = u4CurAddr;
10612 prCmdDumpMem->u4Length = u4CurLeng;
10613 prCmdDumpMem->u4RemainLength = u4RemainLeng;
10614 prCmdDumpMem->ucFragNum = ucFragNum;
10616 DBGLOG(REQ, TRACE, ("[%d] 0x%X, len %d, remain len %d\n",
10618 prCmdDumpMem->u4Address,
10619 prCmdDumpMem->u4Length,
10620 prCmdDumpMem->u4RemainLength));
10622 rStatus = wlanSendSetQueryCmd(prAdapter,
10627 nicCmdEventQueryMemDump,
10628 nicOidCmdTimeoutCommon,
10629 sizeof(CMD_DUMP_MEM),
10630 (PUINT_8)prCmdDumpMem,
10641 /*----------------------------------------------------------------------------*/
10643 * \brief This routine is called to dump memory.
10645 * \param[in] pvAdapter Pointer to the Adapter structure.
10646 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
10648 * \param[in] u4QueryBufLen The length of the query buffer.
10649 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
10650 * bytes written into the query buffer. If the call
10651 * failed due to invalid length of the query buffer,
10652 * returns the amount of storage needed.
10654 * \retval WLAN_STATUS_SUCCESS
10655 * \retval WLAN_STATUS_INVALID_LENGTH
10657 /*----------------------------------------------------------------------------*/
10659 wlanoidQueryMemDump (
10660 IN P_ADAPTER_T prAdapter,
10661 IN PVOID pvQueryBuffer,
10662 IN UINT_32 u4QueryBufferLen,
10663 OUT PUINT_32 pu4QueryInfoLen
10666 P_PARAM_CUSTOM_MEM_DUMP_STRUC_T prMemDumpInfo;
10668 DEBUGFUNC("wlanoidQueryMemDump");
10669 DBGLOG(INIT, LOUD,("\n"));
10672 ASSERT(pu4QueryInfoLen);
10673 if (u4QueryBufferLen) {
10674 ASSERT(pvQueryBuffer);
10677 *pu4QueryInfoLen = sizeof(UINT_32);
10679 prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUC_T)pvQueryBuffer;
10680 DBGLOG(REQ, TRACE, ("Dump 0x%X, len %d\n", prMemDumpInfo->u4Address, prMemDumpInfo->u4Length));
10682 prMemDumpInfo->u4RemainLength = prMemDumpInfo->u4Length;
10683 prMemDumpInfo->u4Length = 0;
10684 prMemDumpInfo->ucFragNum = 0;
10686 return wlanSendMemDumpCmd(
10691 } /* end of wlanoidQueryMcrRead() */
10694 #if CFG_ENABLE_WIFI_DIRECT
10695 /*----------------------------------------------------------------------------*/
10697 * \brief This routine is used to set the p2p mode.
10699 * \param[in] pvAdapter Pointer to the Adapter structure.
10700 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
10701 * \param[in] u4SetBufferLen The length of the set buffer.
10702 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
10703 * bytes read from the set buffer. If the call failed
10704 * due to invalid length of the set buffer, returns
10705 * the amount of storage needed.
10707 * \retval WLAN_STATUS_SUCCESS
10708 * \retval WLAN_STATUS_INVALID_LENGTH
10710 /*----------------------------------------------------------------------------*/
10712 wlanoidSetP2pMode (
10713 IN P_ADAPTER_T prAdapter,
10714 IN PVOID pvSetBuffer,
10715 IN UINT_32 u4SetBufferLen,
10716 OUT PUINT_32 pu4SetInfoLen
10719 WLAN_STATUS status;
10720 P_PARAM_CUSTOM_P2P_SET_STRUC_T prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUC_T)NULL;
10721 //P_MSG_P2P_NETDEV_REGISTER_T prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T)NULL;
10722 DEBUGFUNC("wlanoidSetP2pMode");
10725 ASSERT(pu4SetInfoLen);
10727 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_P2P_SET_STRUC_T);
10728 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_P2P_SET_STRUC_T)) {
10729 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
10730 return WLAN_STATUS_INVALID_LENGTH;
10733 prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUC_T) pvSetBuffer;
10735 DBGLOG(P2P, INFO, ("Set P2P enable[%ld] mode[%ld]\n", prSetP2P->u4Enable, prSetP2P->u4Mode));
10738 * enable = 1, mode = 0 => init P2P network
10739 * enable = 1, mode = 1 => init Soft AP network
10740 * enable = 0 => uninit P2P/AP network
10743 if (prSetP2P->u4Enable) {
10744 p2pSetMode((prSetP2P->u4Mode == 1)?TRUE:FALSE);
10746 if (p2pLaunch(prAdapter->prGlueInfo)) {
10747 ASSERT(prAdapter->fgIsP2PRegistered);
10752 if (prAdapter->fgIsP2PRegistered) {
10753 p2pRemove(prAdapter->prGlueInfo);
10760 prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T)cnmMemAlloc(
10763 (sizeof(MSG_P2P_NETDEV_REGISTER_T)));
10765 if (prP2pNetdevRegMsg == NULL) {
10767 status = WLAN_STATUS_RESOURCES;
10772 prP2pNetdevRegMsg->rMsgHdr.eMsgId = MID_MNY_P2P_NET_DEV_REGISTER;
10773 prP2pNetdevRegMsg->fgIsEnable = (prSetP2P->u4Enable == 1)?TRUE:FALSE;
10774 prP2pNetdevRegMsg->ucMode = (UINT_8)prSetP2P->u4Mode;
10776 mboxSendMsg(prAdapter,
10778 (P_MSG_HDR_T)prP2pNetdevRegMsg,
10779 MSG_SEND_METHOD_BUF);