MT6620: add the new driver JB2 V1.0
[firefly-linux-kernel-4.4.55.git] / drivers / mtk_wcn_combo / drv_wlan / mt6620 / wlan / mgmt / ais_fsm.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/ais_fsm.c#1 $
3 */
4
5 /*! \file   "aa_fsm.c"
6     \brief  This file defines the FSM for SAA and AAA MODULE.
7
8     This file defines the FSM for SAA and AAA MODULE.
9 */
10
11
12
13 /*
14 ** $Log: ais_fsm.c $
15 **
16 ** 11 15 2012 cp.wu
17 ** [ALPS00382763] N820_JB:[WIFI]N820JB WLAN ±K???,«ÝÉó?¬y¥\¯Ó¤j
18 ** do not try reconnecting when being disconnected by the peer
19  *
20  * 04 20 2012 cp.wu
21  * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
22  * correct macro
23  *
24  * 01 16 2012 cp.wu
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.
27  *
28  * 11 24 2011 wh.su
29  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
30  * Adjust code for DBG and CONFIG_XLOG.
31  *
32  * 11 22 2011 cp.wu
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
37  *
38  * 11 11 2011 wh.su
39  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
40  * modify the xlog related code.
41  *
42  * 11 04 2011 cp.wu
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.
45  *
46  * 11 04 2011 cp.wu
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
50  *
51  * 11 02 2011 wh.su
52  * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
53  * adding the code for XLOG.
54  *
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.
58  *
59  * 10 25 2011 cm.chang
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
62  *
63  * 10 13 2011 cp.wu
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
67  *
68  * 10 12 2011 wh.su
69  * [WCXRP00001036] [MT6620 Wi-Fi][Driver][FW] Adding the 802.11w code for MFP
70  * adding the 802.11w related function and define .
71  *
72  * 09 30 2011 cm.chang
73  * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
74  * .
75  *
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.
79  *
80  * 09 20 2011 cm.chang
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
83  *
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.
87  *
88  * 08 24 2011 chinghwa.yu
89  * [WCXRP00000612] [MT6620 Wi-Fi] [FW] CSD update SWRDD algorithm
90  * Update RDD test mode cases.
91  *
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.
95  *
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.
99  *
100  * 07 07 2011 cp.wu
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
103  *
104  * 06 28 2011 cp.wu
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.
107  *
108  * 06 23 2011 cp.wu
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
111  *
112  * 06 20 2011 cp.wu
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
116  *
117  * 06 16 2011 cp.wu
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
120  *
121  * 06 16 2011 cp.wu
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.
124  *
125  * 06 16 2011 cp.wu
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.
128  *
129  * 06 16 2011 cp.wu
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.
132  *
133  * 06 16 2011 cp.wu
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.
136  *
137  * 06 14 2011 cp.wu
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
140  *
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.
144  *
145  * 06 02 2011 cp.wu
146  * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
147  * eliminate unused parameters for SAA-FSM
148  *
149  * 05 18 2011 cp.wu
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.
152  *
153  * 05 17 2011 cp.wu
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.
156  *
157  * 04 14 2011 cm.chang
158  * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
159  * .
160  *
161  * 04 13 2011 george.huang
162  * [WCXRP00000628] [MT6620 Wi-Fi][FW][Driver] Modify U-APSD setting to default OFF
163  * remove assert
164  *
165  * 03 18 2011 cp.wu
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
168  *
169  * 03 17 2011 chinglan.wang
170  * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
171  * .
172  *
173  * 03 17 2011 chinglan.wang
174  * [WCXRP00000570] [MT6620 Wi-Fi][Driver] Add Wi-Fi Protected Setup v2.0 feature
175  * .
176  *
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.
180  *
181  * 03 11 2011 cp.wu
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
184  *
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.
188  *
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.
192  *
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.
196  *
197  * 03 04 2011 cp.wu
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.
200  *
201  * 03 02 2011 cp.wu
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.
204  *
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.
208  *
209  * 02 23 2011 cp.wu
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
212  *
213  * 02 22 2011 cp.wu
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.
216  *
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.
220  *
221  * 02 01 2011 cp.wu
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.
224  *
225  * 01 27 2011 tsaiyuan.hsu
226  * [WCXRP00000392] [MT6620 Wi-Fi][Driver] Add Roaming Support
227  * add roaming fsm
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.
232  *
233  * 01 26 2011 yuche.tsai
234  * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
235  * .
236  *
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.
240  *
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.
244  *
245  * 01 14 2011 cp.wu
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.
249  *
250  * 01 11 2011 cp.wu
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
253  *
254  * 01 10 2011 cp.wu
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.
257  *
258  * 01 03 2011 cp.wu
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
261  *
262  * 12 30 2010 cp.wu
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
265  *
266  * 12 27 2010 cp.wu
267  * [WCXRP00000269] [MT6620 Wi-Fi][Driver][Firmware] Prepare for v1.1 branch release
268  * add DEBUGFUNC() macro invoking for more detailed debugging information
269  *
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
274  *
275  * 12 17 2010 cp.wu
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
278  *
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
283  *
284  * 11 25 2010 yuche.tsai
285  * NULL
286  * Update SLT Function for QoS Support and not be affected by fixed rate function.
287  *
288  * 11 25 2010 cp.wu
289  * [WCXRP00000208] [MT6620 Wi-Fi][Driver] Add scanning with specified SSID to AIS FSM
290  * add scanning with specified SSID facility to AIS-FSM
291  *
292  * 11 01 2010 cp.wu
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.
297  *
298  * 10 26 2010 cp.wu
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
306  *
307  * 10 14 2010 wh.su
308  * [WCXRP00000097] [MT6620 Wi-Fi] [Driver] Fixed the P2P not setting the fgIsChannelExt value make scan not abort
309  * initial the fgIsChannelExt value.
310  *
311  * 10 08 2010 cp.wu
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
314  *
315  * 10 04 2010 cp.wu
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
318  *
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.
322  *
323  * 09 23 2010 cp.wu
324  * [WCXRP00000049] [MT6620 Wi-Fi][Driver] Adhoc cannot be created successfully.
325  * keep IBSS-ALONE state retrying until further instruction is received
326  *
327  * 09 21 2010 cp.wu
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
330  *
331  * 09 09 2010 yuche.tsai
332  * NULL
333  * Fix NULL IE Beacon issue. Sync Beacon Content to FW before enable beacon.
334  * Both in IBSS Create & IBSS Merge
335  *
336  * 09 09 2010 cp.wu
337  * NULL
338  * frequency is in unit of KHz thus no need to divide 1000 once more.
339  *
340  * 09 06 2010 cp.wu
341  * NULL
342  * 1) initialize for correct parameter even for disassociation.
343  * 2) AIS-FSM should have a limit on trials to build connection
344  *
345  * 09 03 2010 kevin.huang
346  * NULL
347  * Refine #include sequence and solve recursive/nested #include issue
348  *
349  * 08 30 2010 cp.wu
350  * NULL
351  * eliminate klockwork errors
352  *
353  * 08 29 2010 yuche.tsai
354  * NULL
355  * Finish SLT TX/RX & Rate Changing Support.
356  *
357  * 08 25 2010 cp.wu
358  * NULL
359  * add option for enabling AIS 5GHz scan
360  *
361  * 08 25 2010 cp.wu
362  * NULL
363  * [AIS-FSM] IBSS no longer needs to acquire channel for beaconing, RLM/CNM will handle the channel switching when BSS information is updated
364  *
365  * 08 25 2010 george.huang
366  * NULL
367  * update OID/ registry control path for PM related settings
368  *
369  * 08 24 2010 cm.chang
370  * NULL
371  * Support RLM initail channel of Ad-hoc, P2P and BOW
372  *
373  * 08 20 2010 cm.chang
374  * NULL
375  * Migrate RLM code to host from FW
376  *
377  * 08 12 2010 cp.wu
378  * NULL
379  * check-in missed files.
380  *
381  * 08 12 2010 kevin.huang
382  * NULL
383  * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
384  *
385  * 08 09 2010 cp.wu
386  * NULL
387  * reset fgIsScanReqIssued when abort request is received right after join completion.
388  *
389  * 08 03 2010 cp.wu
390  * NULL
391  * surpress compilation warning.
392  *
393  * 08 02 2010 cp.wu
394  * NULL
395  * comment out deprecated members in BSS_INFO, which are only used by firmware rather than driver.
396  *
397  * 07 30 2010 cp.wu
398  * NULL
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
402  *
403  * 07 29 2010 cp.wu
404  * NULL
405  * eliminate u4FreqInKHz usage, combined into rConnections.ucAdHoc*
406  *
407  * 07 29 2010 cp.wu
408  * NULL
409  * allocate on MGMT packet for IBSS beaconing.
410  *
411  * 07 29 2010 cp.wu
412  * NULL
413  * [AIS-FSM] fix: when join failed, release channel privilege as well
414  *
415  * 07 28 2010 cp.wu
416  * NULL
417  * reuse join-abort sub-procedure to reduce code size.
418  *
419  * 07 28 2010 cp.wu
420  * NULL
421  * 1) eliminate redundant variable eOPMode in prAdapter->rWlanInfo
422  * 2) change nicMediaStateChange() API prototype
423  *
424  * 07 26 2010 cp.wu
425  *
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
427  *
428  * 07 26 2010 cp.wu
429  *
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
432  *
433  * 07 26 2010 cp.wu
434  *
435  * re-commit code logic being overwriten.
436  *
437  * 07 24 2010 wh.su
438  *
439  * .support the Wi-Fi RSN
440  *
441  * 07 23 2010 cp.wu
442  *
443  * 1) re-enable AIS-FSM beacon timeout handling.
444  * 2) scan done API revised
445  *
446  * 07 23 2010 cp.wu
447  *
448  * 1) enable Ad-Hoc
449  * 2) disable beacon timeout handling temporally due to unexpected beacon timeout event.
450  *
451  * 07 23 2010 cp.wu
452  *
453  * indicate scan done for linux wireless extension
454  *
455  * 07 23 2010 cp.wu
456  *
457  * add AIS-FSM handling for beacon timeout event.
458  *
459  * 07 22 2010 cp.wu
460  *
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
464  *
465  * 07 21 2010 cp.wu
466  *
467  * separate AIS-FSM states into different cases of channel request.
468  *
469  * 07 21 2010 cp.wu
470  *
471  * 1) change BG_SCAN to ONLINE_SCAN for consistent term
472  * 2) only clear scanning result when scan is permitted to do
473  *
474  * 07 20 2010 cp.wu
475  *
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
478  *
479  * 07 20 2010 cp.wu
480  *
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
483  *
484  * 07 19 2010 cp.wu
485  *
486  * 1) init AIS_BSS_INFO as channel number = 1 with band = 2.4GHz
487  * 2) correct typo
488  *
489  * 07 19 2010 wh.su
490  *
491  * update for security supporting.
492  *
493  * 07 19 2010 cp.wu
494  *
495  * [WPD00003833] [MT6620 and MT5931] Driver migration.
496  * when IBSS is being merged-in, send command packet to PM for connected indication
497  *
498  * 07 19 2010 cp.wu
499  *
500  * [WPD00003833] [MT6620 and MT5931] Driver migration.
501  * Add Ad-Hoc support to AIS-FSM
502  *
503  * 07 19 2010 jeffrey.chang
504  *
505  * Linux port modification
506  *
507  * 07 16 2010 cp.wu
508  *
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
514  *
515  * 07 15 2010 cp.wu
516  *
517  * [WPD00003833] [MT6620 and MT5931] Driver migration.
518  * for AIS scanning, driver specifies no extra IE for probe request
519  *
520  * 07 15 2010 cp.wu
521  *
522  * [WPD00003833] [MT6620 and MT5931] Driver migration.
523  * driver no longer generates probe request frames
524  *
525  * 07 14 2010 yarco.yang
526  *
527  * Remove CFG_MQM_MIGRATION
528  *
529  * 07 14 2010 cp.wu
530  *
531  * [WPD00003833] [MT6620 and MT5931] Driver migration.
532  * Refine AIS-FSM by divided into more states
533  *
534  * 07 13 2010 cm.chang
535  *
536  * Rename MSG_CH_RELEASE_T to MSG_CH_ABORT_T
537  *
538  * 07 09 2010 cp.wu
539  *
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
543  *
544  * 07 09 2010 george.huang
545  *
546  * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
547  *
548  * 07 08 2010 cp.wu
549  *
550  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
551  *
552  * 07 08 2010 cp.wu
553  * [WPD00003833][MT6620 and MT5931] Driver migration
554  * take use of RLM module for parsing/generating HT IEs for 11n capability
555  *
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
559  *
560  * 07 07 2010 cp.wu
561  * [WPD00003833][MT6620 and MT5931] Driver migration
562  * for first connection, if connecting failed do not enter into scan state.
563  *
564  * 07 06 2010 cp.wu
565  * [WPD00003833][MT6620 and MT5931] Driver migration
566  * once STA-REC is allocated and updated, invoke cnmStaRecChangeState() to sync. with firmware.
567  *
568  * 07 06 2010 george.huang
569  * [WPD00001556]Basic power managemenet function
570  * Update arguments for nicUpdateBeaconIETemplate()
571  *
572  * 07 06 2010 cp.wu
573  * [WPD00003833][MT6620 and MT5931] Driver migration
574  * STA-REC is maintained by CNM only.
575  *
576  * 07 05 2010 cp.wu
577  * [WPD00003833][MT6620 and MT5931] Driver migration
578  * remove unused definitions.
579  *
580  * 07 01 2010 cp.wu
581  * [WPD00003833][MT6620 and MT5931] Driver migration
582  * AIS-FSM integration with CNM channel request messages
583  *
584  * 07 01 2010 cp.wu
585  * [WPD00003833][MT6620 and MT5931] Driver migration
586  * implementation of DRV-SCN and related mailbox message handling.
587  *
588  * 06 30 2010 cp.wu
589  * [WPD00003833][MT6620 and MT5931] Driver migration
590  * sync. with CMD/EVENT document ver0.07.
591  *
592  * 06 29 2010 cp.wu
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
600  *
601  * 06 25 2010 cp.wu
602  * [WPD00003833][MT6620 and MT5931] Driver migration
603  * modify Beacon/ProbeResp to complete parsing,
604  * because host software has looser memory usage restriction
605  *
606  * 06 23 2010 cp.wu
607  * [WPD00003833][MT6620 and MT5931] Driver migration
608  * integrate .
609  *
610  * 06 22 2010 cp.wu
611  * [WPD00003833][MT6620 and MT5931] Driver migration
612  * comment out RLM APIs by CFG_RLM_MIGRATION.
613  *
614  * 06 22 2010 cp.wu
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.
619  *
620  * 06 21 2010 yarco.yang
621  * [WPD00003837][MT6620]Data Path Refine
622  * Support CFG_MQM_MIGRATION flag
623  *
624  * 06 21 2010 cp.wu
625  * [WPD00003833][MT6620 and MT5931] Driver migration
626  * add scan_fsm into building.
627  *
628  * 06 21 2010 cp.wu
629  * [WPD00003833][MT6620 and MT5931] Driver migration
630  * RSN/PRIVACY compilation flag awareness correction
631  *
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
635  *
636  * 06 18 2010 wh.su
637  * [WPD00003840][MT6620 5931] Security migration
638  * migration from MT6620 firmware.
639  *
640  * 06 15 2010 cp.wu
641  * [WPD00003833][MT6620 and MT5931] Driver migration
642  * add scan.c.
643  *
644  * 06 14 2010 cp.wu
645  * [WPD00003833][MT6620 and MT5931] Driver migration
646  * restore utility function invoking via hem_mbox to direct calls
647  *
648  * 06 11 2010 cp.wu
649  * [WPD00003833][MT6620 and MT5931] Driver migration
650  * auth.c is migrated.
651  *
652  * 06 11 2010 cp.wu
653  * [WPD00003833][MT6620 and MT5931] Driver migration
654  * add bss.c.
655  *
656  * 06 11 2010 cp.wu
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
663  *
664  * 06 10 2010 cp.wu
665  * [WPD00003833][MT6620 and MT5931] Driver migration
666  * change to enqueue TX frame infinitely.
667  *
668  * 06 10 2010 cp.wu
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)
672  *
673  * 06 10 2010 cp.wu
674  * [WPD00003833][MT6620 and MT5931] Driver migration
675  * add buildable & linkable ais_fsm.c
676  *
677  * related reference are still waiting to be resolved
678  *
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
682  *
683  * 05 28 2010 kevin.huang
684  * [BORA00000794][WIFISYS][New Feature]Power Management Support
685  * Add ClientList handling API - bssClearClientList, bssAddStaRecToClientList
686  *
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.
690  *
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.
694  *
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
698  *
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
702  *
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
706  *
707  * 05 12 2010 kevin.huang
708  * [BORA00000794][WIFISYS][New Feature]Power Management Support
709  * Add Power Management - Legacy PS-POLL support.
710  *
711  * 04 28 2010 tehuang.liu
712  * [BORA00000605][WIFISYS] Phase3 Integration
713  * Removed the use of compiling flag MQM_WMM_PARSING
714  *
715  * 04 27 2010 kevin.huang
716  * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
717  *
718  * Fix typo
719  *
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
723  *
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
727  *
728  * 04 15 2010 wh.su
729  * [BORA00000680][MT6620] Support the statistic for Microsoft os query
730  * fixed the protected bit at cap info for ad-hoc.
731  *
732  * 04 13 2010 kevin.huang
733  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
734  * Add new HW CH macro support
735  *
736  * 04 07 2010 chinghwa.yu
737  * [BORA00000563]Add WiFi CoEx BCM module
738  * Add TX Power Control RCPI function.
739  *
740  * 03 29 2010 wh.su
741  * [BORA00000605][WIFISYS] Phase3 Integration
742  * move the wlan table alloc / free to change state function.
743  *
744  * 03 25 2010 wh.su
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.
747  *
748  * 03 24 2010 wh.su
749  * [BORA00000605][WIFISYS] Phase3 Integration
750  * fixed some WHQL testing error.
751  *
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
755  *
756  * 03 16 2010 kevin.huang
757  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
758  * Add AdHoc Mode
759  *
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
763  *
764  * 03 03 2010 kevin.huang
765  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
766  * Add PHY_CONFIG to change Phy Type
767  *
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.
771  *
772  * 03 03 2010 chinghwa.yu
773  * [BORA00000563]Add WiFi CoEx BCM module
774  * Remove wmt_task definition and add PTA function.
775  *
776  * 03 02 2010 tehuang.liu
777  * [BORA00000569][WIFISYS] Phase 2 Integration Test
778  * Init TXM and MQM testing procedures in aisFsmRunEventJoinComplete()
779  *
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
783  *
784  * 03 01 2010 wh.su
785  * [BORA00000605][WIFISYS] Phase3 Integration
786  * clear the pmkid cache while indicate media disconnect.
787  *
788  * 02 26 2010 tehuang.liu
789  * [BORA00000569][WIFISYS] Phase 2 Integration Test
790  * .
791  *
792  * 02 26 2010 tehuang.liu
793  * [BORA00000569][WIFISYS] Phase 2 Integration Test
794  * Enabled MQM parsing WMM IEs for non-AP mode
795  *
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
799  *
800  * 02 25 2010 wh.su
801  * [BORA00000605][WIFISYS] Phase3 Integration
802  * use the Rx0 dor event indicate.
803  *
804  * 02 23 2010 kevin.huang
805  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
806  * Support dynamic channel selection
807  *
808  * 02 23 2010 wh.su
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
811  *
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
815  *
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
819  *
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
823  *
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()
827  *
828  * 01 27 2010 wh.su
829  * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
830  * add and fixed some security function.
831  *
832  * 01 22 2010 cm.chang
833  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
834  * Support protection and bandwidth switch
835  *
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
839  *
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
843  *
844  * 01 14 2010 chinghwa.yu
845  * [BORA00000563]Add WiFi CoEx BCM module
846  * Add WiFi BCM module for the 1st time.
847  *
848  * 01 11 2010 kevin.huang
849  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
850  * Add Deauth and Disassoc Handler
851  *
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
855  *
856  * Refine JOIN Complete and seperate the function of Media State indication
857  *
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
861  *
862  * 12 18 2009 cm.chang
863  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
864  * .
865  *
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,
869  *
870  * Dec 10 2009 mtk01104
871  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
872  * Different function prototype of wifi_send_msg()
873  *
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
877  *
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
881  *
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
885  *
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()
889  *
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
893  *
894  * Dec 3 2009 mtk01461
895  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
896  * Remove redundant declaration
897  *
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
901  *
902  * Nov 30 2009 mtk01461
903  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
904  * Rename u4RSSI to i4RSSI
905  *
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
909  *
910  * Nov 30 2009 mtk01461
911  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
912  * Add fgIsScanReqIssued to CONNECTION_SETTINGS_T
913  *
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
917  *
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
921  *
922  * Nov 23 2009 mtk01461
923  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
924  * Add aisFsmInitializeConnectionSettings()
925  *
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()
929  *
930  * Nov 16 2009 mtk01461
931  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
932  *
933 */
934
935 /*******************************************************************************
936 *                         C O M P I L E R   F L A G S
937 ********************************************************************************
938 */
939
940 /*******************************************************************************
941 *                    E X T E R N A L   R E F E R E N C E S
942 ********************************************************************************
943 */
944 #include "precomp.h"
945
946 /*******************************************************************************
947 *                              C O N S T A N T S
948 ********************************************************************************
949 */
950 #define AIS_ROAMING_CONNECTION_TRIAL_LIMIT  2
951
952 /*******************************************************************************
953 *                             D A T A   T Y P E S
954 ********************************************************************************
955 */
956
957 /*******************************************************************************
958 *                            P U B L I C   D A T A
959 ********************************************************************************
960 */
961
962 /*******************************************************************************
963 *                           P R I V A T E   D A T A
964 ********************************************************************************
965 */
966 #if DBG
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")
981 };
982 /*lint -restore */
983 #endif /* DBG */
984
985 /*******************************************************************************
986 *                                 M A C R O S
987 ********************************************************************************
988 */
989
990 /*******************************************************************************
991 *                   F U N C T I O N   D E C L A R A T I O N S
992 ********************************************************************************
993 */
994
995 /*******************************************************************************
996 *                              F U N C T I O N S
997 ********************************************************************************
998 */
999 /*----------------------------------------------------------------------------*/
1000 /*!
1001 * @brief the function is used to initialize the value of the connection settings for
1002 *        AIS network
1003 *
1004 * @param (none)
1005 *
1006 * @return (none)
1007 */
1008 /*----------------------------------------------------------------------------*/
1009 VOID
1010 aisInitializeConnectionSettings (
1011     IN P_ADAPTER_T prAdapter,
1012     IN P_REG_INFO_T prRegInfo
1013     )
1014 {
1015     P_CONNECTION_SETTINGS_T prConnSettings;
1016     UINT_8 aucAnyBSSID[] = BC_BSSID;
1017     UINT_8 aucZeroMacAddr[] = NULL_MAC_ADDR;
1018     int i = 0;
1019
1020     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1021
1022     /* Setup default values for operation */
1023     COPY_MAC_ADDR(prConnSettings->aucMacAddress, aucZeroMacAddr);
1024
1025     prConnSettings->ucDelayTimeOfDisconnectEvent = AIS_DELAY_TIME_OF_DISCONNECT_SEC;
1026
1027     COPY_MAC_ADDR(prConnSettings->aucBSSID, aucAnyBSSID);
1028     prConnSettings->fgIsConnByBssidIssued = FALSE;
1029
1030     prConnSettings->fgIsConnReqIssued = FALSE;
1031     prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
1032
1033     prConnSettings->ucSSIDLen = 0;
1034
1035     prConnSettings->eOPMode = NET_TYPE_INFRA;
1036
1037     prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
1038
1039     if(prRegInfo) {
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);
1043     }
1044
1045     prConnSettings->eAuthMode = AUTH_MODE_OPEN;
1046
1047     prConnSettings->eEncStatus = ENUM_ENCRYPTION_DISABLED;
1048
1049     prConnSettings->fgIsScanReqIssued = FALSE;
1050
1051     /* MIB attributes */
1052     prConnSettings->u2BeaconPeriod = DOT11_BEACON_PERIOD_DEFAULT;
1053
1054     prConnSettings->u2RTSThreshold = DOT11_RTS_THRESHOLD_DEFAULT;
1055
1056     prConnSettings->u2DesiredNonHTRateSet = RATE_SET_ALL_ABG;
1057
1058     //prConnSettings->u4FreqInKHz; /* Center frequency */
1059
1060
1061     /* Set U-APSD AC */
1062     prConnSettings->bmfgApsdEnAc = PM_UAPSD_NONE;
1063
1064     secInit(prAdapter, NETWORK_TYPE_AIS_INDEX);
1065
1066     /* Features */
1067     prConnSettings->fgIsEnableRoaming = FALSE;
1068 #if CFG_SUPPORT_ROAMING
1069     if(prRegInfo) {
1070         prConnSettings->fgIsEnableRoaming = ((prRegInfo->fgDisRoaming > 0)?(FALSE):(TRUE));
1071     }
1072 #endif /* CFG_SUPPORT_ROAMING */
1073
1074     prConnSettings->fgIsAdHocQoSEnable = FALSE;
1075
1076     prConnSettings->eDesiredPhyConfig = PHY_CONFIG_802_11ABGN;
1077
1078     /* Set default bandwidth modes */
1079     prConnSettings->uc2G4BandwidthMode = CONFIG_BW_20M;
1080     prConnSettings->uc5GBandwidthMode = CONFIG_BW_20_40M;
1081
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;
1093
1094     return;
1095 } /* end of aisFsmInitializeConnectionSettings() */
1096
1097
1098 /*----------------------------------------------------------------------------*/
1099 /*!
1100 * @brief the function is used to initialize the value in AIS_FSM_INFO_T for
1101 *        AIS FSM operation
1102 *
1103 * @param (none)
1104 *
1105 * @return (none)
1106 */
1107 /*----------------------------------------------------------------------------*/
1108 VOID
1109 aisFsmInit (
1110     IN P_ADAPTER_T prAdapter
1111     )
1112 {
1113     P_AIS_FSM_INFO_T prAisFsmInfo;
1114     P_BSS_INFO_T prAisBssInfo;
1115     P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1116
1117     DEBUGFUNC("aisFsmInit()");
1118     DBGLOG(SW1, INFO, ("->aisFsmInit()\n"));
1119
1120     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1121     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1122     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1123
1124     //4 <1> Initiate FSM
1125     prAisFsmInfo->ePreviousState = AIS_STATE_IDLE;
1126     prAisFsmInfo->eCurrentState = AIS_STATE_IDLE;
1127
1128     prAisFsmInfo->ucAvailableAuthTypes = 0;
1129
1130     prAisFsmInfo->prTargetBssDesc = (P_BSS_DESC_T)NULL;
1131
1132     prAisFsmInfo->ucSeqNumOfReqMsg = 0;
1133     prAisFsmInfo->ucSeqNumOfChReq = 0;
1134     prAisFsmInfo->ucSeqNumOfScanReq = 0;
1135
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;
1142
1143     //4 <1.1> Initiate FSM - Timer INIT
1144     cnmTimerInitTimer(prAdapter,
1145             &prAisFsmInfo->rBGScanTimer,
1146             (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventBGSleepTimeOut,
1147             (UINT_32)NULL);
1148
1149     cnmTimerInitTimer(prAdapter,
1150             &prAisFsmInfo->rIbssAloneTimer,
1151             (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventIbssAloneTimeOut,
1152             (UINT_32)NULL);
1153
1154     cnmTimerInitTimer(prAdapter,
1155             &prAisFsmInfo->rIndicationOfDisconnectTimer,
1156             (PFN_MGMT_TIMEOUT_FUNC)aisPostponedEventOfDisconnTimeout,
1157             (UINT_32)NULL);
1158
1159     cnmTimerInitTimer(prAdapter,
1160             &prAisFsmInfo->rJoinTimeoutTimer,
1161             (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventJoinTimeout,
1162             (UINT_32)NULL);
1163
1164     //4 <1.2> Initiate PWR STATE
1165     SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1166
1167
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);
1171
1172     //4 <3> Initiate BSS_INFO_T - private part
1173     /* TODO */
1174     prAisBssInfo->eBand = BAND_2G4;
1175     prAisBssInfo->ucPrimaryChannel = 1;
1176     prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1177
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);
1181
1182     if (prAisBssInfo->prBeacon) {
1183         prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1184         prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1185     }
1186     else {
1187         ASSERT(0);
1188     }
1189
1190 #if 0
1191     prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1192     prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1193     prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1194 #else
1195     if (prAdapter->u4UapsdAcBmp == 0) {
1196         prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1197         //ASSERT(prAdapter->u4UapsdAcBmp);
1198     }
1199     prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1200     prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1201     prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1202 #endif
1203
1204     /* request list initialization */
1205     LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1206
1207     //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1208             //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1209             //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1210             //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1211
1212     return;
1213 } /* end of aisFsmInit() */
1214
1215 /*----------------------------------------------------------------------------*/
1216 /*!
1217 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1218 *        AIS FSM operation
1219 *
1220 * @param (none)
1221 *
1222 * @return (none)
1223 */
1224 /*----------------------------------------------------------------------------*/
1225 VOID
1226 aisFsmUninit (
1227     IN P_ADAPTER_T prAdapter
1228     )
1229 {
1230     P_AIS_FSM_INFO_T prAisFsmInfo;
1231     P_BSS_INFO_T prAisBssInfo;
1232     P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1233
1234     DEBUGFUNC("aisFsmUninit()");
1235     DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1236
1237     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1238     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1239     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1240
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);
1246
1247     //4 <2> flush pending request
1248     aisFsmFlushRequest(prAdapter);
1249
1250     //4 <3> Reset driver-domain BSS-INFO
1251     if(prAisBssInfo->prBeacon) {
1252         cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1253         prAisBssInfo->prBeacon = NULL;
1254     }
1255
1256 #if CFG_SUPPORT_802_11W
1257     rsnStopSaQuery(prAdapter);
1258 #endif
1259
1260     return;
1261 } /* end of aisFsmUninit() */
1262
1263
1264 /*----------------------------------------------------------------------------*/
1265 /*!
1266 * @brief Initialization of JOIN STATE
1267 *
1268 * @param[in] prBssDesc  The pointer of BSS_DESC_T which is the BSS we will try to join with.
1269 *
1270 * @return (none)
1271 */
1272 /*----------------------------------------------------------------------------*/
1273 VOID
1274 aisFsmStateInit_JOIN (
1275     IN P_ADAPTER_T prAdapter,
1276     P_BSS_DESC_T prBssDesc
1277     )
1278 {
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;
1285
1286     DEBUGFUNC("aisFsmStateInit_JOIN()");
1287
1288     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1289     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1290     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1291     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1292
1293     ASSERT(prBssDesc);
1294
1295     //4 <1> We are going to connect to this BSS.
1296     prBssDesc->fgIsConnecting = TRUE;
1297
1298
1299     //4 <2> Setup corresponding STA_RECORD_T
1300     prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1301             STA_TYPE_LEGACY_AP,
1302             NETWORK_TYPE_AIS_INDEX,
1303             prBssDesc);
1304
1305     prAisFsmInfo->prTargetStaRec = prStaRec;
1306
1307     //4 <2.1> sync. to firmware domain
1308     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1309
1310     //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1311     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1312
1313         prStaRec->fgIsReAssoc = FALSE;
1314
1315         switch (prConnSettings->eAuthMode) {
1316         case AUTH_MODE_OPEN:                /* Note: Omit break here. */
1317         case AUTH_MODE_WPA:
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;
1322             break;
1323
1324
1325         case AUTH_MODE_SHARED:
1326             prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1327             break;
1328
1329
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);
1334             break;
1335
1336         default:
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 ? */
1341             return;
1342         }
1343
1344         /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1345         prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1346
1347         prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1348
1349     }
1350     else {
1351         ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1352         ASSERT(!prBssDesc->fgIsConnected);
1353
1354         DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1355             prAisSpecificBssInfo->ucRoamingAuthTypes));
1356
1357
1358         prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1359
1360         /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1361         prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1362
1363         prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1364     }
1365
1366
1367     //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1368     if (prAisFsmInfo->ucAvailableAuthTypes &
1369         (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1370
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;
1374
1375         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1376     }
1377     else if (prAisFsmInfo->ucAvailableAuthTypes &
1378         (UINT_8)AUTH_TYPE_SHARED_KEY) {
1379
1380         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1381
1382         prAisFsmInfo->ucAvailableAuthTypes &=
1383             ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1384
1385         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1386     }
1387     else if (prAisFsmInfo->ucAvailableAuthTypes &
1388         (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1389
1390         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1391
1392         prAisFsmInfo->ucAvailableAuthTypes &=
1393             ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1394
1395         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1396     }
1397     else {
1398         ASSERT(0);
1399     }
1400
1401     //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1402     if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1403
1404         if (prBssDesc->ucSSIDLen) {
1405             COPY_SSID(prConnSettings->aucSSID,
1406                       prConnSettings->ucSSIDLen,
1407                       prBssDesc->aucSSID,
1408                       prBssDesc->ucSSIDLen);
1409         }
1410     }
1411
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) {
1415
1416         ASSERT(0); // Can't trigger SAA FSM
1417         return;
1418     }
1419
1420     prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1421     prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1422     prJoinReqMsg->prStaRec = prStaRec;
1423
1424     if (1) {
1425         int j;
1426         P_FRAG_INFO_T prFragInfo;
1427         for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1428             prFragInfo = &prStaRec->rFragInfo[j];
1429
1430             if (prFragInfo->pr1stFrag) {
1431                 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1432                 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1433             }
1434         }
1435     }
1436
1437     mboxSendMsg(prAdapter,
1438             MBOX_ID_0,
1439             (P_MSG_HDR_T) prJoinReqMsg,
1440             MSG_SEND_METHOD_BUF);
1441
1442     return;
1443 } /* end of aisFsmInit_JOIN() */
1444
1445
1446 /*----------------------------------------------------------------------------*/
1447 /*!
1448 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1449 *
1450 * @param[in] prStaRec       Pointer to the STA_RECORD_T
1451 *
1452 * @retval TRUE      We will retry JOIN
1453 * @retval FALSE     We will not retry JOIN
1454 */
1455 /*----------------------------------------------------------------------------*/
1456 BOOLEAN
1457 aisFsmStateInit_RetryJOIN (
1458     IN P_ADAPTER_T prAdapter,
1459     P_STA_RECORD_T prStaRec
1460     )
1461 {
1462     P_AIS_FSM_INFO_T prAisFsmInfo;
1463     P_MSG_JOIN_REQ_T prJoinReqMsg;
1464
1465     DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1466
1467     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1468
1469     /* Retry other AuthType if possible */
1470     if (!prAisFsmInfo->ucAvailableAuthTypes) {
1471         return FALSE;
1472     }
1473
1474     if (prAisFsmInfo->ucAvailableAuthTypes &
1475         (UINT_8)AUTH_TYPE_SHARED_KEY) {
1476
1477         DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1478
1479         prAisFsmInfo->ucAvailableAuthTypes &=
1480             ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1481
1482         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1483     }
1484     else {
1485         DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1486         ASSERT(0);
1487     }
1488
1489     prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1490
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) {
1494
1495         ASSERT(0); // Can't trigger SAA FSM
1496         return FALSE;
1497     }
1498
1499     prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1500     prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1501     prJoinReqMsg->prStaRec = prStaRec;
1502
1503     mboxSendMsg(prAdapter,
1504             MBOX_ID_0,
1505             (P_MSG_HDR_T) prJoinReqMsg,
1506             MSG_SEND_METHOD_BUF);
1507
1508     return TRUE;
1509
1510 }/* end of aisFsmRetryJOIN() */
1511
1512
1513 #if CFG_SUPPORT_ADHOC
1514 /*----------------------------------------------------------------------------*/
1515 /*!
1516 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1517 *
1518 * @param (none)
1519 *
1520 * @return (none)
1521 */
1522 /*----------------------------------------------------------------------------*/
1523 VOID
1524 aisFsmStateInit_IBSS_ALONE (
1525     IN P_ADAPTER_T prAdapter
1526     )
1527 {
1528     P_AIS_FSM_INFO_T prAisFsmInfo;
1529     P_CONNECTION_SETTINGS_T prConnSettings;
1530     P_BSS_INFO_T prAisBssInfo;
1531
1532     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1533     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1534     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1535
1536     //4 <1> Check if IBSS was created before ?
1537     if (prAisBssInfo->fgIsBeaconActivated) {
1538
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));
1544 #endif
1545     }
1546
1547     aisFsmCreateIBSS(prAdapter);
1548
1549     return;
1550 } /* end of aisFsmStateInit_IBSS_ALONE() */
1551
1552
1553 /*----------------------------------------------------------------------------*/
1554 /*!
1555 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1556 *
1557 * @param[in] prBssDesc  The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1558 *
1559 * @return (none)
1560 */
1561 /*----------------------------------------------------------------------------*/
1562 VOID
1563 aisFsmStateInit_IBSS_MERGE (
1564     IN P_ADAPTER_T prAdapter,
1565     P_BSS_DESC_T prBssDesc
1566     )
1567 {
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;
1572
1573
1574     ASSERT(prBssDesc);
1575
1576     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1577     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1578     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1579
1580     //4 <1> We will merge with to this BSS immediately.
1581     prBssDesc->fgIsConnecting = FALSE;
1582     prBssDesc->fgIsConnected = TRUE;
1583
1584     //4 <2> Setup corresponding STA_RECORD_T
1585     prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1586             STA_TYPE_ADHOC_PEER,
1587             NETWORK_TYPE_AIS_INDEX,
1588             prBssDesc);
1589
1590     prStaRec->fgIsMerging = TRUE;
1591
1592     prAisFsmInfo->prTargetStaRec = prStaRec;
1593
1594     //4 <2.1> sync. to firmware domain
1595     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1596
1597     //4 <3> IBSS-Merge
1598     aisFsmMergeIBSS(prAdapter, prStaRec);
1599
1600     return;
1601 } /* end of aisFsmStateInit_IBSS_MERGE() */
1602
1603 #endif /* CFG_SUPPORT_ADHOC */
1604
1605
1606 /*----------------------------------------------------------------------------*/
1607 /*!
1608 * @brief Process of JOIN Abort
1609 *
1610 * @param (none)
1611 *
1612 * @return (none)
1613 */
1614 /*----------------------------------------------------------------------------*/
1615 VOID
1616 aisFsmStateAbort_JOIN (
1617     IN P_ADAPTER_T prAdapter
1618     )
1619 {
1620     P_AIS_FSM_INFO_T prAisFsmInfo;
1621     P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1622
1623     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1624
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) {
1628
1629         ASSERT(0); // Can't abort SAA FSM
1630         return;
1631     }
1632
1633     kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1634              WLAN_STATUS_CONNECT_INDICATION,
1635              NULL,
1636              0);
1637
1638     prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1639     prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1640     prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1641
1642     scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1643
1644     mboxSendMsg(prAdapter,
1645             MBOX_ID_0,
1646             (P_MSG_HDR_T) prJoinAbortMsg,
1647             MSG_SEND_METHOD_BUF);
1648
1649     /* 2. Return channel privilege */
1650     aisFsmReleaseCh(prAdapter);
1651
1652     /* 3.1 stop join timeout timer */
1653     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1654
1655     /* 3.2 reset local variable */
1656     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1657
1658     return;
1659 } /* end of aisFsmAbortJOIN() */
1660
1661
1662 /*----------------------------------------------------------------------------*/
1663 /*!
1664 * @brief Process of SCAN Abort
1665 *
1666 * @param (none)
1667 *
1668 * @return (none)
1669 */
1670 /*----------------------------------------------------------------------------*/
1671 VOID
1672 aisFsmStateAbort_SCAN (
1673     IN P_ADAPTER_T prAdapter
1674     )
1675 {
1676     P_AIS_FSM_INFO_T prAisFsmInfo;
1677     P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1678
1679     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1680
1681     /* Abort JOIN process. */
1682     prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1683     if (!prScanCancelMsg) {
1684
1685         ASSERT(0); // Can't abort SCN FSM
1686         return;
1687     }
1688
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;
1695     }
1696 #endif
1697
1698     /* unbuffered message to guarantee scan is cancelled in sequence */
1699     mboxSendMsg(prAdapter,
1700             MBOX_ID_0,
1701             (P_MSG_HDR_T) prScanCancelMsg,
1702             MSG_SEND_METHOD_UNBUF);
1703
1704     return;
1705 } /* end of aisFsmAbortSCAN() */
1706
1707
1708 /*----------------------------------------------------------------------------*/
1709 /*!
1710 * @brief Process of NORMAL_TR Abort
1711 *
1712 * @param (none)
1713 *
1714 * @return (none)
1715 */
1716 /*----------------------------------------------------------------------------*/
1717 VOID
1718 aisFsmStateAbort_NORMAL_TR (
1719     IN P_ADAPTER_T prAdapter
1720     )
1721 {
1722     P_AIS_FSM_INFO_T prAisFsmInfo;
1723
1724     ASSERT(prAdapter);
1725     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1726
1727     /* TODO(Kevin): Do abort other MGMT func */
1728
1729     /* 1. Release channel to CNM */
1730     aisFsmReleaseCh(prAdapter);
1731
1732     /* 2.1 stop join timeout timer */
1733     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1734
1735     /* 2.2 reset local variable */
1736     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1737
1738     return;
1739 } /* end of aisFsmAbortNORMAL_TR() */
1740
1741
1742 #if CFG_SUPPORT_ADHOC
1743 /*----------------------------------------------------------------------------*/
1744 /*!
1745 * @brief Process of NORMAL_TR Abort
1746 *
1747 * @param (none)
1748 *
1749 * @return (none)
1750 */
1751 /*----------------------------------------------------------------------------*/
1752 VOID
1753 aisFsmStateAbort_IBSS (
1754     IN P_ADAPTER_T prAdapter
1755     )
1756 {
1757     P_AIS_FSM_INFO_T prAisFsmInfo;
1758     P_BSS_DESC_T prBssDesc;
1759
1760     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1761
1762     // reset BSS-DESC
1763     if (prAisFsmInfo->prTargetStaRec) {
1764         prBssDesc = scanSearchBssDescByTA(prAdapter,
1765                 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1766
1767         if (prBssDesc) {
1768             prBssDesc->fgIsConnected = FALSE;
1769             prBssDesc->fgIsConnecting = FALSE;
1770         }
1771     }
1772
1773     // release channel privilege
1774     aisFsmReleaseCh(prAdapter);
1775
1776     return;
1777 }
1778 #endif /* CFG_SUPPORT_ADHOC */
1779
1780
1781 /*----------------------------------------------------------------------------*/
1782 /*!
1783 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1784 *
1785 * @param[in] eNextState Enum value of next AIS STATE
1786 *
1787 * @return (none)
1788 */
1789 /*----------------------------------------------------------------------------*/
1790 VOID
1791 aisFsmSteps (
1792     IN P_ADAPTER_T prAdapter,
1793     ENUM_AIS_STATE_T eNextState
1794     )
1795 {
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;
1803     ENUM_BAND_T eBand;
1804     UINT_8 ucChannel;
1805     UINT_16 u2ScanIELen;
1806
1807     BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1808
1809     DEBUGFUNC("aisFsmSteps()");
1810
1811     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1812     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1813     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1814
1815     do {
1816
1817         /* Do entering Next State */
1818         prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1819
1820 #if DBG
1821         DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1822                             apucDebugAisState[prAisFsmInfo->eCurrentState],
1823                             apucDebugAisState[eNextState]));
1824 #else
1825         DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1826                             DBG_AIS_IDX,
1827                             prAisFsmInfo->eCurrentState,
1828                             eNextState));
1829 #endif
1830         /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1831         prAisFsmInfo->eCurrentState = eNextState;
1832
1833         fgIsTransition = (BOOLEAN)FALSE;
1834
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.
1840          */
1841         case AIS_STATE_IDLE:
1842
1843             prAisReq = aisFsmGetNextRequest(prAdapter);
1844
1845             if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1846                 if (prConnSettings->fgIsConnReqIssued == TRUE && 
1847                         prConnSettings->fgIsDisconnectedByNonRequest == FALSE) {
1848
1849                     prAisFsmInfo->fgTryScan = TRUE;
1850
1851                     SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1852                     SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1853
1854                     // sync with firmware
1855                     nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1856
1857                     // reset trial count
1858                     prAisFsmInfo->ucConnTrialCount = 0;
1859
1860                     eNextState = AIS_STATE_SEARCH;
1861                     fgIsTransition = TRUE;
1862                 }
1863                 else {
1864                     UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1865                     SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1866
1867                     // sync with firmware
1868                     nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1869
1870                     // check for other pending request
1871                     if(prAisReq) {
1872                         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1873                             wlanClearScanningResult(prAdapter);
1874                             eNextState = AIS_STATE_SCAN;
1875
1876                             fgIsTransition = TRUE;
1877                         }
1878                     }
1879                 }
1880
1881                 if(prAisReq) {
1882                     /* free the message */
1883                     cnmMemFree(prAdapter, prAisReq);
1884                 }
1885             }
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);
1891
1892                 eNextState = AIS_STATE_SCAN;
1893                 fgIsTransition = TRUE;
1894
1895                 /* free the message */
1896                 cnmMemFree(prAdapter, prAisReq);
1897             }
1898             else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1899                 /* ignore */
1900                 /* free the message */
1901                 cnmMemFree(prAdapter, prAisReq);
1902             }
1903
1904             prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1905
1906             break;
1907
1908         case AIS_STATE_SEARCH:
1909             //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1910 #if CFG_SLT_SUPPORT
1911             prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1912 #else
1913             prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1914 #endif
1915
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;
1924
1925                     // abort connection trial
1926                     prConnSettings->fgIsConnReqIssued = FALSE;
1927
1928                     eNextState = AIS_STATE_NORMAL_TR;
1929                     fgIsTransition = TRUE;
1930
1931                     break;
1932                 }
1933             }
1934
1935             //4 <2> We are not under Roaming Condition.
1936             if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1937
1938                 //4 <2.a> If we have the matched one
1939                 if (prBssDesc) {
1940
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;
1948
1949                     //4 <B> Do STATE transition and update current Operation Mode.
1950                     if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1951
1952                         prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1953
1954                         /* Record the target BSS_DESC_T for next STATE. */
1955                         prAisFsmInfo->prTargetBssDesc = prBssDesc;
1956
1957                         /* Transit to channel acquire */
1958                         eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1959                         fgIsTransition = TRUE;
1960
1961                         // increase connection trial count
1962                         prAisFsmInfo->ucConnTrialCount++;
1963                     }
1964 #if CFG_SUPPORT_ADHOC
1965                     else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
1966
1967                         prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1968
1969                         /* Record the target BSS_DESC_T for next STATE. */
1970                         prAisFsmInfo->prTargetBssDesc = prBssDesc;
1971
1972                         eNextState = AIS_STATE_IBSS_MERGE;
1973                         fgIsTransition = TRUE;
1974                     }
1975 #endif /* CFG_SUPPORT_ADHOC */
1976                     else {
1977                         ASSERT(0);
1978                         eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1979                         fgIsTransition = TRUE;
1980                     }
1981                 }
1982                 //4 <2.b> If we don't have the matched one
1983                 else {
1984
1985                     // increase connection trial count for infrastructure connection
1986                     if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1987                         prAisFsmInfo->ucConnTrialCount++;
1988                     }
1989
1990                     //4 <A> Try to SCAN
1991                     if (prAisFsmInfo->fgTryScan) {
1992                         eNextState = AIS_STATE_LOOKING_FOR;
1993
1994                         fgIsTransition = TRUE;
1995                     }
1996                     //4 <B> We've do SCAN already, now wait in some STATE.
1997                     else {
1998                         if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1999
2000                             /* issue reconnect request, and retreat to idle state for scheduling */
2001                             aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2002
2003                             eNextState = AIS_STATE_IDLE;
2004                             fgIsTransition = TRUE;
2005                         }
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)) {
2010
2011                             prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
2012                             prAisFsmInfo->prTargetBssDesc = NULL;
2013
2014                             eNextState = AIS_STATE_IBSS_ALONE;
2015                             fgIsTransition = TRUE;
2016                         }
2017 #endif /* CFG_SUPPORT_ADHOC */
2018                         else {
2019                             ASSERT(0);
2020                             eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2021                             fgIsTransition = TRUE;
2022                         }
2023                     }
2024                 }
2025             }
2026             //4 <3> We are under Roaming Condition.
2027             else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2028
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.)
2040                  *
2041                  * CASE III: Normal case, we can't find other candidate to roam
2042                  * out, so only the current AP will be matched.
2043                  *
2044                  * CASE VI: Timestamp of the current AP might be reset
2045                  */
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 */) {
2050 #if DBG
2051                     if ((prBssDesc) &&
2052                         (prBssDesc->fgIsConnected)) {
2053                         ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2054                     }
2055 #endif /* DBG */
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 */
2061
2062                     /* Retreat to NORMAL_TR state */
2063                     eNextState = AIS_STATE_NORMAL_TR;
2064                     fgIsTransition = TRUE;
2065                 }
2066                 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2067                 else {
2068 #if DBG
2069                     ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2070 #endif /* DBG */
2071
2072                     //4 <A> Record the target BSS_DESC_T for next STATE.
2073                     prAisFsmInfo->prTargetBssDesc = prBssDesc;
2074
2075                     // tyhsu: increase connection trial count
2076                     prAisFsmInfo->ucConnTrialCount++;
2077
2078                     /* Transit to channel acquire */
2079                     eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2080                     fgIsTransition = TRUE;
2081                 }
2082             }
2083
2084             break;
2085
2086         case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2087
2088             DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2089
2090             cnmTimerStartTimer(prAdapter,
2091                     &prAisFsmInfo->rBGScanTimer,
2092                     SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2093
2094             SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2095
2096             if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2097                 prAisFsmInfo->u4SleepInterval <<= 1;
2098             }
2099             break;
2100
2101         case AIS_STATE_SCAN:
2102         case AIS_STATE_ONLINE_SCAN:
2103         case AIS_STATE_LOOKING_FOR:
2104
2105             if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2106                 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2107
2108                 // sync with firmware
2109                 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2110             }
2111
2112             /* IE length decision */
2113             if(prAisFsmInfo->u4ScanIELength > 0) {
2114                 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2115             }
2116             else {
2117 #if CFG_SUPPORT_WPS2
2118                 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2119 #else
2120                 u2ScanIELen = 0;
2121 #endif
2122             }
2123
2124             prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2125                     RAM_TYPE_MSG,
2126                     OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2127             if (!prScanReqMsg) {
2128                 ASSERT(0); // Can't trigger SCAN FSM
2129                 return;
2130             }
2131
2132             prScanReqMsg->rMsgHdr.eMsgId    = MID_AIS_SCN_SCAN_REQ;
2133             prScanReqMsg->ucSeqNum          = ++prAisFsmInfo->ucSeqNumOfScanReq;
2134             prScanReqMsg->ucNetTypeIndex    = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2135
2136 #if CFG_SUPPORT_RDD_TEST_MODE
2137             prScanReqMsg->eScanType         = SCAN_TYPE_PASSIVE_SCAN;
2138 #else
2139             prScanReqMsg->eScanType         = SCAN_TYPE_ACTIVE_SCAN;
2140 #endif
2141
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;
2147                 }
2148                 else {
2149                     prScanReqMsg->ucSSIDType        = SCAN_REQ_SSID_SPECIFIED;
2150                     COPY_SSID(prScanReqMsg->aucSSID,
2151                             prScanReqMsg->ucSSIDLength,
2152                             prAisFsmInfo->aucScanSSID,
2153                             prAisFsmInfo->ucScanSSIDLen);
2154                 }
2155             }
2156             else {
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);
2163             }
2164
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
2170                     = eBand;;
2171                 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2172                     = ucChannel;
2173             }
2174             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2175                 if(prAdapter->fgEnable5GBand == TRUE) {
2176                     prScanReqMsg->eScanChannel      = SCAN_CHANNEL_FULL;
2177                 }
2178                 else {
2179                     prScanReqMsg->eScanChannel      = SCAN_CHANNEL_2G4;
2180                 }
2181             }
2182             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2183                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_2G4;
2184             }
2185             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2186                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_5G;
2187             }
2188             else {
2189                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_FULL;
2190                 ASSERT(0);
2191             }
2192
2193             if(prAisFsmInfo->u4ScanIELength > 0) {
2194                 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2195             }
2196             else {
2197 #if CFG_SUPPORT_WPS2
2198                 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2199                             kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2200                 }
2201             }
2202 #endif
2203
2204             prScanReqMsg->u2IELen = u2ScanIELen;
2205
2206             mboxSendMsg(prAdapter,
2207                     MBOX_ID_0,
2208                     (P_MSG_HDR_T) prScanReqMsg,
2209                     MSG_SEND_METHOD_BUF);
2210
2211             prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2212
2213             break;
2214
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));
2218             if (!prMsgChReq) {
2219                 ASSERT(0); // Can't indicate CNM for channel acquiring
2220                 return;
2221             }
2222
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);
2232
2233             mboxSendMsg(prAdapter,
2234                     MBOX_ID_0,
2235                     (P_MSG_HDR_T) prMsgChReq,
2236                     MSG_SEND_METHOD_BUF);
2237
2238             prAisFsmInfo->fgIsChannelRequested = TRUE;
2239             break;
2240
2241         case AIS_STATE_JOIN:
2242             aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2243             break;
2244
2245 #if CFG_SUPPORT_ADHOC
2246         case AIS_STATE_IBSS_ALONE:
2247             aisFsmStateInit_IBSS_ALONE(prAdapter);
2248             break;
2249
2250         case AIS_STATE_IBSS_MERGE:
2251             aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2252             break;
2253 #endif /* CFG_SUPPORT_ADHOC */
2254
2255         case AIS_STATE_NORMAL_TR:
2256             if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2257                 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2258             }
2259             else {
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;
2265                 }
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;
2270                 }
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;
2275                 }
2276             }
2277
2278             break;
2279
2280         case AIS_STATE_DISCONNECTING:
2281             /* send for deauth frame for disconnection */
2282             authSendDeauthFrame(prAdapter,
2283                     prAisBssInfo->prStaRecOfAP,
2284                     (P_SW_RFB_T)NULL,
2285                     REASON_CODE_DEAUTH_LEAVING_BSS,
2286                     aisDeauthXmitComplete);
2287             break;
2288
2289         default:
2290             ASSERT(0); /* Make sure we have handle all STATEs */
2291             break;
2292
2293         }
2294     }
2295     while (fgIsTransition);
2296
2297     return;
2298
2299 } /* end of aisFsmSteps() */
2300
2301
2302 /*----------------------------------------------------------------------------*/
2303 /*!
2304 * \brief
2305 *
2306 * \param[in]
2307 *
2308 * \return none
2309 */
2310 /*----------------------------------------------------------------------------*/
2311 VOID
2312 aisFsmRunEventScanDone (
2313     IN P_ADAPTER_T prAdapter,
2314     IN P_MSG_HDR_T prMsgHdr
2315     )
2316 {
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;
2322
2323     DEBUGFUNC("aisFsmRunEventScanDone()");
2324
2325     ASSERT(prAdapter);
2326     ASSERT(prMsgHdr);
2327
2328     DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2329
2330     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2331     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2332
2333     prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2334     ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2335
2336     ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2337     cnmMemFree(prAdapter, prMsgHdr);
2338
2339     eNextState = prAisFsmInfo->eCurrentState;
2340
2341     if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2342         DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2343     }
2344     else {
2345         switch (prAisFsmInfo->eCurrentState) {
2346         case AIS_STATE_SCAN:
2347             prConnSettings->fgIsScanReqIssued = FALSE;
2348
2349             /* reset scan IE buffer */
2350             prAisFsmInfo->u4ScanIELength = 0;
2351
2352             kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2353             eNextState = AIS_STATE_IDLE;
2354
2355             break;
2356
2357         case AIS_STATE_ONLINE_SCAN:
2358             prConnSettings->fgIsScanReqIssued = FALSE;
2359
2360             /* reset scan IE buffer */
2361             prAisFsmInfo->u4ScanIELength = 0;
2362
2363             kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2364 #if CFG_SUPPORT_ROAMING
2365             eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2366 #else
2367             eNextState = AIS_STATE_NORMAL_TR;
2368 #endif /* CFG_SUPPORT_ROAMING */
2369
2370             break;
2371
2372         case AIS_STATE_LOOKING_FOR:
2373 #if CFG_SUPPORT_ROAMING
2374             eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2375 #else
2376             eNextState = AIS_STATE_SEARCH;
2377 #endif /* CFG_SUPPORT_ROAMING */
2378             break;
2379
2380         default:
2381             break;
2382
2383         }
2384     }
2385
2386     if (eNextState != prAisFsmInfo->eCurrentState) {
2387         aisFsmSteps(prAdapter, eNextState);
2388     }
2389
2390     return;
2391 } /* end of aisFsmRunEventScanDone() */
2392
2393
2394 /*----------------------------------------------------------------------------*/
2395 /*!
2396 * \brief
2397 *
2398 * \param[in]
2399 *
2400 * \return none
2401 */
2402 /*----------------------------------------------------------------------------*/
2403 VOID
2404 aisFsmRunEventAbort (
2405     IN P_ADAPTER_T prAdapter,
2406     IN P_MSG_HDR_T prMsgHdr
2407     )
2408 {
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;
2414
2415     DEBUGFUNC("aisFsmRunEventAbort()");
2416
2417     ASSERT(prAdapter);
2418     ASSERT(prMsgHdr);
2419     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2420     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2421
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;
2426
2427     cnmMemFree(prAdapter, prMsgHdr);
2428
2429 #if DBG
2430     DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2431         apucDebugAisState[prAisFsmInfo->eCurrentState]));
2432 #else
2433     DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2434         DBG_AIS_IDX,
2435             prAisFsmInfo->eCurrentState));
2436 #endif
2437
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;
2442     }
2443     else {
2444         prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
2445     }
2446
2447     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2448     aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2449
2450     if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2451         //4 <3> invoke abort handler
2452         aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2453     }
2454
2455     return;
2456 } /* end of aisFsmRunEventAbort() */
2457
2458
2459 /*----------------------------------------------------------------------------*/
2460 /*!
2461 * \brief        This function handles AIS-FSM abort event/command
2462 *
2463 * \param[in] prAdapter              Pointer of ADAPTER_T
2464 *            ucReasonOfDisconnect   Reason for disonnection
2465 *            fgDelayIndication      Option to delay disconnection indication
2466 *
2467 * \return none
2468 */
2469 /*----------------------------------------------------------------------------*/
2470 VOID
2471 aisFsmStateAbort (
2472     IN P_ADAPTER_T prAdapter,
2473     UINT_8         ucReasonOfDisconnect,
2474     BOOLEAN        fgDelayIndication
2475     )
2476 {
2477     P_AIS_FSM_INFO_T prAisFsmInfo;
2478     P_BSS_INFO_T prAisBssInfo;
2479     P_CONNECTION_SETTINGS_T prConnSettings;
2480     BOOLEAN fgIsCheckConnected;
2481
2482     ASSERT(prAdapter);
2483
2484     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2485     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2486     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2487     fgIsCheckConnected = FALSE;
2488
2489     //4 <1> Save information of Abort Message and then free memory.
2490     prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2491
2492     //4 <2> Abort current job.
2493     switch (prAisFsmInfo->eCurrentState) {
2494     case AIS_STATE_IDLE:
2495     case AIS_STATE_SEARCH:
2496         break;
2497
2498     case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2499         /* Do cancel timer */
2500         cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2501
2502         /* in case roaming is triggered */
2503         fgIsCheckConnected = TRUE;
2504         break;
2505
2506     case AIS_STATE_SCAN:
2507         /* Do abort SCAN */
2508         aisFsmStateAbort_SCAN(prAdapter);
2509
2510         /* queue for later handling */
2511         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2512             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2513         }
2514
2515         break;
2516
2517     case AIS_STATE_LOOKING_FOR:
2518           /* Do abort SCAN */
2519         aisFsmStateAbort_SCAN(prAdapter);
2520
2521         /* in case roaming is triggered */
2522         fgIsCheckConnected = TRUE;
2523         break;
2524
2525     case AIS_STATE_REQ_CHANNEL_JOIN:
2526         /* Release channel to CNM */
2527         aisFsmReleaseCh(prAdapter);
2528
2529         /* in case roaming is triggered */
2530         fgIsCheckConnected = TRUE;
2531         break;
2532
2533     case AIS_STATE_JOIN:
2534         /* Do abort JOIN */
2535         aisFsmStateAbort_JOIN(prAdapter);
2536
2537         /* in case roaming is triggered */
2538         fgIsCheckConnected = TRUE;
2539         break;
2540
2541 #if CFG_SUPPORT_ADHOC
2542     case AIS_STATE_IBSS_ALONE:
2543     case AIS_STATE_IBSS_MERGE:
2544         aisFsmStateAbort_IBSS(prAdapter);
2545         break;
2546 #endif /* CFG_SUPPORT_ADHOC */
2547
2548     case AIS_STATE_ONLINE_SCAN:
2549         /* Do abort SCAN */
2550         aisFsmStateAbort_SCAN(prAdapter);
2551
2552         /* queue for later handling */
2553         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2554             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2555         }
2556
2557         fgIsCheckConnected = TRUE;
2558         break;
2559
2560     case AIS_STATE_NORMAL_TR:
2561         fgIsCheckConnected = TRUE;
2562         break;
2563
2564     case AIS_STATE_DISCONNECTING:
2565         /* Do abort NORMAL_TR */
2566         aisFsmStateAbort_NORMAL_TR(prAdapter);
2567
2568         break;
2569
2570     default:
2571         break;
2572     }
2573
2574     if (fgIsCheckConnected &&
2575        (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2576
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);
2583
2584             return;
2585         }
2586         else {
2587             /* Do abort NORMAL_TR */
2588             aisFsmStateAbort_NORMAL_TR(prAdapter);
2589         }
2590     }
2591
2592     aisFsmDisconnect(prAdapter, fgDelayIndication);
2593
2594     return;
2595
2596 } /* end of aisFsmStateAbort() */
2597
2598
2599 /*----------------------------------------------------------------------------*/
2600 /*!
2601 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2602 *
2603 * @param[in] prMsgHdr   Message of Join Complete of SAA FSM.
2604 *
2605 * @return (none)
2606 */
2607 /*----------------------------------------------------------------------------*/
2608 VOID
2609 aisFsmRunEventJoinComplete (
2610     IN P_ADAPTER_T prAdapter,
2611     IN P_MSG_HDR_T prMsgHdr
2612     )
2613 {
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;
2619
2620     DEBUGFUNC("aisFsmRunEventJoinComplete()");
2621
2622     ASSERT(prMsgHdr);
2623
2624     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2625     prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2626     prStaRec = prJoinCompMsg->prStaRec;
2627     prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2628
2629     eNextState = prAisFsmInfo->eCurrentState;
2630
2631     // Check State and SEQ NUM
2632     if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2633         P_BSS_INFO_T prAisBssInfo;
2634
2635         prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2636
2637         // Check SEQ NUM
2638         if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2639
2640
2641             //4 <1> JOIN was successful
2642             if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2643
2644                 //1. Reset retry count
2645                 prAisFsmInfo->ucConnTrialCount = 0;
2646
2647                 // Completion of roaming
2648                 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2649
2650 #if CFG_SUPPORT_ROAMING
2651                     //2. Deactivate previous BSS
2652                     aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2653
2654                     //3. Update bss based on roaming staRec
2655                     aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2656 #endif /* CFG_SUPPORT_ROAMING */
2657                 }
2658                 else {
2659                     //4 <1.1> Change FW's Media State immediately.
2660                     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2661
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)) {
2666
2667                         cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2668                     }
2669
2670                     //4 <1.3> Update BSS_INFO_T
2671                     aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2672
2673                     //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2674                     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2675
2676                     //4 <1.5> Update RSSI if necessary
2677                     nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2678
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);
2682                 }
2683
2684 #if CFG_SUPPORT_ROAMING
2685                 roamingFsmRunEventStart(prAdapter);
2686 #endif /* CFG_SUPPORT_ROAMING */
2687
2688                 //4 <1.7> Set the Next State of AIS FSM
2689                 eNextState = AIS_STATE_NORMAL_TR;
2690             }
2691             //4 <2> JOIN was not successful
2692             else {
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;
2696
2697                     /* 1. Increase Failure Count */
2698                     prStaRec->ucJoinFailureCount++;
2699
2700                     /* 2. release channel */
2701                     aisFsmReleaseCh(prAdapter);
2702
2703                     /* 3.1 stop join timeout timer */
2704                     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2705
2706                     /* 3.2 reset local variable */
2707                     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2708
2709                     prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2710
2711                     ASSERT(prBssDesc);
2712                     ASSERT(prBssDesc->fgIsConnecting);
2713
2714                     if(prBssDesc) {
2715                         prBssDesc->fgIsConnecting = FALSE;
2716                     }
2717
2718                     /* 3.3 Free STA-REC */
2719                     if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2720                         cnmStaRecFree(prAdapter, prStaRec, FALSE);
2721                     }
2722
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 */
2727                         }
2728                     else {
2729                         // abort connection trial
2730                         prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
2731
2732                         kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
2733                                  WLAN_STATUS_CONNECT_INDICATION,
2734                                  NULL,
2735                                  0);
2736                       
2737                         eNextState = AIS_STATE_IDLE;
2738                     }
2739                 }
2740             }
2741         }
2742 #if DBG
2743         else {
2744             DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2745         }
2746 #endif /* DBG */
2747
2748     }
2749
2750     if (eNextState != prAisFsmInfo->eCurrentState) {
2751         aisFsmSteps(prAdapter, eNextState);
2752     }
2753
2754     if (prAssocRspSwRfb) {
2755         nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2756     }
2757
2758     cnmMemFree(prAdapter, prMsgHdr);
2759
2760     return;
2761 } /* end of aisFsmRunEventJoinComplete() */
2762
2763
2764 #if CFG_SUPPORT_ADHOC
2765 /*----------------------------------------------------------------------------*/
2766 /*!
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.
2769 *
2770 * @param[in] prAdapter  Pointer of ADAPTER_T
2771 *
2772 * @return (none)
2773 */
2774 /*----------------------------------------------------------------------------*/
2775 VOID
2776 aisFsmCreateIBSS (
2777     IN P_ADAPTER_T prAdapter
2778     )
2779 {
2780     P_AIS_FSM_INFO_T prAisFsmInfo;
2781
2782     ASSERT(prAdapter);
2783
2784     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2785
2786     do {
2787         // Check State
2788         if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2789             aisUpdateBssInfoForCreateIBSS(prAdapter);
2790         }
2791     }
2792     while (FALSE);
2793
2794     return;
2795 } /* end of aisFsmCreateIBSS() */
2796
2797
2798 /*----------------------------------------------------------------------------*/
2799 /*!
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.
2802 *
2803 * @param[in] prAdapter  Pointer of ADAPTER_T
2804 * @param[in] prStaRec   Pointer of STA_RECORD_T for merge
2805 *
2806 * @return (none)
2807 */
2808 /*----------------------------------------------------------------------------*/
2809 VOID
2810 aisFsmMergeIBSS (
2811     IN P_ADAPTER_T      prAdapter,
2812     IN P_STA_RECORD_T   prStaRec
2813     )
2814 {
2815     P_AIS_FSM_INFO_T prAisFsmInfo;
2816     ENUM_AIS_STATE_T eNextState;
2817     P_BSS_INFO_T prAisBssInfo;
2818
2819     ASSERT(prAdapter);
2820     ASSERT(prStaRec);
2821
2822     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2823     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2824
2825     do {
2826
2827         eNextState = prAisFsmInfo->eCurrentState;
2828
2829         switch (prAisFsmInfo->eCurrentState) {
2830         case AIS_STATE_IBSS_MERGE:
2831         {
2832             P_BSS_DESC_T prBssDesc;
2833
2834             //4 <1.1> Change FW's Media State immediately.
2835             aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2836
2837             //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2838             bssClearClientList(prAdapter, prAisBssInfo);
2839
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;
2844             }
2845
2846             //4 <1.4> Update BSS_INFO_T
2847             aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2848
2849             //4 <1.5> Add Peers' STA_RECORD_T to Client List
2850             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2851
2852             //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2853             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2854             prStaRec->fgIsMerging = FALSE;
2855
2856             //4 <1.7> Enable other features
2857
2858             //4 <1.8> Indicate Connected Event to Host immediately.
2859             aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2860
2861             //4 <1.9> Set the Next State of AIS FSM
2862             eNextState = AIS_STATE_NORMAL_TR;
2863
2864             //4 <1.10> Release channel privilege
2865             aisFsmReleaseCh(prAdapter);
2866
2867 #if CFG_SLT_SUPPORT
2868             prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2869 #endif
2870         }
2871         break;
2872
2873         default:
2874             break;
2875         }
2876
2877         if (eNextState != prAisFsmInfo->eCurrentState) {
2878             aisFsmSteps(prAdapter, eNextState);
2879         }
2880
2881     }
2882     while (FALSE);
2883
2884     return;
2885 } /* end of aisFsmMergeIBSS() */
2886
2887
2888 /*----------------------------------------------------------------------------*/
2889 /*!
2890 * @brief This function will handle the Notification of existing IBSS was found
2891 *        from SCN.
2892 *
2893 * @param[in] prMsgHdr   Message of Notification of an IBSS was present.
2894 *
2895 * @return (none)
2896 */
2897 /*----------------------------------------------------------------------------*/
2898 VOID
2899 aisFsmRunEventFoundIBSSPeer (
2900     IN P_ADAPTER_T prAdapter,
2901     IN P_MSG_HDR_T prMsgHdr
2902     )
2903 {
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;
2911
2912
2913     ASSERT(prMsgHdr);
2914
2915     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2916     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2917
2918     prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2919
2920     ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2921
2922     prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2923     ASSERT(prStaRec);
2924
2925     fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2926
2927     cnmMemFree(prAdapter, prMsgHdr);
2928
2929
2930     eNextState = prAisFsmInfo->eCurrentState;
2931     switch (prAisFsmInfo->eCurrentState) {
2932     case AIS_STATE_IBSS_ALONE:
2933     {
2934         //4 <1> An IBSS Peer 'merged in'.
2935         if (fgIsMergeIn) {
2936
2937             //4 <1.1> Change FW's Media State immediately.
2938             aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2939
2940             //4 <1.2> Add Peers' STA_RECORD_T to Client List
2941             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2942
2943 #if CFG_SLT_SUPPORT
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;
2948             }
2949             else {
2950                 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2951             }
2952
2953             //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2954             prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2955 #else
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;
2960             }
2961             else {
2962                 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2963             }
2964
2965
2966             //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2967             prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2968
2969 #endif
2970
2971             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2972             prStaRec->fgIsMerging = FALSE;
2973
2974             //4 <1.6> sync. to firmware
2975             nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
2976
2977             //4 <1.7> Indicate Connected Event to Host immediately.
2978             aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2979
2980             //4 <1.8> indicate PM for connected
2981             nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
2982
2983             //4 <1.9> Set the Next State of AIS FSM
2984             eNextState = AIS_STATE_NORMAL_TR;
2985
2986             //4 <1.10> Release channel privilege
2987             aisFsmReleaseCh(prAdapter);
2988         }
2989         //4 <2> We need 'merge out' to this IBSS
2990         else {
2991
2992             //4 <2.1> Get corresponding BSS_DESC_T
2993             prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
2994
2995             prAisFsmInfo->prTargetBssDesc = prBssDesc;
2996
2997             //4 <2.2> Set the Next State of AIS FSM
2998             eNextState = AIS_STATE_IBSS_MERGE;
2999         }
3000     }
3001         break;
3002
3003     case AIS_STATE_NORMAL_TR:
3004     {
3005
3006         //4 <3> An IBSS Peer 'merged in'.
3007         if (fgIsMergeIn) {
3008
3009             //4 <3.1> Add Peers' STA_RECORD_T to Client List
3010             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
3011
3012 #if CFG_SLT_SUPPORT
3013             //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3014             prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
3015 #else
3016             //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3017             prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
3018 #endif
3019
3020             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
3021             prStaRec->fgIsMerging = FALSE;
3022
3023         }
3024         //4 <4> We need 'merge out' to this IBSS
3025         else {
3026
3027             //4 <4.1> Get corresponding BSS_DESC_T
3028             prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3029
3030             prAisFsmInfo->prTargetBssDesc = prBssDesc;
3031
3032             //4 <4.2> Set the Next State of AIS FSM
3033             eNextState = AIS_STATE_IBSS_MERGE;
3034
3035         }
3036     }
3037         break;
3038
3039     default:
3040         break;
3041     }
3042
3043     if (eNextState != prAisFsmInfo->eCurrentState) {
3044         aisFsmSteps(prAdapter, eNextState);
3045     }
3046
3047     return;
3048 } /* end of aisFsmRunEventFoundIBSSPeer() */
3049 #endif /* CFG_SUPPORT_ADHOC */
3050
3051
3052 /*----------------------------------------------------------------------------*/
3053 /*!
3054 * @brief This function will indicate the Media State to HOST
3055 *
3056 * @param[in] eConnectionState   Current Media State
3057 * @param[in] fgDelayIndication  Set TRUE for postponing the Disconnect Indication.
3058 *
3059 * @return (none)
3060 */
3061 /*----------------------------------------------------------------------------*/
3062 VOID
3063 aisIndicationOfMediaStateToHost (
3064     IN P_ADAPTER_T prAdapter,
3065     ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3066     BOOLEAN fgDelayIndication
3067     )
3068 {
3069     EVENT_CONNECTION_STATUS rEventConnStatus;
3070     P_CONNECTION_SETTINGS_T prConnSettings;
3071     P_BSS_INFO_T prAisBssInfo;
3072     P_AIS_FSM_INFO_T prAisFsmInfo;
3073
3074     DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3075
3076     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3077     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3078     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3079
3080     // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3081     //prAisBssInfo->eConnectionState = eConnectionState;
3082
3083     /* For indicating the Disconnect Event only if current media state is
3084      * disconnected and we didn't do indication yet.
3085      */
3086     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3087         if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3088             return;
3089         }
3090     }
3091
3092     if (!fgDelayIndication) {
3093         //4 <0> Cancel Delay Timer
3094         cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3095
3096         //4 <1> Fill EVENT_CONNECTION_STATUS
3097         rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3098
3099         if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3100             rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3101
3102             if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3103                 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3104                 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3105                 rEventConnStatus.u2ATIMWindow = 0;
3106             }
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;
3111             }
3112             else {
3113                 ASSERT(0);
3114             }
3115
3116             COPY_SSID(rEventConnStatus.aucSsid,
3117                       rEventConnStatus.ucSsidLen,
3118                       prConnSettings->aucSSID,
3119                       prConnSettings->ucSSIDLen);
3120
3121             COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3122
3123             rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3124             rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3125
3126             switch (prAisBssInfo->ucNonHTBasicPhyType) {
3127             case PHY_TYPE_HR_DSSS_INDEX:
3128                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3129                 break;
3130
3131             case PHY_TYPE_ERP_INDEX:
3132                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3133                 break;
3134
3135             case PHY_TYPE_OFDM_INDEX:
3136                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3137                 break;
3138
3139             default:
3140                 ASSERT(0);
3141                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3142                 break;
3143             }
3144         }
3145         else {
3146             /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3147             bssClearClientList(prAdapter, prAisBssInfo);
3148
3149             #if CFG_PRIVACY_MIGRATION
3150             /* Clear the pmkid cache while media disconnect */
3151             secClearPmkid(prAdapter);
3152             #endif
3153
3154             rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3155         }
3156
3157         //4 <2> Indication
3158         nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3159         prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3160     }
3161     else {
3162         /* NOTE: Only delay the Indication of Disconnect Event */
3163         ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3164
3165         DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3166             prConnSettings->ucDelayTimeOfDisconnectEvent));
3167
3168         cnmTimerStartTimer(prAdapter,
3169                 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3170                 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3171     }
3172
3173     return;
3174 } /* end of aisIndicationOfMediaStateToHost() */
3175
3176
3177 /*----------------------------------------------------------------------------*/
3178 /*!
3179 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3180 *
3181 * @param[in] u4Param  Unused timer parameter
3182 *
3183 * @return (none)
3184 */
3185 /*----------------------------------------------------------------------------*/
3186 VOID
3187 aisPostponedEventOfDisconnTimeout (
3188     IN P_ADAPTER_T prAdapter,
3189     UINT_32 u4Param
3190     )
3191 {
3192     P_BSS_INFO_T prAisBssInfo;
3193     P_CONNECTION_SETTINGS_T prConnSettings;
3194
3195     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3196     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3197
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);
3201
3202         prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3203     }
3204
3205     //4 <2> Remove pending connection request
3206     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3207     prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
3208
3209     //4 <3> Indicate Disconnected Event to Host immediately.
3210     aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3211
3212     return;
3213 } /* end of aisPostponedEventOfDisconnTimeout() */
3214
3215
3216 /*----------------------------------------------------------------------------*/
3217 /*!
3218 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3219 *        the association was completed.
3220 *
3221 * @param[in] prStaRec               Pointer to the STA_RECORD_T
3222 * @param[in] prAssocRspSwRfb        Pointer to SW RFB of ASSOC RESP FRAME.
3223 *
3224 * @return (none)
3225 */
3226 /*----------------------------------------------------------------------------*/
3227 VOID
3228 aisUpdateBssInfoForJOIN (
3229     IN P_ADAPTER_T prAdapter,
3230     P_STA_RECORD_T prStaRec,
3231     P_SW_RFB_T prAssocRspSwRfb
3232     )
3233 {
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;
3239     UINT_16 u2IELength;
3240     PUINT_8 pucIE;
3241
3242     DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3243
3244     ASSERT(prStaRec);
3245     ASSERT(prAssocRspSwRfb);
3246
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;
3251
3252
3253     DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3254
3255
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;
3259
3260     //4 <1.2> Setup SSID
3261     COPY_SSID(prAisBssInfo->aucSSID,
3262               prAisBssInfo->ucSSIDLen,
3263               prConnSettings->aucSSID,
3264               prConnSettings->ucSSIDLen);
3265
3266     //4 <1.3> Setup Channel, Band
3267     prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3268     prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3269
3270
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;
3275
3276     //4 <2.2> Setup Capability
3277     prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3278
3279     if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3280         prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3281     }
3282     else {
3283         prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3284     }
3285
3286     //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3287     prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3288
3289     prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3290
3291     prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3292     prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3293
3294
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);
3298
3299
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;
3303
3304
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);
3308
3309     prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3310
3311     //3 <4> Update BSS_INFO_T from BSS_DESC_T
3312     prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3313     if(prBssDesc) {
3314         prBssDesc->fgIsConnecting = FALSE;
3315         prBssDesc->fgIsConnected = TRUE;
3316
3317         //4 <4.1> Setup MIB for current BSS
3318         prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3319     }
3320     else {
3321         // should never happen
3322         ASSERT(0);
3323     }
3324
3325     /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3326     prAisBssInfo->ucDTIMPeriod = 0;
3327     prAisBssInfo->u2ATIMWindow = 0;
3328
3329     prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3330
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()
3334      */
3335     rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3336
3337     //4 <4.3> Sync with firmware for BSS-INFO
3338     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3339
3340     //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3341     //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3342
3343     return;
3344 } /* end of aisUpdateBssInfoForJOIN() */
3345
3346
3347 #if CFG_SUPPORT_ADHOC
3348 /*----------------------------------------------------------------------------*/
3349 /*!
3350 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3351 *
3352 * @param (none)
3353 *
3354 * @return (none)
3355 */
3356 /*----------------------------------------------------------------------------*/
3357 VOID
3358 aisUpdateBssInfoForCreateIBSS (
3359     IN P_ADAPTER_T prAdapter
3360     )
3361 {
3362     P_AIS_FSM_INFO_T prAisFsmInfo;
3363     P_BSS_INFO_T prAisBssInfo;
3364     P_CONNECTION_SETTINGS_T prConnSettings;
3365
3366     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3367     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3368     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3369
3370     if (prAisBssInfo->fgIsBeaconActivated) {
3371         return;
3372     }
3373
3374     //3 <1> Update BSS_INFO_T per Network Basis
3375     //4 <1.1> Setup Operation Mode
3376     prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3377
3378     //4 <1.2> Setup SSID
3379     COPY_SSID(prAisBssInfo->aucSSID,
3380               prAisBssInfo->ucSSIDLen,
3381               prConnSettings->aucSSID,
3382               prConnSettings->ucSSIDLen);
3383
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;
3387
3388     //4 <1.4> Setup Channel, Band and Phy Attributes
3389     prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3390     prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3391
3392     if (prAisBssInfo->eBand == BAND_2G4) {
3393
3394         prAisBssInfo->ucPhyTypeSet =
3395             prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3396
3397         prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3398     }
3399     else {
3400
3401         prAisBssInfo->ucPhyTypeSet =
3402             prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3403
3404         prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3405     }
3406
3407     //4 <1.5> Setup MIB for current BSS
3408     prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3409     prAisBssInfo->ucDTIMPeriod = 0;
3410     prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3411
3412     prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3413
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;
3419     }
3420     else {
3421         prAisBssInfo->fgIsProtection = FALSE;
3422     }
3423 #else
3424     prAisBssInfo->fgIsProtection = FALSE;
3425 #endif
3426
3427     //3 <2> Update BSS_INFO_T common part
3428     ibssInitForAdHoc(prAdapter, prAisBssInfo);
3429
3430
3431
3432     //3 <3> Set MAC HW
3433     //4 <3.1> Setup channel and bandwidth
3434     rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3435
3436     //4 <3.2> use command packets to inform firmware
3437     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3438
3439     //4 <3.3> enable beaconing
3440     bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3441
3442     //4 <3.4> Update AdHoc PM parameter
3443     nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3444
3445     //3 <4> Set ACTIVE flag.
3446     prAisBssInfo->fgIsBeaconActivated = TRUE;
3447     prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3448
3449     //3 <5> Start IBSS Alone Timer
3450     cnmTimerStartTimer(prAdapter,
3451             &prAisFsmInfo->rIbssAloneTimer,
3452             SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3453
3454     return;
3455
3456 } /* end of aisCreateIBSS() */
3457
3458
3459 /*----------------------------------------------------------------------------*/
3460 /*!
3461 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3462 *        the existing IBSS was found.
3463 *
3464 * @param[in] prStaRec               Pointer to the STA_RECORD_T
3465 *
3466 * @return (none)
3467 */
3468 /*----------------------------------------------------------------------------*/
3469 VOID
3470 aisUpdateBssInfoForMergeIBSS (
3471     IN P_ADAPTER_T prAdapter,
3472     IN P_STA_RECORD_T prStaRec
3473     )
3474 {
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;
3480     //PUINT_8 pucIE;
3481
3482
3483     ASSERT(prStaRec);
3484
3485     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3486     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3487     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3488
3489     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3490
3491     if (!prAisBssInfo->fgIsBeaconActivated) {
3492
3493         //3 <1> Update BSS_INFO_T per Network Basis
3494         //4 <1.1> Setup Operation Mode
3495         prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3496
3497         //4 <1.2> Setup SSID
3498         COPY_SSID(prAisBssInfo->aucSSID,
3499                   prAisBssInfo->ucSSIDLen,
3500                   prConnSettings->aucSSID,
3501                   prConnSettings->ucSSIDLen);
3502
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;
3506     }
3507
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 */
3511
3512     if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3513         prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3514         prAisBssInfo->fgUseShortPreamble = TRUE;
3515     }
3516     else {
3517         prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3518         prAisBssInfo->fgUseShortPreamble = FALSE;
3519     }
3520
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;
3524
3525     if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3526         prAisBssInfo->fgIsProtection= TRUE;
3527     }
3528     else {
3529         prAisBssInfo->fgIsProtection = FALSE;
3530     }
3531
3532     //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3533     prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3534
3535     prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3536
3537     prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3538     prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3539
3540     rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3541                                 prAisBssInfo->u2BSSBasicRateSet,
3542                                 prAisBssInfo->aucAllSupportedRates,
3543                                 &prAisBssInfo->ucAllSupportedRatesLen);
3544
3545     //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3546
3547
3548     //3 <4> Update BSS_INFO_T from BSS_DESC_T
3549     prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3550     if(prBssDesc) {
3551         prBssDesc->fgIsConnecting = FALSE;
3552         prBssDesc->fgIsConnected = TRUE;
3553
3554         //4 <4.1> Setup BSSID
3555         COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3556
3557         //4 <4.2> Setup Channel, Band
3558         prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3559         prAisBssInfo->eBand = prBssDesc->eBand;
3560
3561         //4 <4.3> Setup MIB for current BSS
3562         prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3563         prAisBssInfo->ucDTIMPeriod = 0;
3564         prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3565
3566         prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3567     }
3568     else {
3569         // should never happen
3570         ASSERT(0);
3571     }
3572
3573
3574     //3 <5> Set MAC HW
3575     //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3576     {
3577         UINT_8 ucLowestBasicRateIndex;
3578
3579         if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3580                                               &ucLowestBasicRateIndex)) {
3581
3582             if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3583                 ucLowestBasicRateIndex = RATE_6M_INDEX;
3584             }
3585             else {
3586                 ucLowestBasicRateIndex = RATE_1M_INDEX;
3587             }
3588         }
3589
3590         prAisBssInfo->ucHwDefaultFixedRateCode =
3591             aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3592     }
3593
3594     //4 <5.2> Setup channel and bandwidth
3595     rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3596
3597     //4 <5.3> use command packets to inform firmware
3598     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3599
3600     //4 <5.4> enable beaconing
3601     bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3602
3603     //4 <5.5> Update AdHoc PM parameter
3604     nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3605
3606     //3 <6> Set ACTIVE flag.
3607     prAisBssInfo->fgIsBeaconActivated = TRUE;
3608     prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3609
3610     return;
3611 } /* end of aisUpdateBssInfoForMergeIBSS() */
3612
3613
3614 /*----------------------------------------------------------------------------*/
3615 /*!
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.
3619 *
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
3623 *
3624 * @retval TRUE      Reply the Probe Response
3625 * @retval FALSE     Don't reply the Probe Response
3626 */
3627 /*----------------------------------------------------------------------------*/
3628 BOOLEAN
3629 aisValidateProbeReq (
3630     IN P_ADAPTER_T prAdapter,
3631     IN P_SW_RFB_T prSwRfb,
3632     OUT PUINT_32 pu4ControlFlags
3633     )
3634 {
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;
3638     PUINT_8 pucIE;
3639     UINT_16 u2IELength;
3640     UINT_16 u2Offset = 0;
3641     BOOLEAN fgReplyProbeResp = FALSE;
3642
3643
3644     ASSERT(prSwRfb);
3645     ASSERT(pu4ControlFlags);
3646
3647     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3648
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;
3651
3652     u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3653     pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3654
3655     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3656         if (ELEM_ID_SSID == IE_ID(pucIE)) {
3657             if ((!prIeSsid) &&
3658                 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3659                 prIeSsid = (P_IE_SSID_T)pucIE;
3660             }
3661             break;
3662         }
3663     } /* end of IE_FOR_EACH */
3664
3665     //4 <2> Check network conditions
3666
3667     if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3668
3669         if ((prIeSsid) &&
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;
3674         }
3675     }
3676
3677     return fgReplyProbeResp;
3678
3679 } /* end of aisValidateProbeReq() */
3680
3681 #endif /* CFG_SUPPORT_ADHOC */
3682
3683 /*----------------------------------------------------------------------------*/
3684 /*!
3685 * @brief This function will modify and update necessary information to firmware
3686 *        for disconnection handling
3687 *
3688 * @param[in] prAdapter          Pointer to the Adapter structure.
3689 *
3690 * @retval None
3691 */
3692 /*----------------------------------------------------------------------------*/
3693 VOID
3694 aisFsmDisconnect (
3695     IN P_ADAPTER_T prAdapter,
3696     IN BOOLEAN     fgDelayIndication
3697     )
3698 {
3699     P_BSS_INFO_T prAisBssInfo;
3700
3701     ASSERT(prAdapter);
3702
3703     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3704
3705     nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3706
3707 #if CFG_SUPPORT_ADHOC
3708     if (prAisBssInfo->fgIsBeaconActivated) {
3709         nicUpdateBeaconIETemplate(prAdapter,
3710                 IE_UPD_METHOD_DELETE_ALL,
3711                 NETWORK_TYPE_AIS_INDEX,
3712                 0,
3713                 NULL,
3714                 0);
3715
3716         prAisBssInfo->fgIsBeaconActivated = FALSE;
3717     }
3718 #endif
3719
3720     rlmBssAborted(prAdapter, prAisBssInfo);
3721
3722     //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3723     if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3724
3725         if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3726             scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3727
3728             /* remove from scanning results as well */
3729             wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3730
3731             /* trials for re-association */
3732             if (fgDelayIndication) {
3733                 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3734                 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3735             }
3736         }
3737         else {
3738             scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3739         }
3740
3741         if (fgDelayIndication) {
3742             if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3743                 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3744             }
3745         }
3746         else {
3747             prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3748         }
3749     }
3750     else {
3751         prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3752     }
3753
3754
3755     //4 <4> Change Media State immediately.
3756     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3757
3758     //4 <4.1> sync. with firmware
3759     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3760
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);
3765
3766             prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3767         }
3768     }
3769
3770 #if CFG_SUPPORT_ROAMING
3771     roamingFsmRunEventAbort(prAdapter);
3772
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 */
3777
3778     //4 <6> Indicate Disconnected Event to Host
3779     aisIndicationOfMediaStateToHost(prAdapter,
3780             PARAM_MEDIA_STATE_DISCONNECTED,
3781             fgDelayIndication);
3782
3783
3784     //4 <7> Trigger AIS FSM
3785     aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3786
3787     return;
3788 } /* end of aisFsmDisconnect() */
3789
3790
3791 /*----------------------------------------------------------------------------*/
3792 /*!
3793 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3794 *
3795 * @param[in] u4Param  Unused timer parameter
3796 *
3797 * @return (none)
3798 */
3799 /*----------------------------------------------------------------------------*/
3800 VOID
3801 aisFsmRunEventBGSleepTimeOut (
3802     IN P_ADAPTER_T prAdapter,
3803     UINT_32 u4Param
3804     )
3805 {
3806     P_AIS_FSM_INFO_T prAisFsmInfo;
3807     ENUM_AIS_STATE_T eNextState;
3808
3809     DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3810
3811     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3812
3813     eNextState = prAisFsmInfo->eCurrentState;
3814
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()));
3818
3819         eNextState = AIS_STATE_LOOKING_FOR;
3820
3821         SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3822
3823         break;
3824
3825     default:
3826         break;
3827     }
3828
3829     /* Call aisFsmSteps() when we are going to change AIS STATE */
3830     if (eNextState != prAisFsmInfo->eCurrentState) {
3831         aisFsmSteps(prAdapter, eNextState);
3832     }
3833
3834     return;
3835 } /* end of aisFsmBGSleepTimeout() */
3836
3837
3838 /*----------------------------------------------------------------------------*/
3839 /*!
3840 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3841 *
3842 * @param[in] u4Param  Unused timer parameter
3843 *
3844 * @return (none)
3845 */
3846 /*----------------------------------------------------------------------------*/
3847 VOID
3848 aisFsmRunEventIbssAloneTimeOut (
3849     IN P_ADAPTER_T prAdapter,
3850     UINT_32 u4Param
3851     )
3852 {
3853     P_AIS_FSM_INFO_T prAisFsmInfo;
3854     ENUM_AIS_STATE_T eNextState;
3855
3856     DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3857
3858     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3859     eNextState = prAisFsmInfo->eCurrentState;
3860
3861     switch(prAisFsmInfo->eCurrentState) {
3862     case AIS_STATE_IBSS_ALONE:
3863
3864         /* There is no one participate in our AdHoc during this TIMEOUT Interval
3865          * so go back to search for a valid IBSS again.
3866          */
3867
3868         DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3869
3870         prAisFsmInfo->fgTryScan = TRUE;
3871
3872         /* abort timer */
3873         aisFsmReleaseCh(prAdapter);
3874
3875         /* Pull back to SEARCH to find candidate again */
3876         eNextState = AIS_STATE_SEARCH;
3877
3878         break;
3879
3880     default:
3881         break;
3882     }
3883
3884
3885     /* Call aisFsmSteps() when we are going to change AIS STATE */
3886     if (eNextState != prAisFsmInfo->eCurrentState) {
3887         aisFsmSteps(prAdapter, eNextState);
3888     }
3889
3890     return;
3891 } /* end of aisIbssAloneTimeOut() */
3892
3893
3894 /*----------------------------------------------------------------------------*/
3895 /*!
3896 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3897 *
3898 * @param[in] u4Param  Unused timer parameter
3899 *
3900 * @return (none)
3901 */
3902 /*----------------------------------------------------------------------------*/
3903 VOID
3904 aisFsmRunEventJoinTimeout (
3905     IN P_ADAPTER_T prAdapter,
3906     UINT_32 u4Param
3907     )
3908 {
3909     P_AIS_FSM_INFO_T prAisFsmInfo;
3910     ENUM_AIS_STATE_T eNextState;
3911
3912     DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3913
3914     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3915     eNextState = prAisFsmInfo->eCurrentState;
3916
3917     switch(prAisFsmInfo->eCurrentState) {
3918     case AIS_STATE_JOIN:
3919         DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
3920
3921         /* 1. Do abort JOIN */
3922         aisFsmStateAbort_JOIN(prAdapter);
3923
3924         /* 2. Increase Join Failure Count */
3925         prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
3926 // For JB nl802.11
3927 #if 0
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;
3931         }
3932         else {
3933             /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
3934             eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
3935         }
3936 #endif
3937         eNextState = AIS_STATE_IDLE;
3938         break;
3939
3940     case AIS_STATE_NORMAL_TR:
3941         /* 1. release channel */
3942         aisFsmReleaseCh(prAdapter);
3943         prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
3944
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;
3949         }
3950
3951         break;
3952
3953     default:
3954         /* release channel */
3955         aisFsmReleaseCh(prAdapter);
3956         break;
3957
3958     }
3959
3960
3961     /* Call aisFsmSteps() when we are going to change AIS STATE */
3962     if (eNextState != prAisFsmInfo->eCurrentState) {
3963         aisFsmSteps(prAdapter, eNextState);
3964     }
3965
3966     return;
3967 } /* end of aisFsmRunEventJoinTimeout() */
3968
3969
3970 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
3971 /*----------------------------------------------------------------------------*/
3972 /*!
3973 * \brief
3974 *
3975 * \param[in]
3976 *
3977 * \return none
3978 */
3979 /*----------------------------------------------------------------------------*/
3980 VOID
3981 aisTest (
3982     VOID
3983     )
3984 {
3985     P_MSG_AIS_ABORT_T prAisAbortMsg;
3986     P_CONNECTION_SETTINGS_T prConnSettings;
3987     UINT_8 aucSSID[]="pci-11n";
3988     UINT_8 ucSSIDLen=7;
3989
3990     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3991
3992     /* Set Connection Request Issued Flag */
3993     prConnSettings->fgIsConnReqIssued = TRUE;
3994     prConnSettings->ucSSIDLen = ucSSIDLen;
3995     kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
3996
3997     prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
3998     if (!prAisAbortMsg) {
3999
4000         ASSERT(0); // Can't trigger SCAN FSM
4001         return;
4002     }
4003
4004     prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
4005
4006     mboxSendMsg(prAdapter,
4007             MBOX_ID_0,
4008             (P_MSG_HDR_T) prAisAbortMsg,
4009             MSG_SEND_METHOD_BUF);
4010
4011     wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
4012
4013     return;
4014 }
4015 #endif /* CFG_TEST_MGMT_FSM */
4016
4017
4018 /*----------------------------------------------------------------------------*/
4019 /*!
4020 * \brief    This function is used to handle OID_802_11_BSSID_LIST_SCAN
4021 *
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
4026 *
4027 * \return none
4028 */
4029 /*----------------------------------------------------------------------------*/
4030 VOID
4031 aisFsmScanRequest (
4032     IN P_ADAPTER_T prAdapter,
4033     IN P_PARAM_SSID_T prSsid,
4034     IN PUINT_8  pucIe,
4035     IN UINT_32  u4IeLength
4036     )
4037 {
4038     P_CONNECTION_SETTINGS_T prConnSettings;
4039     P_BSS_INFO_T prAisBssInfo;
4040     P_AIS_FSM_INFO_T prAisFsmInfo;
4041
4042     DEBUGFUNC("aisFsmScanRequest()");
4043
4044     ASSERT(prAdapter);
4045     ASSERT(u4IeLength <= MAX_IE_LENGTH);
4046
4047     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4048     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4049     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4050
4051     if (!prConnSettings->fgIsScanReqIssued) {
4052         prConnSettings->fgIsScanReqIssued = TRUE;
4053
4054         if(prSsid == NULL) {
4055             prAisFsmInfo->ucScanSSIDLen = 0;
4056         }
4057         else {
4058             COPY_SSID(prAisFsmInfo->aucScanSSID,
4059                     prAisFsmInfo->ucScanSSIDLen,
4060                     prSsid->aucSsid,
4061                     (UINT_8)prSsid->u4SsidLen);
4062         }
4063
4064         if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4065             prAisFsmInfo->u4ScanIELength = u4IeLength;
4066                         if(NULL !=pucIe)
4067             kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4068         }
4069         else {
4070             prAisFsmInfo->u4ScanIELength = 0;
4071         }
4072
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);
4078             }
4079             else {
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));
4084                 }
4085
4086                 /* start online scan */
4087                 wlanClearScanningResult(prAdapter);
4088                 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4089             }
4090         }
4091         else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4092             wlanClearScanningResult(prAdapter);
4093             aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4094         }
4095         else {
4096             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4097         }
4098     }
4099     else {
4100         DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4101     }
4102
4103     return;
4104 } /* end of aisFsmScanRequest() */
4105
4106
4107 /*----------------------------------------------------------------------------*/
4108 /*!
4109 * \brief    This function is invoked when CNM granted channel privilege
4110 *
4111 * \param[in] prAdapter  Pointer of ADAPTER_T
4112 *
4113 * \return none
4114 */
4115 /*----------------------------------------------------------------------------*/
4116 VOID
4117 aisFsmRunEventChGrant (
4118     IN P_ADAPTER_T prAdapter,
4119     IN P_MSG_HDR_T prMsgHdr
4120     )
4121 {
4122     P_BSS_INFO_T prAisBssInfo;
4123     P_AIS_FSM_INFO_T prAisFsmInfo;
4124     P_MSG_CH_GRANT_T prMsgChGrant;
4125     UINT_8 ucTokenID;
4126     UINT_32 u4GrantInterval;
4127
4128     ASSERT(prAdapter);
4129     ASSERT(prMsgHdr);
4130
4131     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4132     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4133     prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4134
4135     ucTokenID = prMsgChGrant->ucTokenID;
4136     u4GrantInterval = prMsgChGrant->u4GrantInterval;
4137
4138     /* 1. free message */
4139     cnmMemFree(prAdapter, prMsgHdr);
4140
4141     if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4142             prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4143         /* 2. channel privilege has been approved */
4144         prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4145
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;
4153
4154         /* 3.3 switch to join state */
4155         aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4156
4157         prAisFsmInfo->fgIsChannelGranted = TRUE;
4158     }
4159     else { /* mismatched grant */
4160         /* 2. return channel privilege to CNM immediately */
4161         aisFsmReleaseCh(prAdapter);
4162     }
4163
4164     return;
4165 } /* end of aisFsmRunEventChGrant() */
4166
4167
4168 /*----------------------------------------------------------------------------*/
4169 /*!
4170 * \brief    This function is to inform CNM that channel privilege
4171 *           has been released
4172 *
4173 * \param[in] prAdapter  Pointer of ADAPTER_T
4174 *
4175 * \return none
4176 */
4177 /*----------------------------------------------------------------------------*/
4178 VOID
4179 aisFsmReleaseCh (
4180     IN P_ADAPTER_T prAdapter
4181     )
4182 {
4183     P_AIS_FSM_INFO_T prAisFsmInfo;
4184     P_MSG_CH_ABORT_T prMsgChAbort;
4185
4186     ASSERT(prAdapter);
4187
4188     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4189
4190     if(prAisFsmInfo->fgIsChannelGranted == TRUE
4191             || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4192
4193         prAisFsmInfo->fgIsChannelRequested = FALSE;
4194         prAisFsmInfo->fgIsChannelGranted = FALSE;
4195
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
4200             return;
4201         }
4202
4203         prMsgChAbort->rMsgHdr.eMsgId  = MID_MNY_CNM_CH_ABORT;
4204         prMsgChAbort->ucNetTypeIndex  = NETWORK_TYPE_AIS_INDEX;
4205         prMsgChAbort->ucTokenID       = prAisFsmInfo->ucSeqNumOfChReq;
4206
4207         mboxSendMsg(prAdapter,
4208                 MBOX_ID_0,
4209                 (P_MSG_HDR_T) prMsgChAbort,
4210                 MSG_SEND_METHOD_BUF);
4211     }
4212
4213     return;
4214 } /* end of aisFsmReleaseCh() */
4215
4216
4217 /*----------------------------------------------------------------------------*/
4218 /*!
4219 * \brief    This function is to inform AIS that corresponding beacon has not
4220 *           been received for a while and probing is not successful
4221 *
4222 * \param[in] prAdapter  Pointer of ADAPTER_T
4223 *
4224 * \return none
4225 */
4226 /*----------------------------------------------------------------------------*/
4227 VOID
4228 aisBssBeaconTimeout (
4229     IN P_ADAPTER_T prAdapter
4230     )
4231 {
4232     P_BSS_INFO_T prAisBssInfo;
4233     BOOLEAN fgDoAbortIndication = FALSE;
4234
4235     ASSERT(prAdapter);
4236
4237     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4238
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;
4243
4244             if (prStaRec) {
4245                 fgDoAbortIndication = TRUE;
4246             }
4247         }
4248         else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4249             fgDoAbortIndication = TRUE;
4250         }
4251     }
4252
4253     //4 <2> invoke abort handler
4254     if (fgDoAbortIndication) {
4255         aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4256     }
4257
4258     return;
4259 } /* end of aisBssBeaconTimeout() */
4260
4261
4262 /*----------------------------------------------------------------------------*/
4263 /*!
4264 * \brief    This function is to inform AIS that DEAUTH frame has been
4265 *           sent and thus state machine could go ahead
4266 *
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
4270 *
4271 * \return WLAN_STATUS_SUCCESS
4272 */
4273 /*----------------------------------------------------------------------------*/
4274 WLAN_STATUS
4275 aisDeauthXmitComplete (
4276     IN P_ADAPTER_T              prAdapter,
4277     IN P_MSDU_INFO_T            prMsduInfo,
4278     IN ENUM_TX_RESULT_CODE_T    rTxDoneStatus
4279     )
4280 {
4281     P_AIS_FSM_INFO_T prAisFsmInfo;
4282
4283     ASSERT(prAdapter);
4284
4285     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4286
4287     if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4288         if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4289             aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4290         }
4291     }
4292     else {
4293         DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4294     }
4295
4296     return WLAN_STATUS_SUCCESS;
4297
4298 } /* end of aisDeauthXmitComplete() */
4299
4300 #if CFG_SUPPORT_ROAMING
4301 /*----------------------------------------------------------------------------*/
4302 /*!
4303 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4304 *
4305 * @param[in] u4ReqScan  Requesting Scan or not
4306 *
4307 * @return (none)
4308 */
4309 /*----------------------------------------------------------------------------*/
4310 VOID
4311 aisFsmRunEventRoamingDiscovery (
4312     IN P_ADAPTER_T prAdapter,
4313     UINT_32 u4ReqScan
4314     )
4315 {
4316     P_AIS_FSM_INFO_T prAisFsmInfo;
4317     P_CONNECTION_SETTINGS_T prConnSettings;
4318     ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4319
4320     DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4321
4322     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4323     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4324
4325     /* search candidates by best rssi */
4326     prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4327
4328     /* results are still new */
4329     if (!u4ReqScan) {
4330         roamingFsmRunEventRoam(prAdapter);
4331         eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4332     }
4333     else {
4334         if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4335                 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4336             eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4337         }
4338         else {
4339             eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4340         }
4341     }
4342
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);
4346         }
4347         else {
4348             aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4349         }
4350     }
4351     else {
4352         aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4353         aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4354
4355         aisFsmInsertRequest(prAdapter, eAisRequest);
4356     }
4357
4358     return;
4359 } /* end of aisFsmRunEventRoamingDiscovery() */
4360
4361 /*----------------------------------------------------------------------------*/
4362 /*!
4363 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4364 *
4365 * @param (none)
4366 *
4367 * @return (none)
4368 */
4369 /*----------------------------------------------------------------------------*/
4370 ENUM_AIS_STATE_T
4371 aisFsmRoamingScanResultsUpdate (
4372     IN P_ADAPTER_T prAdapter
4373     )
4374 {
4375           P_AIS_FSM_INFO_T prAisFsmInfo;
4376           P_ROAMING_INFO_T prRoamingFsmInfo;
4377           ENUM_AIS_STATE_T eNextState;
4378
4379     DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4380
4381     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4382     prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4383
4384     roamingFsmScanResultsUpdate(prAdapter);
4385
4386     eNextState = prAisFsmInfo->eCurrentState;
4387     if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4388         roamingFsmRunEventRoam(prAdapter);
4389         eNextState = AIS_STATE_SEARCH;
4390     }
4391     else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4392         eNextState = AIS_STATE_SEARCH;
4393     }
4394     else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4395         eNextState = AIS_STATE_NORMAL_TR;
4396     }
4397
4398     return eNextState;
4399 } /* end of aisFsmRoamingScanResultsUpdate() */
4400
4401 /*----------------------------------------------------------------------------*/
4402 /*!
4403 * @brief This function will modify and update necessary information to firmware
4404 *        for disconnection of last AP before switching to roaming bss.
4405 *
4406 * @param IN prAdapter          Pointer to the Adapter structure.
4407 *           prTargetStaRec     Target of StaRec of roaming
4408 *
4409 * @retval None
4410 */
4411 /*----------------------------------------------------------------------------*/
4412 VOID
4413 aisFsmRoamingDisconnectPrevAP (
4414     IN P_ADAPTER_T prAdapter,
4415     IN P_STA_RECORD_T prTargetStaRec
4416     )
4417 {
4418     P_BSS_INFO_T prAisBssInfo;
4419
4420     DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4421
4422     ASSERT(prAdapter);
4423
4424     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4425
4426     nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4427
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
4431      */
4432      //rlmBssAborted(prAdapter, prAisBssInfo);
4433
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);
4437     }
4438
4439     //4 <4> Change Media State immediately.
4440     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4441
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 */
4446
4447     return;
4448 } /* end of aisFsmRoamingDisconnectPrevAP() */
4449
4450 /*----------------------------------------------------------------------------*/
4451 /*!
4452 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4453 *        the roaming was completed.
4454 *
4455 * @param IN prAdapter          Pointer to the Adapter structure.
4456 *           prStaRec           StaRec of roaming AP
4457 *           prAssocRspSwRfb
4458 *
4459 * @retval None
4460 */
4461 /*----------------------------------------------------------------------------*/
4462 VOID
4463 aisUpdateBssInfoForRoamingAP (
4464     IN P_ADAPTER_T prAdapter,
4465     IN P_STA_RECORD_T prStaRec,
4466     IN P_SW_RFB_T prAssocRspSwRfb
4467     )
4468 {
4469     P_BSS_INFO_T prAisBssInfo;
4470
4471     DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4472
4473     ASSERT(prAdapter);
4474
4475     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4476
4477     //4 <1.1> Change FW's Media State immediately.
4478     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4479
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);
4485     }
4486
4487     //4 <1.3> Update BSS_INFO_T
4488     aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4489
4490     //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4491     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4492
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);
4496
4497     return;
4498 } /* end of aisFsmRoamingUpdateBss() */
4499
4500 #endif /* CFG_SUPPORT_ROAMING */
4501
4502
4503 /*----------------------------------------------------------------------------*/
4504 /*!
4505 * @brief Check if there is any pending request and remove it (optional)
4506 *
4507 * @param prAdapter
4508 *        eReqType
4509 *        bRemove
4510 *
4511 * @return TRUE
4512 *         FALSE
4513 */
4514 /*----------------------------------------------------------------------------*/
4515 BOOLEAN
4516 aisFsmIsRequestPending (
4517     IN P_ADAPTER_T prAdapter,
4518     IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4519     IN BOOLEAN bRemove
4520     )
4521 {
4522     P_AIS_FSM_INFO_T prAisFsmInfo;
4523     P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4524
4525     ASSERT(prAdapter);
4526     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4527
4528     /* traverse through pending request list */
4529     LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4530             prPendingReqHdrNext,
4531             &(prAisFsmInfo->rPendingReqList),
4532             rLinkEntry,
4533             AIS_REQ_HDR_T) {
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));
4539
4540                 cnmMemFree(prAdapter, prPendingReqHdr);
4541             }
4542
4543             return TRUE;
4544         }
4545     }
4546
4547     return FALSE;
4548 }
4549
4550
4551 /*----------------------------------------------------------------------------*/
4552 /*!
4553 * @brief Get next pending request
4554 *
4555 * @param prAdapter
4556 *
4557 * @return P_AIS_REQ_HDR_T
4558 */
4559 /*----------------------------------------------------------------------------*/
4560 P_AIS_REQ_HDR_T
4561 aisFsmGetNextRequest (
4562     IN P_ADAPTER_T prAdapter
4563     )
4564 {
4565     P_AIS_FSM_INFO_T prAisFsmInfo;
4566     P_AIS_REQ_HDR_T prPendingReqHdr;
4567
4568     ASSERT(prAdapter);
4569     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4570
4571     LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4572
4573     return prPendingReqHdr;
4574 }
4575
4576
4577 /*----------------------------------------------------------------------------*/
4578 /*!
4579 * @brief Insert a new request
4580 *
4581 * @param prAdapter
4582 *        eReqType
4583 *
4584 * @return TRUE
4585 *         FALSE
4586 */
4587 /*----------------------------------------------------------------------------*/
4588 BOOLEAN
4589 aisFsmInsertRequest (
4590     IN P_ADAPTER_T prAdapter,
4591     IN ENUM_AIS_REQUEST_TYPE_T eReqType
4592     )
4593 {
4594     P_AIS_REQ_HDR_T prAisReq;
4595     P_AIS_FSM_INFO_T prAisFsmInfo;
4596
4597     ASSERT(prAdapter);
4598     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4599
4600     prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4601
4602     if(!prAisReq) {
4603         ASSERT(0); // Can't generate new message
4604         return FALSE;
4605     }
4606
4607     prAisReq->eReqType = eReqType;
4608
4609     /* attach request into pending request list */
4610     LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4611
4612     return TRUE;
4613 }
4614
4615
4616 /*----------------------------------------------------------------------------*/
4617 /*!
4618 * @brief Flush all pending requests
4619 *
4620 * @param prAdapter
4621 *
4622 * @return (none)
4623 */
4624 /*----------------------------------------------------------------------------*/
4625 VOID
4626 aisFsmFlushRequest (
4627     IN P_ADAPTER_T prAdapter
4628     )
4629 {
4630     P_AIS_REQ_HDR_T prAisReq;
4631
4632     ASSERT(prAdapter);
4633
4634     while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4635         cnmMemFree(prAdapter, prAisReq);
4636     }
4637
4638     return;
4639 }
4640
4641