2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/common/wlan_lib.c#2 $
5 \brief Internal driver stack will export the required procedures here for GLUE Layer.
7 This file contains all routines which are exported from MediaTek 802.11 Wireless
8 LAN driver stack to GLUE Layer.
15 ** 08 15 2012 eason.tsai
16 ** [ALPS00338170] [Need Patch] [Volunteer Patch] modify build warning
17 ** fix build waring for codechange
20 * [WCXRP00001259] [MT6620 Wi-Fi][Driver][Firmware] Send a signal to firmware for termination after SDIO error has happened
21 * [driver domain] add force reset by host-to-device interrupt mechanism
24 * [WCXRP00001252] [MT6620 Wi-Fi][Driver] Add debug message while encountering firmware response timeout
25 * output message while timeout event occurs
27 * 06 11 2012 eason.tsai
29 * change from binay to hex code
31 * 06 08 2012 eason.tsai
33 * Nvram context covert from 6620 to 6628 for old 6620 meta tool
36 * [WCXRP00001237] [MT6620 Wi-Fi][Driver] Show MAC address and MAC address source for ACS's convenience
37 * show MAC address & source while initiliazation
39 * 03 29 2012 eason.tsai
40 * [WCXRP00001216] [MT6628 Wi-Fi][Driver]add conditional define
41 * add conditional define.
43 * 03 04 2012 eason.tsai
45 * modify the cal fail report code.
49 * Sync CFG80211 modification from branch 2,2.
52 * [WCXRP00001169] [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration
53 * correct scan result removing policy.
56 * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration
57 * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration corresponding to network type.
60 * [WCXRP00001153] [MT6620 Wi-Fi][Driver] Adding the get_ch_list and set_tx_power proto type function
61 * Adding the related ioctl / wlan oid function to set the Tx power cfg.
64 * [WCXRP00001125] [MT6620 Wi-Fi][Firmware] Strengthen Wi-Fi power off sequence to have a clearroom environment when returining to ROM code
65 * 1. Due to firmware now stops HIF DMA for powering off, do not try to receive any packet from firmware
66 * 2. Take use of prAdapter->fgIsEnterD3ReqIssued for tracking whether it is powering off or not
69 * [WCXRP00001104] [All Wi-Fi][FW] Show init process by HW mail-box register
70 * Show FW initial ID when timeout to wait for ready bit
73 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
74 * modify the xlog related code.
77 * [WCXRP00001022] [MT6628 Driver][Firmware Download] Add multi section independent download functionality
78 * when powering off, always clear pending interrupts, then wait for RDY to be de-asserted
81 * [WCXRP00001022] [MT6628 Driver][Firmware Download] Add multi section independent download functionality
82 * shorten the packet length for firmware download if no more than 2048 bytes.
85 * [WCXRP00001022] [MT6628 Driver][Firmware Download] Add multi section independent download functionality
86 * add firmware download path in divided scatters.
89 * [MT6628 Driver][Firmware Download] Add multi section independent download functionality
90 * add firmware downloading aggregated path.
93 * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
97 * [WCXRP00000994] [MT6620 Wi-Fi][Driver] dump message for bus error and reset bus error flag while re-initialized
98 * 1. always show error message for SDIO bus errors.
99 * 2. reset bus error flag when re-initialization
101 * 08 26 2011 cm.chang
102 * [WCXRP00000952] [MT5931 Wi-Fi][FW] Handshake with BWCS before DPD/TX power calibration
103 * Fix compiling error for WinXP MT5931 driver
105 * 08 25 2011 chinghwa.yu
106 * [WCXRP00000063] Update BCM CoEx design and settings
107 * Add BWCS Sync ready for WinXP.
109 * 08 25 2011 chinghwa.yu
110 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
113 * 08 24 2011 chinghwa.yu
114 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
115 * Update RDD test mode cases.
118 * [WCXRP00000702] [MT5931][Driver] Modify initialization sequence for E1 ASIC
119 * escape from normal path if any error is occured.
122 * [WCXRP00000851] [MT6628 Wi-Fi][Driver] Add HIFSYS related definition to driver source tree
123 * reuse firmware download logic of MT6620 for MT6628.
126 * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
127 * support to load different firmware image for E3/E4/E5 and E6 ASIC on win32 platforms.
129 * 08 02 2011 yuche.tsai
130 * [WCXRP00000896] [Volunteer Patch][WiFi Direct][Driver] GO with multiple client, TX deauth to a disconnecting device issue.
131 * Fix GO send deauth frame issue.
133 * 07 22 2011 jeffrey.chang
134 * [WCXRP00000864] [MT5931] Add command to adjust OSC stable time
135 * modify driver to set OSC stable time after f/w download
137 * 07 18 2011 chinghwa.yu
138 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
139 * Add CMD/Event for RDD and BWCS.
142 * [WCXRP00000812] [MT6620 Wi-Fi][Driver] not show NVRAM when there is no valid MAC address in NVRAM content
143 * if there is no valid address in chip, generate a new one from driver domain instead of firmware domain due to sufficient randomness
146 * [WCXRP00000812] [MT6620 Wi-Fi][Driver] not show NVRAM when there is no valid MAC address in NVRAM content
147 * check with firmware for valid MAC address.
150 * [WCXRP00000702] [MT5931][Driver] Modify initialization sequence for E1 ASIC
151 * disable whole-chip resetting mechanism due to the need of further ECO to work as expected.
154 * [WCXRP00000749] [MT6620 Wi-Fi][Driver] Add band edge tx power control to Wi-Fi NVRAM
155 * changed to use non-zero checking for valid bit in NVRAM content
158 * [WCXRP00000749] [MT6620 Wi-Fi][Driver] Add band edge tx power control to Wi-Fi NVRAM
159 * invoke CMD_ID_SET_EDGE_TXPWR_LIMIT when there is valid data exist in NVRAM content.
162 * [WCXRP00000734] [MT6620 Wi-Fi][Driver] Pass PHY_PARAM in NVRAM to firmware domain
163 * pass PHY_PARAM in NVRAM from driver to firmware.
166 * [WCXRP00000718] [MT6620 Wi-Fi] modify the behavior of setting tx power
170 * [WCXRP00000718] [MT6620 Wi-Fi] modify the behavior of setting tx power
171 * ACPI APIs migrate to wlan_lib.c for glue layer to invoke.
173 * 05 11 2011 cm.chang
174 * [WCXRP00000717] [MT5931 Wi-Fi][Driver] Handle wrong NVRAM content about AP bandwidth setting
178 * [WCXRP00000702] [MT5931][Driver] Modify initialization sequence for E1 ASIC
179 * change delay from 100ms to 120ms upon DE's suggestion.
182 * [WCXRP00000702] [MT5931][Driver] Modify initialization sequence for E1 ASIC
183 * add delay after whole-chip resetting for MT5931 E1 ASIC.
186 * [WCXRP00000598] [MT6620 Wi-Fi][Driver] Implementation of interface for communicating with user space process for RESET_START and RESET_END events
187 * skip power-off handshaking when RESET indication is received.
189 * 04 22 2011 george.huang
190 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
194 * [WCXRP00000636] [WHQL][MT5931 Driver] 2c_PMHibernate (hang on 2h)
195 * 1) add API for glue layer to query ACPI state
196 * 2) Windows glue should not access to hardware after switched into D3 state
199 * [WCXRP00000654] [MT6620 Wi-Fi][Driver] Add loop termination criterion for wlanAdapterStop().
200 * add loop termination criteria for wlanAdapterStop().
202 * 04 12 2011 eddie.chen
203 * [WCXRP00000617] [MT6620 Wi-Fi][DRV/FW] Fix for sigma
204 * Fix the sta index in processing security frame
205 * Simple flow control for TC4 to avoid mgt frames for PS STA to occupy the TC4
209 * [WCXRP00000631] [MT6620 Wi-Fi][Driver] Add an API for QM to retrieve current TC counter value and processing frame dropping cases for TC4 path
210 * 1. add nicTxGetResource() API for QM to make decisions.
211 * 2. if management frames is decided by QM for dropping, the call back is invoked to indicate such a case.
214 * [WCXRP00000616] [MT6620 Wi-Fi][Driver] Free memory to pool and kernel in case any unexpected failure happend inside wlanAdapterStart
215 * invoke nicReleaseAdapterMemory() as failure handling in case wlanAdapterStart() failed unexpectedly
218 * [WCXRP00000248] [MT6620 Wi-Fi][FW]Fixed the Klockwork error
219 * fixed the kclocwork error.
222 * [WCXRP00000559] [MT6620 Wi-Fi][Driver] Combine TX/RX DMA buffers into a single one to reduce physically continuous memory consumption
223 * 1. deprecate CFG_HANDLE_IST_IN_SDIO_CALLBACK
224 * 2. Use common coalescing buffer for both TX/RX directions
228 * [WCXRP00000532] [MT6620 Wi-Fi][Driver] Migrate NVRAM configuration procedures from MT6620 E2 to MT6620 E3
229 * deprecate configuration used by MT6620 E2
231 * 03 07 2011 terry.wu
232 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
233 * Toggle non-standard debug messages to comments.
236 * [WCXRP00000496] [MT5931][Driver] Apply host-triggered chip reset before initializing firmware download procedures
237 * apply host-triggered chip reset mechanism before initializing firmware download procedures.
239 * 02 17 2011 eddie.chen
240 * [WCXRP00000458] [MT6620 Wi-Fi][Driver] BOW Concurrent - ProbeResp was exist in other channel
241 * 1) Chnage GetFrameAction decision when BSS is absent.
242 * 2) Check channel and resource in processing ProbeRequest
244 * 02 16 2011 cm.chang
245 * [WCXRP00000447] [MT6620 Wi-Fi][FW] Support new NVRAM update mechanism
248 * 02 01 2011 george.huang
249 * [WCXRP00000333] [MT5931][FW] support SRAM power control drivers
250 * init variable for CTIA.
252 * 01 27 2011 george.huang
253 * [WCXRP00000355] [MT6620 Wi-Fi] Set WMM-PS related setting with qualifying AP capability
254 * Support current measure mode, assigned by registry (XP only).
257 * [WCXRP00000382] [MT6620 Wi-Fi][Driver] Track forwarding packet number with notifying tx thread for serving
258 * 1. add an extra counter for tracking pending forward frames.
259 * 2. notify TX service thread as well when there is pending forward frame
260 * 3. correct build errors leaded by introduction of Wi-Fi direct separation module
262 * 01 12 2011 cm.chang
263 * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
264 * User-defined bandwidth is for 2.4G and 5G individually
267 * [WCXRP00000351] [MT6620 Wi-Fi][Driver] remove from scanning result in OID handling layer when the corresponding BSS is disconnected due to beacon timeout
268 * remove from scanning result when the BSS is disconnected due to beacon timeout.
271 * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to ease physically continous memory demands
272 * separate kalMemAlloc() into virtually-continous and physically-continous type to ease slab system pressure
275 * [WCXRP00000327] [MT6620 Wi-Fi][Driver] Improve HEC WHQA 6972 workaround coverage in driver side
276 * while being unloaded, clear all pending interrupt then set LP-own to firmware
279 * [WCXRP00000335] [MT6620 Wi-Fi][Driver] change to use milliseconds sleep instead of delay to avoid blocking to system scheduling
280 * change to use msleep() and shorten waiting interval to reduce blocking to other task while Wi-Fi driver is being loaded
283 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
284 * report EEPROM used flag via NIC_CAPABILITY
287 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
288 * integrate with 'EEPROM used' flag for reporting correct capability to Engineer Mode/META and other tools
290 * 12 22 2010 eddie.chen
291 * [WCXRP00000218] [MT6620 Wi-Fi][Driver] Add auto rate window control in registry
292 * Remove controling auto rate from initial setting. The initial setting is defined by FW code.
296 * sync. with ALPS code by enabling interrupt just before leaving wlanAdapterStart()
298 * 12 08 2010 yuche.tsai
299 * [WCXRP00000245] [MT6620][Driver] Invitation & Provision Discovery Feature Check-in
300 * Change Param name for invitation connection.
302 * 12 07 2010 cm.chang
303 * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
304 * 1. Country code is from NVRAM or supplicant
305 * 2. Change band definition in CMD/EVENT.
308 * [WCXRP00000083] [MT5931][Driver][FW] Add necessary logic for MT5931 first connection
309 * 1) use 8 buffers for MT5931 which is equipped with less memory
310 * 2) modify MT5931 debug level to TRACE when download is successful
313 * [WCXRP00000083] [MT5931][Driver][FW] Add necessary logic for MT5931 first connection
314 * for MT5931, adapter initialization is done *after* firmware is downloaded.
317 * [WCXRP00000083] [MT5931][Driver][FW] Add necessary logic for MT5931 first connection
318 * correct MT5931 firmware download procedure:
319 * MT5931 will download firmware first then acquire LP-OWN
322 * [WCXRP00000083] [MT5931][Driver][FW] Add necessary logic for MT5931 first connection
323 * 1) update MT5931 firmware encryption tool. (using 64-bytes unit)
324 * 2) update MT5931 firmware download procedure
327 * [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
328 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
329 * 2) Remove CNM CH-RECOVER event handling
330 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
332 * 11 01 2010 yarco.yang
333 * [WCXRP00000149] [MT6620 WI-Fi][Driver]Fine tune performance on MT6516 platform
334 * Add code to run WlanIST in SDIO callback.
336 * 10 27 2010 george.huang
337 * [WCXRP00000127] [MT6620 Wi-Fi][Driver] Add a registry to disable Beacon Timeout function for SQA test by using E1 EVB
338 * Support registry option for disable beacon lost detection.
341 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
342 * 1) update NVRAM content template to ver 1.02
343 * 2) add compile option for querying NIC capability (default: off)
344 * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
345 * 4) correct auto-rate compiler error under linux (treat warning as error)
346 * 5) simplify usage of NVRAM and REG_INFO_T
347 * 6) add version checking between driver and firmware
349 * 10 26 2010 eddie.chen
350 * [WCXRP00000134] [MT6620 Wi-Fi][Driver] Add a registry to enable auto rate for SQA test by using E1 EVB
351 * Add auto rate parameter in registry.
354 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
355 * add option for enable/disable TX PWR gain adjustment (default: off)
358 * [WCXRP00000117] [MT6620 Wi-Fi][Driver] Add logic for suspending driver when MT6620 is not responding anymore
359 * 1. when wlanAdapterStop() failed to send POWER CTRL command to firmware, do not poll for ready bit dis-assertion
360 * 2. shorten polling count for shorter response time
361 * 3. if bad I/O operation is detected during TX resource polling, then further operation is aborted as well
364 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000086] [MT6620 Wi-Fi][Driver] The mac address is all zero at android
365 * complete implementation of Android NVRAM access
368 * [WCXRP00000103] [MT6620 Wi-Fi][Driver] Driver crashed when using WZC to connect to AP#B with connection with AP#A
369 * bugfix: always reset pointer to IEbuf to zero when keeping scanning result for the connected AP
372 * [WCXRP00000084] [MT6620 Wi-Fi][Driver][FW] Add fixed rate support for distance test
373 * adding fixed rate support for distance test. (from registry setting)
376 * [WCXRP00000083] [MT5931][Driver][FW] Add necessary logic for MT5931 first connection
377 * add firmware download for MT5931.
380 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
381 * divide a single function into 2 part to surpress a weird compiler warning from gcc-4.4.0
384 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
385 * code reorganization to improve isolation between GLUE and CORE layers.
388 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check
389 * load manufacture data when CFG_SUPPORT_NVRAM is set to 1
392 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
393 * remove ENUM_NETWORK_TYPE_T definitions
396 * [WCXRP00000072] [MT6620 Wi-Fi][Driver] Fix TKIP Counter Measure EAPoL callback register issue
397 * [MT6620 Wi-Fi][Driver] Fix TKIP Counter Measure EAPoL callback register issue.
400 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
401 * eliminate unused variables which lead gcc to argue
404 * [WCXRP00000057] [MT6620 Wi-Fi][Driver] Modify online scan to a run-time switchable feature
405 * Modify online scan as a run-time adjustable option (for Windows, in registry)
408 * [WCXRP00000051] [MT6620 Wi-Fi][Driver] WHQL test fail in MAC address changed item
409 * use firmware reported mac address right after wlanAdapterStart() as permanent address
412 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
413 * eliminate reference of CFG_RESPONSE_MAX_PKT_SIZE
416 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
417 * Do a complete reset with STA-REC null checking for RF test re-entry
419 * 09 21 2010 kevin.huang
420 * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
421 * Eliminate Linux Compile Warning
425 * acquire & release power control in oid handing wrapper.
429 * move IE to buffer head when the IE pointer is not pointed at head.
433 * use static memory pool for storing IEs of scanning result.
437 * HIFSYS Clock Source Workaround
441 * adding the wapi support for integration test.
445 * move HIF CR initialization from where after sdioSetupCardFeature() to wlanAdapterStart()
449 * eliminate klockwork errors
451 * 08 26 2010 yuche.tsai
453 * Add AT GO test configure mode under WinXP.
454 * Please enable 1. CFG_ENABLE_WIFI_DIRECT, 2. CFG_TEST_WIFI_DIRECT_GO, 3. CFG_SUPPORT_AAA
456 * 08 25 2010 george.huang
458 * update OID/ registry control path for PM related settings
462 * 1) initialize variable for enabling short premable/short time slot.
463 * 2) add compile option for disabling online scan
467 * correction issue: desired phy type not initialized as ABGN mode.
471 * [AIS-FSM] honor registry setting for adhoc running mode. (A/B/G)
473 * 08 10 2010 cm.chang
475 * Support EEPROM read/write in RF test mode
479 * surpress compilation warning.
483 * Centralize mgmt/system service procedures into independent calls.
487 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
488 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
489 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
493 * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
497 * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
498 * 2) change nicMediaStateChange() API prototype
502 * 1) change BG_SCAN to ONLINE_SCAN for consistent term
503 * 2) only clear scanning result when scan is permitted to do
505 * 07 19 2010 cm.chang
507 * Set RLM parameters and enable CNM channel manager
509 * 07 19 2010 jeffrey.chang
511 * Linux port modification
515 * [WPD00003833] [MT6620 and MT5931] Driver migration.
516 * Reduce unnecessary type casting
520 * use multiple queues to keep 1x/MMPDU/CMD's strict order even when there is incoming 1x frames.
524 * 1) MMPDUs are now sent to MT6620 by CMD queue for keeping strict order of 1X/MMPDU/CMD packets
525 * 2) integrate with qmGetFrameAction() for deciding which MMPDU/1X could pass checking for sending
526 * 2) enhance CMD_INFO_T descriptor number from 10 to 32 to avoid descriptor underflow under concurrent network operation
530 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
533 * [WPD00003833][MT6620 and MT5931] Driver migration
534 * 1) ignore RSN checking when RSN is not turned on.
535 * 2) set STA-REC deactivation callback as NULL
536 * 3) add variable initialization API based on PHY configuration
539 * [WPD00003833][MT6620 and MT5931] Driver migration
540 * 1) for event packet, no need to fill RFB.
541 * 2) when wlanAdapterStart() failed, no need to initialize state machines
542 * 3) after Beacon/ProbeResp parsing, corresponding BSS_DESC_T should be marked as IE-parsed
544 * 07 01 2010 cm.chang
545 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
546 * Support sync command of STA_REC
549 * [WPD00003833][MT6620 and MT5931] Driver migration
550 * add scan uninitialization procedure
553 * [WPD00003833][MT6620 and MT5931] Driver migration
554 * add API in que_mgt to retrieve sta-rec index for security frames.
557 * [WPD00003833][MT6620 and MT5931] Driver migration
558 * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
560 * 06 23 2010 yarco.yang
561 * [WPD00003837][MT6620]Data Path Refine
562 * Merge g_arStaRec[] into adapter->arStaRec[]
565 * [WPD00003833][MT6620 and MT5931] Driver migration
566 * initialize mbox & ais_fsm in wlanAdapterStart()
569 * [WPD00003833][MT6620 and MT5931] Driver migration
570 * change MAC address updating logic.
573 * [WPD00003833][MT6620 and MT5931] Driver migration
574 * simplify timer usage.
577 * [WPD00003833][MT6620 and MT5931] Driver migration
578 * 1) migrate assoc.c.
579 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
580 * 3) add configuration options for CNM_MEM and RSN modules
581 * 4) add data path for management frames
582 * 5) eliminate rPacketInfo of MSDU_INFO_T
585 * [WPD00003833][MT6620 and MT5931] Driver migration
586 * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
587 * 2) when disconnected, indicate nic directly (no event is needed)
590 * [WPD00003833][MT6620 and MT5931] Driver migration
591 * cnm_timer has been migrated.
593 * 06 06 2010 kevin.huang
594 * [WPD00003832][MT6620 5931] Create driver base
595 * [MT6620 5931] Create driver base
598 * [WPD00001943]Create WiFi test driver framework on WinXP
599 * disable interrupt then send power control command packet.
602 * [WPD00001943]Create WiFi test driver framework on WinXP
603 * 1) when stopping adapter, wait til RDY bit has been cleaerd.
604 * 2) set TASK_OFFLOAD as driver-core OIDs
607 * [WPD00001943]Create WiFi test driver framework on WinXP
608 * 1) integrate OID_GEN_NETWORK_LAYER_ADDRESSES with CMD_ID_SET_IP_ADDRESS
609 * 2) buffer statistics data for 2 seconds
610 * 3) use default value for adhoc parameters instead of 0
613 * [WPD00001943]Create WiFi test driver framework on WinXP
614 * 1) do not take timeout mechanism for power mode oids
615 * 2) retrieve network type from connection status
616 * 3) after disassciation, set radio state to off
617 * 4) TCP option over IPv6 is supported
620 * [WPD00001943]Create WiFi test driver framework on WinXP
621 * add CFG_STARTUP_DEBUG for debugging starting up issue.
624 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
625 * 1) add timeout handler mechanism for pending command packets
626 * 2) add p2p add/removal key
629 * [WPD00001943]Create WiFi test driver framework on WinXP
630 * surpress compiler warning
633 * [WPD00001943]Create WiFi test driver framework on WinXP
634 * roll-back to rev.60.
637 * [WPD00001943]Create WiFi test driver framework on WinXP
638 * 1) remove redundant firmware image unloading
639 * 2) use compile-time macros to separate logic related to accquiring own
642 * [WPD00001943]Create WiFi test driver framework on WinXP
643 * treat BUS access failure as kind of card removal.
646 * [WPD00001943]Create WiFi test driver framework on WinXP
647 * always set fw-own before driver is unloaded.
650 * [WPD00003823][MT6620 Wi-Fi] Add Bluetooth-over-Wi-Fi support
651 * add framework for BT-over-Wi-Fi support.
652 * * * 1) prPendingCmdInfo is replaced by queue for multiple handler capability
653 * * * 2) command sequence number is now increased atomically
654 * * * 3) private data could be hold and taken use for other purpose
657 * [WPD00001943]Create WiFi test driver framework on WinXP
658 * finish non-glue layer access to glue variables
661 * [WPD00001943]Create WiFi test driver framework on WinXP
662 * rWlanInfo should be placed at adapter rather than glue due to most operations
663 * are done in adapter layer.
666 * [WPD00001943]Create WiFi test driver framework on WinXP
667 * ePowerCtrl is not necessary as a glue variable.
669 * 04 06 2010 jeffrey.chang
670 * [WPD00003826]Initial import for Linux port
671 * add timeout check in the kalOidComplete
673 * 04 06 2010 jeffrey.chang
674 * [WPD00003826]Initial import for Linux port
675 * improve none-glue code portability
677 * 04 06 2010 jeffrey.chang
678 * [WPD00003826]Initial import for Linux port
679 * improve none-glue code portability
682 * [WPD00001943]Create WiFi test driver framework on WinXP
683 * code refine: fgTestMode should be at adapter rather than glue due to the device/fw is also involved
686 * [WPD00001943]Create WiFi test driver framework on WinXP
687 * eliminate direct access for prGlueInfo->fgIsCardRemoved in non-glue layer
690 * [WPD00001943]Create WiFi test driver framework on WinXP
691 * 1) for some OID, never do timeout expiration
692 * 2) add 2 kal API for later integration
695 * [WPD00001943]Create WiFi test driver framework on WinXP
696 * 1) eliminate unused definitions
697 * 2) ready bit will be polled for limited iteration
699 * 04 06 2010 jeffrey.chang
700 * [WPD00003826]Initial import for Linux port
701 * kalOidComplete is not necessary in linux
704 * [WPD00001943]Create WiFi test driver framework on WinXP
705 * change to use pass-in prRegInfo instead of accessing prGlueInfo directly
708 * [WPD00001943]Create WiFi test driver framework on WinXP
709 * change to use WIFI_TCM_ALWAYS_ON as firmware image
712 * [WPD00001943]Create WiFi test driver framework on WinXP
716 * [WPD00003816][MT6620 Wi-Fi] Adding the security support
717 * modify the wapi related code for new driver's design.
719 * 03 30 2010 jeffrey.chang
720 * [WPD00003826]Initial import for Linux port
721 * adding none-glue code portability
723 * 03 30 2010 jeffrey.chang
724 * [WPD00003826]Initial import for Linux port
725 * adding non-glue code portability
727 * 03 29 2010 jeffrey.chang
728 * [WPD00003826]Initial import for Linux port
729 * improve non-glue code portability
732 * [WPD00001943]Create WiFi test driver framework on WinXP
733 * firmware download load adress & start address are now configured from config.h
734 * due to the different configurations on FPGA and ASIC
736 * 03 24 2010 jeffrey.chang
737 * [WPD00003826]Initial import for Linux port
738 * [WPD00003826] Initial import for Linux port
739 * initial import for Linux port
741 * 03 24 2010 jeffrey.chang
742 * [WPD00003826]Initial import for Linux port
743 * initial import for Linux port
746 * [WPD00001943]Create WiFi test driver framework on WinXP
747 * only send CMD_NIC_POWER_CTRL in wlanAdapterStop() when card is not removed and is not in D3 state
750 * [WPD00001943]Create WiFi test driver framework on WinXP
751 * always send CMD_NIC_POWER_CTRL packet when nic is being halted
754 * [WPD00001943]Create WiFi test driver framework on WinXP
755 * 1) add ACPI D0/D3 state switching support
756 * 2) use more formal way to handle interrupt when the status is retrieved from enhanced RX response
759 * [WPD00001943]Create WiFi test driver framework on WinXP
760 * add two option for ACK and ENCRYPTION for firmware download
763 * [WPD00003821][BUG] Host driver stops processing RX packets from HIF RX0
764 * add RX starvation warning debug message controlled by CFG_HIF_RX_STARVATION_WARNING
767 * [WPD00001943]Create WiFi test driver framework on WinXP
768 * 1) add another spin-lock to protect MsduInfoList due to it might be accessed by different thread.
769 * 2) change own-back acquiring procedure to wait for up to 16.67 seconds
772 * [WPD00001943]Create WiFi test driver framework on WinXP
773 * when starting adapter, read local adminsitrated address from registry and send to firmware via CMD_BASIC_CONFIG.
776 * [WPD00001943]Create WiFi test driver framework on WinXP
777 * 1) the use of prPendingOid revised, all accessing are now protected by spin lock
778 * 2) ensure wlanReleasePendingOid will clear all command queues
781 * [WPD00001943]Create WiFi test driver framework on WinXP
782 * add mutex to avoid multiple access to qmTxQueue simultaneously.
785 * [WPD00001943]Create WiFi test driver framework on WinXP
786 * add command/event definitions for initial states
788 * 02 24 2010 tehuang.liu
789 * [WPD00001943]Create WiFi test driver framework on WinXP
790 * Added code for QM_TEST_MODE
793 * [WPD00001943]Create WiFi test driver framework on WinXP
794 * correct function name ..
797 * [WPD00001943]Create WiFi test driver framework on WinXP
798 * separate wlanProcesQueuePacket() into 2 APIs upon request
801 * [WPD00001943]Create WiFi test driver framework on WinXP
802 * add new API: wlanProcessQueuedPackets()
805 * [WPD00001943]Create WiFi test driver framework on WinXP
806 * correct wlanAdapterStart
809 * [WPD00001943]Create WiFi test driver framework on WinXP
810 * 1. add logic for firmware download
811 * 2. firmware image filename and start/load address are now retrieved from registry
814 * [WPD00001943]Create WiFi test driver framework on WinXP
815 * implement host-side firmware download logic
818 * [WPD00001943]Create WiFi test driver framework on WinXP
819 * 1) remove unused function in nic_rx.c [which has been handled in que_mgt.c]
820 * 2) firmware image length is now retrieved via NdisFileOpen
821 * 3) firmware image is not structured by (P_IMG_SEC_HDR_T) anymore
822 * 4) nicRxWaitResponse() revised
823 * 5) another set of TQ counter default value is added for fw-download state
824 * 6) Wi-Fi load address is now retrieved from registry too
827 * [WPD00001943]Create WiFi test driver framework on WinXP
828 * 1. Permanent and current MAC address are now retrieved by CMD/EVENT packets instead of hard-coded address
829 * 2. follow MSDN defined behavior when associates to another AP
830 * 3. for firmware download, packet size could be up to 2048 bytes
833 * [WPD00001943]Create WiFi test driver framework on WinXP
834 * prepare for implementing fw download logic
837 * [WPD00001943]Create WiFi test driver framework on WinXP
838 * wlanoidSetFrequency is now implemented by RF test command.
841 * [WPD00001943]Create WiFi test driver framework on WinXP
842 * QueryRssi is no longer w/o hardware access, it is now implemented by command/event handling loop
845 * [WPD00001943]Create WiFi test driver framework on WinXP
846 * 1. clear prPendingCmdInfo properly
847 * 2. while allocating memory for cmdinfo, no need to add extra 4 bytes.
850 * [WPD00001943]Create WiFi test driver framework on WinXP
851 * allow MCR read/write OIDs in RF test mode
854 * [WPD00001943]Create WiFi test driver framework on WinXP
855 * 1) implement timeout mechanism when OID is pending for longer than 1 second
856 * 2) allow OID_802_11_CONFIGURATION to be executed when RF test mode is turned on
859 * [WPD00001943]Create WiFi test driver framework on WinXP
860 * 1. eliminate improper variable in rHifInfo
861 * 2. block TX/ordinary OID when RF test mode is engaged
862 * 3. wait until firmware finish operation when entering into and leaving from RF test mode
863 * 4. correct some HAL implementation
866 * [WPD00001943]Create WiFi test driver framework on WinXP
867 * Under WinXP with SDIO, use prGlueInfo->rHifInfo.pvInformationBuffer instead of prGlueInfo->pvInformationBuffer
868 ** \main\maintrunk.MT6620WiFiDriver_Prj\36 2009-12-10 16:54:36 GMT mtk02752
870 ** \main\maintrunk.MT6620WiFiDriver_Prj\35 2009-12-09 20:04:59 GMT mtk02752
871 ** only report as connected when CFG_HIF_EMULATION_TEST is set to 1
872 ** \main\maintrunk.MT6620WiFiDriver_Prj\34 2009-12-08 17:39:41 GMT mtk02752
873 ** wlanoidRftestQueryAutoTest could be executed without touching hardware
874 ** \main\maintrunk.MT6620WiFiDriver_Prj\33 2009-12-03 16:10:26 GMT mtk01461
876 ** \main\maintrunk.MT6620WiFiDriver_Prj\32 2009-12-02 22:05:33 GMT mtk02752
877 ** kalOidComplete() will decrease i4OidPendingCount
878 ** \main\maintrunk.MT6620WiFiDriver_Prj\31 2009-12-01 23:02:36 GMT mtk02752
879 ** remove unnecessary spinlock
880 ** \main\maintrunk.MT6620WiFiDriver_Prj\30 2009-12-01 22:50:38 GMT mtk02752
881 ** use TC4 for command, maintein i4OidPendingCount
882 ** \main\maintrunk.MT6620WiFiDriver_Prj\29 2009-11-27 12:45:34 GMT mtk02752
883 ** prCmdInfo should be freed when invoking wlanReleasePendingOid() to clear pending oid
884 ** \main\maintrunk.MT6620WiFiDriver_Prj\28 2009-11-24 19:55:51 GMT mtk02752
885 ** wlanSendPacket & wlanRetransmitOfPendingFrames is only used in old data path
886 ** \main\maintrunk.MT6620WiFiDriver_Prj\27 2009-11-23 17:59:55 GMT mtk02752
887 ** clear prPendingOID inside wlanSendCommand() when the OID didn't need to be replied.
888 ** \main\maintrunk.MT6620WiFiDriver_Prj\26 2009-11-23 14:45:29 GMT mtk02752
889 ** add another version of wlanSendCommand() for command-sending only without blocking for response
890 ** \main\maintrunk.MT6620WiFiDriver_Prj\25 2009-11-17 22:40:44 GMT mtk01084
891 ** \main\maintrunk.MT6620WiFiDriver_Prj\24 2009-11-11 10:14:56 GMT mtk01084
892 ** modify place to invoke wlanIst
893 ** \main\maintrunk.MT6620WiFiDriver_Prj\23 2009-10-30 18:17:07 GMT mtk01084
894 ** fix compiler warning
895 ** \main\maintrunk.MT6620WiFiDriver_Prj\22 2009-10-29 19:46:15 GMT mtk01084
896 ** invoke interrupt process routine
897 ** \main\maintrunk.MT6620WiFiDriver_Prj\21 2009-10-13 21:58:24 GMT mtk01084
898 ** modify for new HW architecture
899 ** \main\maintrunk.MT6620WiFiDriver_Prj\20 2009-09-09 17:26:01 GMT mtk01084
900 ** \main\maintrunk.MT6620WiFiDriver_Prj\19 2009-05-20 12:21:27 GMT mtk01461
901 ** Add SeqNum check when process Event Packet
902 ** \main\maintrunk.MT6620WiFiDriver_Prj\18 2009-05-19 10:38:44 GMT mtk01461
903 ** Add wlanReleasePendingOid() for mpReset() if there is a pending OID and no available TX resource to send it.
904 ** \main\maintrunk.MT6620WiFiDriver_Prj\17 2009-04-29 15:41:34 GMT mtk01461
905 ** Add handle of EVENT of CMD Result in wlanSendCommand()
906 ** \main\maintrunk.MT6620WiFiDriver_Prj\16 2009-04-22 09:11:23 GMT mtk01461
907 ** Fix wlanSendCommand() for Driver Domain CR
908 ** \main\maintrunk.MT6620WiFiDriver_Prj\15 2009-04-21 09:33:56 GMT mtk01461
909 ** Update wlanSendCommand() for Driver Domain Response and handle Event Packet, wlanQuery/SetInformation() for enqueue CMD_INFO_T
910 ** \main\maintrunk.MT6620WiFiDriver_Prj\14 2009-04-17 20:00:08 GMT mtk01461
911 ** Update wlanImageSectionDownload for optimized CMD process
912 ** \main\maintrunk.MT6620WiFiDriver_Prj\13 2009-04-14 20:50:51 GMT mtk01426
913 ** Fixed compile error
914 ** \main\maintrunk.MT6620WiFiDriver_Prj\12 2009-04-13 16:38:40 GMT mtk01084
915 ** add wifi start function
916 ** \main\maintrunk.MT6620WiFiDriver_Prj\11 2009-04-13 14:26:44 GMT mtk01084
917 ** modify a parameter about FW download length
918 ** \main\maintrunk.MT6620WiFiDriver_Prj\10 2009-04-10 21:53:42 GMT mtk01461
919 ** Update wlanSendCommand()
920 ** \main\maintrunk.MT6620WiFiDriver_Prj\9 2009-04-08 16:51:04 GMT mtk01084
921 ** Update for the image download part
922 ** \main\maintrunk.MT6620WiFiDriver_Prj\8 2009-04-01 10:32:47 GMT mtk01461
923 ** Add wlanSendLeftClusteredFrames() for SDIO_TX_ENHANCE
924 ** \main\maintrunk.MT6620WiFiDriver_Prj\7 2009-03-23 21:44:13 GMT mtk01461
925 ** Refine TC assignment for WmmAssoc flag
926 ** \main\maintrunk.MT6620WiFiDriver_Prj\6 2009-03-23 16:51:57 GMT mtk01084
927 ** modify the input argument of caller to RECLAIM_POWER_CONTROL_TO_PM()
928 ** \main\maintrunk.MT6620WiFiDriver_Prj\5 2009-03-23 00:27:13 GMT mtk01461
929 ** Add reference code of FW Image Download
930 ** \main\maintrunk.MT6620WiFiDriver_Prj\4 2009-03-19 18:32:37 GMT mtk01084
931 ** update for basic power management functions
932 ** \main\maintrunk.MT6620WiFiDriver_Prj\3 2009-03-16 09:09:08 GMT mtk01461
933 ** Update TX PATH API
934 ** \main\maintrunk.MT6620WiFiDriver_Prj\2 2009-03-10 16:28:45 GMT mtk01426
939 /*******************************************************************************
940 * C O M P I L E R F L A G S
941 ********************************************************************************
944 /*******************************************************************************
945 * E X T E R N A L R E F E R E N C E S
946 ********************************************************************************
949 #include "mgmt/ais_fsm.h"
951 /*******************************************************************************
953 ********************************************************************************
955 /* 6.1.1.2 Interpretation of priority parameter in MAC service primitives */
956 /* Static convert the Priority Parameter/TID(User Priority/TS Identifier) to Traffic Class */
957 const UINT_8 aucPriorityParam2TC[] = {
969 extern QUE_MGT_T g_rQM;
971 /*******************************************************************************
973 ********************************************************************************
975 typedef struct _CODE_MAPPING_T {
976 UINT_32 u4RegisterValue;
977 INT_32 u4TxpowerOffset;
978 } CODE_MAPPING_T, *P_CODE_MAPPING_T;
980 /*******************************************************************************
981 * P U B L I C D A T A
982 ********************************************************************************
984 BOOLEAN fgIsBusAccessFailed = FALSE;
986 /*******************************************************************************
987 * P R I V A T E D A T A
988 ********************************************************************************
992 /*******************************************************************************
994 ********************************************************************************
996 #define SIGNED_EXTEND(n, _sValue) \
997 (((_sValue) & BIT((n)-1)) ? ((_sValue) | BITS(n,31)) : \
998 ((_sValue) & ~BITS(n,31)))
1001 /* OID set handlers without the need to access HW register */
1002 PFN_OID_HANDLER_FUNC apfnOidSetHandlerWOHwAccess[] = {
1004 wlanoidSetBeaconInterval,
1005 wlanoidSetAtimWindow,
1006 wlanoidSetFrequency,
1010 /* OID query handlers without the need to access HW register */
1011 PFN_OID_HANDLER_FUNC apfnOidQueryHandlerWOHwAccess[] = {
1014 wlanoidQueryInfrastructureMode,
1015 wlanoidQueryAuthMode,
1016 wlanoidQueryEncryptionStatus,
1018 wlanoidQueryNetworkTypeInUse,
1019 wlanoidQueryBssidList,
1020 wlanoidQueryAcpiDevicePowerState,
1021 wlanoidQuerySupportedRates,
1022 wlanoidQueryDesiredRates,
1023 wlanoidQuery802dot11PowerSaveProfile,
1024 wlanoidQueryBeaconInterval,
1025 wlanoidQueryAtimWindow,
1026 wlanoidQueryFrequency,
1029 /* OID set handlers allowed in RF test mode */
1030 PFN_OID_HANDLER_FUNC apfnOidSetHandlerAllowedInRFTest[] = {
1031 wlanoidRftestSetTestMode,
1032 wlanoidRftestSetAbortTestMode,
1033 wlanoidRftestSetAutoTest,
1035 wlanoidSetEepromWrite
1038 /* OID query handlers allowed in RF test mode */
1039 PFN_OID_HANDLER_FUNC apfnOidQueryHandlerAllowedInRFTest[] = {
1040 wlanoidRftestQueryAutoTest,
1041 wlanoidQueryMcrRead,
1042 wlanoidQueryEepromRead
1046 PFN_OID_HANDLER_FUNC apfnOidWOTimeoutCheck[] = {
1047 wlanoidRftestSetTestMode,
1048 wlanoidRftestSetAbortTestMode,
1049 wlanoidSetAcpiDevicePowerState,
1053 /*******************************************************************************
1055 ********************************************************************************
1058 /*******************************************************************************
1059 * F U N C T I O N D E C L A R A T I O N S
1060 ********************************************************************************
1063 /*******************************************************************************
1065 ********************************************************************************
1067 /*----------------------------------------------------------------------------*/
1069 * \brief This is a private routine, which is used to check if HW access is needed
1070 * for the OID query/ set handlers.
1072 * \param[IN] pfnOidHandler Pointer to the OID handler.
1073 * \param[IN] fgSetInfo It is a Set information handler.
1075 * \retval TRUE This function needs HW access
1076 * \retval FALSE This function does not need HW access
1078 /*----------------------------------------------------------------------------*/
1080 wlanIsHandlerNeedHwAccess (
1081 IN PFN_OID_HANDLER_FUNC pfnOidHandler,
1082 IN BOOLEAN fgSetInfo
1085 PFN_OID_HANDLER_FUNC* apfnOidHandlerWOHwAccess;
1087 UINT_32 u4NumOfElem;
1090 apfnOidHandlerWOHwAccess = apfnOidSetHandlerWOHwAccess;
1091 u4NumOfElem = sizeof(apfnOidSetHandlerWOHwAccess) / sizeof(PFN_OID_HANDLER_FUNC);
1094 apfnOidHandlerWOHwAccess = apfnOidQueryHandlerWOHwAccess;
1095 u4NumOfElem = sizeof(apfnOidQueryHandlerWOHwAccess) / sizeof(PFN_OID_HANDLER_FUNC);
1098 for (i = 0; i < u4NumOfElem; i++) {
1099 if (apfnOidHandlerWOHwAccess[i] == pfnOidHandler) {
1105 } /* wlanIsHandlerNeedHwAccess */
1108 /*----------------------------------------------------------------------------*/
1110 * \brief This routine is called to set flag for later handling card
1113 * \param[in] prAdapter Pointer to the Adapter structure.
1117 * \note When surprised removal happens, Glue layer should invoke this
1118 * function to notify WPDD not to do any hw access.
1120 /*----------------------------------------------------------------------------*/
1123 IN P_ADAPTER_T prAdapter
1126 DEBUGFUNC("wlanCardEjected");
1131 /* mark that the card is being ejected, NDIS will shut us down soon */
1132 nicTxRelease(prAdapter);
1134 } /* wlanCardEjected */
1137 /*----------------------------------------------------------------------------*/
1139 * \brief Create adapter object
1141 * \param prAdapter This routine is call to allocate the driver software objects.
1142 * If fails, return NULL.
1143 * \retval NULL If it fails, NULL is returned.
1144 * \retval NOT NULL If the adapter was initialized successfully.
1146 /*----------------------------------------------------------------------------*/
1149 IN P_GLUE_INFO_T prGlueInfo
1152 P_ADAPTER_T prAdpater = (P_ADAPTER_T)NULL;
1154 DEBUGFUNC("wlanAdapterCreate");
1157 prAdpater = (P_ADAPTER_T) kalMemAlloc(sizeof(ADAPTER_T), VIR_MEM_TYPE);
1160 DBGLOG(INIT, ERROR, ("Allocate ADAPTER memory ==> FAILED\n"));
1165 g_rQM.prAdapter = prAdpater;
1167 kalMemZero(prAdpater, sizeof(ADAPTER_T));
1168 prAdpater->prGlueInfo = prGlueInfo;
1173 } /* wlanAdapterCreate */
1176 /*----------------------------------------------------------------------------*/
1178 * \brief Destroy adapter object
1180 * \param prAdapter This routine is call to destroy the driver software objects.
1181 * If fails, return NULL.
1184 /*----------------------------------------------------------------------------*/
1186 wlanAdapterDestroy (
1187 IN P_ADAPTER_T prAdapter
1195 kalMemFree(prAdapter, VIR_MEM_TYPE, sizeof(ADAPTER_T));
1200 /*----------------------------------------------------------------------------*/
1202 * \brief Initialize the adapter. The sequence is
1203 * 1. Disable interrupt
1204 * 2. Read adapter configuration from EEPROM and registry, verify chip ID.
1205 * 3. Create NIC Tx/Rx resource.
1206 * 4. Initialize the chip
1207 * 5. Initialize the protocol
1208 * 6. Enable Interrupt
1210 * \param prAdapter Pointer of Adapter Data Structure
1212 * \retval WLAN_STATUS_SUCCESS: Success
1213 * \retval WLAN_STATUS_FAILURE: Failed
1215 /*----------------------------------------------------------------------------*/
1218 IN P_ADAPTER_T prAdapter,
1219 IN P_REG_INFO_T prRegInfo,
1220 IN PVOID pvFwImageMapFile,
1221 IN UINT_32 u4FwImageFileLength
1224 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
1225 UINT_32 i, u4Value = 0;
1226 UINT_32 u4WHISR = 0;
1227 UINT_8 aucTxCount[8];
1228 #if CFG_ENABLE_FW_DOWNLOAD
1229 UINT_32 u4FwLoadAddr, u4ImgSecSize;
1230 #if CFG_ENABLE_FW_DIVIDED_DOWNLOAD
1232 P_FIRMWARE_DIVIDED_DOWNLOAD_T prFwHead;
1233 BOOLEAN fgValidHead;
1234 const UINT_32 u4CRCOffset = offsetof(FIRMWARE_DIVIDED_DOWNLOAD_T, u4NumOfEntries);
1237 #if (defined(MT5931) && (!CFG_SUPPORT_BCM_BWCS))
1238 PARAM_PTA_IPC_T rBwcsPta;
1239 UINT_32 u4SetInfoLen;
1244 DEBUGFUNC("wlanAdapterStart");
1246 //4 <0> Reset variables in ADAPTER_T
1247 prAdapter->fgIsFwOwn = TRUE;
1248 prAdapter->fgIsEnterD3ReqIssued = FALSE;
1250 QUEUE_INITIALIZE(&(prAdapter->rPendingCmdQueue));
1252 /* Initialize rWlanInfo */
1253 kalMemSet(&(prAdapter->rWlanInfo), 0, sizeof(WLAN_INFO_T));
1255 //4 <0.1> reset fgIsBusAccessFailed
1256 fgIsBusAccessFailed = FALSE;
1259 if ( (u4Status = nicAllocateAdapterMemory(prAdapter)) != WLAN_STATUS_SUCCESS ) {
1260 DBGLOG(INIT, ERROR, ("nicAllocateAdapterMemory Error!\n"));
1261 u4Status = WLAN_STATUS_FAILURE;
1265 prAdapter->u4OsPacketFilter = PARAM_PACKET_FILTER_SUPPORTED;
1267 #if defined(MT6620) || defined(MT6628)
1268 DBGLOG(INIT, TRACE, ("wlanAdapterStart(): Acquiring LP-OWN\n"));
1269 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
1270 #if !CFG_ENABLE_FULL_PM
1271 nicpmSetDriverOwn(prAdapter);
1274 if(prAdapter->fgIsFwOwn == TRUE) {
1275 DBGLOG(INIT, ERROR, ("nicpmSetDriverOwn() failed!\n"));
1276 u4Status = WLAN_STATUS_FAILURE;
1280 //4 <1> Initialize the Adapter
1281 if ( (u4Status = nicInitializeAdapter(prAdapter)) != WLAN_STATUS_SUCCESS ) {
1282 DBGLOG(INIT, ERROR, ("nicInitializeAdapter failed!\n"));
1283 u4Status = WLAN_STATUS_FAILURE;
1288 //4 <2> Initialize System Service (MGMT Memory pool and STA_REC)
1289 nicInitSystemService(prAdapter);
1291 //4 <3> Initialize Tx
1292 nicTxInitialize(prAdapter);
1293 wlanDefTxPowerCfg(prAdapter);
1295 //4 <4> Initialize Rx
1296 nicRxInitialize(prAdapter);
1298 #if CFG_ENABLE_FW_DOWNLOAD
1299 #if defined(MT6620) || defined(MT6628)
1300 if (pvFwImageMapFile) {
1301 /* 1. disable interrupt, download is done by polling mode only */
1302 nicDisableInterrupt(prAdapter);
1304 /* 2. Initialize Tx Resource to fw download state */
1305 nicTxInitResetResource(prAdapter);
1307 /* 3. FW download here */
1308 u4FwLoadAddr = prRegInfo->u4LoadAddress;
1310 #if CFG_ENABLE_FW_DIVIDED_DOWNLOAD
1311 // 3a. parse file header for decision of divided firmware download or not
1312 prFwHead = (P_FIRMWARE_DIVIDED_DOWNLOAD_T)pvFwImageMapFile;
1314 if(prFwHead->u4Signature == MTK_WIFI_SIGNATURE &&
1315 prFwHead->u4CRC == wlanCRC32((PUINT_8)pvFwImageMapFile + u4CRCOffset, u4FwImageFileLength - u4CRCOffset)) {
1319 fgValidHead = FALSE;
1322 /* 3b. engage divided firmware downloading */
1323 if(fgValidHead == TRUE) {
1324 for(i = 0 ; i < prFwHead->u4NumOfEntries ; i++) {
1325 #if CFG_ENABLE_FW_DOWNLOAD_AGGREGATION
1326 if(wlanImageSectionDownloadAggregated(prAdapter,
1327 prFwHead->arSection[i].u4DestAddr,
1328 prFwHead->arSection[i].u4Length,
1329 (PUINT_8)pvFwImageMapFile + prFwHead->arSection[i].u4Offset) != WLAN_STATUS_SUCCESS) {
1330 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
1331 u4Status = WLAN_STATUS_FAILURE;
1334 for(j = 0 ; j < prFwHead->arSection[i].u4Length ; j += CMD_PKT_SIZE_FOR_IMAGE) {
1335 if(j + CMD_PKT_SIZE_FOR_IMAGE < prFwHead->arSection[i].u4Length)
1336 u4ImgSecSize = CMD_PKT_SIZE_FOR_IMAGE;
1338 u4ImgSecSize = prFwHead->arSection[i].u4Length - j;
1340 if(wlanImageSectionDownload(prAdapter,
1341 prFwHead->arSection[i].u4DestAddr + j,
1343 (PUINT_8)pvFwImageMapFile + prFwHead->arSection[i].u4Offset + j) != WLAN_STATUS_SUCCESS) {
1344 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
1345 u4Status = WLAN_STATUS_FAILURE;
1351 /* escape from loop if any pending error occurs */
1352 if(u4Status == WLAN_STATUS_FAILURE) {
1359 #if CFG_ENABLE_FW_DOWNLOAD_AGGREGATION
1360 if(wlanImageSectionDownloadAggregated(prAdapter,
1362 u4FwImageFileLength,
1363 (PUINT_8)pvFwImageMapFile) != WLAN_STATUS_SUCCESS) {
1364 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
1365 u4Status = WLAN_STATUS_FAILURE;
1368 for (i = 0; i < u4FwImageFileLength ; i += CMD_PKT_SIZE_FOR_IMAGE) {
1369 if(i + CMD_PKT_SIZE_FOR_IMAGE < u4FwImageFileLength)
1370 u4ImgSecSize = CMD_PKT_SIZE_FOR_IMAGE;
1372 u4ImgSecSize = u4FwImageFileLength - i;
1374 if(wlanImageSectionDownload(prAdapter,
1377 (PUINT_8)pvFwImageMapFile + i) != WLAN_STATUS_SUCCESS) {
1378 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
1379 u4Status = WLAN_STATUS_FAILURE;
1385 if(u4Status != WLAN_STATUS_SUCCESS) {
1389 #if !CFG_ENABLE_FW_DOWNLOAD_ACK
1390 // Send INIT_CMD_ID_QUERY_PENDING_ERROR command and wait for response
1391 if(wlanImageQueryStatus(prAdapter) != WLAN_STATUS_SUCCESS) {
1392 DBGLOG(INIT, ERROR, ("Firmware download failed!\n"));
1393 u4Status = WLAN_STATUS_FAILURE;
1399 DBGLOG(INIT, ERROR, ("No Firmware found!\n"));
1400 u4Status = WLAN_STATUS_FAILURE;
1404 /* 4. send Wi-Fi Start command */
1405 #if CFG_OVERRIDE_FW_START_ADDRESS
1406 wlanConfigWifiFunc(prAdapter,
1408 prRegInfo->u4StartAddress);
1410 wlanConfigWifiFunc(prAdapter,
1414 #elif defined(MT5931)
1415 if (pvFwImageMapFile) {
1416 DBGLOG(INIT, TRACE, ("Download Address: 0x%08X\n", prRegInfo->u4LoadAddress));
1417 DBGLOG(INIT, TRACE, ("Firmware Length: 0x%08X\n", u4FwImageFileLength));
1420 #if CFG_SUPPORT_WHOLE_CHIP_RESET
1421 #define RESET_RDY_INTERVAL (120)
1423 /* 1.0 whole-chip reset except HIFSYS */
1424 HAL_MCR_WR(prAdapter, MCR_WMCSR, WMCSR_CHIP_RST);
1425 HAL_MCR_WR(prAdapter, MCR_WMCSR, 0);
1427 /* 1.0.1 delay for EEIF ready */
1428 kalMsleep(RESET_RDY_INTERVAL);
1431 /* 1.1 wait for INIT_RDY */
1434 HAL_MCR_RD(prAdapter, MCR_WMCSR, &u4Value);
1436 if (u4Value & WMCSR_INI_RDY) {
1437 DBGLOG(INIT, TRACE, ("INIT-RDY detected\n"));
1440 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
1441 || fgIsBusAccessFailed == TRUE) {
1442 u4Status = WLAN_STATUS_FAILURE;
1445 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
1446 DBGLOG(INIT, ERROR, ("Waiting for Init Ready bit: Timeout\n"));
1447 u4Status = WLAN_STATUS_FAILURE;
1456 if(u4Status != WLAN_STATUS_SUCCESS) {
1460 /* 1.2 set KSEL/FLEN */
1461 HAL_MCR_WR(prAdapter, MCR_FWCFG, u4FwImageFileLength >> 6);
1463 /* 1.3 enable FWDL_EN */
1464 HAL_MCR_WR(prAdapter, MCR_WMCSR, WMCSR_FWDLEN);
1466 /* 1.4 wait for PLL_RDY */
1469 HAL_MCR_RD(prAdapter, MCR_WMCSR, &u4Value);
1471 if (u4Value & WMCSR_PLLRDY) {
1472 DBGLOG(INIT, TRACE, ("PLL-RDY detected\n"));
1475 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
1476 || fgIsBusAccessFailed == TRUE) {
1477 u4Status = WLAN_STATUS_FAILURE;
1480 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
1481 DBGLOG(INIT, ERROR, ("Waiting for PLL Ready bit: Timeout\n"));
1482 u4Status = WLAN_STATUS_FAILURE;
1491 if(u4Status != WLAN_STATUS_SUCCESS) {
1495 /* 2.1 turn on HIFSYS firmware download mode */
1496 HAL_MCR_WR(prAdapter, MCR_FWDLSR, FWDLSR_FWDL_MODE);
1498 /* 2.2 set starting address */
1499 u4FwLoadAddr = prRegInfo->u4LoadAddress;
1500 HAL_MCR_WR(prAdapter, MCR_FWDLDSAR, u4FwLoadAddr);
1502 /* 3. upload firmware */
1503 for (i = 0; i < u4FwImageFileLength ; i += CMD_PKT_SIZE_FOR_IMAGE) {
1504 if(i + CMD_PKT_SIZE_FOR_IMAGE < u4FwImageFileLength)
1505 u4ImgSecSize = CMD_PKT_SIZE_FOR_IMAGE;
1507 u4ImgSecSize = u4FwImageFileLength - i;
1509 if(wlanImageSectionDownload(prAdapter,
1512 (PUINT_8)pvFwImageMapFile + i) != WLAN_STATUS_SUCCESS) {
1513 DBGLOG(INIT, ERROR, ("Firmware scatter download failed!\n"));
1514 u4Status = WLAN_STATUS_FAILURE;
1519 if(u4Status != WLAN_STATUS_SUCCESS) {
1523 /* 4.1 poll FWDL_OK & FWDL_FAIL bits */
1526 HAL_MCR_RD(prAdapter, MCR_WMCSR, &u4Value);
1528 if (u4Value & WMCSR_DL_OK) {
1529 DBGLOG(INIT, TRACE, ("DL_OK detected\n"));
1532 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
1533 || fgIsBusAccessFailed == TRUE
1534 || (u4Value & WMCSR_DL_FAIL)) {
1535 DBGLOG(INIT, ERROR, ("DL_FAIL detected: 0x%08X\n", u4Value));
1536 u4Status = WLAN_STATUS_FAILURE;
1539 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
1540 DBGLOG(INIT, ERROR, ("Waiting for DL_OK/DL_FAIL bit: Timeout\n"));
1541 u4Status = WLAN_STATUS_FAILURE;
1550 if(u4Status != WLAN_STATUS_SUCCESS) {
1554 /* 4.2 turn off HIFSYS download mode */
1555 HAL_MCR_WR(prAdapter, MCR_FWDLSR, 0);
1559 if(u4Status != WLAN_STATUS_SUCCESS) {
1563 /* 5. disable interrupt */
1564 nicDisableInterrupt(prAdapter);
1567 DBGLOG(INIT, ERROR, ("No Firmware found!\n"));
1568 u4Status = WLAN_STATUS_FAILURE;
1574 DBGLOG(INIT, TRACE, ("wlanAdapterStart(): Waiting for Ready bit..\n"));
1575 //4 <5> check Wi-Fi FW asserts ready bit
1578 HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
1580 if (u4Value & WCIR_WLAN_READY) {
1581 DBGLOG(INIT, TRACE, ("Ready bit asserted\n"));
1584 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
1585 || fgIsBusAccessFailed == TRUE) {
1586 u4Status = WLAN_STATUS_FAILURE;
1589 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
1592 nicGetMailbox(prAdapter, 0, &u4MailBox0);
1593 DBGLOG(INIT, ERROR, ("Waiting for Ready bit: Timeout, ID=%d\n",
1594 (u4MailBox0 & 0x0000FFFF)));
1595 u4Status = WLAN_STATUS_FAILURE;
1606 DBGLOG(INIT, TRACE, ("wlanAdapterStart(): Acquiring LP-OWN\n"));
1607 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
1608 #if !CFG_ENABLE_FULL_PM
1609 nicpmSetDriverOwn(prAdapter);
1612 if(prAdapter->fgIsFwOwn == TRUE) {
1613 DBGLOG(INIT, ERROR, ("nicpmSetDriverOwn() failed!\n"));
1614 u4Status = WLAN_STATUS_FAILURE;
1618 //4 <1> Initialize the Adapter
1619 if ( (u4Status = nicInitializeAdapter(prAdapter)) != WLAN_STATUS_SUCCESS ) {
1620 DBGLOG(INIT, ERROR, ("nicInitializeAdapter failed!\n"));
1621 u4Status = WLAN_STATUS_FAILURE;
1625 /* post initialization for MT5931 due to some CR is only accessible after driver own */
1626 nicRxPostInitialize(prAdapter);
1629 if(u4Status == WLAN_STATUS_SUCCESS) {
1630 // 1. reset interrupt status
1631 HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
1632 if(HAL_IS_TX_DONE_INTR(u4WHISR)) {
1633 HAL_READ_TX_RELEASED_COUNT(prAdapter, aucTxCount);
1636 /* 2. reset TX Resource for normal operation */
1637 nicTxResetResource(prAdapter);
1639 #if CFG_SUPPORT_OSC_SETTING && defined(MT5931)
1640 wlanSetMcuOscStableTime(prAdapter, 0);
1643 /* 3. query for permanent address by polling */
1644 wlanQueryPermanentAddress(prAdapter);
1646 #if (CFG_SUPPORT_NIC_CAPABILITY == 1)
1647 /* 4. query for NIC capability */
1648 wlanQueryNicCapability(prAdapter);
1651 /* 5. Override network address */
1652 wlanUpdateNetworkAddress(prAdapter);
1654 /* 6. indicate disconnection as default status */
1655 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1656 WLAN_STATUS_MEDIA_DISCONNECT,
1661 RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);
1663 if(u4Status != WLAN_STATUS_SUCCESS) {
1667 /* OID timeout timer initialize */
1668 cnmTimerInitTimer(prAdapter,
1669 &prAdapter->rOidTimeoutTimer,
1670 (PFN_MGMT_TIMEOUT_FUNC)wlanReleasePendingOid,
1673 /* Power state initialization */
1674 prAdapter->fgWiFiInSleepyState = FALSE;
1675 prAdapter->rAcpiState = ACPI_STATE_D0;
1677 /* Online scan option */
1678 if(prRegInfo->fgDisOnlineScan == 0) {
1679 prAdapter->fgEnOnlineScan = TRUE;
1682 prAdapter->fgEnOnlineScan = FALSE;
1685 /* Beacon lost detection option */
1686 if(prRegInfo->fgDisBcnLostDetection != 0) {
1687 prAdapter->fgDisBcnLostDetection = TRUE;
1690 /* Load compile time constant */
1691 prAdapter->rWlanInfo.u2BeaconPeriod = CFG_INIT_ADHOC_BEACON_INTERVAL;
1692 prAdapter->rWlanInfo.u2AtimWindow = CFG_INIT_ADHOC_ATIM_WINDOW;
1694 #if 1// set PM parameters
1695 prAdapter->fgEnArpFilter = prRegInfo->fgEnArpFilter;
1696 prAdapter->u4PsCurrentMeasureEn = prRegInfo->u4PsCurrentMeasureEn;
1698 prAdapter->u4UapsdAcBmp = prRegInfo->u4UapsdAcBmp;
1700 prAdapter->u4MaxSpLen = prRegInfo->u4MaxSpLen;
1702 DBGLOG(INIT, TRACE, ("[1] fgEnArpFilter:0x%x, u4UapsdAcBmp:0x%x, u4MaxSpLen:0x%x",
1703 prAdapter->fgEnArpFilter,
1704 prAdapter->u4UapsdAcBmp,
1705 prAdapter->u4MaxSpLen));
1707 prAdapter->fgEnCtiaPowerMode = FALSE;
1711 /* MGMT Initialization */
1712 nicInitMGMT(prAdapter, prRegInfo);
1714 /* Enable WZC Disassociation */
1715 prAdapter->rWifiVar.fgSupportWZCDisassociation = TRUE;
1717 /* Apply Rate Setting */
1718 if((ENUM_REGISTRY_FIXED_RATE_T)(prRegInfo->u4FixedRate) < FIXED_RATE_NUM) {
1719 prAdapter->rWifiVar.eRateSetting = (ENUM_REGISTRY_FIXED_RATE_T)(prRegInfo->u4FixedRate);
1722 prAdapter->rWifiVar.eRateSetting = FIXED_RATE_NONE;
1725 if(prAdapter->rWifiVar.eRateSetting == FIXED_RATE_NONE) {
1726 /* Enable Auto (Long/Short) Preamble */
1727 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_AUTO;
1729 else if((prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_20M_400NS &&
1730 prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS7_20M_400NS)
1731 || (prAdapter->rWifiVar.eRateSetting >= FIXED_RATE_MCS0_40M_400NS &&
1732 prAdapter->rWifiVar.eRateSetting <= FIXED_RATE_MCS32_400NS)) {
1733 /* Force Short Preamble */
1734 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_SHORT;
1737 /* Force Long Preamble */
1738 prAdapter->rWifiVar.ePreambleType = PREAMBLE_TYPE_LONG;
1741 /* Disable Hidden SSID Join */
1742 prAdapter->rWifiVar.fgEnableJoinToHiddenSSID = FALSE;
1744 /* Enable Short Slot Time */
1745 prAdapter->rWifiVar.fgIsShortSlotTimeOptionEnable = TRUE;
1747 /* configure available PHY type set */
1748 nicSetAvailablePhyTypeSet(prAdapter);
1750 #if 1// set PM parameters
1752 #if CFG_SUPPORT_PWR_MGT
1753 prAdapter->u4PowerMode = prRegInfo->u4PowerMode;
1754 prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_P2P_INDEX].ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
1755 prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_P2P_INDEX].ucPsProfile = ENUM_PSP_FAST_SWITCH;
1757 prAdapter->u4PowerMode = ENUM_PSP_CONTINUOUS_ACTIVE;
1759 {/*CR:WCNAE00007101*/
1760 struct net_device *prDev = prAdapter->prGlueInfo->prDevHandler;
1762 if (prDev != NULL) {
1763 glBusSetIrq(prDev, NULL, prAdapter->prGlueInfo );
1766 printk(KERN_INFO "Skip glBusSetIrq because of the prDev\n");
1769 nicConfigPowerSaveProfile(
1771 NETWORK_TYPE_AIS_INDEX, //FIXIT
1772 prAdapter->u4PowerMode,
1778 #if CFG_SUPPORT_NVRAM
1779 /* load manufacture data */
1780 wlanLoadManufactureData(prAdapter, prRegInfo);
1783 #if (defined(MT5931) && (!CFG_SUPPORT_BCM_BWCS))
1784 //Enable DPD calibration.
1785 rBwcsPta.u.aucBTPParams[0] = 0x00;
1786 rBwcsPta.u.aucBTPParams[1] = 0x01;
1787 rBwcsPta.u.aucBTPParams[2] = 0x00;
1788 rBwcsPta.u.aucBTPParams[3] = 0x80;
1790 wlanoidSetBT(prAdapter,
1792 sizeof(PARAM_PTA_IPC_T),
1797 /* Update Auto rate parameters in FW */
1798 nicRlmArUpdateParms(prAdapter,
1799 prRegInfo->u4ArSysParam0,
1800 prRegInfo->u4ArSysParam1,
1801 prRegInfo->u4ArSysParam2,
1802 prRegInfo->u4ArSysParam3);
1806 #if (MT6620_E1_ASIC_HIFSYS_WORKAROUND == 1)
1807 /* clock gating workaround */
1808 prAdapter->fgIsClockGatingEnabled = FALSE;
1813 if(u4Status == WLAN_STATUS_SUCCESS) {
1814 // restore to hardware default
1815 HAL_SET_INTR_STATUS_READ_CLEAR(prAdapter);
1816 HAL_SET_MAILBOX_READ_CLEAR(prAdapter, FALSE);
1818 /* Enable interrupt */
1819 nicEnableInterrupt(prAdapter);
1823 // release allocated memory
1824 nicReleaseAdapterMemory(prAdapter);
1828 } /* wlanAdapterStart */
1831 /*----------------------------------------------------------------------------*/
1833 * \brief Uninitialize the adapter
1835 * \param prAdapter Pointer of Adapter Data Structure
1837 * \retval WLAN_STATUS_SUCCESS: Success
1838 * \retval WLAN_STATUS_FAILURE: Failed
1840 /*----------------------------------------------------------------------------*/
1843 IN P_ADAPTER_T prAdapter
1846 UINT_32 i, u4Value = 0;
1847 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
1851 #if (MT6620_E1_ASIC_HIFSYS_WORKAROUND == 1)
1852 if(prAdapter->fgIsClockGatingEnabled == TRUE) {
1853 nicDisableClockGating(prAdapter);
1857 /* MGMT - unitialization */
1858 nicUninitMGMT(prAdapter);
1860 if(prAdapter->rAcpiState == ACPI_STATE_D0 &&
1861 #if (CFG_CHIP_RESET_SUPPORT == 1)
1862 kalIsResetting() == FALSE &&
1864 kalIsCardRemoved(prAdapter->prGlueInfo) == FALSE) {
1866 /* 0. Disable interrupt, this can be done without Driver own */
1867 nicDisableInterrupt(prAdapter);
1869 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
1871 /* 1. Set CMD to FW to tell WIFI to stop (enter power off state) */
1872 if(prAdapter->fgIsFwOwn == FALSE &&
1873 wlanSendNicPowerCtrlCmd(prAdapter, 1) == WLAN_STATUS_SUCCESS) {
1874 /* 2. Clear pending interrupt */
1876 while(i < CFG_IST_LOOP_COUNT && nicProcessIST(prAdapter) != WLAN_STATUS_NOT_INDICATING) {
1880 /* 3. Wait til RDY bit has been cleaerd */
1883 HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
1885 if ((u4Value & WCIR_WLAN_READY) == 0)
1887 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
1888 || fgIsBusAccessFailed == TRUE
1889 || i >= CFG_RESPONSE_POLLING_TIMEOUT) {
1899 /* 4. Set Onwership to F/W */
1900 nicpmSetFWOwn(prAdapter, FALSE);
1902 #if CFG_FORCE_RESET_UNDER_BUS_ERROR
1903 if(HAL_TEST_FLAG(prAdapter, ADAPTER_FLAG_HW_ERR) == TRUE) {
1904 /* force acquire firmware own */
1905 kalDevRegWrite(prAdapter->prGlueInfo, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
1907 /* delay for 10ms */
1910 /* force firmware reset via software interrupt */
1911 kalDevRegWrite(prAdapter->prGlueInfo, MCR_WSICR, WSICR_H2D_SW_INT_SET);
1913 /* force release firmware own */
1914 kalDevRegWrite(prAdapter->prGlueInfo, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_SET);
1918 RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);
1921 nicRxUninitialize(prAdapter);
1923 nicTxRelease(prAdapter);
1925 /* System Service Uninitialization */
1926 nicUninitSystemService(prAdapter);
1928 nicReleaseAdapterMemory(prAdapter);
1930 #if defined(_HIF_SPI)
1931 /* Note: restore the SPI Mode Select from 32 bit to default */
1932 nicRestoreSpiDefMode(prAdapter);
1936 } /* wlanAdapterStop */
1939 /*----------------------------------------------------------------------------*/
1941 * \brief This function is called by ISR (interrupt).
1943 * \param prAdapter Pointer of Adapter Data Structure
1945 * \retval TRUE: NIC's interrupt
1946 * \retval FALSE: Not NIC's interrupt
1948 /*----------------------------------------------------------------------------*/
1951 IN P_ADAPTER_T prAdapter,
1952 IN BOOLEAN fgGlobalIntrCtrl
1957 if (fgGlobalIntrCtrl) {
1958 nicDisableInterrupt(prAdapter);
1960 //wlanIST(prAdapter);
1966 /*----------------------------------------------------------------------------*/
1968 * \brief This function is called by IST (task_let).
1970 * \param prAdapter Pointer of Adapter Data Structure
1974 /*----------------------------------------------------------------------------*/
1977 IN P_ADAPTER_T prAdapter
1982 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
1984 nicProcessIST(prAdapter);
1986 nicEnableInterrupt(prAdapter);
1988 RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);
1994 /*----------------------------------------------------------------------------*/
1996 * \brief This function will check command queue to find out if any could be dequeued
1997 * and/or send to HIF to MT6620
1999 * \param prAdapter Pointer of Adapter Data Structure
2000 * \param prCmdQue Pointer of Command Queue (in Glue Layer)
2002 * \retval WLAN_STATUS_SUCCESS
2004 /*----------------------------------------------------------------------------*/
2006 wlanProcessCommandQueue (
2007 IN P_ADAPTER_T prAdapter,
2011 WLAN_STATUS rStatus;
2012 QUE_T rTempCmdQue, rMergeCmdQue, rStandInCmdQue;
2013 P_QUE_T prTempCmdQue, prMergeCmdQue, prStandInCmdQue;
2014 P_QUE_ENTRY_T prQueueEntry;
2015 P_CMD_INFO_T prCmdInfo;
2016 P_MSDU_INFO_T prMsduInfo;
2017 ENUM_FRAME_ACTION_T eFrameAction = FRAME_ACTION_DROP_PKT;
2019 KAL_SPIN_LOCK_DECLARATION();
2024 prTempCmdQue = &rTempCmdQue;
2025 prMergeCmdQue = &rMergeCmdQue;
2026 prStandInCmdQue = &rStandInCmdQue;
2028 QUEUE_INITIALIZE(prTempCmdQue);
2029 QUEUE_INITIALIZE(prMergeCmdQue);
2030 QUEUE_INITIALIZE(prStandInCmdQue);
2032 //4 <1> Move whole list of CMD_INFO to temp queue
2033 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_QUE);
2034 QUEUE_MOVE_ALL(prTempCmdQue, prCmdQue);
2035 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_QUE);
2037 //4 <2> Dequeue from head and check it is able to be sent
2038 QUEUE_REMOVE_HEAD(prTempCmdQue, prQueueEntry, P_QUE_ENTRY_T);
2039 while(prQueueEntry) {
2040 prCmdInfo = (P_CMD_INFO_T)prQueueEntry;
2042 switch(prCmdInfo->eCmdType) {
2043 case COMMAND_TYPE_GENERAL_IOCTL:
2044 case COMMAND_TYPE_NETWORK_IOCTL:
2045 /* command packet will be always sent */
2046 eFrameAction = FRAME_ACTION_TX_PKT;
2049 case COMMAND_TYPE_SECURITY_FRAME:
2050 /* inquire with QM */
2051 eFrameAction = qmGetFrameAction(prAdapter,
2052 prCmdInfo->eNetworkType,
2053 prCmdInfo->ucStaRecIndex,
2058 case COMMAND_TYPE_MANAGEMENT_FRAME:
2059 /* inquire with QM */
2060 prMsduInfo = (P_MSDU_INFO_T)(prCmdInfo->prPacket);
2062 eFrameAction = qmGetFrameAction(prAdapter,
2063 prMsduInfo->ucNetworkType,
2064 prMsduInfo->ucStaRecIndex,
2074 //4 <3> handling upon dequeue result
2075 if(eFrameAction == FRAME_ACTION_DROP_PKT) {
2076 wlanReleaseCommand(prAdapter, prCmdInfo);
2078 else if(eFrameAction == FRAME_ACTION_QUEUE_PKT) {
2079 QUEUE_INSERT_TAIL(prMergeCmdQue, prQueueEntry);
2081 else if(eFrameAction == FRAME_ACTION_TX_PKT) {
2082 //4 <4> Send the command
2083 rStatus = wlanSendCommand(prAdapter, prCmdInfo);
2085 if(rStatus == WLAN_STATUS_RESOURCES) {
2086 // no more TC4 resource for further transmission
2087 QUEUE_INSERT_TAIL(prMergeCmdQue, prQueueEntry);
2090 else if(rStatus == WLAN_STATUS_PENDING) {
2091 // command packet which needs further handling upon response
2092 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_PENDING);
2093 QUEUE_INSERT_TAIL(&(prAdapter->rPendingCmdQueue), prQueueEntry);
2094 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_PENDING);
2097 P_CMD_INFO_T prCmdInfo = (P_CMD_INFO_T)prQueueEntry;
2099 if (rStatus == WLAN_STATUS_SUCCESS) {
2100 if (prCmdInfo->pfCmdDoneHandler) {
2101 prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prCmdInfo->pucInfoBuffer);
2105 if (prCmdInfo->fgIsOid) {
2106 kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, prCmdInfo->u4SetInfoLen, rStatus);
2110 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
2117 QUEUE_REMOVE_HEAD(prTempCmdQue, prQueueEntry, P_QUE_ENTRY_T);
2120 //4 <3> Merge back to original queue
2121 //4 <3.1> Merge prMergeCmdQue & prTempCmdQue
2122 QUEUE_CONCATENATE_QUEUES(prMergeCmdQue, prTempCmdQue);
2124 //4 <3.2> Move prCmdQue to prStandInQue, due to prCmdQue might differ due to incoming 802.1X frames
2125 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_QUE);
2126 QUEUE_MOVE_ALL(prStandInCmdQue, prCmdQue);
2128 //4 <3.3> concatenate prStandInQue to prMergeCmdQue
2129 QUEUE_CONCATENATE_QUEUES(prMergeCmdQue, prStandInCmdQue);
2131 //4 <3.4> then move prMergeCmdQue to prCmdQue
2132 QUEUE_MOVE_ALL(prCmdQue, prMergeCmdQue);
2133 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_QUE);
2135 return WLAN_STATUS_SUCCESS;
2136 } /* end of wlanProcessCommandQueue() */
2139 /*----------------------------------------------------------------------------*/
2141 * \brief This function will take CMD_INFO_T which carry some informations of
2142 * incoming OID and notify the NIC_TX to send CMD.
2144 * \param prAdapter Pointer of Adapter Data Structure
2145 * \param prCmdInfo Pointer of P_CMD_INFO_T
2147 * \retval WLAN_STATUS_SUCCESS : CMD was written to HIF and be freed(CMD Done) immediately.
2148 * \retval WLAN_STATUS_RESOURCE : No resource for current command, need to wait for previous
2149 * frame finishing their transmission.
2150 * \retval WLAN_STATUS_FAILURE : Get failure while access HIF or been rejected.
2152 /*----------------------------------------------------------------------------*/
2155 IN P_ADAPTER_T prAdapter,
2156 IN P_CMD_INFO_T prCmdInfo
2159 P_TX_CTRL_T prTxCtrl;
2160 UINT_8 ucTC; /* "Traffic Class" SW(Driver) resource classification */
2161 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
2165 prTxCtrl = &prAdapter->rTxCtrl;
2167 //DbgPrint("wlanSendCommand()\n");
2171 LOG_FUNC("wlanSendCommand()\n");
2172 LOG_FUNC("CmdType %u NetworkType %u StaRecIndex %u Oid %u CID 0x%x SetQuery %u NeedResp %u CmdSeqNum %u\n",
2173 prCmdInfo->eCmdType,
2174 prCmdInfo->eNetworkType,
2175 prCmdInfo->ucStaRecIndex,
2178 prCmdInfo->fgSetQuery,
2179 prCmdInfo->fgNeedResp,
2180 prCmdInfo->ucCmdSeqNum);
2183 #if (MT6620_E1_ASIC_HIFSYS_WORKAROUND == 1)
2184 if(prAdapter->fgIsClockGatingEnabled == TRUE) {
2185 nicDisableClockGating(prAdapter);
2190 // <0> card removal check
2191 if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
2192 || fgIsBusAccessFailed == TRUE) {
2193 rStatus = WLAN_STATUS_FAILURE;
2197 // <1> Normal case of sending CMD Packet
2198 if (!prCmdInfo->fgDriverDomainMCR) {
2199 // <1.1> Assign Traffic Class(TC) = TC4.
2202 // <1.2> Check if pending packet or resource was exhausted
2203 if ((rStatus = nicTxAcquireResource(prAdapter, ucTC)) == WLAN_STATUS_RESOURCES) {
2204 DbgPrint("NO Resource:%d\n", ucTC);
2208 // <1.3> Forward CMD_INFO_T to NIC Layer
2209 rStatus = nicTxCmd(prAdapter, prCmdInfo, ucTC);
2211 // <1.4> Set Pending in response to Query Command/Need Response
2212 if (rStatus == WLAN_STATUS_SUCCESS) {
2213 if ((!prCmdInfo->fgSetQuery) || (prCmdInfo->fgNeedResp)) {
2214 rStatus = WLAN_STATUS_PENDING;
2218 // <2> Special case for access Driver Domain MCR
2220 P_CMD_ACCESS_REG prCmdAccessReg;
2221 prCmdAccessReg = (P_CMD_ACCESS_REG)(prCmdInfo->pucInfoBuffer + CMD_HDR_SIZE);
2223 if (prCmdInfo->fgSetQuery) {
2224 HAL_MCR_WR(prAdapter,
2225 (prCmdAccessReg->u4Address & BITS(2,31)), //address is in DWORD unit
2226 prCmdAccessReg->u4Data);
2229 P_CMD_ACCESS_REG prEventAccessReg;
2232 u4Address = prCmdAccessReg->u4Address;
2233 prEventAccessReg = (P_CMD_ACCESS_REG)prCmdInfo->pucInfoBuffer;
2234 prEventAccessReg->u4Address = u4Address;
2236 HAL_MCR_RD(prAdapter,
2237 prEventAccessReg->u4Address & BITS(2,31), //address is in DWORD unit
2238 &prEventAccessReg->u4Data);
2245 #if (MT6620_E1_ASIC_HIFSYS_WORKAROUND == 1)
2246 if(prAdapter->fgIsClockGatingEnabled == FALSE) {
2247 nicEnableClockGating(prAdapter);
2252 } /* end of wlanSendCommand() */
2255 /*----------------------------------------------------------------------------*/
2257 * \brief This function will release thd CMD_INFO upon its attribution
2259 * \param prAdapter Pointer of Adapter Data Structure
2260 * \param prCmdInfo Pointer of CMD_INFO_T
2264 /*----------------------------------------------------------------------------*/
2266 wlanReleaseCommand (
2267 IN P_ADAPTER_T prAdapter,
2268 IN P_CMD_INFO_T prCmdInfo
2271 P_TX_CTRL_T prTxCtrl;
2272 P_MSDU_INFO_T prMsduInfo;
2277 prTxCtrl = &prAdapter->rTxCtrl;
2279 switch(prCmdInfo->eCmdType) {
2280 case COMMAND_TYPE_GENERAL_IOCTL:
2281 case COMMAND_TYPE_NETWORK_IOCTL:
2282 if (prCmdInfo->fgIsOid) {
2283 kalOidComplete(prAdapter->prGlueInfo,
2284 prCmdInfo->fgSetQuery,
2285 prCmdInfo->u4SetInfoLen,
2286 WLAN_STATUS_FAILURE);
2290 case COMMAND_TYPE_SECURITY_FRAME:
2291 kalSecurityFrameSendComplete(prAdapter->prGlueInfo,
2292 prCmdInfo->prPacket,
2293 WLAN_STATUS_FAILURE);
2296 case COMMAND_TYPE_MANAGEMENT_FRAME:
2297 prMsduInfo = (P_MSDU_INFO_T)prCmdInfo->prPacket;
2299 /* invoke callbacks */
2300 if(prMsduInfo->pfTxDoneHandler != NULL) {
2301 prMsduInfo->pfTxDoneHandler(prAdapter, prMsduInfo, TX_RESULT_DROPPED_IN_DRIVER);
2304 GLUE_DEC_REF_CNT(prTxCtrl->i4TxMgmtPendingNum);
2305 cnmMgtPktFree(prAdapter, prMsduInfo);
2313 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
2315 } /* end of wlanReleaseCommand() */
2318 /*----------------------------------------------------------------------------*/
2320 * \brief This function will search the CMD Queue to look for the pending OID and
2321 * compelete it immediately when system request a reset.
2323 * \param prAdapter ointer of Adapter Data Structure
2327 /*----------------------------------------------------------------------------*/
2329 wlanReleasePendingOid (
2330 IN P_ADAPTER_T prAdapter,
2336 P_QUE_T prTempCmdQue = &rTempCmdQue;
2337 P_QUE_ENTRY_T prQueueEntry = (P_QUE_ENTRY_T)NULL;
2338 P_CMD_INFO_T prCmdInfo = (P_CMD_INFO_T)NULL;
2340 KAL_SPIN_LOCK_DECLARATION();
2342 DEBUGFUNC("wlanReleasePendingOid");
2346 DBGLOG(INIT, ERROR, ("OID Timeout! Releasing pending OIDs ..\n"));
2349 // 1: Clear Pending OID in prAdapter->rPendingCmdQueue
2350 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_PENDING);
2352 prCmdQue = &prAdapter->rPendingCmdQueue;
2353 QUEUE_MOVE_ALL(prTempCmdQue, prCmdQue);
2355 QUEUE_REMOVE_HEAD(prTempCmdQue, prQueueEntry, P_QUE_ENTRY_T);
2356 while (prQueueEntry) {
2357 prCmdInfo = (P_CMD_INFO_T)prQueueEntry;
2359 if (prCmdInfo->fgIsOid) {
2360 if (prCmdInfo->pfCmdTimeoutHandler) {
2361 prCmdInfo->pfCmdTimeoutHandler(prAdapter, prCmdInfo);
2364 kalOidComplete(prAdapter->prGlueInfo,
2365 prCmdInfo->fgSetQuery,
2367 WLAN_STATUS_FAILURE);
2369 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
2372 QUEUE_INSERT_TAIL(prCmdQue, prQueueEntry);
2375 QUEUE_REMOVE_HEAD(prTempCmdQue, prQueueEntry, P_QUE_ENTRY_T);
2378 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_PENDING);
2380 // 2: Clear pending OID in glue layer command queue
2381 kalOidCmdClearance(prAdapter->prGlueInfo);
2383 // 3: Clear pending OID queued in pvOidEntry with REQ_FLAG_OID set
2384 kalOidClearance(prAdapter->prGlueInfo);
2392 /*----------------------------------------------------------------------------*/
2394 * \brief This function will search the CMD Queue to look for the pending CMD/OID for specific
2395 * NETWORK TYPE and compelete it immediately when system request a reset.
2397 * \param prAdapter ointer of Adapter Data Structure
2401 /*----------------------------------------------------------------------------*/
2403 wlanReleasePendingCMDbyNetwork (
2404 IN P_ADAPTER_T prAdapter,
2405 IN ENUM_NETWORK_TYPE_INDEX_T eNetworkType
2410 P_QUE_T prTempCmdQue = &rTempCmdQue;
2411 P_QUE_ENTRY_T prQueueEntry = (P_QUE_ENTRY_T)NULL;
2412 P_CMD_INFO_T prCmdInfo = (P_CMD_INFO_T)NULL;
2414 KAL_SPIN_LOCK_DECLARATION();
2419 // 1: Clear Pending OID in prAdapter->rPendingCmdQueue
2420 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_PENDING);
2422 prCmdQue = &prAdapter->rPendingCmdQueue;
2423 QUEUE_MOVE_ALL(prTempCmdQue, prCmdQue);
2425 QUEUE_REMOVE_HEAD(prTempCmdQue, prQueueEntry, P_QUE_ENTRY_T);
2426 while (prQueueEntry) {
2427 prCmdInfo = (P_CMD_INFO_T)prQueueEntry;
2429 DBGLOG(P2P, TRACE, ("Pending CMD for Network Type:%d \n", prCmdInfo->eNetworkType));
2431 if (prCmdInfo->eNetworkType == eNetworkType) {
2432 if (prCmdInfo->pfCmdTimeoutHandler) {
2433 prCmdInfo->pfCmdTimeoutHandler(prAdapter, prCmdInfo);
2436 kalOidComplete(prAdapter->prGlueInfo,
2437 prCmdInfo->fgSetQuery,
2439 WLAN_STATUS_FAILURE);
2441 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
2444 QUEUE_INSERT_TAIL(prCmdQue, prQueueEntry);
2447 QUEUE_REMOVE_HEAD(prTempCmdQue, prQueueEntry, P_QUE_ENTRY_T);
2450 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_PENDING);
2456 } /* wlanReleasePendingCMDbyNetwork */
2460 /*----------------------------------------------------------------------------*/
2462 * \brief Return the packet buffer and reallocate one to the RFB
2464 * \param prAdapter Pointer of Adapter Data Structure
2465 * \param pvPacket Pointer of returned packet
2467 * \retval WLAN_STATUS_SUCCESS: Success
2468 * \retval WLAN_STATUS_FAILURE: Failed
2470 /*----------------------------------------------------------------------------*/
2473 IN P_ADAPTER_T prAdapter,
2477 P_RX_CTRL_T prRxCtrl;
2478 P_SW_RFB_T prSwRfb = NULL;
2479 KAL_SPIN_LOCK_DECLARATION();
2481 DEBUGFUNC("wlanReturnPacket");
2485 prRxCtrl = &prAdapter->rRxCtrl;
2489 kalPacketFree(prAdapter->prGlueInfo, pvPacket);
2490 RX_ADD_CNT(prRxCtrl, RX_DATA_RETURNED_COUNT, 1);
2491 #if CFG_NATIVE_802_11
2492 if (GLUE_TEST_FLAG(prAdapter->prGlueInfo, GLUE_FLAG_HALT)) {
2497 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
2498 QUEUE_REMOVE_HEAD(&prRxCtrl->rIndicatedRfbList, prSwRfb, P_SW_RFB_T);
2499 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
2505 if (nicRxSetupRFB(prAdapter, prSwRfb)){
2509 nicRxReturnRFB(prAdapter, prSwRfb);
2512 /*----------------------------------------------------------------------------*/
2514 * \brief This function is a required function that returns information about
2515 * the capabilities and status of the driver and/or its network adapter.
2517 * \param[IN] prAdapter Pointer to the Adapter structure.
2518 * \param[IN] pfnOidQryHandler Function pointer for the OID query handler.
2519 * \param[IN] pvInfoBuf Points to a buffer for return the query information.
2520 * \param[IN] u4QueryBufferLen Specifies the number of bytes at pvInfoBuf.
2521 * \param[OUT] pu4QueryInfoLen Points to the number of bytes it written or is needed.
2523 * \retval WLAN_STATUS_xxx Different WLAN_STATUS code returned by different handlers.
2526 /*----------------------------------------------------------------------------*/
2528 wlanQueryInformation (
2529 IN P_ADAPTER_T prAdapter,
2530 IN PFN_OID_HANDLER_FUNC pfnOidQryHandler,
2532 IN UINT_32 u4InfoBufLen,
2533 OUT PUINT_32 pu4QryInfoLen
2536 WLAN_STATUS status = WLAN_STATUS_FAILURE;
2539 ASSERT(pu4QryInfoLen);
2541 // ignore any OID request after connected, under PS current measurement mode
2542 if (prAdapter->u4PsCurrentMeasureEn &&
2543 (prAdapter->prGlueInfo->eParamMediaStateIndicated == PARAM_MEDIA_STATE_CONNECTED)) {
2544 return WLAN_STATUS_SUCCESS; // note: return WLAN_STATUS_FAILURE or WLAN_STATUS_SUCCESS for blocking OIDs during current measurement ??
2548 /* most OID handler will just queue a command packet */
2549 status = pfnOidQryHandler(prAdapter,
2554 if (wlanIsHandlerNeedHwAccess(pfnOidQryHandler, FALSE)) {
2555 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
2557 /* Reset sleepy state */
2558 if(prAdapter->fgWiFiInSleepyState == TRUE) {
2559 prAdapter->fgWiFiInSleepyState = FALSE;
2562 status = pfnOidQryHandler(prAdapter,
2567 RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);
2570 status = pfnOidQryHandler(prAdapter,
2581 /*----------------------------------------------------------------------------*/
2583 * \brief This function is a required function that allows bound protocol drivers,
2584 * or NDIS, to request changes in the state information that the miniport
2585 * maintains for particular object identifiers, such as changes in multicast
2588 * \param[IN] prAdapter Pointer to the Glue info structure.
2589 * \param[IN] pfnOidSetHandler Points to the OID set handlers.
2590 * \param[IN] pvInfoBuf Points to a buffer containing the OID-specific data for the set.
2591 * \param[IN] u4InfoBufLen Specifies the number of bytes at prSetBuffer.
2592 * \param[OUT] pu4SetInfoLen Points to the number of bytes it read or is needed.
2594 * \retval WLAN_STATUS_xxx Different WLAN_STATUS code returned by different handlers.
2597 /*----------------------------------------------------------------------------*/
2599 wlanSetInformation (
2600 IN P_ADAPTER_T prAdapter,
2601 IN PFN_OID_HANDLER_FUNC pfnOidSetHandler,
2603 IN UINT_32 u4InfoBufLen,
2604 OUT PUINT_32 pu4SetInfoLen
2607 WLAN_STATUS status = WLAN_STATUS_FAILURE;
2610 ASSERT(pu4SetInfoLen);
2612 // ignore any OID request after connected, under PS current measurement mode
2613 if (prAdapter->u4PsCurrentMeasureEn &&
2614 (prAdapter->prGlueInfo->eParamMediaStateIndicated == PARAM_MEDIA_STATE_CONNECTED)) {
2615 return WLAN_STATUS_SUCCESS; // note: return WLAN_STATUS_FAILURE or WLAN_STATUS_SUCCESS for blocking OIDs during current measurement ??
2619 /* most OID handler will just queue a command packet
2620 * for power state transition OIDs, handler will acquire power control by itself
2622 status = pfnOidSetHandler(prAdapter,
2627 if (wlanIsHandlerNeedHwAccess(pfnOidSetHandler, TRUE)) {
2628 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
2630 /* Reset sleepy state */
2631 if(prAdapter->fgWiFiInSleepyState == TRUE) {
2632 prAdapter->fgWiFiInSleepyState = FALSE;
2635 status = pfnOidSetHandler(prAdapter,
2640 RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);
2643 status = pfnOidSetHandler(prAdapter,
2654 #if CFG_SUPPORT_WAPI
2655 /*----------------------------------------------------------------------------*/
2657 * \brief This function is a used to query driver's config wapi mode or not
2659 * \param[IN] prAdapter Pointer to the Glue info structure.
2661 * \retval TRUE for use wapi mode
2664 /*----------------------------------------------------------------------------*/
2667 IN P_ADAPTER_T prAdapter
2672 return prAdapter->rWifiVar.rConnSettings.fgWapiMode;
2677 /*----------------------------------------------------------------------------*/
2679 * \brief This function is called to set RX filter to Promiscuous Mode.
2681 * \param[IN] prAdapter Pointer to the Adapter structure.
2682 * \param[IN] fgEnablePromiscuousMode Enable/ disable RX Promiscuous Mode.
2686 /*----------------------------------------------------------------------------*/
2688 wlanSetPromiscuousMode (
2689 IN P_ADAPTER_T prAdapter,
2690 IN BOOLEAN fgEnablePromiscuousMode
2697 /*----------------------------------------------------------------------------*/
2699 * \brief This function is called to set RX filter to allow to receive
2700 * broadcast address packets.
2702 * \param[IN] prAdapter Pointer to the Adapter structure.
2703 * \param[IN] fgEnableBroadcast Enable/ disable broadcast packet to be received.
2707 /*----------------------------------------------------------------------------*/
2709 wlanRxSetBroadcast (
2710 IN P_ADAPTER_T prAdapter,
2711 IN BOOLEAN fgEnableBroadcast
2717 /*----------------------------------------------------------------------------*/
2719 * \brief This function is called to send out CMD_NIC_POWER_CTRL command packet
2721 * \param[IN] prAdapter Pointer to the Adapter structure.
2722 * \param[IN] ucPowerMode refer to CMD/EVENT document
2724 * \return WLAN_STATUS_SUCCESS
2725 * \return WLAN_STATUS_FAILURE
2727 /*----------------------------------------------------------------------------*/
2729 wlanSendNicPowerCtrlCmd (
2730 IN P_ADAPTER_T prAdapter,
2731 IN UINT_8 ucPowerMode
2734 WLAN_STATUS status = WLAN_STATUS_SUCCESS;
2735 P_GLUE_INFO_T prGlueInfo;
2736 P_CMD_INFO_T prCmdInfo;
2737 P_WIFI_CMD_T prWifiCmd;
2738 UINT_8 ucTC, ucCmdSeqNum;
2742 prGlueInfo = prAdapter->prGlueInfo;
2744 /* 1. Prepare CMD */
2745 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + sizeof(CMD_NIC_POWER_CTRL)));
2747 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
2748 return WLAN_STATUS_FAILURE;
2751 /* 2.1 increase command sequence number */
2752 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
2753 DBGLOG(REQ, TRACE, ("ucCmdSeqNum =%d\n", ucCmdSeqNum));
2755 /* 2.2 Setup common CMD Info Packet */
2756 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
2757 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + sizeof(CMD_NIC_POWER_CTRL));
2758 prCmdInfo->pfCmdDoneHandler = NULL;
2759 prCmdInfo->pfCmdTimeoutHandler = NULL;
2760 prCmdInfo->fgIsOid = TRUE;
2761 prCmdInfo->ucCID = CMD_ID_NIC_POWER_CTRL;
2762 prCmdInfo->fgSetQuery = TRUE;
2763 prCmdInfo->fgNeedResp = FALSE;
2764 prCmdInfo->fgDriverDomainMCR = FALSE;
2765 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
2766 prCmdInfo->u4SetInfoLen = sizeof(CMD_NIC_POWER_CTRL);
2768 /* 2.3 Setup WIFI_CMD_T */
2769 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
2770 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
2771 prWifiCmd->ucCID = prCmdInfo->ucCID;
2772 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
2773 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
2775 kalMemZero(prWifiCmd->aucBuffer, sizeof(CMD_NIC_POWER_CTRL));
2776 ((P_CMD_NIC_POWER_CTRL)(prWifiCmd->aucBuffer))->ucPowerMode = ucPowerMode;
2778 /* 3. Issue CMD for entering specific power mode */
2782 // 3.0 Removal check
2783 if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
2784 || fgIsBusAccessFailed == TRUE) {
2785 status = WLAN_STATUS_FAILURE;
2789 // 3.1 Acquire TX Resource
2790 if (nicTxAcquireResource(prAdapter, ucTC) == WLAN_STATUS_RESOURCES) {
2791 if (nicTxPollingResource(prAdapter, ucTC) != WLAN_STATUS_SUCCESS) {
2792 DBGLOG(INIT, ERROR,("Fail to get TX resource return within timeout\n"));
2793 status = WLAN_STATUS_FAILURE;
2801 // 3.2 Send CMD Info Packet
2802 if (nicTxCmd(prAdapter, prCmdInfo, ucTC) != WLAN_STATUS_SUCCESS) {
2803 DBGLOG(INIT, ERROR,("Fail to transmit CMD_NIC_POWER_CTRL command\n"));
2804 status = WLAN_STATUS_FAILURE;
2810 // 4. Free CMD Info Packet.
2811 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
2814 if(ucPowerMode == 1) {
2815 prAdapter->fgIsEnterD3ReqIssued = TRUE;
2822 /*----------------------------------------------------------------------------*/
2824 * \brief This function is called to check if it is RF test mode and
2825 * the OID is allowed to be called or not
2827 * \param[IN] prAdapter Pointer to the Adapter structure.
2828 * \param[IN] fgEnableBroadcast Enable/ disable broadcast packet to be received.
2832 /*----------------------------------------------------------------------------*/
2834 wlanIsHandlerAllowedInRFTest (
2835 IN PFN_OID_HANDLER_FUNC pfnOidHandler,
2836 IN BOOLEAN fgSetInfo
2839 PFN_OID_HANDLER_FUNC* apfnOidHandlerAllowedInRFTest;
2841 UINT_32 u4NumOfElem;
2844 apfnOidHandlerAllowedInRFTest = apfnOidSetHandlerAllowedInRFTest;
2845 u4NumOfElem = sizeof(apfnOidSetHandlerAllowedInRFTest) / sizeof(PFN_OID_HANDLER_FUNC);
2848 apfnOidHandlerAllowedInRFTest = apfnOidQueryHandlerAllowedInRFTest;
2849 u4NumOfElem = sizeof(apfnOidQueryHandlerAllowedInRFTest) / sizeof(PFN_OID_HANDLER_FUNC);
2852 for (i = 0; i < u4NumOfElem; i++) {
2853 if (apfnOidHandlerAllowedInRFTest[i] == pfnOidHandler) {
2861 #if CFG_ENABLE_FW_DOWNLOAD
2862 #if CFG_ENABLE_FW_DOWNLOAD_AGGREGATION
2863 /*----------------------------------------------------------------------------*/
2865 * @brief This function is called to download FW image in an aggregated way
2867 * @param prAdapter Pointer to the Adapter structure.
2871 /*----------------------------------------------------------------------------*/
2873 wlanImageSectionDownloadAggregated (
2874 IN P_ADAPTER_T prAdapter,
2875 IN UINT_32 u4DestAddr,
2876 IN UINT_32 u4ImgSecSize,
2877 IN PUINT_8 pucImgSecBuf
2880 #if defined(MT6620) || defined(MT6628)
2881 P_CMD_INFO_T prCmdInfo;
2882 P_INIT_HIF_TX_HEADER_T prInitHifTxHeader;
2883 P_INIT_CMD_DOWNLOAD_BUF prInitCmdDownloadBuf;
2884 UINT_8 ucTC, ucCmdSeqNum;
2885 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
2886 PUINT_8 pucOutputBuf = (PUINT_8)NULL; /* Pointer to Transmit Data Structure Frame */
2887 UINT_32 u4PktCnt, u4Offset, u4Length;
2888 UINT_32 u4TotalLength;
2891 ASSERT(pucImgSecBuf);
2893 pucOutputBuf = prAdapter->rTxCtrl.pucTxCoalescingBufPtr;
2895 DEBUGFUNC("wlanImageSectionDownloadAggregated");
2897 if (u4ImgSecSize == 0) {
2898 return WLAN_STATUS_SUCCESS;
2901 // 1. Allocate CMD Info Packet and Pre-fill Headers
2902 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter,
2903 sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF) + CMD_PKT_SIZE_FOR_IMAGE);
2906 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
2907 return WLAN_STATUS_FAILURE;
2910 prCmdInfo->u2InfoBufLen =
2911 sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF) + CMD_PKT_SIZE_FOR_IMAGE;
2913 // 2. Use TC0's resource to download image. (only TC0 is allowed)
2916 // 3. Setup common CMD Info Packet
2917 prInitHifTxHeader = (P_INIT_HIF_TX_HEADER_T)(prCmdInfo->pucInfoBuffer);
2918 prInitHifTxHeader->ucEtherTypeOffset = 0;
2919 prInitHifTxHeader->ucCSflags = 0;
2920 prInitHifTxHeader->rInitWifiCmd.ucCID = INIT_CMD_ID_DOWNLOAD_BUF;
2922 // 4. Setup CMD_DOWNLOAD_BUF
2923 prInitCmdDownloadBuf = (P_INIT_CMD_DOWNLOAD_BUF)(prInitHifTxHeader->rInitWifiCmd.aucBuffer);
2924 prInitCmdDownloadBuf->u4DataMode = 0
2925 #if CFG_ENABLE_FW_ENCRYPTION
2926 | DOWNLOAD_BUF_ENCRYPTION_MODE
2930 // 5.0 reset loop control variable
2932 u4Offset = u4PktCnt = 0;
2934 // 5.1 main loop for maximize transmission count per access
2935 while(u4Offset < u4ImgSecSize) {
2936 if(nicTxAcquireResource(prAdapter, ucTC) == WLAN_STATUS_SUCCESS) {
2937 // 5.1.1 calculate u4Length
2938 if(u4Offset + CMD_PKT_SIZE_FOR_IMAGE < u4ImgSecSize) {
2939 u4Length = CMD_PKT_SIZE_FOR_IMAGE;
2942 u4Length = u4ImgSecSize - u4Offset;
2945 // 5.1.1 increase command sequence number
2946 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
2947 prInitHifTxHeader->rInitWifiCmd.ucSeqNum = ucCmdSeqNum;
2949 // 5.1.2 update HIF TX hardware header
2950 prInitHifTxHeader->u2TxByteCount = ALIGN_4(sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF) + (UINT_16)u4Length);
2952 // 5.1.3 fill command header
2953 prInitCmdDownloadBuf->u4Address = u4DestAddr + u4Offset;
2954 prInitCmdDownloadBuf->u4Length = u4Length;
2955 prInitCmdDownloadBuf->u4CRC32 = wlanCRC32(pucImgSecBuf + u4Offset, u4Length);
2957 // 5.1.4.1 copy header to coalescing buffer
2958 kalMemCopy(pucOutputBuf + u4TotalLength,
2959 (PVOID)prCmdInfo->pucInfoBuffer,
2960 sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF));
2962 // 5.1.4.2 copy payload to coalescing buffer
2963 kalMemCopy(pucOutputBuf + u4TotalLength + sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF),
2964 pucImgSecBuf + u4Offset,
2967 // 5.1.4.3 update length and other variables
2968 u4TotalLength += ALIGN_4(sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF) + u4Length);
2969 u4Offset += u4Length;
2972 if(u4Offset < u4ImgSecSize) {
2976 else if(u4PktCnt == 0) {
2977 /* no resource, so get some back */
2978 if (nicTxPollingResource(prAdapter, ucTC) != WLAN_STATUS_SUCCESS) {
2979 u4Status = WLAN_STATUS_FAILURE;
2980 DBGLOG(INIT, ERROR,("Fail to get TX resource return within timeout\n"));
2986 // start transmission
2987 HAL_WRITE_TX_PORT(prAdapter,
2990 (PUINT_8)pucOutputBuf,
2991 prAdapter->u4CoalescingBufCachedSize);
2999 // 8. Free CMD Info Packet.
3000 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
3005 #error "Only MT6620/MT6628 supports firmware download in an aggregated way"
3007 return WLAN_STATUS_FAILURE;
3013 /*----------------------------------------------------------------------------*/
3015 * @brief This function is called to download FW image.
3017 * @param prAdapter Pointer to the Adapter structure.
3021 /*----------------------------------------------------------------------------*/
3023 wlanImageSectionDownload (
3024 IN P_ADAPTER_T prAdapter,
3025 IN UINT_32 u4DestAddr,
3026 IN UINT_32 u4ImgSecSize,
3027 IN PUINT_8 pucImgSecBuf
3030 #if defined(MT6620) || defined(MT6628)
3032 P_CMD_INFO_T prCmdInfo;
3033 P_INIT_HIF_TX_HEADER_T prInitHifTxHeader;
3034 P_INIT_CMD_DOWNLOAD_BUF prInitCmdDownloadBuf;
3035 UINT_8 ucTC, ucCmdSeqNum;
3036 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
3039 ASSERT(pucImgSecBuf);
3040 ASSERT(u4ImgSecSize <= CMD_PKT_SIZE_FOR_IMAGE);
3042 DEBUGFUNC("wlanImageSectionDownload");
3044 if (u4ImgSecSize == 0) {
3045 return WLAN_STATUS_SUCCESS;
3048 // 1. Allocate CMD Info Packet and its Buffer.
3049 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter,
3050 sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF) + u4ImgSecSize);
3053 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3054 return WLAN_STATUS_FAILURE;
3057 prCmdInfo->u2InfoBufLen =
3058 sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_DOWNLOAD_BUF) + (UINT_16)u4ImgSecSize;
3060 // 2. Use TC0's resource to download image. (only TC0 is allowed)
3063 // 3. increase command sequence number
3064 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3066 // 4. Setup common CMD Info Packet
3067 prInitHifTxHeader = (P_INIT_HIF_TX_HEADER_T)(prCmdInfo->pucInfoBuffer);
3068 prInitHifTxHeader->rInitWifiCmd.ucCID = INIT_CMD_ID_DOWNLOAD_BUF;
3069 prInitHifTxHeader->rInitWifiCmd.ucSeqNum = ucCmdSeqNum;
3071 // 5. Setup CMD_DOWNLOAD_BUF
3072 prInitCmdDownloadBuf = (P_INIT_CMD_DOWNLOAD_BUF)(prInitHifTxHeader->rInitWifiCmd.aucBuffer);
3073 prInitCmdDownloadBuf->u4Address = u4DestAddr;
3074 prInitCmdDownloadBuf->u4Length = u4ImgSecSize;
3075 prInitCmdDownloadBuf->u4CRC32 = wlanCRC32(pucImgSecBuf, u4ImgSecSize);
3076 prInitCmdDownloadBuf->u4DataMode = 0
3077 #if CFG_ENABLE_FW_DOWNLOAD_ACK
3078 | DOWNLOAD_BUF_ACK_OPTION // ACK needed
3080 #if CFG_ENABLE_FW_ENCRYPTION
3081 | DOWNLOAD_BUF_ENCRYPTION_MODE
3084 kalMemCopy(prInitCmdDownloadBuf->aucBuffer, pucImgSecBuf, u4ImgSecSize);
3086 // 6. Send FW_Download command
3088 // 6.1 Acquire TX Resource
3089 if (nicTxAcquireResource(prAdapter, ucTC) == WLAN_STATUS_RESOURCES) {
3090 if (nicTxPollingResource(prAdapter, ucTC) != WLAN_STATUS_SUCCESS) {
3091 u4Status = WLAN_STATUS_FAILURE;
3092 DBGLOG(INIT, ERROR,("Fail to get TX resource return within timeout\n"));
3100 // 6.2 Send CMD Info Packet
3101 if (nicTxInitCmd(prAdapter, prCmdInfo, ucTC) != WLAN_STATUS_SUCCESS) {
3102 u4Status = WLAN_STATUS_FAILURE;
3103 DBGLOG(INIT, ERROR,("Fail to transmit image download command\n"));
3109 #if CFG_ENABLE_FW_DOWNLOAD_ACK
3110 // 7. Wait for INIT_EVENT_ID_CMD_RESULT
3111 u4Status = wlanImageSectionDownloadStatus(prAdapter, ucCmdSeqNum);
3114 // 8. Free CMD Info Packet.
3115 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
3119 #elif defined(MT5931)
3122 P_HIF_HW_TX_HEADER_T prHifTxHeader;
3124 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
3127 ASSERT(pucImgSecBuf);
3128 ASSERT(u4ImgSecSize <= CMD_PKT_SIZE_FOR_IMAGE);
3130 DEBUGFUNC("wlanImageSectionDownload");
3131 DBGLOG(INIT, TRACE, ("Destination: 0x%08X / Length: 0x%08X\n", u4DestAddr, u4ImgSecSize));
3133 if (u4ImgSecSize == 0) {
3134 return WLAN_STATUS_SUCCESS;
3137 // 1. Use TX coalescing buffer
3138 prHifTxHeader = (P_HIF_HW_TX_HEADER_T) prAdapter->pucCoalescingBufCached;
3140 // 2. Setup HIF_TX_HEADER
3141 prHifTxHeader->u2TxByteCount = (UINT_16)(ALIGN_4(sizeof(HIF_HW_TX_HEADER_T) + u4ImgSecSize));
3142 prHifTxHeader->ucEtherTypeOffset = 0;
3143 prHifTxHeader->ucCSflags = 0;
3146 kalMemCopy(prHifTxHeader->aucBuffer, pucImgSecBuf, u4ImgSecSize);
3148 // 3.1 add 4-bytes zero tail
3149 kalMemZero(&(prHifTxHeader->aucBuffer[ALIGN_4(u4ImgSecSize)]), sizeof(HIF_HW_TX_HEADER_T));
3151 // 4. Poll til FWDL_RDY = 1
3154 HAL_MCR_RD(prAdapter, MCR_FWDLSR, &u4Value);
3156 if (u4Value & FWDLSR_FWDL_RDY) {
3157 DBGLOG(INIT, TRACE, ("FWDL_RDY detected\n"));
3160 else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
3161 || fgIsBusAccessFailed == TRUE) {
3162 u4Status = WLAN_STATUS_FAILURE;
3165 else if(i >= CFG_RESPONSE_POLLING_TIMEOUT) {
3166 DBGLOG(INIT, ERROR, ("Waiting for FWDL_RDY: Timeout (0x%08X)\n", u4Value));
3167 u4Status = WLAN_STATUS_FAILURE;
3177 HAL_PORT_WR(prAdapter,
3179 prHifTxHeader->u2TxByteCount,
3180 (PUINT_8)prHifTxHeader,
3181 prAdapter->u4CoalescingBufCachedSize);
3188 #if !CFG_ENABLE_FW_DOWNLOAD_ACK
3189 /*----------------------------------------------------------------------------*/
3191 * @brief This function is called to confirm previously firmware download is done without error
3193 * @param prAdapter Pointer to the Adapter structure.
3197 /*----------------------------------------------------------------------------*/
3199 wlanImageQueryStatus(
3200 IN P_ADAPTER_T prAdapter
3203 P_CMD_INFO_T prCmdInfo;
3204 P_INIT_HIF_TX_HEADER_T prInitHifTxHeader;
3205 UINT_8 aucBuffer[sizeof(INIT_HIF_RX_HEADER_T) + sizeof(INIT_EVENT_PENDING_ERROR)];
3206 UINT_32 u4RxPktLength;
3207 P_INIT_HIF_RX_HEADER_T prInitHifRxHeader;
3208 P_INIT_EVENT_PENDING_ERROR prEventPendingError;
3209 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
3210 UINT_8 ucTC, ucCmdSeqNum;
3214 DEBUGFUNC("wlanImageQueryStatus");
3216 // 1. Allocate CMD Info Packet and it Buffer.
3217 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, sizeof(INIT_HIF_TX_HEADER_T));
3220 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3221 return WLAN_STATUS_FAILURE;
3224 kalMemZero(prCmdInfo, sizeof(INIT_HIF_TX_HEADER_T));
3225 prCmdInfo->u2InfoBufLen = sizeof(INIT_HIF_TX_HEADER_T);
3227 // 2. Use TC0's resource to download image. (only TC0 is allowed)
3230 // 3. increase command sequence number
3231 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3233 // 4. Setup common CMD Info Packet
3234 prInitHifTxHeader = (P_INIT_HIF_TX_HEADER_T)(prCmdInfo->pucInfoBuffer);
3235 prInitHifTxHeader->rInitWifiCmd.ucCID = INIT_CMD_ID_QUERY_PENDING_ERROR;
3236 prInitHifTxHeader->rInitWifiCmd.ucSeqNum = ucCmdSeqNum;
3240 // 5.1 Acquire TX Resource
3241 if (nicTxAcquireResource(prAdapter, ucTC) == WLAN_STATUS_RESOURCES) {
3242 if (nicTxPollingResource(prAdapter, ucTC) != WLAN_STATUS_SUCCESS) {
3243 u4Status = WLAN_STATUS_FAILURE;
3244 DBGLOG(INIT, ERROR,("Fail to get TX resource return within timeout\n"));
3252 // 5.2 Send CMD Info Packet
3253 if (nicTxInitCmd(prAdapter, prCmdInfo, ucTC) != WLAN_STATUS_SUCCESS) {
3254 u4Status = WLAN_STATUS_FAILURE;
3255 DBGLOG(INIT, ERROR,("Fail to transmit image download command\n"));
3261 // 6. Wait for INIT_EVENT_ID_PENDING_ERROR
3263 if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
3264 || fgIsBusAccessFailed == TRUE) {
3265 u4Status = WLAN_STATUS_FAILURE;
3266 DBGLOG(INIT, ERROR, ("Bus error(%d)/Card removed(%d)\n", fgIsBusAccessFailed, kalIsCardRemoved(prAdapter->prGlueInfo)));
3268 else if(nicRxWaitResponse(prAdapter,
3271 sizeof(INIT_HIF_RX_HEADER_T) + sizeof(INIT_EVENT_PENDING_ERROR),
3272 &u4RxPktLength) != WLAN_STATUS_SUCCESS) {
3273 u4Status = WLAN_STATUS_FAILURE;
3274 DBGLOG(INIT, ERROR, ("No RX response\n"));
3277 prInitHifRxHeader = (P_INIT_HIF_RX_HEADER_T) aucBuffer;
3279 // EID / SeqNum check
3280 if(prInitHifRxHeader->rInitWifiEvent.ucEID != INIT_EVENT_ID_PENDING_ERROR) {
3281 u4Status = WLAN_STATUS_FAILURE;
3282 DBGLOG(INIT, ERROR, ("EVENT-ID Mismatch: %d\n", prInitHifRxHeader->rInitWifiEvent.ucEID));
3284 else if(prInitHifRxHeader->rInitWifiEvent.ucSeqNum != ucCmdSeqNum) {
3285 u4Status = WLAN_STATUS_FAILURE;
3286 DBGLOG(INIT, ERROR, ("SEQ-NUM Mismatch: %d (expected: %d)\n", prInitHifRxHeader->rInitWifiEvent.ucSeqNum, ucCmdSeqNum));
3289 prEventPendingError = (P_INIT_EVENT_PENDING_ERROR) (prInitHifRxHeader->rInitWifiEvent.aucBuffer);
3290 if(prEventPendingError->ucStatus != 0) { // 0 for download success
3291 u4Status = WLAN_STATUS_FAILURE;
3292 DBGLOG(INIT, ERROR, ("ERROR CODE: %d\n", prEventCmdResult->ucStatus));
3295 u4Status = WLAN_STATUS_SUCCESS;
3301 // 7. Free CMD Info Packet.
3302 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
3309 /*----------------------------------------------------------------------------*/
3311 * @brief This function is called to confirm the status of
3312 * previously downloaded firmware scatter
3314 * @param prAdapter Pointer to the Adapter structure.
3315 * ucCmdSeqNum Sequence number of previous firmware scatter
3317 * @return WLAN_STATUS_SUCCESS
3318 * WLAN_STATUS_FAILURE
3320 /*----------------------------------------------------------------------------*/
3322 wlanImageSectionDownloadStatus (
3323 IN P_ADAPTER_T prAdapter,
3324 IN UINT_8 ucCmdSeqNum
3327 UINT_8 aucBuffer[sizeof(INIT_HIF_RX_HEADER_T) + sizeof(INIT_EVENT_CMD_RESULT)];
3328 P_INIT_HIF_RX_HEADER_T prInitHifRxHeader;
3329 P_INIT_EVENT_CMD_RESULT prEventCmdResult;
3330 UINT_32 u4RxPktLength;
3331 WLAN_STATUS u4Status;
3336 if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
3337 || fgIsBusAccessFailed == TRUE) {
3338 u4Status = WLAN_STATUS_FAILURE;
3339 DBGLOG(INIT, ERROR, ("Bus error(%d)/Card removed(%d)\n", fgIsBusAccessFailed, kalIsCardRemoved(prAdapter->prGlueInfo)));
3341 else if(nicRxWaitResponse(prAdapter,
3344 sizeof(INIT_HIF_RX_HEADER_T) + sizeof(INIT_EVENT_CMD_RESULT),
3345 &u4RxPktLength) != WLAN_STATUS_SUCCESS) {
3346 u4Status = WLAN_STATUS_FAILURE;
3347 DBGLOG(INIT, ERROR, ("No RX response\n"));
3350 prInitHifRxHeader = (P_INIT_HIF_RX_HEADER_T) aucBuffer;
3352 // EID / SeqNum check
3353 if(prInitHifRxHeader->rInitWifiEvent.ucEID != INIT_EVENT_ID_CMD_RESULT) {
3354 u4Status = WLAN_STATUS_FAILURE;
3355 DBGLOG(INIT, ERROR, ("EVENT-ID Mismatch: %d\n", prInitHifRxHeader->rInitWifiEvent.ucEID));
3357 else if(prInitHifRxHeader->rInitWifiEvent.ucSeqNum != ucCmdSeqNum) {
3358 u4Status = WLAN_STATUS_FAILURE;
3359 DBGLOG(INIT, ERROR, ("SEQ-NUM Mismatch: %d\n", prInitHifRxHeader->rInitWifiEvent.ucSeqNum));
3362 prEventCmdResult = (P_INIT_EVENT_CMD_RESULT) (prInitHifRxHeader->rInitWifiEvent.aucBuffer);
3363 if(prEventCmdResult->ucStatus != 0) { // 0 for download success
3364 u4Status = WLAN_STATUS_FAILURE;
3365 DBGLOG(INIT, ERROR, ("ERROR CODE: %d\n", prEventCmdResult->ucStatus));
3368 u4Status = WLAN_STATUS_SUCCESS;
3379 /*----------------------------------------------------------------------------*/
3381 * @brief This function is called to start FW normal operation.
3383 * @param prAdapter Pointer to the Adapter structure.
3387 /*----------------------------------------------------------------------------*/
3389 wlanConfigWifiFunc (
3390 IN P_ADAPTER_T prAdapter,
3391 IN BOOLEAN fgEnable,
3392 IN UINT_32 u4StartAddress
3395 P_CMD_INFO_T prCmdInfo;
3396 P_INIT_HIF_TX_HEADER_T prInitHifTxHeader;
3397 P_INIT_CMD_WIFI_START prInitCmdWifiStart;
3398 UINT_8 ucTC, ucCmdSeqNum;
3399 WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
3403 DEBUGFUNC("wlanConfigWifiFunc");
3405 // 1. Allocate CMD Info Packet and its Buffer.
3406 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter,
3407 sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_WIFI_START));
3410 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3411 return WLAN_STATUS_FAILURE;
3414 kalMemZero(prCmdInfo, sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_WIFI_START));
3415 prCmdInfo->u2InfoBufLen =
3416 sizeof(INIT_HIF_TX_HEADER_T) + sizeof(INIT_CMD_WIFI_START);
3418 // 2. Always use TC0
3421 // 3. increase command sequence number
3422 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3424 // 4. Setup common CMD Info Packet
3425 prInitHifTxHeader = (P_INIT_HIF_TX_HEADER_T)(prCmdInfo->pucInfoBuffer);
3426 prInitHifTxHeader->rInitWifiCmd.ucCID = INIT_CMD_ID_WIFI_START;
3427 prInitHifTxHeader->rInitWifiCmd.ucSeqNum = ucCmdSeqNum;
3429 prInitCmdWifiStart = (P_INIT_CMD_WIFI_START)(prInitHifTxHeader->rInitWifiCmd.aucBuffer);
3430 prInitCmdWifiStart->u4Override = (fgEnable == TRUE ? 1 : 0);
3431 prInitCmdWifiStart->u4Address = u4StartAddress;
3433 // 5. Seend WIFI start command
3435 // 5.1 Acquire TX Resource
3436 if (nicTxAcquireResource(prAdapter, ucTC) == WLAN_STATUS_RESOURCES) {
3437 if (nicTxPollingResource(prAdapter, ucTC) != WLAN_STATUS_SUCCESS) {
3438 u4Status = WLAN_STATUS_FAILURE;
3439 DBGLOG(INIT, ERROR,("Fail to get TX resource return within timeout\n"));
3447 // 5.2 Send CMD Info Packet
3448 if (nicTxInitCmd(prAdapter, prCmdInfo, ucTC) != WLAN_STATUS_SUCCESS) {
3449 u4Status = WLAN_STATUS_FAILURE;
3450 DBGLOG(INIT, ERROR,("Fail to transmit WIFI start command\n"));
3456 // 6. Free CMD Info Packet.
3457 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
3463 /*----------------------------------------------------------------------------*/
3465 * @brief This function is used to generate CRC32 checksum
3467 * @param buf Pointer to the data.
3468 * @param len data length
3470 * @return crc32 value
3472 /*----------------------------------------------------------------------------*/
3477 UINT_32 i, crc32 = 0xFFFFFFFF;
3478 const UINT_32 crc32_ccitt_table[256] = {
3479 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
3480 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
3481 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
3482 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
3483 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
3484 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
3485 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
3486 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
3487 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
3488 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
3489 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
3490 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
3491 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
3492 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
3493 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
3494 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
3495 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
3496 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
3497 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
3498 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
3499 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
3500 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
3501 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
3502 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
3503 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
3504 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
3505 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
3506 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
3507 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
3508 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
3509 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
3510 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
3511 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
3512 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
3513 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
3514 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
3515 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
3516 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
3517 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
3518 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
3519 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
3520 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
3521 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
3522 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
3523 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
3524 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
3525 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
3526 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
3527 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
3528 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
3529 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
3532 for (i = 0; i < len; i++)
3533 crc32 = crc32_ccitt_table[(crc32 ^ buf[i]) & 0xff] ^ (crc32 >> 8);
3540 /*----------------------------------------------------------------------------*/
3542 * @brief This function is called to process queued RX packets
3544 * @param prAdapter Pointer to the Adapter structure.
3545 * prSwRfbListHead Pointer to head of RX packets link list
3549 /*----------------------------------------------------------------------------*/
3551 wlanProcessQueuedSwRfb (
3552 IN P_ADAPTER_T prAdapter,
3553 IN P_SW_RFB_T prSwRfbListHead
3556 P_SW_RFB_T prSwRfb, prNextSwRfb;
3557 P_TX_CTRL_T prTxCtrl;
3558 P_RX_CTRL_T prRxCtrl;
3561 ASSERT(prSwRfbListHead);
3563 prTxCtrl = &prAdapter->rTxCtrl;
3564 prRxCtrl = &prAdapter->rRxCtrl;
3566 prSwRfb = prSwRfbListHead;
3570 prNextSwRfb = (P_SW_RFB_T)QUEUE_GET_NEXT_ENTRY((P_QUE_ENTRY_T)prSwRfb);
3572 switch(prSwRfb->eDst) {
3573 case RX_PKT_DESTINATION_HOST:
3574 nicRxProcessPktWithoutReorder(prAdapter, prSwRfb);
3577 case RX_PKT_DESTINATION_FORWARD:
3578 nicRxProcessForwardPkt(prAdapter, prSwRfb);
3581 case RX_PKT_DESTINATION_HOST_WITH_FORWARD:
3582 nicRxProcessGOBroadcastPkt(prAdapter, prSwRfb);
3585 case RX_PKT_DESTINATION_NULL:
3586 nicRxReturnRFB(prAdapter, prSwRfb);
3593 #if CFG_HIF_RX_STARVATION_WARNING
3594 prRxCtrl->u4DequeuedCnt++;
3596 prSwRfb = prNextSwRfb;
3599 return WLAN_STATUS_SUCCESS;
3603 /*----------------------------------------------------------------------------*/
3605 * @brief This function is called to purge queued TX packets
3606 * by indicating failure to OS and returned to free list
3608 * @param prAdapter Pointer to the Adapter structure.
3609 * prMsduInfoListHead Pointer to head of TX packets link list
3613 /*----------------------------------------------------------------------------*/
3615 wlanProcessQueuedMsduInfo (
3616 IN P_ADAPTER_T prAdapter,
3617 IN P_MSDU_INFO_T prMsduInfoListHead
3621 ASSERT(prMsduInfoListHead);
3623 nicTxFreeMsduInfoPacket(prAdapter, prMsduInfoListHead);
3624 nicTxReturnMsduInfo(prAdapter, prMsduInfoListHead);
3626 return WLAN_STATUS_SUCCESS;
3630 /*----------------------------------------------------------------------------*/
3632 * @brief This function is called to check if the OID handler needs timeout
3634 * @param prAdapter Pointer to the Adapter structure.
3635 * pfnOidHandler Pointer to the OID handler
3640 /*----------------------------------------------------------------------------*/
3642 wlanoidTimeoutCheck (
3643 IN P_ADAPTER_T prAdapter,
3644 IN PFN_OID_HANDLER_FUNC pfnOidHandler
3647 PFN_OID_HANDLER_FUNC* apfnOidHandlerWOTimeoutCheck;
3649 UINT_32 u4NumOfElem;
3651 apfnOidHandlerWOTimeoutCheck = apfnOidWOTimeoutCheck;
3652 u4NumOfElem = sizeof(apfnOidWOTimeoutCheck) / sizeof(PFN_OID_HANDLER_FUNC);
3654 for (i = 0; i < u4NumOfElem; i++) {
3655 if (apfnOidHandlerWOTimeoutCheck[i] == pfnOidHandler) {
3660 // set timer if need timeout check
3661 //cnmTimerStartTimer(prAdapter,
3662 // &(prAdapter->rOidTimeoutTimer),
3664 cnmTimerStartTimer(prAdapter,
3665 &(prAdapter->rOidTimeoutTimer),
3672 /*----------------------------------------------------------------------------*/
3674 * @brief This function is called to clear any pending OID timeout check
3676 * @param prAdapter Pointer to the Adapter structure.
3680 /*----------------------------------------------------------------------------*/
3682 wlanoidClearTimeoutCheck (
3683 IN P_ADAPTER_T prAdapter
3688 cnmTimerStopTimer(prAdapter, &(prAdapter->rOidTimeoutTimer));
3692 /*----------------------------------------------------------------------------*/
3694 * @brief This function is called to set up the MCUSYS's OSC stable time
3696 * @param prAdapter Pointer to the Adapter structure.
3700 /*----------------------------------------------------------------------------*/
3702 #if CFG_SUPPORT_OSC_SETTING && defined(MT5931)
3704 wlanSetMcuOscStableTime (
3705 IN P_ADAPTER_T prAdapter,
3706 IN UINT_16 u2OscStableTime
3709 UINT_8 ucCmdSeqNum = 0;
3710 P_CMD_INFO_T prCmdInfo = NULL;
3711 P_WIFI_CMD_T prWifiCmd = NULL;
3712 P_CMD_MCU_LP_PARAM_T prMcuSetOscCmd = NULL;
3713 WLAN_STATUS status = WLAN_STATUS_SUCCESS;
3717 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter,
3718 CMD_HDR_SIZE + sizeof(CMD_MCU_LP_PARAM_T));
3721 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3722 return WLAN_STATUS_FAILURE;
3725 // increase command sequence number
3726 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3728 // compose CMD_MCU_LP_PARAM_T cmd pkt
3729 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
3730 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_MCU_LP_PARAM_T);
3731 prCmdInfo->pfCmdDoneHandler = NULL;
3732 prCmdInfo->pfCmdTimeoutHandler = NULL;
3733 prCmdInfo->fgIsOid = FALSE;
3734 prCmdInfo->ucCID = CMD_ID_SET_OSC;
3735 prCmdInfo->fgSetQuery = TRUE;
3736 prCmdInfo->fgNeedResp = FALSE;
3737 prCmdInfo->fgDriverDomainMCR = FALSE;
3738 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
3739 prCmdInfo->u4SetInfoLen = sizeof(CMD_MCU_LP_PARAM_T);
3742 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
3743 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
3744 prWifiCmd->ucCID = prCmdInfo->ucCID;
3745 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
3746 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
3748 // configure CMD_MCU_LP_PARAM_T
3749 prMcuSetOscCmd = (P_CMD_MCU_LP_PARAM_T)(prWifiCmd->aucBuffer);
3750 prMcuSetOscCmd->u2OscStableTime = u2OscStableTime;
3752 status = wlanSendCommand(prAdapter, prCmdInfo);
3753 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
3759 /*----------------------------------------------------------------------------*/
3761 * @brief This function is called to update network address in firmware domain
3763 * @param prAdapter Pointer to the Adapter structure.
3765 * @return WLAN_STATUS_FAILURE The request could not be processed
3766 * WLAN_STATUS_PENDING The request has been queued for later processing
3767 * WLAN_STATUS_SUCCESS The request has been processed
3769 /*----------------------------------------------------------------------------*/
3771 wlanUpdateNetworkAddress (
3772 IN P_ADAPTER_T prAdapter
3775 const UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
3776 PARAM_MAC_ADDRESS rMacAddr;
3778 P_CMD_INFO_T prCmdInfo;
3779 P_WIFI_CMD_T prWifiCmd;
3780 P_CMD_BASIC_CONFIG prCmdBasicConfig;
3783 DEBUGFUNC("wlanUpdateNetworkAddress");
3787 if(kalRetrieveNetworkAddress(prAdapter->prGlueInfo, &rMacAddr) == FALSE
3788 || IS_BMCAST_MAC_ADDR(rMacAddr)
3789 || EQUAL_MAC_ADDR(aucZeroMacAddr, rMacAddr)) {
3790 // eFUSE has a valid address, don't do anything
3791 if(prAdapter->fgIsEmbbededMacAddrValid == TRUE) {
3792 #if CFG_SHOW_MACADDR_SOURCE
3793 DBGLOG(INIT, INFO, ("Using embedded MAC address"));
3795 return WLAN_STATUS_SUCCESS;
3798 #if CFG_SHOW_MACADDR_SOURCE
3799 DBGLOG(INIT, INFO, ("Using dynamically generated MAC address"));
3802 u4SysTime = (UINT_32) kalGetTimeTick();
3808 kalMemCopy(&rMacAddr[3], &u4SysTime, 3);
3812 #if CFG_SHOW_MACADDR_SOURCE
3813 DBGLOG(INIT, INFO, ("Using host-supplied MAC address"));
3817 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter,
3818 CMD_HDR_SIZE + sizeof(CMD_BASIC_CONFIG));
3821 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
3822 return WLAN_STATUS_FAILURE;
3825 // increase command sequence number
3826 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
3828 // compose CMD_BUILD_CONNECTION cmd pkt
3829 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
3830 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_BASIC_CONFIG);
3831 prCmdInfo->pfCmdDoneHandler = NULL;
3832 prCmdInfo->pfCmdTimeoutHandler = NULL;
3833 prCmdInfo->fgIsOid = FALSE;
3834 prCmdInfo->ucCID = CMD_ID_BASIC_CONFIG;
3835 prCmdInfo->fgSetQuery = TRUE;
3836 prCmdInfo->fgNeedResp = FALSE;
3837 prCmdInfo->fgDriverDomainMCR = FALSE;
3838 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
3839 prCmdInfo->u4SetInfoLen = sizeof(CMD_BASIC_CONFIG);
3842 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
3843 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
3844 prWifiCmd->ucCID = prCmdInfo->ucCID;
3845 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
3846 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
3848 // configure CMD_BASIC_CONFIG
3849 prCmdBasicConfig = (P_CMD_BASIC_CONFIG)(prWifiCmd->aucBuffer);
3850 kalMemCopy(&(prCmdBasicConfig->rMyMacAddr), &rMacAddr, PARAM_MAC_ADDR_LEN);
3851 prCmdBasicConfig->ucNative80211 = 0;
3852 prCmdBasicConfig->rCsumOffload.u2RxChecksum = 0;
3853 prCmdBasicConfig->rCsumOffload.u2TxChecksum = 0;
3855 #if CFG_TCP_IP_CHKSUM_OFFLOAD
3856 if(prAdapter->u4CSUMFlags & CSUM_OFFLOAD_EN_TX_TCP)
3857 prCmdBasicConfig->rCsumOffload.u2TxChecksum |= BIT(2);
3859 if(prAdapter->u4CSUMFlags & CSUM_OFFLOAD_EN_TX_UDP)
3860 prCmdBasicConfig->rCsumOffload.u2TxChecksum |= BIT(1);
3862 if(prAdapter->u4CSUMFlags & CSUM_OFFLOAD_EN_TX_IP)
3863 prCmdBasicConfig->rCsumOffload.u2TxChecksum |= BIT(0);
3865 if(prAdapter->u4CSUMFlags & CSUM_OFFLOAD_EN_RX_TCP)
3866 prCmdBasicConfig->rCsumOffload.u2RxChecksum |= BIT(2);
3868 if(prAdapter->u4CSUMFlags & CSUM_OFFLOAD_EN_RX_UDP)
3869 prCmdBasicConfig->rCsumOffload.u2RxChecksum |= BIT(1);
3871 if(prAdapter->u4CSUMFlags & (CSUM_OFFLOAD_EN_RX_IPv4 | CSUM_OFFLOAD_EN_RX_IPv6))
3872 prCmdBasicConfig->rCsumOffload.u2RxChecksum |= BIT(0);
3875 if(wlanSendCommand(prAdapter, prCmdInfo) == WLAN_STATUS_RESOURCES) {
3876 prCmdInfo->pfCmdDoneHandler = nicCmdEventQueryAddress;
3877 kalEnqueueCommand(prAdapter->prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
3879 return WLAN_STATUS_PENDING;
3882 nicCmdEventQueryAddress(prAdapter, prCmdInfo, (PUINT_8)prCmdBasicConfig);
3883 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
3885 return WLAN_STATUS_SUCCESS;
3889 /*----------------------------------------------------------------------------*/
3891 * @brief This function is called to check if the device is in RF test mode
3893 * @param pfnOidHandler Pointer to the OID handler
3898 /*----------------------------------------------------------------------------*/
3901 IN P_ADAPTER_T prAdapter
3906 return prAdapter->fgTestMode;
3910 /*----------------------------------------------------------------------------*/
3912 * @brief This function is called to identify 802.1x and Bluetooth-over-Wi-Fi
3913 * security frames, and queued into command queue for strict ordering
3914 * due to 802.1x frames before add-key OIDs are not to be encrypted
3916 * @param prAdapter Pointer of Adapter Data Structure
3917 * @param prPacket Pointer of native packet
3922 /*----------------------------------------------------------------------------*/
3924 wlanProcessSecurityFrame(
3925 IN P_ADAPTER_T prAdapter,
3926 IN P_NATIVE_PACKET prPacket
3929 UINT_8 ucPriorityParam;
3930 UINT_8 aucEthDestAddr[PARAM_MAC_ADDR_LEN];
3931 BOOLEAN fgIs1x = FALSE;
3932 BOOLEAN fgIsPAL = FALSE;
3933 UINT_32 u4PacketLen;
3935 UINT_8 ucNetworkType;
3936 P_CMD_INFO_T prCmdInfo;
3941 if (kalQoSFrameClassifierAndPacketInfo(prAdapter->prGlueInfo,
3948 &ucNetworkType) == TRUE) {
3949 if(fgIs1x == FALSE) {
3953 KAL_SPIN_LOCK_DECLARATION();
3954 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE);
3955 QUEUE_REMOVE_HEAD(&prAdapter->rFreeCmdList, prCmdInfo, P_CMD_INFO_T);
3956 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_CMD_RESOURCE);
3958 DBGLOG(RSN, INFO, ("T1X len=%d\n", u4PacketLen));
3961 P_STA_RECORD_T prStaRec;
3962 // fill arrival time
3963 u4SysTime = (OS_SYSTIME)kalGetTimeTick();
3964 GLUE_SET_PKT_ARRIVAL_TIME(prPacket, u4SysTime);
3966 kalMemZero(prCmdInfo, sizeof(CMD_INFO_T));
3968 prCmdInfo->eCmdType = COMMAND_TYPE_SECURITY_FRAME;
3969 prCmdInfo->u2InfoBufLen = (UINT_16)u4PacketLen;
3970 prCmdInfo->pucInfoBuffer = NULL;
3971 prCmdInfo->prPacket = prPacket;
3973 prCmdInfo->ucStaRecIndex = qmGetStaRecIdx(prAdapter,
3975 (ENUM_NETWORK_TYPE_INDEX_T)ucNetworkType);
3977 prStaRec = cnmGetStaRecByAddress(prAdapter,
3978 (ENUM_NETWORK_TYPE_INDEX_T)ucNetworkType,
3981 prCmdInfo->ucStaRecIndex = prStaRec->ucIndex;
3984 prCmdInfo->ucStaRecIndex = STA_REC_INDEX_NOT_FOUND;
3987 prCmdInfo->eNetworkType = (ENUM_NETWORK_TYPE_INDEX_T)ucNetworkType;
3988 prCmdInfo->pfCmdDoneHandler = wlanSecurityFrameTxDone;
3989 prCmdInfo->pfCmdTimeoutHandler = wlanSecurityFrameTxTimeout;
3990 prCmdInfo->fgIsOid = FALSE;
3991 prCmdInfo->fgSetQuery = TRUE;
3992 prCmdInfo->fgNeedResp = FALSE;
3994 kalEnqueueCommand(prAdapter->prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
4010 /*----------------------------------------------------------------------------*/
4012 * @brief This function is called when 802.1x or Bluetooth-over-Wi-Fi
4013 * security frames has been sent to firmware
4015 * @param prAdapter Pointer of Adapter Data Structure
4016 * @param prCmdInfo Pointer of CMD_INFO_T
4017 * @param pucEventBuf meaningless, only for API compatibility
4021 /*----------------------------------------------------------------------------*/
4023 wlanSecurityFrameTxDone(
4024 IN P_ADAPTER_T prAdapter,
4025 IN P_CMD_INFO_T prCmdInfo,
4026 IN PUINT_8 pucEventBuf
4031 if (prCmdInfo->eNetworkType == NETWORK_TYPE_AIS_INDEX &&
4032 prAdapter->rWifiVar.rAisSpecificBssInfo.fgCounterMeasure) {
4033 P_STA_RECORD_T prSta = cnmGetStaRecByIndex(prAdapter, prCmdInfo->ucStaRecIndex);
4036 secFsmEventEapolTxDone(prAdapter, prSta, TX_RESULT_SUCCESS);
4040 kalSecurityFrameSendComplete(prAdapter->prGlueInfo,
4041 prCmdInfo->prPacket,
4042 WLAN_STATUS_SUCCESS);
4046 /*----------------------------------------------------------------------------*/
4048 * @brief This function is called when 802.1x or Bluetooth-over-Wi-Fi
4049 * security frames has failed sending to firmware
4051 * @param prAdapter Pointer of Adapter Data Structure
4052 * @param prCmdInfo Pointer of CMD_INFO_T
4056 /*----------------------------------------------------------------------------*/
4058 wlanSecurityFrameTxTimeout(
4059 IN P_ADAPTER_T prAdapter,
4060 IN P_CMD_INFO_T prCmdInfo
4066 kalSecurityFrameSendComplete(prAdapter->prGlueInfo,
4067 prCmdInfo->prPacket,
4068 WLAN_STATUS_FAILURE);
4072 /*----------------------------------------------------------------------------*/
4074 * @brief This function is called before AIS is starting a new scan
4076 * @param prAdapter Pointer of Adapter Data Structure
4080 /*----------------------------------------------------------------------------*/
4082 wlanClearScanningResult(
4083 IN P_ADAPTER_T prAdapter
4086 BOOLEAN fgKeepCurrOne = FALSE;
4091 // clear scanning result
4092 if(kalGetMediaStateIndicated(prAdapter->prGlueInfo) == PARAM_MEDIA_STATE_CONNECTED) {
4093 for(i = 0 ; i < prAdapter->rWlanInfo.u4ScanResultNum ; i++) {
4094 if(EQUAL_MAC_ADDR(prAdapter->rWlanInfo.rCurrBssId.arMacAddress,
4095 prAdapter->rWlanInfo.arScanResult[i].arMacAddress)) {
4096 fgKeepCurrOne = TRUE;
4100 kalMemCopy(&(prAdapter->rWlanInfo.arScanResult[0]),
4101 &(prAdapter->rWlanInfo.arScanResult[i]),
4102 OFFSET_OF(PARAM_BSSID_EX_T, aucIEs));
4105 if(prAdapter->rWlanInfo.arScanResult[i].u4IELength > 0) {
4106 if(prAdapter->rWlanInfo.apucScanResultIEs[i] != &(prAdapter->rWlanInfo.aucScanIEBuf[0])) {
4108 kalMemCopy(prAdapter->rWlanInfo.aucScanIEBuf,
4109 prAdapter->rWlanInfo.apucScanResultIEs[i],
4110 prAdapter->rWlanInfo.arScanResult[i].u4IELength);
4113 // modify IE pointer
4114 prAdapter->rWlanInfo.apucScanResultIEs[0] = &(prAdapter->rWlanInfo.aucScanIEBuf[0]);
4117 prAdapter->rWlanInfo.apucScanResultIEs[0] = NULL;
4125 if(fgKeepCurrOne == TRUE) {
4126 prAdapter->rWlanInfo.u4ScanResultNum = 1;
4127 prAdapter->rWlanInfo.u4ScanIEBufferUsage =
4128 ALIGN_4(prAdapter->rWlanInfo.arScanResult[0].u4IELength);
4131 prAdapter->rWlanInfo.u4ScanResultNum = 0;
4132 prAdapter->rWlanInfo.u4ScanIEBufferUsage = 0;
4139 /*----------------------------------------------------------------------------*/
4141 * @brief This function is called when AIS received a beacon timeout event
4143 * @param prAdapter Pointer of Adapter Data Structure
4144 * @param arBSSID MAC address of the specified BSS
4148 /*----------------------------------------------------------------------------*/
4150 wlanClearBssInScanningResult(
4151 IN P_ADAPTER_T prAdapter,
4155 UINT_32 i, j, u4IELength = 0, u4IEMoveLength;
4160 // clear scanning result
4163 if(i >= prAdapter->rWlanInfo.u4ScanResultNum) {
4167 if(EQUAL_MAC_ADDR(arBSSID, prAdapter->rWlanInfo.arScanResult[i].arMacAddress)) {
4168 // backup current IE length
4169 u4IELength = ALIGN_4(prAdapter->rWlanInfo.arScanResult[i].u4IELength);
4170 pucIEPtr = prAdapter->rWlanInfo.apucScanResultIEs[i];
4172 // removed from middle
4173 for(j = i + 1 ; j < prAdapter->rWlanInfo.u4ScanResultNum ; j++) {
4174 kalMemCopy(&(prAdapter->rWlanInfo.arScanResult[j-1]),
4175 &(prAdapter->rWlanInfo.arScanResult[j]),
4176 OFFSET_OF(PARAM_BSSID_EX_T, aucIEs));
4178 prAdapter->rWlanInfo.apucScanResultIEs[j-1] =
4179 prAdapter->rWlanInfo.apucScanResultIEs[j];
4182 prAdapter->rWlanInfo.u4ScanResultNum--;
4184 // remove IE buffer if needed := move rest of IE buffer
4185 if(u4IELength > 0) {
4186 u4IEMoveLength = prAdapter->rWlanInfo.u4ScanIEBufferUsage -
4187 (((UINT_32)pucIEPtr) + u4IELength - ((UINT_32)(&(prAdapter->rWlanInfo.aucScanIEBuf[0]))));
4189 kalMemCopy(pucIEPtr,
4190 (PUINT_8)(((UINT_32)pucIEPtr) + u4IELength),
4193 prAdapter->rWlanInfo.u4ScanIEBufferUsage -= u4IELength;
4195 // correction of pointers to IE buffer
4196 for(j = 0 ; j < prAdapter->rWlanInfo.u4ScanResultNum ; j++) {
4197 if(prAdapter->rWlanInfo.apucScanResultIEs[j] > pucIEPtr) {
4198 prAdapter->rWlanInfo.apucScanResultIEs[j] =
4199 (PUINT_8)((UINT_32)(prAdapter->rWlanInfo.apucScanResultIEs[j]) - u4IELength);
4212 #if CFG_TEST_WIFI_DIRECT_GO
4214 wlanEnableP2pFunction (
4215 IN P_ADAPTER_T prAdapter
4219 P_MSG_P2P_FUNCTION_SWITCH_T prMsgFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)NULL;
4221 prMsgFuncSwitch = (P_MSG_P2P_FUNCTION_SWITCH_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_FUNCTION_SWITCH_T));
4222 if (!prMsgFuncSwitch) {
4228 prMsgFuncSwitch->rMsgHdr.eMsgId = MID_MNY_P2P_FUN_SWITCH;
4229 prMsgFuncSwitch->fgIsFuncOn = TRUE;
4232 mboxSendMsg(prAdapter,
4234 (P_MSG_HDR_T)prMsgFuncSwitch,
4235 MSG_SEND_METHOD_BUF);
4242 IN P_ADAPTER_T prAdapter
4246 P_MSG_P2P_CONNECTION_REQUEST_T prMsgConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T)NULL;
4247 UINT_8 aucTargetDeviceID[MAC_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
4249 prMsgConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_P2P_CONNECTION_REQUEST_T));
4250 if (!prMsgConnReq) {
4255 prMsgConnReq->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_REQ;
4257 /*=====Param Modified for test=====*/
4258 COPY_MAC_ADDR(prMsgConnReq->aucDeviceID, aucTargetDeviceID);
4259 prMsgConnReq->fgIsTobeGO = TRUE;
4260 prMsgConnReq->fgIsPersistentGroup = FALSE;
4262 /*=====Param Modified for test=====*/
4264 mboxSendMsg(prAdapter,
4266 (P_MSG_HDR_T)prMsgConnReq,
4267 MSG_SEND_METHOD_BUF);
4274 /*----------------------------------------------------------------------------*/
4276 * @brief This function is called to retrieve permanent address from firmware
4278 * @param prAdapter Pointer of Adapter Data Structure
4280 * @return WLAN_STATUS_SUCCESS
4281 * WLAN_STATUS_FAILURE
4283 /*----------------------------------------------------------------------------*/
4285 wlanQueryPermanentAddress(
4286 IN P_ADAPTER_T prAdapter
4290 P_CMD_INFO_T prCmdInfo;
4291 P_WIFI_CMD_T prWifiCmd;
4292 UINT_32 u4RxPktLength;
4293 UINT_8 aucBuffer[sizeof(WIFI_EVENT_T) + sizeof(EVENT_BASIC_CONFIG)];
4294 P_HIF_RX_HEADER_T prHifRxHdr;
4295 P_WIFI_EVENT_T prEvent;
4296 P_EVENT_BASIC_CONFIG prEventBasicConfig;
4300 DEBUGFUNC("wlanQueryPermanentAddress");
4302 // 1. Allocate CMD Info Packet and its Buffer
4303 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, CMD_HDR_SIZE + sizeof(CMD_BASIC_CONFIG));
4305 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
4306 return WLAN_STATUS_FAILURE;
4309 // increase command sequence number
4310 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
4312 // compose CMD_BUILD_CONNECTION cmd pkt
4313 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
4314 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(CMD_BASIC_CONFIG);
4315 prCmdInfo->pfCmdDoneHandler = NULL;
4316 prCmdInfo->fgIsOid = FALSE;
4317 prCmdInfo->ucCID = CMD_ID_BASIC_CONFIG;
4318 prCmdInfo->fgSetQuery = FALSE;
4319 prCmdInfo->fgNeedResp = TRUE;
4320 prCmdInfo->fgDriverDomainMCR = FALSE;
4321 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
4322 prCmdInfo->u4SetInfoLen = sizeof(CMD_BASIC_CONFIG);
4325 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
4326 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
4327 prWifiCmd->ucCID = prCmdInfo->ucCID;
4328 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
4329 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
4331 wlanSendCommand(prAdapter, prCmdInfo);
4332 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
4334 if(nicRxWaitResponse(prAdapter,
4337 sizeof(WIFI_EVENT_T) + sizeof(EVENT_BASIC_CONFIG),
4338 &u4RxPktLength) != WLAN_STATUS_SUCCESS) {
4339 return WLAN_STATUS_FAILURE;
4342 // header checking ..
4343 prHifRxHdr = (P_HIF_RX_HEADER_T)aucBuffer;
4344 if(prHifRxHdr->u2PacketType != HIF_RX_PKT_TYPE_EVENT) {
4345 return WLAN_STATUS_FAILURE;
4348 prEvent = (P_WIFI_EVENT_T)aucBuffer;
4349 if(prEvent->ucEID != EVENT_ID_BASIC_CONFIG) {
4350 return WLAN_STATUS_FAILURE;
4353 prEventBasicConfig = (P_EVENT_BASIC_CONFIG)(prEvent->aucBuffer);
4355 COPY_MAC_ADDR(prAdapter->rWifiVar.aucPermanentAddress, &(prEventBasicConfig->rMyMacAddr));
4356 COPY_MAC_ADDR(prAdapter->rWifiVar.aucMacAddress, &(prEventBasicConfig->rMyMacAddr));
4358 return WLAN_STATUS_SUCCESS;
4362 /*----------------------------------------------------------------------------*/
4364 * @brief This function is called to retrieve NIC capability from firmware
4366 * @param prAdapter Pointer of Adapter Data Structure
4368 * @return WLAN_STATUS_SUCCESS
4369 * WLAN_STATUS_FAILURE
4371 /*----------------------------------------------------------------------------*/
4373 wlanQueryNicCapability(
4374 IN P_ADAPTER_T prAdapter
4378 P_CMD_INFO_T prCmdInfo;
4379 P_WIFI_CMD_T prWifiCmd;
4380 UINT_32 u4RxPktLength;
4381 UINT_8 aucBuffer[sizeof(WIFI_EVENT_T) + sizeof(EVENT_NIC_CAPABILITY)];
4382 P_HIF_RX_HEADER_T prHifRxHdr;
4383 P_WIFI_EVENT_T prEvent;
4384 P_EVENT_NIC_CAPABILITY prEventNicCapability;
4388 DEBUGFUNC("wlanQueryNicCapability");
4390 // 1. Allocate CMD Info Packet and its Buffer
4391 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, CMD_HDR_SIZE + sizeof(EVENT_NIC_CAPABILITY));
4393 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
4394 return WLAN_STATUS_FAILURE;
4397 // increase command sequence number
4398 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
4400 // compose CMD_BUILD_CONNECTION cmd pkt
4401 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
4402 prCmdInfo->u2InfoBufLen = CMD_HDR_SIZE + sizeof(EVENT_NIC_CAPABILITY);
4403 prCmdInfo->pfCmdDoneHandler = NULL;
4404 prCmdInfo->fgIsOid = FALSE;
4405 prCmdInfo->ucCID = CMD_ID_GET_NIC_CAPABILITY;
4406 prCmdInfo->fgSetQuery = FALSE;
4407 prCmdInfo->fgNeedResp = TRUE;
4408 prCmdInfo->fgDriverDomainMCR = FALSE;
4409 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
4410 prCmdInfo->u4SetInfoLen = 0;
4413 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
4414 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
4415 prWifiCmd->ucCID = prCmdInfo->ucCID;
4416 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
4417 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
4419 wlanSendCommand(prAdapter, prCmdInfo);
4420 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
4422 if(nicRxWaitResponse(prAdapter,
4425 sizeof(WIFI_EVENT_T) + sizeof(EVENT_NIC_CAPABILITY),
4426 &u4RxPktLength) != WLAN_STATUS_SUCCESS) {
4427 return WLAN_STATUS_FAILURE;
4430 // header checking ..
4431 prHifRxHdr = (P_HIF_RX_HEADER_T)aucBuffer;
4432 if(prHifRxHdr->u2PacketType != HIF_RX_PKT_TYPE_EVENT) {
4433 return WLAN_STATUS_FAILURE;
4436 prEvent = (P_WIFI_EVENT_T)aucBuffer;
4437 if(prEvent->ucEID != EVENT_ID_NIC_CAPABILITY) {
4438 return WLAN_STATUS_FAILURE;
4441 prEventNicCapability = (P_EVENT_NIC_CAPABILITY)(prEvent->aucBuffer);
4443 prAdapter->rVerInfo.u2FwProductID = prEventNicCapability->u2ProductID;
4444 prAdapter->rVerInfo.u2FwOwnVersion = prEventNicCapability->u2FwVersion;
4445 prAdapter->rVerInfo.u2FwPeerVersion = prEventNicCapability->u2DriverVersion;
4446 prAdapter->fgIsHw5GBandDisabled = (BOOLEAN)prEventNicCapability->ucHw5GBandDisabled;
4447 prAdapter->fgIsEepromUsed = (BOOLEAN)prEventNicCapability->ucEepromUsed;
4448 prAdapter->fgIsEfuseValid = (BOOLEAN)prEventNicCapability->ucEfuseValid;
4449 prAdapter->fgIsEmbbededMacAddrValid = (BOOLEAN)prEventNicCapability->ucMacAddrValid;
4452 #if CFG_ENABLE_CAL_LOG
4453 DBGLOG(INIT, INFO, (" RF CAL FAIL = (%d),BB CAL FAIL = (%d)\n",
4454 prEventNicCapability->ucRfCalFail ,prEventNicCapability->ucBbCalFail ));
4456 return WLAN_STATUS_SUCCESS;
4460 static INT_32 wlanChangeCodeWord(INT_32 au4Input){
4463 #if TXPWR_USE_PDSLOPE
4464 CODE_MAPPING_T arCodeTable[] = {
4485 CODE_MAPPING_T arCodeTable[] = {
4507 for (i = 0; i < sizeof(arCodeTable) / sizeof(CODE_MAPPING_T); i++) {
4509 if (arCodeTable[i].u4RegisterValue == au4Input){
4510 return arCodeTable[i] .u4TxpowerOffset;
4518 #if TXPWR_USE_PDSLOPE
4520 /*----------------------------------------------------------------------------*/
4524 * @param prAdapter Pointer of Adapter Data Structure
4526 * @return WLAN_STATUS_SUCCESS
4527 * WLAN_STATUS_FAILURE
4529 /*----------------------------------------------------------------------------*/
4532 IN P_ADAPTER_T prAdapter,
4533 P_PARAM_MCR_RW_STRUC_T prMcrRdInfo
4537 P_CMD_INFO_T prCmdInfo;
4538 P_WIFI_CMD_T prWifiCmd;
4539 UINT_32 u4RxPktLength;
4540 UINT_8 aucBuffer[sizeof(WIFI_EVENT_T) + sizeof(CMD_ACCESS_REG)];
4541 P_HIF_RX_HEADER_T prHifRxHdr;
4542 P_WIFI_EVENT_T prEvent;
4543 P_CMD_ACCESS_REG prCmdMcrQuery;
4547 // 1. Allocate CMD Info Packet and its Buffer
4548 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, CMD_HDR_SIZE + sizeof(CMD_ACCESS_REG));
4551 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
4552 return WLAN_STATUS_FAILURE;
4554 // increase command sequence number
4555 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
4557 // compose CMD_BUILD_CONNECTION cmd pkt
4558 prCmdInfo->eCmdType = COMMAND_TYPE_GENERAL_IOCTL;
4559 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + sizeof(CMD_ACCESS_REG));
4560 prCmdInfo->pfCmdDoneHandler = NULL;
4561 prCmdInfo->pfCmdTimeoutHandler = nicOidCmdTimeoutCommon;
4562 prCmdInfo->fgIsOid = FALSE;
4563 prCmdInfo->ucCID = CMD_ID_ACCESS_REG;
4564 prCmdInfo->fgSetQuery = FALSE;
4565 prCmdInfo->fgNeedResp = TRUE;
4566 prCmdInfo->fgDriverDomainMCR = FALSE;
4567 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
4568 prCmdInfo->u4SetInfoLen = sizeof(CMD_ACCESS_REG);
4571 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
4572 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
4573 prWifiCmd->ucCID = prCmdInfo->ucCID;
4574 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
4575 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
4576 kalMemCopy(prWifiCmd->aucBuffer, prMcrRdInfo, sizeof(CMD_ACCESS_REG));
4578 wlanSendCommand(prAdapter, prCmdInfo);
4579 cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
4581 if(nicRxWaitResponse(prAdapter,
4584 sizeof(WIFI_EVENT_T) + sizeof(CMD_ACCESS_REG),
4585 &u4RxPktLength) != WLAN_STATUS_SUCCESS) {
4586 return WLAN_STATUS_FAILURE;
4589 // header checking ..
4590 prHifRxHdr = (P_HIF_RX_HEADER_T)aucBuffer;
4591 if(prHifRxHdr->u2PacketType != HIF_RX_PKT_TYPE_EVENT) {
4592 return WLAN_STATUS_FAILURE;
4596 prEvent = (P_WIFI_EVENT_T)aucBuffer;
4598 if(prEvent->ucEID != EVENT_ID_ACCESS_REG) {
4599 return WLAN_STATUS_FAILURE;
4602 prCmdMcrQuery = (P_CMD_ACCESS_REG)(prEvent->aucBuffer);
4603 prMcrRdInfo->u4McrOffset = prCmdMcrQuery->u4Address;
4604 prMcrRdInfo->u4McrData = prCmdMcrQuery->u4Data;
4606 return WLAN_STATUS_SUCCESS;
4609 static INT_32 wlanIntRound(INT_32 au4Input)
4614 if((au4Input%10) == 5){
4615 au4Input = au4Input + 5;
4621 if((au4Input%10) == -5){
4622 au4Input = au4Input - 5;
4630 static INT_32 wlanCal6628EfuseForm(IN P_ADAPTER_T prAdapter,INT_32 au4Input){
4632 PARAM_MCR_RW_STRUC_T rMcrRdInfo;
4633 INT_32 au4PdSlope,au4TxPwrOffset,au4TxPwrOffset_Round;
4634 INT_8 auTxPwrOffset_Round;
4636 rMcrRdInfo.u4McrOffset = 0x60205c68;
4637 rMcrRdInfo.u4McrData = 0;
4638 au4TxPwrOffset = au4Input;
4639 wlanQueryPdMcr(prAdapter,&rMcrRdInfo);
4641 au4PdSlope = (rMcrRdInfo.u4McrData) & BITS(0,6);
4642 au4TxPwrOffset_Round = wlanIntRound((au4TxPwrOffset*au4PdSlope))/10;
4644 au4TxPwrOffset_Round = -au4TxPwrOffset_Round;
4646 if(au4TxPwrOffset_Round < -128) {
4647 au4TxPwrOffset_Round = 128;
4649 else if (au4TxPwrOffset_Round < 0){
4650 au4TxPwrOffset_Round += 256;
4652 else if (au4TxPwrOffset_Round > 127){
4653 au4TxPwrOffset_Round = 127;
4656 auTxPwrOffset_Round = (UINT8) au4TxPwrOffset_Round ;
4658 return au4TxPwrOffset_Round;
4664 static VOID wlanChangeNvram6620to6628(PUINT_8 pucEFUSE){
4667 #define EFUSE_CH_OFFSET1_L_MASK_6620 BITS(0,8)
4668 #define EFUSE_CH_OFFSET1_L_SHIFT_6620 0
4669 #define EFUSE_CH_OFFSET1_M_MASK_6620 BITS(9,17)
4670 #define EFUSE_CH_OFFSET1_M_SHIFT_6620 9
4671 #define EFUSE_CH_OFFSET1_H_MASK_6620 BITS(18,26)
4672 #define EFUSE_CH_OFFSET1_H_SHIFT_6620 18
4673 #define EFUSE_CH_OFFSET1_VLD_MASK_6620 BIT(27)
4674 #define EFUSE_CH_OFFSET1_VLD_SHIFT_6620 27
4676 #define EFUSE_CH_OFFSET1_L_MASK_5931 BITS(0,7)
4677 #define EFUSE_CH_OFFSET1_L_SHIFT_5931 0
4678 #define EFUSE_CH_OFFSET1_M_MASK_5931 BITS(8,15)
4679 #define EFUSE_CH_OFFSET1_M_SHIFT_5931 8
4680 #define EFUSE_CH_OFFSET1_H_MASK_5931 BITS(16,23)
4681 #define EFUSE_CH_OFFSET1_H_SHIFT_5931 16
4682 #define EFUSE_CH_OFFSET1_VLD_MASK_5931 BIT(24)
4683 #define EFUSE_CH_OFFSET1_VLD_SHIFT_5931 24
4684 #define EFUSE_ALL_CH_OFFSET1_MASK_5931 BITS(25,27)
4685 #define EFUSE_ALL_CH_OFFSET1_SHIFT_5931 25
4691 INT_16 au2ChOffsetL,au2ChOffsetM,au2ChOffsetH;
4694 au4ChOffset = *(UINT_32*)(pucEFUSE + 72);
4696 if((au4ChOffset & EFUSE_CH_OFFSET1_VLD_MASK_6620) && ((*(UINT_32*)(pucEFUSE + 28)) == 0)) {
4699 au2ChOffsetL = ((au4ChOffset & EFUSE_CH_OFFSET1_L_MASK_6620) >>
4700 EFUSE_CH_OFFSET1_L_SHIFT_6620);
4702 au2ChOffsetM = ((au4ChOffset & EFUSE_CH_OFFSET1_M_MASK_6620) >>
4703 EFUSE_CH_OFFSET1_M_SHIFT_6620);
4705 au2ChOffsetH = ((au4ChOffset & EFUSE_CH_OFFSET1_H_MASK_6620) >>
4706 EFUSE_CH_OFFSET1_H_SHIFT_6620);
4708 au2ChOffsetL = wlanChangeCodeWord(au2ChOffsetL);
4709 au2ChOffsetM = wlanChangeCodeWord(au2ChOffsetM);
4710 au2ChOffsetH = wlanChangeCodeWord(au2ChOffsetH);
4713 au4ChOffset |= *(UINT_32*)(pucEFUSE + 72)
4714 >> (EFUSE_CH_OFFSET1_VLD_SHIFT_6620 - EFUSE_CH_OFFSET1_VLD_SHIFT_5931 )& EFUSE_CH_OFFSET1_VLD_MASK_5931 ;
4718 au4ChOffset |= ((((UINT_32)au2ChOffsetL) << EFUSE_CH_OFFSET1_L_SHIFT_5931) & EFUSE_CH_OFFSET1_L_MASK_5931);
4719 au4ChOffset |= ((((UINT_32)au2ChOffsetM) << EFUSE_CH_OFFSET1_M_SHIFT_5931) & EFUSE_CH_OFFSET1_M_MASK_5931);
4720 au4ChOffset |= ((((UINT_32)au2ChOffsetH) << EFUSE_CH_OFFSET1_H_SHIFT_5931) & EFUSE_CH_OFFSET1_H_MASK_5931);
4722 *((INT_32 *)((pucEFUSE + 28))) = au4ChOffset ;
4731 /*----------------------------------------------------------------------------*/
4733 * @brief This function is called to load manufacture data from NVRAM
4734 * if available and valid
4736 * @param prAdapter Pointer of Adapter Data Structure
4737 * @param prRegInfo Pointer of REG_INFO_T
4739 * @return WLAN_STATUS_SUCCESS
4740 * WLAN_STATUS_FAILURE
4742 /*----------------------------------------------------------------------------*/
4744 wlanLoadManufactureData (
4745 IN P_ADAPTER_T prAdapter,
4746 IN P_REG_INFO_T prRegInfo
4749 #if CFG_SUPPORT_RDD_TEST_MODE
4750 CMD_RDD_CH_T rRddParam;
4755 /* 1. Version Check */
4756 kalGetConfigurationVersion(prAdapter->prGlueInfo,
4757 &(prAdapter->rVerInfo.u2Part1CfgOwnVersion),
4758 &(prAdapter->rVerInfo.u2Part1CfgPeerVersion),
4759 &(prAdapter->rVerInfo.u2Part2CfgOwnVersion),
4760 &(prAdapter->rVerInfo.u2Part2CfgPeerVersion));
4762 #if (CFG_SW_NVRAM_VERSION_CHECK == 1)
4763 if(CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part1CfgPeerVersion
4764 || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part2CfgPeerVersion
4765 || prAdapter->rVerInfo.u2Part1CfgOwnVersion < CFG_DRV_PEER_VERSION
4766 || prAdapter->rVerInfo.u2Part2CfgOwnVersion < CFG_DRV_PEER_VERSION) {
4767 return WLAN_STATUS_FAILURE;
4771 // MT6620 E1/E2 would be ignored directly
4772 if(prAdapter->rVerInfo.u2Part1CfgOwnVersion == 0x0001) {
4773 prRegInfo->ucTxPwrValid = 1;
4776 /* 2. Load TX power gain parameters if valid */
4777 if(prRegInfo->ucTxPwrValid != 0) {
4779 nicUpdateTxPower(prAdapter, (P_CMD_TX_PWR_T)(&(prRegInfo->rTxPwr)));
4783 /* 3. Check if needs to support 5GHz */
4784 if(prRegInfo->ucEnable5GBand) {
4785 // check if it is disabled by hardware
4786 if(prAdapter->fgIsHw5GBandDisabled
4787 || prRegInfo->ucSupport5GBand == 0) {
4788 prAdapter->fgEnable5GBand = FALSE;
4791 prAdapter->fgEnable5GBand = TRUE;
4795 prAdapter->fgEnable5GBand = FALSE;
4798 /* 4. Send EFUSE data */
4800 wlanChangeNvram6620to6628(prRegInfo->aucEFUSE);
4803 wlanSendSetQueryCmd(prAdapter,
4804 CMD_ID_SET_PHY_PARAM,
4810 sizeof(CMD_PHY_PARAM_T),
4811 (PUINT_8)(prRegInfo->aucEFUSE),
4815 #if CFG_SUPPORT_RDD_TEST_MODE
4816 rRddParam.ucRddTestMode = (UINT_8) prRegInfo->u4RddTestMode;
4817 rRddParam.ucRddShutCh = (UINT_8) prRegInfo->u4RddShutFreq;
4818 rRddParam.ucRddStartCh = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4RddStartFreq);
4819 rRddParam.ucRddStopCh = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4RddStopFreq);
4820 rRddParam.ucRddDfs = (UINT_8) prRegInfo->u4RddDfs;
4821 prAdapter->ucRddStatus = 0;
4822 nicUpdateRddTestMode(prAdapter, (P_CMD_RDD_CH_T)(&rRddParam));
4825 /* 5. Get 16-bits Country Code and Bandwidth */
4826 prAdapter->rWifiVar.rConnSettings.u2CountryCode =
4827 (((UINT_16) prRegInfo->au2CountryCode[0]) << 8) |
4828 (((UINT_16) prRegInfo->au2CountryCode[1]) & BITS(0,7));
4830 #if 0 /* Bandwidth control will be controlled by GUI. 20110930
4831 * So ignore the setting from registry/NVRAM
4833 prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode =
4834 prRegInfo->uc2G4BwFixed20M ? CONFIG_BW_20M : CONFIG_BW_20_40M;
4835 prAdapter->rWifiVar.rConnSettings.uc5GBandwidthMode =
4836 prRegInfo->uc5GBwFixed20M ? CONFIG_BW_20M : CONFIG_BW_20_40M;
4839 /* 6. Set domain and channel information to chip */
4840 rlmDomainSendCmd(prAdapter, FALSE);
4842 /* 7. set band edge tx power if available */
4843 if(prRegInfo->fg2G4BandEdgePwrUsed) {
4844 CMD_EDGE_TXPWR_LIMIT_T rCmdEdgeTxPwrLimit;
4846 rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrCCK
4847 = prRegInfo->cBandEdgeMaxPwrCCK;
4848 rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM20
4849 = prRegInfo->cBandEdgeMaxPwrOFDM20;
4850 rCmdEdgeTxPwrLimit.cBandEdgeMaxPwrOFDM40
4851 = prRegInfo->cBandEdgeMaxPwrOFDM40;
4853 wlanSendSetQueryCmd(prAdapter,
4854 CMD_ID_SET_EDGE_TXPWR_LIMIT,
4860 sizeof(CMD_EDGE_TXPWR_LIMIT_T),
4861 (PUINT_8)&rCmdEdgeTxPwrLimit,
4866 return WLAN_STATUS_SUCCESS;
4870 /*----------------------------------------------------------------------------*/
4872 * @brief This function is called to check
4873 * Media Stream Mode is set to non-default value or not,
4874 * and clear to default value if above criteria is met
4876 * @param prAdapter Pointer of Adapter Data Structure
4879 * The media stream mode was non-default value and has been reset
4881 * The media stream mode is default value
4883 /*----------------------------------------------------------------------------*/
4885 wlanResetMediaStreamMode(
4886 IN P_ADAPTER_T prAdapter
4891 if(prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode != 0) {
4892 prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode = 0;
4902 /*----------------------------------------------------------------------------*/
4904 * @brief This function is called to check if any pending timer has expired
4906 * @param prAdapter Pointer of Adapter Data Structure
4908 * @return WLAN_STATUS_SUCCESS
4910 /*----------------------------------------------------------------------------*/
4912 wlanTimerTimeoutCheck(
4913 IN P_ADAPTER_T prAdapter
4918 cnmTimerDoTimeOutCheck(prAdapter);
4920 return WLAN_STATUS_SUCCESS;
4924 /*----------------------------------------------------------------------------*/
4926 * @brief This function is called to check if any pending mailbox message
4929 * @param prAdapter Pointer of Adapter Data Structure
4931 * @return WLAN_STATUS_SUCCESS
4933 /*----------------------------------------------------------------------------*/
4935 wlanProcessMboxMessage(
4936 IN P_ADAPTER_T prAdapter
4943 for(i = 0 ; i < MBOX_ID_TOTAL_NUM ; i++) {
4944 mboxRcvAllMsg(prAdapter , (ENUM_MBOX_ID_T)i);
4947 return WLAN_STATUS_SUCCESS;
4951 /*----------------------------------------------------------------------------*/
4953 * @brief This function is called to enqueue a single TX packet into CORE
4955 * @param prAdapter Pointer of Adapter Data Structure
4956 * prNativePacket Pointer of Native Packet
4958 * @return WLAN_STATUS_SUCCESS
4959 * WLAN_STATUS_RESOURCES
4960 * WLAN_STATUS_INVALID_PACKET
4962 /*----------------------------------------------------------------------------*/
4964 wlanEnqueueTxPacket (
4965 IN P_ADAPTER_T prAdapter,
4966 IN P_NATIVE_PACKET prNativePacket
4969 P_TX_CTRL_T prTxCtrl;
4970 P_MSDU_INFO_T prMsduInfo;
4972 KAL_SPIN_LOCK_DECLARATION();
4976 prTxCtrl = &prAdapter->rTxCtrl;
4978 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
4979 QUEUE_REMOVE_HEAD(&prTxCtrl->rFreeMsduInfoList, prMsduInfo, P_MSDU_INFO_T);
4980 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
4982 if(prMsduInfo == NULL) {
4983 return WLAN_STATUS_RESOURCES;
4986 prMsduInfo->eSrc = TX_PACKET_OS;
4988 if(nicTxFillMsduInfo(prAdapter,
4990 prNativePacket) == FALSE) { // packet is not extractable
4991 kalSendComplete(prAdapter->prGlueInfo,
4993 WLAN_STATUS_INVALID_PACKET);
4995 nicTxReturnMsduInfo(prAdapter, prMsduInfo);
4997 return WLAN_STATUS_INVALID_PACKET;
5001 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
5003 return WLAN_STATUS_SUCCESS;
5009 /*----------------------------------------------------------------------------*/
5011 * @brief This function is called to flush pending TX packets in CORE
5013 * @param prAdapter Pointer of Adapter Data Structure
5015 * @return WLAN_STATUS_SUCCESS
5017 /*----------------------------------------------------------------------------*/
5019 wlanFlushTxPendingPackets(
5020 IN P_ADAPTER_T prAdapter
5025 return nicTxFlush(prAdapter);
5029 /*----------------------------------------------------------------------------*/
5031 * \brief this function sends pending MSDU_INFO_T to MT6620
5033 * @param prAdapter Pointer to the Adapter structure.
5034 * @param pfgHwAccess Pointer for tracking LP-OWN status
5036 * @retval WLAN_STATUS_SUCCESS Reset is done successfully.
5038 /*----------------------------------------------------------------------------*/
5040 wlanTxPendingPackets (
5041 IN P_ADAPTER_T prAdapter,
5042 IN OUT PBOOLEAN pfgHwAccess
5045 P_TX_CTRL_T prTxCtrl;
5046 P_MSDU_INFO_T prMsduInfo;
5048 KAL_SPIN_LOCK_DECLARATION();
5051 prTxCtrl = &prAdapter->rTxCtrl;
5053 ASSERT(pfgHwAccess);
5055 // <1> dequeue packet by txDequeuTxPackets()
5056 KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_QM_TX_QUEUE);
5057 prMsduInfo = qmDequeueTxPackets(prAdapter, &prTxCtrl->rTc);
5058 KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_QM_TX_QUEUE);
5060 if(prMsduInfo != NULL) {
5061 if(kalIsCardRemoved(prAdapter->prGlueInfo) == FALSE) {
5062 /* <2> Acquire LP-OWN if necessary */
5063 if(*pfgHwAccess == FALSE) {
5064 *pfgHwAccess = TRUE;
5066 wlanAcquirePowerControl(prAdapter);
5069 #if (MT6620_E1_ASIC_HIFSYS_WORKAROUND == 1)
5070 if(prAdapter->fgIsClockGatingEnabled == TRUE) {
5071 nicDisableClockGating(prAdapter);
5075 nicTxMsduInfoList(prAdapter, prMsduInfo);
5077 // <4> update TC by txAdjustTcQuotas()
5078 nicTxAdjustTcq(prAdapter);
5081 wlanProcessQueuedMsduInfo(prAdapter, prMsduInfo);
5085 #if (MT6620_E1_ASIC_HIFSYS_WORKAROUND == 1)
5086 if(prAdapter->fgIsClockGatingEnabled == FALSE) {
5087 nicEnableClockGating(prAdapter);
5091 return WLAN_STATUS_SUCCESS;
5095 /*----------------------------------------------------------------------------*/
5097 * @brief This function is called to acquire power control from firmware
5099 * @param prAdapter Pointer of Adapter Data Structure
5101 * @return WLAN_STATUS_SUCCESS
5103 /*----------------------------------------------------------------------------*/
5105 wlanAcquirePowerControl(
5106 IN P_ADAPTER_T prAdapter
5111 ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
5113 /* Reset sleepy state */
5114 if(prAdapter->fgWiFiInSleepyState == TRUE) {
5115 prAdapter->fgWiFiInSleepyState = FALSE;
5118 return WLAN_STATUS_SUCCESS;
5122 /*----------------------------------------------------------------------------*/
5124 * @brief This function is called to release power control to firmware
5126 * @param prAdapter Pointer of Adapter Data Structure
5128 * @return WLAN_STATUS_SUCCESS
5130 /*----------------------------------------------------------------------------*/
5132 wlanReleasePowerControl(
5133 IN P_ADAPTER_T prAdapter
5138 RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);
5140 return WLAN_STATUS_SUCCESS;
5144 /*----------------------------------------------------------------------------*/
5146 * @brief This function is called to report currently pending TX frames count
5147 * (command packets are not included)
5149 * @param prAdapter Pointer of Adapter Data Structure
5151 * @return number of pending TX frames
5153 /*----------------------------------------------------------------------------*/
5155 wlanGetTxPendingFrameCount (
5156 IN P_ADAPTER_T prAdapter
5159 P_TX_CTRL_T prTxCtrl;
5163 prTxCtrl = &prAdapter->rTxCtrl;
5165 u4Num = kalGetTxPendingFrameCount(prAdapter->prGlueInfo) + (UINT_32)(prTxCtrl->i4PendingFwdFrameCount);
5171 /*----------------------------------------------------------------------------*/
5173 * @brief This function is to report current ACPI state
5175 * @param prAdapter Pointer of Adapter Data Structure
5177 * @return ACPI_STATE_D0 Normal Operation Mode
5178 * ACPI_STATE_D3 Suspend Mode
5180 /*----------------------------------------------------------------------------*/
5183 IN P_ADAPTER_T prAdapter
5188 return prAdapter->rAcpiState;
5192 /*----------------------------------------------------------------------------*/
5194 * @brief This function is to update current ACPI state only
5196 * @param prAdapter Pointer of Adapter Data Structure
5197 * @param ePowerState ACPI_STATE_D0 Normal Operation Mode
5198 * ACPI_STATE_D3 Suspend Mode
5202 /*----------------------------------------------------------------------------*/
5205 IN P_ADAPTER_T prAdapter,
5206 IN ENUM_ACPI_STATE_T ePowerState
5210 ASSERT(ePowerState <= ACPI_STATE_D3);
5212 prAdapter->rAcpiState = ePowerState;
5218 /*----------------------------------------------------------------------------*/
5220 * @brief This function is to query ECO version from HIFSYS CR
5222 * @param prAdapter Pointer of Adapter Data Structure
5224 * @return zero Unable to retrieve ECO version information
5225 * non-zero ECO version (1-based)
5227 /*----------------------------------------------------------------------------*/
5230 IN P_ADAPTER_T prAdapter
5235 if(nicVerifyChipID(prAdapter) == TRUE) {
5236 return (prAdapter->ucRevID + 1);
5244 /*----------------------------------------------------------------------------*/
5246 * @brief This function is to setting the default Tx Power configuration
5248 * @param prAdapter Pointer of Adapter Data Structure
5250 * @return zero Unable to retrieve ECO version information
5251 * non-zero ECO version (1-based)
5253 /*----------------------------------------------------------------------------*/
5256 IN P_ADAPTER_T prAdapter
5260 P_GLUE_INFO_T prGlueInfo = prAdapter->prGlueInfo;
5261 P_SET_TXPWR_CTRL_T prTxpwr;
5265 prTxpwr = &prGlueInfo->rTxPwr;
5267 prTxpwr->c2GLegacyStaPwrOffset = 0;
5268 prTxpwr->c2GHotspotPwrOffset = 0;
5269 prTxpwr->c2GP2pPwrOffset = 0;
5270 prTxpwr->c2GBowPwrOffset = 0;
5271 prTxpwr->c5GLegacyStaPwrOffset = 0;
5272 prTxpwr->c5GHotspotPwrOffset = 0;
5273 prTxpwr->c5GP2pPwrOffset = 0;
5274 prTxpwr->c5GBowPwrOffset = 0;
5275 prTxpwr->ucConcurrencePolicy = 0;
5277 prTxpwr->acReserved1[i] = 0;
5280 prTxpwr->acTxPwrLimit2G[i] = 63;
5283 prTxpwr->acTxPwrLimit5G[i] = 63;
5286 prTxpwr->acReserved2[i] = 0;
5291 /*----------------------------------------------------------------------------*/
5293 * @brief This function is to
5294 * set preferred band configuration corresponding to network type
5296 * @param prAdapter Pointer of Adapter Data Structure
5297 * @param eBand Given band
5298 * @param eNetTypeIndex Given Network Type
5302 /*----------------------------------------------------------------------------*/
5304 wlanSetPreferBandByNetwork (
5305 IN P_ADAPTER_T prAdapter,
5306 IN ENUM_BAND_T eBand,
5307 IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex
5311 ASSERT(eBand <= BAND_NUM);
5312 ASSERT(eNetTypeIndex <= NETWORK_TYPE_INDEX_NUM);
5314 /* 1. set prefer band according to network type */
5315 prAdapter->aePreferBand[eNetTypeIndex] = eBand;
5317 /* 2. remove buffered BSS descriptors correspondingly */
5318 if(eBand == BAND_2G4) {
5319 scanRemoveBssDescByBandAndNetwork(prAdapter, BAND_5G, eNetTypeIndex);
5321 else if(eBand == BAND_5G) {
5322 scanRemoveBssDescByBandAndNetwork(prAdapter, BAND_2G4, eNetTypeIndex);
5329 /*----------------------------------------------------------------------------*/
5331 * @brief This function is to
5332 * get channel information corresponding to specified network type
5334 * @param prAdapter Pointer of Adapter Data Structure
5335 * @param eNetTypeIndex Given Network Type
5337 * @return channel number
5339 /*----------------------------------------------------------------------------*/
5341 wlanGetChannelNumberByNetwork (
5342 IN P_ADAPTER_T prAdapter,
5343 IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex
5346 P_BSS_INFO_T prBssInfo;
5349 ASSERT(eNetTypeIndex <= NETWORK_TYPE_INDEX_NUM);
5351 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[eNetTypeIndex]);
5353 return prBssInfo->ucPrimaryChannel;
5357 /*----------------------------------------------------------------------------*/
5359 * @brief This function is to
5360 * get BSS descriptor information corresponding to specified network type
5362 * @param prAdapter Pointer of Adapter Data Structure
5363 * @param eNetTypeIndex Given Network Type
5365 * @return pointer to BSS_DESC_T
5367 /*----------------------------------------------------------------------------*/
5369 wlanGetTargetBssDescByNetwork (
5370 IN P_ADAPTER_T prAdapter,
5371 IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex
5375 ASSERT(eNetTypeIndex <= NETWORK_TYPE_INDEX_NUM);
5377 switch(eNetTypeIndex) {
5378 case NETWORK_TYPE_AIS_INDEX:
5379 return prAdapter->rWifiVar.rAisFsmInfo.prTargetBssDesc;
5381 case NETWORK_TYPE_P2P_INDEX:
5384 case NETWORK_TYPE_BOW_INDEX:
5385 return prAdapter->rWifiVar.rBowFsmInfo.prTargetBssDesc;
5393 /*----------------------------------------------------------------------------*/
5395 * @brief This function is to
5396 * check unconfigured system properties and generate related message on
5397 * scan list to notify users
5399 * @param prAdapter Pointer of Adapter Data Structure
5401 * @return WLAN_STATUS_SUCCESS
5403 /*----------------------------------------------------------------------------*/
5405 wlanCheckSystemConfiguration (
5406 IN P_ADAPTER_T prAdapter
5409 #if (CFG_NVRAM_EXISTENCE_CHECK == 1) || (CFG_SW_NVRAM_VERSION_CHECK == 1)
5410 const UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
5411 const UINT_8 aucBCAddr[] = BC_MAC_ADDR;
5412 BOOLEAN fgIsConfExist = TRUE;
5413 BOOLEAN fgGenErrMsg = FALSE;
5414 P_REG_INFO_T prRegInfo = NULL;
5415 P_WLAN_BEACON_FRAME_T prBeacon = NULL;
5416 P_IE_SSID_T prSsid = NULL;
5417 UINT_32 u4ErrCode = 0;
5418 UINT_8 aucErrMsg[32];
5420 PARAM_802_11_CONFIG_T rConfiguration;
5421 PARAM_RATES_EX rSupportedRates;
5424 DEBUGFUNC("wlanCheckSystemConfiguration");
5428 #if (CFG_NVRAM_EXISTENCE_CHECK == 1)
5429 if(kalIsConfigurationExist(prAdapter->prGlueInfo) == FALSE) {
5430 fgIsConfExist = FALSE;
5435 #if (CFG_SW_NVRAM_VERSION_CHECK == 1)
5436 prRegInfo = kalGetConfiguration(prAdapter->prGlueInfo);
5438 if(fgIsConfExist == TRUE &&
5439 (CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part1CfgPeerVersion
5440 || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part2CfgPeerVersion
5441 || prAdapter->rVerInfo.u2Part1CfgOwnVersion < CFG_DRV_PEER_VERSION
5442 || prAdapter->rVerInfo.u2Part2CfgOwnVersion < CFG_DRV_PEER_VERSION /* NVRAM */
5443 || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2FwPeerVersion
5444 || prAdapter->rVerInfo.u2FwOwnVersion < CFG_DRV_PEER_VERSION
5445 || (prAdapter->fgIsEmbbededMacAddrValid == FALSE &&
5446 (IS_BMCAST_MAC_ADDR(prRegInfo->aucMacAddr)
5447 || EQUAL_MAC_ADDR(aucZeroMacAddr, prRegInfo->aucMacAddr)))
5448 || prRegInfo->ucTxPwrValid == 0)) {
5453 if(fgGenErrMsg == TRUE) {
5454 prBeacon = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(WLAN_BEACON_FRAME_T) + sizeof(IE_SSID_T));
5457 kalMemZero(prBeacon, sizeof(WLAN_BEACON_FRAME_T) + sizeof(IE_SSID_T));
5459 // prBeacon initialization
5460 prBeacon->u2FrameCtrl = MAC_FRAME_BEACON;
5461 COPY_MAC_ADDR(prBeacon->aucDestAddr, aucBCAddr);
5462 COPY_MAC_ADDR(prBeacon->aucSrcAddr, aucZeroMacAddr);
5463 COPY_MAC_ADDR(prBeacon->aucBSSID, aucZeroMacAddr);
5464 prBeacon->u2BeaconInterval = 100;
5465 prBeacon->u2CapInfo = CAP_INFO_ESS;
5467 // prSSID initialization
5468 prSsid = (P_IE_SSID_T)(&prBeacon->aucInfoElem[0]);
5469 prSsid->ucId = ELEM_ID_SSID;
5471 // rConfiguration initialization
5472 rConfiguration.u4Length = sizeof(PARAM_802_11_CONFIG_T);
5473 rConfiguration.u4BeaconPeriod = 100;
5474 rConfiguration.u4ATIMWindow = 1;
5475 rConfiguration.u4DSConfig = 2412;
5476 rConfiguration.rFHConfig.u4Length = sizeof(PARAM_802_11_CONFIG_FH_T);
5478 // rSupportedRates initialization
5479 kalMemZero(rSupportedRates, sizeof(PARAM_RATES_EX));
5482 #if (CFG_NVRAM_EXISTENCE_CHECK == 1)
5483 #define NVRAM_ERR_MSG "NVRAM WARNING: Err = 0x01"
5484 if(kalIsConfigurationExist(prAdapter->prGlueInfo) == FALSE) {
5485 COPY_SSID(prSsid->aucSSID,
5488 strlen(NVRAM_ERR_MSG));
5490 kalIndicateBssInfo(prAdapter->prGlueInfo,
5492 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem) + OFFSET_OF(IE_SSID_T, aucSSID) + prSsid->ucLength,
5496 COPY_SSID(rSsid.aucSsid, rSsid.u4SsidLen, NVRAM_ERR_MSG, strlen(NVRAM_ERR_MSG));
5497 nicAddScanResult(prAdapter,
5502 PARAM_NETWORK_TYPE_FH,
5506 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem) + OFFSET_OF(IE_SSID_T, aucSSID) + prSsid->ucLength - WLAN_MAC_MGMT_HEADER_LEN,
5507 (PUINT_8)((UINT_32)(prBeacon) + WLAN_MAC_MGMT_HEADER_LEN));
5511 #if (CFG_SW_NVRAM_VERSION_CHECK == 1)
5512 #define VER_ERR_MSG "NVRAM WARNING: Err = 0x%02X"
5513 if(fgIsConfExist == TRUE) {
5514 if((CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part1CfgPeerVersion
5515 || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2Part2CfgPeerVersion
5516 || prAdapter->rVerInfo.u2Part1CfgOwnVersion < CFG_DRV_PEER_VERSION
5517 || prAdapter->rVerInfo.u2Part2CfgOwnVersion < CFG_DRV_PEER_VERSION /* NVRAM */
5518 || CFG_DRV_OWN_VERSION < prAdapter->rVerInfo.u2FwPeerVersion
5519 || prAdapter->rVerInfo.u2FwOwnVersion < CFG_DRV_PEER_VERSION)) {
5520 u4ErrCode |= NVRAM_ERROR_VERSION_MISMATCH;
5524 if(prRegInfo->ucTxPwrValid == 0) {
5525 u4ErrCode |= NVRAM_ERROR_INVALID_TXPWR;
5528 if(prAdapter->fgIsEmbbededMacAddrValid == FALSE &&
5529 (IS_BMCAST_MAC_ADDR(prRegInfo->aucMacAddr) || EQUAL_MAC_ADDR(aucZeroMacAddr, prRegInfo->aucMacAddr))) {
5530 u4ErrCode |= NVRAM_ERROR_INVALID_MAC_ADDR;
5533 if(u4ErrCode != 0) {
5534 sprintf(aucErrMsg, VER_ERR_MSG, (unsigned int)u4ErrCode);
5535 COPY_SSID(prSsid->aucSSID,
5540 kalIndicateBssInfo(prAdapter->prGlueInfo,
5542 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem) + OFFSET_OF(IE_SSID_T, aucSSID) + prSsid->ucLength,
5546 COPY_SSID(rSsid.aucSsid, rSsid.u4SsidLen, NVRAM_ERR_MSG, strlen(NVRAM_ERR_MSG));
5547 nicAddScanResult(prAdapter,
5552 PARAM_NETWORK_TYPE_FH,
5556 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem) + OFFSET_OF(IE_SSID_T, aucSSID) + prSsid->ucLength - WLAN_MAC_MGMT_HEADER_LEN,
5557 (PUINT_8)((UINT_32)(prBeacon) + WLAN_MAC_MGMT_HEADER_LEN));
5562 if(fgGenErrMsg == TRUE) {
5563 cnmMemFree(prAdapter, prBeacon);
5566 return WLAN_STATUS_SUCCESS;