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 P_AIS_FSM_INFO_T prAisFsmInfo;
1648 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1649 cnmTimerStartTimer(prAdapter,
1650 &prAisFsmInfo->rScanDoneTimer,
1651 SEC_TO_MSEC(AIS_SCN_DONE_TIMEOUT_SEC));
1653 #if CFG_SUPPORT_RDD_TEST_MODE
1654 if (prAdapter->prGlueInfo->rRegInfo.u4RddTestMode) {
1655 if((prAdapter->fgEnOnlineScan == TRUE) && (prAdapter->ucRddStatus)){
1656 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED){
1657 aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
1664 if(prAdapter->fgEnOnlineScan == TRUE) {
1665 aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
1667 else if(kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
1668 aisFsmScanRequest(prAdapter, prSsid, pucIe, u4IeLength);
1672 return WLAN_STATUS_SUCCESS;
1673 } /* wlanoidSetBssidListScanWithIE */
1677 /*----------------------------------------------------------------------------*/
1679 * \brief This routine will initiate the join procedure to attempt to associate
1680 * with the specified BSSID.
1682 * \param[in] pvAdapter Pointer to the Adapter structure.
1683 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
1684 * \param[in] u4SetBufferLen The length of the set buffer.
1685 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1686 * bytes read from the set buffer. If the call failed
1687 * due to invalid length of the set buffer, returns
1688 * the amount of storage needed.
1690 * \retval WLAN_STATUS_SUCCESS
1691 * \retval WLAN_STATUS_INVALID_LENGTH
1692 * \retval WLAN_STATUS_INVALID_DATA
1693 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1695 /*----------------------------------------------------------------------------*/
1698 IN P_ADAPTER_T prAdapter,
1699 IN PVOID pvSetBuffer,
1700 IN UINT_32 u4SetBufferLen,
1701 OUT PUINT_32 pu4SetInfoLen
1704 P_GLUE_INFO_T prGlueInfo;
1708 P_MSG_AIS_ABORT_T prAisAbortMsg;
1711 ASSERT(pu4SetInfoLen);
1713 *pu4SetInfoLen = MAC_ADDR_LEN;;
1714 if (u4SetBufferLen != MAC_ADDR_LEN){
1715 *pu4SetInfoLen = MAC_ADDR_LEN;
1716 return WLAN_STATUS_INVALID_LENGTH;
1718 else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
1719 DBGLOG(REQ, WARN, ("Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
1720 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1721 return WLAN_STATUS_ADAPTER_NOT_READY;
1724 prGlueInfo = prAdapter->prGlueInfo;
1725 pAddr = (P_UINT_8)pvSetBuffer;
1727 // re-association check
1728 if(kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
1729 if(EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress, pAddr)) {
1730 kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
1733 kalIndicateStatusAndComplete(prGlueInfo,
1734 WLAN_STATUS_MEDIA_DISCONNECT,
1740 // check if any scanned result matchs with the BSSID
1741 for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) {
1742 if(EQUAL_MAC_ADDR(prAdapter->rWlanInfo.arScanResult[i].arMacAddress, pAddr)) {
1748 /* prepare message to AIS */
1749 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
1750 || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
1751 /* IBSS */ /* beacon period */
1752 prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
1753 prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
1756 /* Set Connection Request Issued Flag */
1757 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
1758 prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_BSSID;
1760 /* Send AIS Abort Message */
1761 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
1762 if (!prAisAbortMsg) {
1764 return WLAN_STATUS_FAILURE;
1767 prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
1768 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
1770 if (EQUAL_MAC_ADDR(prAdapter->rWifiVar.rConnSettings.aucBSSID, pAddr)) {
1771 prAisAbortMsg->fgDelayIndication = TRUE;
1774 /* Update the information to CONNECTION_SETTINGS_T */
1775 prAdapter->rWifiVar.rConnSettings.ucSSIDLen = 0;
1776 prAdapter->rWifiVar.rConnSettings.aucSSID[0] = '\0';
1778 COPY_MAC_ADDR(prAdapter->rWifiVar.rConnSettings.aucBSSID, pAddr);
1779 prAisAbortMsg->fgDelayIndication = FALSE;
1782 mboxSendMsg(prAdapter,
1784 (P_MSG_HDR_T) prAisAbortMsg,
1785 MSG_SEND_METHOD_BUF);
1787 return WLAN_STATUS_SUCCESS;
1788 } /* end of wlanoidSetBssid() */
1791 /*----------------------------------------------------------------------------*/
1793 * \brief This routine will initiate the join procedure to attempt
1794 * to associate with the new SSID. If the previous scanning
1795 * result is aged, we will scan the channels at first.
1797 * \param[in] prAdapter Pointer to the Adapter structure.
1798 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1799 * \param[in] u4SetBufferLen The length of the set buffer.
1800 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1801 * bytes read from the set buffer. If the call failed
1802 * due to invalid length of the set buffer, returns
1803 * the amount of storage needed.
1805 * \retval WLAN_STATUS_SUCCESS
1806 * \retval WLAN_STATUS_INVALID_DATA
1807 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1808 * \retval WLAN_STATUS_INVALID_LENGTH
1810 /*----------------------------------------------------------------------------*/
1813 IN P_ADAPTER_T prAdapter,
1814 IN PVOID pvSetBuffer,
1815 IN UINT_32 u4SetBufferLen,
1816 OUT PUINT_32 pu4SetInfoLen
1819 P_GLUE_INFO_T prGlueInfo;
1820 P_PARAM_SSID_T pParamSsid;
1822 INT_32 i4Idx = -1, i4MaxRSSI = INT_MIN;
1823 P_MSG_AIS_ABORT_T prAisAbortMsg;
1824 BOOLEAN fgIsValidSsid = TRUE;
1827 ASSERT(pu4SetInfoLen);
1830 * Powering on the radio if the radio is powered off through a setting of OID_802_11_DISASSOCIATE
1832 if(prAdapter->fgIsRadioOff == TRUE) {
1833 prAdapter->fgIsRadioOff = FALSE;
1836 if(u4SetBufferLen < sizeof(PARAM_SSID_T) || u4SetBufferLen > sizeof(PARAM_SSID_T)) {
1837 return WLAN_STATUS_INVALID_LENGTH;
1839 else if (prAdapter->rAcpiState == ACPI_STATE_D3) {
1840 DBGLOG(REQ, WARN, ("Fail in set ssid! (Adapter not ready). ACPI=D%d, Radio=%d\n",
1841 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
1842 return WLAN_STATUS_ADAPTER_NOT_READY;
1845 pParamSsid = (P_PARAM_SSID_T) pvSetBuffer;
1847 if (pParamSsid->u4SsidLen > 32) {
1848 return WLAN_STATUS_INVALID_LENGTH;
1851 prGlueInfo = prAdapter->prGlueInfo;
1853 // prepare for CMD_BUILD_CONNECTION & CMD_GET_CONNECTION_STATUS
1854 // re-association check
1855 if(kalGetMediaStateIndicated(prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
1856 if(EQUAL_SSID(prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
1857 prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen,
1858 pParamSsid->aucSsid,
1859 pParamSsid->u4SsidLen)) {
1860 kalSetMediaStateIndicated(prGlueInfo, PARAM_MEDIA_STATE_TO_BE_INDICATED);
1863 kalIndicateStatusAndComplete(prGlueInfo,
1864 WLAN_STATUS_MEDIA_DISCONNECT,
1870 // check if any scanned result matchs with the SSID
1871 for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) {
1872 PUINT_8 aucSsid = prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid;
1873 UINT_8 ucSsidLength = (UINT_8) prAdapter->rWlanInfo.arScanResult[i].rSsid.u4SsidLen;
1874 INT_32 i4RSSI = prAdapter->rWlanInfo.arScanResult[i].rRssi;
1876 if(EQUAL_SSID(aucSsid, ucSsidLength, pParamSsid->aucSsid, pParamSsid->u4SsidLen) &&
1877 i4RSSI >= i4MaxRSSI) {
1883 /* prepare message to AIS */
1884 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_IBSS
1885 || prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_DEDICATED_IBSS) {
1886 /* IBSS */ /* beacon period */
1887 prAdapter->rWifiVar.rConnSettings.u2BeaconPeriod = prAdapter->rWlanInfo.u2BeaconPeriod;
1888 prAdapter->rWifiVar.rConnSettings.u2AtimWindow = prAdapter->rWlanInfo.u2AtimWindow;
1891 if (prAdapter->rWifiVar.fgSupportWZCDisassociation) {
1892 if (pParamSsid->u4SsidLen == ELEM_MAX_LEN_SSID) {
1893 fgIsValidSsid = FALSE;
1895 for (i = 0; i < ELEM_MAX_LEN_SSID; i++) {
1896 if ( !((0 < pParamSsid->aucSsid[i]) && (pParamSsid->aucSsid[i] <= 0x1F)) ) {
1897 fgIsValidSsid = TRUE;
1904 /* Set Connection Request Issued Flag */
1905 if (fgIsValidSsid) {
1906 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = TRUE;
1908 if(pParamSsid->u4SsidLen) {
1909 prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1913 prAdapter->rWifiVar.rConnSettings.eConnectionPolicy = CONNECT_BY_SSID_ANY;
1917 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
1920 /* Send AIS Abort Message */
1921 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
1922 if (!prAisAbortMsg) {
1924 return WLAN_STATUS_FAILURE;
1927 prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
1928 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
1930 if (EQUAL_SSID(prAdapter->rWifiVar.rConnSettings.aucSSID,
1931 prAdapter->rWifiVar.rConnSettings.ucSSIDLen,
1932 pParamSsid->aucSsid,
1933 pParamSsid->u4SsidLen)) {
1934 prAisAbortMsg->fgDelayIndication = TRUE;
1937 /* Update the information to CONNECTION_SETTINGS_T */
1938 COPY_SSID(prAdapter->rWifiVar.rConnSettings.aucSSID,
1939 prAdapter->rWifiVar.rConnSettings.ucSSIDLen,
1940 pParamSsid->aucSsid,
1941 (UINT_8)pParamSsid->u4SsidLen);
1943 prAisAbortMsg->fgDelayIndication = FALSE;
1945 DBGLOG(SCN, INFO, ("SSID %s\n", prAdapter->rWifiVar.rConnSettings.aucSSID));
1947 mboxSendMsg(prAdapter,
1949 (P_MSG_HDR_T) prAisAbortMsg,
1950 MSG_SEND_METHOD_BUF);
1952 return WLAN_STATUS_SUCCESS;
1954 } /* end of wlanoidSetSsid() */
1957 /*----------------------------------------------------------------------------*/
1959 * \brief This routine is called to query the currently associated SSID.
1961 * \param[in] prAdapter Pointer to the Adapter structure.
1962 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
1964 * \param[in] u4QueryBufferLen The length of the query buffer.
1965 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1966 * bytes written into the query buffer. If the call
1967 * failed due to invalid length of the query buffer,
1968 * returns the amount of storage needed.
1970 * \retval WLAN_STATUS_SUCCESS
1971 * \retval WLAN_STATUS_INVALID_LENGTH
1973 /*----------------------------------------------------------------------------*/
1976 IN P_ADAPTER_T prAdapter,
1977 OUT PVOID pvQueryBuffer,
1978 IN UINT_32 u4QueryBufferLen,
1979 OUT PUINT_32 pu4QueryInfoLen
1982 P_PARAM_SSID_T prAssociatedSsid;
1984 DEBUGFUNC("wlanoidQuerySsid");
1987 ASSERT(pu4QueryInfoLen);
1989 if (u4QueryBufferLen) {
1990 ASSERT(pvQueryBuffer);
1993 *pu4QueryInfoLen = sizeof(PARAM_SSID_T);
1995 /* Check for query buffer length */
1996 if (u4QueryBufferLen < *pu4QueryInfoLen) {
1997 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
1998 return WLAN_STATUS_INVALID_LENGTH;
2001 prAssociatedSsid = (P_PARAM_SSID_T)pvQueryBuffer;
2003 kalMemZero(prAssociatedSsid->aucSsid, sizeof(prAssociatedSsid->aucSsid));
2005 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
2006 prAssociatedSsid->u4SsidLen = prAdapter->rWlanInfo.rCurrBssId.rSsid.u4SsidLen;
2008 if (prAssociatedSsid->u4SsidLen) {
2009 kalMemCopy(prAssociatedSsid->aucSsid,
2010 prAdapter->rWlanInfo.rCurrBssId.rSsid.aucSsid,
2011 prAssociatedSsid->u4SsidLen);
2015 prAssociatedSsid->u4SsidLen = 0;
2017 DBGLOG(REQ, TRACE, ("Null SSID\n"));
2020 return WLAN_STATUS_SUCCESS;
2021 } /* wlanoidQuerySsid */
2024 /*----------------------------------------------------------------------------*/
2026 * \brief This routine is called to query the current 802.11 network type.
2028 * \param[in] prAdapter Pointer to the Adapter structure.
2029 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
2031 * \param[in] u4QueryBufferLen The length of the query buffer.
2032 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
2033 * bytes written into the query buffer. If the call
2034 * failed due to invalid length of the query buffer,
2035 * returns the amount of storage needed.
2037 * \retval WLAN_STATUS_SUCCESS
2038 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2040 /*----------------------------------------------------------------------------*/
2042 wlanoidQueryInfrastructureMode (
2043 IN P_ADAPTER_T prAdapter,
2044 OUT PVOID pvQueryBuffer,
2045 IN UINT_32 u4QueryBufferLen,
2046 OUT PUINT_32 pu4QueryInfoLen
2049 DEBUGFUNC("wlanoidQueryInfrastructureMode");
2052 ASSERT(pu4QueryInfoLen);
2054 *pu4QueryInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
2056 if (u4QueryBufferLen < sizeof(ENUM_PARAM_OP_MODE_T)) {
2057 return WLAN_STATUS_BUFFER_TOO_SHORT;
2060 if (u4QueryBufferLen) {
2061 ASSERT(pvQueryBuffer);
2064 *(P_ENUM_PARAM_OP_MODE_T)pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eOPMode;
2067 ** According to OID_802_11_INFRASTRUCTURE_MODE
2068 ** If there is no prior OID_802_11_INFRASTRUCTURE_MODE,
2069 ** NDIS_STATUS_ADAPTER_NOT_READY shall be returned.
2072 switch (*(P_ENUM_PARAM_OP_MODE_T)pvQueryBuffer) {
2074 DBGLOG(REQ, INFO, ("IBSS mode\n"));
2076 case NET_TYPE_INFRA:
2077 DBGLOG(REQ, INFO, ("Infrastructure mode\n"));
2080 DBGLOG(REQ, INFO, ("Automatic mode\n"));
2084 return WLAN_STATUS_SUCCESS;
2085 } /* wlanoidQueryInfrastructureMode */
2088 /*----------------------------------------------------------------------------*/
2090 * \brief This routine is called to set mode to infrastructure or
2091 * IBSS, or automatic switch between the two.
2093 * \param[in] prAdapter Pointer to the Adapter structure.
2094 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
2095 * \param[in] u4SetBufferLen The length of the set buffer.
2096 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2097 * bytes read from the set buffer. If the call failed due to invalid
2098 * length of the set buffer, returns the amount of storage needed.
2100 * \retval WLAN_STATUS_SUCCESS
2101 * \retval WLAN_STATUS_INVALID_DATA
2102 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2103 * \retval WLAN_STATUS_INVALID_LENGTH
2105 /*----------------------------------------------------------------------------*/
2107 wlanoidSetInfrastructureMode (
2108 IN P_ADAPTER_T prAdapter,
2109 IN PVOID pvSetBuffer,
2110 IN UINT_32 u4SetBufferLen,
2111 OUT PUINT_32 pu4SetInfoLen
2114 P_GLUE_INFO_T prGlueInfo;
2115 ENUM_PARAM_OP_MODE_T eOpMode;
2117 DEBUGFUNC("wlanoidSetInfrastructureMode");
2120 ASSERT(pvSetBuffer);
2121 ASSERT(pu4SetInfoLen);
2123 prGlueInfo = prAdapter->prGlueInfo;
2125 if (u4SetBufferLen < sizeof(ENUM_PARAM_OP_MODE_T))
2126 return WLAN_STATUS_BUFFER_TOO_SHORT;
2128 *pu4SetInfoLen = sizeof(ENUM_PARAM_OP_MODE_T);
2131 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2132 DBGLOG(REQ, WARN, ("Fail in set infrastructure mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2133 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2134 return WLAN_STATUS_ADAPTER_NOT_READY;
2137 eOpMode = *(P_ENUM_PARAM_OP_MODE_T)pvSetBuffer;
2138 /* Verify the new infrastructure mode. */
2139 if (eOpMode >= NET_TYPE_NUM) {
2140 DBGLOG(REQ, TRACE, ("Invalid mode value %d\n", eOpMode));
2141 return WLAN_STATUS_INVALID_DATA;
2144 /* check if possible to switch to AdHoc mode */
2145 if(eOpMode == NET_TYPE_IBSS || eOpMode == NET_TYPE_DEDICATED_IBSS) {
2146 if(cnmAisIbssIsPermitted(prAdapter) == FALSE) {
2147 DBGLOG(REQ, TRACE, ("Mode value %d unallowed\n", eOpMode));
2148 return WLAN_STATUS_FAILURE;
2152 /* Save the new infrastructure mode setting. */
2153 prAdapter->rWifiVar.rConnSettings.eOPMode = eOpMode;
2155 /* Clean up the Tx key flag */
2156 prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = FALSE;
2158 prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
2159 #if CFG_SUPPORT_WAPI
2160 prAdapter->prGlueInfo->u2WapiAssocInfoIESz = 0;
2161 kalMemZero(&prAdapter->prGlueInfo->aucWapiAssocInfoIEs, 42);
2164 #if CFG_SUPPORT_802_11W
2165 prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = FALSE;
2166 prAdapter->rWifiVar.rAisSpecificBssInfo.fgBipKeyInstalled = FALSE;
2169 #if CFG_SUPPORT_WPS2
2170 kalMemZero(&prAdapter->prGlueInfo->aucWSCAssocInfoIE, 200);
2171 prAdapter->prGlueInfo->u2WSCAssocInfoIELen = 0;
2174 return wlanSendSetQueryCmd(prAdapter,
2175 CMD_ID_INFRASTRUCTURE,
2179 nicCmdEventSetCommon,
2180 nicOidCmdTimeoutCommon,
2187 } /* wlanoidSetInfrastructureMode */
2190 /*----------------------------------------------------------------------------*/
2192 * \brief This routine is called to query the current 802.11 authentication
2195 * \param[in] prAdapter Pointer to the Adapter structure.
2196 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
2198 * \param[in] u4QueryBufferLen The length of the query buffer.
2199 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
2200 * bytes written into the query buffer. If the call
2201 * failed due to invalid length of the query buffer,
2202 * returns the amount of storage needed.
2204 * \retval WLAN_STATUS_SUCCESS
2205 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2207 /*----------------------------------------------------------------------------*/
2209 wlanoidQueryAuthMode (
2210 IN P_ADAPTER_T prAdapter,
2211 OUT PVOID pvQueryBuffer,
2212 IN UINT_32 u4QueryBufferLen,
2213 OUT PUINT_32 pu4QueryInfoLen
2216 DEBUGFUNC("wlanoidQueryAuthMode");
2219 if (u4QueryBufferLen) {
2220 ASSERT(pvQueryBuffer);
2222 ASSERT(pu4QueryInfoLen);
2224 *pu4QueryInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
2226 if (u4QueryBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T)) {
2227 return WLAN_STATUS_BUFFER_TOO_SHORT;
2230 *(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer = prAdapter->rWifiVar.rConnSettings.eAuthMode;
2233 switch (*(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer) {
2234 case AUTH_MODE_OPEN:
2235 DBGLOG(REQ, INFO, ("Current auth mode: Open\n"));
2238 case AUTH_MODE_SHARED:
2239 DBGLOG(REQ, INFO, ("Current auth mode: Shared\n"));
2242 case AUTH_MODE_AUTO_SWITCH:
2243 DBGLOG(REQ, INFO, ("Current auth mode: Auto-switch\n"));
2247 DBGLOG(REQ, INFO, ("Current auth mode: WPA\n"));
2250 case AUTH_MODE_WPA_PSK:
2251 DBGLOG(REQ, INFO, ("Current auth mode: WPA PSK\n"));
2254 case AUTH_MODE_WPA_NONE:
2255 DBGLOG(REQ, INFO, ("Current auth mode: WPA None\n"));
2258 case AUTH_MODE_WPA2:
2259 DBGLOG(REQ, INFO, ("Current auth mode: WPA2\n"));
2262 case AUTH_MODE_WPA2_PSK:
2263 DBGLOG(REQ, INFO, ("Current auth mode: WPA2 PSK\n"));
2267 DBGLOG(REQ, INFO, ("Current auth mode: %d\n",
2268 *(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer));
2271 return WLAN_STATUS_SUCCESS;
2272 } /* wlanoidQueryAuthMode */
2275 /*----------------------------------------------------------------------------*/
2277 * \brief This routine is called to set the IEEE 802.11 authentication mode
2280 * \param[in] prAdapter Pointer to the Adapter structure.
2281 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2282 * \param[in] u4SetBufferLen The length of the set buffer.
2283 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2284 * bytes read from the set buffer. If the call failed
2285 * due to invalid length of the set buffer, returns
2286 * the amount of storage needed.
2288 * \retval WLAN_STATUS_SUCCESS
2289 * \retval WLAN_STATUS_INVALID_DATA
2290 * \retval WLAN_STATUS_INVALID_LENGTH
2291 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2292 * \retval WLAN_STATUS_NOT_ACCEPTED
2294 /*----------------------------------------------------------------------------*/
2296 wlanoidSetAuthMode (
2297 IN P_ADAPTER_T prAdapter,
2298 IN PVOID pvSetBuffer,
2299 IN UINT_32 u4SetBufferLen,
2300 OUT PUINT_32 pu4SetInfoLen
2303 P_GLUE_INFO_T prGlueInfo;
2304 UINT_32 i, u4AkmSuite;
2305 P_DOT11_RSNA_CONFIG_AUTHENTICATION_SUITES_ENTRY prEntry;
2307 DEBUGFUNC("wlanoidSetAuthMode");
2310 ASSERT(pu4SetInfoLen);
2311 ASSERT(pvSetBuffer);
2313 prGlueInfo = prAdapter->prGlueInfo;
2315 *pu4SetInfoLen = sizeof(ENUM_PARAM_AUTH_MODE_T);
2317 if (u4SetBufferLen < sizeof(ENUM_PARAM_AUTH_MODE_T)) {
2318 return WLAN_STATUS_INVALID_LENGTH;
2322 //if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
2323 // return WLAN_STATUS_SUCCESS;
2326 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2327 DBGLOG(REQ, WARN, ("Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2328 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2329 return WLAN_STATUS_ADAPTER_NOT_READY;
2332 /* Check if the new authentication mode is valid. */
2333 if (*(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer >= AUTH_MODE_NUM) {
2334 DBGLOG(REQ, TRACE, ("Invalid auth mode %d\n",
2335 *(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer));
2336 return WLAN_STATUS_INVALID_DATA;
2339 switch (*(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer) {
2341 case AUTH_MODE_WPA_PSK:
2342 case AUTH_MODE_WPA2:
2343 case AUTH_MODE_WPA2_PSK:
2344 /* infrastructure mode only */
2345 if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_INFRA) {
2346 return WLAN_STATUS_NOT_ACCEPTED;
2350 case AUTH_MODE_WPA_NONE:
2351 /* ad hoc mode only */
2352 if (prAdapter->rWifiVar.rConnSettings.eOPMode != NET_TYPE_IBSS) {
2353 return WLAN_STATUS_NOT_ACCEPTED;
2361 /* Save the new authentication mode. */
2362 prAdapter->rWifiVar.rConnSettings.eAuthMode = *(P_ENUM_PARAM_AUTH_MODE_T)pvSetBuffer;
2365 switch (prAdapter->rWifiVar.rConnSettings.eAuthMode) {
2366 case AUTH_MODE_OPEN:
2367 DBGLOG(RSN, TRACE, ("New auth mode: open\n"));
2370 case AUTH_MODE_SHARED:
2371 DBGLOG(RSN, TRACE, ("New auth mode: shared\n"));
2374 case AUTH_MODE_AUTO_SWITCH:
2375 DBGLOG(RSN, TRACE, ("New auth mode: auto-switch\n"));
2379 DBGLOG(RSN, TRACE, ("New auth mode: WPA\n"));
2382 case AUTH_MODE_WPA_PSK:
2383 DBGLOG(RSN, TRACE, ("New auth mode: WPA PSK\n"));
2386 case AUTH_MODE_WPA_NONE:
2387 DBGLOG(RSN, TRACE, ("New auth mode: WPA None\n"));
2390 case AUTH_MODE_WPA2:
2391 DBGLOG(RSN, TRACE, ("New auth mode: WPA2\n"));
2394 case AUTH_MODE_WPA2_PSK:
2395 DBGLOG(RSN, TRACE, ("New auth mode: WPA2 PSK\n"));
2399 DBGLOG(RSN, TRACE, ("New auth mode: unknown (%d)\n",
2400 prAdapter->rWifiVar.rConnSettings.eAuthMode));
2404 if (prAdapter->rWifiVar.rConnSettings.eAuthMode >= AUTH_MODE_WPA) {
2405 switch(prAdapter->rWifiVar.rConnSettings.eAuthMode) {
2407 u4AkmSuite = WPA_AKM_SUITE_802_1X;
2410 case AUTH_MODE_WPA_PSK:
2411 u4AkmSuite = WPA_AKM_SUITE_PSK;
2414 case AUTH_MODE_WPA_NONE:
2415 u4AkmSuite = WPA_AKM_SUITE_NONE;
2418 case AUTH_MODE_WPA2:
2419 u4AkmSuite = RSN_AKM_SUITE_802_1X;
2422 case AUTH_MODE_WPA2_PSK:
2423 u4AkmSuite = RSN_AKM_SUITE_PSK;
2434 /* Enable the specific AKM suite only. */
2435 for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++) {
2436 prEntry = &prAdapter->rMib.dot11RSNAConfigAuthenticationSuitesTable[i];
2438 if (prEntry->dot11RSNAConfigAuthenticationSuite == u4AkmSuite) {
2439 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
2442 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = FALSE;
2444 #if CFG_SUPPORT_802_11W
2445 if (kalGetMfpSetting(prAdapter->prGlueInfo) != RSN_AUTH_MFP_DISABLED) {
2446 if ((u4AkmSuite == RSN_AKM_SUITE_PSK) &&
2447 prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_PSK_SHA256) {
2448 DBGLOG(RSN, TRACE, ("Enable RSN_AKM_SUITE_PSK_SHA256 AKM support\n"));
2449 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
2452 if ((u4AkmSuite == RSN_AKM_SUITE_802_1X) &&
2453 prEntry->dot11RSNAConfigAuthenticationSuite == RSN_AKM_SUITE_802_1X_SHA256) {
2454 DBGLOG(RSN, TRACE, ("Enable RSN_AKM_SUITE_802_1X_SHA256 AKM support\n"));
2455 prEntry->dot11RSNAConfigAuthenticationSuiteEnabled = TRUE;
2462 return WLAN_STATUS_SUCCESS;
2464 } /* wlanoidSetAuthMode */
2468 /*----------------------------------------------------------------------------*/
2470 * \brief This routine is called to query the current 802.11 privacy filter
2472 * \param[in] prAdapter Pointer to the Adapter structure.
2473 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
2475 * \param[in] u4QueryBufferLen The length of the query buffer.
2476 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
2477 * bytes written into the query buffer. If the call
2478 * failed due to invalid length of the query buffer,
2479 * returns the amount of storage needed.
2481 * \retval WLAN_STATUS_SUCCESS
2482 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2484 /*----------------------------------------------------------------------------*/
2486 wlanoidQueryPrivacyFilter (
2487 IN P_ADAPTER_T prAdapter,
2488 OUT PVOID pvQueryBuffer,
2489 IN UINT_32 u4QueryBufferLen,
2490 OUT PUINT_32 pu4QueryInfoLen
2493 DEBUGFUNC("wlanoidQueryPrivacyFilter");
2497 ASSERT(pvQueryBuffer);
2498 ASSERT(pu4QueryInfoLen);
2500 *pu4QueryInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
2502 if (u4QueryBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T)) {
2503 return WLAN_STATUS_BUFFER_TOO_SHORT;
2506 *(P_ENUM_PARAM_PRIVACY_FILTER_T)pvQueryBuffer = prAdapter->rWlanInfo.ePrivacyFilter;
2509 switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T)pvQueryBuffer) {
2510 case PRIVACY_FILTER_ACCEPT_ALL:
2511 DBGLOG(REQ, INFO, ("Current privacy mode: open mode\n"));
2514 case PRIVACY_FILTER_8021xWEP:
2515 DBGLOG(REQ, INFO, ("Current privacy mode: filtering mode\n"));
2519 DBGLOG(REQ, INFO, ("Current auth mode: %d\n",
2520 *(P_ENUM_PARAM_AUTH_MODE_T)pvQueryBuffer));
2523 return WLAN_STATUS_SUCCESS;
2524 } /* wlanoidQueryPrivacyFilter */
2527 /*----------------------------------------------------------------------------*/
2529 * \brief This routine is called to set the IEEE 802.11 privacy filter
2532 * \param[in] prAdapter Pointer to the Adapter structure.
2533 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2534 * \param[in] u4SetBufferLen The length of the set buffer.
2535 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2536 * bytes read from the set buffer. If the call failed
2537 * due to invalid length of the set buffer, returns
2538 * the amount of storage needed.
2540 * \retval WLAN_STATUS_SUCCESS
2541 * \retval WLAN_STATUS_INVALID_DATA
2542 * \retval WLAN_STATUS_INVALID_LENGTH
2543 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2544 * \retval WLAN_STATUS_NOT_ACCEPTED
2546 /*----------------------------------------------------------------------------*/
2548 wlanoidSetPrivacyFilter (
2549 IN P_ADAPTER_T prAdapter,
2550 IN PVOID pvSetBuffer,
2551 IN UINT_32 u4SetBufferLen,
2552 OUT PUINT_32 pu4SetInfoLen
2555 P_GLUE_INFO_T prGlueInfo;
2557 DEBUGFUNC("wlanoidSetPrivacyFilter");
2560 ASSERT(pu4SetInfoLen);
2561 ASSERT(pvSetBuffer);
2563 prGlueInfo = prAdapter->prGlueInfo;
2565 *pu4SetInfoLen = sizeof(ENUM_PARAM_PRIVACY_FILTER_T);
2567 if (u4SetBufferLen < sizeof(ENUM_PARAM_PRIVACY_FILTER_T)) {
2568 return WLAN_STATUS_INVALID_LENGTH;
2571 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2572 DBGLOG(REQ, WARN, ("Fail in set Authentication mode! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2573 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2574 return WLAN_STATUS_ADAPTER_NOT_READY;
2577 /* Check if the new authentication mode is valid. */
2578 if (*(P_ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer >= PRIVACY_FILTER_NUM) {
2579 DBGLOG(REQ, TRACE, ("Invalid privacy filter %d\n",
2580 *(P_ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer));
2581 return WLAN_STATUS_INVALID_DATA;
2584 switch (*(P_ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer) {
2589 /* Save the new authentication mode. */
2590 prAdapter->rWlanInfo.ePrivacyFilter = *(ENUM_PARAM_PRIVACY_FILTER_T)pvSetBuffer;
2592 return WLAN_STATUS_SUCCESS;
2594 } /* wlanoidSetPrivacyFilter */
2598 /*----------------------------------------------------------------------------*/
2600 * \brief This routine is called to reload the available default settings for
2601 * the specified type field.
2603 * \param[in] prAdapter Pointer to the Adapter structure.
2604 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2605 * \param[in] u4SetBufferLen The length of the set buffer.
2606 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2607 * bytes read from the set buffer. If the call failed
2608 * due to invalid length of the set buffer, returns
2609 * the amount of storage needed.
2611 * \retval WLAN_STATUS_SUCCESS
2612 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2613 * \retval WLAN_STATUS_INVALID_DATA
2615 /*----------------------------------------------------------------------------*/
2617 wlanoidSetReloadDefaults (
2618 IN P_ADAPTER_T prAdapter,
2619 IN PVOID pvSetBuffer,
2620 IN UINT_32 u4SetBufferLen,
2621 OUT PUINT_32 pu4SetInfoLen
2624 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2625 ENUM_PARAM_NETWORK_TYPE_T eNetworkType;
2630 DEBUGFUNC("wlanoidSetReloadDefaults");
2634 ASSERT(pu4SetInfoLen);
2635 *pu4SetInfoLen = sizeof(PARAM_RELOAD_DEFAULTS);
2637 //if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
2638 // return WLAN_STATUS_SUCCESS;
2641 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2642 DBGLOG(REQ, WARN, ("Fail in set Reload default! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2643 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2644 return WLAN_STATUS_ADAPTER_NOT_READY;
2647 ASSERT(pvSetBuffer);
2648 /* Verify the available reload options and reload the settings. */
2649 switch (*(P_PARAM_RELOAD_DEFAULTS)pvSetBuffer) {
2650 case ENUM_RELOAD_WEP_KEYS:
2651 /* Reload available default WEP keys from the permanent
2653 prAdapter->rWifiVar.rConnSettings.eAuthMode = AUTH_MODE_OPEN;
2654 prAdapter->rWifiVar.rConnSettings.eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;//ENUM_ENCRYPTION_DISABLED;
2656 P_GLUE_INFO_T prGlueInfo;
2657 P_CMD_INFO_T prCmdInfo;
2658 P_WIFI_CMD_T prWifiCmd;
2659 P_CMD_802_11_KEY prCmdKey;
2660 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2662 prGlueInfo = prAdapter->prGlueInfo;
2663 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
2666 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
2667 return WLAN_STATUS_FAILURE;
2669 // increase command sequence number
2670 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
2672 // compose CMD_802_11_KEY cmd pkt
2673 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
2674 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
2675 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
2676 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
2677 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
2678 prCmdInfo->fgIsOid = TRUE;
2679 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
2680 prCmdInfo->fgSetQuery = TRUE;
2681 prCmdInfo->fgNeedResp = FALSE;
2682 prCmdInfo->fgDriverDomainMCR = FALSE;
2683 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
2684 prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
2685 prCmdInfo->pvInformationBuffer = pvSetBuffer;
2686 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
2689 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
2690 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
2691 prWifiCmd->ucCID = prCmdInfo->ucCID;
2692 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
2693 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
2695 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
2697 kalMemZero((PUINT_8)prCmdKey, sizeof(CMD_802_11_KEY));
2699 prCmdKey->ucAddRemove = 0; /* Remove */
2700 prCmdKey->ucKeyId = 0;//(UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff);
2701 kalMemCopy(prCmdKey->aucPeerAddr, aucBCAddr, MAC_ADDR_LEN);
2703 ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM);
2705 prCmdKey->ucKeyType = 0;
2707 // insert into prCmdQueue
2708 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
2710 // wakeup txServiceThread later
2711 GLUE_SET_EVENT(prGlueInfo);
2713 return WLAN_STATUS_PENDING;
2719 DBGLOG(REQ, TRACE, ("Invalid reload option %d\n",
2720 *(P_PARAM_RELOAD_DEFAULTS)pvSetBuffer));
2721 rStatus = WLAN_STATUS_INVALID_DATA;
2724 /* OID_802_11_RELOAD_DEFAULTS requiest to reset to auto mode */
2725 eNetworkType = PARAM_NETWORK_TYPE_AUTOMODE;
2726 wlanoidSetNetworkTypeInUse(prAdapter, &eNetworkType, sizeof(eNetworkType), &u4Len);
2729 } /* wlanoidSetReloadDefaults */
2732 /*----------------------------------------------------------------------------*/
2734 * \brief This routine is called to set a WEP key to the driver.
2736 * \param[in] prAdapter Pointer to the Adapter structure.
2737 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2738 * \param[in] u4SetBufferLen The length of the set buffer.
2739 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2740 * bytes read from the set buffer. If the call failed
2741 * due to invalid length of the set buffer, returns
2742 * the amount of storage needed.
2744 * \retval WLAN_STATUS_SUCCESS
2745 * \retval WLAN_STATUS_INVALID_LENGTH
2746 * \retval WLAN_STATUS_INVALID_DATA
2747 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2748 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
2750 /*----------------------------------------------------------------------------*/
2752 UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN*/];
2753 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2757 IN P_ADAPTER_T prAdapter,
2758 IN PVOID pvSetBuffer,
2759 IN UINT_32 u4SetBufferLen,
2760 OUT PUINT_32 pu4SetInfoLen
2764 UINT_8 keyBuffer[sizeof(PARAM_KEY_T) + 16 /* LEGACY_KEY_MAX_LEN*/];
2765 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2767 P_PARAM_WEP_T prNewWepKey;
2768 P_PARAM_KEY_T prParamKey = (P_PARAM_KEY_T)keyBuffer;
2769 UINT_32 u4KeyId, u4SetLen;
2771 DEBUGFUNC("wlanoidSetAddWep");
2775 *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
2777 if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial)) {
2778 ASSERT(pu4SetInfoLen);
2779 return WLAN_STATUS_BUFFER_TOO_SHORT;
2782 ASSERT(pvSetBuffer);
2783 ASSERT(pu4SetInfoLen);
2785 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2786 DBGLOG(REQ, WARN, ("Fail in set add WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2787 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2788 return WLAN_STATUS_ADAPTER_NOT_READY;
2791 prNewWepKey = (P_PARAM_WEP_T)pvSetBuffer;
2793 /* Verify the total buffer for minimum length. */
2794 if (u4SetBufferLen < OFFSET_OF(PARAM_WEP_T, aucKeyMaterial) + prNewWepKey->u4KeyLength) {
2795 DBGLOG(REQ, WARN, ("Invalid total buffer length (%d) than minimum length (%d)\n",
2796 (UINT_8)u4SetBufferLen,
2797 (UINT_8)OFFSET_OF(PARAM_WEP_T, aucKeyMaterial)));
2799 *pu4SetInfoLen = OFFSET_OF(PARAM_WEP_T, aucKeyMaterial);
2800 return WLAN_STATUS_INVALID_DATA;
2803 /* Verify the key structure length. */
2804 if (prNewWepKey->u4Length > u4SetBufferLen) {
2805 DBGLOG(REQ, WARN, ("Invalid key structure length (%d) greater than total buffer length (%d)\n",
2806 (UINT_8)prNewWepKey->u4Length,
2807 (UINT_8)u4SetBufferLen));
2809 *pu4SetInfoLen = u4SetBufferLen;
2810 return WLAN_STATUS_INVALID_DATA;
2813 /* Verify the key material length for maximum key material length:16 */
2814 if (prNewWepKey->u4KeyLength > 16 /* LEGACY_KEY_MAX_LEN */) {
2815 DBGLOG(REQ, WARN, ("Invalid key material length (%d) greater than maximum key material length (16)\n",
2816 (UINT_8)prNewWepKey->u4KeyLength));
2818 *pu4SetInfoLen = u4SetBufferLen;
2819 return WLAN_STATUS_INVALID_DATA;
2822 *pu4SetInfoLen = u4SetBufferLen;
2824 u4KeyId = prNewWepKey->u4KeyIndex & BITS(0,29) /* WEP_KEY_ID_FIELD */;
2826 /* Verify whether key index is valid or not, current version
2827 driver support only 4 global WEP keys setting by this OID */
2828 if (u4KeyId > MAX_KEY_NUM - 1) {
2829 DBGLOG(REQ, ERROR, ("Error, invalid WEP key ID: %d\n", (UINT_8)u4KeyId));
2830 return WLAN_STATUS_INVALID_DATA;
2833 prParamKey->u4KeyIndex = u4KeyId;
2836 if (prNewWepKey->u4KeyIndex & IS_TRANSMIT_KEY) {
2837 prParamKey->u4KeyIndex |= IS_TRANSMIT_KEY;
2840 /* Per client key */
2841 if (prNewWepKey->u4KeyIndex & IS_UNICAST_KEY) {
2842 prParamKey->u4KeyIndex |= IS_UNICAST_KEY;
2845 prParamKey->u4KeyLength = prNewWepKey->u4KeyLength;
2847 kalMemCopy(prParamKey->arBSSID, aucBCAddr, MAC_ADDR_LEN);
2849 kalMemCopy(prParamKey->aucKeyMaterial,
2850 prNewWepKey->aucKeyMaterial,
2851 prNewWepKey->u4KeyLength);
2853 prParamKey->u4Length = OFFSET_OF(PARAM_KEY_T, aucKeyMaterial) + prNewWepKey->u4KeyLength;
2855 wlanoidSetAddKey(prAdapter,
2857 prParamKey->u4Length,
2860 return WLAN_STATUS_PENDING;
2861 } /* wlanoidSetAddWep */
2864 /*----------------------------------------------------------------------------*/
2866 * \brief This routine is called to request the driver to remove the WEP key
2867 * at the specified key index.
2869 * \param[in] prAdapter Pointer to the Adapter structure.
2870 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2871 * \param[in] u4SetBufferLen The length of the set buffer.
2872 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2873 * bytes read from the set buffer. If the call failed
2874 * due to invalid length of the set buffer, returns
2875 * the amount of storage needed.
2877 * \retval WLAN_STATUS_SUCCESS
2878 * \retval WLAN_STATUS_INVALID_DATA
2879 * \retval WLAN_STATUS_INVALID_LENGTH
2880 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2882 /*----------------------------------------------------------------------------*/
2884 wlanoidSetRemoveWep (
2885 IN P_ADAPTER_T prAdapter,
2886 IN PVOID pvSetBuffer,
2887 IN UINT_32 u4SetBufferLen,
2888 OUT PUINT_32 pu4SetInfoLen
2891 UINT_32 u4KeyId, u4SetLen;
2892 PARAM_REMOVE_KEY_T rRemoveKey;
2893 UINT_8 aucBCAddr[] = BC_MAC_ADDR;
2895 DEBUGFUNC("wlanoidSetRemoveWep");
2898 ASSERT(pu4SetInfoLen);
2900 *pu4SetInfoLen = sizeof(PARAM_KEY_INDEX);
2902 if (u4SetBufferLen < sizeof(PARAM_KEY_INDEX)) {
2903 return WLAN_STATUS_INVALID_LENGTH;
2906 ASSERT(pvSetBuffer);
2907 u4KeyId = *(PUINT_32)pvSetBuffer;
2909 /* Dump PARAM_WEP content. */
2910 DBGLOG(REQ, INFO, ("Set: Dump PARAM_KEY_INDEX content\n"));
2911 DBGLOG(REQ, INFO, ("Index : 0x%08lx\n", u4KeyId));
2913 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2914 DBGLOG(REQ, WARN, ("Fail in set remove WEP! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2915 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2916 return WLAN_STATUS_ADAPTER_NOT_READY;
2919 if (u4KeyId & IS_TRANSMIT_KEY) {
2920 /* Bit 31 should not be set */
2921 DBGLOG(REQ, ERROR, ("Invalid WEP key index: 0x%08lx\n", u4KeyId));
2922 return WLAN_STATUS_INVALID_DATA;
2925 u4KeyId &= BITS(0,7);
2927 /* Verify whether key index is valid or not. Current version
2928 driver support only 4 global WEP keys. */
2929 if (u4KeyId > MAX_KEY_NUM - 1) {
2930 DBGLOG(REQ, ERROR, ("invalid WEP key ID %lu\n", u4KeyId));
2931 return WLAN_STATUS_INVALID_DATA;
2934 rRemoveKey.u4Length = sizeof(PARAM_REMOVE_KEY_T);
2935 rRemoveKey.u4KeyIndex = *(PUINT_32)pvSetBuffer;
2937 kalMemCopy(rRemoveKey.arBSSID, aucBCAddr, MAC_ADDR_LEN);
2939 wlanoidSetRemoveKey(prAdapter,
2941 sizeof(PARAM_REMOVE_KEY_T),
2944 return WLAN_STATUS_PENDING;
2945 } /* wlanoidSetRemoveWep */
2948 /*----------------------------------------------------------------------------*/
2950 * \brief This routine is called to set a key to the driver.
2952 * \param[in] prAdapter Pointer to the Adapter structure.
2953 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
2954 * \param[in] u4SetBufferLen The length of the set buffer.
2955 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
2956 * bytes read from the set buffer. If the call failed
2957 * due to invalid length of the set buffer, returns
2958 * the amount of storage needed.
2960 * \retval WLAN_STATUS_SUCCESS
2961 * \retval WLAN_STATUS_ADAPTER_NOT_READY
2962 * \retval WLAN_STATUS_INVALID_LENGTH
2963 * \retval WLAN_STATUS_INVALID_DATA
2965 * \note The setting buffer PARAM_KEY_T, which is set by NDIS, is unpacked.
2967 /*----------------------------------------------------------------------------*/
2970 IN P_ADAPTER_T prAdapter,
2971 IN PVOID pvSetBuffer,
2972 IN UINT_32 u4SetBufferLen,
2973 OUT PUINT_32 pu4SetInfoLen
2976 P_GLUE_INFO_T prGlueInfo;
2977 P_CMD_INFO_T prCmdInfo;
2978 P_WIFI_CMD_T prWifiCmd;
2979 P_PARAM_KEY_T prNewKey;
2980 P_CMD_802_11_KEY prCmdKey;
2983 DEBUGFUNC("wlanoidSetAddKey");
2984 DBGLOG(REQ, LOUD, ("\n"));
2987 ASSERT(pvSetBuffer);
2988 ASSERT(pu4SetInfoLen);
2990 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
2991 DBGLOG(REQ, WARN, ("Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
2992 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
2993 return WLAN_STATUS_ADAPTER_NOT_READY;
2996 prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
2998 /* Verify the key structure length. */
2999 if (prNewKey->u4Length > u4SetBufferLen) {
3000 DBGLOG(REQ, WARN, ("Invalid key structure length (%d) greater than total buffer length (%d)\n",
3001 (UINT_8)prNewKey->u4Length,
3002 (UINT_8)u4SetBufferLen));
3004 *pu4SetInfoLen = u4SetBufferLen;
3005 return WLAN_STATUS_INVALID_LENGTH;
3008 /* Verify the key material length for key material buffer */
3009 if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
3010 DBGLOG(REQ, WARN, ("Invalid key material length (%d)\n", (UINT_8)prNewKey->u4KeyLength));
3011 *pu4SetInfoLen = u4SetBufferLen;
3012 return WLAN_STATUS_INVALID_DATA;
3015 /* Exception check */
3016 if (prNewKey->u4KeyIndex & 0x0fffff00) {
3017 return WLAN_STATUS_INVALID_DATA;
3020 /* Exception check, pairwise key must with transmit bit enabled */
3021 if ((prNewKey->u4KeyIndex & BITS(30,31)) == IS_UNICAST_KEY) {
3022 return WLAN_STATUS_INVALID_DATA;
3025 if (!(prNewKey->u4KeyLength == WEP_40_LEN || prNewKey->u4KeyLength == WEP_104_LEN ||
3026 prNewKey->u4KeyLength == CCMP_KEY_LEN || prNewKey->u4KeyLength == TKIP_KEY_LEN))
3028 return WLAN_STATUS_INVALID_DATA;
3031 /* Exception check, pairwise key must with transmit bit enabled */
3032 if ((prNewKey->u4KeyIndex & BITS(30,31)) == BITS(30,31)) {
3033 if (((prNewKey->u4KeyIndex & 0xff) != 0) ||
3034 ((prNewKey->arBSSID[0] == 0xff) && (prNewKey->arBSSID[1] == 0xff) && (prNewKey->arBSSID[2] == 0xff) &&
3035 (prNewKey->arBSSID[3] == 0xff) && (prNewKey->arBSSID[4] == 0xff) && (prNewKey->arBSSID[5] == 0xff))) {
3036 return WLAN_STATUS_INVALID_DATA;
3040 *pu4SetInfoLen = u4SetBufferLen;
3042 /* Dump PARAM_KEY content. */
3043 DBGLOG(REQ, TRACE, ("Set: Dump PARAM_KEY content\n"));
3044 DBGLOG(REQ, TRACE, ("Length : 0x%08lx\n", prNewKey->u4Length));
3045 DBGLOG(REQ, TRACE, ("Key Index : 0x%08lx\n", prNewKey->u4KeyIndex));
3046 DBGLOG(REQ, TRACE, ("Key Length: 0x%08lx\n", prNewKey->u4KeyLength));
3047 DBGLOG(REQ, TRACE, ("BSSID:\n"));
3048 DBGLOG_MEM8(REQ, TRACE, prNewKey->arBSSID, sizeof(PARAM_MAC_ADDRESS));
3049 DBGLOG(REQ, TRACE, ("Key RSC:\n"));
3050 DBGLOG_MEM8(REQ, TRACE, &prNewKey->rKeyRSC, sizeof(PARAM_KEY_RSC));
3051 DBGLOG(REQ, TRACE, ("Key Material:\n"));
3052 DBGLOG_MEM8(REQ, TRACE, prNewKey->aucKeyMaterial, prNewKey->u4KeyLength);
3054 if (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA) {
3055 /* Todo:: Store the legacy wep key for OID_802_11_RELOAD_DEFAULTS */
3058 if (prNewKey->u4KeyIndex & IS_TRANSMIT_KEY)
3059 prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = TRUE;
3061 prGlueInfo = prAdapter->prGlueInfo;
3062 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
3065 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3066 return WLAN_STATUS_FAILURE;
3069 // increase command sequence number
3070 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3071 DBGLOG(REQ, INFO, ("ucCmdSeqNum = %d\n", ucCmdSeqNum));
3073 // compose CMD_802_11_KEY cmd pkt
3074 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
3075 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
3076 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
3077 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
3078 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
3079 prCmdInfo->fgIsOid = TRUE;
3080 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
3081 prCmdInfo->fgSetQuery = TRUE;
3082 prCmdInfo->fgNeedResp = FALSE;
3083 prCmdInfo->fgDriverDomainMCR = FALSE;
3084 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
3085 prCmdInfo->u4SetInfoLen = u4SetBufferLen;
3086 prCmdInfo->pvInformationBuffer = pvSetBuffer;
3087 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
3090 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
3091 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
3092 prWifiCmd->ucCID = prCmdInfo->ucCID;
3093 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
3094 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
3096 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
3098 kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
3100 prCmdKey->ucAddRemove = 1; /* Add */
3102 prCmdKey->ucTxKey = ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) == IS_TRANSMIT_KEY) ? 1 : 0;
3103 prCmdKey->ucKeyType = ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
3104 prCmdKey->ucIsAuthenticator = ((prNewKey->u4KeyIndex & IS_AUTHENTICATOR) == IS_AUTHENTICATOR) ? 1 : 0;
3106 kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8)prNewKey->arBSSID, MAC_ADDR_LEN);
3108 prCmdKey->ucNetType = 0; /* AIS */
3110 prCmdKey->ucKeyId = (UINT_8)(prNewKey->u4KeyIndex & 0xff);
3112 /* Note: adjust the key length for WPA-None */
3113 prCmdKey->ucKeyLen = (UINT_8)prNewKey->u4KeyLength;
3115 kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8)prNewKey->aucKeyMaterial, prCmdKey->ucKeyLen);
3117 if (prNewKey->u4KeyLength == 5) {
3118 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP40;
3120 else if (prNewKey->u4KeyLength == 13) {
3121 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP104;
3123 else if (prNewKey->u4KeyLength == 16) {
3124 if (prAdapter->rWifiVar.rConnSettings.eAuthMode < AUTH_MODE_WPA)
3125 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WEP128;
3127 #if CFG_SUPPORT_802_11W
3128 if (prCmdKey->ucKeyId >= 4) {
3129 prCmdKey->ucAlgorithmId = CIPHER_SUITE_BIP;
3130 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3132 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3133 prAisSpecBssInfo->fgBipKeyInstalled = TRUE;
3137 prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
3140 else if (prNewKey->u4KeyLength == 32) {
3141 if (prAdapter->rWifiVar.rConnSettings.eAuthMode == AUTH_MODE_WPA_NONE) {
3142 if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION2_ENABLED) {
3143 prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
3145 else if (prAdapter->rWifiVar.rConnSettings.eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3146 prCmdKey->ucAlgorithmId = CIPHER_SUITE_CCMP;
3147 prCmdKey->ucKeyLen = CCMP_KEY_LEN;
3151 if (rsnCheckPmkidCandicate(prAdapter)) {
3152 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3154 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3155 DBGLOG(RSN, TRACE, ("Add key: Prepare a timer to indicate candidate PMKID Candidate\n"));
3156 cnmTimerStopTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer);
3157 cnmTimerStartTimer(prAdapter, &prAisSpecBssInfo->rPreauthenticationTimer,
3158 SEC_TO_MSEC(WAIT_TIME_IND_PMKID_CANDICATE_SEC));
3160 prCmdKey->ucAlgorithmId = CIPHER_SUITE_TKIP;
3164 // insert into prCmdQueue
3165 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
3167 // wakeup txServiceThread later
3168 GLUE_SET_EVENT(prGlueInfo);
3170 return WLAN_STATUS_PENDING;
3171 } /* wlanoidSetAddKey */
3174 /*----------------------------------------------------------------------------*/
3176 * \brief This routine is called to request the driver to remove the key at
3177 * the specified key index.
3179 * \param[in] prAdapter Pointer to the Adapter structure.
3180 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3181 * \param[in] u4SetBufferLen The length of the set buffer.
3182 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3183 * bytes read from the set buffer. If the call failed
3184 * due to invalid length of the set buffer, returns
3185 * the amount of storage needed.
3187 * \retval WLAN_STATUS_SUCCESS
3188 * \retval WLAN_STATUS_INVALID_DATA
3189 * \retval WLAN_STATUS_INVALID_LENGTH
3190 * \retval WLAN_STATUS_ADAPTER_NOT_READY
3192 /*----------------------------------------------------------------------------*/
3194 wlanoidSetRemoveKey (
3195 IN P_ADAPTER_T prAdapter,
3196 IN PVOID pvSetBuffer,
3197 IN UINT_32 u4SetBufferLen,
3198 OUT PUINT_32 pu4SetInfoLen
3201 P_GLUE_INFO_T prGlueInfo;
3202 P_CMD_INFO_T prCmdInfo;
3203 P_WIFI_CMD_T prWifiCmd;
3204 P_PARAM_REMOVE_KEY_T prRemovedKey;
3205 P_CMD_802_11_KEY prCmdKey;
3208 DEBUGFUNC("wlanoidSetRemoveKey");
3211 ASSERT(pu4SetInfoLen);
3213 *pu4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
3215 if (u4SetBufferLen < sizeof(PARAM_REMOVE_KEY_T)) {
3216 return WLAN_STATUS_INVALID_LENGTH;
3219 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
3220 DBGLOG(REQ, WARN, ("Fail in set remove key! (Adapter not ready). ACPI=D%d, Radio=%d\n",
3221 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
3222 return WLAN_STATUS_ADAPTER_NOT_READY;
3225 ASSERT(pvSetBuffer);
3226 prRemovedKey = (P_PARAM_REMOVE_KEY_T)pvSetBuffer;
3228 /* Dump PARAM_REMOVE_KEY content. */
3229 DBGLOG(REQ, INFO, ("Set: Dump PARAM_REMOVE_KEY content\n"));
3230 DBGLOG(REQ, INFO, ("Length : 0x%08lx\n", prRemovedKey->u4Length));
3231 DBGLOG(REQ, INFO, ("Key Index : 0x%08lx\n", prRemovedKey->u4KeyIndex));
3232 DBGLOG(REQ, INFO, ("BSSID:\n"));
3233 DBGLOG_MEM8(REQ, INFO, prRemovedKey->arBSSID, MAC_ADDR_LEN);
3235 /* Check bit 31: this bit should always 0 */
3236 if (prRemovedKey->u4KeyIndex & IS_TRANSMIT_KEY) {
3237 /* Bit 31 should not be set */
3238 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
3239 prRemovedKey->u4KeyIndex));
3240 return WLAN_STATUS_INVALID_DATA;
3243 /* Check bits 8 ~ 29 should always be 0 */
3244 if (prRemovedKey->u4KeyIndex & BITS(8, 29)) {
3245 /* Bit 31 should not be set */
3246 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
3247 prRemovedKey->u4KeyIndex));
3248 return WLAN_STATUS_INVALID_DATA;
3251 /* Clean up the Tx key flag */
3252 if (prRemovedKey->u4KeyIndex & IS_UNICAST_KEY) {
3253 prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist = FALSE;
3256 prGlueInfo = prAdapter->prGlueInfo;
3257 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_802_11_KEY)));
3260 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3261 return WLAN_STATUS_FAILURE;
3264 // increase command sequence number
3265 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3267 // compose CMD_802_11_KEY cmd pkt
3268 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
3269 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
3270 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
3271 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
3272 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
3273 prCmdInfo->fgIsOid = TRUE;
3274 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
3275 prCmdInfo->fgSetQuery = TRUE;
3276 prCmdInfo->fgNeedResp = FALSE;
3277 prCmdInfo->fgDriverDomainMCR = FALSE;
3278 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
3279 prCmdInfo->u4SetInfoLen = sizeof(PARAM_REMOVE_KEY_T);
3280 prCmdInfo->pvInformationBuffer = pvSetBuffer;
3281 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
3284 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
3285 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
3286 prWifiCmd->ucCID = prCmdInfo->ucCID;
3287 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
3288 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
3290 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
3292 kalMemZero((PUINT_8)prCmdKey, sizeof(CMD_802_11_KEY));
3294 prCmdKey->ucAddRemove = 0; /* Remove */
3295 prCmdKey->ucKeyId = (UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff);
3296 kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8)prRemovedKey->arBSSID, MAC_ADDR_LEN);
3298 #if CFG_SUPPORT_802_11W
3299 ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM + 2);
3301 //ASSERT(prCmdKey->ucKeyId < MAX_KEY_NUM);
3304 if (prRemovedKey->u4KeyIndex & IS_UNICAST_KEY) {
3305 prCmdKey->ucKeyType = 1;
3308 // insert into prCmdQueue
3309 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
3311 // wakeup txServiceThread later
3312 GLUE_SET_EVENT(prGlueInfo);
3314 return WLAN_STATUS_PENDING;
3315 } /* wlanoidSetRemoveKey */
3318 /*----------------------------------------------------------------------------*/
3320 * \brief This routine is called to query the current encryption status.
3322 * \param[in] prAdapter Pointer to the Adapter structure.
3323 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3325 * \param[in] u4QueryBufferLen The length of the query buffer.
3326 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3327 * bytes written into the query buffer. If the call
3328 * failed due to invalid length of the query buffer,
3329 * returns the amount of storage needed.
3331 * \retval WLAN_STATUS_SUCCESS
3333 /*----------------------------------------------------------------------------*/
3335 wlanoidQueryEncryptionStatus (
3336 IN P_ADAPTER_T prAdapter,
3337 IN PVOID pvQueryBuffer,
3338 IN UINT_32 u4QueryBufferLen,
3339 OUT PUINT_32 pu4QueryInfoLen
3342 BOOLEAN fgTransmitKeyAvailable = TRUE;
3343 ENUM_PARAM_ENCRYPTION_STATUS_T eEncStatus = 0;
3345 DEBUGFUNC("wlanoidQueryEncryptionStatus");
3348 ASSERT(pu4QueryInfoLen);
3349 if (u4QueryBufferLen) {
3350 ASSERT(pvQueryBuffer);
3353 *pu4QueryInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
3355 fgTransmitKeyAvailable = prAdapter->rWifiVar.rAisSpecificBssInfo.fgTransmitKeyExist;
3357 switch (prAdapter->rWifiVar.rConnSettings.eEncStatus) {
3358 case ENUM_ENCRYPTION3_ENABLED:
3359 if (fgTransmitKeyAvailable) {
3360 eEncStatus = ENUM_ENCRYPTION3_ENABLED;
3363 eEncStatus = ENUM_ENCRYPTION3_KEY_ABSENT;
3367 case ENUM_ENCRYPTION2_ENABLED:
3368 if (fgTransmitKeyAvailable) {
3369 eEncStatus = ENUM_ENCRYPTION2_ENABLED;
3373 eEncStatus = ENUM_ENCRYPTION2_KEY_ABSENT;
3377 case ENUM_ENCRYPTION1_ENABLED:
3378 if (fgTransmitKeyAvailable) {
3379 eEncStatus = ENUM_ENCRYPTION1_ENABLED;
3382 eEncStatus = ENUM_ENCRYPTION1_KEY_ABSENT;
3386 case ENUM_ENCRYPTION_DISABLED:
3387 eEncStatus = ENUM_ENCRYPTION_DISABLED;
3391 DBGLOG(REQ, ERROR, ("Unknown Encryption Status Setting:%d\n",
3392 prAdapter->rWifiVar.rConnSettings.eEncStatus));
3397 ("Encryption status: %d Return:%d\n",
3398 prAdapter->rWifiVar.rConnSettings.eEncStatus,
3402 *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvQueryBuffer = eEncStatus;
3404 return WLAN_STATUS_SUCCESS;
3405 } /* wlanoidQueryEncryptionStatus */
3408 /*----------------------------------------------------------------------------*/
3410 * \brief This routine is called to set the encryption status to the driver.
3412 * \param[in] prAdapter Pointer to the Adapter structure.
3413 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3414 * \param[in] u4SetBufferLen The length of the set buffer.
3415 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3416 * bytes read from the set buffer. If the call failed
3417 * due to invalid length of the set buffer, returns
3418 * the amount of storage needed.
3420 * \retval WLAN_STATUS_SUCCESS
3421 * \retval WLAN_STATUS_ADAPTER_NOT_READY
3422 * \retval WLAN_STATUS_NOT_SUPPORTED
3424 /*----------------------------------------------------------------------------*/
3426 wlanoidSetEncryptionStatus (
3427 IN P_ADAPTER_T prAdapter,
3428 IN PVOID pvSetBuffer,
3429 IN UINT_32 u4SetBufferLen,
3430 OUT PUINT_32 pu4SetInfoLen
3433 P_GLUE_INFO_T prGlueInfo;
3434 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
3435 ENUM_PARAM_ENCRYPTION_STATUS_T eEewEncrypt;
3437 DEBUGFUNC("wlanoidSetEncryptionStatus");
3440 ASSERT(pvSetBuffer);
3441 ASSERT(pu4SetInfoLen);
3443 prGlueInfo = prAdapter->prGlueInfo;
3445 *pu4SetInfoLen = sizeof(ENUM_PARAM_ENCRYPTION_STATUS_T);
3447 //if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
3448 // return WLAN_STATUS_SUCCESS;
3451 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
3452 DBGLOG(REQ, WARN, ("Fail in set encryption status! (Adapter not ready). ACPI=D%d, Radio=%d\n",
3453 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
3454 return WLAN_STATUS_ADAPTER_NOT_READY;
3457 eEewEncrypt = *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvSetBuffer;
3458 DBGLOG(REQ, TRACE, ("ENCRYPTION_STATUS %d\n", eEewEncrypt));
3460 switch (eEewEncrypt) {
3461 case ENUM_ENCRYPTION_DISABLED: /* Disable WEP, TKIP, AES */
3462 DBGLOG(RSN, TRACE, ("Disable Encryption\n"));
3463 secSetCipherSuite(prAdapter,
3465 CIPHER_FLAG_WEP104 |
3466 CIPHER_FLAG_WEP128);
3469 case ENUM_ENCRYPTION1_ENABLED: /* Enable WEP. Disable TKIP, AES */
3470 DBGLOG(RSN, TRACE, ("Enable Encryption1\n"));
3471 secSetCipherSuite(prAdapter,
3473 CIPHER_FLAG_WEP104 |
3474 CIPHER_FLAG_WEP128);
3477 case ENUM_ENCRYPTION2_ENABLED: /* Enable WEP, TKIP. Disable AES */
3478 secSetCipherSuite(prAdapter,
3480 CIPHER_FLAG_WEP104 |
3481 CIPHER_FLAG_WEP128 |
3483 DBGLOG(RSN, TRACE, ("Enable Encryption2\n"));
3486 case ENUM_ENCRYPTION3_ENABLED: /* Enable WEP, TKIP, AES */
3487 secSetCipherSuite(prAdapter,
3489 CIPHER_FLAG_WEP104 |
3490 CIPHER_FLAG_WEP128 |
3493 DBGLOG(RSN, TRACE, ("Enable Encryption3\n"));
3497 DBGLOG(RSN, WARN, ("Unacceptible encryption status: %d\n",
3498 *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvSetBuffer));
3500 rStatus = WLAN_STATUS_NOT_SUPPORTED;
3503 if (rStatus == WLAN_STATUS_SUCCESS) {
3504 /* Save the new encryption status. */
3505 prAdapter->rWifiVar.rConnSettings.eEncStatus =
3506 *(P_ENUM_PARAM_ENCRYPTION_STATUS_T)pvSetBuffer;
3510 } /* wlanoidSetEncryptionStatus */
3513 /*----------------------------------------------------------------------------*/
3515 * \brief This routine is called to test the driver.
3517 * \param[in] prAdapter Pointer to the Adapter structure.
3518 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3519 * \param[in] u4SetBufferLen The length of the set buffer.
3520 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3521 * bytes read from the set buffer. If the call failed
3522 * due to invalid length of the set buffer, returns
3523 * the amount of storage needed.
3525 * \retval WLAN_STATUS_SUCCESS
3526 * \retval WLAN_STATUS_INVALID_LENGTH
3527 * \retval WLAN_STATUS_INVALID_DATA
3529 /*----------------------------------------------------------------------------*/
3532 IN P_ADAPTER_T prAdapter,
3533 IN PVOID pvSetBuffer,
3534 IN UINT_32 u4SetBufferLen,
3535 OUT PUINT_32 pu4SetInfoLen
3538 P_PARAM_802_11_TEST_T prTest;
3540 PVOID pvStatusBuffer;
3541 UINT_32 u4StatusBufferSize;
3543 DEBUGFUNC("wlanoidSetTest");
3547 ASSERT(pu4SetInfoLen);
3548 ASSERT(pvSetBuffer);
3550 *pu4SetInfoLen = u4SetBufferLen;
3552 prTest = (P_PARAM_802_11_TEST_T)pvSetBuffer;
3554 DBGLOG(REQ, TRACE, ("Test - Type %ld\n", prTest->u4Type));
3556 switch (prTest->u4Type) {
3557 case 1: /* Type 1: generate an authentication event */
3558 pvTestData = (PVOID)&prTest->u.AuthenticationEvent;
3559 pvStatusBuffer = (PVOID)prAdapter->aucIndicationEventBuffer;
3560 u4StatusBufferSize = prTest->u4Length - 8;
3563 case 2: /* Type 2: generate an RSSI status indication */
3564 pvTestData = (PVOID)&prTest->u.RssiTrigger;
3565 pvStatusBuffer = (PVOID)&prAdapter->rWlanInfo.rCurrBssId.rRssi;
3566 u4StatusBufferSize = sizeof(PARAM_RSSI);
3570 return WLAN_STATUS_INVALID_DATA;
3573 ASSERT(u4StatusBufferSize <= 180);
3574 if (u4StatusBufferSize > 180) {
3575 return WLAN_STATUS_INVALID_LENGTH;
3578 /* Get the contents of the StatusBuffer from the test structure. */
3579 kalMemCopy(pvStatusBuffer, pvTestData, u4StatusBufferSize);
3581 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
3582 WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
3584 u4StatusBufferSize);
3586 return WLAN_STATUS_SUCCESS;
3587 } /* wlanoidSetTest */
3590 /*----------------------------------------------------------------------------*/
3592 * \brief This routine is called to query the driver's WPA2 status.
3594 * \param[in] prAdapter Pointer to the Adapter structure.
3595 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3597 * \param[in] u4QueryBufferLen The length of the query buffer.
3598 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3599 * bytes written into the query buffer. If the call
3600 * failed due to invalid length of the query buffer,
3601 * returns the amount of storage needed.
3603 * \retval WLAN_STATUS_SUCCESS
3604 * \retval WLAN_STATUS_INVALID_LENGTH
3606 /*----------------------------------------------------------------------------*/
3608 wlanoidQueryCapability (
3609 IN P_ADAPTER_T prAdapter,
3610 OUT PVOID pvQueryBuffer,
3611 IN UINT_32 u4QueryBufferLen,
3612 OUT PUINT_32 pu4QueryInfoLen
3615 P_PARAM_CAPABILITY_T prCap;
3616 P_PARAM_AUTH_ENCRYPTION_T prAuthenticationEncryptionSupported;
3618 DEBUGFUNC("wlanoidQueryCapability");
3621 ASSERT(pu4QueryInfoLen);
3622 if (u4QueryBufferLen) {
3623 ASSERT(pvQueryBuffer);
3626 *pu4QueryInfoLen = 4 * sizeof(UINT_32) + 14 * sizeof(PARAM_AUTH_ENCRYPTION_T);
3628 if (u4QueryBufferLen < *pu4QueryInfoLen) {
3629 return WLAN_STATUS_INVALID_LENGTH;
3632 prCap = (P_PARAM_CAPABILITY_T)pvQueryBuffer;
3634 prCap->u4Length = *pu4QueryInfoLen;
3635 prCap->u4Version = 2; /* WPA2 */
3636 prCap->u4NoOfPMKIDs = CFG_MAX_PMKID_CACHE;
3637 prCap->u4NoOfAuthEncryptPairsSupported = 14;
3639 prAuthenticationEncryptionSupported =
3640 &prCap->arAuthenticationEncryptionSupported[0];
3642 // fill 14 entries of supported settings
3643 prAuthenticationEncryptionSupported[0].eAuthModeSupported =
3646 prAuthenticationEncryptionSupported[0].eEncryptStatusSupported =
3647 ENUM_ENCRYPTION_DISABLED;
3649 prAuthenticationEncryptionSupported[1].eAuthModeSupported =
3651 prAuthenticationEncryptionSupported[1].eEncryptStatusSupported =
3652 ENUM_ENCRYPTION1_ENABLED;
3654 prAuthenticationEncryptionSupported[2].eAuthModeSupported =
3656 prAuthenticationEncryptionSupported[2].eEncryptStatusSupported =
3657 ENUM_ENCRYPTION_DISABLED;
3659 prAuthenticationEncryptionSupported[3].eAuthModeSupported =
3661 prAuthenticationEncryptionSupported[3].eEncryptStatusSupported =
3662 ENUM_ENCRYPTION1_ENABLED;
3664 prAuthenticationEncryptionSupported[4].eAuthModeSupported =
3666 prAuthenticationEncryptionSupported[4].eEncryptStatusSupported =
3667 ENUM_ENCRYPTION2_ENABLED;
3669 prAuthenticationEncryptionSupported[5].eAuthModeSupported =
3671 prAuthenticationEncryptionSupported[5].eEncryptStatusSupported =
3672 ENUM_ENCRYPTION3_ENABLED;
3674 prAuthenticationEncryptionSupported[6].eAuthModeSupported =
3676 prAuthenticationEncryptionSupported[6].eEncryptStatusSupported =
3677 ENUM_ENCRYPTION2_ENABLED;
3679 prAuthenticationEncryptionSupported[7].eAuthModeSupported =
3681 prAuthenticationEncryptionSupported[7].eEncryptStatusSupported =
3682 ENUM_ENCRYPTION3_ENABLED;
3684 prAuthenticationEncryptionSupported[8].eAuthModeSupported =
3686 prAuthenticationEncryptionSupported[8].eEncryptStatusSupported =
3687 ENUM_ENCRYPTION2_ENABLED;
3689 prAuthenticationEncryptionSupported[9].eAuthModeSupported =
3691 prAuthenticationEncryptionSupported[9].eEncryptStatusSupported =
3692 ENUM_ENCRYPTION3_ENABLED;
3694 prAuthenticationEncryptionSupported[10].eAuthModeSupported =
3696 prAuthenticationEncryptionSupported[10].eEncryptStatusSupported =
3697 ENUM_ENCRYPTION2_ENABLED;
3699 prAuthenticationEncryptionSupported[11].eAuthModeSupported =
3701 prAuthenticationEncryptionSupported[11].eEncryptStatusSupported =
3702 ENUM_ENCRYPTION3_ENABLED;
3704 prAuthenticationEncryptionSupported[12].eAuthModeSupported =
3706 prAuthenticationEncryptionSupported[12].eEncryptStatusSupported =
3707 ENUM_ENCRYPTION2_ENABLED;
3709 prAuthenticationEncryptionSupported[13].eAuthModeSupported =
3711 prAuthenticationEncryptionSupported[13].eEncryptStatusSupported =
3712 ENUM_ENCRYPTION3_ENABLED;
3714 return WLAN_STATUS_SUCCESS;
3716 } /* wlanoidQueryCapability */
3719 /*----------------------------------------------------------------------------*/
3721 * \brief This routine is called to query the PMKID in the PMK cache.
3723 * \param[in] prAdapter Pointer to the Adapter structure.
3724 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3726 * \param[in] u4QueryBufferLen The length of the query buffer.
3727 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3728 * bytes written into the query buffer. If the call
3729 * failed due to invalid length of the query buffer,
3730 * returns the amount of storage needed.
3732 * \retval WLAN_STATUS_SUCCESS
3733 * \retval WLAN_STATUS_INVALID_LENGTH
3735 /*----------------------------------------------------------------------------*/
3738 IN P_ADAPTER_T prAdapter,
3739 OUT PVOID pvQueryBuffer,
3740 IN UINT_32 u4QueryBufferLen,
3741 OUT PUINT_32 pu4QueryInfoLen
3745 P_PARAM_PMKID_T prPmkid;
3746 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3748 DEBUGFUNC("wlanoidQueryPmkid");
3751 ASSERT(pu4QueryInfoLen);
3752 if (u4QueryBufferLen) {
3753 ASSERT(pvQueryBuffer);
3756 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3758 *pu4QueryInfoLen = OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo) +
3759 prAisSpecBssInfo->u4PmkidCacheCount * sizeof(PARAM_BSSID_INFO_T);
3761 if (u4QueryBufferLen < *pu4QueryInfoLen) {
3762 return WLAN_STATUS_INVALID_LENGTH;
3765 prPmkid = (P_PARAM_PMKID_T)pvQueryBuffer;
3767 prPmkid->u4Length = *pu4QueryInfoLen;
3768 prPmkid->u4BSSIDInfoCount = prAisSpecBssInfo->u4PmkidCacheCount;
3770 for (i = 0; i < prAisSpecBssInfo->u4PmkidCacheCount; i++) {
3771 kalMemCopy(prPmkid->arBSSIDInfo[i].arBSSID,
3772 prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arBSSID,
3773 sizeof(PARAM_MAC_ADDRESS));
3774 kalMemCopy(prPmkid->arBSSIDInfo[i].arPMKID,
3775 prAisSpecBssInfo->arPmkidCache[i].rBssidInfo.arPMKID,
3776 sizeof(PARAM_PMKID_VALUE));
3779 return WLAN_STATUS_SUCCESS;
3781 } /* wlanoidQueryPmkid */
3784 /*----------------------------------------------------------------------------*/
3786 * \brief This routine is called to set the PMKID to the PMK cache in the driver.
3788 * \param[in] prAdapter Pointer to the Adapter structure.
3789 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
3790 * \param[in] u4SetBufferLen The length of the set buffer.
3791 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
3792 * bytes read from the set buffer. If the call failed
3793 * due to invalid length of the set buffer, returns
3794 * the amount of storage needed.
3796 * \retval WLAN_STATUS_SUCCESS
3797 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
3798 * \retval WLAN_STATUS_INVALID_DATA
3800 /*----------------------------------------------------------------------------*/
3803 IN P_ADAPTER_T prAdapter,
3804 IN PVOID pvSetBuffer,
3805 IN UINT_32 u4SetBufferLen,
3806 OUT PUINT_32 pu4SetInfoLen
3810 P_PARAM_PMKID_T prPmkid;
3811 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecBssInfo;
3813 DEBUGFUNC("wlanoidSetPmkid");
3816 ASSERT(pu4SetInfoLen);
3818 *pu4SetInfoLen = u4SetBufferLen;
3820 /* It's possibble BSSIDInfoCount is zero, because OS wishes to clean PMKID */
3821 if (u4SetBufferLen < OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo)) {
3822 return WLAN_STATUS_BUFFER_TOO_SHORT;
3825 ASSERT(pvSetBuffer);
3826 prPmkid = (P_PARAM_PMKID_T)pvSetBuffer;
3828 if (u4SetBufferLen <
3829 ((prPmkid->u4BSSIDInfoCount * sizeof(PARAM_BSSID_INFO_T)) +
3830 OFFSET_OF(PARAM_PMKID_T, arBSSIDInfo))) {
3831 return WLAN_STATUS_INVALID_DATA;
3834 if (prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE) {
3835 return WLAN_STATUS_INVALID_DATA;
3838 DBGLOG(REQ, INFO, ("Count %lu\n", prPmkid->u4BSSIDInfoCount));
3840 prAisSpecBssInfo = &prAdapter->rWifiVar.rAisSpecificBssInfo;
3842 /* This OID replace everything in the PMKID cache. */
3843 if (prPmkid->u4BSSIDInfoCount == 0) {
3844 prAisSpecBssInfo->u4PmkidCacheCount = 0;
3845 kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
3847 if ((prAisSpecBssInfo->u4PmkidCacheCount + prPmkid->u4BSSIDInfoCount > CFG_MAX_PMKID_CACHE)) {
3848 prAisSpecBssInfo->u4PmkidCacheCount = 0;
3849 kalMemZero(prAisSpecBssInfo->arPmkidCache, sizeof(PMKID_ENTRY_T) * CFG_MAX_PMKID_CACHE);
3853 The driver can only clear its PMKID cache whenever it make a media disconnect
3854 indication. Otherwise, it must change the PMKID cache only when set through this OID.
3856 #if CFG_RSN_MIGRATION
3857 for (i = 0; i < prPmkid->u4BSSIDInfoCount; i++) {
3858 /* Search for desired BSSID. If desired BSSID is found,
3859 then set the PMKID */
3860 if (!rsnSearchPmkidEntry(prAdapter,
3861 (PUINT_8)prPmkid->arBSSIDInfo[i].arBSSID,
3863 /* No entry found for the specified BSSID, so add one entry */
3864 if (prAisSpecBssInfo->u4PmkidCacheCount < CFG_MAX_PMKID_CACHE - 1) {
3865 j = prAisSpecBssInfo->u4PmkidCacheCount;
3866 kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID,
3867 prPmkid->arBSSIDInfo[i].arBSSID,
3868 sizeof(PARAM_MAC_ADDRESS));
3869 prAisSpecBssInfo->u4PmkidCacheCount++;
3872 j = CFG_MAX_PMKID_CACHE;
3876 if (j < CFG_MAX_PMKID_CACHE) {
3877 kalMemCopy(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID,
3878 prPmkid->arBSSIDInfo[i].arPMKID,
3879 sizeof(PARAM_PMKID_VALUE));
3880 DBGLOG(RSN, TRACE, ("Add BSSID "MACSTR" idx=%d PMKID value "MACSTR"\n",
3881 MAC2STR(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arBSSID),j, MAC2STR(prAisSpecBssInfo->arPmkidCache[j].rBssidInfo.arPMKID)));
3882 prAisSpecBssInfo->arPmkidCache[j].fgPmkidExist = TRUE;
3886 return WLAN_STATUS_SUCCESS;
3888 } /* wlanoidSetPmkid */
3891 /*----------------------------------------------------------------------------*/
3893 * \brief This routine is called to query the set of supported data rates that
3894 * the radio is capable of running
3896 * \param[in] prAdapter Pointer to the Adapter structure
3897 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
3899 * \param[in] u4QueryBufferLen The length of the query buffer
3900 * \param[out] pu4QueryInfoLen If the call is successful, returns the number
3901 * of bytes written into the query buffer. If the
3902 * call failed due to invalid length of the query
3903 * buffer, returns the amount of storage needed.
3905 * \retval WLAN_STATUS_SUCCESS
3906 * \retval WLAN_STATUS_INVALID_LENGTH
3908 /*----------------------------------------------------------------------------*/
3910 wlanoidQuerySupportedRates (
3911 IN P_ADAPTER_T prAdapter,
3912 OUT PVOID pvQueryBuffer,
3913 IN UINT_32 u4QueryBufferLen,
3914 OUT PUINT_32 pu4QueryInfoLen
3917 PARAM_RATES eRate = {
3918 // BSSBasicRateSet for 802.11n Non-HT rates
3929 DEBUGFUNC("wlanoidQuerySupportedRates");
3932 ASSERT(pu4QueryInfoLen);
3933 if (u4QueryBufferLen) {
3934 ASSERT(pvQueryBuffer);
3937 *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
3939 if (u4QueryBufferLen < *pu4QueryInfoLen ) {
3940 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4QueryBufferLen));
3941 return WLAN_STATUS_INVALID_LENGTH;
3944 kalMemCopy(pvQueryBuffer,
3946 sizeof(PARAM_RATES));
3948 return WLAN_STATUS_SUCCESS;
3949 } /* end of wlanoidQuerySupportedRates() */
3952 /*----------------------------------------------------------------------------*/
3954 * \brief This routine is called to query current desired rates.
3956 * \param[in] prAdapter Pointer to the Adapter structure.
3957 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
3959 * \param[in] u4QueryBufferLen The length of the query buffer.
3960 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
3961 * bytes written into the query buffer. If the call
3962 * failed due to invalid length of the query buffer,
3963 * returns the amount of storage needed.
3965 * \retval WLAN_STATUS_SUCCESS
3966 * \retval WLAN_STATUS_INVALID_LENGTH
3968 /*----------------------------------------------------------------------------*/
3970 wlanoidQueryDesiredRates (
3971 IN P_ADAPTER_T prAdapter,
3972 OUT PVOID pvQueryBuffer,
3973 IN UINT_32 u4QueryBufferLen,
3974 OUT PUINT_32 pu4QueryInfoLen
3977 DEBUGFUNC("wlanoidQueryDesiredRates");
3980 ASSERT(pu4QueryInfoLen);
3981 if (u4QueryBufferLen) {
3982 ASSERT(pvQueryBuffer);
3985 *pu4QueryInfoLen = sizeof(PARAM_RATES_EX);
3987 if (u4QueryBufferLen < *pu4QueryInfoLen ) {
3988 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4QueryBufferLen));
3989 return WLAN_STATUS_INVALID_LENGTH;
3992 kalMemCopy(pvQueryBuffer,
3993 (PVOID)&(prAdapter->rWlanInfo.eDesiredRates),
3994 sizeof(PARAM_RATES));
3996 return WLAN_STATUS_SUCCESS;
3998 } /* end of wlanoidQueryDesiredRates() */
4001 /*----------------------------------------------------------------------------*/
4003 * \brief This routine is called to Set the desired rates.
4005 * \param[in] prAdapter Pointer to the Adapter structure.
4006 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
4007 * \param[in] u4SetBufferLen The length of the set buffer.
4008 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
4009 * bytes read from the set buffer. If the call failed
4010 * due to invalid length of the set buffer, returns
4011 * the amount of storage needed.
4014 * \retval WLAN_STATUS_SUCCESS
4015 * \retval WLAN_STATUS_INVALID_LENGTH
4016 * \retval WLAN_STATUS_INVALID_DATA
4017 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4019 /*----------------------------------------------------------------------------*/
4021 wlanoidSetDesiredRates (
4022 IN P_ADAPTER_T prAdapter,
4023 IN PVOID pvSetBuffer,
4024 IN UINT_32 u4SetBufferLen,
4025 OUT PUINT_32 pu4SetInfoLen
4029 DEBUGFUNC("wlanoidSetDesiredRates");
4032 ASSERT(pvSetBuffer);
4033 ASSERT(pu4SetInfoLen);
4035 if (u4SetBufferLen < sizeof(PARAM_RATES)) {
4036 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
4037 return WLAN_STATUS_INVALID_LENGTH;
4040 *pu4SetInfoLen = sizeof(PARAM_RATES);
4042 if (u4SetBufferLen < sizeof(PARAM_RATES)) {
4043 return WLAN_STATUS_INVALID_LENGTH;
4046 kalMemCopy((PVOID)&(prAdapter->rWlanInfo.eDesiredRates),
4048 sizeof(PARAM_RATES));
4050 prAdapter->rWlanInfo.eLinkAttr.ucDesiredRateLen = PARAM_MAX_LEN_RATES;
4051 for (i = 0 ; i < PARAM_MAX_LEN_RATES ; i++) {
4052 prAdapter->rWlanInfo.eLinkAttr.u2DesiredRate[i] =
4053 (UINT_16) (prAdapter->rWlanInfo.eDesiredRates[i]);
4056 return wlanSendSetQueryCmd(prAdapter,
4061 nicCmdEventSetCommon,
4062 nicOidCmdTimeoutCommon,
4063 sizeof(CMD_LINK_ATTRIB),
4064 (PUINT_8)&(prAdapter->rWlanInfo.eLinkAttr),
4069 } /* end of wlanoidSetDesiredRates() */
4072 /*----------------------------------------------------------------------------*/
4074 * \brief This routine is called to query the maximum frame size in bytes,
4075 * not including the header.
4077 * \param[in] prAdapter Pointer to the Adapter structure.
4078 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
4080 * \param[in] u4QueryBufferLen The length of the query buffer.
4081 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4082 * bytes written into the query buffer. If the
4083 * call failed due to invalid length of the query
4084 * buffer, returns the amount of storage needed.
4086 * \retval WLAN_STATUS_SUCCESS
4087 * \retval WLAN_STATUS_INVALID_LENGTH
4089 /*----------------------------------------------------------------------------*/
4091 wlanoidQueryMaxFrameSize (
4092 IN P_ADAPTER_T prAdapter,
4093 OUT PVOID pvQueryBuffer,
4094 IN UINT_32 u4QueryBufferLen,
4095 OUT PUINT_32 pu4QueryInfoLen
4098 DEBUGFUNC("wlanoidQueryMaxFrameSize");
4102 ASSERT(pu4QueryInfoLen);
4103 if (u4QueryBufferLen) {
4104 ASSERT(pvQueryBuffer);
4108 if (u4QueryBufferLen < sizeof(UINT_32)) {
4109 *pu4QueryInfoLen = sizeof(UINT_32);
4110 return WLAN_STATUS_INVALID_LENGTH;
4113 *(PUINT_32)pvQueryBuffer = ETHERNET_MAX_PKT_SZ - ETHERNET_HEADER_SZ;
4114 *pu4QueryInfoLen = sizeof(UINT_32);
4116 return WLAN_STATUS_SUCCESS;
4117 } /* wlanoidQueryMaxFrameSize */
4120 /*----------------------------------------------------------------------------*/
4122 * \brief This routine is called to query the maximum total packet length
4125 * \param[in] prAdapter Pointer to the Adapter structure.
4126 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
4128 * \param[in] u4QueryBufferLen The length of the query buffer.
4129 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4130 * bytes written into the query buffer. If the call
4131 * failed due to invalid length of the query buffer,
4132 * returns the amount of storage needed.
4134 * \retval WLAN_STATUS_SUCCESS
4135 * \retval WLAN_STATUS_INVALID_LENGTH
4137 /*----------------------------------------------------------------------------*/
4139 wlanoidQueryMaxTotalSize (
4140 IN P_ADAPTER_T prAdapter,
4141 OUT PVOID pvQueryBuffer,
4142 IN UINT_32 u4QueryBufferLen,
4143 OUT PUINT_32 pu4QueryInfoLen
4146 DEBUGFUNC("wlanoidQueryMaxTotalSize");
4149 ASSERT(pu4QueryInfoLen);
4150 if (u4QueryBufferLen) {
4151 ASSERT(pvQueryBuffer);
4154 if (u4QueryBufferLen < sizeof(UINT_32)) {
4155 *pu4QueryInfoLen = sizeof(UINT_32);
4156 return WLAN_STATUS_INVALID_LENGTH;
4159 *(PUINT_32)pvQueryBuffer = ETHERNET_MAX_PKT_SZ;
4160 *pu4QueryInfoLen = sizeof(UINT_32);
4162 return WLAN_STATUS_SUCCESS;
4163 } /* wlanoidQueryMaxTotalSize */
4166 /*----------------------------------------------------------------------------*/
4168 * \brief This routine is called to query the vendor ID of the NIC.
4170 * \param[in] prAdapter Pointer to the Adapter structure.
4171 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
4173 * \param[in] u4QueryBufferLen The length of the query buffer.
4174 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4175 * bytes written into the query buffer. If the call
4176 * failed due to invalid length of the query buffer,
4177 * returns the amount of storage needed.
4179 * \retval WLAN_STATUS_SUCCESS
4180 * \retval WLAN_STATUS_INVALID_LENGTH
4182 /*----------------------------------------------------------------------------*/
4184 wlanoidQueryVendorId (
4185 IN P_ADAPTER_T prAdapter,
4186 OUT PVOID pvQueryBuffer,
4187 IN UINT_32 u4QueryBufferLen,
4188 OUT PUINT_32 pu4QueryInfoLen
4194 DEBUGFUNC("wlanoidQueryVendorId");
4197 ASSERT(pu4QueryInfoLen);
4198 if (u4QueryBufferLen) {
4199 ASSERT(pvQueryBuffer);
4202 if (u4QueryBufferLen < sizeof(UINT_32)) {
4203 *pu4QueryInfoLen = sizeof(UINT_32);
4204 return WLAN_STATUS_INVALID_LENGTH;
4207 kalMemCopy(pvQueryBuffer, prAdapter->aucMacAddress, 3);
4208 *((PUINT_8)pvQueryBuffer + 3) = 1;
4209 *pu4QueryInfoLen = sizeof(UINT_32);
4212 cp = (PUINT_8)pvQueryBuffer;
4213 DBGLOG(REQ, LOUD, ("Vendor ID=%02x-%02x-%02x-%02x\n", cp[0], cp[1], cp[2], cp[3]));
4216 return WLAN_STATUS_SUCCESS;
4217 } /* wlanoidQueryVendorId */
4220 /*----------------------------------------------------------------------------*/
4222 * \brief This routine is called to query the current RSSI value.
4224 * \param[in] prAdapter Pointer to the Adapter structure.
4225 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
4226 * \param[in] u4QueryBufferLen The length of the query buffer.
4227 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4228 * bytes written into the query buffer. If the call failed due to invalid length of
4229 * the query buffer, returns the amount of storage needed.
4231 * \retval WLAN_STATUS_SUCCESS
4232 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
4233 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4235 /*----------------------------------------------------------------------------*/
4238 IN P_ADAPTER_T prAdapter,
4239 OUT PVOID pvQueryBuffer,
4240 IN UINT_32 u4QueryBufferLen,
4241 OUT PUINT_32 pu4QueryInfoLen
4244 DEBUGFUNC("wlanoidQueryRssi");
4247 ASSERT(pu4QueryInfoLen);
4248 if (u4QueryBufferLen) {
4249 ASSERT(pvQueryBuffer);
4252 *pu4QueryInfoLen = sizeof(PARAM_RSSI);
4254 /* Check for query buffer length */
4255 if (u4QueryBufferLen < *pu4QueryInfoLen) {
4256 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
4257 return WLAN_STATUS_BUFFER_TOO_SHORT;
4260 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_DISCONNECTED) {
4261 return WLAN_STATUS_ADAPTER_NOT_READY;
4263 else if (prAdapter->fgIsLinkQualityValid == TRUE &&
4264 (kalGetTimeTick() - prAdapter->rLinkQualityUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
4267 rRssi = (PARAM_RSSI)prAdapter->rLinkQuality.cRssi; // ranged from (-128 ~ 30) in unit of dBm
4269 if(rRssi > PARAM_WHQL_RSSI_MAX_DBM)
4270 rRssi = PARAM_WHQL_RSSI_MAX_DBM;
4271 else if(rRssi < PARAM_WHQL_RSSI_MIN_DBM)
4272 rRssi = PARAM_WHQL_RSSI_MIN_DBM;
4274 kalMemCopy(pvQueryBuffer, &rRssi, sizeof(PARAM_RSSI));
4275 return WLAN_STATUS_SUCCESS;
4279 return wlanSendSetQueryCmd(prAdapter,
4280 CMD_ID_GET_LINK_QUALITY,
4284 nicCmdEventQueryLinkQuality,
4285 nicOidCmdTimeoutCommon,
4292 return wlanSendSetQueryCmd(prAdapter,
4293 CMD_ID_GET_LINK_QUALITY,
4297 nicCmdEventQueryLinkQuality,
4298 nicOidCmdTimeoutCommon,
4306 } /* end of wlanoidQueryRssi() */
4309 /*----------------------------------------------------------------------------*/
4311 * \brief This routine is called to query the current RSSI trigger value.
4313 * \param[in] prAdapter Pointer to the Adapter structure.
4314 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of the query.
4315 * \param[in] u4QueryBufferLen The length of the query buffer.
4316 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4317 * bytes written into the query buffer. If the call failed due to invalid length of
4318 * the query buffer, returns the amount of storage needed.
4320 * \retval WLAN_STATUS_SUCCESS
4321 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
4323 /*----------------------------------------------------------------------------*/
4325 wlanoidQueryRssiTrigger (
4326 IN P_ADAPTER_T prAdapter,
4327 OUT PVOID pvQueryBuffer,
4328 IN UINT_32 u4QueryBufferLen,
4329 OUT PUINT_32 pu4QueryInfoLen
4332 DEBUGFUNC("wlanoidQueryRssiTrigger");
4335 ASSERT(pu4QueryInfoLen);
4336 if (u4QueryBufferLen) {
4337 ASSERT(pvQueryBuffer);
4341 if(prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_NONE)
4342 return WLAN_STATUS_ADAPTER_NOT_READY;
4344 *pu4QueryInfoLen = sizeof(PARAM_RSSI);
4346 /* Check for query buffer length */
4347 if (u4QueryBufferLen < *pu4QueryInfoLen) {
4348 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
4349 return WLAN_STATUS_BUFFER_TOO_SHORT;
4352 *(PARAM_RSSI *) pvQueryBuffer = prAdapter->rWlanInfo.rRssiTriggerValue;
4353 DBGLOG(REQ, INFO, ("RSSI trigger: %ld dBm\n", *(PARAM_RSSI *) pvQueryBuffer));
4355 return WLAN_STATUS_SUCCESS;
4356 } /* wlanoidQueryRssiTrigger */
4359 /*----------------------------------------------------------------------------*/
4361 * \brief This routine is called to set a trigger value of the RSSI event.
4363 * \param[in] prAdapter Pointer to the Adapter structure
4364 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
4365 * \param[in] u4SetBufferLen The length of the set buffer.
4366 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
4367 * bytes read from the set buffer. If the call failed
4368 * due to invalid length of the set buffer, returns the
4369 * amount of storage needed.
4371 * \retval WLAN_STATUS_SUCCESS
4374 /*----------------------------------------------------------------------------*/
4376 wlanoidSetRssiTrigger (
4377 IN P_ADAPTER_T prAdapter,
4378 IN PVOID pvSetBuffer,
4379 IN UINT_32 u4SetBufferLen,
4380 OUT PUINT_32 pu4SetInfoLen
4383 PARAM_RSSI rRssiTriggerValue;
4384 DEBUGFUNC("wlanoidSetRssiTrigger");
4387 ASSERT(pvSetBuffer);
4388 ASSERT(pu4SetInfoLen);
4391 *pu4SetInfoLen = sizeof(PARAM_RSSI);
4392 rRssiTriggerValue = *(PARAM_RSSI *) pvSetBuffer;
4394 if(rRssiTriggerValue > PARAM_WHQL_RSSI_MAX_DBM
4395 || rRssiTriggerValue < PARAM_WHQL_RSSI_MIN_DBM)
4398 /* Save the RSSI trigger value to the Adapter structure */
4399 prAdapter->rWlanInfo.rRssiTriggerValue = rRssiTriggerValue;
4401 /* If the RSSI trigger value is equal to the current RSSI value, the
4402 * indication triggers immediately. We need to indicate the protocol
4403 * that an RSSI status indication event triggers. */
4404 if (rRssiTriggerValue == (PARAM_RSSI)(prAdapter->rLinkQuality.cRssi)) {
4405 prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
4407 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
4408 WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
4409 (PVOID) &prAdapter->rWlanInfo.rRssiTriggerValue, sizeof(PARAM_RSSI));
4411 else if(rRssiTriggerValue < (PARAM_RSSI)(prAdapter->rLinkQuality.cRssi))
4412 prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_GREATER;
4413 else if(rRssiTriggerValue > (PARAM_RSSI)(prAdapter->rLinkQuality.cRssi))
4414 prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_LESS;
4416 return WLAN_STATUS_SUCCESS;
4417 } /* wlanoidSetRssiTrigger */
4420 /*----------------------------------------------------------------------------*/
4422 * \brief This routine is called to set a suggested value for the number of
4423 * bytes of received packet data that will be indicated to the protocol
4424 * driver. We just accept the set and ignore this value.
4426 * \param[in] prAdapter Pointer to the Adapter structure.
4427 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
4428 * \param[in] u4SetBufferLen The length of the set buffer.
4429 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
4430 * bytes read from the set buffer. If the call failed
4431 * due to invalid length of the set buffer, returns
4432 * the amount of storage needed.
4434 * \retval WLAN_STATUS_SUCCESS
4435 * \retval WLAN_STATUS_INVALID_LENGTH
4437 /*----------------------------------------------------------------------------*/
4439 wlanoidSetCurrentLookahead (
4440 IN P_ADAPTER_T prAdapter,
4441 IN PVOID pvSetBuffer,
4442 IN UINT_32 u4SetBufferLen,
4443 OUT PUINT_32 pu4SetInfoLen
4446 DEBUGFUNC("wlanoidSetCurrentLookahead");
4449 ASSERT(pvSetBuffer);
4450 ASSERT(pu4SetInfoLen);
4452 if (u4SetBufferLen < sizeof(UINT_32)) {
4453 *pu4SetInfoLen = sizeof(UINT_32);
4454 return WLAN_STATUS_INVALID_LENGTH;
4457 *pu4SetInfoLen = sizeof(UINT_32);
4458 return WLAN_STATUS_SUCCESS;
4459 } /* wlanoidSetCurrentLookahead */
4462 /*----------------------------------------------------------------------------*/
4464 * \brief This routine is called to query the number of frames that the driver
4465 * receives but does not indicate to the protocols due to errors.
4467 * \param[in] pvAdapter Pointer to the Adapter structure.
4468 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
4470 * \param[in] u4QueryBufLen The length of the query buffer.
4471 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4472 * bytes written into the query buffer. If the call
4473 * failed due to invalid length of the query buffer,
4474 * returns the amount of storage needed.
4476 * \retval WLAN_STATUS_SUCCESS
4477 * \retval WLAN_STATUS_INVALID_LENGTH
4478 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4480 /*----------------------------------------------------------------------------*/
4482 wlanoidQueryRcvError (
4483 IN P_ADAPTER_T prAdapter,
4484 IN PVOID pvQueryBuffer,
4485 IN UINT_32 u4QueryBufferLen,
4486 OUT PUINT_32 pu4QueryInfoLen
4489 DEBUGFUNC("wlanoidQueryRcvError");
4490 DBGLOG(REQ, LOUD, ("\n"));
4493 if (u4QueryBufferLen) {
4494 ASSERT(pvQueryBuffer);
4496 ASSERT(pu4QueryInfoLen);
4498 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4499 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4500 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4501 *pu4QueryInfoLen = sizeof(UINT_32);
4502 return WLAN_STATUS_ADAPTER_NOT_READY;
4504 else if (u4QueryBufferLen < sizeof(UINT_32)
4505 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
4506 *pu4QueryInfoLen = sizeof(UINT_64);
4507 return WLAN_STATUS_INVALID_LENGTH;
4510 #if CFG_ENABLE_STATISTICS_BUFFERING
4511 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4512 // @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated
4513 if(u4QueryBufferLen == sizeof(UINT_32)) {
4514 *pu4QueryInfoLen = sizeof(UINT_32);
4515 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4518 *pu4QueryInfoLen = sizeof(UINT_64);
4519 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4522 return WLAN_STATUS_SUCCESS;
4527 return wlanSendSetQueryCmd(prAdapter,
4528 CMD_ID_GET_STATISTICS,
4532 nicCmdEventQueryRecvError,
4533 nicOidCmdTimeoutCommon,
4540 } /* wlanoidQueryRcvError */
4543 /*----------------------------------------------------------------------------*/
4544 /*! \brief This routine is called to query the number of frames that the NIC
4545 * cannot receive due to lack of NIC receive buffer space.
4547 * \param[in] pvAdapter Pointer to the Adapter structure
4548 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4550 * \param[in] u4QueryBufLen The length of the query buffer
4551 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4552 * bytes written into the query buffer. If the call
4553 * failed due to invalid length of the query buffer,
4554 * returns the amount of storage needed.
4556 * \retval WLAN_STATUS_SUCCESS If success;
4557 * \retval WLAN_STATUS_INVALID_LENGTH
4558 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4560 /*----------------------------------------------------------------------------*/
4562 wlanoidQueryRcvNoBuffer (
4563 IN P_ADAPTER_T prAdapter,
4564 IN PVOID pvQueryBuffer,
4565 IN UINT_32 u4QueryBufferLen,
4566 OUT PUINT_32 pu4QueryInfoLen
4569 DEBUGFUNC("wlanoidQueryRcvNoBuffer");
4570 DBGLOG(REQ, LOUD, ("\n"));
4573 if (u4QueryBufferLen) {
4574 ASSERT(pvQueryBuffer);
4576 ASSERT(pu4QueryInfoLen);
4578 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4579 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4580 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4581 *pu4QueryInfoLen = sizeof(UINT_32);
4582 return WLAN_STATUS_ADAPTER_NOT_READY;
4584 else if (u4QueryBufferLen < sizeof(UINT_32)
4585 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
4586 *pu4QueryInfoLen = sizeof(UINT_64);
4587 return WLAN_STATUS_INVALID_LENGTH;
4590 #if CFG_ENABLE_STATISTICS_BUFFERING
4591 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4592 if(u4QueryBufferLen == sizeof(UINT_32)) {
4593 *pu4QueryInfoLen = sizeof(UINT_32);
4594 *(PUINT_32) pvQueryBuffer = (UINT_32) 0; //@FIXME
4597 *pu4QueryInfoLen = sizeof(UINT_64);
4598 *(PUINT_64) pvQueryBuffer = (UINT_64) 0; //@FIXME
4601 return WLAN_STATUS_SUCCESS;
4606 return wlanSendSetQueryCmd(prAdapter,
4607 CMD_ID_GET_STATISTICS,
4611 nicCmdEventQueryRecvNoBuffer,
4612 nicOidCmdTimeoutCommon,
4619 } /* wlanoidQueryRcvNoBuffer */
4622 /*----------------------------------------------------------------------------*/
4623 /*! \brief This routine is called to query the number of frames that the NIC
4624 * received and it is CRC error.
4626 * \param[in] pvAdapter Pointer to the Adapter structure
4627 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4629 * \param[in] u4QueryBufLen The length of the query buffer
4630 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4631 * bytes written into the query buffer. If the call
4632 * failed due to invalid length of the query buffer,
4633 * returns the amount of storage needed.
4635 * \retval WLAN_STATUS_SUCCESS If success;
4636 * \retval WLAN_STATUS_INVALID_LENGTH
4637 * \retval WLAN_STATUS_ADAPTER_NOT_READY
4639 /*----------------------------------------------------------------------------*/
4641 wlanoidQueryRcvCrcError (
4642 IN P_ADAPTER_T prAdapter,
4643 IN PVOID pvQueryBuffer,
4644 IN UINT_32 u4QueryBufferLen,
4645 OUT PUINT_32 pu4QueryInfoLen
4648 DEBUGFUNC("wlanoidQueryRcvCrcError");
4649 DBGLOG(REQ, LOUD, ("\n"));
4652 if (u4QueryBufferLen) {
4653 ASSERT(pvQueryBuffer);
4655 ASSERT(pu4QueryInfoLen);
4657 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4658 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4659 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4660 *pu4QueryInfoLen = sizeof(UINT_32);
4661 return WLAN_STATUS_ADAPTER_NOT_READY;
4663 else if (u4QueryBufferLen < sizeof(UINT_32)
4664 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
4665 *pu4QueryInfoLen = sizeof(UINT_64);
4666 return WLAN_STATUS_INVALID_LENGTH;
4668 #if CFG_ENABLE_STATISTICS_BUFFERING
4669 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4670 if(u4QueryBufferLen == sizeof(UINT_32)) {
4671 *pu4QueryInfoLen = sizeof(UINT_32);
4672 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4675 *pu4QueryInfoLen = sizeof(UINT_64);
4676 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFCSErrorCount.QuadPart;
4679 return WLAN_STATUS_SUCCESS;
4684 return wlanSendSetQueryCmd(prAdapter,
4685 CMD_ID_GET_STATISTICS,
4689 nicCmdEventQueryRecvCrcError,
4690 nicOidCmdTimeoutCommon,
4697 } /* wlanoidQueryRcvCrcError */
4700 /*----------------------------------------------------------------------------*/
4701 /*! \brief This routine is called to query the current 802.11 statistics.
4703 * \param[in] pvAdapter Pointer to the Adapter structure
4704 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4706 * \param[in] u4QueryBufLen The length of the query buffer
4707 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4708 * bytes written into the query buffer. If the call
4709 * failed due to invalid length of the query buffer,
4710 * returns the amount of storage needed.
4712 * \retval WLAN_STATUS_SUCCESS
4713 * \retval WLAN_STATUS_INVALID_LENGTH
4715 /*----------------------------------------------------------------------------*/
4717 wlanoidQueryStatistics (
4718 IN P_ADAPTER_T prAdapter,
4719 IN PVOID pvQueryBuffer,
4720 IN UINT_32 u4QueryBufferLen,
4721 OUT PUINT_32 pu4QueryInfoLen
4724 DEBUGFUNC("wlanoidQueryStatistics");
4725 DBGLOG(REQ, LOUD, ("\n"));
4728 if (u4QueryBufferLen) {
4729 ASSERT(pvQueryBuffer);
4731 ASSERT(pu4QueryInfoLen);
4733 *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
4735 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
4736 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
4737 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
4738 *pu4QueryInfoLen = sizeof(UINT_32);
4739 return WLAN_STATUS_ADAPTER_NOT_READY;
4741 else if (u4QueryBufferLen < sizeof(PARAM_802_11_STATISTICS_STRUCT_T)) {
4742 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
4743 return WLAN_STATUS_INVALID_LENGTH;
4746 #if CFG_ENABLE_STATISTICS_BUFFERING
4747 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
4748 P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
4750 *pu4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
4751 prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) pvQueryBuffer;
4753 prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
4754 prStatistics->rTransmittedFragmentCount
4755 = prAdapter->rStatStruct.rTransmittedFragmentCount;
4756 prStatistics->rMulticastTransmittedFrameCount
4757 = prAdapter->rStatStruct.rMulticastTransmittedFrameCount;
4758 prStatistics->rFailedCount
4759 = prAdapter->rStatStruct.rFailedCount;
4760 prStatistics->rRetryCount
4761 = prAdapter->rStatStruct.rRetryCount;
4762 prStatistics->rMultipleRetryCount
4763 = prAdapter->rStatStruct.rMultipleRetryCount;
4764 prStatistics->rRTSSuccessCount
4765 = prAdapter->rStatStruct.rRTSSuccessCount;
4766 prStatistics->rRTSFailureCount
4767 = prAdapter->rStatStruct.rRTSFailureCount;
4768 prStatistics->rACKFailureCount
4769 = prAdapter->rStatStruct.rACKFailureCount;
4770 prStatistics->rFrameDuplicateCount
4771 = prAdapter->rStatStruct.rFrameDuplicateCount;
4772 prStatistics->rReceivedFragmentCount
4773 = prAdapter->rStatStruct.rReceivedFragmentCount;
4774 prStatistics->rMulticastReceivedFrameCount
4775 = prAdapter->rStatStruct.rMulticastReceivedFrameCount;
4776 prStatistics->rFCSErrorCount
4777 = prAdapter->rStatStruct.rFCSErrorCount;
4778 prStatistics->rTKIPLocalMICFailures.QuadPart
4780 prStatistics->rTKIPICVErrors.QuadPart
4782 prStatistics->rTKIPCounterMeasuresInvoked.QuadPart
4784 prStatistics->rTKIPReplays.QuadPart
4786 prStatistics->rCCMPFormatErrors.QuadPart
4788 prStatistics->rCCMPReplays.QuadPart
4790 prStatistics->rCCMPDecryptErrors.QuadPart
4792 prStatistics->rFourWayHandshakeFailures.QuadPart
4794 prStatistics->rWEPUndecryptableCount.QuadPart
4796 prStatistics->rWEPICVErrorCount.QuadPart
4798 prStatistics->rDecryptSuccessCount.QuadPart
4800 prStatistics->rDecryptFailureCount.QuadPart
4803 return WLAN_STATUS_SUCCESS;
4808 return wlanSendSetQueryCmd(prAdapter,
4809 CMD_ID_GET_STATISTICS,
4813 nicCmdEventQueryStatistics,
4814 nicOidCmdTimeoutCommon,
4821 } /* wlanoidQueryStatistics */
4824 /*----------------------------------------------------------------------------*/
4825 /*! \brief This routine is called to query current media streaming status.
4827 * \param[in] pvAdapter Pointer to the Adapter structure
4828 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4830 * \param[in] u4QueryBufLen The length of the query buffer
4831 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4832 * bytes written into the query buffer. If the call
4833 * failed due to invalid length of the query buffer,
4834 * returns the amount of storage needed.
4836 * \retval WLAN_STATUS_SUCCESS
4838 /*----------------------------------------------------------------------------*/
4840 wlanoidQueryMediaStreamMode(
4841 IN P_ADAPTER_T prAdapter,
4842 IN PVOID pvQueryBuffer,
4843 IN UINT_32 u4QueryBufferLen,
4844 OUT PUINT_32 pu4QueryInfoLen
4847 DEBUGFUNC("wlanoidQueryMediaStreamMode");
4850 ASSERT(pu4QueryInfoLen);
4851 if (u4QueryBufferLen) {
4852 ASSERT(pvQueryBuffer);
4855 *pu4QueryInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
4857 if (u4QueryBufferLen < *pu4QueryInfoLen ) {
4858 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4QueryBufferLen));
4859 return WLAN_STATUS_INVALID_LENGTH;
4862 *(P_ENUM_MEDIA_STREAM_MODE)pvQueryBuffer =
4863 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode == 0 ?
4864 ENUM_MEDIA_STREAM_OFF : ENUM_MEDIA_STREAM_ON;
4866 return WLAN_STATUS_SUCCESS;
4868 } /* wlanoidQueryMediaStreamMode */
4870 /*----------------------------------------------------------------------------*/
4871 /*! \brief This routine is called to enter media streaming mode or exit media streaming mode
4873 * \param[in] pvAdapter Pointer to the Adapter structure
4874 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4876 * \param[in] u4QueryBufLen The length of the query buffer
4877 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4878 * bytes written into the query buffer. If the call
4879 * failed due to invalid length of the query buffer,
4880 * returns the amount of storage needed.
4882 * \retval WLAN_STATUS_SUCCESS
4884 /*----------------------------------------------------------------------------*/
4886 wlanoidSetMediaStreamMode(
4887 IN P_ADAPTER_T prAdapter,
4888 IN PVOID pvSetBuffer,
4889 IN UINT_32 u4SetBufferLen,
4890 OUT PUINT_32 pu4SetInfoLen
4893 ENUM_MEDIA_STREAM_MODE eStreamMode;
4895 DEBUGFUNC("wlanoidSetMediaStreamMode");
4898 ASSERT(pvSetBuffer);
4899 ASSERT(pu4SetInfoLen);
4901 if (u4SetBufferLen < sizeof(ENUM_MEDIA_STREAM_MODE)) {
4902 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
4903 return WLAN_STATUS_INVALID_LENGTH;
4906 *pu4SetInfoLen = sizeof(ENUM_MEDIA_STREAM_MODE);
4908 eStreamMode = *(P_ENUM_MEDIA_STREAM_MODE)pvSetBuffer;
4910 if(eStreamMode == ENUM_MEDIA_STREAM_OFF)
4911 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 0;
4913 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 1;
4915 return wlanSendSetQueryCmd(prAdapter,
4920 nicCmdEventSetMediaStreamMode,
4921 nicOidCmdTimeoutCommon,
4922 sizeof(CMD_LINK_ATTRIB),
4923 (PUINT_8)&(prAdapter->rWlanInfo.eLinkAttr),
4927 } /* wlanoidSetMediaStreamMode */
4929 /*----------------------------------------------------------------------------*/
4930 /*! \brief This routine is called to query the permanent MAC address of the NIC.
4932 * \param[in] pvAdapter Pointer to the Adapter structure
4933 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4935 * \param[in] u4QueryBufLen The length of the query buffer
4936 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4937 * bytes written into the query buffer. If the call
4938 * failed due to invalid length of the query buffer,
4939 * returns the amount of storage needed.
4941 * \retval WLAN_STATUS_SUCCESS
4943 /*----------------------------------------------------------------------------*/
4945 wlanoidQueryPermanentAddr (
4946 IN P_ADAPTER_T prAdapter,
4947 IN PVOID pvQueryBuffer,
4948 IN UINT_32 u4QueryBufferLen,
4949 OUT PUINT_32 pu4QueryInfoLen
4952 DEBUGFUNC("wlanoidQueryPermanentAddr");
4953 DBGLOG(INIT, LOUD, ("\n"));
4956 ASSERT(pu4QueryInfoLen);
4957 if (u4QueryBufferLen) {
4958 ASSERT(pvQueryBuffer);
4961 if (u4QueryBufferLen < MAC_ADDR_LEN) {
4962 return WLAN_STATUS_BUFFER_TOO_SHORT;
4965 COPY_MAC_ADDR(pvQueryBuffer, prAdapter->rWifiVar.aucPermanentAddress);
4966 *pu4QueryInfoLen = MAC_ADDR_LEN;
4968 return WLAN_STATUS_SUCCESS;
4969 } /* wlanoidQueryPermanentAddr */
4972 /*----------------------------------------------------------------------------*/
4973 /*! \brief This routine is called to query the MAC address the NIC is currently using.
4975 * \param[in] pvAdapter Pointer to the Adapter structure
4976 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
4978 * \param[in] u4QueryBufLen The length of the query buffer
4979 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
4980 * bytes written into the query buffer. If the call
4981 * failed due to invalid length of the query buffer,
4982 * returns the amount of storage needed.
4984 * \retval WLAN_STATUS_SUCCESS
4985 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
4987 /*----------------------------------------------------------------------------*/
4989 wlanoidQueryCurrentAddr (
4990 IN P_ADAPTER_T prAdapter,
4991 IN PVOID pvQueryBuffer,
4992 IN UINT_32 u4QueryBufferLen,
4993 OUT PUINT_32 pu4QueryInfoLen
4996 CMD_BASIC_CONFIG rCmdBasicConfig;
4998 DEBUGFUNC("wlanoidQueryCurrentAddr");
4999 DBGLOG(INIT, LOUD, ("\n"));
5002 ASSERT(pu4QueryInfoLen);
5003 if (u4QueryBufferLen) {
5004 ASSERT(pvQueryBuffer);
5007 if (u4QueryBufferLen < MAC_ADDR_LEN) {
5008 return WLAN_STATUS_BUFFER_TOO_SHORT;
5011 kalMemZero(&rCmdBasicConfig, sizeof(CMD_BASIC_CONFIG));
5013 return wlanSendSetQueryCmd(prAdapter,
5014 CMD_ID_BASIC_CONFIG,
5018 nicCmdEventQueryAddress,
5019 nicOidCmdTimeoutCommon,
5020 sizeof(CMD_BASIC_CONFIG),
5021 (PUINT_8)&rCmdBasicConfig,
5026 } /* wlanoidQueryCurrentAddr */
5029 /*----------------------------------------------------------------------------*/
5030 /*! \brief This routine is called to query NIC link speed.
5032 * \param[in] pvAdapter Pointer to the Adapter structure
5033 * \param[in] pvQueryBuf A pointer to the buffer that holds the result of the
5035 * \param[in] u4QueryBufLen The length of the query buffer
5036 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
5037 * bytes written into the query buffer. If the call
5038 * failed due to invalid length of the query buffer,
5039 * returns the amount of storage needed.
5041 * \retval WLAN_STATUS_SUCCESS
5042 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
5045 /*----------------------------------------------------------------------------*/
5047 wlanoidQueryLinkSpeed(
5048 IN P_ADAPTER_T prAdapter,
5049 IN PVOID pvQueryBuffer,
5050 IN UINT_32 u4QueryBufferLen,
5051 OUT PUINT_32 pu4QueryInfoLen
5054 DEBUGFUNC("wlanoidQueryLinkSpeed");
5058 ASSERT(pu4QueryInfoLen);
5059 if (u4QueryBufferLen) {
5060 ASSERT(pvQueryBuffer);
5063 *pu4QueryInfoLen = sizeof(UINT_32);
5065 if (u4QueryBufferLen < sizeof(UINT_32)) {
5066 return WLAN_STATUS_BUFFER_TOO_SHORT;
5069 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_CONNECTED) {
5070 *(PUINT_32)pvQueryBuffer = 10000; // change to unit of 100bps
5071 return WLAN_STATUS_SUCCESS;
5073 else if (prAdapter->fgIsLinkRateValid == TRUE &&
5074 (kalGetTimeTick() - prAdapter->rLinkRateUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
5075 *(PUINT_32)pvQueryBuffer = prAdapter->rLinkQuality.u2LinkSpeed * 5000; // change to unit of 100bps
5076 return WLAN_STATUS_SUCCESS;
5079 return wlanSendSetQueryCmd(prAdapter,
5080 CMD_ID_GET_LINK_QUALITY,
5084 nicCmdEventQueryLinkSpeed,
5085 nicOidCmdTimeoutCommon,
5092 } /* end of wlanoidQueryLinkSpeed() */
5095 /*----------------------------------------------------------------------------*/
5097 * \brief This routine is called to query MCR value.
5099 * \param[in] pvAdapter Pointer to the Adapter structure.
5100 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
5102 * \param[in] u4QueryBufLen The length of the query buffer.
5103 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
5104 * bytes written into the query buffer. If the call
5105 * failed due to invalid length of the query buffer,
5106 * returns the amount of storage needed.
5108 * \retval WLAN_STATUS_SUCCESS
5109 * \retval WLAN_STATUS_INVALID_LENGTH
5111 /*----------------------------------------------------------------------------*/
5113 wlanoidQueryMcrRead (
5114 IN P_ADAPTER_T prAdapter,
5115 IN PVOID pvQueryBuffer,
5116 IN UINT_32 u4QueryBufferLen,
5117 OUT PUINT_32 pu4QueryInfoLen
5120 P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrRdInfo;
5121 CMD_ACCESS_REG rCmdAccessReg;
5123 DEBUGFUNC("wlanoidQueryMcrRead");
5124 DBGLOG(INIT, LOUD,("\n"));
5127 ASSERT(pu4QueryInfoLen);
5128 if (u4QueryBufferLen) {
5129 ASSERT(pvQueryBuffer);
5132 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T);
5134 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T)) {
5135 return WLAN_STATUS_INVALID_LENGTH;
5138 prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T)pvQueryBuffer;
5140 /* 0x9000 - 0x9EFF reserved for FW */
5141 #if CFG_SUPPORT_SWCR
5142 if((prMcrRdInfo->u4McrOffset >>16) == 0x9F00) {
5143 swCrReadWriteCmd(prAdapter,
5145 (UINT_16) (prMcrRdInfo->u4McrOffset & BITS(0,15)),
5146 &prMcrRdInfo->u4McrData);
5147 return WLAN_STATUS_SUCCESS;
5149 #endif /* CFG_SUPPORT_SWCR */
5151 /* Check if access F/W Domain MCR (due to WiFiSYS is placed from 0x6000-0000*/
5152 if (prMcrRdInfo->u4McrOffset & 0xFFFF0000){
5154 rCmdAccessReg.u4Address = prMcrRdInfo->u4McrOffset;
5155 rCmdAccessReg.u4Data = 0;
5157 return wlanSendSetQueryCmd(prAdapter,
5162 nicCmdEventQueryMcrRead,
5163 nicOidCmdTimeoutCommon,
5164 sizeof(CMD_ACCESS_REG),
5165 (PUINT_8)&rCmdAccessReg,
5171 HAL_MCR_RD(prAdapter,
5172 prMcrRdInfo->u4McrOffset & BITS(2,31), //address is in DWORD unit
5173 &prMcrRdInfo->u4McrData);
5175 DBGLOG(INIT, TRACE, ("MCR Read: Offset = %#08lx, Data = %#08lx\n",
5176 prMcrRdInfo->u4McrOffset, prMcrRdInfo->u4McrData));
5177 return WLAN_STATUS_SUCCESS;
5179 } /* end of wlanoidQueryMcrRead() */
5182 /*----------------------------------------------------------------------------*/
5184 * \brief This routine is called to write MCR and enable specific function.
5186 * \param[in] prAdapter Pointer to the Adapter structure.
5187 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
5188 * \param[in] u4SetBufferLen The length of the set buffer.
5189 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
5190 * bytes read from the set buffer. If the call failed
5191 * due to invalid length of the set buffer, returns
5192 * the amount of storage needed.
5194 * \retval WLAN_STATUS_SUCCESS
5195 * \retval WLAN_STATUS_INVALID_LENGTH
5197 /*----------------------------------------------------------------------------*/
5199 wlanoidSetMcrWrite (
5200 IN P_ADAPTER_T prAdapter,
5201 IN PVOID pvSetBuffer,
5202 IN UINT_32 u4SetBufferLen,
5203 OUT PUINT_32 pu4SetInfoLen
5206 P_PARAM_CUSTOM_MCR_RW_STRUC_T prMcrWrInfo;
5207 CMD_ACCESS_REG rCmdAccessReg;
5209 #if CFG_STRESS_TEST_SUPPORT
5210 P_AIS_FSM_INFO_T prAisFsmInfo;
5211 P_BSS_INFO_T prBssInfo = &(prAdapter->rWifiVar.arBssInfo[(NETWORK_TYPE_AIS_INDEX)]);
5212 P_STA_RECORD_T prStaRec = prBssInfo->prStaRecOfAP;
5213 UINT_32 u4McrOffset, u4McrData;
5216 DEBUGFUNC("wlanoidSetMcrWrite");
5217 DBGLOG(INIT, LOUD,("\n"));
5220 ASSERT(pu4SetInfoLen);
5222 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T);
5224 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_MCR_RW_STRUC_T)) {
5225 return WLAN_STATUS_INVALID_LENGTH;
5228 ASSERT(pvSetBuffer);
5230 prMcrWrInfo = (P_PARAM_CUSTOM_MCR_RW_STRUC_T)pvSetBuffer;
5232 /* 0x9000 - 0x9EFF reserved for FW */
5233 /* 0xFFFE reserved for FW */
5235 // -- Puff Stress Test Begin
5236 #if CFG_STRESS_TEST_SUPPORT
5238 // 0xFFFFFFFE for Control Rate
5239 if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFE){
5240 if(prMcrWrInfo->u4McrData < FIXED_RATE_NUM && prMcrWrInfo->u4McrData > 0){
5241 prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T)(prMcrWrInfo->u4McrData);
5243 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
5244 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
5245 DEBUGFUNC("[Stress Test]Complete Rate is Changed...\n");
5246 DBGLOG(INIT, TRACE, ("[Stress Test] Rate is Changed to index %d...\n", prAdapter->rWifiVar.eRateSetting));
5249 // 0xFFFFFFFD for Switch Channel
5250 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFD){
5251 if(prMcrWrInfo->u4McrData <= 11 && prMcrWrInfo->u4McrData >= 1){
5252 prBssInfo->ucPrimaryChannel = prMcrWrInfo->u4McrData;
5254 nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
5255 DBGLOG(INIT, TRACE, ("[Stress Test] Channel is switched to %d ...\n", prBssInfo->ucPrimaryChannel));
5257 return WLAN_STATUS_SUCCESS;
5260 // 0xFFFFFFFFC for Control RF Band and SCO
5261 else if(prMcrWrInfo->u4McrOffset == 0xFFFFFFFC){
5263 if(prMcrWrInfo->u4McrData & 0x80000000){
5264 //prBssInfo->eBand = BAND_5G;
5265 //prBssInfo->ucPrimaryChannel = 52; // Bond to Channel 52
5267 prBssInfo->eBand = BAND_2G4;
5268 prBssInfo->ucPrimaryChannel = 8; // Bond to Channel 6
5272 if(prMcrWrInfo->u4McrData & 0x00010000){
5273 prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH;
5274 prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT;
5276 if(prMcrWrInfo->u4McrData == 0x00010002){
5277 prBssInfo->eBssSCO = CHNL_EXT_SCB; // U20
5278 prBssInfo->ucPrimaryChannel += 2;
5279 } else if (prMcrWrInfo->u4McrData == 0x00010001){
5280 prBssInfo->eBssSCO = CHNL_EXT_SCA; // L20
5281 prBssInfo->ucPrimaryChannel -= 2;
5283 prBssInfo->eBssSCO = CHNL_EXT_SCA; // 40
5287 if(prMcrWrInfo->u4McrData & 0x00000000){
5288 prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
5289 prBssInfo->eBssSCO = CHNL_EXT_SCN;
5291 rlmBssInitForAPandIbss(prAdapter, prBssInfo);
5294 // 0xFFFFFFFB for HT Capability
5295 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFB){
5296 /* Enable HT Capability */
5297 if(prMcrWrInfo->u4McrData & 0x00000001){
5298 prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
5299 DEBUGFUNC("[Stress Test]Enable HT capability...\n");
5301 prStaRec->u2HtCapInfo &= (~HT_CAP_INFO_HT_GF);
5302 DEBUGFUNC("[Stress Test]Disable HT capability...\n");
5304 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
5305 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
5308 // 0xFFFFFFFA for Enable Random Rx Reset
5309 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFFA){
5310 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5311 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5313 return wlanSendSetQueryCmd(
5315 CMD_ID_RANDOM_RX_RESET_EN,
5319 nicCmdEventSetCommon,
5320 nicOidCmdTimeoutCommon,
5321 sizeof(CMD_ACCESS_REG),
5322 (PUINT_8)&rCmdAccessReg,
5328 // 0xFFFFFFF9 for Disable Random Rx Reset
5329 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF9){
5330 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5331 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5333 return wlanSendSetQueryCmd(
5335 CMD_ID_RANDOM_RX_RESET_DE,
5339 nicCmdEventSetCommon,
5340 nicOidCmdTimeoutCommon,
5341 sizeof(CMD_ACCESS_REG),
5342 (PUINT_8)&rCmdAccessReg,
5348 // 0xFFFFFFF8 for Enable SAPP
5349 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF8){
5350 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5351 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5353 return wlanSendSetQueryCmd(
5359 nicCmdEventSetCommon,
5360 nicOidCmdTimeoutCommon,
5361 sizeof(CMD_ACCESS_REG),
5362 (PUINT_8)&rCmdAccessReg,
5368 // 0xFFFFFFF7 for Disable SAPP
5369 else if (prMcrWrInfo->u4McrOffset == 0xFFFFFFF7){
5370 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5371 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5373 return wlanSendSetQueryCmd(
5379 nicCmdEventSetCommon,
5380 nicOidCmdTimeoutCommon,
5381 sizeof(CMD_ACCESS_REG),
5382 (PUINT_8)&rCmdAccessReg,
5390 // -- Puff Stress Test End
5393 /* Check if access F/W Domain MCR */
5394 if (prMcrWrInfo->u4McrOffset & 0xFFFF0000){
5396 /* 0x9000 - 0x9EFF reserved for FW */
5397 #if CFG_SUPPORT_SWCR
5398 if((prMcrWrInfo->u4McrOffset >> 16) == 0x9F00) {
5399 swCrReadWriteCmd(prAdapter,
5401 (UINT_16) (prMcrWrInfo->u4McrOffset & BITS(0,15)),
5402 &prMcrWrInfo->u4McrData);
5403 return WLAN_STATUS_SUCCESS;
5405 #endif /* CFG_SUPPORT_SWCR */
5409 // low power test special command
5410 if (prMcrWrInfo->u4McrOffset == 0x11111110){
5411 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5412 //DbgPrint("Enter test mode\n");
5413 prAdapter->fgTestMode = TRUE;
5416 if (prMcrWrInfo->u4McrOffset == 0x11111111){
5417 //DbgPrint("nicpmSetAcpiPowerD3\n");
5419 nicpmSetAcpiPowerD3(prAdapter);
5420 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD3);
5421 return WLAN_STATUS_SUCCESS;
5423 if (prMcrWrInfo->u4McrOffset == 0x11111112){
5425 //DbgPrint("LP enter sleep\n");
5428 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5429 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5431 return wlanSendSetQueryCmd(prAdapter,
5436 nicCmdEventSetCommon,
5437 nicOidCmdTimeoutCommon,
5438 sizeof(CMD_ACCESS_REG),
5439 (PUINT_8)&rCmdAccessReg,
5447 // low power test special command
5448 if (prMcrWrInfo->u4McrOffset == 0x11111110){
5449 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
5450 //DbgPrint("Enter test mode\n");
5451 prAdapter->fgTestMode = TRUE;
5454 if (prMcrWrInfo->u4McrOffset == 0x11111111){
5455 //DbgPrint("nicpmSetAcpiPowerD3\n");
5457 nicpmSetAcpiPowerD3(prAdapter);
5458 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD3);
5459 return WLAN_STATUS_SUCCESS;
5461 if (prMcrWrInfo->u4McrOffset == 0x11111112){
5463 //DbgPrint("LP enter sleep\n");
5466 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5467 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5469 return wlanSendSetQueryCmd(prAdapter,
5474 nicCmdEventSetCommon,
5475 nicOidCmdTimeoutCommon,
5476 sizeof(CMD_ACCESS_REG),
5477 (PUINT_8)&rCmdAccessReg,
5485 rCmdAccessReg.u4Address = prMcrWrInfo->u4McrOffset;
5486 rCmdAccessReg.u4Data = prMcrWrInfo->u4McrData;
5488 return wlanSendSetQueryCmd(prAdapter,
5493 nicCmdEventSetCommon,
5494 nicOidCmdTimeoutCommon,
5495 sizeof(CMD_ACCESS_REG),
5496 (PUINT_8)&rCmdAccessReg,
5502 HAL_MCR_WR(prAdapter,
5503 (prMcrWrInfo->u4McrOffset & BITS(2,31)), //address is in DWORD unit
5504 prMcrWrInfo->u4McrData);
5506 DBGLOG(INIT, TRACE, ("MCR Write: Offset = %#08lx, Data = %#08lx\n",
5507 prMcrWrInfo->u4McrOffset, prMcrWrInfo->u4McrData));
5509 return WLAN_STATUS_SUCCESS;
5511 } /* wlanoidSetMcrWrite */
5513 /*----------------------------------------------------------------------------*/
5515 * \brief This routine is called to query SW CTRL
5517 * \param[in] pvAdapter Pointer to the Adapter structure.
5518 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
5520 * \param[in] u4QueryBufLen The length of the query buffer.
5521 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
5522 * bytes written into the query buffer. If the call
5523 * failed due to invalid length of the query buffer,
5524 * returns the amount of storage needed.
5526 * \retval WLAN_STATUS_SUCCESS
5527 * \retval WLAN_STATUS_INVALID_LENGTH
5529 /*----------------------------------------------------------------------------*/
5531 wlanoidQuerySwCtrlRead (
5532 IN P_ADAPTER_T prAdapter,
5533 IN PVOID pvQueryBuffer,
5534 IN UINT_32 u4QueryBufferLen,
5535 OUT PUINT_32 pu4QueryInfoLen
5538 P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo;
5539 WLAN_STATUS rWlanStatus;
5540 UINT_16 u2Id, u2SubId;
5543 CMD_SW_DBG_CTRL_T rCmdSwCtrl;
5545 DEBUGFUNC("wlanoidQuerySwCtrlRead");
5546 DBGLOG(INIT, LOUD,("\n"));
5549 ASSERT(pu4QueryInfoLen);
5550 if (u4QueryBufferLen) {
5551 ASSERT(pvQueryBuffer);
5554 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T);
5556 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T)) {
5557 return WLAN_STATUS_INVALID_LENGTH;
5560 prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T)pvQueryBuffer;
5562 u2Id = (UINT_16)(prSwCtrlInfo->u4Id >> 16);
5563 u2SubId = (UINT_16)(prSwCtrlInfo->u4Id & BITS(0,15));
5565 rWlanStatus = WLAN_STATUS_SUCCESS;
5568 /* 0x9000 - 0x9EFF reserved for FW */
5569 /* 0xFFFE reserved for FW */
5571 #if CFG_SUPPORT_SWCR
5573 swCrReadWriteCmd(prAdapter,
5574 SWCR_READ/* Read */,
5578 #endif /* CFG_SUPPORT_SWCR */
5582 u4Data = 0x5AA56620;
5589 rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
5590 rCmdSwCtrl.u4Data = 0;
5591 rWlanStatus = wlanSendSetQueryCmd(prAdapter,
5596 nicCmdEventQuerySwCtrlRead,
5597 nicOidCmdTimeoutCommon,
5598 sizeof(CMD_SW_DBG_CTRL_T),
5599 (PUINT_8)&rCmdSwCtrl,
5606 prSwCtrlInfo->u4Data = u4Data;
5611 /* end of wlanoidQuerySwCtrlRead() */
5614 /*----------------------------------------------------------------------------*/
5616 * \brief This routine is called to write SW CTRL
5618 * \param[in] prAdapter Pointer to the Adapter structure.
5619 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
5620 * \param[in] u4SetBufferLen The length of the set buffer.
5621 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
5622 * bytes read from the set buffer. If the call failed
5623 * due to invalid length of the set buffer, returns
5624 * the amount of storage needed.
5626 * \retval WLAN_STATUS_SUCCESS
5627 * \retval WLAN_STATUS_INVALID_LENGTH
5629 /*----------------------------------------------------------------------------*/
5631 wlanoidSetSwCtrlWrite (
5632 IN P_ADAPTER_T prAdapter,
5633 IN PVOID pvSetBuffer,
5634 IN UINT_32 u4SetBufferLen,
5635 OUT PUINT_32 pu4SetInfoLen
5638 P_PARAM_CUSTOM_SW_CTRL_STRUC_T prSwCtrlInfo;
5639 CMD_SW_DBG_CTRL_T rCmdSwCtrl;
5640 WLAN_STATUS rWlanStatus;
5641 UINT_16 u2Id, u2SubId;
5644 DEBUGFUNC("wlanoidSetSwCtrlWrite");
5645 DBGLOG(INIT, LOUD,("\n"));
5648 ASSERT(pu4SetInfoLen);
5650 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T);
5652 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_SW_CTRL_STRUC_T)) {
5653 return WLAN_STATUS_INVALID_LENGTH;
5656 ASSERT(pvSetBuffer);
5658 prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUC_T)pvSetBuffer;
5660 u2Id = (UINT_16)(prSwCtrlInfo->u4Id >> 16);
5661 u2SubId = (UINT_16)(prSwCtrlInfo->u4Id & BITS(0,15));
5662 u4Data = prSwCtrlInfo->u4Data;
5663 rWlanStatus = WLAN_STATUS_SUCCESS;
5667 /* 0x9000 - 0x9EFF reserved for FW */
5668 /* 0xFFFE reserved for FW */
5670 #if CFG_SUPPORT_SWCR
5672 swCrReadWriteCmd(prAdapter,
5677 #endif /* CFG_SUPPORT_SWCR */
5680 if (u2SubId == 0x8000) {
5681 // CTIA power save mode setting (code: 0x10008000)
5682 prAdapter->u4CtiaPowerMode = u4Data;
5683 prAdapter->fgEnCtiaPowerMode = TRUE;
5687 PARAM_POWER_MODE ePowerMode;
5689 if (prAdapter->u4CtiaPowerMode == 0) {
5690 // force to keep in CAM mode
5691 ePowerMode = Param_PowerModeCAM;
5692 } else if (prAdapter->u4CtiaPowerMode == 1) {
5693 ePowerMode = Param_PowerModeMAX_PSP;
5695 ePowerMode = Param_PowerModeFast_PSP;
5698 nicConfigPowerSaveProfile(
5700 NETWORK_TYPE_AIS_INDEX,
5707 if(u2SubId == 0x0) {
5708 prAdapter->fgEnOnlineScan = (BOOLEAN)u4Data;
5710 else if(u2SubId == 0x1) {
5711 prAdapter->fgDisBcnLostDetection = (BOOLEAN)u4Data;
5713 else if(u2SubId == 0x2) {
5714 prAdapter->rWifiVar.fgSupportUAPSD = (BOOLEAN)u4Data;
5716 else if(u2SubId == 0x3) {
5717 prAdapter->u4UapsdAcBmp = u4Data & BITS(0,15);
5718 prAdapter->rWifiVar.arBssInfo[u4Data>>16].rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
5719 prAdapter->rWifiVar.arBssInfo[u4Data>>16].rPmProfSetupInfo.ucBmpTriggerAC = (UINT_8)prAdapter->u4UapsdAcBmp;
5721 else if(u2SubId == 0x4) {
5722 prAdapter->fgDisStaAgingTimeoutDetection = (BOOLEAN)u4Data;
5724 else if(u2SubId == 0x5) {
5725 prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode = (UINT_8)u4Data;
5727 else if(u2SubId == 0x0100) {
5728 prAdapter->rWifiVar.u8SupportRxGf = (UINT_8)u4Data;
5730 else if(u2SubId == 0x0101) {
5731 prAdapter->rWifiVar.u8SupportRxSgi20 = (UINT_8)u4Data;
5732 prAdapter->rWifiVar.u8SupportRxSgi40 = (UINT_8)u4Data;
5738 #if CFG_SUPPORT_SWCR
5740 if(u2SubId == 0x0) {
5742 u4Data = BIT(HIF_RX_PKT_TYPE_MANAGEMENT);
5744 swCrFrameCheckEnable(prAdapter, u4Data);
5746 else if(u2SubId == 0x1) {
5751 fgIsEnable = (BOOLEAN)(u4Data & 0xff);
5752 ucType = 0;//((u4Data>>4) & 0xf);
5753 u4Timeout = ((u4Data>>8) & 0xff);
5754 swCrDebugCheckEnable(prAdapter, fgIsEnable, ucType, u4Timeout);
5759 #if CFG_SUPPORT_802_11W
5761 DBGLOG(RSN, INFO, ("802.11w test 0x%x\n", u2SubId));
5762 if (u2SubId == 0x0) {
5763 rsnStartSaQuery(prAdapter);
5765 if (u2SubId == 0x1) {
5766 rsnStopSaQuery(prAdapter);
5768 if (u2SubId == 0x2) {
5769 rsnSaQueryRequest(prAdapter, NULL);
5771 if (u2SubId == 0x3) {
5772 P_BSS_INFO_T prBssInfo = &(prAdapter->rWifiVar.arBssInfo[(NETWORK_TYPE_AIS_INDEX)]);
5773 authSendDeauthFrame(prAdapter, prBssInfo->prStaRecOfAP , NULL, 7, NULL);
5777 if (u2SubId == 0x3) {
5778 prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_DISABLED;
5780 if (u2SubId == 0x4) {
5781 //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
5782 prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_OPTIONAL;
5784 if (u2SubId == 0x5) {
5785 //prAdapter->rWifiVar.rAisSpecificBssInfo.fgMgmtProtection = TRUE;
5786 prAdapter->prGlueInfo->rWpaInfo.u4Mfp = RSN_AUTH_MFP_REQUIRED;
5793 CMD_ACCESS_REG rCmdAccessReg;
5794 #if 1 //CFG_MT6573_SMT_TEST
5795 if (u2SubId == 0x0123) {
5797 DBGLOG(HAL, INFO, ("set smt fixed rate: %d \n", u4Data));
5799 if((ENUM_REGISTRY_FIXED_RATE_T)(u4Data) < FIXED_RATE_NUM) {
5800 prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T)(u4Data);
5803 prAdapter->rWifiVar.eRateSetting = FIXED_RATE_NONE;
5806 if(prAdapter->rWifiVar.eRateSetting == FIXED_RATE_NONE) {
5807 /* Enable Auto (Long/Short) Preamble */
5808 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_AUTO;
5810 else if((prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_20M_400NS &&
5811 prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS7_20M_400NS)
5812 || (prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_40M_400NS &&
5813 prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS32_400NS)) {
5814 /* Force Short Preamble */
5815 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_SHORT;
5818 /* Force Long Preamble */
5819 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_LONG;
5822 /* abort to re-connect */
5824 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
5825 WLAN_STATUS_MEDIA_DISCONNECT,
5829 aisBssBeaconTimeout(prAdapter);
5832 return WLAN_STATUS_SUCCESS;
5835 else if (u2SubId == 0x1234) {
5836 // 1. Disable On-Lin Scan
5837 prAdapter->fgEnOnlineScan = FALSE;
5839 // 3. Disable FIFO FULL no ack
5840 rCmdAccessReg.u4Address = 0x60140028;
5841 rCmdAccessReg.u4Data = 0x904;
5842 wlanSendSetQueryCmd(prAdapter,
5847 nicCmdEventSetCommon,
5848 nicOidCmdTimeoutCommon,
5849 sizeof(CMD_ACCESS_REG),
5850 (PUINT_8)&rCmdAccessReg,
5855 // 4. Disable Roaming
5856 rCmdSwCtrl.u4Id = 0x90000204;
5857 rCmdSwCtrl.u4Data = 0x0;
5858 wlanSendSetQueryCmd(prAdapter,
5863 nicCmdEventSetCommon,
5864 nicOidCmdTimeoutCommon,
5865 sizeof(CMD_SW_DBG_CTRL_T),
5866 (PUINT_8)&rCmdSwCtrl,
5871 rCmdSwCtrl.u4Id = 0x90000200;
5872 rCmdSwCtrl.u4Data = 0x820000;
5873 wlanSendSetQueryCmd(prAdapter,
5878 nicCmdEventSetCommon,
5879 nicOidCmdTimeoutCommon,
5880 sizeof(CMD_SW_DBG_CTRL_T),
5881 (PUINT_8)&rCmdSwCtrl,
5886 // Disalbe auto tx power
5888 rCmdSwCtrl.u4Id = 0xa0100003;
5889 rCmdSwCtrl.u4Data = 0x0;
5890 wlanSendSetQueryCmd(prAdapter,
5895 nicCmdEventSetCommon,
5896 nicOidCmdTimeoutCommon,
5897 sizeof(CMD_SW_DBG_CTRL_T),
5898 (PUINT_8)&rCmdSwCtrl,
5905 // 2. Keep at CAM mode
5907 PARAM_POWER_MODE ePowerMode;
5909 prAdapter->u4CtiaPowerMode = 0;
5910 prAdapter->fgEnCtiaPowerMode = TRUE;
5912 ePowerMode = Param_PowerModeCAM;
5913 rWlanStatus = nicConfigPowerSaveProfile(
5915 NETWORK_TYPE_AIS_INDEX,
5920 // 5. Disable Beacon Timeout Detection
5921 prAdapter->fgDisBcnLostDetection = TRUE;
5923 else if (u2SubId == 0x1235) {
5925 // 1. Enaable On-Lin Scan
5926 prAdapter->fgEnOnlineScan = TRUE;
5928 // 3. Enable FIFO FULL no ack
5929 rCmdAccessReg.u4Address = 0x60140028;
5930 rCmdAccessReg.u4Data = 0x905;
5931 wlanSendSetQueryCmd(prAdapter,
5936 nicCmdEventSetCommon,
5937 nicOidCmdTimeoutCommon,
5938 sizeof(CMD_ACCESS_REG),
5939 (PUINT_8)&rCmdAccessReg,
5944 // 4. Enable Roaming
5945 rCmdSwCtrl.u4Id = 0x90000204;
5946 rCmdSwCtrl.u4Data = 0x1;
5947 wlanSendSetQueryCmd(prAdapter,
5952 nicCmdEventSetCommon,
5953 nicOidCmdTimeoutCommon,
5954 sizeof(CMD_SW_DBG_CTRL_T),
5955 (PUINT_8)&rCmdSwCtrl,
5960 rCmdSwCtrl.u4Id = 0x90000200;
5961 rCmdSwCtrl.u4Data = 0x820000;
5962 wlanSendSetQueryCmd(prAdapter,
5967 nicCmdEventSetCommon,
5968 nicOidCmdTimeoutCommon,
5969 sizeof(CMD_SW_DBG_CTRL_T),
5970 (PUINT_8)&rCmdSwCtrl,
5975 // Enable auto tx power
5978 rCmdSwCtrl.u4Id = 0xa0100003;
5979 rCmdSwCtrl.u4Data = 0x1;
5980 wlanSendSetQueryCmd(prAdapter,
5985 nicCmdEventSetCommon,
5986 nicOidCmdTimeoutCommon,
5987 sizeof(CMD_SW_DBG_CTRL_T),
5988 (PUINT_8)&rCmdSwCtrl,
5994 // 2. Keep at Fast PS
5996 PARAM_POWER_MODE ePowerMode;
5998 prAdapter->u4CtiaPowerMode = 2;
5999 prAdapter->fgEnCtiaPowerMode = TRUE;
6001 ePowerMode = Param_PowerModeFast_PSP;
6002 rWlanStatus = nicConfigPowerSaveProfile(
6004 NETWORK_TYPE_AIS_INDEX,
6009 // 5. Enable Beacon Timeout Detection
6010 prAdapter->fgDisBcnLostDetection = FALSE;
6019 rCmdSwCtrl.u4Id = prSwCtrlInfo->u4Id;
6020 rCmdSwCtrl.u4Data = prSwCtrlInfo->u4Data;
6021 rWlanStatus = wlanSendSetQueryCmd(prAdapter,
6026 nicCmdEventSetCommon,
6027 nicOidCmdTimeoutCommon,
6028 sizeof(CMD_SW_DBG_CTRL_T),
6029 (PUINT_8)&rCmdSwCtrl,
6034 } /* switch(u2Id) */
6038 /* wlanoidSetSwCtrlWrite */
6041 /*----------------------------------------------------------------------------*/
6043 * \brief This routine is called to query EEPROM value.
6045 * \param[in] pvAdapter Pointer to the Adapter structure.
6046 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6048 * \param[in] u4QueryBufLen The length of the query buffer.
6049 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6050 * bytes written into the query buffer. If the call
6051 * failed due to invalid length of the query buffer,
6052 * returns the amount of storage needed.
6054 * \retval WLAN_STATUS_SUCCESS
6055 * \retval WLAN_STATUS_FAILURE
6057 /*----------------------------------------------------------------------------*/
6059 wlanoidQueryEepromRead (
6060 IN P_ADAPTER_T prAdapter,
6061 IN PVOID pvQueryBuffer,
6062 IN UINT_32 u4QueryBufferLen,
6063 OUT PUINT_32 pu4QueryInfoLen
6066 P_PARAM_CUSTOM_EEPROM_RW_STRUC_T prEepromRwInfo;
6067 CMD_ACCESS_EEPROM rCmdAccessEeprom;
6069 DEBUGFUNC("wlanoidQueryEepromRead");
6072 ASSERT(pu4QueryInfoLen);
6073 if (u4QueryBufferLen) {
6074 ASSERT(pvQueryBuffer);
6077 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T);
6079 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T)) {
6080 return WLAN_STATUS_INVALID_LENGTH;
6083 prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUC_T)pvQueryBuffer;
6085 kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
6086 rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
6088 return wlanSendSetQueryCmd(prAdapter,
6089 CMD_ID_ACCESS_EEPROM,
6093 nicCmdEventQueryEepromRead,
6094 nicOidCmdTimeoutCommon,
6095 sizeof(CMD_ACCESS_EEPROM),
6096 (PUINT_8)&rCmdAccessEeprom,
6101 } /* wlanoidQueryEepromRead */
6104 /*----------------------------------------------------------------------------*/
6106 * \brief This routine is called to write EEPROM value.
6108 * \param[in] prAdapter Pointer to the Adapter structure.
6109 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
6110 * \param[in] u4SetBufferLen The length of the set buffer.
6111 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
6112 * bytes read from the set buffer. If the call failed
6113 * due to invalid length of the set buffer, returns
6114 * the amount of storage needed.
6116 * \retval WLAN_STATUS_SUCCESS
6117 * \retval WLAN_STATUS_FAILURE
6119 /*----------------------------------------------------------------------------*/
6121 wlanoidSetEepromWrite (
6122 IN P_ADAPTER_T prAdapter,
6123 IN PVOID pvSetBuffer,
6124 IN UINT_32 u4SetBufferLen,
6125 OUT PUINT_32 pu4SetInfoLen
6128 P_PARAM_CUSTOM_EEPROM_RW_STRUC_T prEepromRwInfo;
6129 CMD_ACCESS_EEPROM rCmdAccessEeprom;
6131 DEBUGFUNC("wlanoidSetEepromWrite");
6132 DBGLOG(INIT, LOUD,("\n"));
6135 ASSERT(pu4SetInfoLen);
6137 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T);
6139 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T)) {
6140 return WLAN_STATUS_INVALID_LENGTH;
6143 ASSERT(pvSetBuffer);
6145 prEepromRwInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUC_T)pvSetBuffer;
6147 kalMemZero(&rCmdAccessEeprom, sizeof(CMD_ACCESS_EEPROM));
6148 rCmdAccessEeprom.u2Offset = prEepromRwInfo->ucEepromIndex;
6149 rCmdAccessEeprom.u2Data = prEepromRwInfo->u2EepromData;
6151 return wlanSendSetQueryCmd(prAdapter,
6152 CMD_ID_ACCESS_EEPROM,
6156 nicCmdEventSetCommon,
6157 nicOidCmdTimeoutCommon,
6158 sizeof(CMD_ACCESS_EEPROM),
6159 (PUINT_8)&rCmdAccessEeprom,
6164 } /* wlanoidSetEepromWrite */
6167 /*----------------------------------------------------------------------------*/
6169 * \brief This routine is called to query the number of the successfully transmitted
6172 * \param[in] pvAdapter Pointer to the Adapter structure.
6173 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6175 * \param[in] u4QueryBufLen The length of the query buffer.
6176 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6177 * bytes written into the query buffer. If the call
6178 * failed due to invalid length of the query buffer,
6179 * returns the amount of storage needed.
6181 * \retval WLAN_STATUS_SUCCESS
6182 * \retval WLAN_STATUS_INVALID_LENGTH
6184 /*----------------------------------------------------------------------------*/
6186 wlanoidQueryXmitOk (
6187 IN P_ADAPTER_T prAdapter,
6188 IN PVOID pvQueryBuffer,
6189 IN UINT_32 u4QueryBufferLen,
6190 OUT PUINT_32 pu4QueryInfoLen
6193 DEBUGFUNC("wlanoidQueryXmitOk");
6194 DBGLOG(REQ, LOUD, ("\n"));
6197 if (u4QueryBufferLen) {
6198 ASSERT(pvQueryBuffer);
6200 ASSERT(pu4QueryInfoLen);
6202 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6203 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6204 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6205 *pu4QueryInfoLen = sizeof(UINT_32);
6206 return WLAN_STATUS_ADAPTER_NOT_READY;
6208 else if (u4QueryBufferLen < sizeof(UINT_32)
6209 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6210 *pu4QueryInfoLen = sizeof(UINT_64);
6211 return WLAN_STATUS_INVALID_LENGTH;
6214 #if CFG_ENABLE_STATISTICS_BUFFERING
6215 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6216 if(u4QueryBufferLen == sizeof(UINT_32)) {
6217 *pu4QueryInfoLen = sizeof(UINT_32);
6218 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
6221 *pu4QueryInfoLen = sizeof(UINT_64);
6222 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rTransmittedFragmentCount.QuadPart;
6225 return WLAN_STATUS_SUCCESS;
6230 return wlanSendSetQueryCmd(prAdapter,
6231 CMD_ID_GET_STATISTICS,
6235 nicCmdEventQueryXmitOk,
6236 nicOidCmdTimeoutCommon,
6243 } /* wlanoidQueryXmitOk */
6246 /*----------------------------------------------------------------------------*/
6248 * \brief This routine is called to query the number of the successfully received
6251 * \param[in] pvAdapter Pointer to the Adapter structure.
6252 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6254 * \param[in] u4QueryBufLen The length of the query buffer.
6255 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6256 * bytes written into the query buffer. If the call
6257 * failed due to invalid length of the query buffer,
6258 * returns the amount of storage needed.
6260 * \retval WLAN_STATUS_SUCCESS
6261 * \retval WLAN_STATUS_INVALID_LENGTH
6263 /*----------------------------------------------------------------------------*/
6266 IN P_ADAPTER_T prAdapter,
6267 IN PVOID pvQueryBuffer,
6268 IN UINT_32 u4QueryBufferLen,
6269 OUT PUINT_32 pu4QueryInfoLen
6272 DEBUGFUNC("wlanoidQueryRcvOk");
6273 DBGLOG(REQ, LOUD, ("\n"));
6276 if (u4QueryBufferLen) {
6277 ASSERT(pvQueryBuffer);
6279 ASSERT(pu4QueryInfoLen);
6281 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6282 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6283 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6284 *pu4QueryInfoLen = sizeof(UINT_32);
6285 return WLAN_STATUS_ADAPTER_NOT_READY;
6287 else if (u4QueryBufferLen < sizeof(UINT_32)
6288 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6289 *pu4QueryInfoLen = sizeof(UINT_64);
6290 return WLAN_STATUS_INVALID_LENGTH;
6293 #if CFG_ENABLE_STATISTICS_BUFFERING
6294 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6295 if(u4QueryBufferLen == sizeof(UINT_32)) {
6296 *pu4QueryInfoLen = sizeof(UINT_32);
6297 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
6300 *pu4QueryInfoLen = sizeof(UINT_64);
6301 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rReceivedFragmentCount.QuadPart;
6304 return WLAN_STATUS_SUCCESS;
6309 return wlanSendSetQueryCmd(prAdapter,
6310 CMD_ID_GET_STATISTICS,
6314 nicCmdEventQueryRecvOk,
6315 nicOidCmdTimeoutCommon,
6322 } /* wlanoidQueryRcvOk */
6325 /*----------------------------------------------------------------------------*/
6327 * \brief This routine is called to query the number of frames that the driver
6328 * fails to transmit.
6330 * \param[in] pvAdapter Pointer to the Adapter structure.
6331 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6333 * \param[in] u4QueryBufLen The length of the query buffer.
6334 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6335 * bytes written into the query buffer. If the call
6336 * failed due to invalid length of the query buffer,
6337 * returns the amount of storage needed.
6339 * \retval WLAN_STATUS_SUCCESS
6340 * \retval WLAN_STATUS_INVALID_LENGTH
6342 /*----------------------------------------------------------------------------*/
6344 wlanoidQueryXmitError (
6345 IN P_ADAPTER_T prAdapter,
6346 IN PVOID pvQueryBuffer,
6347 IN UINT_32 u4QueryBufferLen,
6348 OUT PUINT_32 pu4QueryInfoLen
6351 DEBUGFUNC("wlanoidQueryXmitError");
6352 DBGLOG(REQ, LOUD, ("\n"));
6355 if (u4QueryBufferLen) {
6356 ASSERT(pvQueryBuffer);
6358 ASSERT(pu4QueryInfoLen);
6360 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6361 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6362 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6363 *pu4QueryInfoLen = sizeof(UINT_32);
6364 return WLAN_STATUS_ADAPTER_NOT_READY;
6366 else if (u4QueryBufferLen < sizeof(UINT_32)
6367 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6368 *pu4QueryInfoLen = sizeof(UINT_64);
6369 return WLAN_STATUS_INVALID_LENGTH;
6372 #if CFG_ENABLE_STATISTICS_BUFFERING
6373 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6374 if(u4QueryBufferLen == sizeof(UINT_32)) {
6375 *pu4QueryInfoLen = sizeof(UINT_32);
6376 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
6379 *pu4QueryInfoLen = sizeof(UINT_64);
6380 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
6383 return WLAN_STATUS_SUCCESS;
6388 return wlanSendSetQueryCmd(prAdapter,
6389 CMD_ID_GET_STATISTICS,
6393 nicCmdEventQueryXmitError,
6394 nicOidCmdTimeoutCommon,
6401 } /* wlanoidQueryXmitError */
6404 /*----------------------------------------------------------------------------*/
6406 * \brief This routine is called to query the number of frames successfully
6407 * transmitted after exactly one collision.
6409 * \param[in] prAdapter Pointer to the Adapter structure.
6410 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6412 * \param[in] u4QueryBufLen The length of the query buffer.
6413 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6414 * bytes written into the query buffer. If the call
6415 * failed due to invalid length of the query buffer,
6416 * returns the amount of storage needed.
6418 * \retval WLAN_STATUS_SUCCESS
6419 * \retval WLAN_STATUS_INVALID_LENGTH
6421 /*----------------------------------------------------------------------------*/
6423 wlanoidQueryXmitOneCollision (
6424 IN P_ADAPTER_T prAdapter,
6425 IN PVOID pvQueryBuffer,
6426 IN UINT_32 u4QueryBufferLen,
6427 OUT PUINT_32 pu4QueryInfoLen
6430 DEBUGFUNC("wlanoidQueryXmitOneCollision");
6431 DBGLOG(REQ, LOUD, ("\n"));
6434 if (u4QueryBufferLen) {
6435 ASSERT(pvQueryBuffer);
6437 ASSERT(pu4QueryInfoLen);
6439 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6440 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6441 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6442 *pu4QueryInfoLen = sizeof(UINT_32);
6443 return WLAN_STATUS_ADAPTER_NOT_READY;
6445 else if (u4QueryBufferLen < sizeof(UINT_32)
6446 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6447 *pu4QueryInfoLen = sizeof(UINT_64);
6448 return WLAN_STATUS_INVALID_LENGTH;
6451 #if CFG_ENABLE_STATISTICS_BUFFERING
6452 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6453 if(u4QueryBufferLen == sizeof(UINT_32)) {
6454 *pu4QueryInfoLen = sizeof(UINT_32);
6455 *(PUINT_32) pvQueryBuffer = (UINT_32)
6456 (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart - prAdapter->rStatStruct.rRetryCount.QuadPart);
6459 *pu4QueryInfoLen = sizeof(UINT_64);
6460 *(PUINT_64) pvQueryBuffer = (UINT_64)
6461 (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart - prAdapter->rStatStruct.rRetryCount.QuadPart);
6464 return WLAN_STATUS_SUCCESS;
6469 return wlanSendSetQueryCmd(prAdapter,
6470 CMD_ID_GET_STATISTICS,
6474 nicCmdEventQueryXmitOneCollision,
6475 nicOidCmdTimeoutCommon,
6482 } /* wlanoidQueryXmitOneCollision */
6485 /*----------------------------------------------------------------------------*/
6487 * \brief This routine is called to query the number of frames successfully
6488 * transmitted after more than one collision.
6490 * \param[in] prAdapter Pointer to the Adapter structure.
6491 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
6493 * \param[in] u4QueryBufLen The length of the query buffer.
6494 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6495 * bytes written into the query buffer. If the call
6496 * failed due to invalid length of the query buffer,
6497 * returns the amount of storage needed.
6499 * \retval WLAN_STATUS_SUCCESS
6500 * \retval WLAN_STATUS_INVALID_LENGTH
6502 /*----------------------------------------------------------------------------*/
6504 wlanoidQueryXmitMoreCollisions (
6505 IN P_ADAPTER_T prAdapter,
6506 IN PVOID pvQueryBuffer,
6507 IN UINT_32 u4QueryBufferLen,
6508 OUT PUINT_32 pu4QueryInfoLen
6511 DEBUGFUNC("wlanoidQueryXmitMoreCollisions");
6512 DBGLOG(REQ, LOUD, ("\n"));
6515 if (u4QueryBufferLen) {
6516 ASSERT(pvQueryBuffer);
6518 ASSERT(pu4QueryInfoLen);
6520 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6521 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6522 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6523 *pu4QueryInfoLen = sizeof(UINT_32);
6524 return WLAN_STATUS_ADAPTER_NOT_READY;
6526 else if (u4QueryBufferLen < sizeof(UINT_32)
6527 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6528 *pu4QueryInfoLen = sizeof(UINT_64);
6529 return WLAN_STATUS_INVALID_LENGTH;
6532 #if CFG_ENABLE_STATISTICS_BUFFERING
6533 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6534 if(u4QueryBufferLen == sizeof(UINT_32)) {
6535 *pu4QueryInfoLen = sizeof(UINT_32);
6536 *(PUINT_32) pvQueryBuffer = (UINT_32) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
6539 *pu4QueryInfoLen = sizeof(UINT_64);
6540 *(PUINT_64) pvQueryBuffer = (UINT_64) (prAdapter->rStatStruct.rMultipleRetryCount.QuadPart);
6543 return WLAN_STATUS_SUCCESS;
6548 return wlanSendSetQueryCmd(prAdapter,
6549 CMD_ID_GET_STATISTICS,
6553 nicCmdEventQueryXmitMoreCollisions,
6554 nicOidCmdTimeoutCommon,
6561 } /* wlanoidQueryXmitMoreCollisions */
6564 /*----------------------------------------------------------------------------*/
6566 * \brief This routine is called to query the number of frames
6567 * not transmitted due to excessive collisions.
6569 * \param[in] prAdapter Pointer to the Adapter structure.
6570 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6572 * \param[in] u4QueryBufferLen The length of the query buffer.
6573 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6574 * bytes written into the query buffer. If the call
6575 * failed due to invalid length of the query buffer,
6576 * returns the amount of storage needed.
6578 * \retval WLAN_STATUS_SUCCESS
6579 * \retval WLAN_STATUS_INVALID_LENGTH
6581 /*----------------------------------------------------------------------------*/
6583 wlanoidQueryXmitMaxCollisions (
6584 IN P_ADAPTER_T prAdapter,
6585 IN PVOID pvQueryBuffer,
6586 IN UINT_32 u4QueryBufferLen,
6587 OUT PUINT_32 pu4QueryInfoLen
6590 DEBUGFUNC("wlanoidQueryXmitMaxCollisions");
6591 DBGLOG(REQ, LOUD, ("\n"));
6594 if (u4QueryBufferLen) {
6595 ASSERT(pvQueryBuffer);
6597 ASSERT(pu4QueryInfoLen);
6599 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6600 DBGLOG(REQ, WARN, ("Fail in query receive error! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6601 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6602 *pu4QueryInfoLen = sizeof(UINT_32);
6603 return WLAN_STATUS_ADAPTER_NOT_READY;
6605 else if (u4QueryBufferLen < sizeof(UINT_32)
6606 || (u4QueryBufferLen > sizeof(UINT_32) && u4QueryBufferLen < sizeof(UINT_64))) {
6607 *pu4QueryInfoLen = sizeof(UINT_64);
6608 return WLAN_STATUS_INVALID_LENGTH;
6611 #if CFG_ENABLE_STATISTICS_BUFFERING
6612 if(IsBufferedStatisticsUsable(prAdapter) == TRUE) {
6613 if(u4QueryBufferLen == sizeof(UINT_32)) {
6614 *pu4QueryInfoLen = sizeof(UINT_32);
6615 *(PUINT_32) pvQueryBuffer = (UINT_32) prAdapter->rStatStruct.rFailedCount.QuadPart;
6618 *pu4QueryInfoLen = sizeof(UINT_64);
6619 *(PUINT_64) pvQueryBuffer = (UINT_64) prAdapter->rStatStruct.rFailedCount.QuadPart;
6622 return WLAN_STATUS_SUCCESS;
6627 return wlanSendSetQueryCmd(prAdapter,
6628 CMD_ID_GET_STATISTICS,
6632 nicCmdEventQueryXmitMaxCollisions,
6633 nicOidCmdTimeoutCommon,
6640 } /* wlanoidQueryXmitMaxCollisions */
6643 #define MTK_CUSTOM_OID_INTERFACE_VERSION 0x00006620 // for WPDWifi DLL
6644 /*----------------------------------------------------------------------------*/
6646 * \brief This routine is called to query current the OID interface version,
6647 * which is the interface between the application and driver.
6649 * \param[in] prAdapter Pointer to the Adapter structure.
6650 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6652 * \param[in] u4QueryBufferLen The length of the query buffer.
6653 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6654 * bytes written into the query buffer. If the call
6655 * failed due to invalid length of the query buffer,
6656 * returns the amount of storage needed.
6658 * \retval WLAN_STATUS_SUCCESS
6660 /*----------------------------------------------------------------------------*/
6662 wlanoidQueryOidInterfaceVersion (
6663 IN P_ADAPTER_T prAdapter,
6664 IN PVOID pvQueryBuffer,
6665 IN UINT_32 u4QueryBufferLen,
6666 OUT PUINT_32 pu4QueryInfoLen)
6668 DEBUGFUNC("wlanoidQueryOidInterfaceVersion");
6671 if (u4QueryBufferLen) {
6672 ASSERT(pvQueryBuffer);
6674 ASSERT(pu4QueryInfoLen);
6676 *(PUINT_32) pvQueryBuffer = MTK_CUSTOM_OID_INTERFACE_VERSION ;
6677 *pu4QueryInfoLen = sizeof(UINT_32);
6679 DBGLOG(REQ, WARN, ("Custom OID interface version: %#08lX\n",
6680 *(PUINT_32) pvQueryBuffer));
6682 return WLAN_STATUS_SUCCESS;
6683 } /* wlanoidQueryOidInterfaceVersion */
6686 /*----------------------------------------------------------------------------*/
6688 * \brief This routine is called to query current Multicast Address List.
6690 * \param[in] prAdapter Pointer to the Adapter structure.
6691 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6693 * \param[in] u4QueryBufferLen The length of the query buffer.
6694 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6695 * bytes written into the query buffer. If the call
6696 * failed due to invalid length of the query buffer,
6697 * returns the amount of storage needed.
6699 * \retval WLAN_STATUS_SUCCESS
6700 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
6702 /*----------------------------------------------------------------------------*/
6704 wlanoidQueryMulticastList(
6705 IN P_ADAPTER_T prAdapter,
6706 OUT PVOID pvQueryBuffer,
6707 IN UINT_32 u4QueryBufferLen,
6708 OUT PUINT_32 pu4QueryInfoLen
6713 ASSERT(pu4QueryInfoLen);
6714 if (u4QueryBufferLen) {
6715 ASSERT(pvQueryBuffer);
6718 return wlanSendSetQueryCmd(prAdapter,
6719 CMD_ID_MAC_MCAST_ADDR,
6723 nicCmdEventQueryMcastAddr,
6724 nicOidCmdTimeoutCommon,
6731 return WLAN_STATUS_SUCCESS;
6733 } /* end of wlanoidQueryMulticastList() */
6736 /*----------------------------------------------------------------------------*/
6738 * \brief This routine is called to set Multicast Address List.
6740 * \param[in] prAdapter Pointer to the Adapter structure.
6741 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
6742 * \param[in] u4SetBufferLen The length of the set buffer.
6743 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
6744 * bytes read from the set buffer. If the call failed
6745 * due to invalid length of the set buffer, returns
6746 * the amount of storage needed.
6748 * \retval WLAN_STATUS_SUCCESS
6749 * \retval WLAN_STATUS_INVALID_LENGTH
6750 * \retval WLAN_STATUS_ADAPTER_NOT_READY
6751 * \retval WLAN_STATUS_MULTICAST_FULL
6753 /*----------------------------------------------------------------------------*/
6755 wlanoidSetMulticastList(
6756 IN P_ADAPTER_T prAdapter,
6757 IN PVOID pvSetBuffer,
6758 IN UINT_32 u4SetBufferLen,
6759 OUT PUINT_32 pu4SetInfoLen
6762 UINT_8 ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Caller should provide this information */
6763 CMD_MAC_MCAST_ADDR rCmdMacMcastAddr;
6765 ASSERT(pu4SetInfoLen);
6767 /* The data must be a multiple of the Ethernet address size. */
6768 if ((u4SetBufferLen % MAC_ADDR_LEN)) {
6769 DBGLOG(REQ, WARN, ("Invalid MC list length %ld\n", u4SetBufferLen));
6771 *pu4SetInfoLen = (((u4SetBufferLen + MAC_ADDR_LEN) - 1) /
6772 MAC_ADDR_LEN) * MAC_ADDR_LEN;
6774 return WLAN_STATUS_INVALID_LENGTH;
6777 *pu4SetInfoLen = u4SetBufferLen;
6779 /* Verify if we can support so many multicast addresses. */
6780 if ((u4SetBufferLen / MAC_ADDR_LEN) > MAX_NUM_GROUP_ADDR) {
6781 DBGLOG(REQ, WARN, ("Too many MC addresses\n"));
6783 return WLAN_STATUS_MULTICAST_FULL;
6786 /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
6787 * pvSetBuffer == NULL to clear exist Multicast List.
6789 if (u4SetBufferLen) {
6790 ASSERT(pvSetBuffer);
6793 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6794 DBGLOG(REQ, WARN, ("Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6795 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6796 return WLAN_STATUS_ADAPTER_NOT_READY;
6799 rCmdMacMcastAddr.u4NumOfGroupAddr = u4SetBufferLen / MAC_ADDR_LEN;
6800 rCmdMacMcastAddr.ucNetTypeIndex = ucNetTypeIndex;
6801 kalMemCopy(rCmdMacMcastAddr.arAddress, pvSetBuffer, u4SetBufferLen);
6803 return wlanSendSetQueryCmd(prAdapter,
6804 CMD_ID_MAC_MCAST_ADDR,
6808 nicCmdEventSetCommon,
6809 nicOidCmdTimeoutCommon,
6810 sizeof(CMD_MAC_MCAST_ADDR),
6811 (PUINT_8)&rCmdMacMcastAddr,
6815 } /* end of wlanoidSetMulticastList() */
6819 /*----------------------------------------------------------------------------*/
6821 * \brief This routine is called to set Packet Filter.
6823 * \param[in] prAdapter Pointer to the Adapter structure.
6824 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
6825 * \param[in] u4SetBufferLen The length of the set buffer.
6826 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
6827 * bytes read from the set buffer. If the call failed
6828 * due to invalid length of the set buffer, returns
6829 * the amount of storage needed.
6831 * \retval WLAN_STATUS_SUCCESS
6832 * \retval WLAN_STATUS_INVALID_LENGTH
6833 * \retval WLAN_STATUS_NOT_SUPPORTED
6834 * \retval WLAN_STATUS_ADAPTER_NOT_READY
6836 /*----------------------------------------------------------------------------*/
6838 wlanoidSetCurrentPacketFilter (
6839 IN P_ADAPTER_T prAdapter,
6840 IN PVOID pvSetBuffer,
6841 IN UINT_32 u4SetBufferLen,
6842 OUT PUINT_32 pu4SetInfoLen
6845 UINT_32 u4NewPacketFilter;
6846 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
6848 DEBUGFUNC("wlanoidSetCurrentPacketFilter");
6851 ASSERT(pu4SetInfoLen);
6853 if (u4SetBufferLen < sizeof(UINT_32)) {
6854 *pu4SetInfoLen = sizeof(UINT_32);
6855 return WLAN_STATUS_INVALID_LENGTH;
6857 ASSERT(pvSetBuffer);
6859 /* Set the new packet filter. */
6860 u4NewPacketFilter = *(PUINT_32) pvSetBuffer;
6862 DBGLOG(REQ, INFO, ("New packet filter: %#08lx\n", u4NewPacketFilter));
6864 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
6865 DBGLOG(REQ, WARN, ("Fail in set current packet filter! (Adapter not ready). ACPI=D%d, Radio=%d\n",
6866 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
6867 return WLAN_STATUS_ADAPTER_NOT_READY;
6871 /* Verify the bits of the new packet filter. If any bits are set that
6872 we don't support, leave. */
6873 if (u4NewPacketFilter & ~(PARAM_PACKET_FILTER_SUPPORTED)) {
6874 rStatus = WLAN_STATUS_NOT_SUPPORTED;
6879 /* Need to enable or disable promiscuous support depending on the new
6881 if (u4NewPacketFilter & PARAM_PACKET_FILTER_PROMISCUOUS) {
6882 DBGLOG(REQ, INFO, ("Enable promiscuous mode\n"));
6885 DBGLOG(REQ, INFO, ("Disable promiscuous mode\n"));
6888 if (u4NewPacketFilter & PARAM_PACKET_FILTER_ALL_MULTICAST) {
6889 DBGLOG(REQ, INFO, ("Enable all-multicast mode\n"));
6891 else if (u4NewPacketFilter & PARAM_PACKET_FILTER_MULTICAST) {
6892 DBGLOG(REQ, INFO, ("Enable multicast\n"));
6895 DBGLOG(REQ, INFO, ("Disable multicast\n"));
6898 if (u4NewPacketFilter & PARAM_PACKET_FILTER_BROADCAST) {
6899 DBGLOG(REQ, INFO, ("Enable Broadcast\n"));
6902 DBGLOG(REQ, INFO, ("Disable Broadcast\n"));
6907 if(rStatus == WLAN_STATUS_SUCCESS) {
6908 // Store the packet filter
6910 prAdapter->u4OsPacketFilter &= PARAM_PACKET_FILTER_P2P_MASK;
6911 prAdapter->u4OsPacketFilter |= u4NewPacketFilter;
6913 return wlanSendSetQueryCmd(prAdapter,
6914 CMD_ID_SET_RX_FILTER,
6918 nicCmdEventSetCommon,
6919 nicOidCmdTimeoutCommon,
6921 (PUINT_8)&prAdapter->u4OsPacketFilter,
6929 } /* wlanoidSetCurrentPacketFilter */
6932 /*----------------------------------------------------------------------------*/
6934 * \brief This routine is called to query current packet filter.
6936 * \param[in] prAdapter Pointer to the Adapter structure.
6937 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6939 * \param[in] u4QueryBufferLen The length of the query buffer.
6940 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6941 * bytes written into the query buffer. If the call
6942 * failed due to invalid length of the query buffer,
6943 * returns the amount of storage needed.
6945 * \retval WLAN_STATUS_SUCCESS
6947 /*----------------------------------------------------------------------------*/
6949 wlanoidQueryCurrentPacketFilter (
6950 IN P_ADAPTER_T prAdapter,
6951 OUT PVOID pvQueryBuffer,
6952 IN UINT_32 u4QueryBufferLen,
6953 OUT PUINT_32 pu4QueryInfoLen
6956 DEBUGFUNC("wlanoidQueryCurrentPacketFilter");
6958 ASSERT(pu4QueryInfoLen);
6960 *pu4QueryInfoLen = sizeof(UINT_32);
6962 if (u4QueryBufferLen >= sizeof(UINT_32)) {
6963 ASSERT(pvQueryBuffer);
6964 *(PUINT_32) pvQueryBuffer = prAdapter->u4OsPacketFilter;
6967 return WLAN_STATUS_SUCCESS;
6968 } /* wlanoidQueryCurrentPacketFilter */
6970 /*----------------------------------------------------------------------------*/
6972 * \brief This routine is called to query ACPI device power state.
6974 * \param[in] prAdapter Pointer to the Adapter structure.
6975 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
6977 * \param[in] u4QueryBufferLen The length of the query buffer.
6978 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
6979 * bytes written into the query buffer. If the call
6980 * failed due to invalid length of the query buffer,
6981 * returns the amount of storage needed.
6983 * \retval WLAN_STATUS_SUCCESS
6985 /*----------------------------------------------------------------------------*/
6987 wlanoidQueryAcpiDevicePowerState (
6988 IN P_ADAPTER_T prAdapter,
6989 IN PVOID pvQueryBuffer,
6990 IN UINT_32 u4QueryBufferLen,
6991 OUT PUINT_32 pu4QueryInfoLen
6995 PPARAM_DEVICE_POWER_STATE prPowerState;
6998 DEBUGFUNC("wlanoidQueryAcpiDevicePowerState");
7000 ASSERT(pu4QueryInfoLen);
7001 if (u4QueryBufferLen) {
7002 ASSERT(pvQueryBuffer);
7005 *pu4QueryInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
7008 prPowerState = (PPARAM_DEVICE_POWER_STATE) pvQueryBuffer;
7009 switch (*prPowerState) {
7010 case ParamDeviceStateD0:
7011 DBGLOG(REQ, INFO, ("Query Power State: D0\n"));
7013 case ParamDeviceStateD1:
7014 DBGLOG(REQ, INFO, ("Query Power State: D1\n"));
7016 case ParamDeviceStateD2:
7017 DBGLOG(REQ, INFO, ("Query Power State: D2\n"));
7019 case ParamDeviceStateD3:
7020 DBGLOG(REQ, INFO, ("Query Power State: D3\n"));
7027 /* Since we will disconnect the newwork, therefore we do not
7028 need to check queue empty */
7029 *(PPARAM_DEVICE_POWER_STATE) pvQueryBuffer = ParamDeviceStateD3;
7030 //WARNLOG(("Ready to transition to D3\n"));
7031 return WLAN_STATUS_SUCCESS;
7033 } /* pwrmgtQueryPower */
7036 /*----------------------------------------------------------------------------*/
7038 * \brief This routine is called to set ACPI device power state.
7040 * \param[in] pvAdapter Pointer to the Adapter structure.
7041 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7042 * \param[in] u4SetBufferLen The length of the set buffer.
7043 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7044 * bytes read from the set buffer. If the call failed
7045 * due to invalid length of the set buffer, returns
7046 * the amount of storage needed.
7048 * \retval WLAN_STATUS_SUCCESS
7050 /*----------------------------------------------------------------------------*/
7052 wlanoidSetAcpiDevicePowerState (
7053 IN P_ADAPTER_T prAdapter,
7054 IN PVOID pvSetBuffer,
7055 IN UINT_32 u4SetBufferLen,
7056 OUT PUINT_32 pu4SetInfoLen
7059 PPARAM_DEVICE_POWER_STATE prPowerState;
7060 BOOLEAN fgRetValue = TRUE;
7062 DEBUGFUNC("wlanoidSetAcpiDevicePowerState");
7064 ASSERT(pu4SetInfoLen);
7066 *pu4SetInfoLen = sizeof(PARAM_DEVICE_POWER_STATE);
7068 ASSERT(pvSetBuffer);
7069 prPowerState = (PPARAM_DEVICE_POWER_STATE) pvSetBuffer;
7070 switch (*prPowerState) {
7071 case ParamDeviceStateD0:
7072 DBGLOG(REQ, INFO, ("Set Power State: D0\n"));
7073 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD0);
7074 fgRetValue = nicpmSetAcpiPowerD0(prAdapter);
7076 case ParamDeviceStateD1:
7077 DBGLOG(REQ, INFO, ("Set Power State: D1\n"));
7079 case ParamDeviceStateD2:
7080 DBGLOG(REQ, INFO, ("Set Power State: D2\n"));
7082 case ParamDeviceStateD3:
7083 DBGLOG(REQ, INFO, ("Set Power State: D3\n"));
7084 fgRetValue = nicpmSetAcpiPowerD3(prAdapter);
7085 kalDevSetPowerState(prAdapter->prGlueInfo, (UINT_32)ParamDeviceStateD3);
7091 if(fgRetValue == TRUE)
7092 return WLAN_STATUS_SUCCESS;
7094 return WLAN_STATUS_FAILURE;
7095 } /* end of wlanoidSetAcpiDevicePowerState() */
7097 /*----------------------------------------------------------------------------*/
7099 * \brief This routine is called to query the current fragmentation threshold.
7101 * \param[in] pvAdapter Pointer to the Adapter structure.
7102 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
7104 * \param[in] u4QueryBufferLen The length of the query buffer.
7105 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7106 * bytes written into the query buffer. If the call
7107 * failed due to invalid length of the query buffer,
7108 * returns the amount of storage needed.
7110 * \retval WLAN_STATUS_SUCCESS
7111 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7113 /*----------------------------------------------------------------------------*/
7115 wlanoidQueryFragThreshold (
7116 IN P_ADAPTER_T prAdapter,
7117 OUT PVOID pvQueryBuffer,
7118 IN UINT_32 u4QueryBufferLen,
7119 OUT PUINT_32 pu4QueryInfoLen
7122 DEBUGFUNC("wlanoidQueryFragThreshold");
7125 if (u4QueryBufferLen) {
7126 ASSERT(pvQueryBuffer);
7128 ASSERT(pu4QueryInfoLen);
7130 DBGLOG(REQ, LOUD, ("\n"));
7134 return WLAN_STATUS_SUCCESS;
7138 return WLAN_STATUS_NOT_SUPPORTED;
7139 #endif /* CFG_TX_FRAGMENT */
7141 } /* end of wlanoidQueryFragThreshold() */
7144 /*----------------------------------------------------------------------------*/
7146 * \brief This routine is called to set a new fragmentation threshold to the
7149 * \param[in] pvAdapter Pointer to the Adapter structure.
7150 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7151 * \param[in] u4SetBufferLen The length of the set buffer.
7152 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7153 * bytes read from the set buffer. If the call failed
7154 * due to invalid length of the set buffer, returns
7155 * the amount of storage needed.
7157 * \retval WLAN_STATUS_SUCCESS
7158 * \retval WLAN_STATUS_INVALID_DATA
7159 * \retval WLAN_STATUS_INVALID_LENGTH
7161 /*----------------------------------------------------------------------------*/
7163 wlanoidSetFragThreshold (
7164 IN P_ADAPTER_T prAdapter,
7165 IN PVOID pvSetBuffer,
7166 IN UINT_32 u4SetBufferLen,
7167 OUT PUINT_32 pu4SetInfoLen
7172 return WLAN_STATUS_SUCCESS;
7176 return WLAN_STATUS_NOT_SUPPORTED;
7177 #endif /* CFG_TX_FRAGMENT */
7179 } /* end of wlanoidSetFragThreshold() */
7182 /*----------------------------------------------------------------------------*/
7184 * \brief This routine is called to query the current RTS threshold.
7186 * \param[in] pvAdapter Pointer to the Adapter structure.
7187 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
7189 * \param[in] u4QueryBufferLen The length of the query buffer.
7190 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7191 * bytes written into the query buffer. If the call
7192 * failed due to invalid length of the query buffer,
7193 * returns the amount of storage needed.
7195 * \retval WLAN_STATUS_SUCCESS
7196 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7198 /*----------------------------------------------------------------------------*/
7200 wlanoidQueryRtsThreshold (
7201 IN P_ADAPTER_T prAdapter,
7202 OUT PVOID pvQueryBuffer,
7203 IN UINT_32 u4QueryBufferLen,
7204 OUT PUINT_32 pu4QueryInfoLen
7207 DEBUGFUNC("wlanoidQueryRtsThreshold");
7210 if (u4QueryBufferLen) {
7211 ASSERT(pvQueryBuffer);
7213 ASSERT(pu4QueryInfoLen);
7215 DBGLOG(REQ, LOUD, ("\n"));
7217 if (u4QueryBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
7218 *pu4QueryInfoLen = sizeof(PARAM_RTS_THRESHOLD);
7219 return WLAN_STATUS_BUFFER_TOO_SHORT;
7222 *((PARAM_RTS_THRESHOLD *)pvQueryBuffer) = prAdapter->rWlanInfo.eRtsThreshold;
7224 return WLAN_STATUS_SUCCESS;
7226 } /* wlanoidQueryRtsThreshold */
7229 /*----------------------------------------------------------------------------*/
7231 * \brief This routine is called to set a new RTS threshold to the driver.
7233 * \param[in] pvAdapter Pointer to the Adapter structure.
7234 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7235 * \param[in] u4SetBufferLen The length of the set buffer.
7236 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7237 * bytes read from the set buffer. If the call failed
7238 * due to invalid length of the set buffer, returns
7239 * the amount of storage needed.
7241 * \retval WLAN_STATUS_SUCCESS
7242 * \retval WLAN_STATUS_INVALID_DATA
7243 * \retval WLAN_STATUS_INVALID_LENGTH
7245 /*----------------------------------------------------------------------------*/
7247 wlanoidSetRtsThreshold (
7248 IN P_ADAPTER_T prAdapter,
7249 IN PVOID pvSetBuffer,
7250 IN UINT_32 u4SetBufferLen,
7251 OUT PUINT_32 pu4SetInfoLen
7254 PARAM_RTS_THRESHOLD *prRtsThreshold;
7257 ASSERT(pu4SetInfoLen);
7259 *pu4SetInfoLen = sizeof(PARAM_RTS_THRESHOLD);
7260 if (u4SetBufferLen < sizeof(PARAM_RTS_THRESHOLD)) {
7261 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
7262 return WLAN_STATUS_INVALID_LENGTH;
7265 prRtsThreshold = (PARAM_RTS_THRESHOLD *)pvSetBuffer;
7266 *prRtsThreshold = prAdapter->rWlanInfo.eRtsThreshold;
7268 return WLAN_STATUS_SUCCESS;
7270 } /* wlanoidSetRtsThreshold */
7272 /*----------------------------------------------------------------------------*/
7274 * \brief This routine is used to turn radio off.
7276 * \param[in] pvAdapter Pointer to the Adapter structure.
7277 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7278 * \param[in] u4SetBufferLen The length of the set buffer.
7279 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7280 * bytes read from the set buffer. If the call failed
7281 * due to invalid length of the set buffer, returns
7282 * the amount of storage needed.
7284 * \retval WLAN_STATUS_SUCCESS
7285 * \retval WLAN_STATUS_ADAPTER_NOT_READY
7287 /*----------------------------------------------------------------------------*/
7289 wlanoidSetDisassociate (
7290 IN P_ADAPTER_T prAdapter,
7291 IN PVOID pvSetBuffer,
7292 IN UINT_32 u4SetBufferLen,
7293 OUT PUINT_32 pu4SetInfoLen
7296 P_MSG_AIS_ABORT_T prAisAbortMsg;
7298 DEBUGFUNC("wlanoidSetDisassociate");
7301 ASSERT(pu4SetInfoLen);
7305 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
7306 DBGLOG(REQ, WARN, ("Fail in set disassociate! (Adapter not ready). ACPI=D%d, Radio=%d\n",
7307 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
7308 return WLAN_STATUS_ADAPTER_NOT_READY;
7311 /* prepare message to AIS */
7312 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
7314 /* Send AIS Abort Message */
7315 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
7316 if (!prAisAbortMsg) {
7318 return WLAN_STATUS_FAILURE;
7321 prAisAbortMsg->rMsgHdr.eMsgId = MID_OID_AIS_FSM_JOIN_REQ;
7322 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_NEW_CONNECTION;
7323 prAisAbortMsg->fgDelayIndication = FALSE;
7325 mboxSendMsg(prAdapter,
7327 (P_MSG_HDR_T) prAisAbortMsg,
7328 MSG_SEND_METHOD_BUF);
7330 /* indicate for disconnection */
7331 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
7332 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
7333 WLAN_STATUS_MEDIA_DISCONNECT,
7339 prAdapter->fgIsRadioOff = TRUE;
7342 return WLAN_STATUS_SUCCESS;
7343 } /* wlanoidSetDisassociate */
7347 /*----------------------------------------------------------------------------*/
7349 * \brief This routine is used to query the power save profile.
7351 * \param[in] prAdapter Pointer to the Adapter structure.
7352 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
7354 * \param[in] u4QueryBufLen The length of the query buffer.
7355 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7356 * bytes written into the query buffer. If the call
7357 * failed due to invalid length of the query buffer,
7358 * returns the amount of storage needed.
7360 * \return WLAN_STATUS_SUCCESS
7362 /*----------------------------------------------------------------------------*/
7364 wlanoidQuery802dot11PowerSaveProfile (
7365 IN P_ADAPTER_T prAdapter,
7366 IN PVOID pvQueryBuffer,
7367 IN UINT_32 u4QueryBufferLen,
7368 OUT PUINT_32 pu4QueryInfoLen
7371 DEBUGFUNC("wlanoidQuery802dot11PowerSaveProfile");
7374 ASSERT(pu4QueryInfoLen);
7376 if (u4QueryBufferLen!=0) {
7377 ASSERT(pvQueryBuffer);
7379 // *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.ePowerSaveMode.ucPsProfile);
7380 *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_AIS_INDEX].ucPsProfile);
7381 *pu4QueryInfoLen = sizeof(PARAM_POWER_MODE);
7383 // hack for CTIA power mode setting function
7384 if (prAdapter->fgEnCtiaPowerMode) {
7385 // set to non-zero value (to prevent MMI query 0, before it intends to set 0, which will skip its following state machine)
7386 *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)2;
7390 return WLAN_STATUS_SUCCESS;
7394 /*----------------------------------------------------------------------------*/
7396 * \brief This routine is used to set the power save profile.
7398 * \param[in] pvAdapter Pointer to the Adapter structure.
7399 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7400 * \param[in] u4SetBufferLen The length of the set buffer.
7401 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7402 * bytes read from the set buffer. If the call failed
7403 * due to invalid length of the set buffer, returns
7404 * the amount of storage needed.
7406 * \retval WLAN_STATUS_SUCCESS
7407 * \retval WLAN_STATUS_INVALID_LENGTH
7409 /*----------------------------------------------------------------------------*/
7411 wlanoidSet802dot11PowerSaveProfile (
7412 IN P_ADAPTER_T prAdapter,
7413 IN PVOID pvSetBuffer,
7414 IN UINT_32 u4SetBufferLen,
7415 OUT PUINT_32 pu4SetInfoLen
7419 PARAM_POWER_MODE ePowerMode;
7420 DEBUGFUNC("wlanoidSet802dot11PowerSaveProfile");
7423 ASSERT(pu4SetInfoLen);
7425 *pu4SetInfoLen = sizeof(PARAM_POWER_MODE);
7426 if (u4SetBufferLen < sizeof(PARAM_POWER_MODE)) {
7427 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
7428 return WLAN_STATUS_INVALID_LENGTH;
7430 else if (*(PPARAM_POWER_MODE) pvSetBuffer >= Param_PowerModeMax) {
7431 //WARNLOG(("Invalid power mode %d\n",
7432 //*(PPARAM_POWER_MODE) pvSetBuffer));
7433 return WLAN_STATUS_INVALID_DATA;
7436 ePowerMode = *(PPARAM_POWER_MODE) pvSetBuffer;
7438 if (prAdapter->fgEnCtiaPowerMode) {
7439 if (ePowerMode == Param_PowerModeCAM) {
7442 // User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP)
7444 if (prAdapter->u4CtiaPowerMode == 0) {
7445 // force to keep in CAM mode
7446 ePowerMode = Param_PowerModeCAM;
7447 } else if (prAdapter->u4CtiaPowerMode == 1) {
7448 ePowerMode = Param_PowerModeMAX_PSP;
7449 } else if (prAdapter->u4CtiaPowerMode == 2) {
7450 ePowerMode = Param_PowerModeFast_PSP;
7455 status = nicConfigPowerSaveProfile(
7457 NETWORK_TYPE_AIS_INDEX,
7461 switch (ePowerMode) {
7462 case Param_PowerModeCAM:
7463 DBGLOG(INIT, INFO, ("Set Wi-Fi PS mode to CAM (%d)\n", ePowerMode));
7465 case Param_PowerModeMAX_PSP:
7466 DBGLOG(INIT, INFO, ("Set Wi-Fi PS mode to MAX PS (%d)\n", ePowerMode));
7468 case Param_PowerModeFast_PSP:
7469 DBGLOG(INIT, INFO, ("Set Wi-Fi PS mode to FAST PS (%d)\n", ePowerMode));
7472 DBGLOG(INIT, INFO, ("invalid Wi-Fi PS mode setting (%d)\n", ePowerMode));
7478 } /* end of wlanoidSetAcpiDevicePowerStateMode() */
7481 /*----------------------------------------------------------------------------*/
7483 * \brief This routine is called to query current status of AdHoc Mode.
7485 * \param[in] prAdapter Pointer to the Adapter structure.
7486 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7488 * \param[in] u4QueryBufferLen The length of the query buffer.
7489 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7490 * bytes written into the query buffer. If the call
7491 * failed due to invalid length of the query buffer,
7492 * returns the amount of storage needed.
7494 * \retval WLAN_STATUS_SUCCESS
7495 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7497 /*----------------------------------------------------------------------------*/
7499 wlanoidQueryAdHocMode (
7500 IN P_ADAPTER_T prAdapter,
7501 OUT PVOID pvQueryBuffer,
7502 IN UINT_32 u4QueryBufferLen,
7503 OUT PUINT_32 pu4QueryInfoLen
7506 return WLAN_STATUS_SUCCESS;
7507 } /* end of wlanoidQueryAdHocMode() */
7510 /*----------------------------------------------------------------------------*/
7512 * \brief This routine is called to set AdHoc Mode.
7514 * \param[in] prAdapter Pointer to the Adapter structure.
7515 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7516 * \param[in] u4SetBufferLen The length of the set buffer.
7517 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7518 * bytes read from the set buffer. If the call failed
7519 * due to invalid length of the set buffer, returns
7520 * the amount of storage needed.
7522 * \retval WLAN_STATUS_SUCCESS
7523 * \retval WLAN_STATUS_INVALID_LENGTH
7524 * \retval WLAN_STATUS_INVALID_DATA
7526 /*----------------------------------------------------------------------------*/
7528 wlanoidSetAdHocMode (
7529 IN P_ADAPTER_T prAdapter,
7530 IN PVOID pvSetBuffer,
7531 IN UINT_32 u4SetBufferLen,
7532 OUT PUINT_32 pu4SetInfoLen
7535 return WLAN_STATUS_SUCCESS;
7536 } /* end of wlanoidSetAdHocMode() */
7539 /*----------------------------------------------------------------------------*/
7541 * \brief This routine is called to query RF frequency.
7543 * \param[in] prAdapter Pointer to the Adapter structure.
7544 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7546 * \param[in] u4QueryBufferLen The length of the query buffer.
7547 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7548 * bytes written into the query buffer. If the call
7549 * failed due to invalid length of the query buffer,
7550 * returns the amount of storage needed.
7552 * \retval WLAN_STATUS_SUCCESS
7553 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7555 /*----------------------------------------------------------------------------*/
7557 wlanoidQueryFrequency (
7558 IN P_ADAPTER_T prAdapter,
7559 OUT PVOID pvQueryBuffer,
7560 IN UINT_32 u4QueryBufferLen,
7561 OUT PUINT_32 pu4QueryInfoLen
7564 DEBUGFUNC("wlanoidQueryFrequency");
7567 ASSERT(pu4QueryInfoLen);
7568 if (u4QueryBufferLen) {
7569 ASSERT(pvQueryBuffer);
7572 if (u4QueryBufferLen < sizeof(UINT_32)) {
7573 return WLAN_STATUS_BUFFER_TOO_SHORT;
7576 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7577 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
7578 *(PUINT_32)pvQueryBuffer =
7579 nicChannelNum2Freq(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX].ucPrimaryChannel);
7582 *(PUINT_32)pvQueryBuffer = 0;
7586 *(PUINT_32)pvQueryBuffer =
7587 nicChannelNum2Freq(prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum);
7590 return WLAN_STATUS_SUCCESS;
7591 } /* end of wlanoidQueryFrequency() */
7594 /*----------------------------------------------------------------------------*/
7596 * \brief This routine is called to set RF frequency by User Settings.
7598 * \param[in] prAdapter Pointer to the Adapter structure.
7599 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7601 * \param[in] u4QueryBufferLen The length of the query buffer.
7602 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7603 * bytes written into the query buffer. If the call
7604 * failed due to invalid length of the query buffer,
7605 * returns the amount of storage needed.
7607 * \retval WLAN_STATUS_SUCCESS
7608 * \retval WLAN_STATUS_INVALID_LENGTH
7609 * \retval WLAN_STATUS_INVALID_DATA
7611 /*----------------------------------------------------------------------------*/
7613 wlanoidSetFrequency (
7614 IN P_ADAPTER_T prAdapter,
7615 IN PVOID pvSetBuffer,
7616 IN UINT_32 u4SetBufferLen,
7617 OUT PUINT_32 pu4SetInfoLen
7620 PUINT_32 pu4FreqInKHz;
7622 DEBUGFUNC("wlanoidSetFrequency");
7625 ASSERT(pu4SetInfoLen);
7627 *pu4SetInfoLen = sizeof(UINT_32);
7629 if (u4SetBufferLen < sizeof(UINT_32)) {
7630 return WLAN_STATUS_INVALID_LENGTH;
7633 ASSERT(pvSetBuffer);
7634 pu4FreqInKHz = (PUINT_32)pvSetBuffer;
7636 prAdapter->rWifiVar.rConnSettings.ucAdHocChannelNum
7637 = (UINT_8)nicFreq2ChannelNum(*pu4FreqInKHz);
7638 prAdapter->rWifiVar.rConnSettings.eAdHocBand
7639 = *pu4FreqInKHz < 5000000 ? BAND_2G4 : BAND_5G;
7641 return WLAN_STATUS_SUCCESS;
7642 } /* end of wlanoidSetFrequency() */
7645 /*----------------------------------------------------------------------------*/
7647 * \brief This routine is called to set 802.11 channel of the radio frequency.
7648 * This is a proprietary function call to Lunux currently.
7650 * \param[in] prAdapter Pointer to the Adapter structure.
7651 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
7652 * \param[in] u4SetBufferLen The length of the set buffer.
7653 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7654 * bytes read from the set buffer. If the call failed
7655 * due to invalid length of the set buffer, returns
7656 * the amount of storage needed.
7658 * \retval WLAN_STATUS_SUCCESS
7659 * \retval WLAN_STATUS_INVALID_LENGTH
7660 * \retval WLAN_STATUS_INVALID_DATA
7662 /*----------------------------------------------------------------------------*/
7665 IN P_ADAPTER_T prAdapter,
7666 IN PVOID pvSetBuffer,
7667 IN UINT_32 u4SetBufferLen,
7668 OUT PUINT_32 pu4SetInfoLen
7673 return WLAN_STATUS_SUCCESS;
7677 /*----------------------------------------------------------------------------*/
7679 * \brief This routine is called to query the Beacon Interval from User Settings.
7681 * \param[in] prAdapter Pointer to the Adapter structure.
7682 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7684 * \param[in] u4QueryBufferLen The length of the query buffer.
7685 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7686 * bytes written into the query buffer. If the call
7687 * failed due to invalid length of the query buffer,
7688 * returns the amount of storage needed.
7690 * \retval WLAN_STATUS_SUCCESS
7691 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7693 /*----------------------------------------------------------------------------*/
7695 wlanoidQueryBeaconInterval (
7696 IN P_ADAPTER_T prAdapter,
7697 OUT PVOID pvQueryBuffer,
7698 IN UINT_32 u4QueryBufferLen,
7699 OUT PUINT_32 pu4QueryInfoLen
7702 DEBUGFUNC("wlanoidQueryBeaconInterval");
7704 ASSERT(pu4QueryInfoLen);
7705 if (u4QueryBufferLen) {
7706 ASSERT(pvQueryBuffer);
7709 *pu4QueryInfoLen = sizeof(UINT_32);
7711 if (u4QueryBufferLen < sizeof(UINT_32)) {
7712 return WLAN_STATUS_BUFFER_TOO_SHORT;
7715 if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
7716 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7717 *(PUINT_32)pvQueryBuffer =
7718 prAdapter->rWlanInfo.rCurrBssId.rConfiguration.u4BeaconPeriod;
7721 *(PUINT_32)pvQueryBuffer =
7722 (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
7726 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7727 *(PUINT_32)pvQueryBuffer = 0;
7730 *(PUINT_32)pvQueryBuffer =
7731 (UINT_32) prAdapter->rWlanInfo.u2BeaconPeriod;
7735 return WLAN_STATUS_SUCCESS;
7736 } /* end of wlanoidQueryBeaconInterval() */
7739 /*----------------------------------------------------------------------------*/
7741 * \brief This routine is called to set the Beacon Interval to User Settings.
7743 * \param[in] prAdapter Pointer to the Adapter structure.
7744 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7745 * \param[in] u4SetBufferLen The length of the set buffer.
7746 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7747 * bytes read from the set buffer. If the call failed
7748 * due to invalid length of the set buffer, returns
7749 * the amount of storage needed.
7751 * \retval WLAN_STATUS_SUCCESS
7752 * \retval WLAN_STATUS_INVALID_LENGTH
7753 * \retval WLAN_STATUS_INVALID_DATA
7755 /*----------------------------------------------------------------------------*/
7757 wlanoidSetBeaconInterval (
7758 IN P_ADAPTER_T prAdapter,
7759 IN PVOID pvSetBuffer,
7760 IN UINT_32 u4SetBufferLen,
7761 OUT PUINT_32 pu4SetInfoLen
7764 PUINT_32 pu4BeaconInterval;
7766 DEBUGFUNC("wlanoidSetBeaconInterval");
7769 ASSERT(pu4SetInfoLen);
7771 *pu4SetInfoLen = sizeof(UINT_32);
7772 if (u4SetBufferLen < sizeof(UINT_32)) {
7773 return WLAN_STATUS_INVALID_LENGTH;
7776 ASSERT(pvSetBuffer);
7777 pu4BeaconInterval = (PUINT_32)pvSetBuffer;
7779 if ((*pu4BeaconInterval < DOT11_BEACON_PERIOD_MIN) ||
7780 (*pu4BeaconInterval > DOT11_BEACON_PERIOD_MAX)) {
7781 DBGLOG(REQ, TRACE, ("Invalid Beacon Interval = %ld\n", *pu4BeaconInterval));
7782 return WLAN_STATUS_INVALID_DATA;
7785 prAdapter->rWlanInfo.u2BeaconPeriod = (UINT_16)*pu4BeaconInterval;
7787 DBGLOG(REQ, INFO, ("Set beacon interval: %d\n",
7788 prAdapter->rWlanInfo.u2BeaconPeriod));
7791 return WLAN_STATUS_SUCCESS;
7792 } /* end of wlanoidSetBeaconInterval() */
7795 /*----------------------------------------------------------------------------*/
7797 * \brief This routine is called to query the ATIM window from User Settings.
7799 * \param[in] prAdapter Pointer to the Adapter structure.
7800 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
7802 * \param[in] u4QueryBufferLen The length of the query buffer.
7803 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
7804 * bytes written into the query buffer. If the call
7805 * failed due to invalid length of the query buffer,
7806 * returns the amount of storage needed.
7808 * \retval WLAN_STATUS_SUCCESS
7809 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
7811 /*----------------------------------------------------------------------------*/
7813 wlanoidQueryAtimWindow (
7814 IN P_ADAPTER_T prAdapter,
7815 OUT PVOID pvQueryBuffer,
7816 IN UINT_32 u4QueryBufferLen,
7817 OUT PUINT_32 pu4QueryInfoLen
7820 DEBUGFUNC("wlanoidQueryAtimWindow");
7823 ASSERT(pu4QueryInfoLen);
7824 if (u4QueryBufferLen) {
7825 ASSERT(pvQueryBuffer);
7828 *pu4QueryInfoLen = sizeof(UINT_32);
7830 if (u4QueryBufferLen < sizeof(UINT_32)) {
7831 return WLAN_STATUS_BUFFER_TOO_SHORT;
7834 if (prAdapter->rWifiVar.rConnSettings.eOPMode == NET_TYPE_INFRA) {
7835 *(PUINT_32)pvQueryBuffer = 0;
7838 *(PUINT_32)pvQueryBuffer =
7839 (UINT_32) prAdapter->rWlanInfo.u2AtimWindow;
7842 return WLAN_STATUS_SUCCESS;
7844 } /* end of wlanoidQueryAtimWindow() */
7847 /*----------------------------------------------------------------------------*/
7849 * \brief This routine is called to set the ATIM window to User Settings.
7851 * \param[in] prAdapter Pointer to the Adapter structure.
7852 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7853 * \param[in] u4SetBufferLen The length of the set buffer.
7854 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7855 * bytes read from the set buffer. If the call failed
7856 * due to invalid length of the set buffer, returns
7857 * the amount of storage needed.
7859 * \retval WLAN_STATUS_SUCCESS
7860 * \retval WLAN_STATUS_INVALID_LENGTH
7861 * \retval WLAN_STATUS_INVALID_DATA
7863 /*----------------------------------------------------------------------------*/
7865 wlanoidSetAtimWindow (
7866 IN P_ADAPTER_T prAdapter,
7867 IN PVOID pvSetBuffer,
7868 IN UINT_32 u4SetBufferLen,
7869 OUT PUINT_32 pu4SetInfoLen
7872 PUINT_32 pu4AtimWindow;
7874 DEBUGFUNC("wlanoidSetAtimWindow");
7877 ASSERT(pu4SetInfoLen);
7879 *pu4SetInfoLen = sizeof(UINT_32);
7881 if (u4SetBufferLen < sizeof(UINT_32)) {
7882 return WLAN_STATUS_INVALID_LENGTH;
7885 ASSERT(pvSetBuffer);
7886 pu4AtimWindow = (PUINT_32)pvSetBuffer;
7888 prAdapter->rWlanInfo.u2AtimWindow = (UINT_16)*pu4AtimWindow;
7890 return WLAN_STATUS_SUCCESS;
7891 } /* end of wlanoidSetAtimWindow() */
7893 /*----------------------------------------------------------------------------*/
7895 * \brief This routine is called to Set the MAC address which is currently used by the NIC.
7897 * \param[in] prAdapter Pointer to the Adapter structure.
7898 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7899 * \param[in] u4SetBufferLen The length of the set buffer.
7900 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7901 * bytes read from the set buffer. If the call failed
7902 * due to invalid length of the set buffer, returns
7903 * the amount of storage needed.
7906 * \retval WLAN_STATUS_SUCCESS
7907 * \retval WLAN_STATUS_INVALID_LENGTH
7908 * \retval WLAN_STATUS_INVALID_DATA
7910 /*----------------------------------------------------------------------------*/
7912 wlanoidSetCurrentAddr (
7913 IN P_ADAPTER_T prAdapter,
7914 IN PVOID pvSetBuffer,
7915 IN UINT_32 u4SetBufferLen,
7916 OUT PUINT_32 pu4SetInfoLen
7921 return WLAN_STATUS_SUCCESS;
7922 } /* end of wlanoidSetCurrentAddr() */
7925 #if CFG_TCP_IP_CHKSUM_OFFLOAD
7926 /*----------------------------------------------------------------------------*/
7928 * \brief Setting the checksum offload function.
7930 * \param[in] prAdapter Pointer to the Adapter structure.
7931 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
7932 * \param[in] u4SetBufferLen The length of the set buffer.
7933 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
7934 * bytes read from the set buffer. If the call failed
7935 * due to invalid length of the set buffer, returns
7936 * the amount of storage needed.
7938 * \retval WLAN_STATUS_SUCCESS
7939 * \retval WLAN_STATUS_INVALID_LENGTH
7940 * \retval WLAN_STATUS_ADAPTER_NOT_READY
7942 /*----------------------------------------------------------------------------*/
7944 wlanoidSetCSUMOffload (
7945 IN P_ADAPTER_T prAdapter,
7946 IN PVOID pvSetBuffer,
7947 IN UINT_32 u4SetBufferLen,
7948 OUT PUINT_32 pu4SetInfoLen
7951 UINT_32 i, u4CSUMFlags;
7952 CMD_BASIC_CONFIG rCmdBasicConfig;
7954 DEBUGFUNC("wlanoidSetCSUMOffload");
7955 DBGLOG(INIT, LOUD, ("\n"));
7958 ASSERT(pu4SetInfoLen);
7960 *pu4SetInfoLen = sizeof(UINT_32);
7962 if (u4SetBufferLen < sizeof(UINT_32)) {
7963 return WLAN_STATUS_INVALID_LENGTH;
7966 ASSERT(pvSetBuffer);
7967 u4CSUMFlags = *(PUINT_32)pvSetBuffer;
7969 kalMemZero(&rCmdBasicConfig, sizeof(CMD_BASIC_CONFIG));
7971 for(i = 0 ; i < 6 ; i++) { // set to broadcast address for not-specified
7972 rCmdBasicConfig.rMyMacAddr[i] = 0xff;
7975 rCmdBasicConfig.ucNative80211 = 0; //@FIXME: for Vista
7977 if(u4CSUMFlags & CSUM_OFFLOAD_EN_TX_TCP)
7978 rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(2);
7980 if(u4CSUMFlags & CSUM_OFFLOAD_EN_TX_UDP)
7981 rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(1);
7983 if(u4CSUMFlags & CSUM_OFFLOAD_EN_TX_IP)
7984 rCmdBasicConfig.rCsumOffload.u2TxChecksum |= BIT(0);
7986 if(u4CSUMFlags & CSUM_OFFLOAD_EN_RX_TCP)
7987 rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(2);
7989 if(u4CSUMFlags & CSUM_OFFLOAD_EN_RX_UDP)
7990 rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(1);
7992 if(u4CSUMFlags & (CSUM_OFFLOAD_EN_RX_IPv4 | CSUM_OFFLOAD_EN_RX_IPv6))
7993 rCmdBasicConfig.rCsumOffload.u2RxChecksum |= BIT(0);
7995 prAdapter->u4CSUMFlags = u4CSUMFlags;
7997 return wlanSendSetQueryCmd(prAdapter,
7998 CMD_ID_BASIC_CONFIG,
8002 nicCmdEventSetCommon,
8003 nicOidCmdTimeoutCommon,
8004 sizeof(CMD_BASIC_CONFIG),
8005 (PUINT_8)&rCmdBasicConfig,
8010 #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
8013 /*----------------------------------------------------------------------------*/
8015 * \brief Setting the IP address for pattern search function.
8017 * \param[in] prAdapter Pointer to the Adapter structure.
8018 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
8019 * \param[in] u4SetBufferLen The length of the set buffer.
8020 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8021 * bytes read from the set buffer. If the call failed
8022 * due to invalid length of the set buffer, returns
8023 * the amount of storage needed.
8025 * \return WLAN_STATUS_SUCCESS
8026 * \return WLAN_STATUS_ADAPTER_NOT_READY
8027 * \return WLAN_STATUS_INVALID_LENGTH
8029 /*----------------------------------------------------------------------------*/
8031 wlanoidSetNetworkAddress(
8032 IN P_ADAPTER_T prAdapter,
8033 IN PVOID pvSetBuffer,
8034 IN UINT_32 u4SetBufferLen,
8035 OUT PUINT_32 pu4SetInfoLen
8038 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
8040 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
8041 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST)pvSetBuffer;
8042 P_PARAM_NETWORK_ADDRESS prNetworkAddress;
8043 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
8044 UINT_32 u4IpAddressCount, u4CmdSize;
8045 PUINT_8 pucBuf = (PUINT_8)pvSetBuffer;
8047 DEBUGFUNC("wlanoidSetNetworkAddress");
8048 DBGLOG(INIT, LOUD, ("\n"));
8051 ASSERT(pu4SetInfoLen);
8055 if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST)) {
8056 return WLAN_STATUS_INVALID_DATA;
8060 u4IpAddressCount = 0;
8062 prNetworkAddress = prNetworkAddressList->arAddress;
8063 for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
8064 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
8065 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
8069 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
8070 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
8073 // construct payload of command packet
8074 u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
8075 sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
8076 if (u4IpAddressCount == 0) {
8077 u4CmdSize = sizeof(CMD_SET_NETWORK_ADDRESS_LIST);
8080 prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
8082 if(prCmdNetworkAddressList == NULL)
8083 return WLAN_STATUS_FAILURE;
8085 // fill P_CMD_SET_NETWORK_ADDRESS_LIST
8086 prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
8088 /* only to set IP address to FW once ARP filter is enabled */
8089 if (prAdapter->fgEnArpFilter) {
8090 prCmdNetworkAddressList->ucAddressCount = (UINT_8)u4IpAddressCount;
8091 prNetworkAddress = prNetworkAddressList->arAddress;
8093 DBGLOG(REQ, INFO, ("u4IpAddressCount (%d)\n", u4IpAddressCount));
8095 for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
8096 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
8097 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
8098 prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP)prNetworkAddress->aucAddress;
8100 kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
8101 &(prNetAddrIp->in_addr),
8106 pucBuf = (PUINT_8)&prNetAddrIp->in_addr;
8107 DBGLOG(REQ, INFO, ("prNetAddrIp->in_addr:%d:%d:%d:%d\n", pucBuf[0], pucBuf[1],pucBuf[2],pucBuf[3]));
8110 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
8111 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
8115 prCmdNetworkAddressList->ucAddressCount = 0;
8118 rStatus = wlanSendSetQueryCmd(prAdapter,
8119 CMD_ID_SET_IP_ADDRESS,
8123 nicCmdEventSetIpAddress,
8124 nicOidCmdTimeoutCommon,
8126 (PUINT_8)prCmdNetworkAddressList,
8131 kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
8136 /*----------------------------------------------------------------------------*/
8138 * \brief Set driver to switch into RF test mode
8140 * \param[in] prAdapter Pointer to the Adapter structure.
8141 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set,
8143 * \param[in] u4SetBufferLen The length of the set buffer, should be 0
8144 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8145 * bytes read from the set buffer. If the call failed
8146 * due to invalid length of the set buffer, returns
8147 * the amount of storage needed.
8149 * \return WLAN_STATUS_SUCCESS
8150 * \return WLAN_STATUS_ADAPTER_NOT_READY
8151 * \return WLAN_STATUS_INVALID_DATA
8152 * \return WLAN_STATUS_INVALID_LENGTH
8154 /*----------------------------------------------------------------------------*/
8156 wlanoidRftestSetTestMode (
8157 IN P_ADAPTER_T prAdapter,
8158 IN PVOID pvSetBuffer,
8159 IN UINT_32 u4SetBufferLen,
8160 OUT PUINT_32 pu4SetInfoLen
8163 WLAN_STATUS rStatus;
8164 CMD_TEST_CTRL_T rCmdTestCtrl;
8166 DEBUGFUNC("wlanoidRftestSetTestMode");
8169 ASSERT(pvSetBuffer);
8170 ASSERT(pu4SetInfoLen);
8174 if(u4SetBufferLen == 0) {
8175 if(prAdapter->fgTestMode == FALSE) {
8176 // switch to RF Test mode
8177 rCmdTestCtrl.ucAction = 0; // Switch mode
8178 rCmdTestCtrl.u.u4OpMode = 1; // RF test mode
8180 rStatus = wlanSendSetQueryCmd(prAdapter,
8185 nicCmdEventEnterRfTest,
8186 nicOidCmdEnterRFTestTimeout,
8187 sizeof(CMD_TEST_CTRL_T),
8188 (PUINT_8)&rCmdTestCtrl,
8193 // already in test mode ..
8194 rStatus = WLAN_STATUS_SUCCESS;
8198 rStatus = WLAN_STATUS_INVALID_DATA;
8204 /*----------------------------------------------------------------------------*/
8206 * \brief Set driver to switch into normal operation mode from RF test mode
8208 * \param[in] prAdapter Pointer to the Adapter structure.
8209 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
8211 * \param[in] u4SetBufferLen The length of the set buffer, should be 0
8212 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8213 * bytes read from the set buffer. If the call failed
8214 * due to invalid length of the set buffer, returns
8215 * the amount of storage needed.
8217 * \return WLAN_STATUS_SUCCESS
8218 * \return WLAN_STATUS_ADAPTER_NOT_READY
8219 * \return WLAN_STATUS_INVALID_DATA
8220 * \return WLAN_STATUS_INVALID_LENGTH
8222 /*----------------------------------------------------------------------------*/
8224 wlanoidRftestSetAbortTestMode (
8225 IN P_ADAPTER_T prAdapter,
8226 IN PVOID pvSetBuffer,
8227 IN UINT_32 u4SetBufferLen,
8228 OUT PUINT_32 pu4SetInfoLen
8231 WLAN_STATUS rStatus;
8232 CMD_TEST_CTRL_T rCmdTestCtrl;
8234 DEBUGFUNC("wlanoidRftestSetTestMode");
8237 ASSERT(pvSetBuffer);
8238 ASSERT(pu4SetInfoLen);
8242 if(u4SetBufferLen == 0) {
8243 if(prAdapter->fgTestMode == TRUE) {
8244 // switch to normal mode
8245 rCmdTestCtrl.ucAction = 0; // Switch mode
8246 rCmdTestCtrl.u.u4OpMode = 0; // normal mode
8248 rStatus = wlanSendSetQueryCmd(prAdapter,
8253 nicCmdEventLeaveRfTest,
8254 nicOidCmdTimeoutCommon,
8255 sizeof(CMD_TEST_CTRL_T),
8256 (PUINT_8)&rCmdTestCtrl,
8261 // already in normal mode ..
8262 rStatus = WLAN_STATUS_SUCCESS;
8266 rStatus = WLAN_STATUS_INVALID_DATA;
8273 /*----------------------------------------------------------------------------*/
8275 * \brief query for RF test parameter
8277 * \param[in] prAdapter Pointer to the Adapter structure.
8278 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
8280 * \param[in] u4QueryBufferLen The length of the query buffer.
8281 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
8282 * bytes written into the query buffer. If the call
8283 * failed due to invalid length of the query buffer,
8284 * returns the amount of storage needed.
8286 * \retval WLAN_STATUS_SUCCESS
8287 * \retval WLAN_STATUS_BUFFER_TOO_SHORT
8288 * \retval WLAN_STATUS_NOT_SUPPORTED
8289 * \retval WLAN_STATUS_NOT_ACCEPTED
8291 /*----------------------------------------------------------------------------*/
8293 wlanoidRftestQueryAutoTest (
8294 IN P_ADAPTER_T prAdapter,
8295 OUT PVOID pvQueryBuffer,
8296 IN UINT_32 u4QueryBufferLen,
8297 OUT PUINT_32 pu4QueryInfoLen
8300 P_PARAM_MTK_WIFI_TEST_STRUC_T prRfATInfo;
8301 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
8303 DEBUGFUNC("wlanoidRftestQueryAutoTest");
8306 if (u4QueryBufferLen) {
8307 ASSERT(pvQueryBuffer);
8309 ASSERT(pu4QueryInfoLen);
8311 *pu4QueryInfoLen = sizeof(PARAM_MTK_WIFI_TEST_STRUC_T);
8313 if (u4QueryBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUC_T)) {
8314 DBGLOG(REQ, ERROR, ("Invalid data. QueryBufferLen: %ld.\n",
8316 return WLAN_STATUS_INVALID_LENGTH;
8319 prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUC_T)pvQueryBuffer;
8320 rStatus = rftestQueryATInfo(prAdapter,
8321 prRfATInfo->u4FuncIndex,
8322 prRfATInfo->u4FuncData,
8329 /*----------------------------------------------------------------------------*/
8331 * \brief Set RF test parameter
8333 * \param[in] prAdapter Pointer to the Adapter structure.
8334 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
8335 * \param[in] u4SetBufferLen The length of the set buffer.
8336 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8337 * bytes read from the set buffer. If the call failed
8338 * due to invalid length of the set buffer, returns
8339 * the amount of storage needed.
8341 * \return WLAN_STATUS_SUCCESS
8342 * \return WLAN_STATUS_ADAPTER_NOT_READY
8343 * \return WLAN_STATUS_INVALID_LENGTH
8345 /*----------------------------------------------------------------------------*/
8347 wlanoidRftestSetAutoTest (
8348 IN P_ADAPTER_T prAdapter,
8349 OUT PVOID pvSetBuffer,
8350 IN UINT_32 u4SetBufferLen,
8351 OUT PUINT_32 pu4SetInfoLen
8354 P_PARAM_MTK_WIFI_TEST_STRUC_T prRfATInfo;
8355 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
8357 DEBUGFUNC("wlanoidRftestSetAutoTest");
8360 ASSERT(pvSetBuffer);
8361 ASSERT(pu4SetInfoLen);
8363 *pu4SetInfoLen = sizeof(PARAM_MTK_WIFI_TEST_STRUC_T);
8365 if (u4SetBufferLen != sizeof(PARAM_MTK_WIFI_TEST_STRUC_T)) {
8366 DBGLOG(REQ, ERROR, ("Invalid data. SetBufferLen: %ld.\n",
8368 return WLAN_STATUS_INVALID_LENGTH;
8371 prRfATInfo = (P_PARAM_MTK_WIFI_TEST_STRUC_T)pvSetBuffer;
8372 rStatus = rftestSetATInfo(prAdapter, prRfATInfo->u4FuncIndex, prRfATInfo->u4FuncData);
8377 /* RF test OID set handler */
8380 IN P_ADAPTER_T prAdapter,
8381 UINT_32 u4FuncIndex,
8385 P_GLUE_INFO_T prGlueInfo;
8386 P_CMD_INFO_T prCmdInfo;
8387 P_WIFI_CMD_T prWifiCmd;
8388 P_CMD_TEST_CTRL_T pCmdTestCtrl;
8393 prGlueInfo = prAdapter->prGlueInfo;
8394 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
8397 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8398 return WLAN_STATUS_FAILURE;
8401 // increase command sequence number
8402 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8404 // Setup common CMD Info Packet
8405 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
8406 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
8407 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
8408 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
8409 prCmdInfo->fgIsOid = TRUE;
8410 prCmdInfo->ucCID = CMD_ID_TEST_MODE;
8411 prCmdInfo->fgSetQuery = TRUE;
8412 prCmdInfo->fgNeedResp = FALSE;
8413 prCmdInfo->fgDriverDomainMCR = FALSE;
8414 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8415 prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
8416 prCmdInfo->pvInformationBuffer = NULL;
8417 prCmdInfo->u4InformationBufferLength = 0;
8419 // Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T)
8420 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8421 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8422 prWifiCmd->ucCID = prCmdInfo->ucCID;
8423 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8424 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8426 pCmdTestCtrl = (P_CMD_TEST_CTRL_T)(prWifiCmd->aucBuffer);
8427 pCmdTestCtrl->ucAction = 1; // Set ATInfo
8428 pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
8429 pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
8431 // insert into prCmdQueue
8432 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8434 // wakeup txServiceThread later
8435 GLUE_SET_EVENT(prAdapter->prGlueInfo);
8437 return WLAN_STATUS_PENDING;
8442 IN P_ADAPTER_T prAdapter,
8443 UINT_32 u4FuncIndex,
8445 OUT PVOID pvQueryBuffer,
8446 IN UINT_32 u4QueryBufferLen
8449 P_GLUE_INFO_T prGlueInfo;
8450 P_CMD_INFO_T prCmdInfo;
8451 P_WIFI_CMD_T prWifiCmd;
8452 P_CMD_TEST_CTRL_T pCmdTestCtrl;
8454 P_EVENT_TEST_STATUS prTestStatus;
8458 prGlueInfo = prAdapter->prGlueInfo;
8460 if(u4FuncIndex == RF_AT_FUNCID_FW_INFO) {
8461 /* driver implementation */
8462 prTestStatus = (P_EVENT_TEST_STATUS)pvQueryBuffer;
8464 prTestStatus->rATInfo.u4FuncData =
8465 (prAdapter->rVerInfo.u2FwProductID << 16) | (prAdapter->rVerInfo.u2FwOwnVersion);
8466 u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
8468 return WLAN_STATUS_SUCCESS;
8470 else if(u4FuncIndex == RF_AT_FUNCID_DRV_INFO) {
8471 /* driver implementation */
8472 prTestStatus = (P_EVENT_TEST_STATUS)pvQueryBuffer;
8474 prTestStatus->rATInfo.u4FuncData = CFG_DRV_OWN_VERSION;
8475 u4QueryBufferLen = sizeof(EVENT_TEST_STATUS);
8477 return WLAN_STATUS_SUCCESS;
8480 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T)));
8483 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8484 return WLAN_STATUS_FAILURE;
8487 // increase command sequence number
8488 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8490 // Setup common CMD Info Packet
8491 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
8492 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_TEST_CTRL_T);
8493 prCmdInfo->pfCmdDoneHandler = nicCmdEventQueryRfTestATInfo;
8494 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
8495 prCmdInfo->fgIsOid = TRUE;
8496 prCmdInfo->ucCID = CMD_ID_TEST_MODE;
8497 prCmdInfo->fgSetQuery = FALSE;
8498 prCmdInfo->fgNeedResp = TRUE;
8499 prCmdInfo->fgDriverDomainMCR = FALSE;
8500 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8501 prCmdInfo->u4SetInfoLen = sizeof(CMD_TEST_CTRL_T);
8502 prCmdInfo->pvInformationBuffer = pvQueryBuffer;
8503 prCmdInfo->u4InformationBufferLength = u4QueryBufferLen;
8505 // Setup WIFI_CMD_T (payload = CMD_TEST_CTRL_T)
8506 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8507 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8508 prWifiCmd->ucCID = prCmdInfo->ucCID;
8509 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8510 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8512 pCmdTestCtrl = (P_CMD_TEST_CTRL_T)(prWifiCmd->aucBuffer);
8513 pCmdTestCtrl->ucAction = 2; // Get ATInfo
8514 pCmdTestCtrl->u.rRfATInfo.u4FuncIndex = u4FuncIndex;
8515 pCmdTestCtrl->u.rRfATInfo.u4FuncData = u4FuncData;
8517 // insert into prCmdQueue
8518 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8520 // wakeup txServiceThread later
8521 GLUE_SET_EVENT(prAdapter->prGlueInfo);
8523 return WLAN_STATUS_PENDING;
8529 IN P_ADAPTER_T prAdapter,
8530 IN UINT_32 u4FreqInKHz,
8531 IN PUINT_32 pu4SetInfoLen
8534 CMD_TEST_CTRL_T rCmdTestCtrl;
8538 rCmdTestCtrl.ucAction = 5; // Set Channel Frequency
8539 rCmdTestCtrl.u.u4ChannelFreq = u4FreqInKHz;
8541 return wlanSendSetQueryCmd(prAdapter,
8546 nicCmdEventSetCommon,
8547 nicOidCmdTimeoutCommon,
8548 sizeof(CMD_TEST_CTRL_T),
8549 (PUINT_8)&rCmdTestCtrl,
8555 /*----------------------------------------------------------------------------*/
8557 * \brief command packet generation utility
8559 * \param[in] prAdapter Pointer to the Adapter structure.
8560 * \param[in] ucCID Command ID
8561 * \param[in] fgSetQuery Set or Query
8562 * \param[in] fgNeedResp Need for response
8563 * \param[in] pfCmdDoneHandler Function pointer when command is done
8564 * \param[in] u4SetQueryInfoLen The length of the set/query buffer
8565 * \param[in] pucInfoBuffer Pointer to set/query buffer
8568 * \retval WLAN_STATUS_PENDING
8569 * \retval WLAN_STATUS_FAILURE
8571 /*----------------------------------------------------------------------------*/
8573 wlanSendSetQueryCmd (
8574 IN P_ADAPTER_T prAdapter,
8579 PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
8580 PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
8581 UINT_32 u4SetQueryInfoLen,
8582 PUINT_8 pucInfoBuffer,
8583 OUT PVOID pvSetQueryBuffer,
8584 IN UINT_32 u4SetQueryBufferLen
8587 P_GLUE_INFO_T prGlueInfo;
8588 P_CMD_INFO_T prCmdInfo;
8589 P_WIFI_CMD_T prWifiCmd;
8592 prGlueInfo = prAdapter->prGlueInfo;
8593 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
8595 DEBUGFUNC("wlanSendSetQueryCmd");
8598 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8599 return WLAN_STATUS_FAILURE;
8602 // increase command sequence number
8603 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8604 DBGLOG(REQ, TRACE, ("ucCmdSeqNum =%d\n", ucCmdSeqNum));
8606 // Setup common CMD Info Packet
8607 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
8608 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
8609 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + u4SetQueryInfoLen);
8610 prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
8611 prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
8612 prCmdInfo->fgIsOid = fgIsOid;
8613 prCmdInfo->ucCID = ucCID;
8614 prCmdInfo->fgSetQuery = fgSetQuery;
8615 prCmdInfo->fgNeedResp = fgNeedResp;
8616 prCmdInfo->fgDriverDomainMCR = FALSE;
8617 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8618 prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
8619 prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
8620 prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
8622 // Setup WIFI_CMD_T (no payload)
8623 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8624 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8625 prWifiCmd->ucCID = prCmdInfo->ucCID;
8626 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8627 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8629 if(u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL) {
8630 kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
8633 // insert into prCmdQueue
8634 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8636 // wakeup txServiceThread later
8637 GLUE_SET_EVENT(prGlueInfo);
8638 return WLAN_STATUS_PENDING;
8643 #if CFG_SUPPORT_WAPI
8644 /*----------------------------------------------------------------------------*/
8646 * \brief This routine is called by WAPI ui to set wapi mode, which is needed to info the the driver
8647 * to operation at WAPI mode while driver initialize.
8649 * \param[in] prAdapter Pointer to the Adapter structure
8650 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
8651 * \param[in] u4SetBufferLen The length of the set buffer
8652 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8653 * bytes read from the set buffer. If the call failed due to invalid length of
8654 * the set buffer, returns the amount of storage needed.
8656 * \retval WLAN_STATUS_SUCCESS
8657 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
8658 * \retval WLAN_STATUS_INVALID_LENGTH
8661 /*----------------------------------------------------------------------------*/
8663 wlanoidSetWapiMode (
8664 IN P_ADAPTER_T prAdapter,
8665 IN PVOID pvSetBuffer,
8666 IN UINT_32 u4SetBufferLen,
8667 OUT PUINT_32 pu4SetInfoLen
8670 DEBUGFUNC("wlanoidSetWapiMode");
8671 DBGLOG(REQ, LOUD, ("\r\n"));
8674 ASSERT(pu4SetInfoLen);
8675 ASSERT(pvSetBuffer);
8677 /* Todo:: For support WAPI and Wi-Fi at same driver, use the set wapi assoc ie at the check point */
8678 /* The Adapter Connection setting fgUseWapi will cleat whil oid set mode (infra), */
8679 /* And set fgUseWapi True while set wapi assoc ie */
8680 /* policay selection, add key all depend on this flag, */
8681 /* The fgUseWapi may remove later */
8682 if (*(PUINT_32)pvSetBuffer) {
8683 prAdapter->fgUseWapi = TRUE;
8686 prAdapter->fgUseWapi = FALSE;
8690 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + 4));
8693 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8694 return WLAN_STATUS_FAILURE;
8697 // increase command sequence number
8698 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8700 // compose CMD_BUILD_CONNECTION cmd pkt
8701 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
8702 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
8703 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + 4;
8704 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
8705 prCmdInfo->pfCmdTimeoutHandler = NULL;
8706 prCmdInfo->fgIsOid = TRUE;
8707 prCmdInfo->ucCID = CMD_ID_WAPI_MODE;
8708 prCmdInfo->fgSetQuery = TRUE;
8709 prCmdInfo->fgNeedResp = FALSE;
8710 prCmdInfo->fgDriverDomainMCR = FALSE;
8711 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8712 prCmdInfo->u4SetInfoLen = u4SetBufferLen;
8713 prCmdInfo->pvInformationBuffer = pvSetBuffer;
8714 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
8717 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8718 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
8719 prWifiCmd->ucCID = prCmdInfo->ucCID;
8720 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
8721 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
8723 cp = (PUINT_8)(prWifiCmd->aucBuffer);
8725 kalMemCopy(cp, (PUINT_8)pvSetBuffer, 4);
8727 // insert into prCmdQueue
8728 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
8730 // wakeup txServiceThread later
8731 GLUE_SET_EVENT(prGlueInfo);
8733 return WLAN_STATUS_PENDING;
8735 return WLAN_STATUS_SUCCESS;
8740 /*----------------------------------------------------------------------------*/
8742 * \brief This routine is called by WAPI to set the assoc info, which is needed to add to
8743 * Association request frame while join WAPI AP.
8745 * \param[in] prAdapter Pointer to the Adapter structure
8746 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
8747 * \param[in] u4SetBufferLen The length of the set buffer
8748 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8749 * bytes read from the set buffer. If the call failed due to invalid length of
8750 * the set buffer, returns the amount of storage needed.
8752 * \retval WLAN_STATUS_SUCCESS
8753 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
8754 * \retval WLAN_STATUS_INVALID_LENGTH
8757 /*----------------------------------------------------------------------------*/
8759 wlanoidSetWapiAssocInfo (
8760 IN P_ADAPTER_T prAdapter,
8761 IN PVOID pvSetBuffer,
8762 IN UINT_32 u4SetBufferLen,
8763 OUT PUINT_32 pu4SetInfoLen
8766 P_WAPI_INFO_ELEM_T prWapiInfo;
8768 UINT_16 u2AuthSuiteCount = 0;
8769 UINT_16 u2PairSuiteCount = 0;
8770 UINT_32 u4AuthKeyMgtSuite = 0;
8771 UINT_32 u4PairSuite = 0;
8772 UINT_32 u4GroupSuite = 0;
8775 ASSERT(pvSetBuffer);
8776 ASSERT(pu4SetInfoLen);
8778 DEBUGFUNC("wlanoidSetWapiAssocInfo");
8779 DBGLOG(REQ, LOUD, ("\r\n"));
8781 if (u4SetBufferLen < 20 /* From EID to Group cipher */) {
8782 prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
8783 return WLAN_STATUS_INVALID_LENGTH;
8786 prAdapter->rWifiVar.rConnSettings.fgWapiMode = TRUE;
8788 //if (prWapiInfo->ucElemId != ELEM_ID_WAPI)
8789 // DBGLOG(SEC, TRACE, ("Not WAPI IE ?!\n"));
8791 //if (prWapiInfo->ucLength < 18)
8792 // return WLAN_STATUS_INVALID_LENGTH;
8794 *pu4SetInfoLen = u4SetBufferLen;
8796 prWapiInfo = (P_WAPI_INFO_ELEM_T)pvSetBuffer;
8798 if (prWapiInfo->ucElemId != ELEM_ID_WAPI) {
8799 DBGLOG(SEC, TRACE, ("Not WAPI IE ?! u4SetBufferLen = %d\n", u4SetBufferLen));
8800 prAdapter->rWifiVar.rConnSettings.fgWapiMode = FALSE;
8801 return WLAN_STATUS_INVALID_LENGTH;
8804 if (prWapiInfo->ucLength < 18)
8805 return WLAN_STATUS_INVALID_LENGTH;
8807 /* Skip Version check */
8808 cp = (PUINT_8)&prWapiInfo->u2AuthKeyMgtSuiteCount;
8810 WLAN_GET_FIELD_16(cp, &u2AuthSuiteCount);
8812 if (u2AuthSuiteCount>1)
8813 return WLAN_STATUS_INVALID_LENGTH;
8816 WLAN_GET_FIELD_32(cp, &u4AuthKeyMgtSuite);
8818 DBGLOG(SEC, TRACE, ("WAPI: Assoc Info auth mgt suite [%d]: %02x-%02x-%02x-%02x\n",
8820 (UCHAR) (u4AuthKeyMgtSuite & 0x000000FF),
8821 (UCHAR) ((u4AuthKeyMgtSuite >> 8) & 0x000000FF),
8822 (UCHAR) ((u4AuthKeyMgtSuite >> 16) & 0x000000FF),
8823 (UCHAR) ((u4AuthKeyMgtSuite >> 24) & 0x000000FF)));
8825 if (u4AuthKeyMgtSuite != WAPI_AKM_SUITE_802_1X &&
8826 u4AuthKeyMgtSuite != WAPI_AKM_SUITE_PSK)
8830 WLAN_GET_FIELD_16(cp, &u2PairSuiteCount);
8831 if (u2PairSuiteCount>1)
8832 return WLAN_STATUS_INVALID_LENGTH;
8835 WLAN_GET_FIELD_32(cp, &u4PairSuite);
8836 DBGLOG(SEC, TRACE, ("WAPI: Assoc Info pairwise cipher suite [%d]: %02x-%02x-%02x-%02x\n",
8838 (UCHAR) (u4PairSuite & 0x000000FF),
8839 (UCHAR) ((u4PairSuite >> 8) & 0x000000FF),
8840 (UCHAR) ((u4PairSuite >> 16) & 0x000000FF),
8841 (UCHAR) ((u4PairSuite >> 24) & 0x000000FF)));
8843 if (u4PairSuite != WAPI_CIPHER_SUITE_WPI)
8847 WLAN_GET_FIELD_32(cp, &u4GroupSuite);
8848 DBGLOG(SEC, TRACE, ("WAPI: Assoc Info group cipher suite : %02x-%02x-%02x-%02x\n",
8849 (UCHAR) (u4GroupSuite & 0x000000FF),
8850 (UCHAR) ((u4GroupSuite >> 8) & 0x000000FF),
8851 (UCHAR) ((u4GroupSuite >> 16) & 0x000000FF),
8852 (UCHAR) ((u4GroupSuite >> 24) & 0x000000FF)));
8854 if (u4GroupSuite != WAPI_CIPHER_SUITE_WPI)
8857 prAdapter->rWifiVar.rConnSettings.u4WapiSelectedAKMSuite = u4AuthKeyMgtSuite;
8858 prAdapter->rWifiVar.rConnSettings.u4WapiSelectedPairwiseCipher = u4PairSuite;
8859 prAdapter->rWifiVar.rConnSettings.u4WapiSelectedGroupCipher = u4GroupSuite;
8861 kalMemCopy(prAdapter->prGlueInfo->aucWapiAssocInfoIEs, pvSetBuffer, u4SetBufferLen);
8862 prAdapter->prGlueInfo->u2WapiAssocInfoIESz = (UINT_16)u4SetBufferLen;
8863 DBGLOG(SEC, TRACE, ("Assoc Info IE sz %ld\n", u4SetBufferLen));
8865 return WLAN_STATUS_SUCCESS;
8870 /*----------------------------------------------------------------------------*/
8872 * \brief This routine is called to set the wpi key to the driver.
8874 * \param[in] prAdapter Pointer to the Adapter structure.
8875 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
8876 * \param[in] u4SetBufferLen The length of the set buffer.
8877 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
8878 * bytes read from the set buffer. If the call failed
8879 * due to invalid length of the set buffer, returns
8880 * the amount of storage needed.
8882 * \retval WLAN_STATUS_SUCCESS
8883 * \retval WLAN_STATUS_ADAPTER_NOT_READY
8884 * \retval WLAN_STATUS_INVALID_LENGTH
8885 * \retval WLAN_STATUS_INVALID_DATA
8887 * \note The setting buffer P_PARAM_WPI_KEY, which is set by NDIS, is unpacked.
8889 /*----------------------------------------------------------------------------*/
8892 IN P_ADAPTER_T prAdapter,
8893 IN PVOID pvSetBuffer,
8894 IN UINT_32 u4SetBufferLen,
8895 OUT PUINT_32 pu4SetInfoLen
8898 P_GLUE_INFO_T prGlueInfo;
8899 P_CMD_INFO_T prCmdInfo;
8900 P_WIFI_CMD_T prWifiCmd;
8901 P_PARAM_WPI_KEY_T prNewKey;
8902 P_CMD_802_11_KEY prCmdKey;
8906 DEBUGFUNC("wlanoidSetWapiKey");
8907 DBGLOG(REQ, LOUD, ("\r\n"));
8910 ASSERT(pvSetBuffer);
8911 ASSERT(pu4SetInfoLen);
8913 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
8914 DBGLOG(REQ, WARN, ("Fail in set add key! (Adapter not ready). ACPI=D%d, Radio=%d\r\n",
8915 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
8916 return WLAN_STATUS_ADAPTER_NOT_READY;
8919 prNewKey = (P_PARAM_WPI_KEY_T) pvSetBuffer;
8921 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)pvSetBuffer, 560);
8922 pc = (PUINT_8)pvSetBuffer;
8924 *pu4SetInfoLen = u4SetBufferLen;
8926 /* Exception check */
8927 if (prNewKey->ucKeyID != 0x1 ||
8928 prNewKey->ucKeyID != 0x0) {
8929 prNewKey->ucKeyID = prNewKey->ucKeyID & BIT(0);
8930 //DBGLOG(SEC, INFO, ("Invalid WAPI key ID (%d)\r\n", prNewKey->ucKeyID));
8933 /* Dump P_PARAM_WPI_KEY_T content. */
8934 DBGLOG(REQ, TRACE, ("Set: Dump P_PARAM_WPI_KEY_T content\r\n"));
8935 DBGLOG(REQ, TRACE, ("TYPE : %d\r\n", prNewKey->eKeyType));
8936 DBGLOG(REQ, TRACE, ("Direction : %d\r\n", prNewKey->eDirection));
8937 DBGLOG(REQ, TRACE, ("KeyID : %d\r\n", prNewKey->ucKeyID));
8938 DBGLOG(REQ, TRACE, ("AddressIndex:\r\n"));
8939 DBGLOG_MEM8(REQ, TRACE, prNewKey->aucAddrIndex, 12);
8940 prNewKey->u4LenWPIEK = 16;
8942 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)prNewKey->aucWPIEK, (UINT_8)prNewKey->u4LenWPIEK);
8943 prNewKey->u4LenWPICK = 16;
8945 DBGLOG(REQ, TRACE, ("CK Key(%d):\r\n", (UINT_8)prNewKey->u4LenWPICK));
8946 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)prNewKey->aucWPICK, (UINT_8)prNewKey->u4LenWPICK);
8947 DBGLOG(REQ, TRACE, ("PN:\r\n"));
8948 if (prNewKey->eKeyType == 0){
8949 prNewKey->aucPN[0] = 0x5c;
8950 prNewKey->aucPN[1] = 0x36;
8951 prNewKey->aucPN[2] = 0x5c;
8952 prNewKey->aucPN[3] = 0x36;
8953 prNewKey->aucPN[4] = 0x5c;
8954 prNewKey->aucPN[5] = 0x36;
8955 prNewKey->aucPN[6] = 0x5c;
8956 prNewKey->aucPN[7] = 0x36;
8957 prNewKey->aucPN[8] = 0x5c;
8958 prNewKey->aucPN[9] = 0x36;
8959 prNewKey->aucPN[10] = 0x5c;
8960 prNewKey->aucPN[11] = 0x36;
8961 prNewKey->aucPN[12] = 0x5c;
8962 prNewKey->aucPN[13] = 0x36;
8963 prNewKey->aucPN[14] = 0x5c;
8964 prNewKey->aucPN[15] = 0x36;
8967 DBGLOG_MEM8(REQ, TRACE, (PUINT_8)prNewKey->aucPN, 16);
8969 prGlueInfo = prAdapter->prGlueInfo;
8971 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetBufferLen));
8974 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
8975 return WLAN_STATUS_FAILURE;
8978 // increase command sequence number
8979 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
8981 // compose CMD_ID_ADD_REMOVE_KEY cmd pkt
8982 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
8983 prCmdInfo->eNetworkType = NETWORK_TYPE_AIS_INDEX;
8984 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_802_11_KEY);
8985 prCmdInfo->pfCmdDoneHandler = nicCmdEventSetCommon;
8986 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
8987 prCmdInfo->fgIsOid = TRUE;
8988 prCmdInfo->ucCID = CMD_ID_ADD_REMOVE_KEY;
8989 prCmdInfo->fgSetQuery = TRUE;
8990 prCmdInfo->fgNeedResp = FALSE;
8991 prCmdInfo->fgDriverDomainMCR = FALSE;
8992 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
8993 prCmdInfo->u4SetInfoLen = u4SetBufferLen;
8994 prCmdInfo->pvInformationBuffer = pvSetBuffer;
8995 prCmdInfo->u4InformationBufferLength = u4SetBufferLen;
8998 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
8999 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
9000 prWifiCmd->ucCID = prCmdInfo->ucCID;
9001 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
9002 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
9004 prCmdKey = (P_CMD_802_11_KEY)(prWifiCmd->aucBuffer);
9006 kalMemZero(prCmdKey, sizeof(CMD_802_11_KEY));
9008 prCmdKey->ucAddRemove = 1; /* Add */
9010 if (prNewKey->eKeyType == ENUM_WPI_PAIRWISE_KEY) {
9011 prCmdKey->ucTxKey = 1;
9012 prCmdKey->ucKeyType = 1;
9015 kalMemCopy(prCmdKey->aucPeerAddr, (PUINT_8)prNewKey->aucAddrIndex, MAC_ADDR_LEN);
9017 prCmdKey->ucNetType = 0; /* AIS */
9019 prCmdKey->ucKeyId = prNewKey->ucKeyID;
9021 prCmdKey->ucKeyLen = 32;
9023 prCmdKey->ucAlgorithmId = CIPHER_SUITE_WPI;
9025 kalMemCopy(prCmdKey->aucKeyMaterial, (PUINT_8)prNewKey->aucWPIEK, 16);
9027 kalMemCopy(prCmdKey->aucKeyMaterial+16, (PUINT_8)prNewKey->aucWPICK, 16);
9029 kalMemCopy(prCmdKey->aucKeyRsc, (PUINT_8)prNewKey->aucPN, 16);
9031 // insert into prCmdQueue
9032 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
9034 // wakeup txServiceThread later
9035 GLUE_SET_EVENT(prGlueInfo);
9037 return WLAN_STATUS_PENDING;
9038 } /* wlanoidSetAddKey */
9042 #if CFG_SUPPORT_WPS2
9043 /*----------------------------------------------------------------------------*/
9045 * \brief This routine is called by WSC to set the assoc info, which is needed to add to
9046 * Association request frame while join WPS AP.
9048 * \param[in] prAdapter Pointer to the Adapter structure
9049 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
9050 * \param[in] u4SetBufferLen The length of the set buffer
9051 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9052 * bytes read from the set buffer. If the call failed due to invalid length of
9053 * the set buffer, returns the amount of storage needed.
9055 * \retval WLAN_STATUS_SUCCESS
9056 * \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
9057 * \retval WLAN_STATUS_INVALID_LENGTH
9060 /*----------------------------------------------------------------------------*/
9062 wlanoidSetWSCAssocInfo (
9063 IN P_ADAPTER_T prAdapter,
9064 IN PVOID pvSetBuffer,
9065 IN UINT_32 u4SetBufferLen,
9066 OUT PUINT_32 pu4SetInfoLen
9070 ASSERT(pvSetBuffer);
9071 ASSERT(pu4SetInfoLen);
9073 DEBUGFUNC("wlanoidSetWSCAssocInfo");
9074 DBGLOG(REQ, LOUD, ("\r\n"));
9076 if(u4SetBufferLen == 0)
9077 return WLAN_STATUS_INVALID_LENGTH;
9079 *pu4SetInfoLen = u4SetBufferLen;
9081 kalMemCopy(prAdapter->prGlueInfo->aucWSCAssocInfoIE, pvSetBuffer, u4SetBufferLen);
9082 prAdapter->prGlueInfo->u2WSCAssocInfoIELen = (UINT_16)u4SetBufferLen;
9083 DBGLOG(SEC, TRACE, ("Assoc Info IE sz %ld\n", u4SetBufferLen));
9085 return WLAN_STATUS_SUCCESS;
9091 #if CFG_ENABLE_WAKEUP_ON_LAN
9093 wlanoidSetAddWakeupPattern (
9094 IN P_ADAPTER_T prAdapter,
9095 IN PVOID pvSetBuffer,
9096 IN UINT_32 u4SetBufferLen,
9097 OUT PUINT_32 pu4SetInfoLen
9100 P_PARAM_PM_PACKET_PATTERN prPacketPattern;
9102 DEBUGFUNC("wlanoidSetAddWakeupPattern");
9103 DBGLOG(REQ, LOUD, ("\r\n"));
9106 ASSERT(pu4SetInfoLen);
9108 *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
9110 if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN)) {
9111 return WLAN_STATUS_INVALID_LENGTH;
9114 ASSERT(pvSetBuffer);
9116 prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
9119 * Send the struct to firmware */
9121 return WLAN_STATUS_FAILURE;
9126 wlanoidSetRemoveWakeupPattern (
9127 IN P_ADAPTER_T prAdapter,
9128 IN PVOID pvSetBuffer,
9129 IN UINT_32 u4SetBufferLen,
9130 OUT PUINT_32 pu4SetInfoLen
9133 P_PARAM_PM_PACKET_PATTERN prPacketPattern;
9135 DEBUGFUNC("wlanoidSetAddWakeupPattern");
9136 DBGLOG(REQ, LOUD, ("\r\n"));
9139 ASSERT(pu4SetInfoLen);
9141 *pu4SetInfoLen = sizeof(PARAM_PM_PACKET_PATTERN);
9143 if (u4SetBufferLen < sizeof(PARAM_PM_PACKET_PATTERN)) {
9144 return WLAN_STATUS_INVALID_LENGTH;
9147 ASSERT(pvSetBuffer);
9149 prPacketPattern = (P_PARAM_PM_PACKET_PATTERN) pvSetBuffer;
9152 * Send the struct to firmware */
9154 return WLAN_STATUS_FAILURE;
9159 wlanoidQueryEnableWakeup (
9160 IN P_ADAPTER_T prAdapter,
9161 OUT PVOID pvQueryBuffer,
9162 IN UINT_32 u4QueryBufferLen,
9163 OUT PUINT_32 pu4QueryInfoLen
9166 PUINT_32 pu4WakeupEventEnable;
9168 DEBUGFUNC("wlanoidQueryEnableWakeup");
9169 DBGLOG(REQ, LOUD, ("\r\n"));
9172 ASSERT(pu4QueryInfoLen);
9173 if (u4QueryBufferLen) {
9174 ASSERT(pvQueryBuffer);
9177 *pu4QueryInfoLen = sizeof(UINT_32);
9179 if (u4QueryBufferLen < sizeof(UINT_32)) {
9180 return WLAN_STATUS_BUFFER_TOO_SHORT;
9183 pu4WakeupEventEnable = (PUINT_32)pvQueryBuffer;
9185 *pu4WakeupEventEnable = prAdapter->u4WakeupEventEnable;
9187 return WLAN_STATUS_SUCCESS;
9191 wlanoidSetEnableWakeup (
9192 IN P_ADAPTER_T prAdapter,
9193 IN PVOID pvSetBuffer,
9194 IN UINT_32 u4SetBufferLen,
9195 OUT PUINT_32 pu4SetInfoLen
9198 PUINT_32 pu4WakeupEventEnable;
9200 DEBUGFUNC("wlanoidSetEnableWakup");
9201 DBGLOG(REQ, LOUD, ("\r\n"));
9204 ASSERT(pu4SetInfoLen);
9206 *pu4SetInfoLen = sizeof(UINT_32);
9208 if (u4SetBufferLen < sizeof(UINT_32)) {
9209 return WLAN_STATUS_INVALID_LENGTH;
9212 ASSERT(pvSetBuffer);
9214 pu4WakeupEventEnable = (PUINT_32)pvSetBuffer;
9215 prAdapter->u4WakeupEventEnable = *pu4WakeupEventEnable;
9218 * Send Command Event for setting wakeup-pattern / Magic Packet to firmware
9221 return WLAN_STATUS_FAILURE;
9225 /*----------------------------------------------------------------------------*/
9227 * \brief This routine is called to configure PS related settings for WMM-PS test.
9229 * \param[in] prAdapter Pointer to the Adapter structure.
9230 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9231 * \param[in] u4SetBufferLen The length of the set buffer.
9232 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9233 * bytes read from the set buffer. If the call failed
9234 * due to invalid length of the set buffer, returns
9235 * the amount of storage needed.
9237 * \retval WLAN_STATUS_SUCCESS
9239 /*----------------------------------------------------------------------------*/
9241 wlanoidSetWiFiWmmPsTest (
9242 IN P_ADAPTER_T prAdapter,
9243 IN PVOID pvSetBuffer,
9244 IN UINT_32 u4SetBufferLen,
9245 OUT PUINT_32 pu4SetInfoLen
9248 P_PARAM_CUSTOM_WMM_PS_TEST_STRUC_T prWmmPsTestInfo;
9249 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9250 CMD_SET_WMM_PS_TEST_STRUC_T rSetWmmPsTestParam;
9251 UINT_16 u2CmdBufLen;
9252 P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
9253 P_BSS_INFO_T prBssInfo;
9255 DEBUGFUNC("wlanoidSetWiFiWmmPsTest");
9258 ASSERT(pvSetBuffer);
9259 ASSERT(pu4SetInfoLen);
9262 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_WMM_PS_TEST_STRUC_T);
9264 prWmmPsTestInfo = (P_PARAM_CUSTOM_WMM_PS_TEST_STRUC_T) pvSetBuffer;
9266 rSetWmmPsTestParam.ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
9267 rSetWmmPsTestParam.bmfgApsdEnAc = prWmmPsTestInfo->bmfgApsdEnAc;
9268 rSetWmmPsTestParam.ucIsEnterPsAtOnce = prWmmPsTestInfo->ucIsEnterPsAtOnce;
9269 rSetWmmPsTestParam.ucIsDisableUcTrigger = prWmmPsTestInfo->ucIsDisableUcTrigger;
9271 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[rSetWmmPsTestParam.ucNetTypeIndex]);
9272 prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
9273 prPmProfSetupInfo->ucBmpDeliveryAC = (rSetWmmPsTestParam.bmfgApsdEnAc >> 4) & BITS(0, 3);
9274 prPmProfSetupInfo->ucBmpTriggerAC = rSetWmmPsTestParam.bmfgApsdEnAc & BITS(0, 3);
9276 u2CmdBufLen = sizeof(CMD_SET_WMM_PS_TEST_STRUC_T);
9279 /* it will apply the disable trig or not immediately */
9280 if (prPmInfo->ucWmmPsDisableUcPoll && prPmInfo->ucWmmPsConnWithTrig) {
9281 // NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, TRUE);
9284 // NIC_PM_WMM_PS_DISABLE_UC_TRIG(prAdapter, FALSE);
9288 rStatus = wlanSendSetQueryCmd(prAdapter,
9289 CMD_ID_SET_WMM_PS_TEST_PARMS,
9296 (PUINT_8)&rSetWmmPsTestParam,
9302 } /* wlanoidSetWiFiWmmPsTest */
9305 /*----------------------------------------------------------------------------*/
9307 * \brief This routine is called to configure enable/disable TX A-MPDU feature.
9309 * \param[in] prAdapter Pointer to the Adapter structure.
9310 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9311 * \param[in] u4SetBufferLen The length of the set buffer.
9312 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9313 * bytes read from the set buffer. If the call failed
9314 * due to invalid length of the set buffer, returns
9315 * the amount of storage needed.
9317 * \retval WLAN_STATUS_SUCCESS
9319 /*----------------------------------------------------------------------------*/
9322 IN P_ADAPTER_T prAdapter,
9323 IN PVOID pvSetBuffer,
9324 IN UINT_32 u4SetBufferLen,
9325 OUT PUINT_32 pu4SetInfoLen
9328 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9329 CMD_TX_AMPDU_T rTxAmpdu;
9330 UINT_16 u2CmdBufLen;
9333 DEBUGFUNC("wlanoidSetTxAmpdu");
9336 ASSERT(pvSetBuffer);
9337 ASSERT(pu4SetInfoLen);
9340 *pu4SetInfoLen = sizeof(BOOLEAN);
9342 pfgEnable = (PBOOLEAN) pvSetBuffer;
9344 rTxAmpdu.fgEnable = *pfgEnable;
9346 u2CmdBufLen = sizeof(CMD_TX_AMPDU_T);
9348 rStatus = wlanSendSetQueryCmd(prAdapter,
9362 } /* wlanoidSetTxAmpdu */
9365 /*----------------------------------------------------------------------------*/
9367 * \brief This routine is called to configure reject/accept ADDBA Request.
9369 * \param[in] prAdapter Pointer to the Adapter structure.
9370 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9371 * \param[in] u4SetBufferLen The length of the set buffer.
9372 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9373 * bytes read from the set buffer. If the call failed
9374 * due to invalid length of the set buffer, returns
9375 * the amount of storage needed.
9377 * \retval WLAN_STATUS_SUCCESS
9379 /*----------------------------------------------------------------------------*/
9381 wlanoidSetAddbaReject(
9382 IN P_ADAPTER_T prAdapter,
9383 IN PVOID pvSetBuffer,
9384 IN UINT_32 u4SetBufferLen,
9385 OUT PUINT_32 pu4SetInfoLen
9388 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9389 CMD_ADDBA_REJECT_T rAddbaReject;
9390 UINT_16 u2CmdBufLen;
9393 DEBUGFUNC("wlanoidSetAddbaReject");
9396 ASSERT(pvSetBuffer);
9397 ASSERT(pu4SetInfoLen);
9400 *pu4SetInfoLen = sizeof(BOOLEAN);
9402 pfgEnable = (PBOOLEAN) pvSetBuffer;
9404 rAddbaReject.fgEnable = *pfgEnable;
9406 u2CmdBufLen = sizeof(CMD_ADDBA_REJECT_T);
9408 rStatus = wlanSendSetQueryCmd(prAdapter,
9409 CMD_ID_ADDBA_REJECT,
9416 (PUINT_8)&rAddbaReject,
9422 } /* wlanoidSetAddbaReject */
9428 wlanoidQuerySLTStatus (
9429 IN P_ADAPTER_T prAdapter,
9430 OUT PVOID pvQueryBuffer,
9431 IN UINT_32 u4QueryBufferLen,
9432 OUT PUINT_32 pu4QueryInfoLen
9435 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
9436 P_PARAM_MTK_SLT_TEST_STRUC_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T)NULL;
9437 P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T)NULL;
9439 DEBUGFUNC("wlanoidQuerySLTStatus");
9440 DBGLOG(REQ, LOUD, ("\r\n"));
9443 ASSERT(pu4QueryInfoLen);
9445 *pu4QueryInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUC_T);
9447 if (u4QueryBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUC_T)) {
9448 return WLAN_STATUS_INVALID_LENGTH;
9451 ASSERT(pvQueryBuffer);
9453 prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T)pvQueryBuffer;
9455 prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
9457 switch (prMtkSltInfo->rSltFuncIdx) {
9458 case ENUM_MTK_SLT_FUNC_LP_SET:
9460 P_PARAM_MTK_SLT_LP_TEST_STRUC_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)NULL;
9462 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUC_T));
9464 prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9466 prLpSetting->u4BcnRcvNum = prSltInfo->u4BeaconReceiveCnt;
9475 } /* wlanoidQuerySLTStatus */
9478 wlanoidUpdateSLTMode (
9479 IN P_ADAPTER_T prAdapter,
9480 IN PVOID pvSetBuffer,
9481 IN UINT_32 u4SetBufferLen,
9482 OUT PUINT_32 pu4SetInfoLen
9485 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
9486 P_PARAM_MTK_SLT_TEST_STRUC_T prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T)NULL;
9487 P_SLT_INFO_T prSltInfo = (P_SLT_INFO_T)NULL;
9488 P_BSS_DESC_T prBssDesc = (P_BSS_DESC_T)NULL;
9489 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
9490 P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T)NULL;
9492 /* 1. Action: Update or Initial Set
9494 * 3. Target MAC address.
9495 * 4. RF BW & Rate Settings
9498 DEBUGFUNC("wlanoidUpdateSLTMode");
9499 DBGLOG(REQ, LOUD, ("\r\n"));
9502 ASSERT(pu4SetInfoLen);
9504 *pu4SetInfoLen = sizeof(PARAM_MTK_SLT_TEST_STRUC_T);
9506 if (u4SetBufferLen < sizeof(PARAM_MTK_SLT_TEST_STRUC_T)) {
9507 return WLAN_STATUS_INVALID_LENGTH;
9510 ASSERT(pvSetBuffer);
9512 prMtkSltInfo = (P_PARAM_MTK_SLT_TEST_STRUC_T) pvSetBuffer;
9514 prSltInfo = &(prAdapter->rWifiVar.rSltInfo);
9515 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
9517 switch (prMtkSltInfo->rSltFuncIdx) {
9518 case ENUM_MTK_SLT_FUNC_INITIAL: /* Initialize */
9520 P_PARAM_MTK_SLT_INITIAL_STRUC_T prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUC_T)NULL;
9522 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_INITIAL_STRUC_T));
9524 prMtkSltInit = (P_PARAM_MTK_SLT_INITIAL_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9526 if (prSltInfo->prPseudoStaRec != NULL) {
9527 /* The driver has been initialized. */
9528 prSltInfo->prPseudoStaRec = NULL;
9532 prSltInfo->prPseudoBssDesc = scanSearchExistingBssDesc(prAdapter,
9534 prMtkSltInit->aucTargetMacAddr,
9535 prMtkSltInit->aucTargetMacAddr);
9537 prSltInfo->u2SiteID = prMtkSltInit->u2SiteID;
9539 /* Bandwidth 2.4G: Channel 1~14
9540 * Bandwidth 5G: *36, 40, 44, 48, 52, 56, 60, 64,
9541 * *100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
9542 * 149, 153, *157, 161,
9543 * 184, 188, 192, 196, 200, 204, 208, 212, *216
9545 prSltInfo->ucChannel2G4 = 1 + (prSltInfo->u2SiteID % 4) * 5;
9547 switch (prSltInfo->ucChannel2G4) {
9549 prSltInfo->ucChannel5G = 36;
9552 prSltInfo->ucChannel5G = 52;
9555 prSltInfo->ucChannel5G = 104;
9558 prSltInfo->ucChannel2G4 = 14;
9559 prSltInfo->ucChannel5G = 161;
9565 if (prSltInfo->prPseudoBssDesc == NULL) {
9567 prSltInfo->prPseudoBssDesc = scanAllocateBssDesc(prAdapter);
9569 if (prSltInfo->prPseudoBssDesc == NULL) {
9570 rWlanStatus = WLAN_STATUS_FAILURE;
9574 prBssDesc = prSltInfo->prPseudoBssDesc;
9579 prBssDesc = prSltInfo->prPseudoBssDesc;
9583 prBssDesc->eBSSType = BSS_TYPE_IBSS;
9585 COPY_MAC_ADDR(prBssDesc->aucSrcAddr, prMtkSltInit->aucTargetMacAddr);
9586 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
9588 prBssDesc->u2BeaconInterval = 100;
9589 prBssDesc->u2ATIMWindow = 0;
9590 prBssDesc->ucDTIMPeriod = 1;
9592 prBssDesc->u2IELength = 0;
9594 prBssDesc->fgIsERPPresent = TRUE;
9595 prBssDesc->fgIsHTPresent = TRUE;
9597 prBssDesc->u2OperationalRateSet = BIT(RATE_36M_INDEX);
9598 prBssDesc->u2BSSBasicRateSet = BIT(RATE_36M_INDEX);
9599 prBssDesc->fgIsUnknownBssBasicRate = FALSE;
9601 prBssDesc->fgIsLargerTSF = TRUE;
9603 prBssDesc->eBand = BAND_2G4;
9605 prBssDesc->ucChannelNum = prSltInfo->ucChannel2G4;
9607 prBssDesc->ucPhyTypeSet = PHY_TYPE_SET_802_11ABGN;
9609 GET_CURRENT_SYSTIME(&prBssDesc->rUpdateTime);
9613 case ENUM_MTK_SLT_FUNC_RATE_SET: /* Update RF Settings. */
9614 if (prSltInfo->prPseudoStaRec == NULL) {
9615 rWlanStatus = WLAN_STATUS_FAILURE;
9618 P_PARAM_MTK_SLT_TR_TEST_STRUC_T prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUC_T)NULL;
9620 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_TR_TEST_STRUC_T));
9622 prStaRec = prSltInfo->prPseudoStaRec;
9623 prTRSetting = (P_PARAM_MTK_SLT_TR_TEST_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9625 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
9626 prBssInfo->eBand = BAND_5G;
9627 prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel5G;
9629 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM24) {
9630 prBssInfo->eBand = BAND_2G4;
9631 prBssInfo->ucPrimaryChannel = prSltInfo->ucChannel2G4;
9634 if ((prTRSetting->u4FixedRate & FIXED_BW_DL40) != 0) {
9636 prStaRec->u2HtCapInfo |= HT_CAP_INFO_SUP_CHNL_WIDTH; /* It would controls RFBW capability in WTBL. */
9637 prStaRec->ucDesiredPhyTypeSet = PHY_TYPE_BIT_HT; /* This controls RF BW, RF BW would be 40 only if
9638 * 1. PHY_TYPE_BIT_HT is TRUE.
9639 * 2. SCO is SCA/SCB.
9642 /* U20/L20 Control. */
9643 switch (prTRSetting->u4FixedRate & 0xC000) {
9644 case FIXED_EXT_CHNL_U20:
9645 prBssInfo->eBssSCO = CHNL_EXT_SCB; // +2
9646 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
9647 prBssInfo->ucPrimaryChannel += 2;
9650 if (prBssInfo->ucPrimaryChannel <5) {
9651 prBssInfo->ucPrimaryChannel = 8; // For channel 1, testing L20 at channel 8.
9655 case FIXED_EXT_CHNL_L20:
9657 prBssInfo->eBssSCO = CHNL_EXT_SCA; // -2
9658 if (prTRSetting->rNetworkType == PARAM_NETWORK_TYPE_OFDM5) {
9659 prBssInfo->ucPrimaryChannel -= 2;
9662 if (prBssInfo->ucPrimaryChannel > 10) {
9663 prBssInfo->ucPrimaryChannel = 3; // For channel 11 / 14. testing U20 at channel 3.
9671 prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_SUP_CHNL_WIDTH;
9672 prBssInfo->eBssSCO = CHNL_EXT_SCN;
9675 prBssInfo->fgErpProtectMode = FALSE;
9676 prBssInfo->eHtProtectMode = HT_PROTECT_MODE_NONE;
9677 prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
9679 nicUpdateBss(prAdapter, prBssInfo->ucNetTypeIndex);
9681 prStaRec->u2HtCapInfo &= ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
9683 switch (prTRSetting->u4FixedRate & 0xFF) {
9685 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_54M_INDEX);
9688 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_48M_INDEX);
9691 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_INDEX);
9694 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_24M_INDEX);
9697 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_6M_INDEX);
9699 case RATE_CCK_11M_LONG:
9700 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_11M_INDEX);
9702 case RATE_CCK_1M_LONG:
9703 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_1M_INDEX);
9706 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
9707 prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
9710 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
9711 prStaRec->u2HtCapInfo &= ~HT_CAP_INFO_HT_GF;
9712 #if 0 // Only for Current Measurement Mode.
9713 prStaRec->u2HtCapInfo |= (HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
9717 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_HT_PHY_INDEX);
9718 prStaRec->u2HtCapInfo |= HT_CAP_INFO_HT_GF;
9721 prStaRec->u2DesiredNonHTRateSet = BIT(RATE_36M_INDEX);
9725 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
9727 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
9731 case ENUM_MTK_SLT_FUNC_LP_SET: /* Reset LP Test Result. */
9733 P_PARAM_MTK_SLT_LP_TEST_STRUC_T prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)NULL;
9735 ASSERT(prMtkSltInfo->u4FuncInfoLen == sizeof(PARAM_MTK_SLT_LP_TEST_STRUC_T));
9737 prLpSetting = (P_PARAM_MTK_SLT_LP_TEST_STRUC_T)&prMtkSltInfo->unFuncInfoContent;
9739 if (prSltInfo->prPseudoBssDesc == NULL) {
9740 /* Please initial SLT Mode first. */
9744 prBssDesc = prSltInfo->prPseudoBssDesc;
9747 switch (prLpSetting->rLpTestMode) {
9748 case ENUM_MTK_LP_TEST_NORMAL:
9749 /* In normal mode, we would use target MAC address to be the BSSID. */
9750 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
9751 prSltInfo->fgIsDUT = FALSE;
9753 case ENUM_MTK_LP_TEST_GOLDEN_SAMPLE:
9754 /* 1. Lower AIFS of BCN queue.
9755 * 2. Fixed Random Number tobe 0.
9757 prSltInfo->fgIsDUT = FALSE;
9758 /* In LP test mode, we would use MAC address of Golden Sample to be the BSSID. */
9759 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssInfo->aucOwnMacAddr);
9761 case ENUM_MTK_LP_TEST_DUT:
9762 /* 1. Enter Sleep Mode.
9763 * 2. Fix random number a large value & enlarge AIFN of BCN queue.
9765 COPY_MAC_ADDR(prBssDesc->aucBSSID, prBssDesc->aucSrcAddr);
9766 prSltInfo->u4BeaconReceiveCnt = 0;
9767 prSltInfo->fgIsDUT = TRUE;
9781 return WLAN_STATUS_FAILURE;
9785 } /* wlanoidUpdateSLTMode */
9789 /*----------------------------------------------------------------------------*/
9791 * \brief This routine is called to query NVRAM value.
9793 * \param[in] pvAdapter Pointer to the Adapter structure.
9794 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
9796 * \param[in] u4QueryBufLen The length of the query buffer.
9797 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
9798 * bytes written into the query buffer. If the call
9799 * failed due to invalid length of the query buffer,
9800 * returns the amount of storage needed.
9802 * \retval WLAN_STATUS_SUCCESS
9803 * \retval WLAN_STATUS_FAILURE
9805 /*----------------------------------------------------------------------------*/
9807 wlanoidQueryNvramRead (
9808 IN P_ADAPTER_T prAdapter,
9809 OUT PVOID pvQueryBuffer,
9810 IN UINT_32 u4QueryBufferLen,
9811 OUT PUINT_32 pu4QueryInfoLen
9814 P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
9817 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9819 DEBUGFUNC("wlanoidQueryNvramRead");
9822 ASSERT(pu4QueryInfoLen);
9823 if (u4QueryBufferLen) {
9824 ASSERT(pvQueryBuffer);
9827 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
9829 if (u4QueryBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T)) {
9830 return WLAN_STATUS_INVALID_LENGTH;
9833 prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T)pvQueryBuffer;
9835 if(prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_READ) {
9836 fgStatus = kalCfgDataRead16(prAdapter->prGlueInfo,
9837 prNvramRwInfo->ucEepromIndex << 1, /* change to byte offset */
9841 prNvramRwInfo->u2EepromData = u2Data;
9842 DBGLOG(REQ, INFO, ("NVRAM Read: index=%#X, data=%#02X\r\n",
9843 prNvramRwInfo->ucEepromIndex, u2Data));
9846 DBGLOG(REQ, ERROR, ("NVRAM Read Failed: index=%#x.\r\n",
9847 prNvramRwInfo->ucEepromIndex));
9848 rStatus = WLAN_STATUS_FAILURE;
9851 else if (prNvramRwInfo->ucEepromMethod == PARAM_EEPROM_READ_METHOD_GETSIZE) {
9852 prNvramRwInfo->u2EepromData = CFG_FILE_WIFI_REC_SIZE;
9853 DBGLOG(REQ, INFO, ("EEPROM size =%d\r\n", prNvramRwInfo->u2EepromData));
9856 *pu4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUC_T);
9859 } /* wlanoidQueryNvramRead */
9862 /*----------------------------------------------------------------------------*/
9864 * \brief This routine is called to write NVRAM value.
9866 * \param[in] prAdapter Pointer to the Adapter structure.
9867 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9868 * \param[in] u4SetBufferLen The length of the set buffer.
9869 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9870 * bytes read from the set buffer. If the call failed
9871 * due to invalid length of the set buffer, returns
9872 * the amount of storage needed.
9874 * \retval WLAN_STATUS_SUCCESS
9875 * \retval WLAN_STATUS_FAILURE
9877 /*----------------------------------------------------------------------------*/
9879 wlanoidSetNvramWrite (
9880 IN P_ADAPTER_T prAdapter,
9881 IN PVOID pvSetBuffer,
9882 IN UINT_32 u4SetBufferLen,
9883 OUT PUINT_32 pu4SetInfoLen
9886 P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T prNvramRwInfo;
9888 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
9891 DEBUGFUNC("wlanoidSetNvramWrite");
9892 DBGLOG(INIT, LOUD,("\n"));
9895 ASSERT(pu4SetInfoLen);
9897 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T);
9899 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NVRAM_RW_STRUCT_T)) {
9900 return WLAN_STATUS_INVALID_LENGTH;
9903 ASSERT(pvSetBuffer);
9905 prNvramRwInfo = (P_PARAM_CUSTOM_NVRAM_RW_STRUCT_T)pvSetBuffer;
9907 fgStatus = kalCfgDataWrite16(prAdapter->prGlueInfo,
9908 prNvramRwInfo->ucEepromIndex << 1, /* change to byte offset */
9909 prNvramRwInfo->u2EepromData
9912 if(fgStatus == FALSE){
9913 DBGLOG(REQ, ERROR, ("NVRAM Write Failed.\r\n"));
9914 rStatus = WLAN_STATUS_FAILURE;
9918 } /* wlanoidSetNvramWrite */
9921 /*----------------------------------------------------------------------------*/
9923 * \brief This routine is called to get the config data source type.
9925 * \param[in] prAdapter Pointer to the Adapter structure.
9926 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9927 * \param[in] u4SetBufferLen The length of the set buffer.
9928 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9929 * bytes read from the set buffer. If the call failed
9930 * due to invalid length of the set buffer, returns
9931 * the amount of storage needed.
9933 * \retval WLAN_STATUS_SUCCESS
9934 * \retval WLAN_STATUS_FAILURE
9936 /*----------------------------------------------------------------------------*/
9938 wlanoidQueryCfgSrcType(
9939 IN P_ADAPTER_T prAdapter,
9940 OUT PVOID pvQueryBuffer,
9941 IN UINT_32 u4QueryBufferLen,
9942 OUT PUINT_32 pu4QueryInfoLen
9947 *pu4QueryInfoLen = sizeof(ENUM_CFG_SRC_TYPE_T);
9949 if(kalIsConfigurationExist(prAdapter->prGlueInfo) == TRUE) {
9950 *(P_ENUM_CFG_SRC_TYPE_T)pvQueryBuffer = CFG_SRC_TYPE_NVRAM;
9953 *(P_ENUM_CFG_SRC_TYPE_T)pvQueryBuffer = CFG_SRC_TYPE_EEPROM;
9956 return WLAN_STATUS_SUCCESS;
9960 /*----------------------------------------------------------------------------*/
9962 * \brief This routine is called to get the config data source type.
9964 * \param[in] prAdapter Pointer to the Adapter structure.
9965 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
9966 * \param[in] u4SetBufferLen The length of the set buffer.
9967 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
9968 * bytes read from the set buffer. If the call failed
9969 * due to invalid length of the set buffer, returns
9970 * the amount of storage needed.
9972 * \retval WLAN_STATUS_SUCCESS
9973 * \retval WLAN_STATUS_FAILURE
9975 /*----------------------------------------------------------------------------*/
9977 wlanoidQueryEepromType(
9978 IN P_ADAPTER_T prAdapter,
9979 OUT PVOID pvQueryBuffer,
9980 IN UINT_32 u4QueryBufferLen,
9981 OUT PUINT_32 pu4QueryInfoLen
9986 *pu4QueryInfoLen = sizeof(P_ENUM_EEPROM_TYPE_T);
9988 #if CFG_SUPPORT_NIC_CAPABILITY
9989 if(prAdapter->fgIsEepromUsed == TRUE) {
9990 *( P_ENUM_EEPROM_TYPE_T )pvQueryBuffer = EEPROM_TYPE_PRESENT;
9993 *( P_ENUM_EEPROM_TYPE_T )pvQueryBuffer = EEPROM_TYPE_NO;
9996 *( P_ENUM_EEPROM_TYPE_T )pvQueryBuffer = EEPROM_TYPE_NO;
9999 return WLAN_STATUS_SUCCESS;
10002 /*----------------------------------------------------------------------------*/
10004 * \brief This routine is called to get the config data source type.
10006 * \param[in] prAdapter Pointer to the Adapter structure.
10007 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
10008 * \param[in] u4SetBufferLen The length of the set buffer.
10009 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
10010 * bytes read from the set buffer. If the call failed
10011 * due to invalid length of the set buffer, returns
10012 * the amount of storage needed.
10014 * \retval WLAN_STATUS_SUCCESS
10015 * \retval WLAN_STATUS_FAILURE
10017 /*----------------------------------------------------------------------------*/
10019 wlanoidSetCountryCode (
10020 IN P_ADAPTER_T prAdapter,
10021 IN PVOID pvSetBuffer,
10022 IN UINT_32 u4SetBufferLen,
10023 OUT PUINT_32 pu4SetInfoLen
10026 PUINT_8 pucCountry;
10029 ASSERT(pvSetBuffer);
10030 ASSERT(u4SetBufferLen == 2);
10032 *pu4SetInfoLen = 2;
10034 pucCountry = pvSetBuffer;
10036 prAdapter->rWifiVar.rConnSettings.u2CountryCode =
10037 (((UINT_16) pucCountry[0]) << 8) | ((UINT_16) pucCountry[1]) ;
10039 prAdapter->prDomainInfo = NULL; /* Force to re-search country code */
10040 rlmDomainSendCmd(prAdapter, TRUE);
10042 return WLAN_STATUS_SUCCESS;
10047 wlanoidSetNoaParam (
10048 IN P_ADAPTER_T prAdapter,
10049 IN PVOID pvSetBuffer,
10050 IN UINT_32 u4SetBufferLen,
10051 OUT PUINT_32 pu4SetInfoLen
10054 P_PARAM_CUSTOM_NOA_PARAM_STRUC_T prNoaParam;
10055 CMD_CUSTOM_NOA_PARAM_STRUC_T rCmdNoaParam;
10057 DEBUGFUNC("wlanoidSetNoaParam");
10058 DBGLOG(INIT, LOUD,("\n"));
10061 ASSERT(pu4SetInfoLen);
10063 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T);
10065 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T)) {
10066 return WLAN_STATUS_INVALID_LENGTH;
10069 ASSERT(pvSetBuffer);
10071 prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUC_T)pvSetBuffer;
10073 kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T));
10074 rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
10075 rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
10076 rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
10078 return wlanSendSetQueryCmd(prAdapter,
10079 CMD_ID_SET_NOA_PARAM,
10083 nicCmdEventSetCommon,
10084 nicOidCmdTimeoutCommon,
10085 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T),
10086 (PUINT_8)&rCmdNoaParam,
10093 wlanoidSetOppPsParam (
10094 IN P_ADAPTER_T prAdapter,
10095 IN PVOID pvSetBuffer,
10096 IN UINT_32 u4SetBufferLen,
10097 OUT PUINT_32 pu4SetInfoLen
10100 P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T prOppPsParam;
10101 CMD_CUSTOM_OPPPS_PARAM_STRUC_T rCmdOppPsParam;
10103 DEBUGFUNC("wlanoidSetOppPsParam");
10104 DBGLOG(INIT, LOUD,("\n"));
10107 ASSERT(pu4SetInfoLen);
10109 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T);
10111 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)) {
10112 return WLAN_STATUS_INVALID_LENGTH;
10115 ASSERT(pvSetBuffer);
10117 prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)pvSetBuffer;
10119 kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
10120 rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
10122 return wlanSendSetQueryCmd(prAdapter,
10123 CMD_ID_SET_OPPPS_PARAM,
10127 nicCmdEventSetCommon,
10128 nicOidCmdTimeoutCommon,
10129 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
10130 (PUINT_8)&rCmdOppPsParam,
10137 wlanoidSetUApsdParam (
10138 IN P_ADAPTER_T prAdapter,
10139 IN PVOID pvSetBuffer,
10140 IN UINT_32 u4SetBufferLen,
10141 OUT PUINT_32 pu4SetInfoLen
10144 P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T prUapsdParam;
10145 CMD_CUSTOM_UAPSD_PARAM_STRUC_T rCmdUapsdParam;
10146 P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
10147 P_BSS_INFO_T prBssInfo;
10150 DEBUGFUNC("wlanoidSetUApsdParam");
10151 DBGLOG(INIT, LOUD,("\n"));
10154 ASSERT(pu4SetInfoLen);
10156 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T);
10158 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)) {
10159 return WLAN_STATUS_INVALID_LENGTH;
10162 ASSERT(pvSetBuffer);
10164 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
10165 prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
10167 prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)pvSetBuffer;
10169 kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
10170 rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
10171 prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
10173 rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
10174 rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
10175 rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
10176 rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
10177 prPmProfSetupInfo->ucBmpDeliveryAC =
10178 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
10179 (prUapsdParam->fgEnAPSD_AcBk << 1) |
10180 (prUapsdParam->fgEnAPSD_AcVi << 2) |
10181 (prUapsdParam->fgEnAPSD_AcVo << 3));
10182 prPmProfSetupInfo->ucBmpTriggerAC =
10183 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
10184 (prUapsdParam->fgEnAPSD_AcBk << 1) |
10185 (prUapsdParam->fgEnAPSD_AcVi << 2) |
10186 (prUapsdParam->fgEnAPSD_AcVo << 3));
10188 rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
10189 prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
10191 return wlanSendSetQueryCmd(prAdapter,
10192 CMD_ID_SET_UAPSD_PARAM,
10196 nicCmdEventSetCommon,
10197 nicOidCmdTimeoutCommon,
10198 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
10199 (PUINT_8)&rCmdUapsdParam,
10206 /*----------------------------------------------------------------------------*/
10208 * \brief This routine is called to set BT profile or BT information and the
10209 * driver will set the built-in PTA configuration into chip.
10212 * \param[in] prAdapter Pointer to the Adapter structure.
10213 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
10214 * \param[in] u4SetBufferLen The length of the set buffer.
10215 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
10216 * bytes read from the set buffer. If the call failed
10217 * due to invalid length of the set buffer, returns
10218 * the amount of storage needed.
10220 * \retval WLAN_STATUS_SUCCESS
10221 * \retval WLAN_STATUS_INVALID_LENGTH
10223 /*----------------------------------------------------------------------------*/
10226 IN P_ADAPTER_T prAdapter,
10227 IN PVOID pvSetBuffer,
10228 IN UINT_32 u4SetBufferLen,
10229 OUT PUINT_32 pu4SetInfoLen
10233 P_PTA_IPC_T prPtaIpc;
10235 DEBUGFUNC("wlanoidSetBT.\n");
10238 ASSERT(pu4SetInfoLen);
10240 *pu4SetInfoLen = sizeof(PTA_IPC_T);
10241 if (u4SetBufferLen != sizeof(PTA_IPC_T)) {
10242 WARNLOG(("Invalid length %ld\n", u4SetBufferLen));
10243 return WLAN_STATUS_INVALID_LENGTH;
10246 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
10247 DBGLOG(REQ, WARN, ("Fail to set BT profile because of ACPI_D3\n"));
10248 return WLAN_STATUS_ADAPTER_NOT_READY;
10251 ASSERT(pvSetBuffer);
10252 prPtaIpc = (P_PTA_IPC_T)pvSetBuffer;
10254 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
10255 printk(KERN_INFO DRV_NAME "BCM BWCS CMD: BWCS CMD = %02x%02x%02x%02x\n",
10256 prPtaIpc->u.aucBTPParams[0], prPtaIpc->u.aucBTPParams[1], prPtaIpc->u.aucBTPParams[2], prPtaIpc->u.aucBTPParams[3]);
10258 printk(KERN_INFO DRV_NAME "BCM BWCS CMD: aucBTPParams[0] = %02x, aucBTPParams[1] = %02x, aucBTPParams[2] = %02x, aucBTPParams[3] = %02x.\n",
10259 prPtaIpc->u.aucBTPParams[0],
10260 prPtaIpc->u.aucBTPParams[1],
10261 prPtaIpc->u.aucBTPParams[2],
10262 prPtaIpc->u.aucBTPParams[3]);
10265 wlanSendSetQueryCmd(prAdapter,
10277 return WLAN_STATUS_SUCCESS;
10280 /*----------------------------------------------------------------------------*/
10282 * \brief This routine is called to query current BT profile and BTCR values
10284 * \param[in] prAdapter Pointer to the Adapter structure.
10285 * \param[in] pvQueryBuffer Pointer to the buffer that holds the result of
10287 * \param[in] u4QueryBufferLen The length of the query buffer.
10288 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
10289 * bytes written into the query buffer. If the call
10290 * failed due to invalid length of the query buffer,
10291 * returns the amount of storage needed.
10293 * \retval WLAN_STATUS_SUCCESS
10294 * \retval WLAN_STATUS_INVALID_LENGTH
10296 /*----------------------------------------------------------------------------*/
10299 IN P_ADAPTER_T prAdapter,
10300 OUT PVOID pvQueryBuffer,
10301 IN UINT_32 u4QueryBufferLen,
10302 OUT PUINT_32 pu4QueryInfoLen
10305 // P_PARAM_PTA_IPC_T prPtaIpc;
10306 // UINT_32 u4QueryBuffLen;
10309 ASSERT(pu4QueryInfoLen);
10310 if (u4QueryBufferLen) {
10311 ASSERT(pvQueryBuffer);
10314 *pu4QueryInfoLen = sizeof(PTA_IPC_T);
10316 /* Check for query buffer length */
10317 if (u4QueryBufferLen != sizeof(PTA_IPC_T)) {
10318 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
10319 return WLAN_STATUS_INVALID_LENGTH;
10322 ASSERT(pvQueryBuffer);
10323 // prPtaIpc = (P_PTA_IPC_T)pvQueryBuffer;
10324 // prPtaIpc->ucCmd = BT_CMD_PROFILE;
10325 // prPtaIpc->ucLen = sizeof(prPtaIpc->u);
10326 // nicPtaGetProfile(prAdapter, (PUINT_8)&prPtaIpc->u, &u4QueryBuffLen);
10328 return WLAN_STATUS_SUCCESS;
10333 wlanoidQueryBtSingleAntenna (
10334 IN P_ADAPTER_T prAdapter,
10335 OUT PVOID pvQueryBuffer,
10336 IN UINT_32 u4QueryBufferLen,
10337 OUT PUINT_32 pu4QueryInfoLen
10340 P_PTA_INFO_T prPtaInfo;
10341 PUINT_32 pu4SingleAntenna;
10344 ASSERT(pu4QueryInfoLen);
10345 if (u4QueryBufferLen) {
10346 ASSERT(pvQueryBuffer);
10349 *pu4QueryInfoLen = sizeof(UINT_32);
10351 /* Check for query buffer length */
10352 if (u4QueryBufferLen != sizeof(UINT_32)) {
10353 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
10354 return WLAN_STATUS_INVALID_LENGTH;
10357 ASSERT(pvQueryBuffer);
10359 prPtaInfo = &prAdapter->rPtaInfo;
10360 pu4SingleAntenna = (PUINT_32)pvQueryBuffer;
10362 if(prPtaInfo->fgSingleAntenna) {
10363 //printk(KERN_WARNING DRV_NAME"Q Single Ant = 1\r\n");
10364 *pu4SingleAntenna = 1;
10366 //printk(KERN_WARNING DRV_NAME"Q Single Ant = 0\r\n");
10367 *pu4SingleAntenna = 0;
10370 return WLAN_STATUS_SUCCESS;
10375 wlanoidSetBtSingleAntenna (
10376 IN P_ADAPTER_T prAdapter,
10377 IN PVOID pvSetBuffer,
10378 IN UINT_32 u4SetBufferLen,
10379 OUT PUINT_32 pu4SetInfoLen
10383 PUINT_32 pu4SingleAntenna;
10384 UINT_32 u4SingleAntenna;
10385 P_PTA_INFO_T prPtaInfo;
10388 ASSERT(pu4SetInfoLen);
10390 prPtaInfo = &prAdapter->rPtaInfo;
10392 *pu4SetInfoLen = sizeof(UINT_32);
10393 if (u4SetBufferLen != sizeof(UINT_32)) {
10394 return WLAN_STATUS_INVALID_LENGTH;
10397 if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
10398 return WLAN_STATUS_SUCCESS;
10401 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
10402 DBGLOG(REQ, WARN, ("Fail to set antenna because of ACPI_D3\n"));
10403 return WLAN_STATUS_ADAPTER_NOT_READY;
10406 ASSERT(pvSetBuffer);
10407 pu4SingleAntenna = (PUINT_32)pvSetBuffer;
10408 u4SingleAntenna = *pu4SingleAntenna;
10410 if (u4SingleAntenna == 0) {
10411 //printk(KERN_WARNING DRV_NAME"Set Single Ant = 0\r\n");
10412 prPtaInfo->fgSingleAntenna = FALSE;
10414 //printk(KERN_WARNING DRV_NAME"Set Single Ant = 1\r\n");
10415 prPtaInfo->fgSingleAntenna = TRUE;
10417 ptaFsmRunEventSetConfig(prAdapter, &prPtaInfo->rPtaParam);
10419 return WLAN_STATUS_SUCCESS;
10423 #if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
10426 IN P_ADAPTER_T prAdapter,
10427 OUT PVOID pvQueryBuffer,
10428 IN UINT_32 u4QueryBufferLen,
10429 OUT PUINT_32 pu4QueryInfoLen
10432 P_PTA_INFO_T prPtaInfo;
10436 ASSERT(pu4QueryInfoLen);
10437 if (u4QueryBufferLen) {
10438 ASSERT(pvQueryBuffer);
10441 *pu4QueryInfoLen = sizeof(UINT_32);
10443 /* Check for query buffer length */
10444 if (u4QueryBufferLen != sizeof(UINT_32)) {
10445 DBGLOG(REQ, WARN, ("Invalid length %lu\n", u4QueryBufferLen));
10446 return WLAN_STATUS_INVALID_LENGTH;
10449 ASSERT(pvQueryBuffer);
10451 prPtaInfo = &prAdapter->rPtaInfo;
10452 pu4Pta = (PUINT_32)pvQueryBuffer;
10454 if(prPtaInfo->fgEnabled) {
10455 //printk(KERN_WARNING DRV_NAME"PTA = 1\r\n");
10458 //printk(KERN_WARNING DRV_NAME"PTA = 0\r\n");
10462 return WLAN_STATUS_SUCCESS;
10468 IN P_ADAPTER_T prAdapter,
10469 IN PVOID pvSetBuffer,
10470 IN UINT_32 u4SetBufferLen,
10471 OUT PUINT_32 pu4SetInfoLen
10474 PUINT_32 pu4PtaCtrl;
10478 ASSERT(pu4SetInfoLen);
10480 *pu4SetInfoLen = sizeof(UINT_32);
10481 if (u4SetBufferLen != sizeof(UINT_32)) {
10482 return WLAN_STATUS_INVALID_LENGTH;
10485 if (IS_ARB_IN_RFTEST_STATE(prAdapter)) {
10486 return WLAN_STATUS_SUCCESS;
10489 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
10490 DBGLOG(REQ, WARN, ("Fail to set BT setting because of ACPI_D3\n"));
10491 return WLAN_STATUS_ADAPTER_NOT_READY;
10494 ASSERT(pvSetBuffer);
10495 pu4PtaCtrl = (PUINT_32)pvSetBuffer;
10496 u4PtaCtrl = *pu4PtaCtrl;
10498 if (u4PtaCtrl == 0) {
10499 //printk(KERN_WARNING DRV_NAME"Set Pta= 0\r\n");
10500 nicPtaSetFunc(prAdapter, FALSE);
10502 //printk(KERN_WARNING DRV_NAME"Set Pta= 1\r\n");
10503 nicPtaSetFunc(prAdapter, TRUE);
10506 return WLAN_STATUS_SUCCESS;
10512 /*----------------------------------------------------------------------------*/
10514 * \brief This routine is called to set Tx power profile.
10517 * \param[in] prAdapter Pointer to the Adapter structure.
10518 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
10519 * \param[in] u4SetBufferLen The length of the set buffer.
10520 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
10521 * bytes read from the set buffer. If the call failed
10522 * due to invalid length of the set buffer, returns
10523 * the amount of storage needed.
10525 * \retval WLAN_STATUS_SUCCESS
10526 * \retval WLAN_STATUS_INVALID_LENGTH
10528 /*----------------------------------------------------------------------------*/
10530 wlanoidSetTxPower (
10531 IN P_ADAPTER_T prAdapter,
10532 IN PVOID pvSetBuffer,
10533 IN UINT_32 u4SetBufferLen,
10534 OUT PUINT_32 pu4SetInfoLen
10537 //P_SET_TXPWR_CTRL_T pTxPwr = (P_SET_TXPWR_CTRL_T)pvSetBuffer;
10539 WLAN_STATUS rStatus;
10541 DEBUGFUNC("wlanoidSetTxPower");
10542 DBGLOG(REQ, LOUD, ("\r\n"));
10545 ASSERT(pvSetBuffer);
10548 printk("c2GLegacyStaPwrOffset=%d\n", pTxPwr->c2GLegacyStaPwrOffset);
10549 printk("c2GHotspotPwrOffset=%d\n", pTxPwr->c2GHotspotPwrOffset);
10550 printk("c2GP2pPwrOffset=%d\n", pTxPwr->c2GP2pPwrOffset);
10551 printk("c2GBowPwrOffset=%d\n", pTxPwr->c2GBowPwrOffset);
10552 printk("c5GLegacyStaPwrOffset=%d\n", pTxPwr->c5GLegacyStaPwrOffset);
10553 printk("c5GHotspotPwrOffset=%d\n", pTxPwr->c5GHotspotPwrOffset);
10554 printk("c5GP2pPwrOffset=%d\n", pTxPwr->c5GP2pPwrOffset);
10555 printk("c5GBowPwrOffset=%d\n", pTxPwr->c5GBowPwrOffset);
10556 printk("ucConcurrencePolicy=%d\n", pTxPwr->ucConcurrencePolicy);
10558 for (i=0; i<14;i++)
10559 printk("acTxPwrLimit2G[%d]=%d\n", i, pTxPwr->acTxPwrLimit2G[i]);
10562 printk("acTxPwrLimit5G[%d]=%d\n", i, pTxPwr->acTxPwrLimit5G[i]);
10565 rStatus = wlanSendSetQueryCmd (
10566 prAdapter, /* prAdapter */
10567 CMD_ID_SET_TXPWR_CTRL, /* ucCID */
10568 TRUE, /* fgSetQuery */
10569 FALSE, /* fgNeedResp */
10570 TRUE, /* fgIsOid */
10571 NULL, /* pfCmdDoneHandler*/
10572 NULL, /* pfCmdTimeoutHandler */
10573 u4SetBufferLen, /* u4SetQueryInfoLen */
10574 (PUINT_8) pvSetBuffer, /* pucInfoBuffer */
10575 NULL, /* pvSetQueryBuffer */
10576 0 /* u4SetQueryBufferLen */
10579 ASSERT(rStatus == WLAN_STATUS_PENDING);
10586 wlanSendMemDumpCmd (
10587 IN P_ADAPTER_T prAdapter,
10588 IN PVOID pvQueryBuffer,
10589 IN UINT_32 u4QueryBufferLen
10592 P_PARAM_CUSTOM_MEM_DUMP_STRUC_T prMemDumpInfo;
10593 P_CMD_DUMP_MEM prCmdDumpMem;
10594 CMD_DUMP_MEM rCmdDumpMem;
10595 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
10596 UINT_32 u4MemSize = PARAM_MEM_DUMP_MAX_SIZE;
10598 UINT_32 u4RemainLeng = 0;
10599 UINT_32 u4CurAddr = 0;
10600 UINT_8 ucFragNum = 0;
10602 prCmdDumpMem = &rCmdDumpMem;
10603 prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUC_T)pvQueryBuffer;
10605 u4RemainLeng = prMemDumpInfo->u4RemainLength;
10606 u4CurAddr = prMemDumpInfo->u4Address + prMemDumpInfo->u4Length;
10607 ucFragNum = prMemDumpInfo->ucFragNum + 1;
10609 /* Query. If request length is larger than max length, do it as ping pong.
10610 * Send a command and wait for a event. Send next command while the event is received.
10614 UINT_32 u4CurLeng = 0;
10616 if(u4RemainLeng > u4MemSize) {
10617 u4CurLeng = u4MemSize;
10618 u4RemainLeng -= u4MemSize;
10620 u4CurLeng = u4RemainLeng;
10624 prCmdDumpMem->u4Address = u4CurAddr;
10625 prCmdDumpMem->u4Length = u4CurLeng;
10626 prCmdDumpMem->u4RemainLength = u4RemainLeng;
10627 prCmdDumpMem->ucFragNum = ucFragNum;
10629 DBGLOG(REQ, TRACE, ("[%d] 0x%X, len %d, remain len %d\n",
10631 prCmdDumpMem->u4Address,
10632 prCmdDumpMem->u4Length,
10633 prCmdDumpMem->u4RemainLength));
10635 rStatus = wlanSendSetQueryCmd(prAdapter,
10640 nicCmdEventQueryMemDump,
10641 nicOidCmdTimeoutCommon,
10642 sizeof(CMD_DUMP_MEM),
10643 (PUINT_8)prCmdDumpMem,
10654 /*----------------------------------------------------------------------------*/
10656 * \brief This routine is called to dump memory.
10658 * \param[in] pvAdapter Pointer to the Adapter structure.
10659 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
10661 * \param[in] u4QueryBufLen The length of the query buffer.
10662 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
10663 * bytes written into the query buffer. If the call
10664 * failed due to invalid length of the query buffer,
10665 * returns the amount of storage needed.
10667 * \retval WLAN_STATUS_SUCCESS
10668 * \retval WLAN_STATUS_INVALID_LENGTH
10670 /*----------------------------------------------------------------------------*/
10672 wlanoidQueryMemDump (
10673 IN P_ADAPTER_T prAdapter,
10674 IN PVOID pvQueryBuffer,
10675 IN UINT_32 u4QueryBufferLen,
10676 OUT PUINT_32 pu4QueryInfoLen
10679 P_PARAM_CUSTOM_MEM_DUMP_STRUC_T prMemDumpInfo;
10681 DEBUGFUNC("wlanoidQueryMemDump");
10682 DBGLOG(INIT, LOUD,("\n"));
10685 ASSERT(pu4QueryInfoLen);
10686 if (u4QueryBufferLen) {
10687 ASSERT(pvQueryBuffer);
10690 *pu4QueryInfoLen = sizeof(UINT_32);
10692 prMemDumpInfo = (P_PARAM_CUSTOM_MEM_DUMP_STRUC_T)pvQueryBuffer;
10693 DBGLOG(REQ, TRACE, ("Dump 0x%X, len %d\n", prMemDumpInfo->u4Address, prMemDumpInfo->u4Length));
10695 prMemDumpInfo->u4RemainLength = prMemDumpInfo->u4Length;
10696 prMemDumpInfo->u4Length = 0;
10697 prMemDumpInfo->ucFragNum = 0;
10699 return wlanSendMemDumpCmd(
10704 } /* end of wlanoidQueryMcrRead() */
10707 #if CFG_ENABLE_WIFI_DIRECT
10708 /*----------------------------------------------------------------------------*/
10710 * \brief This routine is used to set the p2p mode.
10712 * \param[in] pvAdapter Pointer to the Adapter structure.
10713 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
10714 * \param[in] u4SetBufferLen The length of the set buffer.
10715 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
10716 * bytes read from the set buffer. If the call failed
10717 * due to invalid length of the set buffer, returns
10718 * the amount of storage needed.
10720 * \retval WLAN_STATUS_SUCCESS
10721 * \retval WLAN_STATUS_INVALID_LENGTH
10723 /*----------------------------------------------------------------------------*/
10725 wlanoidSetP2pMode (
10726 IN P_ADAPTER_T prAdapter,
10727 IN PVOID pvSetBuffer,
10728 IN UINT_32 u4SetBufferLen,
10729 OUT PUINT_32 pu4SetInfoLen
10732 WLAN_STATUS status;
10733 P_PARAM_CUSTOM_P2P_SET_STRUC_T prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUC_T)NULL;
10734 //P_MSG_P2P_NETDEV_REGISTER_T prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T)NULL;
10735 DEBUGFUNC("wlanoidSetP2pMode");
10738 ASSERT(pu4SetInfoLen);
10740 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_P2P_SET_STRUC_T);
10741 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_P2P_SET_STRUC_T)) {
10742 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
10743 return WLAN_STATUS_INVALID_LENGTH;
10746 prSetP2P = (P_PARAM_CUSTOM_P2P_SET_STRUC_T) pvSetBuffer;
10748 DBGLOG(P2P, INFO, ("Set P2P enable[%ld] mode[%ld]\n", prSetP2P->u4Enable, prSetP2P->u4Mode));
10751 * enable = 1, mode = 0 => init P2P network
10752 * enable = 1, mode = 1 => init Soft AP network
10753 * enable = 0 => uninit P2P/AP network
10756 if (prSetP2P->u4Enable) {
10757 p2pSetMode((prSetP2P->u4Mode == 1)?TRUE:FALSE);
10759 if (p2pLaunch(prAdapter->prGlueInfo)) {
10760 ASSERT(prAdapter->fgIsP2PRegistered);
10765 if (prAdapter->fgIsP2PRegistered) {
10766 p2pRemove(prAdapter->prGlueInfo);
10773 prP2pNetdevRegMsg = (P_MSG_P2P_NETDEV_REGISTER_T)cnmMemAlloc(
10776 (sizeof(MSG_P2P_NETDEV_REGISTER_T)));
10778 if (prP2pNetdevRegMsg == NULL) {
10780 status = WLAN_STATUS_RESOURCES;
10785 prP2pNetdevRegMsg->rMsgHdr.eMsgId = MID_MNY_P2P_NET_DEV_REGISTER;
10786 prP2pNetdevRegMsg->fgIsEnable = (prSetP2P->u4Enable == 1)?TRUE:FALSE;
10787 prP2pNetdevRegMsg->ucMode = (UINT_8)prSetP2P->u4Mode;
10789 mboxSendMsg(prAdapter,
10791 (P_MSG_HDR_T)prP2pNetdevRegMsg,
10792 MSG_SEND_METHOD_BUF);