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 ** [ALPS00382763] N820_JB:[WIFI]N820JB WLAN ±K???,«ÝÉó?¬y¥\¯Ó¤j
18 ** do not try reconnecting when being disconnected by the peer
21 * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
25 * [MT6620 Wi-Fi][Driver] API and behavior modification for preferred band configuration with corresponding network configuration
26 * add wlanSetPreferBandByNetwork() for glue layer to invoke for setting preferred band configuration corresponding to network type.
29 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
30 * Adjust code for DBG and CONFIG_XLOG.
33 * [WCXRP00001120] [MT6620 Wi-Fi][Driver] Modify roaming to AIS state transition from synchronous to asynchronous approach to avoid incomplete state termination
34 * 1. change RDD related compile option brace position.
35 * 2. when roaming is triggered, ask AIS to transit immediately only when AIS is in Normal TR state without join timeout timer ticking
36 * 3. otherwise, insert AIS_REQUEST into pending request queue
39 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
40 * modify the xlog related code.
43 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
44 * correct reference to BSSID field in Association-Response frame.
47 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
48 * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
49 * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework
52 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
53 * adding the code for XLOG.
55 * 10 26 2011 tsaiyuan.hsu
56 * [WCXRP00001064] [MT6620 Wi-Fi][DRV]] add code with roaming awareness when disconnecting AIS network
57 * be aware roaming when disconnecting AIS network.
60 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
61 * STA_REC shall be NULL for Beacon's MSDU
64 * [MT6620 Wi-Fi][Driver] Reduce join failure count limit to 2 for faster re-join for other BSS
65 * 1. short join failure count limit to 2
66 * 2. treat join timeout as kind of join failure as well
69 * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
70 * adding the 802.11w related function and define .
73 * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
76 * 09 20 2011 tsaiyuan.hsu
77 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
78 * change window registry of driver for roaming.
81 * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
82 * Handle client mode about preamble type and slot time
84 * 09 08 2011 tsaiyuan.hsu
85 * [WCXRP00000972] [MT6620 Wi-Fi][DRV]] check if roaming occurs after join failure to avoid state incosistence.
86 * check if roaming occurs after join failure to avoid deactivation of network.
88 * 08 24 2011 chinghwa.yu
89 * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
90 * Update RDD test mode cases.
92 * 08 16 2011 tsaiyuan.hsu
93 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
94 * EnableRoaming in registry is deprecated.
96 * 08 16 2011 tsaiyuan.hsu
97 * [WCXRP00000931] [MT5931 Wi-Fi][DRV/FW] add swcr to disable roaming from driver
98 * use registry to enable or disable roaming.
101 * [WCXRP00000840] [MT6620 Wi-Fi][Driver][AIS] Stop timer for joining when channel is released due to join failure count exceeding limit
102 * stop timer when joining operation is failed due to try count exceeds limitation
105 * [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
106 * do not handle SCAN request immediately after connected to increase the probability of receiving 1st beacon frame.
109 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
110 * change parameter name from PeerAddr to BSSID
113 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
114 * 1. specify target's BSSID when requesting channel privilege.
115 * 2. pass BSSID information to firmware domain
118 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
119 * ensure DEAUTH is always sent before establish a new connection
122 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
123 * typo fix: a right brace is missed.
126 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
127 * When RECONNECT request is identified as disconnected, it is necessary to check for pending scan request.
130 * [WCXRP00000757] [MT6620 Wi-Fi][Driver][SCN] take use of RLM API to filter out BSS in disallowed channels
131 * mark fgIsTransition as TRUE for state rolling.
134 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
135 * always check for pending scan after switched into NORMAL_TR state.
138 * [WCXRP00000782] [MT6620 Wi-Fi][AIS] Treat connection at higher priority over scanning to avoid WZC connection timeout
139 * always treat connection request at higher priority over scanning request
141 * 06 09 2011 tsaiyuan.hsu
142 * [WCXRP00000760] [MT5931 Wi-Fi][FW] Refine rxmHandleMacRxDone to reduce code size
143 * move send_auth at rxmHandleMacRxDone in firmware to driver to reduce code size.
146 * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
147 * eliminate unused parameters for SAA-FSM
150 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
151 * change SCAN handling behavior when followed by a CONNECT/DISCONNECT requests by pending instead of dropping.
154 * [WCXRP00000732] [MT6620 Wi-Fi][AIS] No need to switch back to IDLE state when DEAUTH frame is dropped due to bss disconnection
155 * when TX DONE status is TX_RESULT_DROPPED_IN_DRIVER, no need to switch back to IDLE state.
157 * 04 14 2011 cm.chang
158 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
161 * 04 13 2011 george.huang
162 * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
166 * [WCXRP00000575] [MT6620 Wi-Fi][Driver][AIS] reduce memory usage when generating mailbox message for scan request
167 * when there is no IE needed for probe request, then request a smaller memory for mailbox message
169 * 03 17 2011 chinglan.wang
170 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
173 * 03 17 2011 chinglan.wang
174 * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
177 * 03 16 2011 tsaiyuan.hsu
178 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
179 * remove obsolete definition and unused variables.
182 * [WCXRP00000535] [MT6620 Wi-Fi][Driver] Fixed channel operation when AIS and Tethering are operating concurrently
183 * When fixed channel operation is necessary, AIS-FSM would scan and only connect for BSS on the specific channel
185 * 03 09 2011 tsaiyuan.hsu
186 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
187 * avoid clearing fgIsScanReqIssued so as to add scan results.
189 * 03 07 2011 terry.wu
190 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
191 * Toggle non-standard debug messages to comments.
193 * 03 04 2011 tsaiyuan.hsu
194 * [WCXRP00000517] [MT6620 Wi-Fi][Driver][FW] Fine Tune Performance of Roaming
195 * reset retry conter of attemp to connect to ap after completion of join.
198 * [WCXRP00000515] [MT6620 Wi-Fi][Driver] Surpress compiler warning which is identified by GNU compiler collection
199 * surpress compile warning occured when compiled by GNU compiler collection.
202 * [WCXRP00000503] [MT6620 Wi-Fi][Driver] Take RCPI brought by association response as initial RSSI right after connection is built.
203 * use RCPI brought by ASSOC-RESP after connection is built as initial RCPI to avoid using a uninitialized MAC-RX RCPI.
205 * 02 26 2011 tsaiyuan.hsu
206 * [WCXRP00000391] [MT6620 Wi-Fi][FW] Add Roaming Support
207 * not send disassoc or deauth to leaving AP so as to improve performace of roaming.
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 * when handling reconnect request, set fgTryScan as TRUE
214 * [WCXRP00000487] [MT6620 Wi-Fi][Driver][AIS] Serve scan and connect request with a queue-based approach to improve response time for scanning request
215 * handle SCAN and RECONNECT with a FIFO approach.
217 * 02 09 2011 tsaiyuan.hsu
218 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
219 * Check if prRegInfo is null or not before initializing roaming parameters.
222 * [WCXRP00000416] [MT6620 Wi-Fi][Driver] treat "unable to find BSS" as connection trial to prevent infinite reconnection trials
223 * treat "unable to find BSS" as connection trial to prevent infinite reconnection trials.
225 * 01 27 2011 tsaiyuan.hsu
226 * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
228 * 1. not support 11r, only use strength of signal to determine roaming.
229 * 2. not enable CFG_SUPPORT_ROAMING until completion of full test.
230 * 3. in 6620, adopt work-around to avoid sign extension problem of cck of hw
231 * 4. assume that change of link quality in smooth way.
233 * 01 26 2011 yuche.tsai
234 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
237 * 01 25 2011 yuche.tsai
238 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
239 * Fix Compile Error when DBG is disabled.
241 * 01 25 2011 yuche.tsai
242 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
243 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
246 * [WCXRP00000359] [MT6620 Wi-Fi][Driver] add an extra state to ensure DEAUTH frame is always sent
247 * Add an extra state to guarantee DEAUTH frame is sent then connect to new BSS.
248 * This change is due to WAPI AP needs DEAUTH frame as a necessary step in handshaking protocol.
251 * [WCXRP00000307] [MT6620 Wi-Fi][SQA]WHQL test .2c_wlan_adhoc case fail.
252 * [IBSS] when merged in, the bss state should be updated to firmware to pass WHQL adhoc failed item
255 * [WCXRP00000351] [MT6620 Wi-Fi][Driver] remove from scanning result in OID handling layer when the corresponding BSS is disconnected due to beacon timeout
256 * remove from scanning result when the BSS is disconnected due to beacon timeout.
259 * [WCXRP00000337] [MT6620 Wi-FI][Driver] AIS-FSM not to invoke cnmStaRecResetStatus directly 'cause it frees all belonging STA-RECs
260 * do not invoke cnmStaRecResetStatus() directly, nicUpdateBss will do the things after bss is disconnected
263 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
264 * do not need to manipulate prStaRec after indicating BSS disconnection to firmware, 'cause all STA-RECs belongs to BSS has been freed already
267 * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
268 * add DEBUGFUNC() macro invoking for more detailed debugging information
270 * 12 23 2010 george.huang
271 * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
272 * 1. update WMM IE parsing, with ASSOC REQ handling
273 * 2. extend U-APSD parameter passing from driver to FW
276 * [WCXRP00000270] [MT6620 Wi-Fi][Driver] Clear issues after concurrent networking support has been merged
277 * before BSS disconnection is indicated to firmware, all correlated peer should be cleared and freed
279 * 12 07 2010 cm.chang
280 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
281 * 1. BSSINFO include RLM parameter
282 * 2. free all sta records when network is disconnected
284 * 11 25 2010 yuche.tsai
286 * Update SLT Function for QoS Support and not be affected by fixed rate function.
289 * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
290 * add scanning with specified SSID facility to AIS-FSM
293 * [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
294 * 1) Query link speed (TX rate) from firmware directly with buffering mechanism to reduce overhead
295 * 2) Remove CNM CH-RECOVER event handling
296 * 3) cfg read/write API renamed with kal prefix for unified naming rules.
299 * [WCXRP00000056] [MT6620 Wi-Fi][Driver] NVRAM implementation with Version Check[WCXRP00000137] [MT6620 Wi-Fi] [FW] Support NIC capability query command
300 * 1) update NVRAM content template to ver 1.02
301 * 2) add compile option for querying NIC capability (default: off)
302 * 3) modify AIS 5GHz support to run-time option, which could be turned on by registry or NVRAM setting
303 * 4) correct auto-rate compiler error under linux (treat warning as error)
304 * 5) simplify usage of NVRAM and REG_INFO_T
305 * 6) add version checking between driver and firmware
308 * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
309 * initial the fgIsChannelExt value.
312 * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
313 * correct erroneous logic: specifying eBand with incompatible eSco
316 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
317 * remove ENUM_NETWORK_TYPE_T definitions
319 * 09 27 2010 chinghwa.yu
320 * [WCXRP00000063] Update BCM CoEx design and settings[WCXRP00000065] Update BoW design and settings
321 * Update BCM/BoW design and settings.
324 * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
325 * keep IBSS-ALONE state retrying until further instruction is received
328 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
329 * Do a complete reset with STA-REC null checking for RF test re-entry
331 * 09 09 2010 yuche.tsai
333 * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
334 * Both in IBSS Create & IBSS Merge
338 * frequency is in unit of KHz thus no need to divide 1000 once more.
342 * 1) initialize for correct parameter even for disassociation.
343 * 2) AIS-FSM should have a limit on trials to build connection
345 * 09 03 2010 kevin.huang
347 * Refine #include sequence and solve recursive/nested #include issue
351 * eliminate klockwork errors
353 * 08 29 2010 yuche.tsai
355 * Finish SLT TX/RX & Rate Changing Support.
359 * add option for enabling AIS 5GHz scan
363 * [AIS-FSM] IBSS no longer needs to acquire channel for beaconing, RLM/CNM will handle the channel switching when BSS information is updated
365 * 08 25 2010 george.huang
367 * update OID/ registry control path for PM related settings
369 * 08 24 2010 cm.chang
371 * Support RLM initail channel of Ad-hoc, P2P and BOW
373 * 08 20 2010 cm.chang
375 * Migrate RLM code to host from FW
379 * check-in missed files.
381 * 08 12 2010 kevin.huang
383 * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
387 * reset fgIsScanReqIssued when abort request is received right after join completion.
391 * surpress compilation warning.
395 * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
399 * 1) BoW wrapper: use definitions instead of hard-coded constant for error code
400 * 2) AIS-FSM: eliminate use of desired RF parameters, use prTargetBssDesc instead
401 * 3) add handling for RX_PKT_DESTINATION_HOST_WITH_FORWARD for GO-broadcast frames
405 * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
409 * allocate on MGMT packet for IBSS beaconing.
413 * [AIS-FSM] fix: when join failed, release channel privilege as well
417 * reuse join-abort sub-procedure to reduce code size.
421 * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
422 * 2) change nicMediaStateChange() API prototype
426 * AIS-FSM: when scan request is coming in the 1st 5 seconds of channel privilege period, just pend it til 5-sec. period finishes
430 * AIS-FSM FIX: return channel privilege even when the privilege is not granted yet
431 * QM: qmGetFrameAction() won't assert when corresponding STA-REC index is not found
435 * re-commit code logic being overwriten.
439 * .support the Wi-Fi RSN
443 * 1) re-enable AIS-FSM beacon timeout handling.
444 * 2) scan done API revised
449 * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
453 * indicate scan done for linux wireless extension
457 * add AIS-FSM handling for beacon timeout event.
461 * 1) refine AIS-FSM indent.
462 * 2) when entering RF Test mode, flush 802.1X frames as well
463 * 3) when entering D3 state, flush 802.1X frames as well
467 * separate AIS-FSM states into different cases of channel request.
471 * 1) change BG_SCAN to ONLINE_SCAN for consistent term
472 * 2) only clear scanning result when scan is permitted to do
476 * 1) [AIS] when new scan is issued, clear currently available scanning result except the connected one
477 * 2) refine disconnection behaviour when issued during BG-SCAN process
481 * 1) bugfix: do not stop timer for join after switched into normal_tr state, for providing chance for DHCP handshasking
482 * 2) modify rsnPerformPolicySelection() invoking
486 * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
491 * update for security supporting.
495 * [WPD00003833] [MT6620 and MT5931] Driver migration.
496 * when IBSS is being merged-in, send command packet to PM for connected indication
500 * [WPD00003833] [MT6620 and MT5931] Driver migration.
501 * Add Ad-Hoc support to AIS-FSM
503 * 07 19 2010 jeffrey.chang
505 * Linux port modification
509 * [WPD00003833] [MT6620 and MT5931] Driver migration.
510 * bugfix for SCN migration
511 * 1) modify QUEUE_CONCATENATE_QUEUES() so it could be used to concatence with an empty queue
512 * 2) before AIS issues scan request, network(BSS) needs to be activated first
513 * 3) only invoke COPY_SSID when using specified SSID for scan
517 * [WPD00003833] [MT6620 and MT5931] Driver migration.
518 * for AIS scanning, driver specifies no extra IE for probe request
522 * [WPD00003833] [MT6620 and MT5931] Driver migration.
523 * driver no longer generates probe request frames
525 * 07 14 2010 yarco.yang
527 * Remove CFG_MQM_MIGRATION
531 * [WPD00003833] [MT6620 and MT5931] Driver migration.
532 * Refine AIS-FSM by divided into more states
534 * 07 13 2010 cm.chang
536 * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
540 * 1) separate AIS_FSM state for two kinds of scanning. (OID triggered scan, and scan-for-connection)
541 * 2) eliminate PRE_BSS_DESC_T, Beacon/PrebResp is now parsed in single pass
542 * 3) implment DRV-SCN module, currently only accepts single scan request, other request will be directly dropped by returning BUSY
544 * 07 09 2010 george.huang
546 * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
550 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
553 * [WPD00003833][MT6620 and MT5931] Driver migration
554 * take use of RLM module for parsing/generating HT IEs for 11n capability
556 * 07 08 2010 cm.chang
557 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
558 * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
561 * [WPD00003833][MT6620 and MT5931] Driver migration
562 * for first connection, if connecting failed do not enter into scan state.
565 * [WPD00003833][MT6620 and MT5931] Driver migration
566 * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
568 * 07 06 2010 george.huang
569 * [WPD00001556]Basic power managemenet function
570 * Update arguments for nicUpdateBeaconIETemplate()
573 * [WPD00003833][MT6620 and MT5931] Driver migration
574 * STA-REC is maintained by CNM only.
577 * [WPD00003833][MT6620 and MT5931] Driver migration
578 * remove unused definitions.
581 * [WPD00003833][MT6620 and MT5931] Driver migration
582 * AIS-FSM integration with CNM channel request messages
585 * [WPD00003833][MT6620 and MT5931] Driver migration
586 * implementation of DRV-SCN and related mailbox message handling.
589 * [WPD00003833][MT6620 and MT5931] Driver migration
590 * sync. with CMD/EVENT document ver0.07.
593 * [WPD00003833][MT6620 and MT5931] Driver migration
594 * 1) sync to. CMD/EVENT document v0.03
595 * 2) simplify DTIM period parsing in scan.c only, bss.c no longer parses it again.
596 * 3) send command packet to indicate FW-PM after
597 * a) 1st beacon is received after AIS has connected to an AP
598 * b) IBSS-ALONE has been created
599 * c) IBSS-MERGE has occured
602 * [WPD00003833][MT6620 and MT5931] Driver migration
603 * modify Beacon/ProbeResp to complete parsing,
604 * because host software has looser memory usage restriction
607 * [WPD00003833][MT6620 and MT5931] Driver migration
611 * [WPD00003833][MT6620 and MT5931] Driver migration
612 * comment out RLM APIs by CFG_RLM_MIGRATION.
615 * [WPD00003833][MT6620 and MT5931] Driver migration
616 * 1) add command warpper for STA-REC/BSS-INFO sync.
617 * 2) enhance command packet sending procedure for non-oid part
618 * 3) add command packet definitions for STA-REC/BSS-INFO sync.
620 * 06 21 2010 yarco.yang
621 * [WPD00003837][MT6620]Data Path Refine
622 * Support CFG_MQM_MIGRATION flag
625 * [WPD00003833][MT6620 and MT5931] Driver migration
626 * add scan_fsm into building.
629 * [WPD00003833][MT6620 and MT5931] Driver migration
630 * RSN/PRIVACY compilation flag awareness correction
632 * 06 18 2010 cm.chang
633 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
634 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
637 * [WPD00003840][MT6620 5931] Security migration
638 * migration from MT6620 firmware.
641 * [WPD00003833][MT6620 and MT5931] Driver migration
645 * [WPD00003833][MT6620 and MT5931] Driver migration
646 * restore utility function invoking via hem_mbox to direct calls
649 * [WPD00003833][MT6620 and MT5931] Driver migration
650 * auth.c is migrated.
653 * [WPD00003833][MT6620 and MT5931] Driver migration
657 * [WPD00003833][MT6620 and MT5931] Driver migration
658 * 1) migrate assoc.c.
659 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
660 * 3) add configuration options for CNM_MEM and RSN modules
661 * 4) add data path for management frames
662 * 5) eliminate rPacketInfo of MSDU_INFO_T
665 * [WPD00003833][MT6620 and MT5931] Driver migration
666 * change to enqueue TX frame infinitely.
669 * [WPD00003833][MT6620 and MT5931] Driver migration
670 * 1) eliminate CFG_CMD_EVENT_VERSION_0_9
671 * 2) when disconnected, indicate nic directly (no event is needed)
674 * [WPD00003833][MT6620 and MT5931] Driver migration
675 * add buildable & linkable ais_fsm.c
677 * related reference are still waiting to be resolved
679 * 06 01 2010 cm.chang
680 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
681 * Add conditionial compiling flag to choose default available bandwidth
683 * 05 28 2010 kevin.huang
684 * [BORA00000794][WIFISYS][New Feature]Power Management Support
685 * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
687 * 05 24 2010 kevin.huang
688 * [BORA00000794][WIFISYS][New Feature]Power Management Support
689 * Refine authSendAuthFrame() for NULL STA_RECORD_T case and minimum deauth interval.
691 * 05 21 2010 kevin.huang
692 * [BORA00000794][WIFISYS][New Feature]Power Management Support
693 * Fix compile error if CFG_CMD_EVENT_VER_009 == 0 for prEventConnStatus->ucNetworkType.
695 * 05 21 2010 kevin.huang
696 * [BORA00000794][WIFISYS][New Feature]Power Management Support
697 * Refine txmInitWtblTxRateTable() - set TX initial rate according to AP's operation rate set
699 * 05 17 2010 kevin.huang
700 * [BORA00000794][WIFISYS][New Feature]Power Management Support
701 * Call pmAbort() and add ucNetworkType field in EVENT_CONNECTION_STATUS
703 * 05 14 2010 kevin.huang
704 * [BORA00000794][WIFISYS][New Feature]Power Management Support
705 * Fix compile warning - define of MQM_WMM_PARSING was removed
707 * 05 12 2010 kevin.huang
708 * [BORA00000794][WIFISYS][New Feature]Power Management Support
709 * Add Power Management - Legacy PS-POLL support.
711 * 04 28 2010 tehuang.liu
712 * [BORA00000605][WIFISYS] Phase3 Integration
713 * Removed the use of compiling flag MQM_WMM_PARSING
715 * 04 27 2010 kevin.huang
716 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
720 * 04 27 2010 kevin.huang
721 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
722 * Add Set Slot Time and Beacon Timeout Support for AdHoc Mode
724 * 04 19 2010 kevin.huang
725 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
726 * Add Send Deauth for Class 3 Error and Leave Network Support
729 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
730 * fixed the protected bit at cap info for ad-hoc.
732 * 04 13 2010 kevin.huang
733 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
734 * Add new HW CH macro support
736 * 04 07 2010 chinghwa.yu
737 * [BORA00000563]Add WiFi CoEx BCM module
738 * Add TX Power Control RCPI function.
741 * [BORA00000605][WIFISYS] Phase3 Integration
742 * move the wlan table alloc / free to change state function.
745 * [BORA00000676][MT6620] Support the frequency setting and query at build connection / connection event
746 * modify the build connection and status event structure bu CMD_EVENT doc 0.09 draft, default is disable.
749 * [BORA00000605][WIFISYS] Phase3 Integration
750 * fixed some WHQL testing error.
752 * 03 24 2010 kevin.huang
753 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
754 * Add Set / Unset POWER STATE in AIS Network
756 * 03 16 2010 kevin.huang
757 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
760 * 03 10 2010 kevin.huang
761 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
762 * Add Channel Manager for arbitration of JOIN and SCAN Req
764 * 03 03 2010 kevin.huang
765 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
766 * Add PHY_CONFIG to change Phy Type
768 * 03 03 2010 chinghwa.yu
769 * [BORA00000563]Add WiFi CoEx BCM module
770 * Use bcmWiFiNotify to replace wifi_send_msg to pass infomation to BCM module.
772 * 03 03 2010 chinghwa.yu
773 * [BORA00000563]Add WiFi CoEx BCM module
774 * Remove wmt_task definition and add PTA function.
776 * 03 02 2010 tehuang.liu
777 * [BORA00000569][WIFISYS] Phase 2 Integration Test
778 * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
780 * 03 01 2010 tehuang.liu
781 * [BORA00000569][WIFISYS] Phase 2 Integration Test
782 * Modified aisUpdateBssInfo() to call TXM's functions for setting WTBL TX parameters
785 * [BORA00000605][WIFISYS] Phase3 Integration
786 * clear the pmkid cache while indicate media disconnect.
788 * 02 26 2010 tehuang.liu
789 * [BORA00000569][WIFISYS] Phase 2 Integration Test
792 * 02 26 2010 tehuang.liu
793 * [BORA00000569][WIFISYS] Phase 2 Integration Test
794 * Enabled MQM parsing WMM IEs for non-AP mode
796 * 02 26 2010 kevin.huang
797 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
798 * Remove CFG_TEST_VIRTUAL_CMD and add support of Driver STA_RECORD_T activation
801 * [BORA00000605][WIFISYS] Phase3 Integration
802 * use the Rx0 dor event indicate.
804 * 02 23 2010 kevin.huang
805 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
806 * Support dynamic channel selection
809 * [BORA00000621][MT6620 Wi-Fi] Add the RSSI indicate to avoid XP stalled for query rssi value
810 * Adding the RSSI event support, using the HAL function to get the rcpi value and tranlsate to RSSI and indicate to driver
812 * 02 12 2010 cm.chang
813 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
814 * Use bss info array for concurrent handle
816 * 02 05 2010 kevin.huang
817 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
818 * Revise data structure to share the same BSS_INFO_T for avoiding coding error
820 * 02 04 2010 kevin.huang
821 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
822 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
824 * 01 27 2010 tehuang.liu
825 * [BORA00000569][WIFISYS] Phase 2 Integration Test
826 * Set max AMDPU size supported by the peer to 64 KB, removed mqmInit() and mqmTxSendAddBaReq() function calls in aisUpdateBssInfo()
829 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
830 * add and fixed some security function.
832 * 01 22 2010 cm.chang
833 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
834 * Support protection and bandwidth switch
836 * 01 20 2010 kevin.huang
837 * [BORA00000569][WIFISYS] Phase 2 Integration Test
838 * Add PHASE_2_INTEGRATION_WORK_AROUND and CFG_SUPPORT_BCM flags
840 * 01 15 2010 tehuang.liu
841 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
842 * Configured the AMPDU factor to 3 for the APu1rwduu`wvpghlqg|q`mpdkb+ilp
844 * 01 14 2010 chinghwa.yu
845 * [BORA00000563]Add WiFi CoEx BCM module
846 * Add WiFi BCM module for the 1st time.
848 * 01 11 2010 kevin.huang
849 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
850 * Add Deauth and Disassoc Handler
852 * 01 07 2010 kevin.huang
853 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
854 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
856 * Refine JOIN Complete and seperate the function of Media State indication
858 * 01 04 2010 tehuang.liu
859 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
860 * For working out the first connection Chariot-verified version
862 * 12 18 2009 cm.chang
863 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
866 * Dec 10 2009 mtk01088
867 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
868 * adding the sample code to update the wlan table rate,
870 * Dec 10 2009 mtk01104
871 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
872 * Different function prototype of wifi_send_msg()
874 * Dec 9 2009 mtk01104
875 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
876 * Call rlm related function to process HT info when join complete
878 * Dec 9 2009 mtk01088
879 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
880 * default the acquired wlan table entry code off
882 * Dec 9 2009 mtk01088
883 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
884 * adding the code to acquired the wlan table entry, and a sample code to update the BA bit at table
886 * Dec 7 2009 mtk01461
887 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
888 * Fix the problem of prSwRfb overwrited by event packet in aisFsmRunEventJoinComplete()
890 * Dec 4 2009 mtk01088
891 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
892 * adding the code to integrate the security related code
894 * Dec 3 2009 mtk01461
895 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
896 * Remove redundant declaration
898 * Dec 3 2009 mtk01461
899 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
900 * Add code for JOIN init and JOIN complete
902 * Nov 30 2009 mtk01461
903 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
904 * Rename u4RSSI to i4RSSI
906 * Nov 30 2009 mtk01461
907 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
908 * Revise ENUM_MEDIA_STATE to ENUM_PARAM_MEDIA_STATE
910 * Nov 30 2009 mtk01461
911 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
912 * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
914 * Nov 26 2009 mtk01461
915 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
916 * Revise Virtual CMD handler due to structure changed
918 * Nov 25 2009 mtk01461
919 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
920 * Add Virtual CMD & RESP for testing CMD PATH
922 * Nov 23 2009 mtk01461
923 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
924 * Add aisFsmInitializeConnectionSettings()
926 * Nov 20 2009 mtk01461
927 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
928 * Add CFG_TEST_MGMT_FSM flag for aisFsmTest()
930 * Nov 16 2009 mtk01461
931 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
935 /*******************************************************************************
936 * C O M P I L E R F L A G S
937 ********************************************************************************
940 /*******************************************************************************
941 * E X T E R N A L R E F E R E N C E S
942 ********************************************************************************
946 /*******************************************************************************
948 ********************************************************************************
950 #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT 2
952 /*******************************************************************************
954 ********************************************************************************
957 /*******************************************************************************
958 * P U B L I C D A T A
959 ********************************************************************************
962 /*******************************************************************************
963 * P R I V A T E D A T A
964 ********************************************************************************
967 /*lint -save -e64 Type mismatch */
968 static PUINT_8 apucDebugAisState[AIS_STATE_NUM] = {
969 (PUINT_8)DISP_STRING("AIS_STATE_IDLE"),
970 (PUINT_8)DISP_STRING("AIS_STATE_SEARCH"),
971 (PUINT_8)DISP_STRING("AIS_STATE_SCAN"),
972 (PUINT_8)DISP_STRING("AIS_STATE_ONLINE_SCAN"),
973 (PUINT_8)DISP_STRING("AIS_STATE_LOOKING_FOR"),
974 (PUINT_8)DISP_STRING("AIS_STATE_WAIT_FOR_NEXT_SCAN"),
975 (PUINT_8)DISP_STRING("AIS_STATE_REQ_CHANNEL_JOIN"),
976 (PUINT_8)DISP_STRING("AIS_STATE_JOIN"),
977 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_ALONE"),
978 (PUINT_8)DISP_STRING("AIS_STATE_IBSS_MERGE"),
979 (PUINT_8)DISP_STRING("AIS_STATE_NORMAL_TR"),
980 (PUINT_8)DISP_STRING("AIS_STATE_DISCONNECTING")
985 /*******************************************************************************
987 ********************************************************************************
990 /*******************************************************************************
991 * F U N C T I O N D E C L A R A T I O N S
992 ********************************************************************************
995 /*******************************************************************************
997 ********************************************************************************
999 /*----------------------------------------------------------------------------*/
1001 * @brief the function is used to initialize the value of the connection settings for
1008 /*----------------------------------------------------------------------------*/
1010 aisInitializeConnectionSettings (
1011 IN P_ADAPTER_T prAdapter,
1012 IN P_REG_INFO_T prRegInfo
1015 P_CONNECTION_SETTINGS_T prConnSettings;
1016 UINT_8 aucAnyBSSID[] = BC_BSSID;
1017 UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
1020 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1022 /* Setup default values for operation */
1023 COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
1025 prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
1027 COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
1028 prConnSettings->fgIsConnByBssidIssued = FALSE;
1030 prConnSettings->fgIsConnReqIssued = FALSE;
1031 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
1033 prConnSettings->ucSSIDLen = 0;
1035 prConnSettings->eOPMode = NET_TYPE_INFRA;
1037 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1040 prConnSettings->ucAdHocChannelNum = (UINT_8) nicFreq2ChannelNum(prRegInfo->u4StartFreq);
1041 prConnSettings->eAdHocBand = prRegInfo->u4StartFreq < 5000000 ? BAND_2G4 : BAND_5G;
1042 prConnSettings->eAdHocMode = (ENUM_PARAM_AD_HOC_MODE_T) (prRegInfo->u4AdhocMode);
1045 prConnSettings->eAuthMode = AUTH_MODE_OPEN;
1047 prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
1049 prConnSettings->fgIsScanReqIssued = FALSE;
1051 /* MIB attributes */
1052 prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
1054 prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
1056 prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
1058 //prConnSettings->u4FreqInKHz; /* Center frequency */
1062 prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
1064 secInit(prAdapter, NETWORK_TYPE_AIS_INDEX);
1067 prConnSettings->fgIsEnableRoaming = FALSE;
1068 #if CFG_SUPPORT_ROAMING
1070 prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0)?(FALSE):(TRUE));
1072 #endif /* CFG_SUPPORT_ROAMING */
1074 prConnSettings->fgIsAdHocQoSEnable = FALSE;
1076 prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
1078 /* Set default bandwidth modes */
1079 prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
1080 prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
1082 prConnSettings->rRsnInfo.ucElemId = 0x30;
1083 prConnSettings->rRsnInfo.u2Version = 0x0001;
1084 prConnSettings->rRsnInfo.u4GroupKeyCipherSuite = 0;
1085 prConnSettings->rRsnInfo.u4PairwiseKeyCipherSuiteCount = 0;
1086 for (i = 0; i < MAX_NUM_SUPPORTED_CIPHER_SUITES; i++)
1087 prConnSettings->rRsnInfo.au4PairwiseKeyCipherSuite[i] = 0;
1088 prConnSettings->rRsnInfo.u4AuthKeyMgtSuiteCount = 0;
1089 for (i = 0; i < MAX_NUM_SUPPORTED_AKM_SUITES; i++)
1090 prConnSettings->rRsnInfo.au4AuthKeyMgtSuite[i] = 0;
1091 prConnSettings->rRsnInfo.u2RsnCap = 0;
1092 prConnSettings->rRsnInfo.fgRsnCapPresent = FALSE;
1095 } /* end of aisFsmInitializeConnectionSettings() */
1098 /*----------------------------------------------------------------------------*/
1100 * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
1107 /*----------------------------------------------------------------------------*/
1110 IN P_ADAPTER_T prAdapter
1113 P_AIS_FSM_INFO_T prAisFsmInfo;
1114 P_BSS_INFO_T prAisBssInfo;
1115 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1117 DEBUGFUNC("aisFsmInit()");
1118 DBGLOG(SW1, INFO, ("->aisFsmInit()\n"));
1120 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1121 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1122 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1124 //4 <1> Initiate FSM
1125 prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
1126 prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
1128 prAisFsmInfo->ucAvailableAuthTypes = 0;
1130 prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T)NULL;
1132 prAisFsmInfo->ucSeqNumOfReqMsg = 0;
1133 prAisFsmInfo->ucSeqNumOfChReq = 0;
1134 prAisFsmInfo->ucSeqNumOfScanReq = 0;
1136 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1137 #if CFG_SUPPORT_ROAMING
1138 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1139 #endif /* CFG_SUPPORT_ROAMING */
1140 prAisFsmInfo->fgIsChannelRequested = FALSE;
1141 prAisFsmInfo->fgIsChannelGranted = FALSE;
1143 //4 <1.1> Initiate FSM - Timer INIT
1144 cnmTimerInitTimer(prAdapter,
1145 &prAisFsmInfo->rBGScanTimer,
1146 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventBGSleepTimeOut,
1149 cnmTimerInitTimer(prAdapter,
1150 &prAisFsmInfo->rIbssAloneTimer,
1151 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventIbssAloneTimeOut,
1154 cnmTimerInitTimer(prAdapter,
1155 &prAisFsmInfo->rIndicationOfDisconnectTimer,
1156 (PFN_MGMT_TIMEOUT_FUNC)aisPostponedEventOfDisconnTimeout,
1159 cnmTimerInitTimer(prAdapter,
1160 &prAisFsmInfo->rJoinTimeoutTimer,
1161 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventJoinTimeout,
1164 //4 <1.2> Initiate PWR STATE
1165 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1168 //4 <2> Initiate BSS_INFO_T - common part
1169 BSS_INFO_INIT(prAdapter, NETWORK_TYPE_AIS_INDEX);
1170 COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
1172 //4 <3> Initiate BSS_INFO_T - private part
1174 prAisBssInfo->eBand = BAND_2G4;
1175 prAisBssInfo->ucPrimaryChannel = 1;
1176 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1178 //4 <4> Allocate MSDU_INFO_T for Beacon
1179 prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
1180 OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
1182 if (prAisBssInfo->prBeacon) {
1183 prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1184 prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1191 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1192 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1193 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1195 if (prAdapter->u4UapsdAcBmp == 0) {
1196 prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1197 //ASSERT(prAdapter->u4UapsdAcBmp);
1199 prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1200 prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1201 prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1204 /* request list initialization */
1205 LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1207 //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1208 //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1209 //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1210 //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1213 } /* end of aisFsmInit() */
1215 /*----------------------------------------------------------------------------*/
1217 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1224 /*----------------------------------------------------------------------------*/
1227 IN P_ADAPTER_T prAdapter
1230 P_AIS_FSM_INFO_T prAisFsmInfo;
1231 P_BSS_INFO_T prAisBssInfo;
1232 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1234 DEBUGFUNC("aisFsmUninit()");
1235 DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1237 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1238 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1239 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1241 //4 <1> Stop all timers
1242 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
1243 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
1244 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
1245 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1247 //4 <2> flush pending request
1248 aisFsmFlushRequest(prAdapter);
1250 //4 <3> Reset driver-domain BSS-INFO
1251 if(prAisBssInfo->prBeacon) {
1252 cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1253 prAisBssInfo->prBeacon = NULL;
1256 #if CFG_SUPPORT_802_11W
1257 rsnStopSaQuery(prAdapter);
1261 } /* end of aisFsmUninit() */
1264 /*----------------------------------------------------------------------------*/
1266 * @brief Initialization of JOIN STATE
1268 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the BSS we will try to join with.
1272 /*----------------------------------------------------------------------------*/
1274 aisFsmStateInit_JOIN (
1275 IN P_ADAPTER_T prAdapter,
1276 P_BSS_DESC_T prBssDesc
1279 P_AIS_FSM_INFO_T prAisFsmInfo;
1280 P_BSS_INFO_T prAisBssInfo;
1281 P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1282 P_CONNECTION_SETTINGS_T prConnSettings;
1283 P_STA_RECORD_T prStaRec;
1284 P_MSG_JOIN_REQ_T prJoinReqMsg;
1286 DEBUGFUNC("aisFsmStateInit_JOIN()");
1288 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1289 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1290 prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1291 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1295 //4 <1> We are going to connect to this BSS.
1296 prBssDesc->fgIsConnecting = TRUE;
1299 //4 <2> Setup corresponding STA_RECORD_T
1300 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1302 NETWORK_TYPE_AIS_INDEX,
1305 prAisFsmInfo->prTargetStaRec = prStaRec;
1307 //4 <2.1> sync. to firmware domain
1308 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1310 //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1311 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1313 prStaRec->fgIsReAssoc = FALSE;
1315 switch (prConnSettings->eAuthMode) {
1316 case AUTH_MODE_OPEN: /* Note: Omit break here. */
1318 case AUTH_MODE_WPA_PSK:
1319 case AUTH_MODE_WPA2:
1320 case AUTH_MODE_WPA2_PSK:
1321 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1325 case AUTH_MODE_SHARED:
1326 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1330 case AUTH_MODE_AUTO_SWITCH:
1331 DBGLOG(AIS, LOUD, ("JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n"));
1332 prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)(AUTH_TYPE_OPEN_SYSTEM |
1333 AUTH_TYPE_SHARED_KEY);
1337 ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
1338 DBGLOG(AIS, ERROR, ("JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
1339 prConnSettings->eAuthMode));
1340 /* TODO(Kevin): error handling ? */
1344 /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1345 prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1347 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1351 ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1352 ASSERT(!prBssDesc->fgIsConnected);
1354 DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1355 prAisSpecificBssInfo->ucRoamingAuthTypes));
1358 prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1360 /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1361 prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1363 prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1367 //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1368 if (prAisFsmInfo->ucAvailableAuthTypes &
1369 (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1371 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
1372 prAisFsmInfo->ucAvailableAuthTypes &=
1373 ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1375 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1377 else if (prAisFsmInfo->ucAvailableAuthTypes &
1378 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1380 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1382 prAisFsmInfo->ucAvailableAuthTypes &=
1383 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1385 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1387 else if (prAisFsmInfo->ucAvailableAuthTypes &
1388 (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1390 DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1392 prAisFsmInfo->ucAvailableAuthTypes &=
1393 ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1395 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1401 //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1402 if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1404 if (prBssDesc->ucSSIDLen) {
1405 COPY_SSID(prConnSettings->aucSSID,
1406 prConnSettings->ucSSIDLen,
1408 prBssDesc->ucSSIDLen);
1412 //4 <6> Send a Msg to trigger SAA to start JOIN process.
1413 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1414 if (!prJoinReqMsg) {
1416 ASSERT(0); // Can't trigger SAA FSM
1420 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1421 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1422 prJoinReqMsg->prStaRec = prStaRec;
1426 P_FRAG_INFO_T prFragInfo;
1427 for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1428 prFragInfo = &prStaRec->rFragInfo[j];
1430 if (prFragInfo->pr1stFrag) {
1431 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1432 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1437 mboxSendMsg(prAdapter,
1439 (P_MSG_HDR_T) prJoinReqMsg,
1440 MSG_SEND_METHOD_BUF);
1443 } /* end of aisFsmInit_JOIN() */
1446 /*----------------------------------------------------------------------------*/
1448 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1450 * @param[in] prStaRec Pointer to the STA_RECORD_T
1452 * @retval TRUE We will retry JOIN
1453 * @retval FALSE We will not retry JOIN
1455 /*----------------------------------------------------------------------------*/
1457 aisFsmStateInit_RetryJOIN (
1458 IN P_ADAPTER_T prAdapter,
1459 P_STA_RECORD_T prStaRec
1462 P_AIS_FSM_INFO_T prAisFsmInfo;
1463 P_MSG_JOIN_REQ_T prJoinReqMsg;
1465 DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1467 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1469 /* Retry other AuthType if possible */
1470 if (!prAisFsmInfo->ucAvailableAuthTypes) {
1474 if (prAisFsmInfo->ucAvailableAuthTypes &
1475 (UINT_8)AUTH_TYPE_SHARED_KEY) {
1477 DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1479 prAisFsmInfo->ucAvailableAuthTypes &=
1480 ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1482 prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1485 DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1489 prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1491 /* Trigger SAA to start JOIN process. */
1492 prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1493 if (!prJoinReqMsg) {
1495 ASSERT(0); // Can't trigger SAA FSM
1499 prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1500 prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1501 prJoinReqMsg->prStaRec = prStaRec;
1503 mboxSendMsg(prAdapter,
1505 (P_MSG_HDR_T) prJoinReqMsg,
1506 MSG_SEND_METHOD_BUF);
1510 }/* end of aisFsmRetryJOIN() */
1513 #if CFG_SUPPORT_ADHOC
1514 /*----------------------------------------------------------------------------*/
1516 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1522 /*----------------------------------------------------------------------------*/
1524 aisFsmStateInit_IBSS_ALONE (
1525 IN P_ADAPTER_T prAdapter
1528 P_AIS_FSM_INFO_T prAisFsmInfo;
1529 P_CONNECTION_SETTINGS_T prConnSettings;
1530 P_BSS_INFO_T prAisBssInfo;
1532 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1533 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1534 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1536 //4 <1> Check if IBSS was created before ?
1537 if (prAisBssInfo->fgIsBeaconActivated) {
1539 //4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH
1540 #if !CFG_SLT_SUPPORT
1541 cnmTimerStartTimer(prAdapter,
1542 &prAisFsmInfo->rIbssAloneTimer,
1543 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
1547 aisFsmCreateIBSS(prAdapter);
1550 } /* end of aisFsmStateInit_IBSS_ALONE() */
1553 /*----------------------------------------------------------------------------*/
1555 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1557 * @param[in] prBssDesc The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1561 /*----------------------------------------------------------------------------*/
1563 aisFsmStateInit_IBSS_MERGE (
1564 IN P_ADAPTER_T prAdapter,
1565 P_BSS_DESC_T prBssDesc
1568 P_AIS_FSM_INFO_T prAisFsmInfo;
1569 P_CONNECTION_SETTINGS_T prConnSettings;
1570 P_BSS_INFO_T prAisBssInfo;
1571 P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
1576 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1577 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1578 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1580 //4 <1> We will merge with to this BSS immediately.
1581 prBssDesc->fgIsConnecting = FALSE;
1582 prBssDesc->fgIsConnected = TRUE;
1584 //4 <2> Setup corresponding STA_RECORD_T
1585 prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1586 STA_TYPE_ADHOC_PEER,
1587 NETWORK_TYPE_AIS_INDEX,
1590 prStaRec->fgIsMerging = TRUE;
1592 prAisFsmInfo->prTargetStaRec = prStaRec;
1594 //4 <2.1> sync. to firmware domain
1595 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1598 aisFsmMergeIBSS(prAdapter, prStaRec);
1601 } /* end of aisFsmStateInit_IBSS_MERGE() */
1603 #endif /* CFG_SUPPORT_ADHOC */
1606 /*----------------------------------------------------------------------------*/
1608 * @brief Process of JOIN Abort
1614 /*----------------------------------------------------------------------------*/
1616 aisFsmStateAbort_JOIN (
1617 IN P_ADAPTER_T prAdapter
1620 P_AIS_FSM_INFO_T prAisFsmInfo;
1621 P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1623 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1625 /* 1. Abort JOIN process */
1626 prJoinAbortMsg = (P_MSG_JOIN_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
1627 if (!prJoinAbortMsg) {
1629 ASSERT(0); // Can't abort SAA FSM
1633 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1634 WLAN_STATUS_CONNECT_INDICATION,
1638 prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1639 prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1640 prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1642 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1644 mboxSendMsg(prAdapter,
1646 (P_MSG_HDR_T) prJoinAbortMsg,
1647 MSG_SEND_METHOD_BUF);
1649 /* 2. Return channel privilege */
1650 aisFsmReleaseCh(prAdapter);
1652 /* 3.1 stop join timeout timer */
1653 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1655 /* 3.2 reset local variable */
1656 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1659 } /* end of aisFsmAbortJOIN() */
1662 /*----------------------------------------------------------------------------*/
1664 * @brief Process of SCAN Abort
1670 /*----------------------------------------------------------------------------*/
1672 aisFsmStateAbort_SCAN (
1673 IN P_ADAPTER_T prAdapter
1676 P_AIS_FSM_INFO_T prAisFsmInfo;
1677 P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1679 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1681 /* Abort JOIN process. */
1682 prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1683 if (!prScanCancelMsg) {
1685 ASSERT(0); // Can't abort SCN FSM
1689 prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
1690 prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
1691 prScanCancelMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
1692 #if CFG_ENABLE_WIFI_DIRECT
1693 if(prAdapter->fgIsP2PRegistered) {
1694 prScanCancelMsg->fgIsChannelExt = FALSE;
1698 /* unbuffered message to guarantee scan is cancelled in sequence */
1699 mboxSendMsg(prAdapter,
1701 (P_MSG_HDR_T) prScanCancelMsg,
1702 MSG_SEND_METHOD_UNBUF);
1705 } /* end of aisFsmAbortSCAN() */
1708 /*----------------------------------------------------------------------------*/
1710 * @brief Process of NORMAL_TR Abort
1716 /*----------------------------------------------------------------------------*/
1718 aisFsmStateAbort_NORMAL_TR (
1719 IN P_ADAPTER_T prAdapter
1722 P_AIS_FSM_INFO_T prAisFsmInfo;
1725 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1727 /* TODO(Kevin): Do abort other MGMT func */
1729 /* 1. Release channel to CNM */
1730 aisFsmReleaseCh(prAdapter);
1732 /* 2.1 stop join timeout timer */
1733 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1735 /* 2.2 reset local variable */
1736 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1739 } /* end of aisFsmAbortNORMAL_TR() */
1742 #if CFG_SUPPORT_ADHOC
1743 /*----------------------------------------------------------------------------*/
1745 * @brief Process of NORMAL_TR Abort
1751 /*----------------------------------------------------------------------------*/
1753 aisFsmStateAbort_IBSS (
1754 IN P_ADAPTER_T prAdapter
1757 P_AIS_FSM_INFO_T prAisFsmInfo;
1758 P_BSS_DESC_T prBssDesc;
1760 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1763 if (prAisFsmInfo->prTargetStaRec) {
1764 prBssDesc = scanSearchBssDescByTA(prAdapter,
1765 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1768 prBssDesc->fgIsConnected = FALSE;
1769 prBssDesc->fgIsConnecting = FALSE;
1773 // release channel privilege
1774 aisFsmReleaseCh(prAdapter);
1778 #endif /* CFG_SUPPORT_ADHOC */
1781 /*----------------------------------------------------------------------------*/
1783 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1785 * @param[in] eNextState Enum value of next AIS STATE
1789 /*----------------------------------------------------------------------------*/
1792 IN P_ADAPTER_T prAdapter,
1793 ENUM_AIS_STATE_T eNextState
1796 P_AIS_FSM_INFO_T prAisFsmInfo;
1797 P_BSS_INFO_T prAisBssInfo;
1798 P_CONNECTION_SETTINGS_T prConnSettings;
1799 P_BSS_DESC_T prBssDesc;
1800 P_MSG_CH_REQ_T prMsgChReq;
1801 P_MSG_SCN_SCAN_REQ prScanReqMsg;
1802 P_AIS_REQ_HDR_T prAisReq;
1805 UINT_16 u2ScanIELen;
1807 BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1809 DEBUGFUNC("aisFsmSteps()");
1811 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1812 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1813 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1817 /* Do entering Next State */
1818 prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1821 DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1822 apucDebugAisState[prAisFsmInfo->eCurrentState],
1823 apucDebugAisState[eNextState]));
1825 DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1827 prAisFsmInfo->eCurrentState,
1830 /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1831 prAisFsmInfo->eCurrentState = eNextState;
1833 fgIsTransition = (BOOLEAN)FALSE;
1835 /* Do tasks of the State that we just entered */
1836 switch (prAisFsmInfo->eCurrentState) {
1837 /* NOTE(Kevin): we don't have to rearrange the sequence of following
1838 * switch case. Instead I would like to use a common lookup table of array
1839 * of function pointer to speed up state search.
1841 case AIS_STATE_IDLE:
1843 prAisReq = aisFsmGetNextRequest(prAdapter);
1845 if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1846 if (prConnSettings->fgIsConnReqIssued == TRUE &&
1847 prConnSettings->fgIsDisconnectedByNonRequest == FALSE) {
1849 prAisFsmInfo->fgTryScan = TRUE;
1851 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1852 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1854 // sync with firmware
1855 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1857 // reset trial count
1858 prAisFsmInfo->ucConnTrialCount = 0;
1860 eNextState = AIS_STATE_SEARCH;
1861 fgIsTransition = TRUE;
1864 UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1865 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1867 // sync with firmware
1868 nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1870 // check for other pending request
1872 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1873 wlanClearScanningResult(prAdapter);
1874 eNextState = AIS_STATE_SCAN;
1876 fgIsTransition = TRUE;
1882 /* free the message */
1883 cnmMemFree(prAdapter, prAisReq);
1886 else if(prAisReq->eReqType == AIS_REQUEST_SCAN) {
1887 #if CFG_SUPPORT_ROAMING
1888 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1889 #endif /* CFG_SUPPORT_ROAMING */
1890 wlanClearScanningResult(prAdapter);
1892 eNextState = AIS_STATE_SCAN;
1893 fgIsTransition = TRUE;
1895 /* free the message */
1896 cnmMemFree(prAdapter, prAisReq);
1898 else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1900 /* free the message */
1901 cnmMemFree(prAdapter, prAisReq);
1904 prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1908 case AIS_STATE_SEARCH:
1909 //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1911 prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1913 prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1916 // we are under Roaming Condition.
1917 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1918 if(prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
1919 #if CFG_SUPPORT_ROAMING
1920 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
1921 #endif /* CFG_SUPPORT_ROAMING */
1922 // reset retry count
1923 prAisFsmInfo->ucConnTrialCount = 0;
1925 // abort connection trial
1926 prConnSettings->fgIsConnReqIssued = FALSE;
1928 eNextState = AIS_STATE_NORMAL_TR;
1929 fgIsTransition = TRUE;
1935 //4 <2> We are not under Roaming Condition.
1936 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1938 //4 <2.a> If we have the matched one
1941 //4 <A> Stored the Selected BSS security cipher. For later asoc req compose IE
1942 prAisBssInfo->u4RsnSelectedGroupCipher =
1943 prBssDesc->u4RsnSelectedGroupCipher;
1944 prAisBssInfo->u4RsnSelectedPairwiseCipher =
1945 prBssDesc->u4RsnSelectedPairwiseCipher;
1946 prAisBssInfo->u4RsnSelectedAKMSuite =
1947 prBssDesc->u4RsnSelectedAKMSuite;
1949 //4 <B> Do STATE transition and update current Operation Mode.
1950 if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1952 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1954 /* Record the target BSS_DESC_T for next STATE. */
1955 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1957 /* Transit to channel acquire */
1958 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1959 fgIsTransition = TRUE;
1961 // increase connection trial count
1962 prAisFsmInfo->ucConnTrialCount++;
1964 #if CFG_SUPPORT_ADHOC
1965 else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
1967 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1969 /* Record the target BSS_DESC_T for next STATE. */
1970 prAisFsmInfo->prTargetBssDesc = prBssDesc;
1972 eNextState = AIS_STATE_IBSS_MERGE;
1973 fgIsTransition = TRUE;
1975 #endif /* CFG_SUPPORT_ADHOC */
1978 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1979 fgIsTransition = TRUE;
1982 //4 <2.b> If we don't have the matched one
1985 // increase connection trial count for infrastructure connection
1986 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1987 prAisFsmInfo->ucConnTrialCount++;
1991 if (prAisFsmInfo->fgTryScan) {
1992 eNextState = AIS_STATE_LOOKING_FOR;
1994 fgIsTransition = TRUE;
1996 //4 <B> We've do SCAN already, now wait in some STATE.
1998 if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
2000 /* issue reconnect request, and retreat to idle state for scheduling */
2001 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2003 eNextState = AIS_STATE_IDLE;
2004 fgIsTransition = TRUE;
2006 #if CFG_SUPPORT_ADHOC
2007 else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
2008 || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
2009 || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
2011 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
2012 prAisFsmInfo->prTargetBssDesc = NULL;
2014 eNextState = AIS_STATE_IBSS_ALONE;
2015 fgIsTransition = TRUE;
2017 #endif /* CFG_SUPPORT_ADHOC */
2020 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2021 fgIsTransition = TRUE;
2026 //4 <3> We are under Roaming Condition.
2027 else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2029 //4 <3.a> This BSS_DESC_T is our AP.
2030 /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
2031 * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
2032 * settings. That make we can NOT match the original AP, so the
2033 * prBssDesc is NULL.
2034 * CASE II: The same reason as CASE I. Because APP change the
2035 * eOPMode to other network type in connection setting
2036 * (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
2037 * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
2038 * other parameters in connection setting first. So if we do roaming
2039 * at the same time, it will hit these cases.)
2041 * CASE III: Normal case, we can't find other candidate to roam
2042 * out, so only the current AP will be matched.
2044 * CASE VI: Timestamp of the current AP might be reset
2046 if ((!prBssDesc) || /* CASE I */
2047 (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
2048 (prBssDesc->fgIsConnected) || /* CASE III */
2049 (EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID)) /* CASE VI */) {
2052 (prBssDesc->fgIsConnected)) {
2053 ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2056 /* We already associated with it, go back to NORMAL_TR */
2057 /* TODO(Kevin): Roaming Fail */
2058 #if CFG_SUPPORT_ROAMING
2059 roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
2060 #endif /* CFG_SUPPORT_ROAMING */
2062 /* Retreat to NORMAL_TR state */
2063 eNextState = AIS_STATE_NORMAL_TR;
2064 fgIsTransition = TRUE;
2066 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2069 ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2072 //4 <A> Record the target BSS_DESC_T for next STATE.
2073 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2075 // tyhsu: increase connection trial count
2076 prAisFsmInfo->ucConnTrialCount++;
2078 /* Transit to channel acquire */
2079 eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2080 fgIsTransition = TRUE;
2086 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2088 DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2090 cnmTimerStartTimer(prAdapter,
2091 &prAisFsmInfo->rBGScanTimer,
2092 SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2094 SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2096 if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2097 prAisFsmInfo->u4SleepInterval <<= 1;
2101 case AIS_STATE_SCAN:
2102 case AIS_STATE_ONLINE_SCAN:
2103 case AIS_STATE_LOOKING_FOR:
2105 if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2106 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2108 // sync with firmware
2109 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2112 /* IE length decision */
2113 if(prAisFsmInfo->u4ScanIELength > 0) {
2114 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2117 #if CFG_SUPPORT_WPS2
2118 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2124 prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2126 OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2127 if (!prScanReqMsg) {
2128 ASSERT(0); // Can't trigger SCAN FSM
2132 prScanReqMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_REQ;
2133 prScanReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfScanReq;
2134 prScanReqMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2136 #if CFG_SUPPORT_RDD_TEST_MODE
2137 prScanReqMsg->eScanType = SCAN_TYPE_PASSIVE_SCAN;
2139 prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
2142 if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
2143 || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
2144 if(prAisFsmInfo->ucScanSSIDLen == 0) {
2145 /* Scan for all available SSID */
2146 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
2149 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2150 COPY_SSID(prScanReqMsg->aucSSID,
2151 prScanReqMsg->ucSSIDLength,
2152 prAisFsmInfo->aucScanSSID,
2153 prAisFsmInfo->ucScanSSIDLen);
2157 /* Scan for determined SSID */
2158 prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
2159 COPY_SSID(prScanReqMsg->aucSSID,
2160 prScanReqMsg->ucSSIDLength,
2161 prConnSettings->aucSSID,
2162 prConnSettings->ucSSIDLen);
2165 /* check if tethering is running and need to fix on specific channel */
2166 if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
2167 prScanReqMsg->eScanChannel = SCAN_CHANNEL_SPECIFIED;
2168 prScanReqMsg->ucChannelListNum = 1;
2169 prScanReqMsg->arChnlInfoList[0].eBand
2171 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2174 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2175 if(prAdapter->fgEnable5GBand == TRUE) {
2176 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2179 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2182 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2183 prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
2185 else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2186 prScanReqMsg->eScanChannel = SCAN_CHANNEL_5G;
2189 prScanReqMsg->eScanChannel = SCAN_CHANNEL_FULL;
2193 if(prAisFsmInfo->u4ScanIELength > 0) {
2194 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2197 #if CFG_SUPPORT_WPS2
2198 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2199 kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2204 prScanReqMsg->u2IELen = u2ScanIELen;
2206 mboxSendMsg(prAdapter,
2208 (P_MSG_HDR_T) prScanReqMsg,
2209 MSG_SEND_METHOD_BUF);
2211 prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2215 case AIS_STATE_REQ_CHANNEL_JOIN:
2216 /* send message to CNM for acquiring channel */
2217 prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
2219 ASSERT(0); // Can't indicate CNM for channel acquiring
2223 prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
2224 prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
2225 prMsgChReq->ucTokenID = ++prAisFsmInfo->ucSeqNumOfChReq;
2226 prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
2227 prMsgChReq->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
2228 prMsgChReq->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
2229 prMsgChReq->eRfSco = prAisFsmInfo->prTargetBssDesc->eSco;
2230 prMsgChReq->eRfBand = prAisFsmInfo->prTargetBssDesc->eBand;
2231 COPY_MAC_ADDR(prMsgChReq->aucBSSID, prAisFsmInfo->prTargetBssDesc->aucBSSID);
2233 mboxSendMsg(prAdapter,
2235 (P_MSG_HDR_T) prMsgChReq,
2236 MSG_SEND_METHOD_BUF);
2238 prAisFsmInfo->fgIsChannelRequested = TRUE;
2241 case AIS_STATE_JOIN:
2242 aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2245 #if CFG_SUPPORT_ADHOC
2246 case AIS_STATE_IBSS_ALONE:
2247 aisFsmStateInit_IBSS_ALONE(prAdapter);
2250 case AIS_STATE_IBSS_MERGE:
2251 aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2253 #endif /* CFG_SUPPORT_ADHOC */
2255 case AIS_STATE_NORMAL_TR:
2256 if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2257 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2260 /* 1. Process for pending scan */
2261 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
2262 wlanClearScanningResult(prAdapter);
2263 eNextState = AIS_STATE_ONLINE_SCAN;
2264 fgIsTransition = TRUE;
2266 /* 2. Process for pending roaming scan */
2267 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
2268 eNextState = AIS_STATE_LOOKING_FOR;
2269 fgIsTransition = TRUE;
2271 /* 3. Process for pending roaming scan */
2272 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
2273 eNextState = AIS_STATE_SEARCH;
2274 fgIsTransition = TRUE;
2280 case AIS_STATE_DISCONNECTING:
2281 /* send for deauth frame for disconnection */
2282 authSendDeauthFrame(prAdapter,
2283 prAisBssInfo->prStaRecOfAP,
2285 REASON_CODE_DEAUTH_LEAVING_BSS,
2286 aisDeauthXmitComplete);
2290 ASSERT(0); /* Make sure we have handle all STATEs */
2295 while (fgIsTransition);
2299 } /* end of aisFsmSteps() */
2302 /*----------------------------------------------------------------------------*/
2310 /*----------------------------------------------------------------------------*/
2312 aisFsmRunEventScanDone (
2313 IN P_ADAPTER_T prAdapter,
2314 IN P_MSG_HDR_T prMsgHdr
2317 P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2318 P_AIS_FSM_INFO_T prAisFsmInfo;
2319 ENUM_AIS_STATE_T eNextState;
2320 UINT_8 ucSeqNumOfCompMsg;
2321 P_CONNECTION_SETTINGS_T prConnSettings;
2323 DEBUGFUNC("aisFsmRunEventScanDone()");
2328 DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2330 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2331 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2333 prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2334 ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2336 ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2337 cnmMemFree(prAdapter, prMsgHdr);
2339 eNextState = prAisFsmInfo->eCurrentState;
2341 if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2342 DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2345 switch (prAisFsmInfo->eCurrentState) {
2346 case AIS_STATE_SCAN:
2347 prConnSettings->fgIsScanReqIssued = FALSE;
2349 /* reset scan IE buffer */
2350 prAisFsmInfo->u4ScanIELength = 0;
2352 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2353 eNextState = AIS_STATE_IDLE;
2357 case AIS_STATE_ONLINE_SCAN:
2358 prConnSettings->fgIsScanReqIssued = FALSE;
2360 /* reset scan IE buffer */
2361 prAisFsmInfo->u4ScanIELength = 0;
2363 kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2364 #if CFG_SUPPORT_ROAMING
2365 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2367 eNextState = AIS_STATE_NORMAL_TR;
2368 #endif /* CFG_SUPPORT_ROAMING */
2372 case AIS_STATE_LOOKING_FOR:
2373 #if CFG_SUPPORT_ROAMING
2374 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2376 eNextState = AIS_STATE_SEARCH;
2377 #endif /* CFG_SUPPORT_ROAMING */
2386 if (eNextState != prAisFsmInfo->eCurrentState) {
2387 aisFsmSteps(prAdapter, eNextState);
2391 } /* end of aisFsmRunEventScanDone() */
2394 /*----------------------------------------------------------------------------*/
2402 /*----------------------------------------------------------------------------*/
2404 aisFsmRunEventAbort (
2405 IN P_ADAPTER_T prAdapter,
2406 IN P_MSG_HDR_T prMsgHdr
2409 P_MSG_AIS_ABORT_T prAisAbortMsg;
2410 P_AIS_FSM_INFO_T prAisFsmInfo;
2411 UINT_8 ucReasonOfDisconnect;
2412 BOOLEAN fgDelayIndication;
2413 P_CONNECTION_SETTINGS_T prConnSettings;
2415 DEBUGFUNC("aisFsmRunEventAbort()");
2419 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2420 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2422 //4 <1> Extract information of Abort Message and then free memory.
2423 prAisAbortMsg = (P_MSG_AIS_ABORT_T)prMsgHdr;
2424 ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
2425 fgDelayIndication = prAisAbortMsg->fgDelayIndication;
2427 cnmMemFree(prAdapter, prMsgHdr);
2430 DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2431 apucDebugAisState[prAisFsmInfo->eCurrentState]));
2433 DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2435 prAisFsmInfo->eCurrentState));
2438 //4 <2> clear previous pending connection request and insert new one
2439 if(ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DEAUTHENTICATED
2440 || ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DISASSOCIATED) {
2441 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
2444 prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
2447 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2448 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2450 if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2451 //4 <3> invoke abort handler
2452 aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2456 } /* end of aisFsmRunEventAbort() */
2459 /*----------------------------------------------------------------------------*/
2461 * \brief This function handles AIS-FSM abort event/command
2463 * \param[in] prAdapter Pointer of ADAPTER_T
2464 * ucReasonOfDisconnect Reason for disonnection
2465 * fgDelayIndication Option to delay disconnection indication
2469 /*----------------------------------------------------------------------------*/
2472 IN P_ADAPTER_T prAdapter,
2473 UINT_8 ucReasonOfDisconnect,
2474 BOOLEAN fgDelayIndication
2477 P_AIS_FSM_INFO_T prAisFsmInfo;
2478 P_BSS_INFO_T prAisBssInfo;
2479 P_CONNECTION_SETTINGS_T prConnSettings;
2480 BOOLEAN fgIsCheckConnected;
2484 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2485 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2486 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2487 fgIsCheckConnected = FALSE;
2489 //4 <1> Save information of Abort Message and then free memory.
2490 prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2492 //4 <2> Abort current job.
2493 switch (prAisFsmInfo->eCurrentState) {
2494 case AIS_STATE_IDLE:
2495 case AIS_STATE_SEARCH:
2498 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2499 /* Do cancel timer */
2500 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2502 /* in case roaming is triggered */
2503 fgIsCheckConnected = TRUE;
2506 case AIS_STATE_SCAN:
2508 aisFsmStateAbort_SCAN(prAdapter);
2510 /* queue for later handling */
2511 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2512 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2517 case AIS_STATE_LOOKING_FOR:
2519 aisFsmStateAbort_SCAN(prAdapter);
2521 /* in case roaming is triggered */
2522 fgIsCheckConnected = TRUE;
2525 case AIS_STATE_REQ_CHANNEL_JOIN:
2526 /* Release channel to CNM */
2527 aisFsmReleaseCh(prAdapter);
2529 /* in case roaming is triggered */
2530 fgIsCheckConnected = TRUE;
2533 case AIS_STATE_JOIN:
2535 aisFsmStateAbort_JOIN(prAdapter);
2537 /* in case roaming is triggered */
2538 fgIsCheckConnected = TRUE;
2541 #if CFG_SUPPORT_ADHOC
2542 case AIS_STATE_IBSS_ALONE:
2543 case AIS_STATE_IBSS_MERGE:
2544 aisFsmStateAbort_IBSS(prAdapter);
2546 #endif /* CFG_SUPPORT_ADHOC */
2548 case AIS_STATE_ONLINE_SCAN:
2550 aisFsmStateAbort_SCAN(prAdapter);
2552 /* queue for later handling */
2553 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2554 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2557 fgIsCheckConnected = TRUE;
2560 case AIS_STATE_NORMAL_TR:
2561 fgIsCheckConnected = TRUE;
2564 case AIS_STATE_DISCONNECTING:
2565 /* Do abort NORMAL_TR */
2566 aisFsmStateAbort_NORMAL_TR(prAdapter);
2574 if (fgIsCheckConnected &&
2575 (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2577 /* switch into DISCONNECTING state for sending DEAUTH if necessary */
2578 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
2579 prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
2580 prAisBssInfo->prStaRecOfAP &&
2581 prAisBssInfo->prStaRecOfAP->fgIsInUse) {
2582 aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
2587 /* Do abort NORMAL_TR */
2588 aisFsmStateAbort_NORMAL_TR(prAdapter);
2592 aisFsmDisconnect(prAdapter, fgDelayIndication);
2596 } /* end of aisFsmStateAbort() */
2599 /*----------------------------------------------------------------------------*/
2601 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2603 * @param[in] prMsgHdr Message of Join Complete of SAA FSM.
2607 /*----------------------------------------------------------------------------*/
2609 aisFsmRunEventJoinComplete (
2610 IN P_ADAPTER_T prAdapter,
2611 IN P_MSG_HDR_T prMsgHdr
2614 P_MSG_JOIN_COMP_T prJoinCompMsg;
2615 P_AIS_FSM_INFO_T prAisFsmInfo;
2616 ENUM_AIS_STATE_T eNextState;
2617 P_STA_RECORD_T prStaRec;
2618 P_SW_RFB_T prAssocRspSwRfb;
2620 DEBUGFUNC("aisFsmRunEventJoinComplete()");
2624 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2625 prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2626 prStaRec = prJoinCompMsg->prStaRec;
2627 prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2629 eNextState = prAisFsmInfo->eCurrentState;
2631 // Check State and SEQ NUM
2632 if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2633 P_BSS_INFO_T prAisBssInfo;
2635 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2638 if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2641 //4 <1> JOIN was successful
2642 if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2644 //1. Reset retry count
2645 prAisFsmInfo->ucConnTrialCount = 0;
2647 // Completion of roaming
2648 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2650 #if CFG_SUPPORT_ROAMING
2651 //2. Deactivate previous BSS
2652 aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2654 //3. Update bss based on roaming staRec
2655 aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2656 #endif /* CFG_SUPPORT_ROAMING */
2659 //4 <1.1> Change FW's Media State immediately.
2660 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2662 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
2663 if ((prAisBssInfo->prStaRecOfAP) &&
2664 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
2665 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
2667 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2670 //4 <1.3> Update BSS_INFO_T
2671 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2673 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2674 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2676 //4 <1.5> Update RSSI if necessary
2677 nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2679 //4 <1.6> Indicate Connected Event to Host immediately.
2680 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
2681 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2684 #if CFG_SUPPORT_ROAMING
2685 roamingFsmRunEventStart(prAdapter);
2686 #endif /* CFG_SUPPORT_ROAMING */
2688 //4 <1.7> Set the Next State of AIS FSM
2689 eNextState = AIS_STATE_NORMAL_TR;
2691 //4 <2> JOIN was not successful
2693 //4 <2.1> Redo JOIN process with other Auth Type if possible
2694 if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
2695 P_BSS_DESC_T prBssDesc;
2697 /* 1. Increase Failure Count */
2698 prStaRec->ucJoinFailureCount++;
2700 /* 2. release channel */
2701 aisFsmReleaseCh(prAdapter);
2703 /* 3.1 stop join timeout timer */
2704 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2706 /* 3.2 reset local variable */
2707 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2709 prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2712 ASSERT(prBssDesc->fgIsConnecting);
2715 prBssDesc->fgIsConnecting = FALSE;
2718 /* 3.3 Free STA-REC */
2719 if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2720 cnmStaRecFree(prAdapter, prStaRec, FALSE);
2723 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2724 #if CFG_SUPPORT_ROAMING
2725 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2726 #endif /* CFG_SUPPORT_ROAMING */
2729 // abort connection trial
2730 prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
2732 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
2733 WLAN_STATUS_CONNECT_INDICATION,
2737 eNextState = AIS_STATE_IDLE;
2744 DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2750 if (eNextState != prAisFsmInfo->eCurrentState) {
2751 aisFsmSteps(prAdapter, eNextState);
2754 if (prAssocRspSwRfb) {
2755 nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2758 cnmMemFree(prAdapter, prMsgHdr);
2761 } /* end of aisFsmRunEventJoinComplete() */
2764 #if CFG_SUPPORT_ADHOC
2765 /*----------------------------------------------------------------------------*/
2767 * @brief This function will handle the Grant Msg of IBSS Create which was sent by
2768 * CNM to indicate that channel was changed for creating IBSS.
2770 * @param[in] prAdapter Pointer of ADAPTER_T
2774 /*----------------------------------------------------------------------------*/
2777 IN P_ADAPTER_T prAdapter
2780 P_AIS_FSM_INFO_T prAisFsmInfo;
2784 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2788 if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2789 aisUpdateBssInfoForCreateIBSS(prAdapter);
2795 } /* end of aisFsmCreateIBSS() */
2798 /*----------------------------------------------------------------------------*/
2800 * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
2801 * CNM to indicate that channel was changed for merging IBSS.
2803 * @param[in] prAdapter Pointer of ADAPTER_T
2804 * @param[in] prStaRec Pointer of STA_RECORD_T for merge
2808 /*----------------------------------------------------------------------------*/
2811 IN P_ADAPTER_T prAdapter,
2812 IN P_STA_RECORD_T prStaRec
2815 P_AIS_FSM_INFO_T prAisFsmInfo;
2816 ENUM_AIS_STATE_T eNextState;
2817 P_BSS_INFO_T prAisBssInfo;
2822 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2823 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2827 eNextState = prAisFsmInfo->eCurrentState;
2829 switch (prAisFsmInfo->eCurrentState) {
2830 case AIS_STATE_IBSS_MERGE:
2832 P_BSS_DESC_T prBssDesc;
2834 //4 <1.1> Change FW's Media State immediately.
2835 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2837 //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2838 bssClearClientList(prAdapter, prAisBssInfo);
2840 //4 <1.3> Unmark connection flag of previous BSS_DESC_T.
2841 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2842 prBssDesc->fgIsConnecting = FALSE;
2843 prBssDesc->fgIsConnected = FALSE;
2846 //4 <1.4> Update BSS_INFO_T
2847 aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2849 //4 <1.5> Add Peers' STA_RECORD_T to Client List
2850 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2852 //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2853 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2854 prStaRec->fgIsMerging = FALSE;
2856 //4 <1.7> Enable other features
2858 //4 <1.8> Indicate Connected Event to Host immediately.
2859 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2861 //4 <1.9> Set the Next State of AIS FSM
2862 eNextState = AIS_STATE_NORMAL_TR;
2864 //4 <1.10> Release channel privilege
2865 aisFsmReleaseCh(prAdapter);
2868 prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2877 if (eNextState != prAisFsmInfo->eCurrentState) {
2878 aisFsmSteps(prAdapter, eNextState);
2885 } /* end of aisFsmMergeIBSS() */
2888 /*----------------------------------------------------------------------------*/
2890 * @brief This function will handle the Notification of existing IBSS was found
2893 * @param[in] prMsgHdr Message of Notification of an IBSS was present.
2897 /*----------------------------------------------------------------------------*/
2899 aisFsmRunEventFoundIBSSPeer (
2900 IN P_ADAPTER_T prAdapter,
2901 IN P_MSG_HDR_T prMsgHdr
2904 P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
2905 P_AIS_FSM_INFO_T prAisFsmInfo;
2906 ENUM_AIS_STATE_T eNextState;
2907 P_STA_RECORD_T prStaRec;
2908 P_BSS_INFO_T prAisBssInfo;
2909 P_BSS_DESC_T prBssDesc;
2910 BOOLEAN fgIsMergeIn;
2915 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2916 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2918 prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2920 ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2922 prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2925 fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2927 cnmMemFree(prAdapter, prMsgHdr);
2930 eNextState = prAisFsmInfo->eCurrentState;
2931 switch (prAisFsmInfo->eCurrentState) {
2932 case AIS_STATE_IBSS_ALONE:
2934 //4 <1> An IBSS Peer 'merged in'.
2937 //4 <1.1> Change FW's Media State immediately.
2938 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2940 //4 <1.2> Add Peers' STA_RECORD_T to Client List
2941 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2944 //4 <1.3> Mark connection flag of BSS_DESC_T.
2945 if ((prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr)) != NULL) {
2946 prBssDesc->fgIsConnecting = FALSE;
2947 prBssDesc->fgIsConnected = TRUE;
2950 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2953 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2954 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2956 //4 <1.3> Mark connection flag of BSS_DESC_T.
2957 if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2958 prBssDesc->fgIsConnecting = FALSE;
2959 prBssDesc->fgIsConnected = TRUE;
2962 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2966 //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2967 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2971 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2972 prStaRec->fgIsMerging = FALSE;
2974 //4 <1.6> sync. to firmware
2975 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
2977 //4 <1.7> Indicate Connected Event to Host immediately.
2978 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2980 //4 <1.8> indicate PM for connected
2981 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
2983 //4 <1.9> Set the Next State of AIS FSM
2984 eNextState = AIS_STATE_NORMAL_TR;
2986 //4 <1.10> Release channel privilege
2987 aisFsmReleaseCh(prAdapter);
2989 //4 <2> We need 'merge out' to this IBSS
2992 //4 <2.1> Get corresponding BSS_DESC_T
2993 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
2995 prAisFsmInfo->prTargetBssDesc = prBssDesc;
2997 //4 <2.2> Set the Next State of AIS FSM
2998 eNextState = AIS_STATE_IBSS_MERGE;
3003 case AIS_STATE_NORMAL_TR:
3006 //4 <3> An IBSS Peer 'merged in'.
3009 //4 <3.1> Add Peers' STA_RECORD_T to Client List
3010 bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
3013 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3014 prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
3016 //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3017 prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
3020 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
3021 prStaRec->fgIsMerging = FALSE;
3024 //4 <4> We need 'merge out' to this IBSS
3027 //4 <4.1> Get corresponding BSS_DESC_T
3028 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3030 prAisFsmInfo->prTargetBssDesc = prBssDesc;
3032 //4 <4.2> Set the Next State of AIS FSM
3033 eNextState = AIS_STATE_IBSS_MERGE;
3043 if (eNextState != prAisFsmInfo->eCurrentState) {
3044 aisFsmSteps(prAdapter, eNextState);
3048 } /* end of aisFsmRunEventFoundIBSSPeer() */
3049 #endif /* CFG_SUPPORT_ADHOC */
3052 /*----------------------------------------------------------------------------*/
3054 * @brief This function will indicate the Media State to HOST
3056 * @param[in] eConnectionState Current Media State
3057 * @param[in] fgDelayIndication Set TRUE for postponing the Disconnect Indication.
3061 /*----------------------------------------------------------------------------*/
3063 aisIndicationOfMediaStateToHost (
3064 IN P_ADAPTER_T prAdapter,
3065 ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3066 BOOLEAN fgDelayIndication
3069 EVENT_CONNECTION_STATUS rEventConnStatus;
3070 P_CONNECTION_SETTINGS_T prConnSettings;
3071 P_BSS_INFO_T prAisBssInfo;
3072 P_AIS_FSM_INFO_T prAisFsmInfo;
3074 DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3076 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3077 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3078 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3080 // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3081 //prAisBssInfo->eConnectionState = eConnectionState;
3083 /* For indicating the Disconnect Event only if current media state is
3084 * disconnected and we didn't do indication yet.
3086 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3087 if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3092 if (!fgDelayIndication) {
3093 //4 <0> Cancel Delay Timer
3094 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3096 //4 <1> Fill EVENT_CONNECTION_STATUS
3097 rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3099 if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3100 rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3102 if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3103 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3104 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3105 rEventConnStatus.u2ATIMWindow = 0;
3107 else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3108 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
3109 rEventConnStatus.u2AID = 0;
3110 rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
3116 COPY_SSID(rEventConnStatus.aucSsid,
3117 rEventConnStatus.ucSsidLen,
3118 prConnSettings->aucSSID,
3119 prConnSettings->ucSSIDLen);
3121 COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3123 rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3124 rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3126 switch (prAisBssInfo->ucNonHTBasicPhyType) {
3127 case PHY_TYPE_HR_DSSS_INDEX:
3128 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3131 case PHY_TYPE_ERP_INDEX:
3132 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3135 case PHY_TYPE_OFDM_INDEX:
3136 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3141 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3146 /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3147 bssClearClientList(prAdapter, prAisBssInfo);
3149 #if CFG_PRIVACY_MIGRATION
3150 /* Clear the pmkid cache while media disconnect */
3151 secClearPmkid(prAdapter);
3154 rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3158 nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3159 prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3162 /* NOTE: Only delay the Indication of Disconnect Event */
3163 ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3165 DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3166 prConnSettings->ucDelayTimeOfDisconnectEvent));
3168 cnmTimerStartTimer(prAdapter,
3169 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3170 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3174 } /* end of aisIndicationOfMediaStateToHost() */
3177 /*----------------------------------------------------------------------------*/
3179 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3181 * @param[in] u4Param Unused timer parameter
3185 /*----------------------------------------------------------------------------*/
3187 aisPostponedEventOfDisconnTimeout (
3188 IN P_ADAPTER_T prAdapter,
3192 P_BSS_INFO_T prAisBssInfo;
3193 P_CONNECTION_SETTINGS_T prConnSettings;
3195 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3196 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3198 //4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have.
3199 if (prAisBssInfo->prStaRecOfAP) {
3200 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3202 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3205 //4 <2> Remove pending connection request
3206 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3207 prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
3209 //4 <3> Indicate Disconnected Event to Host immediately.
3210 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3213 } /* end of aisPostponedEventOfDisconnTimeout() */
3216 /*----------------------------------------------------------------------------*/
3218 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3219 * the association was completed.
3221 * @param[in] prStaRec Pointer to the STA_RECORD_T
3222 * @param[in] prAssocRspSwRfb Pointer to SW RFB of ASSOC RESP FRAME.
3226 /*----------------------------------------------------------------------------*/
3228 aisUpdateBssInfoForJOIN (
3229 IN P_ADAPTER_T prAdapter,
3230 P_STA_RECORD_T prStaRec,
3231 P_SW_RFB_T prAssocRspSwRfb
3234 P_AIS_FSM_INFO_T prAisFsmInfo;
3235 P_BSS_INFO_T prAisBssInfo;
3236 P_CONNECTION_SETTINGS_T prConnSettings;
3237 P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
3238 P_BSS_DESC_T prBssDesc;
3242 DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3245 ASSERT(prAssocRspSwRfb);
3247 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3248 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3249 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3250 prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
3253 DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3256 //3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings
3257 //4 <1.1> Setup Operation Mode
3258 prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
3260 //4 <1.2> Setup SSID
3261 COPY_SSID(prAisBssInfo->aucSSID,
3262 prAisBssInfo->ucSSIDLen,
3263 prConnSettings->aucSSID,
3264 prConnSettings->ucSSIDLen);
3266 //4 <1.3> Setup Channel, Band
3267 prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3268 prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3271 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3272 //4 <2.1> Save current AP's STA_RECORD_T and current AID
3273 prAisBssInfo->prStaRecOfAP = prStaRec;
3274 prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
3276 //4 <2.2> Setup Capability
3277 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3279 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3280 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3283 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3286 //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3287 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3289 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3291 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3292 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3295 //3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3296 //4 <3.1> Setup BSSID
3297 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
3300 u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
3301 (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
3302 pucIE = prAssocRspFrame->aucInfoElem;
3305 //4 <3.2> Parse WMM and setup QBSS flag
3306 /* Parse WMM related IEs and configure HW CRs accordingly */
3307 mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3309 prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3311 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3312 prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3314 prBssDesc->fgIsConnecting = FALSE;
3315 prBssDesc->fgIsConnected = TRUE;
3317 //4 <4.1> Setup MIB for current BSS
3318 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3321 // should never happen
3325 /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3326 prAisBssInfo->ucDTIMPeriod = 0;
3327 prAisBssInfo->u2ATIMWindow = 0;
3329 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3331 //4 <4.2> Update HT information and set channel
3332 /* Record HT related parameters in rStaRec and rBssInfo
3333 * Note: it shall be called before nicUpdateBss()
3335 rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3337 //4 <4.3> Sync with firmware for BSS-INFO
3338 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3340 //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3341 //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3344 } /* end of aisUpdateBssInfoForJOIN() */
3347 #if CFG_SUPPORT_ADHOC
3348 /*----------------------------------------------------------------------------*/
3350 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3356 /*----------------------------------------------------------------------------*/
3358 aisUpdateBssInfoForCreateIBSS (
3359 IN P_ADAPTER_T prAdapter
3362 P_AIS_FSM_INFO_T prAisFsmInfo;
3363 P_BSS_INFO_T prAisBssInfo;
3364 P_CONNECTION_SETTINGS_T prConnSettings;
3366 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3367 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3368 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3370 if (prAisBssInfo->fgIsBeaconActivated) {
3374 //3 <1> Update BSS_INFO_T per Network Basis
3375 //4 <1.1> Setup Operation Mode
3376 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3378 //4 <1.2> Setup SSID
3379 COPY_SSID(prAisBssInfo->aucSSID,
3380 prAisBssInfo->ucSSIDLen,
3381 prConnSettings->aucSSID,
3382 prConnSettings->ucSSIDLen);
3384 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3385 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3386 prAisBssInfo->u2AssocId = 0;
3388 //4 <1.4> Setup Channel, Band and Phy Attributes
3389 prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3390 prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3392 if (prAisBssInfo->eBand == BAND_2G4) {
3394 prAisBssInfo->ucPhyTypeSet =
3395 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3397 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3401 prAisBssInfo->ucPhyTypeSet =
3402 prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3404 prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3407 //4 <1.5> Setup MIB for current BSS
3408 prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3409 prAisBssInfo->ucDTIMPeriod = 0;
3410 prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3412 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3414 #if CFG_PRIVACY_MIGRATION
3415 if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
3416 prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
3417 prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3418 prAisBssInfo->fgIsProtection = TRUE;
3421 prAisBssInfo->fgIsProtection = FALSE;
3424 prAisBssInfo->fgIsProtection = FALSE;
3427 //3 <2> Update BSS_INFO_T common part
3428 ibssInitForAdHoc(prAdapter, prAisBssInfo);
3433 //4 <3.1> Setup channel and bandwidth
3434 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3436 //4 <3.2> use command packets to inform firmware
3437 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3439 //4 <3.3> enable beaconing
3440 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3442 //4 <3.4> Update AdHoc PM parameter
3443 nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3445 //3 <4> Set ACTIVE flag.
3446 prAisBssInfo->fgIsBeaconActivated = TRUE;
3447 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3449 //3 <5> Start IBSS Alone Timer
3450 cnmTimerStartTimer(prAdapter,
3451 &prAisFsmInfo->rIbssAloneTimer,
3452 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3456 } /* end of aisCreateIBSS() */
3459 /*----------------------------------------------------------------------------*/
3461 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3462 * the existing IBSS was found.
3464 * @param[in] prStaRec Pointer to the STA_RECORD_T
3468 /*----------------------------------------------------------------------------*/
3470 aisUpdateBssInfoForMergeIBSS (
3471 IN P_ADAPTER_T prAdapter,
3472 IN P_STA_RECORD_T prStaRec
3475 P_AIS_FSM_INFO_T prAisFsmInfo;
3476 P_BSS_INFO_T prAisBssInfo;
3477 P_CONNECTION_SETTINGS_T prConnSettings;
3478 P_BSS_DESC_T prBssDesc;
3479 //UINT_16 u2IELength;
3485 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3486 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3487 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3489 cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3491 if (!prAisBssInfo->fgIsBeaconActivated) {
3493 //3 <1> Update BSS_INFO_T per Network Basis
3494 //4 <1.1> Setup Operation Mode
3495 prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3497 //4 <1.2> Setup SSID
3498 COPY_SSID(prAisBssInfo->aucSSID,
3499 prAisBssInfo->ucSSIDLen,
3500 prConnSettings->aucSSID,
3501 prConnSettings->ucSSIDLen);
3503 //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3504 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3505 prAisBssInfo->u2AssocId = 0;
3508 //3 <2> Update BSS_INFO_T from STA_RECORD_T
3509 //4 <2.1> Setup Capability
3510 prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
3512 if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3513 prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3514 prAisBssInfo->fgUseShortPreamble = TRUE;
3517 prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3518 prAisBssInfo->fgUseShortPreamble = FALSE;
3521 // 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0.
3522 prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
3523 prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
3525 if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3526 prAisBssInfo->fgIsProtection= TRUE;
3529 prAisBssInfo->fgIsProtection = FALSE;
3532 //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3533 prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3535 prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3537 prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3538 prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3540 rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3541 prAisBssInfo->u2BSSBasicRateSet,
3542 prAisBssInfo->aucAllSupportedRates,
3543 &prAisBssInfo->ucAllSupportedRatesLen);
3545 //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3548 //3 <4> Update BSS_INFO_T from BSS_DESC_T
3549 prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3551 prBssDesc->fgIsConnecting = FALSE;
3552 prBssDesc->fgIsConnected = TRUE;
3554 //4 <4.1> Setup BSSID
3555 COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3557 //4 <4.2> Setup Channel, Band
3558 prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3559 prAisBssInfo->eBand = prBssDesc->eBand;
3561 //4 <4.3> Setup MIB for current BSS
3562 prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3563 prAisBssInfo->ucDTIMPeriod = 0;
3564 prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3566 prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3569 // should never happen
3575 //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3577 UINT_8 ucLowestBasicRateIndex;
3579 if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3580 &ucLowestBasicRateIndex)) {
3582 if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3583 ucLowestBasicRateIndex = RATE_6M_INDEX;
3586 ucLowestBasicRateIndex = RATE_1M_INDEX;
3590 prAisBssInfo->ucHwDefaultFixedRateCode =
3591 aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3594 //4 <5.2> Setup channel and bandwidth
3595 rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3597 //4 <5.3> use command packets to inform firmware
3598 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3600 //4 <5.4> enable beaconing
3601 bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3603 //4 <5.5> Update AdHoc PM parameter
3604 nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3606 //3 <6> Set ACTIVE flag.
3607 prAisBssInfo->fgIsBeaconActivated = TRUE;
3608 prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3611 } /* end of aisUpdateBssInfoForMergeIBSS() */
3614 /*----------------------------------------------------------------------------*/
3616 * @brief This function will validate the Rx Probe Request Frame and then return
3617 * result to BSS to indicate if need to send the corresponding Probe Response
3618 * Frame if the specified conditions were matched.
3620 * @param[in] prAdapter Pointer to the Adapter structure.
3621 * @param[in] prSwRfb Pointer to SW RFB data structure.
3622 * @param[out] pu4ControlFlags Control flags for replying the Probe Response
3624 * @retval TRUE Reply the Probe Response
3625 * @retval FALSE Don't reply the Probe Response
3627 /*----------------------------------------------------------------------------*/
3629 aisValidateProbeReq (
3630 IN P_ADAPTER_T prAdapter,
3631 IN P_SW_RFB_T prSwRfb,
3632 OUT PUINT_32 pu4ControlFlags
3635 P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
3636 P_BSS_INFO_T prBssInfo;
3637 P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
3640 UINT_16 u2Offset = 0;
3641 BOOLEAN fgReplyProbeResp = FALSE;
3645 ASSERT(pu4ControlFlags);
3647 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3649 //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
3650 prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
3652 u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3653 pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3655 IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3656 if (ELEM_ID_SSID == IE_ID(pucIE)) {
3658 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3659 prIeSsid = (P_IE_SSID_T)pucIE;
3663 } /* end of IE_FOR_EACH */
3665 //4 <2> Check network conditions
3667 if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3670 ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
3671 EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
3672 prIeSsid->aucSSID, prIeSsid->ucLength)) ) {
3673 fgReplyProbeResp = TRUE;
3677 return fgReplyProbeResp;
3679 } /* end of aisValidateProbeReq() */
3681 #endif /* CFG_SUPPORT_ADHOC */
3683 /*----------------------------------------------------------------------------*/
3685 * @brief This function will modify and update necessary information to firmware
3686 * for disconnection handling
3688 * @param[in] prAdapter Pointer to the Adapter structure.
3692 /*----------------------------------------------------------------------------*/
3695 IN P_ADAPTER_T prAdapter,
3696 IN BOOLEAN fgDelayIndication
3699 P_BSS_INFO_T prAisBssInfo;
3703 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3705 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3707 #if CFG_SUPPORT_ADHOC
3708 if (prAisBssInfo->fgIsBeaconActivated) {
3709 nicUpdateBeaconIETemplate(prAdapter,
3710 IE_UPD_METHOD_DELETE_ALL,
3711 NETWORK_TYPE_AIS_INDEX,
3716 prAisBssInfo->fgIsBeaconActivated = FALSE;
3720 rlmBssAborted(prAdapter, prAisBssInfo);
3722 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3723 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3725 if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3726 scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3728 /* remove from scanning results as well */
3729 wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3731 /* trials for re-association */
3732 if (fgDelayIndication) {
3733 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3734 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3738 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3741 if (fgDelayIndication) {
3742 if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3743 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3747 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3751 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3755 //4 <4> Change Media State immediately.
3756 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3758 //4 <4.1> sync. with firmware
3759 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3761 if (!fgDelayIndication) {
3762 //4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have.
3763 if (prAisBssInfo->prStaRecOfAP) {
3764 //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3766 prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3770 #if CFG_SUPPORT_ROAMING
3771 roamingFsmRunEventAbort(prAdapter);
3773 /* clear pending roaming connection request */
3774 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
3775 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
3776 #endif /* CFG_SUPPORT_ROAMING */
3778 //4 <6> Indicate Disconnected Event to Host
3779 aisIndicationOfMediaStateToHost(prAdapter,
3780 PARAM_MEDIA_STATE_DISCONNECTED,
3784 //4 <7> Trigger AIS FSM
3785 aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3788 } /* end of aisFsmDisconnect() */
3791 /*----------------------------------------------------------------------------*/
3793 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3795 * @param[in] u4Param Unused timer parameter
3799 /*----------------------------------------------------------------------------*/
3801 aisFsmRunEventBGSleepTimeOut (
3802 IN P_ADAPTER_T prAdapter,
3806 P_AIS_FSM_INFO_T prAisFsmInfo;
3807 ENUM_AIS_STATE_T eNextState;
3809 DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3811 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3813 eNextState = prAisFsmInfo->eCurrentState;
3815 switch (prAisFsmInfo->eCurrentState) {
3816 case AIS_STATE_WAIT_FOR_NEXT_SCAN:
3817 DBGLOG(AIS, LOUD, ("EVENT - SCAN TIMER: Idle End - Current Time = %ld\n", kalGetTimeTick()));
3819 eNextState = AIS_STATE_LOOKING_FOR;
3821 SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3829 /* Call aisFsmSteps() when we are going to change AIS STATE */
3830 if (eNextState != prAisFsmInfo->eCurrentState) {
3831 aisFsmSteps(prAdapter, eNextState);
3835 } /* end of aisFsmBGSleepTimeout() */
3838 /*----------------------------------------------------------------------------*/
3840 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3842 * @param[in] u4Param Unused timer parameter
3846 /*----------------------------------------------------------------------------*/
3848 aisFsmRunEventIbssAloneTimeOut (
3849 IN P_ADAPTER_T prAdapter,
3853 P_AIS_FSM_INFO_T prAisFsmInfo;
3854 ENUM_AIS_STATE_T eNextState;
3856 DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3858 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3859 eNextState = prAisFsmInfo->eCurrentState;
3861 switch(prAisFsmInfo->eCurrentState) {
3862 case AIS_STATE_IBSS_ALONE:
3864 /* There is no one participate in our AdHoc during this TIMEOUT Interval
3865 * so go back to search for a valid IBSS again.
3868 DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3870 prAisFsmInfo->fgTryScan = TRUE;
3873 aisFsmReleaseCh(prAdapter);
3875 /* Pull back to SEARCH to find candidate again */
3876 eNextState = AIS_STATE_SEARCH;
3885 /* Call aisFsmSteps() when we are going to change AIS STATE */
3886 if (eNextState != prAisFsmInfo->eCurrentState) {
3887 aisFsmSteps(prAdapter, eNextState);
3891 } /* end of aisIbssAloneTimeOut() */
3894 /*----------------------------------------------------------------------------*/
3896 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3898 * @param[in] u4Param Unused timer parameter
3902 /*----------------------------------------------------------------------------*/
3904 aisFsmRunEventJoinTimeout (
3905 IN P_ADAPTER_T prAdapter,
3909 P_AIS_FSM_INFO_T prAisFsmInfo;
3910 ENUM_AIS_STATE_T eNextState;
3912 DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3914 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3915 eNextState = prAisFsmInfo->eCurrentState;
3917 switch(prAisFsmInfo->eCurrentState) {
3918 case AIS_STATE_JOIN:
3919 DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
3921 /* 1. Do abort JOIN */
3922 aisFsmStateAbort_JOIN(prAdapter);
3924 /* 2. Increase Join Failure Count */
3925 prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
3928 if(prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
3929 /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
3930 eNextState = AIS_STATE_SEARCH;
3933 /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
3934 eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
3937 eNextState = AIS_STATE_IDLE;
3940 case AIS_STATE_NORMAL_TR:
3941 /* 1. release channel */
3942 aisFsmReleaseCh(prAdapter);
3943 prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
3945 /* 2. process if there is pending scan */
3946 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
3947 wlanClearScanningResult(prAdapter);
3948 eNextState = AIS_STATE_ONLINE_SCAN;
3954 /* release channel */
3955 aisFsmReleaseCh(prAdapter);
3961 /* Call aisFsmSteps() when we are going to change AIS STATE */
3962 if (eNextState != prAisFsmInfo->eCurrentState) {
3963 aisFsmSteps(prAdapter, eNextState);
3967 } /* end of aisFsmRunEventJoinTimeout() */
3970 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
3971 /*----------------------------------------------------------------------------*/
3979 /*----------------------------------------------------------------------------*/
3985 P_MSG_AIS_ABORT_T prAisAbortMsg;
3986 P_CONNECTION_SETTINGS_T prConnSettings;
3987 UINT_8 aucSSID[]="pci-11n";
3990 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3992 /* Set Connection Request Issued Flag */
3993 prConnSettings->fgIsConnReqIssued = TRUE;
3994 prConnSettings->ucSSIDLen = ucSSIDLen;
3995 kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
3997 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
3998 if (!prAisAbortMsg) {
4000 ASSERT(0); // Can't trigger SCAN FSM
4004 prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
4006 mboxSendMsg(prAdapter,
4008 (P_MSG_HDR_T) prAisAbortMsg,
4009 MSG_SEND_METHOD_BUF);
4011 wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
4015 #endif /* CFG_TEST_MGMT_FSM */
4018 /*----------------------------------------------------------------------------*/
4020 * \brief This function is used to handle OID_802_11_BSSID_LIST_SCAN
4022 * \param[in] prAdapter Pointer of ADAPTER_T
4023 * \param[in] prSsid Pointer of SSID_T if specified
4024 * \param[in] pucIe Pointer to buffer of extra information elements to be attached
4025 * \param[in] u4IeLength Length of information elements
4029 /*----------------------------------------------------------------------------*/
4032 IN P_ADAPTER_T prAdapter,
4033 IN P_PARAM_SSID_T prSsid,
4035 IN UINT_32 u4IeLength
4038 P_CONNECTION_SETTINGS_T prConnSettings;
4039 P_BSS_INFO_T prAisBssInfo;
4040 P_AIS_FSM_INFO_T prAisFsmInfo;
4042 DEBUGFUNC("aisFsmScanRequest()");
4045 ASSERT(u4IeLength <= MAX_IE_LENGTH);
4047 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4048 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4049 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4051 if (!prConnSettings->fgIsScanReqIssued) {
4052 prConnSettings->fgIsScanReqIssued = TRUE;
4054 if(prSsid == NULL) {
4055 prAisFsmInfo->ucScanSSIDLen = 0;
4058 COPY_SSID(prAisFsmInfo->aucScanSSID,
4059 prAisFsmInfo->ucScanSSIDLen,
4061 (UINT_8)prSsid->u4SsidLen);
4064 if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4065 prAisFsmInfo->u4ScanIELength = u4IeLength;
4067 kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4070 prAisFsmInfo->u4ScanIELength = 0;
4073 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
4074 if(prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
4075 && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
4076 // 802.1x might not finished yet, pend it for later handling ..
4077 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4080 if(prAisFsmInfo->fgIsChannelGranted == TRUE) {
4081 DBGLOG(AIS, WARN, ("Scan Request with channel granted for join operation: %d, %d",
4082 prAisFsmInfo->fgIsChannelGranted,
4083 prAisFsmInfo->fgIsChannelRequested));
4086 /* start online scan */
4087 wlanClearScanningResult(prAdapter);
4088 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4091 else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4092 wlanClearScanningResult(prAdapter);
4093 aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4096 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4100 DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4104 } /* end of aisFsmScanRequest() */
4107 /*----------------------------------------------------------------------------*/
4109 * \brief This function is invoked when CNM granted channel privilege
4111 * \param[in] prAdapter Pointer of ADAPTER_T
4115 /*----------------------------------------------------------------------------*/
4117 aisFsmRunEventChGrant (
4118 IN P_ADAPTER_T prAdapter,
4119 IN P_MSG_HDR_T prMsgHdr
4122 P_BSS_INFO_T prAisBssInfo;
4123 P_AIS_FSM_INFO_T prAisFsmInfo;
4124 P_MSG_CH_GRANT_T prMsgChGrant;
4126 UINT_32 u4GrantInterval;
4131 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4132 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4133 prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4135 ucTokenID = prMsgChGrant->ucTokenID;
4136 u4GrantInterval = prMsgChGrant->u4GrantInterval;
4138 /* 1. free message */
4139 cnmMemFree(prAdapter, prMsgHdr);
4141 if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4142 prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4143 /* 2. channel privilege has been approved */
4144 prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4146 /* 3. state transition to join/ibss-alone/ibss-merge */
4147 /* 3.1 set timeout timer in cases join could not be completed */
4148 cnmTimerStartTimer(prAdapter,
4149 &prAisFsmInfo->rJoinTimeoutTimer,
4150 prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
4151 /* 3.2 set local variable to indicate join timer is ticking */
4152 prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
4154 /* 3.3 switch to join state */
4155 aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4157 prAisFsmInfo->fgIsChannelGranted = TRUE;
4159 else { /* mismatched grant */
4160 /* 2. return channel privilege to CNM immediately */
4161 aisFsmReleaseCh(prAdapter);
4165 } /* end of aisFsmRunEventChGrant() */
4168 /*----------------------------------------------------------------------------*/
4170 * \brief This function is to inform CNM that channel privilege
4173 * \param[in] prAdapter Pointer of ADAPTER_T
4177 /*----------------------------------------------------------------------------*/
4180 IN P_ADAPTER_T prAdapter
4183 P_AIS_FSM_INFO_T prAisFsmInfo;
4184 P_MSG_CH_ABORT_T prMsgChAbort;
4188 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4190 if(prAisFsmInfo->fgIsChannelGranted == TRUE
4191 || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4193 prAisFsmInfo->fgIsChannelRequested = FALSE;
4194 prAisFsmInfo->fgIsChannelGranted = FALSE;
4196 /* 1. return channel privilege to CNM immediately */
4197 prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
4198 if (!prMsgChAbort) {
4199 ASSERT(0); // Can't release Channel to CNM
4203 prMsgChAbort->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
4204 prMsgChAbort->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX;
4205 prMsgChAbort->ucTokenID = prAisFsmInfo->ucSeqNumOfChReq;
4207 mboxSendMsg(prAdapter,
4209 (P_MSG_HDR_T) prMsgChAbort,
4210 MSG_SEND_METHOD_BUF);
4214 } /* end of aisFsmReleaseCh() */
4217 /*----------------------------------------------------------------------------*/
4219 * \brief This function is to inform AIS that corresponding beacon has not
4220 * been received for a while and probing is not successful
4222 * \param[in] prAdapter Pointer of ADAPTER_T
4226 /*----------------------------------------------------------------------------*/
4228 aisBssBeaconTimeout (
4229 IN P_ADAPTER_T prAdapter
4232 P_BSS_INFO_T prAisBssInfo;
4233 BOOLEAN fgDoAbortIndication = FALSE;
4237 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4239 //4 <1> Diagnose Connection for Beacon Timeout Event
4240 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4241 if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
4242 P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
4245 fgDoAbortIndication = TRUE;
4248 else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4249 fgDoAbortIndication = TRUE;
4253 //4 <2> invoke abort handler
4254 if (fgDoAbortIndication) {
4255 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4259 } /* end of aisBssBeaconTimeout() */
4262 /*----------------------------------------------------------------------------*/
4264 * \brief This function is to inform AIS that DEAUTH frame has been
4265 * sent and thus state machine could go ahead
4267 * \param[in] prAdapter Pointer of ADAPTER_T
4268 * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
4269 * \param[in] prAdapter Pointer of ADAPTER_T
4271 * \return WLAN_STATUS_SUCCESS
4273 /*----------------------------------------------------------------------------*/
4275 aisDeauthXmitComplete (
4276 IN P_ADAPTER_T prAdapter,
4277 IN P_MSDU_INFO_T prMsduInfo,
4278 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
4281 P_AIS_FSM_INFO_T prAisFsmInfo;
4285 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4287 if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4288 if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4289 aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4293 DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4296 return WLAN_STATUS_SUCCESS;
4298 } /* end of aisDeauthXmitComplete() */
4300 #if CFG_SUPPORT_ROAMING
4301 /*----------------------------------------------------------------------------*/
4303 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4305 * @param[in] u4ReqScan Requesting Scan or not
4309 /*----------------------------------------------------------------------------*/
4311 aisFsmRunEventRoamingDiscovery (
4312 IN P_ADAPTER_T prAdapter,
4316 P_AIS_FSM_INFO_T prAisFsmInfo;
4317 P_CONNECTION_SETTINGS_T prConnSettings;
4318 ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4320 DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4322 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4323 prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4325 /* search candidates by best rssi */
4326 prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4328 /* results are still new */
4330 roamingFsmRunEventRoam(prAdapter);
4331 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4334 if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4335 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4336 eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4339 eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4343 if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
4344 if(eAisRequest == AIS_REQUEST_ROAMING_SEARCH) {
4345 aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
4348 aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4352 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4353 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4355 aisFsmInsertRequest(prAdapter, eAisRequest);
4359 } /* end of aisFsmRunEventRoamingDiscovery() */
4361 /*----------------------------------------------------------------------------*/
4363 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4369 /*----------------------------------------------------------------------------*/
4371 aisFsmRoamingScanResultsUpdate (
4372 IN P_ADAPTER_T prAdapter
4375 P_AIS_FSM_INFO_T prAisFsmInfo;
4376 P_ROAMING_INFO_T prRoamingFsmInfo;
4377 ENUM_AIS_STATE_T eNextState;
4379 DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4381 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4382 prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4384 roamingFsmScanResultsUpdate(prAdapter);
4386 eNextState = prAisFsmInfo->eCurrentState;
4387 if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4388 roamingFsmRunEventRoam(prAdapter);
4389 eNextState = AIS_STATE_SEARCH;
4391 else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4392 eNextState = AIS_STATE_SEARCH;
4394 else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4395 eNextState = AIS_STATE_NORMAL_TR;
4399 } /* end of aisFsmRoamingScanResultsUpdate() */
4401 /*----------------------------------------------------------------------------*/
4403 * @brief This function will modify and update necessary information to firmware
4404 * for disconnection of last AP before switching to roaming bss.
4406 * @param IN prAdapter Pointer to the Adapter structure.
4407 * prTargetStaRec Target of StaRec of roaming
4411 /*----------------------------------------------------------------------------*/
4413 aisFsmRoamingDisconnectPrevAP (
4414 IN P_ADAPTER_T prAdapter,
4415 IN P_STA_RECORD_T prTargetStaRec
4418 P_BSS_INFO_T prAisBssInfo;
4420 DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4424 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4426 nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4428 /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
4429 * to be reset. RLM related parameters will be reset again when handling
4430 * association response in rlmProcessAssocRsp(). 20110413
4432 //rlmBssAborted(prAdapter, prAisBssInfo);
4434 //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
4435 if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4436 scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
4439 //4 <4> Change Media State immediately.
4440 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4442 //4 <4.1> sync. with firmware
4443 prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */
4444 nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
4445 prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */
4448 } /* end of aisFsmRoamingDisconnectPrevAP() */
4450 /*----------------------------------------------------------------------------*/
4452 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4453 * the roaming was completed.
4455 * @param IN prAdapter Pointer to the Adapter structure.
4456 * prStaRec StaRec of roaming AP
4461 /*----------------------------------------------------------------------------*/
4463 aisUpdateBssInfoForRoamingAP (
4464 IN P_ADAPTER_T prAdapter,
4465 IN P_STA_RECORD_T prStaRec,
4466 IN P_SW_RFB_T prAssocRspSwRfb
4469 P_BSS_INFO_T prAisBssInfo;
4471 DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4475 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4477 //4 <1.1> Change FW's Media State immediately.
4478 aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4480 //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
4481 if ((prAisBssInfo->prStaRecOfAP) &&
4482 (prAisBssInfo->prStaRecOfAP != prStaRec) &&
4483 (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
4484 cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
4487 //4 <1.3> Update BSS_INFO_T
4488 aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4490 //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4491 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4493 //4 <1.6> Indicate Connected Event to Host immediately.
4494 /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
4495 aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
4498 } /* end of aisFsmRoamingUpdateBss() */
4500 #endif /* CFG_SUPPORT_ROAMING */
4503 /*----------------------------------------------------------------------------*/
4505 * @brief Check if there is any pending request and remove it (optional)
4514 /*----------------------------------------------------------------------------*/
4516 aisFsmIsRequestPending (
4517 IN P_ADAPTER_T prAdapter,
4518 IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4522 P_AIS_FSM_INFO_T prAisFsmInfo;
4523 P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4526 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4528 /* traverse through pending request list */
4529 LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4530 prPendingReqHdrNext,
4531 &(prAisFsmInfo->rPendingReqList),
4534 /* check for specified type */
4535 if(prPendingReqHdr->eReqType == eReqType) {
4536 /* check if need to remove */
4537 if(bRemove == TRUE) {
4538 LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList), &(prPendingReqHdr->rLinkEntry));
4540 cnmMemFree(prAdapter, prPendingReqHdr);
4551 /*----------------------------------------------------------------------------*/
4553 * @brief Get next pending request
4557 * @return P_AIS_REQ_HDR_T
4559 /*----------------------------------------------------------------------------*/
4561 aisFsmGetNextRequest (
4562 IN P_ADAPTER_T prAdapter
4565 P_AIS_FSM_INFO_T prAisFsmInfo;
4566 P_AIS_REQ_HDR_T prPendingReqHdr;
4569 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4571 LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4573 return prPendingReqHdr;
4577 /*----------------------------------------------------------------------------*/
4579 * @brief Insert a new request
4587 /*----------------------------------------------------------------------------*/
4589 aisFsmInsertRequest (
4590 IN P_ADAPTER_T prAdapter,
4591 IN ENUM_AIS_REQUEST_TYPE_T eReqType
4594 P_AIS_REQ_HDR_T prAisReq;
4595 P_AIS_FSM_INFO_T prAisFsmInfo;
4598 prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4600 prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4603 ASSERT(0); // Can't generate new message
4607 prAisReq->eReqType = eReqType;
4609 /* attach request into pending request list */
4610 LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4616 /*----------------------------------------------------------------------------*/
4618 * @brief Flush all pending requests
4624 /*----------------------------------------------------------------------------*/
4626 aisFsmFlushRequest (
4627 IN P_ADAPTER_T prAdapter
4630 P_AIS_REQ_HDR_T prAisReq;
4634 while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4635 cnmMemFree(prAdapter, prAisReq);