2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/ais_fsm.c#1 $
6 \brief This file defines the FSM for SAA and AAA MODULE.
8 This file defines the FSM for SAA and AAA MODULE.
17 * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
21 * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration
22 * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration corresponding to network type.
25 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
26 * Adjust code for DBG and CONFIG_XLOG.
29 * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous approach to avoid incomplete state termination
30 * 1. change RDD related compile option brace position.
31 * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without join timeout timer ticking
32 * 3. otherwise, insert AIS_REQUEST into pending request queue
35 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
36 * modify the xlog related code.
39 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
40 * correct reference to BSSID field in Association-Response frame.
43 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
44 * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
45 * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework
48 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
49 * adding the code for XLOG.
51 * 10 26 2011 tsaiyuan.hsu
52 * [WCXRP00001064] [MT6620 Wi-Fi][DRV]] add code with roaming awareness when disconnecting AIS network
53 * be aware roaming when disconnecting AIS network.
56 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
57 * STA_REC shall be NULL for Beacon's MSDU
60 * [MT6620 Wi-Fi][Driver] Reduce join failure count limit to 2 for faster re-join for other BSS
61 * 1. short join failure count limit to 2
62 * 2. treat join timeout as kind of join failure as well
65 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
66 * adding the 802.11w related function and define .
69 * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
72 * 09 20 2011 tsaiyuan.hsu
73 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
74 * change window registry of driver for roaming.
77 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
78 * Handle client mode about preamble type and slot time
80 * 09 08 2011 tsaiyuan.hsu
81 * [WCXRP00000972] [MT6620 Wi-Fi][DRV]] check if roaming occurs after join failure to avoid state incosistence.
82 * check if roaming occurs after join failure to avoid deactivation of network.
84 * 08 24 2011 chinghwa.yu
85 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
86 * Update RDD test mode cases.
88 * 08 16 2011 tsaiyuan.hsu
89 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
90 * EnableRoaming in registry is deprecated.
92 * 08 16 2011 tsaiyuan.hsu
93 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
94 * use registry to enable or disable roaming.
97 * [WCXRP00000840] [MT6620 Wi-Fi][Driver][AIS] Stop timer for joining when channel is released due to join failure count exceeding limit
98 * stop timer when joining operation is failed due to try count exceeds limitation
101 * [WCXRP00000815] [MT6620 Wi-Fi][Driver] allow single BSSID with multiple SSID settings to work around some tricky AP which use space character as hidden SSID
102 * do not handle SCAN request immediately after connected to increase the probability of receiving 1st beacon frame.
105 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
106 * change parameter name from PeerAddr to BSSID
109 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
110 * 1. specify target's BSSID when requesting channel privilege.
111 * 2. pass BSSID information to firmware domain
114 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
115 * ensure DEAUTH is always sent before establish a new connection
118 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
119 * typo fix: a right brace is missed.
122 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
123 * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
126 * [WCXRP00000757] [MT6620 Wi-Fi][Driver][SCN] take use of RLM API to filter out BSS in disallowed channels
127 * mark fgIsTransition as TRUE for state rolling.
130 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
131 * always check for pending scan after switched into NORMAL_TR state.
134 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
135 * always treat connection request at higher priority over scanning request
137 * 06 09 2011 tsaiyuan.hsu
138 * [WCXRP00000760] [MT5931 Wi-Fi][FW] Refine rxmHandleMacRxDone to reduce code size
139 * move send_auth at rxmHandleMacRxDone in firmware to driver to reduce code size.
142 * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
143 * eliminate unused parameters for SAA-FSM
146 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
147 * change SCAN handling behavior when followed by a CONNECT/DISCONNECT requests by pending instead of dropping.
150 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
151 * when TX DONE status is TX_RESULT_DROPPED_IN_DRIVER, no need to switch back to IDLE state.
153 * 04 14 2011 cm.chang
154 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
157 * 04 13 2011 george.huang
158 * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
162 * [WCXRP00000575] [MT6620 Wi-Fi][Driver][AIS] reduce memory usage when generating mailbox message for scan request
163 * when there is no IE needed for probe request, then request a smaller memory for mailbox message
165 * 03 17 2011 chinglan.wang
166 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
169 * 03 17 2011 chinglan.wang
170 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
173 * 03 16 2011 tsaiyuan.hsu
174 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
175 * remove obsolete definition and unused variables.
178 * [WCXRP00000535] [MT6620 Wi-Fi][Driver] Fixed channel operation when AIS and Tethering are operating concurrently
179 * When fixed channel operation is necessary, AIS-FSM would scan and only connect for BSS on the specific channel
181 * 03 09 2011 tsaiyuan.hsu
182 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
183 * avoid clearing fgIsScanReqIssued so as to add scan results.
185 * 03 07 2011 terry.wu
186 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
187 * Toggle non-standard debug messages to comments.
189 * 03 04 2011 tsaiyuan.hsu
190 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
191 * reset retry conter of attemp to connect to ap after completion of join.
194 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
195 * surpress compile warning occured when compiled by GNU compiler collection.
198 * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as initial RSSI right after connection is built.
199 * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
201 * 02 26 2011 tsaiyuan.hsu
202 * [WCXRP00000391] [MT6620 Wi-Fi][FW] Add Roaming Support
203 * not send disassoc or deauth to leaving AP so as to improve performace of roaming.
206 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
207 * when handling reconnect request, set fgTryScan as TRUE
210 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
211 * handle SCAN and RECONNECT with a FIFO approach.
213 * 02 09 2011 tsaiyuan.hsu
214 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
215 * Check if prRegInfo is null or not before initializing roaming parameters.
218 * [WCXRP00000416] [MT6620 Wi-Fi][Driver] treat "unable to find BSS" as connection trial to prevent infinite reconnection trials
219 * treat "unable to find BSS" as connection trial to prevent infinite reconnection trials.
221 * 01 27 2011 tsaiyuan.hsu
222 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
224 * 1. not support 11r, only use strength of signal to determine roaming.
225 * 2. not enable CFG_SUPPORT_ROAMING until completion of full test.
226 * 3. in 6620, adopt work-around to avoid sign extension problem of cck of hw
227 * 4. assume that change of link quality in smooth way.
229 * 01 26 2011 yuche.tsai
230 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
233 * 01 25 2011 yuche.tsai
234 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
235 * Fix Compile Error when DBG is disabled.
237 * 01 25 2011 yuche.tsai
238 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
239 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
242 * [WCXRP00000359] [MT6620 Wi-Fi][Driver] add an extra state to ensure DEAUTH frame is always sent
243 * Add an extra state to guarantee DEAUTH frame is sent then connect to new BSS.
244 * This change is due to WAPI AP needs DEAUTH frame as a necessary step in handshaking protocol.
247 * [WCXRP00000307] [MT6620 Wi-Fi][SQA]WHQL test .2c_wlan_adhoc case fail.
248 * [IBSS] when merged in, the bss state should be updated to firmware to pass WHQL adhoc failed item
251 * [WCXRP00000351] [MT6620 Wi-Fi][Driver] remove from scanning result in OID handling layer when the corresponding BSS is disconnected due to beacon timeout
252 * remove from scanning result when the BSS is disconnected due to beacon timeout.
255 * [WCXRP00000337] [MT6620 Wi-FI][Driver] AIS-FSM not to invoke cnmStaRecResetStatus directly 'cause it frees all belonging STA-RECs
256 * do not invoke cnmStaRecResetStatus() directly, nicUpdateBss will do the things after bss is disconnected
259 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
260 * do not need to manipulate prStaRec after indicating BSS disconnection to firmware, 'cause all STA-RECs belongs to BSS has been freed already
263 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
264 * add DEBUGFUNC() macro invoking for more detailed debugging information
266 * 12 23 2010 george.huang
267 * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
268 * 1. update WMM IE parsing, with ASSOC REQ handling
269 * 2. extend U-APSD parameter passing from driver to FW
272 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
273 * before BSS disconnection is indicated to firmware, all correlated peer should be cleared and freed
275 * 12 07 2010 cm.chang
276 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
277 * 1. BSSINFO include RLM parameter
278 * 2. free all sta records when network is disconnected
280 * 11 25 2010 yuche.tsai
282 * Update SLT Function for QoS Support and not be affected by fixed rate function.
285 * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
286 * add scanning with specified SSID facility to AIS-FSM
289 * [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
290 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
291 * 2) Remove CNM CH-RECOVER event handling
292 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
295 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
296 * 1) update NVRAM content template to ver 1.02
297 * 2) add compile option for querying NIC capability (default: off)
298 * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
299 * 4) correct auto-rate compiler error under linux (treat warning as error)
300 * 5) simplify usage of NVRAM and REG_INFO_T
301 * 6) add version checking between driver and firmware
304 * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
305 * initial the fgIsChannelExt value.
308 * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
309 * correct erroneous logic: specifying eBand with incompatible eSco
312 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
313 * remove ENUM_NETWORK_TYPE_T definitions
315 * 09 27 2010 chinghwa.yu
316 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
317 * Update BCM/BoW design and settings.
320 * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
321 * keep IBSS-ALONE state retrying until further instruction is received
324 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
325 * Do a complete reset with STA-REC null checking for RF test re-entry
327 * 09 09 2010 yuche.tsai
329 * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
330 * Both in IBSS Create & IBSS Merge
334 * frequency is in unit of KHz thus no need to divide 1000 once more.
338 * 1) initialize for correct parameter even for disassociation.
339 * 2) AIS-FSM should have a limit on trials to build connection
341 * 09 03 2010 kevin.huang
343 * Refine #include sequence and solve recursive/nested #include issue
347 * eliminate klockwork errors
349 * 08 29 2010 yuche.tsai
351 * Finish SLT TX/RX & Rate Changing Support.
355 * add option for enabling AIS 5GHz scan
359 * [AIS-FSM] IBSS no longer needs to acquire channel for beaconing, RLM/CNM will handle the channel switching when BSS information is updated
361 * 08 25 2010 george.huang
363 * update OID/ registry control path for PM related settings
365 * 08 24 2010 cm.chang
367 * Support RLM initail channel of Ad-hoc, P2P and BOW
369 * 08 20 2010 cm.chang
371 * Migrate RLM code to host from FW
375 * check-in missed files.
377 * 08 12 2010 kevin.huang
379 * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
383 * reset fgIsScanReqIssued when abort request is received right after join completion.
387 * surpress compilation warning.
391 * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
395 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
396 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
397 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
401 * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
405 * allocate on MGMT packet for IBSS beaconing.
409 * [AIS-FSM] fix: when join failed, release channel privilege as well
413 * reuse join-abort sub-procedure to reduce code size.
417 * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
418 * 2) change nicMediaStateChange() API prototype
422 * AIS-FSM: when scan request is coming in the 1st 5 seconds of channel privilege period, just pend it til 5-sec. period finishes
426 * AIS-FSM FIX: return channel privilege even when the privilege is not granted yet
427 * QM: qmGetFrameAction() won't assert when corresponding STA-REC index is not found
431 * re-commit code logic being overwriten.
435 * .support the Wi-Fi RSN
439 * 1) re-enable AIS-FSM beacon timeout handling.
440 * 2) scan done API revised
445 * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
449 * indicate scan done for linux wireless extension
453 * add AIS-FSM handling for beacon timeout event.
457 * 1) refine AIS-FSM indent.
458 * 2) when entering RF Test mode, flush 802.1X frames as well
459 * 3) when entering D3 state, flush 802.1X frames as well
463 * separate AIS-FSM states into different cases of channel request.
467 * 1) change BG_SCAN to ONLINE_SCAN for consistent term
468 * 2) only clear scanning result when scan is permitted to do
472 * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
473 * 2) refine disconnection behaviour when issued during BG-SCAN process
477 * 1) bugfix: do not stop timer for join after switched into normal_tr state, for providing chance for DHCP handshasking
478 * 2) modify rsnPerformPolicySelection() invoking
482 * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
487 * update for security supporting.
491 * [WPD00003833] [MT6620 and MT5931] Driver migration.
492 * when IBSS is being merged-in, send command packet to PM for connected indication
496 * [WPD00003833] [MT6620 and MT5931] Driver migration.
497 * Add Ad-Hoc support to AIS-FSM
499 * 07 19 2010 jeffrey.chang
501 * Linux port modification
505 * [WPD00003833] [MT6620 and MT5931] Driver migration.
506 * bugfix for SCN migration
507 * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
508 * 2) before AIS issues scan request, network(BSS) needs to be activated first
509 * 3) only invoke COPY_SSID when using specified SSID for scan
513 * [WPD00003833] [MT6620 and MT5931] Driver migration.
514 * for AIS scanning, driver specifies no extra IE for probe request
518 * [WPD00003833] [MT6620 and MT5931] Driver migration.
519 * driver no longer generates probe request frames
521 * 07 14 2010 yarco.yang
523 * Remove CFG_MQM_MIGRATION
527 * [WPD00003833] [MT6620 and MT5931] Driver migration.
528 * Refine AIS-FSM by divided into more states
530 * 07 13 2010 cm.chang
532 * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
536 * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
537 * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
538 * 3) implment DRV-SCN module, currently only accepts single scan request, other request will be directly dropped by returning BUSY
540 * 07 09 2010 george.huang
542 * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
546 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
549 * [WPD00003833][MT6620 and MT5931] Driver migration
550 * take use of RLM module for parsing/generating HT IEs for 11n capability
552 * 07 08 2010 cm.chang
553 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
554 * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
557 * [WPD00003833][MT6620 and MT5931] Driver migration
558 * for first connection, if connecting failed do not enter into scan state.
561 * [WPD00003833][MT6620 and MT5931] Driver migration
562 * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
564 * 07 06 2010 george.huang
565 * [WPD00001556]Basic power managemenet function
566 * Update arguments for nicUpdateBeaconIETemplate()
569 * [WPD00003833][MT6620 and MT5931] Driver migration
570 * STA-REC is maintained by CNM only.
573 * [WPD00003833][MT6620 and MT5931] Driver migration
574 * remove unused definitions.
577 * [WPD00003833][MT6620 and MT5931] Driver migration
578 * AIS-FSM integration with CNM channel request messages
581 * [WPD00003833][MT6620 and MT5931] Driver migration
582 * implementation of DRV-SCN and related mailbox message handling.
585 * [WPD00003833][MT6620 and MT5931] Driver migration
586 * sync. with CMD/EVENT document ver0.07.
589 * [WPD00003833][MT6620 and MT5931] Driver migration
590 * 1) sync to. CMD/EVENT document v0.03
591 * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
592 * 3) send command packet to indicate FW-PM after
593 * a) 1st beacon is received after AIS has connected to an AP
594 * b) IBSS-ALONE has been created
595 * c) IBSS-MERGE has occured
598 * [WPD00003833][MT6620 and MT5931] Driver migration
599 * modify Beacon/ProbeResp to complete parsing,
600 * because host software has looser memory usage restriction
603 * [WPD00003833][MT6620 and MT5931] Driver migration
607 * [WPD00003833][MT6620 and MT5931] Driver migration
608 * comment out RLM APIs by CFG_RLM_MIGRATION.
611 * [WPD00003833][MT6620 and MT5931] Driver migration
612 * 1) add command warpper for STA-REC/BSS-INFO sync.
613 * 2) enhance command packet sending procedure for non-oid part
614 * 3) add command packet definitions for STA-REC/BSS-INFO sync.
616 * 06 21 2010 yarco.yang
617 * [WPD00003837][MT6620]Data Path Refine
618 * Support CFG_MQM_MIGRATION flag
621 * [WPD00003833][MT6620 and MT5931] Driver migration
622 * add scan_fsm into building.
625 * [WPD00003833][MT6620 and MT5931] Driver migration
626 * RSN/PRIVACY compilation flag awareness correction
628 * 06 18 2010 cm.chang
629 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
630 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
633 * [WPD00003840][MT6620 5931] Security migration
634 * migration from MT6620 firmware.
637 * [WPD00003833][MT6620 and MT5931] Driver migration
641 * [WPD00003833][MT6620 and MT5931] Driver migration
642 * restore utility function invoking via hem_mbox to direct calls
645 * [WPD00003833][MT6620 and MT5931] Driver migration
646 * auth.c is migrated.
649 * [WPD00003833][MT6620 and MT5931] Driver migration
653 * [WPD00003833][MT6620 and MT5931] Driver migration
654 * 1) migrate assoc.c.
655 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
656 * 3) add configuration options for CNM_MEM and RSN modules
657 * 4) add data path for management frames
658 * 5) eliminate rPacketInfo of MSDU_INFO_T
661 * [WPD00003833][MT6620 and MT5931] Driver migration
662 * change to enqueue TX frame infinitely.
665 * [WPD00003833][MT6620 and MT5931] Driver migration
666 * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
667 * 2) when disconnected, indicate nic directly (no event is needed)
670 * [WPD00003833][MT6620 and MT5931] Driver migration
671 * add buildable & linkable ais_fsm.c
673 * related reference are still waiting to be resolved
675 * 06 01 2010 cm.chang
676 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
677 * Add conditionial compiling flag to choose default available bandwidth
679 * 05 28 2010 kevin.huang
680 * [BORA00000794][WIFISYS][New Feature]Power Management Support
681 * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
683 * 05 24 2010 kevin.huang
684 * [BORA00000794][WIFISYS][New Feature]Power Management Support
685 * Refine authSendAuthFrame() for NULL STA_RECORD_T case and minimum deauth interval.
687 * 05 21 2010 kevin.huang
688 * [BORA00000794][WIFISYS][New Feature]Power Management Support
689 * Fix compile error if CFG_CMD_EVENT_VER_009 == 0 for prEventConnStatus->ucNetworkType.
691 * 05 21 2010 kevin.huang
692 * [BORA00000794][WIFISYS][New Feature]Power Management Support
693 * Refine txmInitWtblTxRateTable() - set TX initial rate according to AP's operation rate set
695 * 05 17 2010 kevin.huang
696 * [BORA00000794][WIFISYS][New Feature]Power Management Support
697 * Call pmAbort() and add ucNetworkType field in EVENT_CONNECTION_STATUS
699 * 05 14 2010 kevin.huang
700 * [BORA00000794][WIFISYS][New Feature]Power Management Support
701 * Fix compile warning - define of MQM_WMM_PARSING was removed
703 * 05 12 2010 kevin.huang
704 * [BORA00000794][WIFISYS][New Feature]Power Management Support
705 * Add Power Management - Legacy PS-POLL support.
707 * 04 28 2010 tehuang.liu
708 * [BORA00000605][WIFISYS] Phase3 Integration
709 * Removed the use of compiling flag MQM_WMM_PARSING
711 * 04 27 2010 kevin.huang
712 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
716 * 04 27 2010 kevin.huang
717 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
718 * Add Set Slot Time and Beacon Timeout Support for AdHoc Mode
720 * 04 19 2010 kevin.huang
721 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
722 * Add Send Deauth for Class 3 Error and Leave Network Support
725 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
726 * fixed the protected bit at cap info for ad-hoc.
728 * 04 13 2010 kevin.huang
729 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
730 * Add new HW CH macro support
732 * 04 07 2010 chinghwa.yu
733 * [BORA00000563]Add WiFi CoEx BCM module
734 * Add TX Power Control RCPI function.
737 * [BORA00000605][WIFISYS] Phase3 Integration
738 * move the wlan table alloc / free to change state function.
741 * [BORA00000676][MT6620] Support the frequency setting and query at build connection / connection event
742 * modify the build connection and status event structure bu CMD_EVENT doc 0.09 draft, default is disable.
745 * [BORA00000605][WIFISYS] Phase3 Integration
746 * fixed some WHQL testing error.
748 * 03 24 2010 kevin.huang
749 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
750 * Add Set / Unset POWER STATE in AIS Network
752 * 03 16 2010 kevin.huang
753 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
756 * 03 10 2010 kevin.huang
757 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
758 * Add Channel Manager for arbitration of JOIN and SCAN Req
760 * 03 03 2010 kevin.huang
761 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
762 * Add PHY_CONFIG to change Phy Type
764 * 03 03 2010 chinghwa.yu
765 * [BORA00000563]Add WiFi CoEx BCM module
766 * Use bcmWiFiNotify to replace wifi_send_msg to pass infomation to BCM module.
768 * 03 03 2010 chinghwa.yu
769 * [BORA00000563]Add WiFi CoEx BCM module
770 * Remove wmt_task definition and add PTA function.
772 * 03 02 2010 tehuang.liu
773 * [BORA00000569][WIFISYS] Phase 2 Integration Test
774 * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
776 * 03 01 2010 tehuang.liu
777 * [BORA00000569][WIFISYS] Phase 2 Integration Test
778 * Modified aisUpdateBssInfo() to call TXM's functions for setting WTBL TX parameters
781 * [BORA00000605][WIFISYS] Phase3 Integration
782 * clear the pmkid cache while indicate media disconnect.
784 * 02 26 2010 tehuang.liu
785 * [BORA00000569][WIFISYS] Phase 2 Integration Test
788 * 02 26 2010 tehuang.liu
789 * [BORA00000569][WIFISYS] Phase 2 Integration Test
790 * Enabled MQM parsing WMM IEs for non-AP mode
792 * 02 26 2010 kevin.huang
793 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
794 * Remove CFG_TEST_VIRTUAL_CMD and add support of Driver STA_RECORD_T activation
797 * [BORA00000605][WIFISYS] Phase3 Integration
798 * use the Rx0 dor event indicate.
800 * 02 23 2010 kevin.huang
801 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
802 * Support dynamic channel selection
805 * [BORA00000621][MT6620 Wi-Fi] Add the RSSI indicate to avoid XP stalled for query rssi value
806 * Adding the RSSI event support, using the HAL function to get the rcpi value and tranlsate to RSSI and indicate to driver
808 * 02 12 2010 cm.chang
809 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
810 * Use bss info array for concurrent handle
812 * 02 05 2010 kevin.huang
813 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
814 * Revise data structure to share the same BSS_INFO_T for avoiding coding error
816 * 02 04 2010 kevin.huang
817 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
818 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
820 * 01 27 2010 tehuang.liu
821 * [BORA00000569][WIFISYS] Phase 2 Integration Test
822 * Set max AMDPU size supported by the peer to 64 KB, removed mqmInit() and mqmTxSendAddBaReq() function calls in aisUpdateBssInfo()
825 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
826 * add and fixed some security function.
828 * 01 22 2010 cm.chang
829 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
830 * Support protection and bandwidth switch
832 * 01 20 2010 kevin.huang
833 * [BORA00000569][WIFISYS] Phase 2 Integration Test
834 * Add PHASE_2_INTEGRATION_WORK_AROUND and CFG_SUPPORT_BCM flags
836 * 01 15 2010 tehuang.liu
837 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
838 * Configured the AMPDU factor to 3 for the APu1rwduu`wvpghlqg|q`mpdkb+ilp
840 * 01 14 2010 chinghwa.yu
841 * [BORA00000563]Add WiFi CoEx BCM module
842 * Add WiFi BCM module for the 1st time.
844 * 01 11 2010 kevin.huang
845 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
846 * Add Deauth and Disassoc Handler
848 * 01 07 2010 kevin.huang
849 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
850 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
852 * Refine JOIN Complete and seperate the function of Media State indication
854 * 01 04 2010 tehuang.liu
855 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
856 * For working out the first connection Chariot-verified version
858 * 12 18 2009 cm.chang
859 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
862 * Dec 10 2009 mtk01088
863 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
864 * adding the sample code to update the wlan table rate,
866 * Dec 10 2009 mtk01104
867 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
868 * Different function prototype of wifi_send_msg()
870 * Dec 9 2009 mtk01104
871 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
872 * Call rlm related function to process HT info when join complete
874 * Dec 9 2009 mtk01088
875 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
876 * default the acquired wlan table entry code off
878 * Dec 9 2009 mtk01088
879 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
880 * adding the code to acquired the wlan table entry, and a sample code to update the BA bit at table
882 * Dec 7 2009 mtk01461
883 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
884 * Fix the problem of prSwRfb overwrited by event packet in aisFsmRunEventJoinComplete()
886 * Dec 4 2009 mtk01088
887 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
888 * adding the code to integrate the security related code
890 * Dec 3 2009 mtk01461
891 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
892 * Remove redundant declaration
894 * Dec 3 2009 mtk01461
895 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
896 * Add code for JOIN init and JOIN complete
898 * Nov 30 2009 mtk01461
899 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
900 * Rename u4RSSI to i4RSSI
902 * Nov 30 2009 mtk01461
903 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
904 * Revise ENUM_MEDIA_STATE to ENUM_PARAM_MEDIA_STATE
906 * Nov 30 2009 mtk01461
907 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
908 * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
910 * Nov 26 2009 mtk01461
911 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
912 * Revise Virtual CMD handler due to structure changed
914 * Nov 25 2009 mtk01461
915 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
916 * Add Virtual CMD & RESP for testing CMD PATH
918 * Nov 23 2009 mtk01461
919 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
920 * Add aisFsmInitializeConnectionSettings()
922 * Nov 20 2009 mtk01461
923 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
924 * Add CFG_TEST_MGMT_FSM flag for aisFsmTest()
926 * Nov 16 2009 mtk01461
927 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
931 /*******************************************************************************
932 * C O M P I L E R F L A G S
933 ********************************************************************************
936 /*******************************************************************************
937 * E X T E R N A L R E F E R E N C E S
938 ********************************************************************************
942 /*******************************************************************************
944 ********************************************************************************
946 #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT 2
948 /*******************************************************************************
950 ********************************************************************************
953 /*******************************************************************************
954 * P U B L I C D A T A
955 ********************************************************************************
958 /*******************************************************************************
959 * P R I V A T E D A T A
960 ********************************************************************************
963 /*lint -save -e64 Type mismatch */
964 static PUINT_8 apucDebugAisState[AIS_STATE_NUM] = {
965 (PUINT_8)DISP_STRING("AIS_STATE_IDLE"),
966 (PUINT_8)DISP_STRING("AIS_STATE_SEARCH"),
967 (PUINT_8)DISP_STRING("AIS_STATE_SCAN"),
968 (PUINT_8)DISP_STRING("AIS_STATE_ONLINE_SCAN"),
969 (PUINT_8)DISP_STRING("AIS_STATE_LOOKING_FOR"),
970 (PUINT_8)DISP_STRING("AIS_STATE_WAIT_FOR_NEXT_SCAN"),
971 (PUINT_8)DISP_STRING("AIS_STATE_REQ_CHANNEL_JOIN"),
972 (PUINT_8)DISP_STRING("AIS_STATE_JOIN"),
973 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_ALONE"),
974 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_MERGE"),
975 (PUINT_8)DISP_STRING("AIS_STATE_NORMAL_TR"),
976 (PUINT_8)DISP_STRING("AIS_STATE_DISCONNECTING")
981 /*******************************************************************************
983 ********************************************************************************
986 /*******************************************************************************
987 * F U N C T I O N D E C L A R A T I O N S
988 ********************************************************************************
991 /*******************************************************************************
993 ********************************************************************************
995 /*----------------------------------------------------------------------------*/
997 * @brief the function is used to initialize the value of the connection settings for
1004 /*----------------------------------------------------------------------------*/
1006 aisInitializeConnectionSettings (
1007 IN P_ADAPTER_T prAdapter,
1008 IN P_REG_INFO_T prRegInfo
1011 P_CONNECTION_SETTINGS_T prConnSettings;
1012 UINT_8 aucAnyBSSID[] = BC_BSSID;
1013 UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
1015 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1017 /* Setup default values for operation */
1018 COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
1020 prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
1022 COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
1023 prConnSettings->fgIsConnByBssidIssued = FALSE;
1025 prConnSettings->fgIsConnReqIssued = FALSE;
1027 prConnSettings->ucSSIDLen = 0;
1029 prConnSettings->eOPMode = NET_TYPE_INFRA;
1031 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1034 prConnSettings->ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4StartFreq);
1035 prConnSettings->eAdHocBand = prRegInfo->u4StartFreq < 5000000 ? BAND_2G4 : BAND_5G;
1036 prConnSettings->eAdHocMode = (ENUM_PARAM_AD_HOC_MODE_T) (prRegInfo->u4AdhocMode);
1039 prConnSettings->eAuthMode = AUTH_MODE_OPEN;
1041 prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
1043 prConnSettings->fgIsScanReqIssued = FALSE;
1045 /* MIB attributes */
1046 prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
1048 prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
1050 prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
1052 //prConnSettings->u4FreqInKHz; /* Center frequency */
1056 prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
1058 secInit(prAdapter, NETWORK_TYPE_AIS_INDEX);
1061 prConnSettings->fgIsEnableRoaming = FALSE;
1062 #if CFG_SUPPORT_ROAMING
1064 prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0)?(FALSE):(TRUE));
1066 #endif /* CFG_SUPPORT_ROAMING */
1068 prConnSettings->fgIsAdHocQoSEnable = FALSE;
1070 prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
1072 /* Set default bandwidth modes */
1073 prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
1074 prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
1077 } /* end of aisFsmInitializeConnectionSettings() */
1080 /*----------------------------------------------------------------------------*/
1082 * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
1089 /*----------------------------------------------------------------------------*/
1092 IN P_ADAPTER_T prAdapter
1095 P_AIS_FSM_INFO_T prAisFsmInfo;
1096 P_BSS_INFO_T prAisBssInfo;
1097 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1099 DEBUGFUNC("aisFsmInit()");
1100 DBGLOG(SW1, INFO, ("->aisFsmInit()\n"));
1102 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1103 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1104 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1106 //4 <1> Initiate FSM
1107 prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
1108 prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
1110 prAisFsmInfo->ucAvailableAuthTypes = 0;
1112 prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T)NULL;
1114 prAisFsmInfo->ucSeqNumOfReqMsg = 0;
1115 prAisFsmInfo->ucSeqNumOfChReq = 0;
1116 prAisFsmInfo->ucSeqNumOfScanReq = 0;
1118 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1119 #if CFG_SUPPORT_ROAMING
1120 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1121 #endif /* CFG_SUPPORT_ROAMING */
1122 prAisFsmInfo->fgIsChannelRequested = FALSE;
1123 prAisFsmInfo->fgIsChannelGranted = FALSE;
1125 //4 <1.1> Initiate FSM - Timer INIT
1126 cnmTimerInitTimer(prAdapter,
1127 &prAisFsmInfo->rBGScanTimer,
1128 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventBGSleepTimeOut,
1131 cnmTimerInitTimer(prAdapter,
1132 &prAisFsmInfo->rIbssAloneTimer,
1133 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventIbssAloneTimeOut,
1136 cnmTimerInitTimer(prAdapter,
1137 &prAisFsmInfo->rIndicationOfDisconnectTimer,
1138 (PFN_MGMT_TIMEOUT_FUNC)aisPostponedEventOfDisconnTimeout,
1141 cnmTimerInitTimer(prAdapter,
1142 &prAisFsmInfo->rJoinTimeoutTimer,
1143 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventJoinTimeout,
1146 //4 <1.2> Initiate PWR STATE
1147 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1150 //4 <2> Initiate BSS_INFO_T - common part
1151 BSS_INFO_INIT(prAdapter, NETWORK_TYPE_AIS_INDEX);
1152 COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
1154 //4 <3> Initiate BSS_INFO_T - private part
1156 prAisBssInfo->eBand = BAND_2G4;
1157 prAisBssInfo->ucPrimaryChannel = 1;
1158 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1160 //4 <4> Allocate MSDU_INFO_T for Beacon
1161 prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
1162 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
1164 if (prAisBssInfo->prBeacon) {
1165 prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1166 prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1173 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1174 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1175 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1177 if (prAdapter->u4UapsdAcBmp == 0) {
1178 prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1179 //ASSERT(prAdapter->u4UapsdAcBmp);
1181 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1182 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1183 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1186 /* request list initialization */
1187 LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1189 //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1190 //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1191 //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1192 //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1195 } /* end of aisFsmInit() */
1197 /*----------------------------------------------------------------------------*/
1199 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1206 /*----------------------------------------------------------------------------*/
1209 IN P_ADAPTER_T prAdapter
1212 P_AIS_FSM_INFO_T prAisFsmInfo;
1213 P_BSS_INFO_T prAisBssInfo;
1214 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1216 DEBUGFUNC("aisFsmUninit()");
1217 DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1219 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1220 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1221 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1223 //4 <1> Stop all timers
1224 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
1225 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
1226 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
1227 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1229 //4 <2> flush pending request
1230 aisFsmFlushRequest(prAdapter);
1232 //4 <3> Reset driver-domain BSS-INFO
1233 if(prAisBssInfo->prBeacon) {
1234 cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1235 prAisBssInfo->prBeacon = NULL;
1238 #if CFG_SUPPORT_802_11W
1239 rsnStopSaQuery(prAdapter);
1243 } /* end of aisFsmUninit() */
1246 /*----------------------------------------------------------------------------*/
1248 * @brief Initialization of JOIN STATE
1250 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
1254 /*----------------------------------------------------------------------------*/
1256 aisFsmStateInit_JOIN (
1257 IN P_ADAPTER_T prAdapter,
1258 P_BSS_DESC_T prBssDesc
1261 P_AIS_FSM_INFO_T prAisFsmInfo;
1262 P_BSS_INFO_T prAisBssInfo;
1263 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1264 P_CONNECTION_SETTINGS_T prConnSettings;
1265 P_STA_RECORD_T prStaRec;
1266 P_MSG_JOIN_REQ_T prJoinReqMsg;
1268 DEBUGFUNC("aisFsmStateInit_JOIN()");
1270 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1271 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1272 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1273 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1277 //4 <1> We are going to connect to this BSS.
1278 prBssDesc->fgIsConnecting = TRUE;
1281 //4 <2> Setup corresponding STA_RECORD_T
1282 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1284 NETWORK_TYPE_AIS_INDEX,
1287 prAisFsmInfo->prTargetStaRec = prStaRec;
1289 //4 <2.1> sync. to firmware domain
1290 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1292 //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1293 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1295 prStaRec->fgIsReAssoc = FALSE;
1297 switch (prConnSettings->eAuthMode) {
1298 case AUTH_MODE_OPEN: /* Note: Omit break here. */
1300 case AUTH_MODE_WPA_PSK:
1301 case AUTH_MODE_WPA2:
1302 case AUTH_MODE_WPA2_PSK:
1303 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1307 case AUTH_MODE_SHARED:
1308 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1312 case AUTH_MODE_AUTO_SWITCH:
1313 DBGLOG(AIS, LOUD, ("JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n"));
1314 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)(AUTH_TYPE_OPEN_SYSTEM |
1315 AUTH_TYPE_SHARED_KEY);
1319 ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
1320 DBGLOG(AIS, ERROR, ("JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
1321 prConnSettings->eAuthMode));
1322 /* TODO(Kevin): error handling ? */
1326 /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1327 prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1329 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1333 ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1334 ASSERT(!prBssDesc->fgIsConnected);
1336 DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1337 prAisSpecificBssInfo->ucRoamingAuthTypes));
1340 prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1342 /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1343 prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1345 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1349 //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1350 if (prAisFsmInfo->ucAvailableAuthTypes &
1351 (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1353 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
1354 prAisFsmInfo->ucAvailableAuthTypes &=
1355 ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1357 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1359 else if (prAisFsmInfo->ucAvailableAuthTypes &
1360 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1362 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1364 prAisFsmInfo->ucAvailableAuthTypes &=
1365 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1367 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1369 else if (prAisFsmInfo->ucAvailableAuthTypes &
1370 (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1372 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1374 prAisFsmInfo->ucAvailableAuthTypes &=
1375 ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1377 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1383 //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1384 if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1386 if (prBssDesc->ucSSIDLen) {
1387 COPY_SSID(prConnSettings->aucSSID,
1388 prConnSettings->ucSSIDLen,
1390 prBssDesc->ucSSIDLen);
1394 //4 <6> Send a Msg to trigger SAA to start JOIN process.
1395 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1396 if (!prJoinReqMsg) {
1398 ASSERT(0); // Can't trigger SAA FSM
1402 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1403 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1404 prJoinReqMsg->prStaRec = prStaRec;
1408 P_FRAG_INFO_T prFragInfo;
1409 for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1410 prFragInfo = &prStaRec->rFragInfo[j];
1412 if (prFragInfo->pr1stFrag) {
1413 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1414 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1419 mboxSendMsg(prAdapter,
1421 (P_MSG_HDR_T) prJoinReqMsg,
1422 MSG_SEND_METHOD_BUF);
1425 } /* end of aisFsmInit_JOIN() */
1428 /*----------------------------------------------------------------------------*/
1430 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1432 * @param[in] prStaRec Pointer to the STA_RECORD_T
1434 * @retval TRUE We will retry JOIN
1435 * @retval FALSE We will not retry JOIN
1437 /*----------------------------------------------------------------------------*/
1439 aisFsmStateInit_RetryJOIN (
1440 IN P_ADAPTER_T prAdapter,
1441 P_STA_RECORD_T prStaRec
1444 P_AIS_FSM_INFO_T prAisFsmInfo;
1445 P_MSG_JOIN_REQ_T prJoinReqMsg;
1447 DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1449 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1451 /* Retry other AuthType if possible */
1452 if (!prAisFsmInfo->ucAvailableAuthTypes) {
1456 if (prAisFsmInfo->ucAvailableAuthTypes &
1457 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1459 DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1461 prAisFsmInfo->ucAvailableAuthTypes &=
1462 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1464 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1467 DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1471 prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1473 /* Trigger SAA to start JOIN process. */
1474 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1475 if (!prJoinReqMsg) {
1477 ASSERT(0); // Can't trigger SAA FSM
1481 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1482 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1483 prJoinReqMsg->prStaRec = prStaRec;
1485 mboxSendMsg(prAdapter,
1487 (P_MSG_HDR_T) prJoinReqMsg,
1488 MSG_SEND_METHOD_BUF);
1492 }/* end of aisFsmRetryJOIN() */
1495 #if CFG_SUPPORT_ADHOC
1496 /*----------------------------------------------------------------------------*/
1498 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1504 /*----------------------------------------------------------------------------*/
1506 aisFsmStateInit_IBSS_ALONE (
1507 IN P_ADAPTER_T prAdapter
1510 P_AIS_FSM_INFO_T prAisFsmInfo;
1511 P_CONNECTION_SETTINGS_T prConnSettings;
1512 P_BSS_INFO_T prAisBssInfo;
1514 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1515 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1516 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1518 //4 <1> Check if IBSS was created before ?
1519 if (prAisBssInfo->fgIsBeaconActivated) {
1521 //4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH
1522 #if !CFG_SLT_SUPPORT
1523 cnmTimerStartTimer(prAdapter,
1524 &prAisFsmInfo->rIbssAloneTimer,
1525 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
1529 aisFsmCreateIBSS(prAdapter);
1532 } /* end of aisFsmStateInit_IBSS_ALONE() */
1535 /*----------------------------------------------------------------------------*/
1537 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1539 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1543 /*----------------------------------------------------------------------------*/
1545 aisFsmStateInit_IBSS_MERGE (
1546 IN P_ADAPTER_T prAdapter,
1547 P_BSS_DESC_T prBssDesc
1550 P_AIS_FSM_INFO_T prAisFsmInfo;
1551 P_CONNECTION_SETTINGS_T prConnSettings;
1552 P_BSS_INFO_T prAisBssInfo;
1553 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
1558 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1559 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1560 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1562 //4 <1> We will merge with to this BSS immediately.
1563 prBssDesc->fgIsConnecting = FALSE;
1564 prBssDesc->fgIsConnected = TRUE;
1566 //4 <2> Setup corresponding STA_RECORD_T
1567 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1568 STA_TYPE_ADHOC_PEER,
1569 NETWORK_TYPE_AIS_INDEX,
1572 prStaRec->fgIsMerging = TRUE;
1574 prAisFsmInfo->prTargetStaRec = prStaRec;
1576 //4 <2.1> sync. to firmware domain
1577 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1580 aisFsmMergeIBSS(prAdapter, prStaRec);
1583 } /* end of aisFsmStateInit_IBSS_MERGE() */
1585 #endif /* CFG_SUPPORT_ADHOC */
1588 /*----------------------------------------------------------------------------*/
1590 * @brief Process of JOIN Abort
1596 /*----------------------------------------------------------------------------*/
1598 aisFsmStateAbort_JOIN (
1599 IN P_ADAPTER_T prAdapter
1602 P_AIS_FSM_INFO_T prAisFsmInfo;
1603 P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1605 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1607 /* 1. Abort JOIN process */
1608 prJoinAbortMsg = (P_MSG_JOIN_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
1609 if (!prJoinAbortMsg) {
1611 ASSERT(0); // Can't abort SAA FSM
1615 prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1616 prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1617 prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1619 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1621 mboxSendMsg(prAdapter,
1623 (P_MSG_HDR_T) prJoinAbortMsg,
1624 MSG_SEND_METHOD_BUF);
1626 /* 2. Return channel privilege */
1627 aisFsmReleaseCh(prAdapter);
1629 /* 3.1 stop join timeout timer */
1630 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1632 /* 3.2 reset local variable */
1633 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1636 } /* end of aisFsmAbortJOIN() */
1639 /*----------------------------------------------------------------------------*/
1641 * @brief Process of SCAN Abort
1647 /*----------------------------------------------------------------------------*/
1649 aisFsmStateAbort_SCAN (
1650 IN P_ADAPTER_T prAdapter
1653 P_AIS_FSM_INFO_T prAisFsmInfo;
1654 P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1656 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1658 /* Abort JOIN process. */
1659 prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1660 if (!prScanCancelMsg) {
1662 ASSERT(0); // Can't abort SCN FSM
1666 prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
1667 prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
1668 prScanCancelMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
1669 #if CFG_ENABLE_WIFI_DIRECT
1670 if(prAdapter->fgIsP2PRegistered) {
1671 prScanCancelMsg->fgIsChannelExt = FALSE;
1675 /* unbuffered message to guarantee scan is cancelled in sequence */
1676 mboxSendMsg(prAdapter,
1678 (P_MSG_HDR_T) prScanCancelMsg,
1679 MSG_SEND_METHOD_UNBUF);
1682 } /* end of aisFsmAbortSCAN() */
1685 /*----------------------------------------------------------------------------*/
1687 * @brief Process of NORMAL_TR Abort
1693 /*----------------------------------------------------------------------------*/
1695 aisFsmStateAbort_NORMAL_TR (
1696 IN P_ADAPTER_T prAdapter
1699 P_AIS_FSM_INFO_T prAisFsmInfo;
1702 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1704 /* TODO(Kevin): Do abort other MGMT func */
1706 /* 1. Release channel to CNM */
1707 aisFsmReleaseCh(prAdapter);
1709 /* 2.1 stop join timeout timer */
1710 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1712 /* 2.2 reset local variable */
1713 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1716 } /* end of aisFsmAbortNORMAL_TR() */
1719 #if CFG_SUPPORT_ADHOC
1720 /*----------------------------------------------------------------------------*/
1722 * @brief Process of NORMAL_TR Abort
1728 /*----------------------------------------------------------------------------*/
1730 aisFsmStateAbort_IBSS (
1731 IN P_ADAPTER_T prAdapter
1734 P_AIS_FSM_INFO_T prAisFsmInfo;
1735 P_BSS_DESC_T prBssDesc;
1737 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1740 if (prAisFsmInfo->prTargetStaRec) {
1741 prBssDesc = scanSearchBssDescByTA(prAdapter,
1742 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1745 prBssDesc->fgIsConnected = FALSE;
1746 prBssDesc->fgIsConnecting = FALSE;
1750 // release channel privilege
1751 aisFsmReleaseCh(prAdapter);
1755 #endif /* CFG_SUPPORT_ADHOC */
1758 /*----------------------------------------------------------------------------*/
1760 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1762 * @param[in] eNextState Enum value of next AIS STATE
1766 /*----------------------------------------------------------------------------*/
1769 IN P_ADAPTER_T prAdapter,
1770 ENUM_AIS_STATE_T eNextState
1773 P_AIS_FSM_INFO_T prAisFsmInfo;
1774 P_BSS_INFO_T prAisBssInfo;
1775 P_CONNECTION_SETTINGS_T prConnSettings;
1776 P_BSS_DESC_T prBssDesc;
1777 P_MSG_CH_REQ_T prMsgChReq;
1778 P_MSG_SCN_SCAN_REQ prScanReqMsg;
1779 P_AIS_REQ_HDR_T prAisReq;
1782 UINT_16 u2ScanIELen;
1784 BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1786 DEBUGFUNC("aisFsmSteps()");
1788 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1789 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1790 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1794 /* Do entering Next State */
1795 prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1798 DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1799 apucDebugAisState[prAisFsmInfo->eCurrentState],
1800 apucDebugAisState[eNextState]));
1802 DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1804 prAisFsmInfo->eCurrentState,
1807 /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1808 prAisFsmInfo->eCurrentState = eNextState;
1810 fgIsTransition = (BOOLEAN)FALSE;
1812 /* Do tasks of the State that we just entered */
1813 switch (prAisFsmInfo->eCurrentState) {
1814 /* NOTE(Kevin): we don't have to rearrange the sequence of following
1815 * switch case. Instead I would like to use a common lookup table of array
1816 * of function pointer to speed up state search.
1818 case AIS_STATE_IDLE:
1820 prAisReq = aisFsmGetNextRequest(prAdapter);
1822 if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1823 if (prConnSettings->fgIsConnReqIssued) {
1825 prAisFsmInfo->fgTryScan = TRUE;
1827 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1828 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1830 // sync with firmware
1831 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1833 // reset trial count
1834 prAisFsmInfo->ucConnTrialCount = 0;
1836 eNextState = AIS_STATE_SEARCH;
1837 fgIsTransition = TRUE;
1840 UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1841 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1843 // sync with firmware
1844 nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1846 // check for other pending request
1848 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1849 wlanClearScanningResult(prAdapter);
1850 eNextState = AIS_STATE_SCAN;
1852 fgIsTransition = TRUE;
1858 /* free the message */
1859 cnmMemFree(prAdapter, prAisReq);
1862 else if(prAisReq->eReqType == AIS_REQUEST_SCAN) {
1863 #if CFG_SUPPORT_ROAMING
1864 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1865 #endif /* CFG_SUPPORT_ROAMING */
1866 wlanClearScanningResult(prAdapter);
1868 eNextState = AIS_STATE_SCAN;
1869 fgIsTransition = TRUE;
1871 /* free the message */
1872 cnmMemFree(prAdapter, prAisReq);
1874 else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1876 /* free the message */
1877 cnmMemFree(prAdapter, prAisReq);
1880 prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1884 case AIS_STATE_SEARCH:
1885 //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1887 prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1889 prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1892 // we are under Roaming Condition.
1893 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1894 if(prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
1895 #if CFG_SUPPORT_ROAMING
1896 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
1897 #endif /* CFG_SUPPORT_ROAMING */
1898 // reset retry count
1899 prAisFsmInfo->ucConnTrialCount = 0;
1901 // abort connection trial
1902 prConnSettings->fgIsConnReqIssued = FALSE;
1904 eNextState = AIS_STATE_NORMAL_TR;
1905 fgIsTransition = TRUE;
1911 //4 <2> We are not under Roaming Condition.
1912 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1914 //4 <2.a> If we have the matched one
1917 //4 <A> Stored the Selected BSS security cipher. For later asoc req compose IE
1918 prAisBssInfo->u4RsnSelectedGroupCipher =
1919 prBssDesc->u4RsnSelectedGroupCipher;
1920 prAisBssInfo->u4RsnSelectedPairwiseCipher =
1921 prBssDesc->u4RsnSelectedPairwiseCipher;
1922 prAisBssInfo->u4RsnSelectedAKMSuite =
1923 prBssDesc->u4RsnSelectedAKMSuite;
1925 //4 <B> Do STATE transition and update current Operation Mode.
1926 if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1928 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1930 /* Record the target BSS_DESC_T for next STATE. */
1931 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1933 /* Transit to channel acquire */
1934 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1935 fgIsTransition = TRUE;
1937 // increase connection trial count
1938 prAisFsmInfo->ucConnTrialCount++;
1940 #if CFG_SUPPORT_ADHOC
1941 else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
1943 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1945 /* Record the target BSS_DESC_T for next STATE. */
1946 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1948 eNextState = AIS_STATE_IBSS_MERGE;
1949 fgIsTransition = TRUE;
1951 #endif /* CFG_SUPPORT_ADHOC */
1954 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1955 fgIsTransition = TRUE;
1958 //4 <2.b> If we don't have the matched one
1961 // increase connection trial count for infrastructure connection
1962 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1963 prAisFsmInfo->ucConnTrialCount++;
1967 if (prAisFsmInfo->fgTryScan) {
1968 eNextState = AIS_STATE_LOOKING_FOR;
1970 fgIsTransition = TRUE;
1972 //4 <B> We've do SCAN already, now wait in some STATE.
1974 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1976 /* issue reconnect request, and retreat to idle state for scheduling */
1977 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
1979 eNextState = AIS_STATE_IDLE;
1980 fgIsTransition = TRUE;
1982 #if CFG_SUPPORT_ADHOC
1983 else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
1984 || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
1985 || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
1987 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1988 prAisFsmInfo->prTargetBssDesc = NULL;
1990 eNextState = AIS_STATE_IBSS_ALONE;
1991 fgIsTransition = TRUE;
1993 #endif /* CFG_SUPPORT_ADHOC */
1996 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1997 fgIsTransition = TRUE;
2002 //4 <3> We are under Roaming Condition.
2003 else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2005 //4 <3.a> This BSS_DESC_T is our AP.
2006 /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
2007 * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
2008 * settings. That make we can NOT match the original AP, so the
2009 * prBssDesc is NULL.
2010 * CASE II: The same reason as CASE I. Because APP change the
2011 * eOPMode to other network type in connection setting
2012 * (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
2013 * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
2014 * other parameters in connection setting first. So if we do roaming
2015 * at the same time, it will hit these cases.)
2017 * CASE III: Normal case, we can't find other candidate to roam
2018 * out, so only the current AP will be matched.
2020 if ((!prBssDesc) || /* CASE I */
2021 (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
2022 (prBssDesc->fgIsConnected) /* CASE III */) {
2025 (prBssDesc->fgIsConnected)) {
2026 ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2029 /* We already associated with it, go back to NORMAL_TR */
2030 /* TODO(Kevin): Roaming Fail */
2031 #if CFG_SUPPORT_ROAMING
2032 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
2033 #endif /* CFG_SUPPORT_ROAMING */
2035 /* Retreat to NORMAL_TR state */
2036 eNextState = AIS_STATE_NORMAL_TR;
2037 fgIsTransition = TRUE;
2039 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2042 ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2045 //4 <A> Record the target BSS_DESC_T for next STATE.
2046 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2048 // tyhsu: increase connection trial count
2049 prAisFsmInfo->ucConnTrialCount++;
2051 /* Transit to channel acquire */
2052 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2053 fgIsTransition = TRUE;
2059 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2061 DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2063 cnmTimerStartTimer(prAdapter,
2064 &prAisFsmInfo->rBGScanTimer,
2065 SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2067 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2069 if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2070 prAisFsmInfo->u4SleepInterval <<= 1;
2074 case AIS_STATE_SCAN:
2075 case AIS_STATE_ONLINE_SCAN:
2076 case AIS_STATE_LOOKING_FOR:
2078 if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2079 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2081 // sync with firmware
2082 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2085 /* IE length decision */
2086 if(prAisFsmInfo->u4ScanIELength > 0) {
2087 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2090 #if CFG_SUPPORT_WPS2
2091 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2097 prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2099 OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2100 if (!prScanReqMsg) {
2101 ASSERT(0); // Can't trigger SCAN FSM
2105 prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ;
2106 prScanReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfScanReq;
2107 prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2109 #if CFG_SUPPORT_RDD_TEST_MODE
2110 prScanReqMsg->eScanType = SCAN_TYPE_PASSIVE_SCAN;
2112 prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
2115 if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
2116 || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
2117 if(prAisFsmInfo->ucScanSSIDLen == 0) {
2118 /* Scan for all available SSID */
2119 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
2122 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2123 COPY_SSID(prScanReqMsg->aucSSID,
2124 prScanReqMsg->ucSSIDLength,
2125 prAisFsmInfo->aucScanSSID,
2126 prAisFsmInfo->ucScanSSIDLen);
2130 /* Scan for determined SSID */
2131 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2132 COPY_SSID(prScanReqMsg->aucSSID,
2133 prScanReqMsg->ucSSIDLength,
2134 prConnSettings->aucSSID,
2135 prConnSettings->ucSSIDLen);
2138 /* check if tethering is running and need to fix on specific channel */
2139 if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
2140 prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
2141 prScanReqMsg->ucChannelListNum = 1;
2142 prScanReqMsg->arChnlInfoList[0].eBand
2144 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2147 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2148 if(prAdapter->fgEnable5GBand == TRUE) {
2149 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2152 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2155 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2156 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2158 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2159 prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
2162 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2166 if(prAisFsmInfo->u4ScanIELength > 0) {
2167 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2170 #if CFG_SUPPORT_WPS2
2171 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2172 kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2177 prScanReqMsg->u2IELen = u2ScanIELen;
2179 mboxSendMsg(prAdapter,
2181 (P_MSG_HDR_T) prScanReqMsg,
2182 MSG_SEND_METHOD_BUF);
2184 prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2188 case AIS_STATE_REQ_CHANNEL_JOIN:
2189 /* send message to CNM for acquiring channel */
2190 prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
2192 ASSERT(0); // Can't indicate CNM for channel acquiring
2196 prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
2197 prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
2198 prMsgChReq->ucTokenID = ++prAisFsmInfo->ucSeqNumOfChReq;
2199 prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
2200 prMsgChReq->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
2201 prMsgChReq->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
2202 prMsgChReq->eRfSco = prAisFsmInfo->prTargetBssDesc->eSco;
2203 prMsgChReq->eRfBand = prAisFsmInfo->prTargetBssDesc->eBand;
2204 COPY_MAC_ADDR(prMsgChReq->aucBSSID, prAisFsmInfo->prTargetBssDesc->aucBSSID);
2206 mboxSendMsg(prAdapter,
2208 (P_MSG_HDR_T) prMsgChReq,
2209 MSG_SEND_METHOD_BUF);
2211 prAisFsmInfo->fgIsChannelRequested = TRUE;
2214 case AIS_STATE_JOIN:
2215 aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2218 #if CFG_SUPPORT_ADHOC
2219 case AIS_STATE_IBSS_ALONE:
2220 aisFsmStateInit_IBSS_ALONE(prAdapter);
2223 case AIS_STATE_IBSS_MERGE:
2224 aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2226 #endif /* CFG_SUPPORT_ADHOC */
2228 case AIS_STATE_NORMAL_TR:
2229 if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2230 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2233 /* 1. Process for pending scan */
2234 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
2235 wlanClearScanningResult(prAdapter);
2236 eNextState = AIS_STATE_ONLINE_SCAN;
2237 fgIsTransition = TRUE;
2239 /* 2. Process for pending roaming scan */
2240 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
2241 eNextState = AIS_STATE_LOOKING_FOR;
2242 fgIsTransition = TRUE;
2244 /* 3. Process for pending roaming scan */
2245 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
2246 eNextState = AIS_STATE_SEARCH;
2247 fgIsTransition = TRUE;
2253 case AIS_STATE_DISCONNECTING:
2254 /* send for deauth frame for disconnection */
2255 authSendDeauthFrame(prAdapter,
2256 prAisBssInfo->prStaRecOfAP,
2258 REASON_CODE_DEAUTH_LEAVING_BSS,
2259 aisDeauthXmitComplete);
2263 ASSERT(0); /* Make sure we have handle all STATEs */
2268 while (fgIsTransition);
2272 } /* end of aisFsmSteps() */
2275 /*----------------------------------------------------------------------------*/
2283 /*----------------------------------------------------------------------------*/
2285 aisFsmRunEventScanDone (
2286 IN P_ADAPTER_T prAdapter,
2287 IN P_MSG_HDR_T prMsgHdr
2290 P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2291 P_AIS_FSM_INFO_T prAisFsmInfo;
2292 ENUM_AIS_STATE_T eNextState;
2293 UINT_8 ucSeqNumOfCompMsg;
2294 P_CONNECTION_SETTINGS_T prConnSettings;
2296 DEBUGFUNC("aisFsmRunEventScanDone()");
2301 DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2303 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2304 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2306 prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2307 ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2309 ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2310 cnmMemFree(prAdapter, prMsgHdr);
2312 eNextState = prAisFsmInfo->eCurrentState;
2314 if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2315 DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2318 switch (prAisFsmInfo->eCurrentState) {
2319 case AIS_STATE_SCAN:
2320 prConnSettings->fgIsScanReqIssued = FALSE;
2322 /* reset scan IE buffer */
2323 prAisFsmInfo->u4ScanIELength = 0;
2325 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2326 eNextState = AIS_STATE_IDLE;
2330 case AIS_STATE_ONLINE_SCAN:
2331 prConnSettings->fgIsScanReqIssued = FALSE;
2333 /* reset scan IE buffer */
2334 prAisFsmInfo->u4ScanIELength = 0;
2336 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2337 #if CFG_SUPPORT_ROAMING
2338 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2340 eNextState = AIS_STATE_NORMAL_TR;
2341 #endif /* CFG_SUPPORT_ROAMING */
2345 case AIS_STATE_LOOKING_FOR:
2346 #if CFG_SUPPORT_ROAMING
2347 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2349 eNextState = AIS_STATE_SEARCH;
2350 #endif /* CFG_SUPPORT_ROAMING */
2359 if (eNextState != prAisFsmInfo->eCurrentState) {
2360 aisFsmSteps(prAdapter, eNextState);
2364 } /* end of aisFsmRunEventScanDone() */
2367 /*----------------------------------------------------------------------------*/
2375 /*----------------------------------------------------------------------------*/
2377 aisFsmRunEventAbort (
2378 IN P_ADAPTER_T prAdapter,
2379 IN P_MSG_HDR_T prMsgHdr
2382 P_MSG_AIS_ABORT_T prAisAbortMsg;
2383 P_AIS_FSM_INFO_T prAisFsmInfo;
2384 UINT_8 ucReasonOfDisconnect;
2385 BOOLEAN fgDelayIndication;
2387 DEBUGFUNC("aisFsmRunEventAbort()");
2391 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2393 //4 <1> Extract information of Abort Message and then free memory.
2394 prAisAbortMsg = (P_MSG_AIS_ABORT_T)prMsgHdr;
2395 ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
2396 fgDelayIndication = prAisAbortMsg->fgDelayIndication;
2398 cnmMemFree(prAdapter, prMsgHdr);
2401 DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2402 apucDebugAisState[prAisFsmInfo->eCurrentState]));
2404 DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2406 prAisFsmInfo->eCurrentState));
2409 //4 <2> clear previous pending connection request and insert new one
2410 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2411 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2413 if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2414 //4 <3> invoke abort handler
2415 aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2419 } /* end of aisFsmRunEventAbort() */
2422 /*----------------------------------------------------------------------------*/
2424 * \brief This function handles AIS-FSM abort event/command
2426 * \param[in] prAdapter Pointer of ADAPTER_T
2427 * ucReasonOfDisconnect Reason for disonnection
2428 * fgDelayIndication Option to delay disconnection indication
2432 /*----------------------------------------------------------------------------*/
2435 IN P_ADAPTER_T prAdapter,
2436 UINT_8 ucReasonOfDisconnect,
2437 BOOLEAN fgDelayIndication
2440 P_AIS_FSM_INFO_T prAisFsmInfo;
2441 P_BSS_INFO_T prAisBssInfo;
2442 P_CONNECTION_SETTINGS_T prConnSettings;
2443 BOOLEAN fgIsCheckConnected;
2447 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2448 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2449 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2450 fgIsCheckConnected = FALSE;
2452 //4 <1> Save information of Abort Message and then free memory.
2453 prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2455 //4 <2> Abort current job.
2456 switch (prAisFsmInfo->eCurrentState) {
2457 case AIS_STATE_IDLE:
2458 case AIS_STATE_SEARCH:
2461 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2462 /* Do cancel timer */
2463 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2465 /* in case roaming is triggered */
2466 fgIsCheckConnected = TRUE;
2469 case AIS_STATE_SCAN:
2471 aisFsmStateAbort_SCAN(prAdapter);
2473 /* queue for later handling */
2474 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2475 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2480 case AIS_STATE_LOOKING_FOR:
2482 aisFsmStateAbort_SCAN(prAdapter);
2484 /* in case roaming is triggered */
2485 fgIsCheckConnected = TRUE;
2488 case AIS_STATE_REQ_CHANNEL_JOIN:
2489 /* Release channel to CNM */
2490 aisFsmReleaseCh(prAdapter);
2492 /* in case roaming is triggered */
2493 fgIsCheckConnected = TRUE;
2496 case AIS_STATE_JOIN:
2498 aisFsmStateAbort_JOIN(prAdapter);
2500 /* in case roaming is triggered */
2501 fgIsCheckConnected = TRUE;
2504 #if CFG_SUPPORT_ADHOC
2505 case AIS_STATE_IBSS_ALONE:
2506 case AIS_STATE_IBSS_MERGE:
2507 aisFsmStateAbort_IBSS(prAdapter);
2509 #endif /* CFG_SUPPORT_ADHOC */
2511 case AIS_STATE_ONLINE_SCAN:
2513 aisFsmStateAbort_SCAN(prAdapter);
2515 /* queue for later handling */
2516 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2517 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2520 fgIsCheckConnected = TRUE;
2523 case AIS_STATE_NORMAL_TR:
2524 fgIsCheckConnected = TRUE;
2527 case AIS_STATE_DISCONNECTING:
2528 /* Do abort NORMAL_TR */
2529 aisFsmStateAbort_NORMAL_TR(prAdapter);
2537 if (fgIsCheckConnected &&
2538 (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2540 /* switch into DISCONNECTING state for sending DEAUTH if necessary */
2541 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
2542 prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
2543 prAisBssInfo->prStaRecOfAP &&
2544 prAisBssInfo->prStaRecOfAP->fgIsInUse) {
2545 aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
2550 /* Do abort NORMAL_TR */
2551 aisFsmStateAbort_NORMAL_TR(prAdapter);
2555 aisFsmDisconnect(prAdapter, fgDelayIndication);
2559 } /* end of aisFsmStateAbort() */
2562 /*----------------------------------------------------------------------------*/
2564 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2566 * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
2570 /*----------------------------------------------------------------------------*/
2572 aisFsmRunEventJoinComplete (
2573 IN P_ADAPTER_T prAdapter,
2574 IN P_MSG_HDR_T prMsgHdr
2577 P_MSG_JOIN_COMP_T prJoinCompMsg;
2578 P_AIS_FSM_INFO_T prAisFsmInfo;
2579 ENUM_AIS_STATE_T eNextState;
2580 P_STA_RECORD_T prStaRec;
2581 P_SW_RFB_T prAssocRspSwRfb;
2583 DEBUGFUNC("aisFsmRunEventJoinComplete()");
2587 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2588 prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2589 prStaRec = prJoinCompMsg->prStaRec;
2590 prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2592 eNextState = prAisFsmInfo->eCurrentState;
2594 // Check State and SEQ NUM
2595 if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2596 P_BSS_INFO_T prAisBssInfo;
2598 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2601 if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2604 //4 <1> JOIN was successful
2605 if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2607 //1. Reset retry count
2608 prAisFsmInfo->ucConnTrialCount = 0;
2610 // Completion of roaming
2611 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2613 #if CFG_SUPPORT_ROAMING
2614 //2. Deactivate previous BSS
2615 aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2617 //3. Update bss based on roaming staRec
2618 aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2619 #endif /* CFG_SUPPORT_ROAMING */
2622 //4 <1.1> Change FW's Media State immediately.
2623 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2625 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
2626 if ((prAisBssInfo->prStaRecOfAP) &&
2627 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
2628 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
2630 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2633 //4 <1.3> Update BSS_INFO_T
2634 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2636 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2637 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2639 //4 <1.5> Update RSSI if necessary
2640 nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2642 //4 <1.6> Indicate Connected Event to Host immediately.
2643 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
2644 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2647 #if CFG_SUPPORT_ROAMING
2648 roamingFsmRunEventStart(prAdapter);
2649 #endif /* CFG_SUPPORT_ROAMING */
2651 //4 <1.7> Set the Next State of AIS FSM
2652 eNextState = AIS_STATE_NORMAL_TR;
2654 //4 <2> JOIN was not successful
2656 //4 <2.1> Redo JOIN process with other Auth Type if possible
2657 if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
2658 P_BSS_DESC_T prBssDesc;
2660 /* 1. Increase Failure Count */
2661 prStaRec->ucJoinFailureCount++;
2663 /* 2. release channel */
2664 aisFsmReleaseCh(prAdapter);
2666 /* 3.1 stop join timeout timer */
2667 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2669 /* 3.2 reset local variable */
2670 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2672 prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2675 ASSERT(prBssDesc->fgIsConnecting);
2678 prBssDesc->fgIsConnecting = FALSE;
2681 /* 3.3 Free STA-REC */
2682 if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2683 cnmStaRecFree(prAdapter, prStaRec, FALSE);
2686 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2687 #if CFG_SUPPORT_ROAMING
2688 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2689 #endif /* CFG_SUPPORT_ROAMING */
2692 /* 4. send reconnect request */
2693 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2695 eNextState = AIS_STATE_IDLE;
2702 DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2708 if (eNextState != prAisFsmInfo->eCurrentState) {
2709 aisFsmSteps(prAdapter, eNextState);
2712 if (prAssocRspSwRfb) {
2713 nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2716 cnmMemFree(prAdapter, prMsgHdr);
2719 } /* end of aisFsmRunEventJoinComplete() */
2722 #if CFG_SUPPORT_ADHOC
2723 /*----------------------------------------------------------------------------*/
2725 * @brief This function will handle the Grant Msg of IBSS Create which was sent by
2726 * CNM to indicate that channel was changed for creating IBSS.
2728 * @param[in] prAdapter Pointer of ADAPTER_T
2732 /*----------------------------------------------------------------------------*/
2735 IN P_ADAPTER_T prAdapter
2738 P_AIS_FSM_INFO_T prAisFsmInfo;
2742 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2746 if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2747 aisUpdateBssInfoForCreateIBSS(prAdapter);
2753 } /* end of aisFsmCreateIBSS() */
2756 /*----------------------------------------------------------------------------*/
2758 * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
2759 * CNM to indicate that channel was changed for merging IBSS.
2761 * @param[in] prAdapter Pointer of ADAPTER_T
2762 * @param[in] prStaRec Pointer of STA_RECORD_T for merge
2766 /*----------------------------------------------------------------------------*/
2769 IN P_ADAPTER_T prAdapter,
2770 IN P_STA_RECORD_T prStaRec
2773 P_AIS_FSM_INFO_T prAisFsmInfo;
2774 ENUM_AIS_STATE_T eNextState;
2775 P_BSS_INFO_T prAisBssInfo;
2780 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2781 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2785 eNextState = prAisFsmInfo->eCurrentState;
2787 switch (prAisFsmInfo->eCurrentState) {
2788 case AIS_STATE_IBSS_MERGE:
2790 P_BSS_DESC_T prBssDesc;
2792 //4 <1.1> Change FW's Media State immediately.
2793 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2795 //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2796 bssClearClientList(prAdapter, prAisBssInfo);
2798 //4 <1.3> Unmark connection flag of previous BSS_DESC_T.
2799 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2800 prBssDesc->fgIsConnecting = FALSE;
2801 prBssDesc->fgIsConnected = FALSE;
2804 //4 <1.4> Update BSS_INFO_T
2805 aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2807 //4 <1.5> Add Peers' STA_RECORD_T to Client List
2808 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2810 //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2811 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2812 prStaRec->fgIsMerging = FALSE;
2814 //4 <1.7> Enable other features
2816 //4 <1.8> Indicate Connected Event to Host immediately.
2817 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2819 //4 <1.9> Set the Next State of AIS FSM
2820 eNextState = AIS_STATE_NORMAL_TR;
2822 //4 <1.10> Release channel privilege
2823 aisFsmReleaseCh(prAdapter);
2826 prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2835 if (eNextState != prAisFsmInfo->eCurrentState) {
2836 aisFsmSteps(prAdapter, eNextState);
2843 } /* end of aisFsmMergeIBSS() */
2846 /*----------------------------------------------------------------------------*/
2848 * @brief This function will handle the Notification of existing IBSS was found
2851 * @param[in] prMsgHdr Message of Notification of an IBSS was present.
2855 /*----------------------------------------------------------------------------*/
2857 aisFsmRunEventFoundIBSSPeer (
2858 IN P_ADAPTER_T prAdapter,
2859 IN P_MSG_HDR_T prMsgHdr
2862 P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
2863 P_AIS_FSM_INFO_T prAisFsmInfo;
2864 ENUM_AIS_STATE_T eNextState;
2865 P_STA_RECORD_T prStaRec;
2866 P_BSS_INFO_T prAisBssInfo;
2867 P_BSS_DESC_T prBssDesc;
2868 BOOLEAN fgIsMergeIn;
2873 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2874 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2876 prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2878 ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2880 prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2883 fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2885 cnmMemFree(prAdapter, prMsgHdr);
2888 eNextState = prAisFsmInfo->eCurrentState;
2889 switch (prAisFsmInfo->eCurrentState) {
2890 case AIS_STATE_IBSS_ALONE:
2892 //4 <1> An IBSS Peer 'merged in'.
2895 //4 <1.1> Change FW's Media State immediately.
2896 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2898 //4 <1.2> Add Peers' STA_RECORD_T to Client List
2899 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2902 //4 <1.3> Mark connection flag of BSS_DESC_T.
2903 if ((prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr)) != NULL) {
2904 prBssDesc->fgIsConnecting = FALSE;
2905 prBssDesc->fgIsConnected = TRUE;
2908 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2911 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2912 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2914 //4 <1.3> Mark connection flag of BSS_DESC_T.
2915 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2916 prBssDesc->fgIsConnecting = FALSE;
2917 prBssDesc->fgIsConnected = TRUE;
2920 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2924 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2925 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2929 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2930 prStaRec->fgIsMerging = FALSE;
2932 //4 <1.6> sync. to firmware
2933 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
2935 //4 <1.7> Indicate Connected Event to Host immediately.
2936 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2938 //4 <1.8> indicate PM for connected
2939 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
2941 //4 <1.9> Set the Next State of AIS FSM
2942 eNextState = AIS_STATE_NORMAL_TR;
2944 //4 <1.10> Release channel privilege
2945 aisFsmReleaseCh(prAdapter);
2947 //4 <2> We need 'merge out' to this IBSS
2950 //4 <2.1> Get corresponding BSS_DESC_T
2951 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
2953 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2955 //4 <2.2> Set the Next State of AIS FSM
2956 eNextState = AIS_STATE_IBSS_MERGE;
2961 case AIS_STATE_NORMAL_TR:
2964 //4 <3> An IBSS Peer 'merged in'.
2967 //4 <3.1> Add Peers' STA_RECORD_T to Client List
2968 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2971 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
2972 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2974 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
2975 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2978 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2979 prStaRec->fgIsMerging = FALSE;
2982 //4 <4> We need 'merge out' to this IBSS
2985 //4 <4.1> Get corresponding BSS_DESC_T
2986 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
2988 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2990 //4 <4.2> Set the Next State of AIS FSM
2991 eNextState = AIS_STATE_IBSS_MERGE;
3001 if (eNextState != prAisFsmInfo->eCurrentState) {
3002 aisFsmSteps(prAdapter, eNextState);
3006 } /* end of aisFsmRunEventFoundIBSSPeer() */
3007 #endif /* CFG_SUPPORT_ADHOC */
3010 /*----------------------------------------------------------------------------*/
3012 * @brief This function will indicate the Media State to HOST
3014 * @param[in] eConnectionState Current Media State
3015 * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
3019 /*----------------------------------------------------------------------------*/
3021 aisIndicationOfMediaStateToHost (
3022 IN P_ADAPTER_T prAdapter,
3023 ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3024 BOOLEAN fgDelayIndication
3027 EVENT_CONNECTION_STATUS rEventConnStatus;
3028 P_CONNECTION_SETTINGS_T prConnSettings;
3029 P_BSS_INFO_T prAisBssInfo;
3030 P_AIS_FSM_INFO_T prAisFsmInfo;
3032 DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3034 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3035 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3036 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3038 // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3039 //prAisBssInfo->eConnectionState = eConnectionState;
3041 /* For indicating the Disconnect Event only if current media state is
3042 * disconnected and we didn't do indication yet.
3044 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3045 if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3050 if (!fgDelayIndication) {
3051 //4 <0> Cancel Delay Timer
3052 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3054 //4 <1> Fill EVENT_CONNECTION_STATUS
3055 rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3057 if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3058 rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3060 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3061 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3062 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3063 rEventConnStatus.u2ATIMWindow = 0;
3065 else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3066 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
3067 rEventConnStatus.u2AID = 0;
3068 rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
3074 COPY_SSID(rEventConnStatus.aucSsid,
3075 rEventConnStatus.ucSsidLen,
3076 prConnSettings->aucSSID,
3077 prConnSettings->ucSSIDLen);
3079 COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3081 rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3082 rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3084 switch (prAisBssInfo->ucNonHTBasicPhyType) {
3085 case PHY_TYPE_HR_DSSS_INDEX:
3086 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3089 case PHY_TYPE_ERP_INDEX:
3090 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3093 case PHY_TYPE_OFDM_INDEX:
3094 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3099 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3104 /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3105 bssClearClientList(prAdapter, prAisBssInfo);
3107 #if CFG_PRIVACY_MIGRATION
3108 /* Clear the pmkid cache while media disconnect */
3109 secClearPmkid(prAdapter);
3112 rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3116 nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3117 prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3120 /* NOTE: Only delay the Indication of Disconnect Event */
3121 ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3123 DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3124 prConnSettings->ucDelayTimeOfDisconnectEvent));
3126 cnmTimerStartTimer(prAdapter,
3127 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3128 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3132 } /* end of aisIndicationOfMediaStateToHost() */
3135 /*----------------------------------------------------------------------------*/
3137 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3139 * @param[in] u4Param Unused timer parameter
3143 /*----------------------------------------------------------------------------*/
3145 aisPostponedEventOfDisconnTimeout (
3146 IN P_ADAPTER_T prAdapter,
3150 P_BSS_INFO_T prAisBssInfo;
3151 P_CONNECTION_SETTINGS_T prConnSettings;
3154 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3156 //4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have.
3157 if (prAisBssInfo->prStaRecOfAP) {
3158 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3160 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3163 //4 <2> Remove pending connection request
3164 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3165 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3166 /* Set Connection Request Issued Flag */
3167 prConnSettings->fgIsConnReqIssued = FALSE;
3169 //4 <3> Indicate Disconnected Event to Host immediately.
3170 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3173 } /* end of aisPostponedEventOfDisconnTimeout() */
3176 /*----------------------------------------------------------------------------*/
3178 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3179 * the association was completed.
3181 * @param[in] prStaRec Pointer to the STA_RECORD_T
3182 * @param[in] prAssocRspSwRfb Pointer to SW RFB of ASSOC RESP FRAME.
3186 /*----------------------------------------------------------------------------*/
3188 aisUpdateBssInfoForJOIN (
3189 IN P_ADAPTER_T prAdapter,
3190 P_STA_RECORD_T prStaRec,
3191 P_SW_RFB_T prAssocRspSwRfb
3194 P_AIS_FSM_INFO_T prAisFsmInfo;
3195 P_BSS_INFO_T prAisBssInfo;
3196 P_CONNECTION_SETTINGS_T prConnSettings;
3197 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
3198 P_BSS_DESC_T prBssDesc;
3202 DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3205 ASSERT(prAssocRspSwRfb);
3207 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3208 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3209 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3210 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
3213 DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3216 //3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings
3217 //4 <1.1> Setup Operation Mode
3218 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
3220 //4 <1.2> Setup SSID
3221 COPY_SSID(prAisBssInfo->aucSSID,
3222 prAisBssInfo->ucSSIDLen,
3223 prConnSettings->aucSSID,
3224 prConnSettings->ucSSIDLen);
3226 //4 <1.3> Setup Channel, Band
3227 prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3228 prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3231 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3232 //4 <2.1> Save current AP's STA_RECORD_T and current AID
3233 prAisBssInfo->prStaRecOfAP = prStaRec;
3234 prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
3236 //4 <2.2> Setup Capability
3237 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3239 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3240 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3243 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3246 //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3247 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3249 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3251 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3252 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3255 //3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3256 //4 <3.1> Setup BSSID
3257 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
3260 u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
3261 (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
3262 pucIE = prAssocRspFrame->aucInfoElem;
3265 //4 <3.2> Parse WMM and setup QBSS flag
3266 /* Parse WMM related IEs and configure HW CRs accordingly */
3267 mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3269 prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3271 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3272 prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3274 prBssDesc->fgIsConnecting = FALSE;
3275 prBssDesc->fgIsConnected = TRUE;
3277 //4 <4.1> Setup MIB for current BSS
3278 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3281 // should never happen
3285 /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3286 prAisBssInfo->ucDTIMPeriod = 0;
3287 prAisBssInfo->u2ATIMWindow = 0;
3289 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3291 //4 <4.2> Update HT information and set channel
3292 /* Record HT related parameters in rStaRec and rBssInfo
3293 * Note: it shall be called before nicUpdateBss()
3295 rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3297 //4 <4.3> Sync with firmware for BSS-INFO
3298 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3300 //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3301 //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3304 } /* end of aisUpdateBssInfoForJOIN() */
3307 #if CFG_SUPPORT_ADHOC
3308 /*----------------------------------------------------------------------------*/
3310 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3316 /*----------------------------------------------------------------------------*/
3318 aisUpdateBssInfoForCreateIBSS (
3319 IN P_ADAPTER_T prAdapter
3322 P_AIS_FSM_INFO_T prAisFsmInfo;
3323 P_BSS_INFO_T prAisBssInfo;
3324 P_CONNECTION_SETTINGS_T prConnSettings;
3326 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3327 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3328 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3330 if (prAisBssInfo->fgIsBeaconActivated) {
3334 //3 <1> Update BSS_INFO_T per Network Basis
3335 //4 <1.1> Setup Operation Mode
3336 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3338 //4 <1.2> Setup SSID
3339 COPY_SSID(prAisBssInfo->aucSSID,
3340 prAisBssInfo->ucSSIDLen,
3341 prConnSettings->aucSSID,
3342 prConnSettings->ucSSIDLen);
3344 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3345 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3346 prAisBssInfo->u2AssocId = 0;
3348 //4 <1.4> Setup Channel, Band and Phy Attributes
3349 prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3350 prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3352 if (prAisBssInfo->eBand == BAND_2G4) {
3354 prAisBssInfo->ucPhyTypeSet =
3355 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3357 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3361 prAisBssInfo->ucPhyTypeSet =
3362 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3364 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3367 //4 <1.5> Setup MIB for current BSS
3368 prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3369 prAisBssInfo->ucDTIMPeriod = 0;
3370 prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3372 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3374 #if CFG_PRIVACY_MIGRATION
3375 if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
3376 prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
3377 prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3378 prAisBssInfo->fgIsProtection = TRUE;
3381 prAisBssInfo->fgIsProtection = FALSE;
3384 prAisBssInfo->fgIsProtection = FALSE;
3387 //3 <2> Update BSS_INFO_T common part
3388 ibssInitForAdHoc(prAdapter, prAisBssInfo);
3393 //4 <3.1> Setup channel and bandwidth
3394 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3396 //4 <3.2> use command packets to inform firmware
3397 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3399 //4 <3.3> enable beaconing
3400 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3402 //4 <3.4> Update AdHoc PM parameter
3403 nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3405 //3 <4> Set ACTIVE flag.
3406 prAisBssInfo->fgIsBeaconActivated = TRUE;
3407 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3409 //3 <5> Start IBSS Alone Timer
3410 cnmTimerStartTimer(prAdapter,
3411 &prAisFsmInfo->rIbssAloneTimer,
3412 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3416 } /* end of aisCreateIBSS() */
3419 /*----------------------------------------------------------------------------*/
3421 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3422 * the existing IBSS was found.
3424 * @param[in] prStaRec Pointer to the STA_RECORD_T
3428 /*----------------------------------------------------------------------------*/
3430 aisUpdateBssInfoForMergeIBSS (
3431 IN P_ADAPTER_T prAdapter,
3432 IN P_STA_RECORD_T prStaRec
3435 P_AIS_FSM_INFO_T prAisFsmInfo;
3436 P_BSS_INFO_T prAisBssInfo;
3437 P_CONNECTION_SETTINGS_T prConnSettings;
3438 P_BSS_DESC_T prBssDesc;
3439 //UINT_16 u2IELength;
3445 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3446 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3447 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3449 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3451 if (!prAisBssInfo->fgIsBeaconActivated) {
3453 //3 <1> Update BSS_INFO_T per Network Basis
3454 //4 <1.1> Setup Operation Mode
3455 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3457 //4 <1.2> Setup SSID
3458 COPY_SSID(prAisBssInfo->aucSSID,
3459 prAisBssInfo->ucSSIDLen,
3460 prConnSettings->aucSSID,
3461 prConnSettings->ucSSIDLen);
3463 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3464 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3465 prAisBssInfo->u2AssocId = 0;
3468 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3469 //4 <2.1> Setup Capability
3470 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
3472 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3473 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3474 prAisBssInfo->fgUseShortPreamble = TRUE;
3477 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3478 prAisBssInfo->fgUseShortPreamble = FALSE;
3481 // 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0.
3482 prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
3483 prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
3485 if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3486 prAisBssInfo->fgIsProtection= TRUE;
3489 prAisBssInfo->fgIsProtection = FALSE;
3492 //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3493 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3495 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3497 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3498 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3500 rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3501 prAisBssInfo->u2BSSBasicRateSet,
3502 prAisBssInfo->aucAllSupportedRates,
3503 &prAisBssInfo->ucAllSupportedRatesLen);
3505 //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3508 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3509 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3511 prBssDesc->fgIsConnecting = FALSE;
3512 prBssDesc->fgIsConnected = TRUE;
3514 //4 <4.1> Setup BSSID
3515 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3517 //4 <4.2> Setup Channel, Band
3518 prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3519 prAisBssInfo->eBand = prBssDesc->eBand;
3521 //4 <4.3> Setup MIB for current BSS
3522 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3523 prAisBssInfo->ucDTIMPeriod = 0;
3524 prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3526 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3529 // should never happen
3535 //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3537 UINT_8 ucLowestBasicRateIndex;
3539 if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3540 &ucLowestBasicRateIndex)) {
3542 if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3543 ucLowestBasicRateIndex = RATE_6M_INDEX;
3546 ucLowestBasicRateIndex = RATE_1M_INDEX;
3550 prAisBssInfo->ucHwDefaultFixedRateCode =
3551 aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3554 //4 <5.2> Setup channel and bandwidth
3555 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3557 //4 <5.3> use command packets to inform firmware
3558 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3560 //4 <5.4> enable beaconing
3561 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3563 //4 <5.5> Update AdHoc PM parameter
3564 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3566 //3 <6> Set ACTIVE flag.
3567 prAisBssInfo->fgIsBeaconActivated = TRUE;
3568 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3571 } /* end of aisUpdateBssInfoForMergeIBSS() */
3574 /*----------------------------------------------------------------------------*/
3576 * @brief This function will validate the Rx Probe Request Frame and then return
3577 * result to BSS to indicate if need to send the corresponding Probe Response
3578 * Frame if the specified conditions were matched.
3580 * @param[in] prAdapter Pointer to the Adapter structure.
3581 * @param[in] prSwRfb Pointer to SW RFB data structure.
3582 * @param[out] pu4ControlFlags Control flags for replying the Probe Response
3584 * @retval TRUE Reply the Probe Response
3585 * @retval FALSE Don't reply the Probe Response
3587 /*----------------------------------------------------------------------------*/
3589 aisValidateProbeReq (
3590 IN P_ADAPTER_T prAdapter,
3591 IN P_SW_RFB_T prSwRfb,
3592 OUT PUINT_32 pu4ControlFlags
3595 P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
3596 P_BSS_INFO_T prBssInfo;
3597 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
3600 UINT_16 u2Offset = 0;
3601 BOOLEAN fgReplyProbeResp = FALSE;
3605 ASSERT(pu4ControlFlags);
3607 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3609 //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
3610 prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
3612 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3613 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3615 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3616 if (ELEM_ID_SSID == IE_ID(pucIE)) {
3618 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3619 prIeSsid = (P_IE_SSID_T)pucIE;
3623 } /* end of IE_FOR_EACH */
3625 //4 <2> Check network conditions
3627 if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3630 ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
3631 EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
3632 prIeSsid->aucSSID, prIeSsid->ucLength)) ) {
3633 fgReplyProbeResp = TRUE;
3637 return fgReplyProbeResp;
3639 } /* end of aisValidateProbeReq() */
3641 #endif /* CFG_SUPPORT_ADHOC */
3643 /*----------------------------------------------------------------------------*/
3645 * @brief This function will modify and update necessary information to firmware
3646 * for disconnection handling
3648 * @param[in] prAdapter Pointer to the Adapter structure.
3652 /*----------------------------------------------------------------------------*/
3655 IN P_ADAPTER_T prAdapter,
3656 IN BOOLEAN fgDelayIndication
3659 P_BSS_INFO_T prAisBssInfo;
3663 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3665 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3667 #if CFG_SUPPORT_ADHOC
3668 if (prAisBssInfo->fgIsBeaconActivated) {
3669 nicUpdateBeaconIETemplate(prAdapter,
3670 IE_UPD_METHOD_DELETE_ALL,
3671 NETWORK_TYPE_AIS_INDEX,
3676 prAisBssInfo->fgIsBeaconActivated = FALSE;
3680 rlmBssAborted(prAdapter, prAisBssInfo);
3682 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3683 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3685 if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3686 scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3688 /* remove from scanning results as well */
3689 wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3691 /* trials for re-association */
3692 if (fgDelayIndication) {
3693 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3694 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3698 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3701 if (fgDelayIndication) {
3702 if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3703 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3707 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3711 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3715 //4 <4> Change Media State immediately.
3716 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3718 //4 <4.1> sync. with firmware
3719 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3721 if (!fgDelayIndication) {
3722 //4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have.
3723 if (prAisBssInfo->prStaRecOfAP) {
3724 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3726 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3730 #if CFG_SUPPORT_ROAMING
3731 roamingFsmRunEventAbort(prAdapter);
3733 /* clear pending roaming connection request */
3734 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
3735 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
3736 #endif /* CFG_SUPPORT_ROAMING */
3738 //4 <6> Indicate Disconnected Event to Host
3739 aisIndicationOfMediaStateToHost(prAdapter,
3740 PARAM_MEDIA_STATE_DISCONNECTED,
3744 //4 <7> Trigger AIS FSM
3745 aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3748 } /* end of aisFsmDisconnect() */
3751 /*----------------------------------------------------------------------------*/
3753 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3755 * @param[in] u4Param Unused timer parameter
3759 /*----------------------------------------------------------------------------*/
3761 aisFsmRunEventBGSleepTimeOut (
3762 IN P_ADAPTER_T prAdapter,
3766 P_AIS_FSM_INFO_T prAisFsmInfo;
3767 ENUM_AIS_STATE_T eNextState;
3769 DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3771 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3773 eNextState = prAisFsmInfo->eCurrentState;
3775 switch (prAisFsmInfo->eCurrentState) {
3776 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
3777 DBGLOG(AIS, LOUD, ("EVENT - SCAN TIMER: Idle End - Current Time = %ld\n", kalGetTimeTick()));
3779 eNextState = AIS_STATE_LOOKING_FOR;
3781 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3789 /* Call aisFsmSteps() when we are going to change AIS STATE */
3790 if (eNextState != prAisFsmInfo->eCurrentState) {
3791 aisFsmSteps(prAdapter, eNextState);
3795 } /* end of aisFsmBGSleepTimeout() */
3798 /*----------------------------------------------------------------------------*/
3800 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3802 * @param[in] u4Param Unused timer parameter
3806 /*----------------------------------------------------------------------------*/
3808 aisFsmRunEventIbssAloneTimeOut (
3809 IN P_ADAPTER_T prAdapter,
3813 P_AIS_FSM_INFO_T prAisFsmInfo;
3814 ENUM_AIS_STATE_T eNextState;
3816 DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3818 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3819 eNextState = prAisFsmInfo->eCurrentState;
3821 switch(prAisFsmInfo->eCurrentState) {
3822 case AIS_STATE_IBSS_ALONE:
3824 /* There is no one participate in our AdHoc during this TIMEOUT Interval
3825 * so go back to search for a valid IBSS again.
3828 DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3830 prAisFsmInfo->fgTryScan = TRUE;
3833 aisFsmReleaseCh(prAdapter);
3835 /* Pull back to SEARCH to find candidate again */
3836 eNextState = AIS_STATE_SEARCH;
3845 /* Call aisFsmSteps() when we are going to change AIS STATE */
3846 if (eNextState != prAisFsmInfo->eCurrentState) {
3847 aisFsmSteps(prAdapter, eNextState);
3851 } /* end of aisIbssAloneTimeOut() */
3854 /*----------------------------------------------------------------------------*/
3856 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3858 * @param[in] u4Param Unused timer parameter
3862 /*----------------------------------------------------------------------------*/
3864 aisFsmRunEventJoinTimeout (
3865 IN P_ADAPTER_T prAdapter,
3869 P_AIS_FSM_INFO_T prAisFsmInfo;
3870 ENUM_AIS_STATE_T eNextState;
3872 DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3874 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3875 eNextState = prAisFsmInfo->eCurrentState;
3877 switch(prAisFsmInfo->eCurrentState) {
3878 case AIS_STATE_JOIN:
3879 DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
3881 /* 1. Do abort JOIN */
3882 aisFsmStateAbort_JOIN(prAdapter);
3884 /* 2. Increase Join Failure Count */
3885 prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
3887 if(prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
3888 /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
3889 eNextState = AIS_STATE_SEARCH;
3892 /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
3893 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
3897 case AIS_STATE_NORMAL_TR:
3898 /* 1. release channel */
3899 aisFsmReleaseCh(prAdapter);
3900 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
3902 /* 2. process if there is pending scan */
3903 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
3904 wlanClearScanningResult(prAdapter);
3905 eNextState = AIS_STATE_ONLINE_SCAN;
3911 /* release channel */
3912 aisFsmReleaseCh(prAdapter);
3918 /* Call aisFsmSteps() when we are going to change AIS STATE */
3919 if (eNextState != prAisFsmInfo->eCurrentState) {
3920 aisFsmSteps(prAdapter, eNextState);
3924 } /* end of aisFsmRunEventJoinTimeout() */
3927 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
3928 /*----------------------------------------------------------------------------*/
3936 /*----------------------------------------------------------------------------*/
3942 P_MSG_AIS_ABORT_T prAisAbortMsg;
3943 P_CONNECTION_SETTINGS_T prConnSettings;
3944 UINT_8 aucSSID[]="pci-11n";
3947 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3949 /* Set Connection Request Issued Flag */
3950 prConnSettings->fgIsConnReqIssued = TRUE;
3951 prConnSettings->ucSSIDLen = ucSSIDLen;
3952 kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
3954 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
3955 if (!prAisAbortMsg) {
3957 ASSERT(0); // Can't trigger SCAN FSM
3961 prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
3963 mboxSendMsg(prAdapter,
3965 (P_MSG_HDR_T) prAisAbortMsg,
3966 MSG_SEND_METHOD_BUF);
3968 wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
3972 #endif /* CFG_TEST_MGMT_FSM */
3975 /*----------------------------------------------------------------------------*/
3977 * \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN
3979 * \param[in] prAdapter Pointer of ADAPTER_T
3980 * \param[in] prSsid Pointer of SSID_T if specified
3981 * \param[in] pucIe Pointer to buffer of extra information elements to be attached
3982 * \param[in] u4IeLength Length of information elements
3986 /*----------------------------------------------------------------------------*/
3989 IN P_ADAPTER_T prAdapter,
3990 IN P_PARAM_SSID_T prSsid,
3992 IN UINT_32 u4IeLength
3995 P_CONNECTION_SETTINGS_T prConnSettings;
3996 P_BSS_INFO_T prAisBssInfo;
3997 P_AIS_FSM_INFO_T prAisFsmInfo;
3999 DEBUGFUNC("aisFsmScanRequest()");
4002 ASSERT(u4IeLength <= MAX_IE_LENGTH);
4004 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4005 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4006 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4008 if (!prConnSettings->fgIsScanReqIssued) {
4009 prConnSettings->fgIsScanReqIssued = TRUE;
4011 if(prSsid == NULL) {
4012 prAisFsmInfo->ucScanSSIDLen = 0;
4015 COPY_SSID(prAisFsmInfo->aucScanSSID,
4016 prAisFsmInfo->ucScanSSIDLen,
4018 (UINT_8)prSsid->u4SsidLen);
4021 if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4022 prAisFsmInfo->u4ScanIELength = u4IeLength;
4024 kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4025 DBGLOG(AIS, WARN, ("u4IeLength in aisFsmScanRequest is: %d\n",u4IeLength));
4028 prAisFsmInfo->u4ScanIELength = 0;
4031 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
4032 if(prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
4033 && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
4034 // 802.1x might not finished yet, pend it for later handling ..
4035 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4038 if(prAisFsmInfo->fgIsChannelGranted == TRUE) {
4039 DBGLOG(AIS, WARN, ("Scan Request with channel granted for join operation: %d, %d",
4040 prAisFsmInfo->fgIsChannelGranted,
4041 prAisFsmInfo->fgIsChannelRequested));
4044 /* start online scan */
4045 wlanClearScanningResult(prAdapter);
4046 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4049 else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4050 wlanClearScanningResult(prAdapter);
4051 aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4054 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4058 DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4062 } /* end of aisFsmScanRequest() */
4065 /*----------------------------------------------------------------------------*/
4067 * \brief This function is invoked when CNM granted channel privilege
4069 * \param[in] prAdapter Pointer of ADAPTER_T
4073 /*----------------------------------------------------------------------------*/
4075 aisFsmRunEventChGrant (
4076 IN P_ADAPTER_T prAdapter,
4077 IN P_MSG_HDR_T prMsgHdr
4080 P_BSS_INFO_T prAisBssInfo;
4081 P_AIS_FSM_INFO_T prAisFsmInfo;
4082 P_MSG_CH_GRANT_T prMsgChGrant;
4084 UINT_32 u4GrantInterval;
4089 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4090 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4091 prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4093 ucTokenID = prMsgChGrant->ucTokenID;
4094 u4GrantInterval = prMsgChGrant->u4GrantInterval;
4096 /* 1. free message */
4097 cnmMemFree(prAdapter, prMsgHdr);
4099 if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4100 prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4101 /* 2. channel privilege has been approved */
4102 prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4104 /* 3. state transition to join/ibss-alone/ibss-merge */
4105 /* 3.1 set timeout timer in cases join could not be completed */
4106 cnmTimerStartTimer(prAdapter,
4107 &prAisFsmInfo->rJoinTimeoutTimer,
4108 prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
4109 /* 3.2 set local variable to indicate join timer is ticking */
4110 prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
4112 /* 3.3 switch to join state */
4113 aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4115 prAisFsmInfo->fgIsChannelGranted = TRUE;
4117 else { /* mismatched grant */
4118 /* 2. return channel privilege to CNM immediately */
4119 aisFsmReleaseCh(prAdapter);
4123 } /* end of aisFsmRunEventChGrant() */
4126 /*----------------------------------------------------------------------------*/
4128 * \brief This function is to inform CNM that channel privilege
4131 * \param[in] prAdapter Pointer of ADAPTER_T
4135 /*----------------------------------------------------------------------------*/
4138 IN P_ADAPTER_T prAdapter
4141 P_AIS_FSM_INFO_T prAisFsmInfo;
4142 P_MSG_CH_ABORT_T prMsgChAbort;
4146 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4148 if(prAisFsmInfo->fgIsChannelGranted == TRUE
4149 || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4151 prAisFsmInfo->fgIsChannelRequested = FALSE;
4152 prAisFsmInfo->fgIsChannelGranted = FALSE;
4154 /* 1. return channel privilege to CNM immediately */
4155 prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
4156 if (!prMsgChAbort) {
4157 ASSERT(0); // Can't release Channel to CNM
4161 prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
4162 prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
4163 prMsgChAbort->ucTokenID = prAisFsmInfo->ucSeqNumOfChReq;
4165 mboxSendMsg(prAdapter,
4167 (P_MSG_HDR_T) prMsgChAbort,
4168 MSG_SEND_METHOD_BUF);
4172 } /* end of aisFsmReleaseCh() */
4175 /*----------------------------------------------------------------------------*/
4177 * \brief This function is to inform AIS that corresponding beacon has not
4178 * been received for a while and probing is not successful
4180 * \param[in] prAdapter Pointer of ADAPTER_T
4184 /*----------------------------------------------------------------------------*/
4186 aisBssBeaconTimeout (
4187 IN P_ADAPTER_T prAdapter
4190 P_BSS_INFO_T prAisBssInfo;
4191 BOOLEAN fgDoAbortIndication = FALSE;
4195 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4197 //4 <1> Diagnose Connection for Beacon Timeout Event
4198 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4199 if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
4200 P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
4203 fgDoAbortIndication = TRUE;
4206 else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4207 fgDoAbortIndication = TRUE;
4211 //4 <2> invoke abort handler
4212 if (fgDoAbortIndication) {
4213 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4217 } /* end of aisBssBeaconTimeout() */
4220 /*----------------------------------------------------------------------------*/
4222 * \brief This function is to inform AIS that DEAUTH frame has been
4223 * sent and thus state machine could go ahead
4225 * \param[in] prAdapter Pointer of ADAPTER_T
4226 * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
4227 * \param[in] prAdapter Pointer of ADAPTER_T
4229 * \return WLAN_STATUS_SUCCESS
4231 /*----------------------------------------------------------------------------*/
4233 aisDeauthXmitComplete (
4234 IN P_ADAPTER_T prAdapter,
4235 IN P_MSDU_INFO_T prMsduInfo,
4236 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
4239 P_AIS_FSM_INFO_T prAisFsmInfo;
4243 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4245 if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4246 if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4247 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4251 DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4254 return WLAN_STATUS_SUCCESS;
4256 } /* end of aisDeauthXmitComplete() */
4258 #if CFG_SUPPORT_ROAMING
4259 /*----------------------------------------------------------------------------*/
4261 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4263 * @param[in] u4ReqScan Requesting Scan or not
4267 /*----------------------------------------------------------------------------*/
4269 aisFsmRunEventRoamingDiscovery (
4270 IN P_ADAPTER_T prAdapter,
4274 P_AIS_FSM_INFO_T prAisFsmInfo;
4275 P_CONNECTION_SETTINGS_T prConnSettings;
4276 ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4278 DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4280 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4281 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4283 /* search candidates by best rssi */
4284 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4286 /* results are still new */
4288 roamingFsmRunEventRoam(prAdapter);
4289 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4292 if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4293 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4294 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4297 eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4301 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
4302 if(eAisRequest == AIS_REQUEST_ROAMING_SEARCH) {
4303 aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
4306 aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4310 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4311 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4313 aisFsmInsertRequest(prAdapter, eAisRequest);
4317 } /* end of aisFsmRunEventRoamingDiscovery() */
4319 /*----------------------------------------------------------------------------*/
4321 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4327 /*----------------------------------------------------------------------------*/
4329 aisFsmRoamingScanResultsUpdate (
4330 IN P_ADAPTER_T prAdapter
4333 P_AIS_FSM_INFO_T prAisFsmInfo;
4334 P_ROAMING_INFO_T prRoamingFsmInfo;
4335 ENUM_AIS_STATE_T eNextState;
4337 DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4339 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4340 prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4342 roamingFsmScanResultsUpdate(prAdapter);
4344 eNextState = prAisFsmInfo->eCurrentState;
4345 if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4346 roamingFsmRunEventRoam(prAdapter);
4347 eNextState = AIS_STATE_SEARCH;
4349 else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4350 eNextState = AIS_STATE_SEARCH;
4352 else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4353 eNextState = AIS_STATE_NORMAL_TR;
4357 } /* end of aisFsmRoamingScanResultsUpdate() */
4359 /*----------------------------------------------------------------------------*/
4361 * @brief This function will modify and update necessary information to firmware
4362 * for disconnection of last AP before switching to roaming bss.
4364 * @param IN prAdapter Pointer to the Adapter structure.
4365 * prTargetStaRec Target of StaRec of roaming
4369 /*----------------------------------------------------------------------------*/
4371 aisFsmRoamingDisconnectPrevAP (
4372 IN P_ADAPTER_T prAdapter,
4373 IN P_STA_RECORD_T prTargetStaRec
4376 P_BSS_INFO_T prAisBssInfo;
4378 DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4382 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4384 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4386 /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
4387 * to be reset. RLM related parameters will be reset again when handling
4388 * association response in rlmProcessAssocRsp(). 20110413
4390 //rlmBssAborted(prAdapter, prAisBssInfo);
4392 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
4393 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4394 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
4397 //4 <4> Change Media State immediately.
4398 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4400 //4 <4.1> sync. with firmware
4401 prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */
4402 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
4403 prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */
4406 } /* end of aisFsmRoamingDisconnectPrevAP() */
4408 /*----------------------------------------------------------------------------*/
4410 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4411 * the roaming was completed.
4413 * @param IN prAdapter Pointer to the Adapter structure.
4414 * prStaRec StaRec of roaming AP
4419 /*----------------------------------------------------------------------------*/
4421 aisUpdateBssInfoForRoamingAP (
4422 IN P_ADAPTER_T prAdapter,
4423 IN P_STA_RECORD_T prStaRec,
4424 IN P_SW_RFB_T prAssocRspSwRfb
4427 P_BSS_INFO_T prAisBssInfo;
4429 DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4433 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4435 //4 <1.1> Change FW's Media State immediately.
4436 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4438 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
4439 if ((prAisBssInfo->prStaRecOfAP) &&
4440 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
4441 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
4442 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
4445 //4 <1.3> Update BSS_INFO_T
4446 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4448 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4449 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4451 //4 <1.6> Indicate Connected Event to Host immediately.
4452 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
4453 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
4456 } /* end of aisFsmRoamingUpdateBss() */
4458 #endif /* CFG_SUPPORT_ROAMING */
4461 /*----------------------------------------------------------------------------*/
4463 * @brief Check if there is any pending request and remove it (optional)
4472 /*----------------------------------------------------------------------------*/
4474 aisFsmIsRequestPending (
4475 IN P_ADAPTER_T prAdapter,
4476 IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4480 P_AIS_FSM_INFO_T prAisFsmInfo;
4481 P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4484 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4486 /* traverse through pending request list */
4487 LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4488 prPendingReqHdrNext,
4489 &(prAisFsmInfo->rPendingReqList),
4492 /* check for specified type */
4493 if(prPendingReqHdr->eReqType == eReqType) {
4494 /* check if need to remove */
4495 if(bRemove == TRUE) {
4496 LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList), &(prPendingReqHdr->rLinkEntry));
4498 cnmMemFree(prAdapter, prPendingReqHdr);
4509 /*----------------------------------------------------------------------------*/
4511 * @brief Get next pending request
4515 * @return P_AIS_REQ_HDR_T
4517 /*----------------------------------------------------------------------------*/
4519 aisFsmGetNextRequest (
4520 IN P_ADAPTER_T prAdapter
4523 P_AIS_FSM_INFO_T prAisFsmInfo;
4524 P_AIS_REQ_HDR_T prPendingReqHdr;
4527 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4529 LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4531 return prPendingReqHdr;
4535 /*----------------------------------------------------------------------------*/
4537 * @brief Insert a new request
4545 /*----------------------------------------------------------------------------*/
4547 aisFsmInsertRequest (
4548 IN P_ADAPTER_T prAdapter,
4549 IN ENUM_AIS_REQUEST_TYPE_T eReqType
4552 P_AIS_REQ_HDR_T prAisReq;
4553 P_AIS_FSM_INFO_T prAisFsmInfo;
4556 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4558 prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4561 ASSERT(0); // Can't generate new message
4565 prAisReq->eReqType = eReqType;
4567 /* attach request into pending request list */
4568 LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4574 /*----------------------------------------------------------------------------*/
4576 * @brief Flush all pending requests
4582 /*----------------------------------------------------------------------------*/
4584 aisFsmFlushRequest (
4585 IN P_ADAPTER_T prAdapter
4588 P_AIS_REQ_HDR_T prAisReq;
4592 while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4593 cnmMemFree(prAdapter, prAisReq);