support different wifi bt chip auto compatible
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / combo_mt66xx / 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     cnmTimerInitTimer(prAdapter,
1165                 &prAisFsmInfo->rScanDoneTimer,
1166                 (PFN_MGMT_TIMEOUT_FUNC)aisFsmRunEventScanDoneTimeOut,
1167                 (UINT_32)NULL);
1168
1169     //4 <1.2> Initiate PWR STATE
1170     SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1171
1172
1173     //4 <2> Initiate BSS_INFO_T - common part
1174     BSS_INFO_INIT(prAdapter, NETWORK_TYPE_AIS_INDEX);
1175     COPY_MAC_ADDR(prAisBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucMacAddress);
1176
1177     //4 <3> Initiate BSS_INFO_T - private part
1178     /* TODO */
1179     prAisBssInfo->eBand = BAND_2G4;
1180     prAisBssInfo->ucPrimaryChannel = 1;
1181     prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
1182
1183     //4 <4> Allocate MSDU_INFO_T for Beacon
1184     prAisBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
1185             OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
1186
1187     if (prAisBssInfo->prBeacon) {
1188         prAisBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
1189         prAisBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
1190     }
1191     else {
1192         ASSERT(0);
1193     }
1194
1195 #if 0
1196     prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
1197     prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
1198     prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
1199 #else
1200     if (prAdapter->u4UapsdAcBmp == 0) {
1201         prAdapter->u4UapsdAcBmp = CFG_INIT_UAPSD_AC_BMP;
1202         //ASSERT(prAdapter->u4UapsdAcBmp);
1203     }
1204     prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = (UINT_8)prAdapter->u4UapsdAcBmp;
1205     prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC =(UINT_8) prAdapter->u4UapsdAcBmp;
1206     prAisBssInfo->rPmProfSetupInfo.ucUapsdSp = (UINT_8)prAdapter->u4MaxSpLen;
1207 #endif
1208
1209     /* request list initialization */
1210     LINK_INITIALIZE(&prAisFsmInfo->rPendingReqList);
1211
1212     //DBGPRINTF("[2] ucBmpDeliveryAC:0x%x, ucBmpTriggerAC:0x%x, ucUapsdSp:0x%x",
1213             //prAisBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC,
1214             //prAisBssInfo->rPmProfSetupInfo.ucBmpTriggerAC,
1215             //prAisBssInfo->rPmProfSetupInfo.ucUapsdSp);
1216
1217     return;
1218 } /* end of aisFsmInit() */
1219
1220 /*----------------------------------------------------------------------------*/
1221 /*!
1222 * @brief the function is used to uninitialize the value in AIS_FSM_INFO_T for
1223 *        AIS FSM operation
1224 *
1225 * @param (none)
1226 *
1227 * @return (none)
1228 */
1229 /*----------------------------------------------------------------------------*/
1230 VOID
1231 aisFsmUninit (
1232     IN P_ADAPTER_T prAdapter
1233     )
1234 {
1235     P_AIS_FSM_INFO_T prAisFsmInfo;
1236     P_BSS_INFO_T prAisBssInfo;
1237     P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1238
1239     DEBUGFUNC("aisFsmUninit()");
1240     DBGLOG(SW1, INFO, ("->aisFsmUninit()\n"));
1241
1242     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1243     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1244     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1245
1246     //4 <1> Stop all timers
1247     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
1248     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
1249     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
1250     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1251     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rScanDoneTimer); //Add by Enlai
1252
1253     //4 <2> flush pending request
1254     aisFsmFlushRequest(prAdapter);
1255
1256     //4 <3> Reset driver-domain BSS-INFO
1257     if(prAisBssInfo->prBeacon) {
1258         cnmMgtPktFree(prAdapter, prAisBssInfo->prBeacon);
1259         prAisBssInfo->prBeacon = NULL;
1260     }
1261
1262 #if CFG_SUPPORT_802_11W
1263     rsnStopSaQuery(prAdapter);
1264 #endif
1265
1266     return;
1267 } /* end of aisFsmUninit() */
1268
1269
1270 /*----------------------------------------------------------------------------*/
1271 /*!
1272 * @brief Initialization of JOIN STATE
1273 *
1274 * @param[in] prBssDesc  The pointer of BSS_DESC_T which is the BSS we will try to join with.
1275 *
1276 * @return (none)
1277 */
1278 /*----------------------------------------------------------------------------*/
1279 VOID
1280 aisFsmStateInit_JOIN (
1281     IN P_ADAPTER_T prAdapter,
1282     P_BSS_DESC_T prBssDesc
1283     )
1284 {
1285     P_AIS_FSM_INFO_T prAisFsmInfo;
1286     P_BSS_INFO_T prAisBssInfo;
1287     P_AIS_SPECIFIC_BSS_INFO_T prAisSpecificBssInfo;
1288     P_CONNECTION_SETTINGS_T prConnSettings;
1289     P_STA_RECORD_T prStaRec;
1290     P_MSG_JOIN_REQ_T prJoinReqMsg;
1291
1292     DEBUGFUNC("aisFsmStateInit_JOIN()");
1293
1294     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1295     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1296     prAisSpecificBssInfo = &(prAdapter->rWifiVar.rAisSpecificBssInfo);
1297     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1298
1299     ASSERT(prBssDesc);
1300
1301     //4 <1> We are going to connect to this BSS.
1302     prBssDesc->fgIsConnecting = TRUE;
1303
1304
1305     //4 <2> Setup corresponding STA_RECORD_T
1306     prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1307             STA_TYPE_LEGACY_AP,
1308             NETWORK_TYPE_AIS_INDEX,
1309             prBssDesc);
1310
1311     prAisFsmInfo->prTargetStaRec = prStaRec;
1312
1313     //4 <2.1> sync. to firmware domain
1314     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1315
1316     //4 <3> Update ucAvailableAuthTypes which we can choice during SAA
1317     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1318
1319         prStaRec->fgIsReAssoc = FALSE;
1320
1321         switch (prConnSettings->eAuthMode) {
1322         case AUTH_MODE_OPEN:                /* Note: Omit break here. */
1323         case AUTH_MODE_WPA:
1324         case AUTH_MODE_WPA_PSK:
1325         case AUTH_MODE_WPA2:
1326         case AUTH_MODE_WPA2_PSK:
1327             prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1328             break;
1329
1330
1331         case AUTH_MODE_SHARED:
1332             prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)AUTH_TYPE_SHARED_KEY;
1333             break;
1334
1335
1336         case AUTH_MODE_AUTO_SWITCH:
1337             DBGLOG(AIS, LOUD, ("JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n"));
1338             prAisFsmInfo->ucAvailableAuthTypes = (UINT_8)(AUTH_TYPE_OPEN_SYSTEM |
1339                                                           AUTH_TYPE_SHARED_KEY);
1340             break;
1341
1342         default:
1343             ASSERT(!(prConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
1344             DBGLOG(AIS, ERROR, ("JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
1345                                            prConnSettings->eAuthMode));
1346             /* TODO(Kevin): error handling ? */
1347             return;
1348         }
1349
1350         /* TODO(tyhsu): Assume that Roaming Auth Type is equal to ConnSettings eAuthMode */
1351         prAisSpecificBssInfo->ucRoamingAuthTypes = prAisFsmInfo->ucAvailableAuthTypes;
1352
1353         prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
1354
1355     }
1356     else {
1357         ASSERT(prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE);
1358         ASSERT(!prBssDesc->fgIsConnected);
1359
1360         DBGLOG(AIS, LOUD, ("JOIN INIT: AUTH TYPE = %d for Roaming\n",
1361             prAisSpecificBssInfo->ucRoamingAuthTypes));
1362
1363
1364         prStaRec->fgIsReAssoc = TRUE; /* We do roaming while the medium is connected */
1365
1366         /* TODO(Kevin): We may call a sub function to acquire the Roaming Auth Type */
1367         prAisFsmInfo->ucAvailableAuthTypes = prAisSpecificBssInfo->ucRoamingAuthTypes;
1368
1369         prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT_FOR_ROAMING;
1370     }
1371
1372
1373     //4 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes
1374     if (prAisFsmInfo->ucAvailableAuthTypes &
1375         (UINT_8)AUTH_TYPE_OPEN_SYSTEM) {
1376
1377         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n"));
1378         prAisFsmInfo->ucAvailableAuthTypes &=
1379             ~(UINT_8)AUTH_TYPE_OPEN_SYSTEM;
1380
1381         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
1382     }
1383     else if (prAisFsmInfo->ucAvailableAuthTypes &
1384         (UINT_8)AUTH_TYPE_SHARED_KEY) {
1385
1386         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n"));
1387
1388         prAisFsmInfo->ucAvailableAuthTypes &=
1389             ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1390
1391         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1392     }
1393     else if (prAisFsmInfo->ucAvailableAuthTypes &
1394         (UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION) {
1395
1396         DBGLOG(AIS, LOUD, ("JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n"));
1397
1398         prAisFsmInfo->ucAvailableAuthTypes &=
1399             ~(UINT_8)AUTH_TYPE_FAST_BSS_TRANSITION;
1400
1401         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
1402     }
1403     else {
1404         ASSERT(0);
1405     }
1406
1407     //4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req)
1408     if (prConnSettings->eConnectionPolicy == CONNECT_BY_SSID_ANY) {
1409
1410         if (prBssDesc->ucSSIDLen) {
1411             COPY_SSID(prConnSettings->aucSSID,
1412                       prConnSettings->ucSSIDLen,
1413                       prBssDesc->aucSSID,
1414                       prBssDesc->ucSSIDLen);
1415         }
1416     }
1417
1418     //4 <6> Send a Msg to trigger SAA to start JOIN process.
1419     prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1420     if (!prJoinReqMsg) {
1421
1422         ASSERT(0); // Can't trigger SAA FSM
1423         return;
1424     }
1425
1426     prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1427     prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1428     prJoinReqMsg->prStaRec = prStaRec;
1429
1430     if (1) {
1431         int j;
1432         P_FRAG_INFO_T prFragInfo;
1433         for (j = 0; j < MAX_NUM_CONCURRENT_FRAGMENTED_MSDUS; j++) {
1434             prFragInfo = &prStaRec->rFragInfo[j];
1435
1436             if (prFragInfo->pr1stFrag) {
1437                 //nicRxReturnRFB(prAdapter, prFragInfo->pr1stFrag);
1438                 prFragInfo->pr1stFrag = (P_SW_RFB_T)NULL;
1439             }
1440         }
1441     }
1442
1443     mboxSendMsg(prAdapter,
1444             MBOX_ID_0,
1445             (P_MSG_HDR_T) prJoinReqMsg,
1446             MSG_SEND_METHOD_BUF);
1447
1448     return;
1449 } /* end of aisFsmInit_JOIN() */
1450
1451
1452 /*----------------------------------------------------------------------------*/
1453 /*!
1454 * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
1455 *
1456 * @param[in] prStaRec       Pointer to the STA_RECORD_T
1457 *
1458 * @retval TRUE      We will retry JOIN
1459 * @retval FALSE     We will not retry JOIN
1460 */
1461 /*----------------------------------------------------------------------------*/
1462 BOOLEAN
1463 aisFsmStateInit_RetryJOIN (
1464     IN P_ADAPTER_T prAdapter,
1465     P_STA_RECORD_T prStaRec
1466     )
1467 {
1468     P_AIS_FSM_INFO_T prAisFsmInfo;
1469     P_MSG_JOIN_REQ_T prJoinReqMsg;
1470
1471     DEBUGFUNC("aisFsmStateInit_RetryJOIN()");
1472
1473     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1474
1475     /* Retry other AuthType if possible */
1476     if (!prAisFsmInfo->ucAvailableAuthTypes) {
1477         return FALSE;
1478     }
1479
1480     if (prAisFsmInfo->ucAvailableAuthTypes &
1481         (UINT_8)AUTH_TYPE_SHARED_KEY) {
1482
1483         DBGLOG(AIS, INFO, ("RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n"));
1484
1485         prAisFsmInfo->ucAvailableAuthTypes &=
1486             ~(UINT_8)AUTH_TYPE_SHARED_KEY;
1487
1488         prStaRec->ucAuthAlgNum = (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY;
1489     }
1490     else {
1491         DBGLOG(AIS, ERROR, ("RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n"));
1492         ASSERT(0);
1493     }
1494
1495     prAisFsmInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
1496
1497     /* Trigger SAA to start JOIN process. */
1498     prJoinReqMsg = (P_MSG_JOIN_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
1499     if (!prJoinReqMsg) {
1500
1501         ASSERT(0); // Can't trigger SAA FSM
1502         return FALSE;
1503     }
1504
1505     prJoinReqMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_START;
1506     prJoinReqMsg->ucSeqNum = ++prAisFsmInfo->ucSeqNumOfReqMsg;
1507     prJoinReqMsg->prStaRec = prStaRec;
1508
1509     mboxSendMsg(prAdapter,
1510             MBOX_ID_0,
1511             (P_MSG_HDR_T) prJoinReqMsg,
1512             MSG_SEND_METHOD_BUF);
1513
1514     return TRUE;
1515
1516 }/* end of aisFsmRetryJOIN() */
1517
1518
1519 #if CFG_SUPPORT_ADHOC
1520 /*----------------------------------------------------------------------------*/
1521 /*!
1522 * @brief State Initialization of AIS_STATE_IBSS_ALONE
1523 *
1524 * @param (none)
1525 *
1526 * @return (none)
1527 */
1528 /*----------------------------------------------------------------------------*/
1529 VOID
1530 aisFsmStateInit_IBSS_ALONE (
1531     IN P_ADAPTER_T prAdapter
1532     )
1533 {
1534     P_AIS_FSM_INFO_T prAisFsmInfo;
1535     P_CONNECTION_SETTINGS_T prConnSettings;
1536     P_BSS_INFO_T prAisBssInfo;
1537
1538     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1539     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1540     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1541
1542     //4 <1> Check if IBSS was created before ?
1543     if (prAisBssInfo->fgIsBeaconActivated) {
1544
1545         //4 <2> Start IBSS Alone Timer for periodic SCAN and then SEARCH
1546 #if !CFG_SLT_SUPPORT
1547         cnmTimerStartTimer(prAdapter,
1548                 &prAisFsmInfo->rIbssAloneTimer,
1549                 SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
1550 #endif
1551     }
1552
1553     aisFsmCreateIBSS(prAdapter);
1554
1555     return;
1556 } /* end of aisFsmStateInit_IBSS_ALONE() */
1557
1558
1559 /*----------------------------------------------------------------------------*/
1560 /*!
1561 * @brief State Initialization of AIS_STATE_IBSS_MERGE
1562 *
1563 * @param[in] prBssDesc  The pointer of BSS_DESC_T which is the IBSS we will try to merge with.
1564 *
1565 * @return (none)
1566 */
1567 /*----------------------------------------------------------------------------*/
1568 VOID
1569 aisFsmStateInit_IBSS_MERGE (
1570     IN P_ADAPTER_T prAdapter,
1571     P_BSS_DESC_T prBssDesc
1572     )
1573 {
1574     P_AIS_FSM_INFO_T prAisFsmInfo;
1575     P_CONNECTION_SETTINGS_T prConnSettings;
1576     P_BSS_INFO_T prAisBssInfo;
1577     P_STA_RECORD_T prStaRec = (P_STA_RECORD_T)NULL;
1578
1579
1580     ASSERT(prBssDesc);
1581
1582     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1583     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1584     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1585
1586     //4 <1> We will merge with to this BSS immediately.
1587     prBssDesc->fgIsConnecting = FALSE;
1588     prBssDesc->fgIsConnected = TRUE;
1589
1590     //4 <2> Setup corresponding STA_RECORD_T
1591     prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
1592             STA_TYPE_ADHOC_PEER,
1593             NETWORK_TYPE_AIS_INDEX,
1594             prBssDesc);
1595
1596     prStaRec->fgIsMerging = TRUE;
1597
1598     prAisFsmInfo->prTargetStaRec = prStaRec;
1599
1600     //4 <2.1> sync. to firmware domain
1601     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1602
1603     //4 <3> IBSS-Merge
1604     aisFsmMergeIBSS(prAdapter, prStaRec);
1605
1606     return;
1607 } /* end of aisFsmStateInit_IBSS_MERGE() */
1608
1609 #endif /* CFG_SUPPORT_ADHOC */
1610
1611
1612 /*----------------------------------------------------------------------------*/
1613 /*!
1614 * @brief Process of JOIN Abort
1615 *
1616 * @param (none)
1617 *
1618 * @return (none)
1619 */
1620 /*----------------------------------------------------------------------------*/
1621 VOID
1622 aisFsmStateAbort_JOIN (
1623     IN P_ADAPTER_T prAdapter
1624     )
1625 {
1626     P_AIS_FSM_INFO_T prAisFsmInfo;
1627     P_MSG_JOIN_ABORT_T prJoinAbortMsg;
1628
1629     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1630
1631     /* 1. Abort JOIN process */
1632     prJoinAbortMsg = (P_MSG_JOIN_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
1633     if (!prJoinAbortMsg) {
1634
1635         ASSERT(0); // Can't abort SAA FSM
1636         return;
1637     }
1638
1639     kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
1640              WLAN_STATUS_CONNECT_INDICATION,
1641              NULL,
1642              0);
1643
1644     prJoinAbortMsg->rMsgHdr.eMsgId = MID_AIS_SAA_FSM_ABORT;
1645     prJoinAbortMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfReqMsg;
1646     prJoinAbortMsg->prStaRec = prAisFsmInfo->prTargetStaRec;
1647
1648     scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisFsmInfo->prTargetStaRec->aucMacAddr);
1649
1650     mboxSendMsg(prAdapter,
1651             MBOX_ID_0,
1652             (P_MSG_HDR_T) prJoinAbortMsg,
1653             MSG_SEND_METHOD_BUF);
1654
1655     /* 2. Return channel privilege */
1656     aisFsmReleaseCh(prAdapter);
1657
1658     /* 3.1 stop join timeout timer */
1659     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1660
1661     /* 3.2 reset local variable */
1662     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1663     prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
1664
1665     return;
1666 } /* end of aisFsmAbortJOIN() */
1667
1668
1669 /*----------------------------------------------------------------------------*/
1670 /*!
1671 * @brief Process of SCAN Abort
1672 *
1673 * @param (none)
1674 *
1675 * @return (none)
1676 */
1677 /*----------------------------------------------------------------------------*/
1678 VOID
1679 aisFsmStateAbort_SCAN (
1680     IN P_ADAPTER_T prAdapter
1681     )
1682 {
1683     P_AIS_FSM_INFO_T prAisFsmInfo;
1684     P_MSG_SCN_SCAN_CANCEL prScanCancelMsg;
1685
1686     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1687
1688     /* Abort JOIN process. */
1689     prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
1690     if (!prScanCancelMsg) {
1691
1692         ASSERT(0); // Can't abort SCN FSM
1693         return;
1694     }
1695
1696     prScanCancelMsg->rMsgHdr.eMsgId = MID_AIS_SCN_SCAN_CANCEL;
1697     prScanCancelMsg->ucSeqNum = prAisFsmInfo->ucSeqNumOfScanReq;
1698     prScanCancelMsg->ucNetTypeIndex = (UINT_8)NETWORK_TYPE_AIS_INDEX;
1699 #if CFG_ENABLE_WIFI_DIRECT
1700     if(prAdapter->fgIsP2PRegistered) {
1701         prScanCancelMsg->fgIsChannelExt = FALSE;
1702     }
1703 #endif
1704
1705     /* unbuffered message to guarantee scan is cancelled in sequence */
1706     mboxSendMsg(prAdapter,
1707             MBOX_ID_0,
1708             (P_MSG_HDR_T) prScanCancelMsg,
1709             MSG_SEND_METHOD_UNBUF);
1710
1711     return;
1712 } /* end of aisFsmAbortSCAN() */
1713
1714
1715 /*----------------------------------------------------------------------------*/
1716 /*!
1717 * @brief Process of NORMAL_TR Abort
1718 *
1719 * @param (none)
1720 *
1721 * @return (none)
1722 */
1723 /*----------------------------------------------------------------------------*/
1724 VOID
1725 aisFsmStateAbort_NORMAL_TR (
1726     IN P_ADAPTER_T prAdapter
1727     )
1728 {
1729     P_AIS_FSM_INFO_T prAisFsmInfo;
1730
1731     ASSERT(prAdapter);
1732     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1733
1734     /* TODO(Kevin): Do abort other MGMT func */
1735
1736     /* 1. Release channel to CNM */
1737     aisFsmReleaseCh(prAdapter);
1738
1739     /* 2.1 stop join timeout timer */
1740     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
1741
1742     /* 2.2 reset local variable */
1743     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
1744
1745     return;
1746 } /* end of aisFsmAbortNORMAL_TR() */
1747
1748
1749 #if CFG_SUPPORT_ADHOC
1750 /*----------------------------------------------------------------------------*/
1751 /*!
1752 * @brief Process of NORMAL_TR Abort
1753 *
1754 * @param (none)
1755 *
1756 * @return (none)
1757 */
1758 /*----------------------------------------------------------------------------*/
1759 VOID
1760 aisFsmStateAbort_IBSS (
1761     IN P_ADAPTER_T prAdapter
1762     )
1763 {
1764     P_AIS_FSM_INFO_T prAisFsmInfo;
1765     P_BSS_DESC_T prBssDesc;
1766
1767     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1768
1769     // reset BSS-DESC
1770     if (prAisFsmInfo->prTargetStaRec) {
1771         prBssDesc = scanSearchBssDescByTA(prAdapter,
1772                 prAisFsmInfo->prTargetStaRec->aucMacAddr);
1773
1774         if (prBssDesc) {
1775             prBssDesc->fgIsConnected = FALSE;
1776             prBssDesc->fgIsConnecting = FALSE;
1777         }
1778     }
1779
1780     // release channel privilege
1781     aisFsmReleaseCh(prAdapter);
1782
1783     return;
1784 }
1785 #endif /* CFG_SUPPORT_ADHOC */
1786
1787
1788 /*----------------------------------------------------------------------------*/
1789 /*!
1790 * @brief The Core FSM engine of AIS(Ad-hoc, Infra STA)
1791 *
1792 * @param[in] eNextState Enum value of next AIS STATE
1793 *
1794 * @return (none)
1795 */
1796 /*----------------------------------------------------------------------------*/
1797 VOID
1798 aisFsmSteps (
1799     IN P_ADAPTER_T prAdapter,
1800     ENUM_AIS_STATE_T eNextState
1801     )
1802 {
1803     P_AIS_FSM_INFO_T prAisFsmInfo;
1804     P_BSS_INFO_T prAisBssInfo;
1805     P_CONNECTION_SETTINGS_T prConnSettings;
1806     P_BSS_DESC_T prBssDesc;
1807     P_MSG_CH_REQ_T prMsgChReq;
1808     P_MSG_SCN_SCAN_REQ prScanReqMsg;
1809     P_AIS_REQ_HDR_T prAisReq;
1810     ENUM_BAND_T eBand;
1811     UINT_8 ucChannel;
1812     UINT_16 u2ScanIELen;
1813
1814     BOOLEAN fgIsTransition = (BOOLEAN)FALSE;
1815
1816     DEBUGFUNC("aisFsmSteps()");
1817
1818     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
1819     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1820     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
1821
1822     do {
1823
1824         /* Do entering Next State */
1825         prAisFsmInfo->ePreviousState = prAisFsmInfo->eCurrentState;
1826
1827 #if DBG
1828         DBGLOG(AIS, STATE, ("TRANSITION: [%s] -> [%s]\n",
1829                             apucDebugAisState[prAisFsmInfo->eCurrentState],
1830                             apucDebugAisState[eNextState]));
1831 #else
1832         DBGLOG(AIS, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
1833                             DBG_AIS_IDX,
1834                             prAisFsmInfo->eCurrentState,
1835                             eNextState));
1836 #endif
1837         /* NOTE(Kevin): This is the only place to change the eCurrentState(except initial) */
1838         prAisFsmInfo->eCurrentState = eNextState;
1839
1840         fgIsTransition = (BOOLEAN)FALSE;
1841
1842         /* Do tasks of the State that we just entered */
1843         switch (prAisFsmInfo->eCurrentState) {
1844         /* NOTE(Kevin): we don't have to rearrange the sequence of following
1845          * switch case. Instead I would like to use a common lookup table of array
1846          * of function pointer to speed up state search.
1847          */
1848         case AIS_STATE_IDLE:
1849
1850             prAisReq = aisFsmGetNextRequest(prAdapter);
1851
1852             if(prAisReq == NULL || prAisReq->eReqType == AIS_REQUEST_RECONNECT) {
1853                 if (prConnSettings->fgIsConnReqIssued == TRUE && 
1854                         prConnSettings->fgIsDisconnectedByNonRequest == FALSE) {
1855
1856                     prAisFsmInfo->fgTryScan = TRUE;
1857
1858                     SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1859                     SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1860
1861                     // sync with firmware
1862                     nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1863
1864                     // reset trial count
1865                     prAisFsmInfo->ucConnTrialCount = 0;
1866
1867                     eNextState = AIS_STATE_SEARCH;
1868                     fgIsTransition = TRUE;
1869                 }
1870                 else {
1871                     UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1872                     SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
1873
1874                     // sync with firmware
1875                     nicDeactivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
1876
1877                     // check for other pending request
1878                     if(prAisReq) {
1879                         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
1880                             wlanClearScanningResult(prAdapter);
1881                             eNextState = AIS_STATE_SCAN;
1882
1883                             fgIsTransition = TRUE;
1884                         }
1885                     }
1886                 }
1887
1888                 if(prAisReq) {
1889                     /* free the message */
1890                     cnmMemFree(prAdapter, prAisReq);
1891                 }
1892             }
1893             else if(prAisReq->eReqType == AIS_REQUEST_SCAN) {
1894 #if CFG_SUPPORT_ROAMING
1895                 prAisFsmInfo->fgIsRoamingScanPending = FALSE;
1896 #endif /* CFG_SUPPORT_ROAMING */
1897                 wlanClearScanningResult(prAdapter);
1898
1899                 eNextState = AIS_STATE_SCAN;
1900                 fgIsTransition = TRUE;
1901
1902                 /* free the message */
1903                 cnmMemFree(prAdapter, prAisReq);
1904             }
1905             else if(prAisReq->eReqType == AIS_REQUEST_ROAMING_CONNECT || prAisReq->eReqType == AIS_REQUEST_ROAMING_SEARCH) {
1906                 /* ignore */
1907                 /* free the message */
1908                 cnmMemFree(prAdapter, prAisReq);
1909             }
1910
1911             prAisFsmInfo->u4SleepInterval = AIS_BG_SCAN_INTERVAL_MIN_SEC;
1912
1913             break;
1914
1915         case AIS_STATE_SEARCH:
1916             //4 <1> Search for a matched candidate and save it to prTargetBssDesc.
1917 #if CFG_SLT_SUPPORT
1918             prBssDesc = prAdapter->rWifiVar.rSltInfo.prPseudoBssDesc;
1919 #else
1920             prBssDesc = scanSearchBssDescByPolicy(prAdapter, NETWORK_TYPE_AIS_INDEX);
1921 #endif
1922
1923             // we are under Roaming Condition.
1924             if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1925                 if(prAisFsmInfo->ucConnTrialCount > AIS_ROAMING_CONNECTION_TRIAL_LIMIT) {
1926 #if CFG_SUPPORT_ROAMING
1927                     roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_CONNLIMIT);
1928 #endif /* CFG_SUPPORT_ROAMING */
1929                     // reset retry count
1930                     prAisFsmInfo->ucConnTrialCount = 0;
1931
1932                     // abort connection trial
1933                     prConnSettings->fgIsConnReqIssued = FALSE;
1934
1935                     eNextState = AIS_STATE_NORMAL_TR;
1936                     fgIsTransition = TRUE;
1937
1938                     break;
1939                 }
1940             }
1941
1942             //4 <2> We are not under Roaming Condition.
1943             if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
1944
1945                 //4 <2.a> If we have the matched one
1946                 if (prBssDesc) {
1947
1948                     //4 <A> Stored the Selected BSS security cipher. For later asoc req compose IE
1949                     prAisBssInfo->u4RsnSelectedGroupCipher =
1950                         prBssDesc->u4RsnSelectedGroupCipher;
1951                     prAisBssInfo->u4RsnSelectedPairwiseCipher =
1952                         prBssDesc->u4RsnSelectedPairwiseCipher;
1953                     prAisBssInfo->u4RsnSelectedAKMSuite =
1954                         prBssDesc->u4RsnSelectedAKMSuite;
1955
1956                     //4 <B> Do STATE transition and update current Operation Mode.
1957                     if (prBssDesc->eBSSType == BSS_TYPE_INFRASTRUCTURE) {
1958
1959                         prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
1960
1961                         /* Record the target BSS_DESC_T for next STATE. */
1962                         prAisFsmInfo->prTargetBssDesc = prBssDesc;
1963
1964                         /* Transit to channel acquire */
1965                         eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
1966                         fgIsTransition = TRUE;
1967
1968                         // increase connection trial count
1969                         prAisFsmInfo->ucConnTrialCount++;
1970                     }
1971 #if CFG_SUPPORT_ADHOC
1972                     else if (prBssDesc->eBSSType == BSS_TYPE_IBSS) {
1973
1974                         prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
1975
1976                         /* Record the target BSS_DESC_T for next STATE. */
1977                         prAisFsmInfo->prTargetBssDesc = prBssDesc;
1978
1979                         eNextState = AIS_STATE_IBSS_MERGE;
1980                         fgIsTransition = TRUE;
1981                     }
1982 #endif /* CFG_SUPPORT_ADHOC */
1983                     else {
1984                         ASSERT(0);
1985                         eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
1986                         fgIsTransition = TRUE;
1987                     }
1988                 }
1989                 //4 <2.b> If we don't have the matched one
1990                 else {
1991
1992                     // increase connection trial count for infrastructure connection
1993                     if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
1994                         prAisFsmInfo->ucConnTrialCount++;
1995                     }
1996
1997                     //4 <A> Try to SCAN
1998                     if (prAisFsmInfo->fgTryScan) {
1999                         eNextState = AIS_STATE_LOOKING_FOR;
2000
2001                         fgIsTransition = TRUE;
2002                     }
2003                     //4 <B> We've do SCAN already, now wait in some STATE.
2004                     else {
2005                         if (prConnSettings->eOPMode == NET_TYPE_INFRA) {
2006
2007                             /* issue reconnect request, and retreat to idle state for scheduling */
2008                             aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2009
2010                             eNextState = AIS_STATE_IDLE;
2011                             fgIsTransition = TRUE;
2012                         }
2013 #if CFG_SUPPORT_ADHOC
2014                         else if ((prConnSettings->eOPMode == NET_TYPE_IBSS)
2015                                     || (prConnSettings->eOPMode == NET_TYPE_AUTO_SWITCH)
2016                                     || (prConnSettings->eOPMode == NET_TYPE_DEDICATED_IBSS)) {
2017
2018                             prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
2019                             prAisFsmInfo->prTargetBssDesc = NULL;
2020
2021                             eNextState = AIS_STATE_IBSS_ALONE;
2022                             fgIsTransition = TRUE;
2023                         }
2024 #endif /* CFG_SUPPORT_ADHOC */
2025                         else {
2026                             ASSERT(0);
2027                             eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2028                             fgIsTransition = TRUE;
2029                         }
2030                     }
2031                 }
2032             }
2033             //4 <3> We are under Roaming Condition.
2034             else { // prAdapter->eConnectionState == MEDIA_STATE_CONNECTED.
2035
2036                 //4 <3.a> This BSS_DESC_T is our AP.
2037                 /* NOTE(Kevin 2008/05/16): Following cases will go back to NORMAL_TR.
2038                  * CASE I: During Roaming, APP(WZC/NDISTEST) change the connection
2039                  *         settings. That make we can NOT match the original AP, so the
2040                  *         prBssDesc is NULL.
2041                  * CASE II: The same reason as CASE I. Because APP change the
2042                  *          eOPMode to other network type in connection setting
2043                  *          (e.g. NET_TYPE_IBSS), so the BssDesc become the IBSS node.
2044                  * (For CASE I/II, before WZC/NDISTEST set the OID_SSID, it will change
2045                  * other parameters in connection setting first. So if we do roaming
2046                  * at the same time, it will hit these cases.)
2047                  *
2048                  * CASE III: Normal case, we can't find other candidate to roam
2049                  * out, so only the current AP will be matched.
2050                  *
2051                  * CASE VI: Timestamp of the current AP might be reset
2052                  */
2053                 if ((!prBssDesc) || /* CASE I */
2054                     (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) || /* CASE II */
2055                     (prBssDesc->fgIsConnected) || /* CASE III */
2056                     (EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID)) /* CASE VI */) {
2057 #if DBG
2058                     if ((prBssDesc) &&
2059                         (prBssDesc->fgIsConnected)) {
2060                         ASSERT(EQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2061                     }
2062 #endif /* DBG */
2063                     /* We already associated with it, go back to NORMAL_TR */
2064                     /* TODO(Kevin): Roaming Fail */
2065 #if CFG_SUPPORT_ROAMING
2066                     roamingFsmRunEventFail(prAdapter, ROAMING_FAIL_REASON_NOCANDIDATE);
2067 #endif /* CFG_SUPPORT_ROAMING */
2068
2069                     /* Retreat to NORMAL_TR state */
2070                     eNextState = AIS_STATE_NORMAL_TR;
2071                     fgIsTransition = TRUE;
2072                 }
2073                 //4 <3.b> Try to roam out for JOIN this BSS_DESC_T.
2074                 else {
2075 #if DBG
2076                     ASSERT(UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAisBssInfo->aucBSSID));
2077 #endif /* DBG */
2078
2079                     //4 <A> Record the target BSS_DESC_T for next STATE.
2080                     prAisFsmInfo->prTargetBssDesc = prBssDesc;
2081
2082                     // tyhsu: increase connection trial count
2083                     prAisFsmInfo->ucConnTrialCount++;
2084
2085                     /* Transit to channel acquire */
2086                     eNextState = AIS_STATE_REQ_CHANNEL_JOIN;
2087                     fgIsTransition = TRUE;
2088                 }
2089             }
2090
2091             break;
2092
2093         case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2094
2095             DBGLOG(AIS, LOUD, ("SCAN: Idle Begin - Current Time = %ld\n", kalGetTimeTick()));
2096
2097             cnmTimerStartTimer(prAdapter,
2098                     &prAisFsmInfo->rBGScanTimer,
2099                     SEC_TO_MSEC(prAisFsmInfo->u4SleepInterval));
2100
2101             SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2102
2103             if (prAisFsmInfo->u4SleepInterval < AIS_BG_SCAN_INTERVAL_MAX_SEC) {
2104                 prAisFsmInfo->u4SleepInterval <<= 1;
2105             }
2106             break;
2107
2108         case AIS_STATE_SCAN:
2109         case AIS_STATE_ONLINE_SCAN:
2110         case AIS_STATE_LOOKING_FOR:
2111
2112             if(!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) {
2113                 SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
2114
2115                 // sync with firmware
2116                 nicActivateNetwork(prAdapter, NETWORK_TYPE_AIS_INDEX);
2117             }
2118
2119             /* IE length decision */
2120             if(prAisFsmInfo->u4ScanIELength > 0) {
2121                 u2ScanIELen = (UINT_16)prAisFsmInfo->u4ScanIELength;
2122             }
2123             else {
2124 #if CFG_SUPPORT_WPS2
2125                 u2ScanIELen = prAdapter->prGlueInfo->u2WSCIELen;
2126 #else
2127                 u2ScanIELen = 0;
2128 #endif
2129             }
2130
2131             prScanReqMsg = (P_MSG_SCN_SCAN_REQ)cnmMemAlloc(prAdapter,
2132                     RAM_TYPE_MSG,
2133                     OFFSET_OF(MSG_SCN_SCAN_REQ, aucIE) + u2ScanIELen);
2134             if (!prScanReqMsg) {
2135                 ASSERT(0); // Can't trigger SCAN FSM
2136                 return;
2137             }
2138
2139             prScanReqMsg->rMsgHdr.eMsgId    = MID_AIS_SCN_SCAN_REQ;
2140             prScanReqMsg->ucSeqNum          = ++prAisFsmInfo->ucSeqNumOfScanReq;
2141             prScanReqMsg->ucNetTypeIndex    = (UINT_8)NETWORK_TYPE_AIS_INDEX;
2142
2143 #if CFG_SUPPORT_RDD_TEST_MODE
2144             prScanReqMsg->eScanType         = SCAN_TYPE_PASSIVE_SCAN;
2145 #else
2146             prScanReqMsg->eScanType         = SCAN_TYPE_ACTIVE_SCAN;
2147 #endif
2148
2149             if(prAisFsmInfo->eCurrentState == AIS_STATE_SCAN
2150                     || prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
2151                 if(prAisFsmInfo->ucScanSSIDLen == 0) {
2152                     /* Scan for all available SSID */
2153                     prScanReqMsg->ucSSIDType        = SCAN_REQ_SSID_WILDCARD;
2154                 }
2155                 else {
2156                     prScanReqMsg->ucSSIDType        = SCAN_REQ_SSID_SPECIFIED;
2157                     COPY_SSID(prScanReqMsg->aucSSID,
2158                             prScanReqMsg->ucSSIDLength,
2159                             prAisFsmInfo->aucScanSSID,
2160                             prAisFsmInfo->ucScanSSIDLen);
2161                 }
2162             }
2163             else {
2164                 /* Scan for determined SSID */
2165                 prScanReqMsg->ucSSIDType        = SCAN_REQ_SSID_SPECIFIED;
2166                 COPY_SSID(prScanReqMsg->aucSSID,
2167                         prScanReqMsg->ucSSIDLength,
2168                         prConnSettings->aucSSID,
2169                         prConnSettings->ucSSIDLen);
2170             }
2171
2172             /* check if tethering is running and need to fix on specific channel */
2173             if(cnmAisInfraChannelFixed(prAdapter, &eBand, &ucChannel) == TRUE) {
2174                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_SPECIFIED;
2175                 prScanReqMsg->ucChannelListNum  = 1;
2176                 prScanReqMsg->arChnlInfoList[0].eBand
2177                     = eBand;;
2178                 prScanReqMsg->arChnlInfoList[0].ucChannelNum
2179                     = ucChannel;
2180             }
2181             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_NULL) {
2182                 if(prAdapter->fgEnable5GBand == TRUE) {
2183                     prScanReqMsg->eScanChannel      = SCAN_CHANNEL_FULL;
2184                 }
2185                 else {
2186                     prScanReqMsg->eScanChannel      = SCAN_CHANNEL_2G4;
2187                 }
2188             }
2189             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_2G4) {
2190                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_2G4;
2191             }
2192             else if(prAdapter->aePreferBand[NETWORK_TYPE_AIS_INDEX] == BAND_5G) {
2193                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_5G;
2194             }
2195             else {
2196                 prScanReqMsg->eScanChannel      = SCAN_CHANNEL_FULL;
2197                 ASSERT(0);
2198             }
2199
2200             if(prAisFsmInfo->u4ScanIELength > 0) {
2201                 kalMemCopy(prScanReqMsg->aucIE, prAisFsmInfo->aucScanIEBuf, prAisFsmInfo->u4ScanIELength);
2202             }
2203             else {
2204 #if CFG_SUPPORT_WPS2
2205                 if(prAdapter->prGlueInfo->u2WSCIELen > 0) {
2206                             kalMemCopy(prScanReqMsg->aucIE, &prAdapter->prGlueInfo->aucWSCIE, prAdapter->prGlueInfo->u2WSCIELen);
2207                 }
2208             }
2209 #endif
2210
2211             prScanReqMsg->u2IELen = u2ScanIELen;
2212
2213             mboxSendMsg(prAdapter,
2214                     MBOX_ID_0,
2215                     (P_MSG_HDR_T) prScanReqMsg,
2216                     MSG_SEND_METHOD_BUF);
2217
2218             prAisFsmInfo->fgTryScan = FALSE; /* Will enable background sleep for infrastructure */
2219
2220             break;
2221
2222         case AIS_STATE_REQ_CHANNEL_JOIN:
2223             /* send message to CNM for acquiring channel */
2224             prMsgChReq = (P_MSG_CH_REQ_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
2225             if (!prMsgChReq) {
2226                 ASSERT(0); // Can't indicate CNM for channel acquiring
2227                 return;
2228             }
2229
2230             prMsgChReq->rMsgHdr.eMsgId      = MID_MNY_CNM_CH_REQ;
2231             prMsgChReq->ucNetTypeIndex      = NETWORK_TYPE_AIS_INDEX;
2232             prMsgChReq->ucTokenID           = ++prAisFsmInfo->ucSeqNumOfChReq;
2233             prMsgChReq->eReqType            = CH_REQ_TYPE_JOIN;
2234             prMsgChReq->u4MaxInterval       = AIS_JOIN_CH_REQUEST_INTERVAL;
2235             prMsgChReq->ucPrimaryChannel    = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
2236             prMsgChReq->eRfSco              = prAisFsmInfo->prTargetBssDesc->eSco;
2237             prMsgChReq->eRfBand             = prAisFsmInfo->prTargetBssDesc->eBand;
2238             COPY_MAC_ADDR(prMsgChReq->aucBSSID, prAisFsmInfo->prTargetBssDesc->aucBSSID);
2239
2240             mboxSendMsg(prAdapter,
2241                     MBOX_ID_0,
2242                     (P_MSG_HDR_T) prMsgChReq,
2243                     MSG_SEND_METHOD_BUF);
2244
2245             prAisFsmInfo->fgIsChannelRequested = TRUE;
2246             break;
2247
2248         case AIS_STATE_JOIN:
2249             aisFsmStateInit_JOIN(prAdapter, prAisFsmInfo->prTargetBssDesc);
2250             break;
2251
2252 #if CFG_SUPPORT_ADHOC
2253         case AIS_STATE_IBSS_ALONE:
2254             aisFsmStateInit_IBSS_ALONE(prAdapter);
2255             break;
2256
2257         case AIS_STATE_IBSS_MERGE:
2258             aisFsmStateInit_IBSS_MERGE(prAdapter, prAisFsmInfo->prTargetBssDesc);
2259             break;
2260 #endif /* CFG_SUPPORT_ADHOC */
2261
2262         case AIS_STATE_NORMAL_TR:
2263             if(prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
2264                 /* Don't do anything when rJoinTimeoutTimer is still ticking */
2265             }
2266             else {
2267                 /* 1. Process for pending scan */
2268                 if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
2269                     wlanClearScanningResult(prAdapter);
2270                     eNextState = AIS_STATE_ONLINE_SCAN;
2271                     fgIsTransition = TRUE;
2272                 }
2273                 /* 2. Process for pending roaming scan */
2274                 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE) == TRUE) {
2275                     eNextState = AIS_STATE_LOOKING_FOR;
2276                     fgIsTransition = TRUE;
2277                 }
2278                 /* 3. Process for pending roaming scan */
2279                 else if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE) == TRUE) {
2280                     eNextState = AIS_STATE_SEARCH;
2281                     fgIsTransition = TRUE;
2282                 }
2283             }
2284
2285             break;
2286
2287         case AIS_STATE_DISCONNECTING:
2288             /* send for deauth frame for disconnection */
2289             authSendDeauthFrame(prAdapter,
2290                     prAisBssInfo->prStaRecOfAP,
2291                     (P_SW_RFB_T)NULL,
2292                     REASON_CODE_DEAUTH_LEAVING_BSS,
2293                     aisDeauthXmitComplete);
2294             break;
2295
2296         default:
2297             ASSERT(0); /* Make sure we have handle all STATEs */
2298             break;
2299
2300         }
2301     }
2302     while (fgIsTransition);
2303
2304     return;
2305
2306 } /* end of aisFsmSteps() */
2307
2308
2309 /*----------------------------------------------------------------------------*/
2310 /*!
2311 * \brief
2312 *
2313 * \param[in]
2314 *
2315 * \return none
2316 */
2317 /*----------------------------------------------------------------------------*/
2318 VOID
2319 aisFsmRunEventScanDone (
2320     IN P_ADAPTER_T prAdapter,
2321     IN P_MSG_HDR_T prMsgHdr
2322     )
2323 {
2324     P_MSG_SCN_SCAN_DONE prScanDoneMsg;
2325     P_AIS_FSM_INFO_T prAisFsmInfo;
2326     ENUM_AIS_STATE_T eNextState;
2327     UINT_8 ucSeqNumOfCompMsg;
2328     P_CONNECTION_SETTINGS_T prConnSettings;
2329
2330     DEBUGFUNC("aisFsmRunEventScanDone()");
2331
2332     ASSERT(prAdapter);
2333     ASSERT(prMsgHdr);
2334
2335     DBGLOG(AIS, LOUD, ("EVENT-SCAN DONE: Current Time = %ld\n", kalGetTimeTick()));
2336
2337     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2338     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2339
2340     prScanDoneMsg = (P_MSG_SCN_SCAN_DONE)prMsgHdr;
2341     ASSERT(prScanDoneMsg->ucNetTypeIndex == (UINT_8)NETWORK_TYPE_AIS_INDEX);
2342
2343     ucSeqNumOfCompMsg = prScanDoneMsg->ucSeqNum;
2344     cnmMemFree(prAdapter, prMsgHdr);
2345
2346     eNextState = prAisFsmInfo->eCurrentState;
2347
2348     if (ucSeqNumOfCompMsg != prAisFsmInfo->ucSeqNumOfScanReq) {
2349         DBGLOG(AIS, WARN, ("SEQ NO of AIS SCN DONE MSG is not matched.\n"));
2350     }
2351     else {
2352         switch (prAisFsmInfo->eCurrentState) {
2353         case AIS_STATE_SCAN:
2354             prConnSettings->fgIsScanReqIssued = FALSE;
2355
2356             /* reset scan IE buffer */
2357             prAisFsmInfo->u4ScanIELength = 0;
2358
2359             kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2360             eNextState = AIS_STATE_IDLE;
2361
2362             break;
2363
2364         case AIS_STATE_ONLINE_SCAN:
2365             prConnSettings->fgIsScanReqIssued = FALSE;
2366
2367             /* reset scan IE buffer */
2368             prAisFsmInfo->u4ScanIELength = 0;
2369
2370             kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
2371 #if CFG_SUPPORT_ROAMING
2372             eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2373 #else
2374             eNextState = AIS_STATE_NORMAL_TR;
2375 #endif /* CFG_SUPPORT_ROAMING */
2376
2377             break;
2378
2379         case AIS_STATE_LOOKING_FOR:
2380 #if CFG_SUPPORT_ROAMING
2381             eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
2382 #else
2383             eNextState = AIS_STATE_SEARCH;
2384 #endif /* CFG_SUPPORT_ROAMING */
2385             break;
2386
2387         default:
2388             break;
2389
2390         }
2391     }
2392
2393     if (eNextState != prAisFsmInfo->eCurrentState) {
2394         aisFsmSteps(prAdapter, eNextState);
2395     }
2396
2397     return;
2398 } /* end of aisFsmRunEventScanDone() */
2399
2400
2401 /*----------------------------------------------------------------------------*/
2402 /*!
2403 * \brief
2404 *
2405 * \param[in]
2406 *
2407 * \return none
2408 */
2409 /*----------------------------------------------------------------------------*/
2410 VOID
2411 aisFsmRunEventAbort (
2412     IN P_ADAPTER_T prAdapter,
2413     IN P_MSG_HDR_T prMsgHdr
2414     )
2415 {
2416     P_MSG_AIS_ABORT_T prAisAbortMsg;
2417     P_AIS_FSM_INFO_T prAisFsmInfo;
2418     UINT_8 ucReasonOfDisconnect;
2419     BOOLEAN fgDelayIndication;
2420     P_CONNECTION_SETTINGS_T prConnSettings;
2421
2422     DEBUGFUNC("aisFsmRunEventAbort()");
2423
2424     ASSERT(prAdapter);
2425     ASSERT(prMsgHdr);
2426     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2427     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2428
2429     //4 <1> Extract information of Abort Message and then free memory.
2430     prAisAbortMsg = (P_MSG_AIS_ABORT_T)prMsgHdr;
2431     ucReasonOfDisconnect = prAisAbortMsg->ucReasonOfDisconnect;
2432     fgDelayIndication = prAisAbortMsg->fgDelayIndication;
2433
2434     cnmMemFree(prAdapter, prMsgHdr);
2435
2436 #if DBG
2437     DBGLOG(AIS, LOUD, ("EVENT-ABORT: Current State %s\n",
2438         apucDebugAisState[prAisFsmInfo->eCurrentState]));
2439 #else
2440     DBGLOG(AIS, LOUD, ("[%d] EVENT-ABORT: Current State [%d]\n",
2441         DBG_AIS_IDX,
2442             prAisFsmInfo->eCurrentState));
2443 #endif
2444
2445     //4 <2> clear previous pending connection request and insert new one
2446     if(ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DEAUTHENTICATED 
2447             || ucReasonOfDisconnect == DISCONNECT_REASON_CODE_DISASSOCIATED) {
2448         prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
2449     }
2450     else {
2451         prConnSettings->fgIsDisconnectedByNonRequest = FALSE;
2452     }
2453
2454     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
2455     aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
2456
2457     if(prAisFsmInfo->eCurrentState != AIS_STATE_DISCONNECTING) {
2458         //4 <3> invoke abort handler
2459         aisFsmStateAbort(prAdapter, ucReasonOfDisconnect, fgDelayIndication);
2460     }
2461
2462     return;
2463 } /* end of aisFsmRunEventAbort() */
2464
2465
2466 /*----------------------------------------------------------------------------*/
2467 /*!
2468 * \brief        This function handles AIS-FSM abort event/command
2469 *
2470 * \param[in] prAdapter              Pointer of ADAPTER_T
2471 *            ucReasonOfDisconnect   Reason for disonnection
2472 *            fgDelayIndication      Option to delay disconnection indication
2473 *
2474 * \return none
2475 */
2476 /*----------------------------------------------------------------------------*/
2477 VOID
2478 aisFsmStateAbort (
2479     IN P_ADAPTER_T prAdapter,
2480     UINT_8         ucReasonOfDisconnect,
2481     BOOLEAN        fgDelayIndication
2482     )
2483 {
2484     P_AIS_FSM_INFO_T prAisFsmInfo;
2485     P_BSS_INFO_T prAisBssInfo;
2486     P_CONNECTION_SETTINGS_T prConnSettings;
2487     BOOLEAN fgIsCheckConnected;
2488
2489     ASSERT(prAdapter);
2490
2491     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2492     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2493     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
2494     fgIsCheckConnected = FALSE;
2495
2496     //4 <1> Save information of Abort Message and then free memory.
2497     prAisBssInfo->ucReasonOfDisconnect = ucReasonOfDisconnect;
2498
2499     //4 <2> Abort current job.
2500     switch (prAisFsmInfo->eCurrentState) {
2501     case AIS_STATE_IDLE:
2502     case AIS_STATE_SEARCH:
2503         break;
2504
2505     case AIS_STATE_WAIT_FOR_NEXT_SCAN:
2506         /* Do cancel timer */
2507         cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rBGScanTimer);
2508
2509         /* in case roaming is triggered */
2510         fgIsCheckConnected = TRUE;
2511         break;
2512
2513     case AIS_STATE_SCAN:
2514         /* Do abort SCAN */
2515         aisFsmStateAbort_SCAN(prAdapter);
2516
2517         /* queue for later handling */
2518         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2519             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2520         }
2521
2522         break;
2523
2524     case AIS_STATE_LOOKING_FOR:
2525           /* Do abort SCAN */
2526         aisFsmStateAbort_SCAN(prAdapter);
2527
2528         /* in case roaming is triggered */
2529         fgIsCheckConnected = TRUE;
2530         break;
2531
2532     case AIS_STATE_REQ_CHANNEL_JOIN:
2533         /* Release channel to CNM */
2534         aisFsmReleaseCh(prAdapter);
2535
2536         /* in case roaming is triggered */
2537         fgIsCheckConnected = TRUE;
2538         break;
2539
2540     case AIS_STATE_JOIN:
2541         /* Do abort JOIN */
2542         aisFsmStateAbort_JOIN(prAdapter);
2543
2544         /* in case roaming is triggered */
2545         fgIsCheckConnected = TRUE;
2546         break;
2547
2548 #if CFG_SUPPORT_ADHOC
2549     case AIS_STATE_IBSS_ALONE:
2550     case AIS_STATE_IBSS_MERGE:
2551         aisFsmStateAbort_IBSS(prAdapter);
2552         break;
2553 #endif /* CFG_SUPPORT_ADHOC */
2554
2555     case AIS_STATE_ONLINE_SCAN:
2556         /* Do abort SCAN */
2557         aisFsmStateAbort_SCAN(prAdapter);
2558
2559         /* queue for later handling */
2560         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, FALSE) == FALSE) {
2561             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
2562         }
2563
2564         fgIsCheckConnected = TRUE;
2565         break;
2566
2567     case AIS_STATE_NORMAL_TR:
2568         fgIsCheckConnected = TRUE;
2569         break;
2570
2571     case AIS_STATE_DISCONNECTING:
2572         /* Do abort NORMAL_TR */
2573         aisFsmStateAbort_NORMAL_TR(prAdapter);
2574
2575         break;
2576
2577     default:
2578         break;
2579     }
2580
2581     if (fgIsCheckConnected &&
2582        (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState)) {
2583
2584         /* switch into DISCONNECTING state for sending DEAUTH if necessary */
2585         if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
2586                 prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_NEW_CONNECTION &&
2587                 prAisBssInfo->prStaRecOfAP &&
2588                 prAisBssInfo->prStaRecOfAP->fgIsInUse) {
2589             aisFsmSteps(prAdapter, AIS_STATE_DISCONNECTING);
2590
2591             return;
2592         }
2593         else {
2594             /* Do abort NORMAL_TR */
2595             aisFsmStateAbort_NORMAL_TR(prAdapter);
2596         }
2597     }
2598
2599     aisFsmDisconnect(prAdapter, fgDelayIndication);
2600
2601     return;
2602
2603 } /* end of aisFsmStateAbort() */
2604
2605
2606 /*----------------------------------------------------------------------------*/
2607 /*!
2608 * @brief This function will handle the Join Complete Event from SAA FSM for AIS FSM
2609 *
2610 * @param[in] prMsgHdr   Message of Join Complete of SAA FSM.
2611 *
2612 * @return (none)
2613 */
2614 /*----------------------------------------------------------------------------*/
2615 VOID
2616 aisFsmRunEventJoinComplete (
2617     IN P_ADAPTER_T prAdapter,
2618     IN P_MSG_HDR_T prMsgHdr
2619     )
2620 {
2621     P_MSG_JOIN_COMP_T prJoinCompMsg;
2622     P_AIS_FSM_INFO_T prAisFsmInfo;
2623     ENUM_AIS_STATE_T eNextState;
2624     P_STA_RECORD_T prStaRec;
2625     P_SW_RFB_T prAssocRspSwRfb;
2626
2627     DEBUGFUNC("aisFsmRunEventJoinComplete()");
2628
2629     ASSERT(prMsgHdr);
2630
2631     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2632     prJoinCompMsg = (P_MSG_JOIN_COMP_T)prMsgHdr;
2633     prStaRec = prJoinCompMsg->prStaRec;
2634     prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
2635
2636     eNextState = prAisFsmInfo->eCurrentState;
2637
2638     // Check State and SEQ NUM
2639     if (prAisFsmInfo->eCurrentState == AIS_STATE_JOIN) {
2640         P_BSS_INFO_T prAisBssInfo;
2641
2642         prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2643
2644         // Check SEQ NUM
2645         if (prJoinCompMsg->ucSeqNum == prAisFsmInfo->ucSeqNumOfReqMsg) {
2646
2647
2648             //4 <1> JOIN was successful
2649             if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
2650
2651                 //1. Reset retry count
2652                 prAisFsmInfo->ucConnTrialCount = 0;
2653
2654                 // Completion of roaming
2655                 if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2656
2657 #if CFG_SUPPORT_ROAMING
2658                     //2. Deactivate previous BSS
2659                     aisFsmRoamingDisconnectPrevAP(prAdapter, prStaRec);
2660
2661                     //3. Update bss based on roaming staRec
2662                     aisUpdateBssInfoForRoamingAP(prAdapter, prStaRec, prAssocRspSwRfb);
2663 #endif /* CFG_SUPPORT_ROAMING */
2664                 }
2665                 else {
2666                     //4 <1.1> Change FW's Media State immediately.
2667                     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2668
2669                     //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
2670                     if ((prAisBssInfo->prStaRecOfAP) &&
2671                         (prAisBssInfo->prStaRecOfAP != prStaRec) &&
2672                         (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
2673
2674                         cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
2675                     }
2676
2677                     //4 <1.3> Update BSS_INFO_T
2678                     aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
2679
2680                     //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
2681                     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2682
2683                     //4 <1.5> Update RSSI if necessary
2684                     nicUpdateRSSI(prAdapter, NETWORK_TYPE_AIS_INDEX, (INT_8)(RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
2685
2686                     //4 <1.6> Indicate Connected Event to Host immediately.
2687                     /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
2688                     aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2689                 }
2690
2691 #if CFG_SUPPORT_ROAMING
2692                 roamingFsmRunEventStart(prAdapter);
2693 #endif /* CFG_SUPPORT_ROAMING */
2694
2695                 //4 <1.7> Set the Next State of AIS FSM
2696                 eNextState = AIS_STATE_NORMAL_TR;
2697             }
2698             //4 <2> JOIN was not successful
2699             else {
2700                 //4 <2.1> Redo JOIN process with other Auth Type if possible
2701                 if (aisFsmStateInit_RetryJOIN(prAdapter, prStaRec) == FALSE) {
2702                     P_BSS_DESC_T prBssDesc;
2703
2704                     /* 1. Increase Failure Count */
2705                     prStaRec->ucJoinFailureCount++;
2706
2707                     /* 2. release channel */
2708                     aisFsmReleaseCh(prAdapter);
2709
2710                     /* 3.1 stop join timeout timer */
2711                     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rJoinTimeoutTimer);
2712
2713                     /* 3.2 reset local variable */
2714                     prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
2715
2716                     prBssDesc = scanSearchBssDescByBssid(prAdapter, prStaRec->aucMacAddr);
2717
2718                     ASSERT(prBssDesc);
2719                     ASSERT(prBssDesc->fgIsConnecting);
2720
2721                     if(prBssDesc) {
2722                         prBssDesc->fgIsConnecting = FALSE;
2723                     }
2724
2725                     /* 3.3 Free STA-REC */
2726                     if(prStaRec != prAisBssInfo->prStaRecOfAP) {
2727                         cnmStaRecFree(prAdapter, prStaRec, FALSE);
2728                     }
2729
2730                     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
2731 #if CFG_SUPPORT_ROAMING
2732                         eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
2733 #endif /* CFG_SUPPORT_ROAMING */
2734                         }
2735                     else {
2736                         // abort connection trial
2737                         prAdapter->rWifiVar.rConnSettings.fgIsConnReqIssued = FALSE;
2738
2739                         kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
2740                                  WLAN_STATUS_CONNECT_INDICATION,
2741                                  NULL,
2742                                  0);
2743                       
2744                         eNextState = AIS_STATE_IDLE;
2745                     }
2746                 }
2747             }
2748         }
2749 #if DBG
2750         else {
2751             DBGLOG(AIS, WARN, ("SEQ NO of AIS JOIN COMP MSG is not matched.\n"));
2752         }
2753 #endif /* DBG */
2754
2755     }
2756
2757     if (eNextState != prAisFsmInfo->eCurrentState) {
2758         aisFsmSteps(prAdapter, eNextState);
2759     }
2760
2761     if (prAssocRspSwRfb) {
2762         nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
2763     }
2764
2765     cnmMemFree(prAdapter, prMsgHdr);
2766
2767     return;
2768 } /* end of aisFsmRunEventJoinComplete() */
2769
2770
2771 #if CFG_SUPPORT_ADHOC
2772 /*----------------------------------------------------------------------------*/
2773 /*!
2774 * @brief This function will handle the Grant Msg of IBSS Create which was sent by
2775 *        CNM to indicate that channel was changed for creating IBSS.
2776 *
2777 * @param[in] prAdapter  Pointer of ADAPTER_T
2778 *
2779 * @return (none)
2780 */
2781 /*----------------------------------------------------------------------------*/
2782 VOID
2783 aisFsmCreateIBSS (
2784     IN P_ADAPTER_T prAdapter
2785     )
2786 {
2787     P_AIS_FSM_INFO_T prAisFsmInfo;
2788
2789     ASSERT(prAdapter);
2790
2791     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2792
2793     do {
2794         // Check State
2795         if (prAisFsmInfo->eCurrentState == AIS_STATE_IBSS_ALONE) {
2796             aisUpdateBssInfoForCreateIBSS(prAdapter);
2797         }
2798     }
2799     while (FALSE);
2800
2801     return;
2802 } /* end of aisFsmCreateIBSS() */
2803
2804
2805 /*----------------------------------------------------------------------------*/
2806 /*!
2807 * @brief This function will handle the Grant Msg of IBSS Merge which was sent by
2808 *        CNM to indicate that channel was changed for merging IBSS.
2809 *
2810 * @param[in] prAdapter  Pointer of ADAPTER_T
2811 * @param[in] prStaRec   Pointer of STA_RECORD_T for merge
2812 *
2813 * @return (none)
2814 */
2815 /*----------------------------------------------------------------------------*/
2816 VOID
2817 aisFsmMergeIBSS (
2818     IN P_ADAPTER_T      prAdapter,
2819     IN P_STA_RECORD_T   prStaRec
2820     )
2821 {
2822     P_AIS_FSM_INFO_T prAisFsmInfo;
2823     ENUM_AIS_STATE_T eNextState;
2824     P_BSS_INFO_T prAisBssInfo;
2825
2826     ASSERT(prAdapter);
2827     ASSERT(prStaRec);
2828
2829     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2830     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2831
2832     do {
2833
2834         eNextState = prAisFsmInfo->eCurrentState;
2835
2836         switch (prAisFsmInfo->eCurrentState) {
2837         case AIS_STATE_IBSS_MERGE:
2838         {
2839             P_BSS_DESC_T prBssDesc;
2840
2841             //4 <1.1> Change FW's Media State immediately.
2842             aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2843
2844             //4 <1.2> Deactivate previous Peers' STA_RECORD_T in Driver if have.
2845             bssClearClientList(prAdapter, prAisBssInfo);
2846
2847             //4 <1.3> Unmark connection flag of previous BSS_DESC_T.
2848             if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2849                 prBssDesc->fgIsConnecting = FALSE;
2850                 prBssDesc->fgIsConnected = FALSE;
2851             }
2852
2853             //4 <1.4> Update BSS_INFO_T
2854             aisUpdateBssInfoForMergeIBSS(prAdapter, prStaRec);
2855
2856             //4 <1.5> Add Peers' STA_RECORD_T to Client List
2857             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2858
2859             //4 <1.6> Activate current Peer's STA_RECORD_T in Driver.
2860             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2861             prStaRec->fgIsMerging = FALSE;
2862
2863             //4 <1.7> Enable other features
2864
2865             //4 <1.8> Indicate Connected Event to Host immediately.
2866             aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2867
2868             //4 <1.9> Set the Next State of AIS FSM
2869             eNextState = AIS_STATE_NORMAL_TR;
2870
2871             //4 <1.10> Release channel privilege
2872             aisFsmReleaseCh(prAdapter);
2873
2874 #if CFG_SLT_SUPPORT
2875             prAdapter->rWifiVar.rSltInfo.prPseudoStaRec = prStaRec;
2876 #endif
2877         }
2878         break;
2879
2880         default:
2881             break;
2882         }
2883
2884         if (eNextState != prAisFsmInfo->eCurrentState) {
2885             aisFsmSteps(prAdapter, eNextState);
2886         }
2887
2888     }
2889     while (FALSE);
2890
2891     return;
2892 } /* end of aisFsmMergeIBSS() */
2893
2894
2895 /*----------------------------------------------------------------------------*/
2896 /*!
2897 * @brief This function will handle the Notification of existing IBSS was found
2898 *        from SCN.
2899 *
2900 * @param[in] prMsgHdr   Message of Notification of an IBSS was present.
2901 *
2902 * @return (none)
2903 */
2904 /*----------------------------------------------------------------------------*/
2905 VOID
2906 aisFsmRunEventFoundIBSSPeer (
2907     IN P_ADAPTER_T prAdapter,
2908     IN P_MSG_HDR_T prMsgHdr
2909     )
2910 {
2911     P_MSG_AIS_IBSS_PEER_FOUND_T prAisIbssPeerFoundMsg;
2912     P_AIS_FSM_INFO_T prAisFsmInfo;
2913     ENUM_AIS_STATE_T eNextState;
2914     P_STA_RECORD_T prStaRec;
2915     P_BSS_INFO_T prAisBssInfo;
2916     P_BSS_DESC_T prBssDesc;
2917     BOOLEAN fgIsMergeIn;
2918
2919
2920     ASSERT(prMsgHdr);
2921
2922     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
2923     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
2924
2925     prAisIbssPeerFoundMsg = (P_MSG_AIS_IBSS_PEER_FOUND_T)prMsgHdr;
2926
2927     ASSERT(prAisIbssPeerFoundMsg->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX);
2928
2929     prStaRec = prAisIbssPeerFoundMsg->prStaRec;
2930     ASSERT(prStaRec);
2931
2932     fgIsMergeIn = prAisIbssPeerFoundMsg->fgIsMergeIn;
2933
2934     cnmMemFree(prAdapter, prMsgHdr);
2935
2936
2937     eNextState = prAisFsmInfo->eCurrentState;
2938     switch (prAisFsmInfo->eCurrentState) {
2939     case AIS_STATE_IBSS_ALONE:
2940     {
2941         //4 <1> An IBSS Peer 'merged in'.
2942         if (fgIsMergeIn) {
2943
2944             //4 <1.1> Change FW's Media State immediately.
2945             aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
2946
2947             //4 <1.2> Add Peers' STA_RECORD_T to Client List
2948             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
2949
2950 #if CFG_SLT_SUPPORT
2951             //4 <1.3> Mark connection flag of BSS_DESC_T.
2952             if ((prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr)) != NULL) {
2953                 prBssDesc->fgIsConnecting = FALSE;
2954                 prBssDesc->fgIsConnected = TRUE;
2955             }
2956             else {
2957                 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2958             }
2959
2960             //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2961             prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
2962 #else
2963             //4 <1.3> Mark connection flag of BSS_DESC_T.
2964             if ((prBssDesc = scanSearchBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID)) != NULL) {
2965                 prBssDesc->fgIsConnecting = FALSE;
2966                 prBssDesc->fgIsConnected = TRUE;
2967             }
2968             else {
2969                 ASSERT(0); // Should be able to find a BSS_DESC_T here.
2970             }
2971
2972
2973             //4 <1.4> Activate current Peer's STA_RECORD_T in Driver.
2974             prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
2975
2976 #endif
2977
2978             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
2979             prStaRec->fgIsMerging = FALSE;
2980
2981             //4 <1.6> sync. to firmware
2982             nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
2983
2984             //4 <1.7> Indicate Connected Event to Host immediately.
2985             aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
2986
2987             //4 <1.8> indicate PM for connected
2988             nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
2989
2990             //4 <1.9> Set the Next State of AIS FSM
2991             eNextState = AIS_STATE_NORMAL_TR;
2992
2993             //4 <1.10> Release channel privilege
2994             aisFsmReleaseCh(prAdapter);
2995         }
2996         //4 <2> We need 'merge out' to this IBSS
2997         else {
2998
2999             //4 <2.1> Get corresponding BSS_DESC_T
3000             prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3001
3002             prAisFsmInfo->prTargetBssDesc = prBssDesc;
3003
3004             //4 <2.2> Set the Next State of AIS FSM
3005             eNextState = AIS_STATE_IBSS_MERGE;
3006         }
3007     }
3008         break;
3009
3010     case AIS_STATE_NORMAL_TR:
3011     {
3012
3013         //4 <3> An IBSS Peer 'merged in'.
3014         if (fgIsMergeIn) {
3015
3016             //4 <3.1> Add Peers' STA_RECORD_T to Client List
3017             bssAddStaRecToClientList(prAdapter, prAisBssInfo, prStaRec);
3018
3019 #if CFG_SLT_SUPPORT
3020             //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3021             prStaRec->fgIsQoS = TRUE; /* TODO(Kevin): TBD */
3022 #else
3023             //4 <3.2> Activate current Peer's STA_RECORD_T in Driver.
3024             prStaRec->fgIsQoS = FALSE; /* TODO(Kevin): TBD */
3025 #endif
3026
3027             cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
3028             prStaRec->fgIsMerging = FALSE;
3029
3030         }
3031         //4 <4> We need 'merge out' to this IBSS
3032         else {
3033
3034             //4 <4.1> Get corresponding BSS_DESC_T
3035             prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3036
3037             prAisFsmInfo->prTargetBssDesc = prBssDesc;
3038
3039             //4 <4.2> Set the Next State of AIS FSM
3040             eNextState = AIS_STATE_IBSS_MERGE;
3041
3042         }
3043     }
3044         break;
3045
3046     default:
3047         break;
3048     }
3049
3050     if (eNextState != prAisFsmInfo->eCurrentState) {
3051         aisFsmSteps(prAdapter, eNextState);
3052     }
3053
3054     return;
3055 } /* end of aisFsmRunEventFoundIBSSPeer() */
3056 #endif /* CFG_SUPPORT_ADHOC */
3057
3058
3059 /*----------------------------------------------------------------------------*/
3060 /*!
3061 * @brief This function will indicate the Media State to HOST
3062 *
3063 * @param[in] eConnectionState   Current Media State
3064 * @param[in] fgDelayIndication  Set TRUE for postponing the Disconnect Indication.
3065 *
3066 * @return (none)
3067 */
3068 /*----------------------------------------------------------------------------*/
3069 VOID
3070 aisIndicationOfMediaStateToHost (
3071     IN P_ADAPTER_T prAdapter,
3072     ENUM_PARAM_MEDIA_STATE_T eConnectionState,
3073     BOOLEAN fgDelayIndication
3074     )
3075 {
3076     EVENT_CONNECTION_STATUS rEventConnStatus;
3077     P_CONNECTION_SETTINGS_T prConnSettings;
3078     P_BSS_INFO_T prAisBssInfo;
3079     P_AIS_FSM_INFO_T prAisFsmInfo;
3080
3081     DEBUGFUNC("aisIndicationOfMediaStateToHost()");
3082
3083     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3084     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3085     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3086
3087     // NOTE(Kevin): Move following line to aisChangeMediaState() macro per CM's request.
3088     //prAisBssInfo->eConnectionState = eConnectionState;
3089
3090     /* For indicating the Disconnect Event only if current media state is
3091      * disconnected and we didn't do indication yet.
3092      */
3093     if (prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
3094         if (prAisBssInfo->eConnectionStateIndicated == eConnectionState) {
3095             return;
3096         }
3097     }
3098
3099     if (!fgDelayIndication) {
3100         //4 <0> Cancel Delay Timer
3101         cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIndicationOfDisconnectTimer);
3102
3103         //4 <1> Fill EVENT_CONNECTION_STATUS
3104         rEventConnStatus.ucMediaStatus = (UINT_8)eConnectionState;
3105
3106         if (eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
3107             rEventConnStatus.ucReasonOfDisconnect = DISCONNECT_REASON_CODE_RESERVED;
3108
3109             if (prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
3110                 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_INFRA;
3111                 rEventConnStatus.u2AID = prAisBssInfo->u2AssocId;
3112                 rEventConnStatus.u2ATIMWindow = 0;
3113             }
3114             else if (prAisBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3115                 rEventConnStatus.ucInfraMode = (UINT_8)NET_TYPE_IBSS;
3116                 rEventConnStatus.u2AID = 0;
3117                 rEventConnStatus.u2ATIMWindow = prAisBssInfo->u2ATIMWindow;
3118             }
3119             else {
3120                 ASSERT(0);
3121             }
3122
3123             COPY_SSID(rEventConnStatus.aucSsid,
3124                       rEventConnStatus.ucSsidLen,
3125                       prConnSettings->aucSSID,
3126                       prConnSettings->ucSSIDLen);
3127
3128             COPY_MAC_ADDR(rEventConnStatus.aucBssid, prAisBssInfo->aucBSSID);
3129
3130             rEventConnStatus.u2BeaconPeriod = prAisBssInfo->u2BeaconInterval;
3131             rEventConnStatus.u4FreqInKHz = nicChannelNum2Freq(prAisBssInfo->ucPrimaryChannel);
3132
3133             switch (prAisBssInfo->ucNonHTBasicPhyType) {
3134             case PHY_TYPE_HR_DSSS_INDEX:
3135                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3136                 break;
3137
3138             case PHY_TYPE_ERP_INDEX:
3139                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM24;
3140                 break;
3141
3142             case PHY_TYPE_OFDM_INDEX:
3143                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_OFDM5;
3144                 break;
3145
3146             default:
3147                 ASSERT(0);
3148                 rEventConnStatus.ucNetworkType = (UINT_8)PARAM_NETWORK_TYPE_DS;
3149                 break;
3150             }
3151         }
3152         else {
3153             /* Deactivate previous Peers' STA_RECORD_T in Driver if have. */
3154             bssClearClientList(prAdapter, prAisBssInfo);
3155
3156             #if CFG_PRIVACY_MIGRATION
3157             /* Clear the pmkid cache while media disconnect */
3158             secClearPmkid(prAdapter);
3159             #endif
3160
3161             rEventConnStatus.ucReasonOfDisconnect = prAisBssInfo->ucReasonOfDisconnect;
3162         }
3163
3164         //4 <2> Indication
3165         nicMediaStateChange(prAdapter, NETWORK_TYPE_AIS_INDEX, &rEventConnStatus);
3166         prAisBssInfo->eConnectionStateIndicated = eConnectionState;
3167     }
3168     else {
3169         /* NOTE: Only delay the Indication of Disconnect Event */
3170         ASSERT(eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED);
3171
3172         DBGLOG(AIS, INFO, ("Postpone the indication of Disconnect for %d seconds\n",
3173             prConnSettings->ucDelayTimeOfDisconnectEvent));
3174
3175         cnmTimerStartTimer(prAdapter,
3176                 &prAisFsmInfo->rIndicationOfDisconnectTimer,
3177                 SEC_TO_MSEC(prConnSettings->ucDelayTimeOfDisconnectEvent));
3178     }
3179
3180     return;
3181 } /* end of aisIndicationOfMediaStateToHost() */
3182
3183
3184 /*----------------------------------------------------------------------------*/
3185 /*!
3186 * @brief This function will indicate an Event of "Media Disconnect" to HOST
3187 *
3188 * @param[in] u4Param  Unused timer parameter
3189 *
3190 * @return (none)
3191 */
3192 /*----------------------------------------------------------------------------*/
3193 VOID
3194 aisPostponedEventOfDisconnTimeout (
3195     IN P_ADAPTER_T prAdapter,
3196     UINT_32 u4Param
3197     )
3198 {
3199     P_BSS_INFO_T prAisBssInfo;
3200     P_CONNECTION_SETTINGS_T prConnSettings;
3201
3202     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3203     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3204
3205     //4 <1> Deactivate previous AP's STA_RECORD_T in Driver if have.
3206     if (prAisBssInfo->prStaRecOfAP) {
3207         //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3208
3209         prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3210     }
3211
3212     //4 <2> Remove pending connection request
3213     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3214     prConnSettings->fgIsDisconnectedByNonRequest = TRUE;
3215
3216     //4 <3> Indicate Disconnected Event to Host immediately.
3217     aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, FALSE);
3218
3219     return;
3220 } /* end of aisPostponedEventOfDisconnTimeout() */
3221
3222
3223 /*----------------------------------------------------------------------------*/
3224 /*!
3225 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3226 *        the association was completed.
3227 *
3228 * @param[in] prStaRec               Pointer to the STA_RECORD_T
3229 * @param[in] prAssocRspSwRfb        Pointer to SW RFB of ASSOC RESP FRAME.
3230 *
3231 * @return (none)
3232 */
3233 /*----------------------------------------------------------------------------*/
3234 VOID
3235 aisUpdateBssInfoForJOIN (
3236     IN P_ADAPTER_T prAdapter,
3237     P_STA_RECORD_T prStaRec,
3238     P_SW_RFB_T prAssocRspSwRfb
3239     )
3240 {
3241     P_AIS_FSM_INFO_T prAisFsmInfo;
3242     P_BSS_INFO_T prAisBssInfo;
3243     P_CONNECTION_SETTINGS_T prConnSettings;
3244     P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame;
3245     P_BSS_DESC_T prBssDesc;
3246     UINT_16 u2IELength;
3247     PUINT_8 pucIE;
3248
3249     DEBUGFUNC("aisUpdateBssInfoForJOIN()");
3250
3251     ASSERT(prStaRec);
3252     ASSERT(prAssocRspSwRfb);
3253
3254     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3255     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3256     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3257     prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
3258
3259
3260     DBGLOG(AIS, INFO, ("Update AIS_BSS_INFO_T and apply settings to MAC\n"));
3261
3262
3263     //3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings
3264     //4 <1.1> Setup Operation Mode
3265     prAisBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
3266
3267     //4 <1.2> Setup SSID
3268     COPY_SSID(prAisBssInfo->aucSSID,
3269               prAisBssInfo->ucSSIDLen,
3270               prConnSettings->aucSSID,
3271               prConnSettings->ucSSIDLen);
3272
3273     //4 <1.3> Setup Channel, Band
3274     prAisBssInfo->ucPrimaryChannel = prAisFsmInfo->prTargetBssDesc->ucChannelNum;
3275     prAisBssInfo->eBand = prAisFsmInfo->prTargetBssDesc->eBand;
3276
3277
3278     //3 <2> Update BSS_INFO_T from STA_RECORD_T
3279     //4 <2.1> Save current AP's STA_RECORD_T and current AID
3280     prAisBssInfo->prStaRecOfAP = prStaRec;
3281     prAisBssInfo->u2AssocId = prStaRec->u2AssocId;
3282
3283     //4 <2.2> Setup Capability
3284     prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
3285
3286     if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3287         prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3288     }
3289     else {
3290         prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3291     }
3292
3293     //4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3294     prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3295
3296     prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3297
3298     prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3299     prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3300
3301
3302     //3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3303     //4 <3.1> Setup BSSID
3304     COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
3305
3306
3307     u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
3308         (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
3309     pucIE = prAssocRspFrame->aucInfoElem;
3310
3311
3312     //4 <3.2> Parse WMM and setup QBSS flag
3313     /* Parse WMM related IEs and configure HW CRs accordingly */
3314     mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3315
3316     prAisBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
3317
3318     //3 <4> Update BSS_INFO_T from BSS_DESC_T
3319     prBssDesc = scanSearchBssDescByBssid(prAdapter, prAssocRspFrame->aucBSSID);
3320     if(prBssDesc) {
3321         prBssDesc->fgIsConnecting = FALSE;
3322         prBssDesc->fgIsConnected = TRUE;
3323
3324         //4 <4.1> Setup MIB for current BSS
3325         prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3326     }
3327     else {
3328         // should never happen
3329         ASSERT(0);
3330     }
3331
3332     /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
3333     prAisBssInfo->ucDTIMPeriod = 0;
3334     prAisBssInfo->u2ATIMWindow = 0;
3335
3336     prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
3337
3338     //4 <4.2> Update HT information and set channel
3339     /* Record HT related parameters in rStaRec and rBssInfo
3340      * Note: it shall be called before nicUpdateBss()
3341      */
3342     rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
3343
3344     //4 <4.3> Sync with firmware for BSS-INFO
3345     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3346
3347     //4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked
3348     //inside scanProcessBeaconAndProbeResp() after 1st beacon is received
3349
3350     return;
3351 } /* end of aisUpdateBssInfoForJOIN() */
3352
3353
3354 #if CFG_SUPPORT_ADHOC
3355 /*----------------------------------------------------------------------------*/
3356 /*!
3357 * @brief This function will create an Ad-Hoc network and start sending Beacon Frames.
3358 *
3359 * @param (none)
3360 *
3361 * @return (none)
3362 */
3363 /*----------------------------------------------------------------------------*/
3364 VOID
3365 aisUpdateBssInfoForCreateIBSS (
3366     IN P_ADAPTER_T prAdapter
3367     )
3368 {
3369     P_AIS_FSM_INFO_T prAisFsmInfo;
3370     P_BSS_INFO_T prAisBssInfo;
3371     P_CONNECTION_SETTINGS_T prConnSettings;
3372
3373     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3374     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3375     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3376
3377     if (prAisBssInfo->fgIsBeaconActivated) {
3378         return;
3379     }
3380
3381     //3 <1> Update BSS_INFO_T per Network Basis
3382     //4 <1.1> Setup Operation Mode
3383     prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3384
3385     //4 <1.2> Setup SSID
3386     COPY_SSID(prAisBssInfo->aucSSID,
3387               prAisBssInfo->ucSSIDLen,
3388               prConnSettings->aucSSID,
3389               prConnSettings->ucSSIDLen);
3390
3391     //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3392     prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3393     prAisBssInfo->u2AssocId = 0;
3394
3395     //4 <1.4> Setup Channel, Band and Phy Attributes
3396     prAisBssInfo->ucPrimaryChannel = prConnSettings->ucAdHocChannelNum;
3397     prAisBssInfo->eBand = prConnSettings->eAdHocBand;
3398
3399     if (prAisBssInfo->eBand == BAND_2G4) {
3400
3401         prAisBssInfo->ucPhyTypeSet =
3402             prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN; /* Depend on eBand */
3403
3404         prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_MIXED_11BG; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3405     }
3406     else {
3407
3408         prAisBssInfo->ucPhyTypeSet =
3409             prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN; /* Depend on eBand */
3410
3411         prAisBssInfo->ucConfigAdHocAPMode = AD_HOC_MODE_11A; /* Depend on eCurrentOPMode and ucPhyTypeSet */
3412     }
3413
3414     //4 <1.5> Setup MIB for current BSS
3415     prAisBssInfo->u2BeaconInterval = prConnSettings->u2BeaconPeriod;
3416     prAisBssInfo->ucDTIMPeriod = 0;
3417     prAisBssInfo->u2ATIMWindow = prConnSettings->u2AtimWindow;
3418
3419     prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3420
3421 #if CFG_PRIVACY_MIGRATION
3422     if (prConnSettings->eEncStatus == ENUM_ENCRYPTION1_ENABLED ||
3423         prConnSettings->eEncStatus == ENUM_ENCRYPTION2_ENABLED ||
3424         prConnSettings->eEncStatus == ENUM_ENCRYPTION3_ENABLED) {
3425         prAisBssInfo->fgIsProtection = TRUE;
3426     }
3427     else {
3428         prAisBssInfo->fgIsProtection = FALSE;
3429     }
3430 #else
3431     prAisBssInfo->fgIsProtection = FALSE;
3432 #endif
3433
3434     //3 <2> Update BSS_INFO_T common part
3435     ibssInitForAdHoc(prAdapter, prAisBssInfo);
3436
3437
3438
3439     //3 <3> Set MAC HW
3440     //4 <3.1> Setup channel and bandwidth
3441     rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3442
3443     //4 <3.2> use command packets to inform firmware
3444     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3445
3446     //4 <3.3> enable beaconing
3447     bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3448
3449     //4 <3.4> Update AdHoc PM parameter
3450     nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_AIS_INDEX);
3451
3452     //3 <4> Set ACTIVE flag.
3453     prAisBssInfo->fgIsBeaconActivated = TRUE;
3454     prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3455
3456     //3 <5> Start IBSS Alone Timer
3457     cnmTimerStartTimer(prAdapter,
3458             &prAisFsmInfo->rIbssAloneTimer,
3459             SEC_TO_MSEC(AIS_IBSS_ALONE_TIMEOUT_SEC));
3460
3461     return;
3462
3463 } /* end of aisCreateIBSS() */
3464
3465
3466 /*----------------------------------------------------------------------------*/
3467 /*!
3468 * @brief This function will update the contain of BSS_INFO_T for AIS network once
3469 *        the existing IBSS was found.
3470 *
3471 * @param[in] prStaRec               Pointer to the STA_RECORD_T
3472 *
3473 * @return (none)
3474 */
3475 /*----------------------------------------------------------------------------*/
3476 VOID
3477 aisUpdateBssInfoForMergeIBSS (
3478     IN P_ADAPTER_T prAdapter,
3479     IN P_STA_RECORD_T prStaRec
3480     )
3481 {
3482     P_AIS_FSM_INFO_T prAisFsmInfo;
3483     P_BSS_INFO_T prAisBssInfo;
3484     P_CONNECTION_SETTINGS_T prConnSettings;
3485     P_BSS_DESC_T prBssDesc;
3486     //UINT_16 u2IELength;
3487     //PUINT_8 pucIE;
3488
3489
3490     ASSERT(prStaRec);
3491
3492     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3493     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3494     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3495
3496     cnmTimerStopTimer(prAdapter, &prAisFsmInfo->rIbssAloneTimer);
3497
3498     if (!prAisBssInfo->fgIsBeaconActivated) {
3499
3500         //3 <1> Update BSS_INFO_T per Network Basis
3501         //4 <1.1> Setup Operation Mode
3502         prAisBssInfo->eCurrentOPMode = OP_MODE_IBSS;
3503
3504         //4 <1.2> Setup SSID
3505         COPY_SSID(prAisBssInfo->aucSSID,
3506                   prAisBssInfo->ucSSIDLen,
3507                   prConnSettings->aucSSID,
3508                   prConnSettings->ucSSIDLen);
3509
3510         //4 <1.3> Clear current AP's STA_RECORD_T and current AID
3511         prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3512         prAisBssInfo->u2AssocId = 0;
3513     }
3514
3515     //3 <2> Update BSS_INFO_T from STA_RECORD_T
3516     //4 <2.1> Setup Capability
3517     prAisBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use Peer's Cap Info as IBSS Cap Info */
3518
3519     if (prAisBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE) {
3520         prAisBssInfo->fgIsShortPreambleAllowed = TRUE;
3521         prAisBssInfo->fgUseShortPreamble = TRUE;
3522     }
3523     else {
3524         prAisBssInfo->fgIsShortPreambleAllowed = FALSE;
3525         prAisBssInfo->fgUseShortPreamble = FALSE;
3526     }
3527
3528     // 7.3.1.4 For IBSS, the Short Slot Time subfield shall be set to 0.
3529     prAisBssInfo->fgUseShortSlotTime = FALSE; /* Set to FALSE for AdHoc */
3530     prAisBssInfo->u2CapInfo &= ~CAP_INFO_SHORT_SLOT_TIME;
3531
3532     if (prAisBssInfo->u2CapInfo & CAP_INFO_PRIVACY) {
3533         prAisBssInfo->fgIsProtection= TRUE;
3534     }
3535     else {
3536         prAisBssInfo->fgIsProtection = FALSE;
3537     }
3538
3539     //4 <2.2> Setup PHY Attributes and Basic Rate Set/Operational Rate Set
3540     prAisBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
3541
3542     prAisBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
3543
3544     prAisBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
3545     prAisBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
3546
3547     rateGetDataRatesFromRateSet(prAisBssInfo->u2OperationalRateSet,
3548                                 prAisBssInfo->u2BSSBasicRateSet,
3549                                 prAisBssInfo->aucAllSupportedRates,
3550                                 &prAisBssInfo->ucAllSupportedRatesLen);
3551
3552     //3 <3> X Update BSS_INFO_T from SW_RFB_T (Association Resp Frame)
3553
3554
3555     //3 <4> Update BSS_INFO_T from BSS_DESC_T
3556     prBssDesc = scanSearchBssDescByTA(prAdapter, prStaRec->aucMacAddr);
3557     if(prBssDesc) {
3558         prBssDesc->fgIsConnecting = FALSE;
3559         prBssDesc->fgIsConnected = TRUE;
3560
3561         //4 <4.1> Setup BSSID
3562         COPY_MAC_ADDR(prAisBssInfo->aucBSSID, prBssDesc->aucBSSID);
3563
3564         //4 <4.2> Setup Channel, Band
3565         prAisBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
3566         prAisBssInfo->eBand = prBssDesc->eBand;
3567
3568         //4 <4.3> Setup MIB for current BSS
3569         prAisBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
3570         prAisBssInfo->ucDTIMPeriod = 0;
3571         prAisBssInfo->u2ATIMWindow = 0; /* TBD(Kevin) */
3572
3573         prAisBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_ADHOC;
3574     }
3575     else {
3576         // should never happen
3577         ASSERT(0);
3578     }
3579
3580
3581     //3 <5> Set MAC HW
3582     //4 <5.1> Find Lowest Basic Rate Index for default TX Rate of MMPDU
3583     {
3584         UINT_8 ucLowestBasicRateIndex;
3585
3586         if (!rateGetLowestRateIndexFromRateSet(prAisBssInfo->u2BSSBasicRateSet,
3587                                               &ucLowestBasicRateIndex)) {
3588
3589             if (prAisBssInfo->ucPhyTypeSet & PHY_TYPE_BIT_OFDM) {
3590                 ucLowestBasicRateIndex = RATE_6M_INDEX;
3591             }
3592             else {
3593                 ucLowestBasicRateIndex = RATE_1M_INDEX;
3594             }
3595         }
3596
3597         prAisBssInfo->ucHwDefaultFixedRateCode =
3598             aucRateIndex2RateCode[prAisBssInfo->fgUseShortPreamble][ucLowestBasicRateIndex];
3599     }
3600
3601     //4 <5.2> Setup channel and bandwidth
3602     rlmBssInitForAPandIbss(prAdapter, prAisBssInfo);
3603
3604     //4 <5.3> use command packets to inform firmware
3605     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3606
3607     //4 <5.4> enable beaconing
3608     bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_AIS_INDEX);
3609
3610     //4 <5.5> Update AdHoc PM parameter
3611     nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_AIS_INDEX);
3612
3613     //3 <6> Set ACTIVE flag.
3614     prAisBssInfo->fgIsBeaconActivated = TRUE;
3615     prAisBssInfo->fgHoldSameBssidForIBSS = TRUE;
3616
3617     return;
3618 } /* end of aisUpdateBssInfoForMergeIBSS() */
3619
3620
3621 /*----------------------------------------------------------------------------*/
3622 /*!
3623 * @brief This function will validate the Rx Probe Request Frame and then return
3624 *        result to BSS to indicate if need to send the corresponding Probe Response
3625 *        Frame if the specified conditions were matched.
3626 *
3627 * @param[in] prAdapter          Pointer to the Adapter structure.
3628 * @param[in] prSwRfb            Pointer to SW RFB data structure.
3629 * @param[out] pu4ControlFlags   Control flags for replying the Probe Response
3630 *
3631 * @retval TRUE      Reply the Probe Response
3632 * @retval FALSE     Don't reply the Probe Response
3633 */
3634 /*----------------------------------------------------------------------------*/
3635 BOOLEAN
3636 aisValidateProbeReq (
3637     IN P_ADAPTER_T prAdapter,
3638     IN P_SW_RFB_T prSwRfb,
3639     OUT PUINT_32 pu4ControlFlags
3640     )
3641 {
3642     P_WLAN_MAC_MGMT_HEADER_T prMgtHdr;
3643     P_BSS_INFO_T prBssInfo;
3644     P_IE_SSID_T prIeSsid = (P_IE_SSID_T)NULL;
3645     PUINT_8 pucIE;
3646     UINT_16 u2IELength;
3647     UINT_16 u2Offset = 0;
3648     BOOLEAN fgReplyProbeResp = FALSE;
3649
3650
3651     ASSERT(prSwRfb);
3652     ASSERT(pu4ControlFlags);
3653
3654     prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3655
3656     //4 <1> Parse Probe Req IE and Get IE ptr (SSID, Supported Rate IE, ...)
3657     prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T)prSwRfb->pvHeader;
3658
3659     u2IELength = prSwRfb->u2PacketLen - prSwRfb->u2HeaderLen;
3660     pucIE = (PUINT_8)((UINT_32)prSwRfb->pvHeader + prSwRfb->u2HeaderLen);
3661
3662     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
3663         if (ELEM_ID_SSID == IE_ID(pucIE)) {
3664             if ((!prIeSsid) &&
3665                 (IE_LEN(pucIE) <= ELEM_MAX_LEN_SSID)) {
3666                 prIeSsid = (P_IE_SSID_T)pucIE;
3667             }
3668             break;
3669         }
3670     } /* end of IE_FOR_EACH */
3671
3672     //4 <2> Check network conditions
3673
3674     if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
3675
3676         if ((prIeSsid) &&
3677             ((prIeSsid->ucLength == BC_SSID_LEN) || /* WILDCARD SSID */
3678              EQUAL_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, /* CURRENT SSID */
3679                         prIeSsid->aucSSID, prIeSsid->ucLength)) ) {
3680             fgReplyProbeResp = TRUE;
3681         }
3682     }
3683
3684     return fgReplyProbeResp;
3685
3686 } /* end of aisValidateProbeReq() */
3687
3688 #endif /* CFG_SUPPORT_ADHOC */
3689
3690 /*----------------------------------------------------------------------------*/
3691 /*!
3692 * @brief This function will modify and update necessary information to firmware
3693 *        for disconnection handling
3694 *
3695 * @param[in] prAdapter          Pointer to the Adapter structure.
3696 *
3697 * @retval None
3698 */
3699 /*----------------------------------------------------------------------------*/
3700 VOID
3701 aisFsmDisconnect (
3702     IN P_ADAPTER_T prAdapter,
3703     IN BOOLEAN     fgDelayIndication
3704     )
3705 {
3706     P_BSS_INFO_T prAisBssInfo;
3707
3708     ASSERT(prAdapter);
3709
3710     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
3711
3712     nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
3713
3714 #if CFG_SUPPORT_ADHOC
3715     if (prAisBssInfo->fgIsBeaconActivated) {
3716         nicUpdateBeaconIETemplate(prAdapter,
3717                 IE_UPD_METHOD_DELETE_ALL,
3718                 NETWORK_TYPE_AIS_INDEX,
3719                 0,
3720                 NULL,
3721                 0);
3722
3723         prAisBssInfo->fgIsBeaconActivated = FALSE;
3724     }
3725 #endif
3726
3727     rlmBssAborted(prAdapter, prAisBssInfo);
3728
3729     //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
3730     if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
3731
3732         if (prAisBssInfo->ucReasonOfDisconnect == DISCONNECT_REASON_CODE_RADIO_LOST) {
3733             scanRemoveBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3734
3735             /* remove from scanning results as well */
3736             wlanClearBssInScanningResult(prAdapter, prAisBssInfo->aucBSSID);
3737
3738             /* trials for re-association */
3739             if (fgDelayIndication) {
3740                 aisFsmIsRequestPending(prAdapter, AIS_REQUEST_RECONNECT, TRUE);
3741                 aisFsmInsertRequest(prAdapter, AIS_REQUEST_RECONNECT);
3742             }
3743         }
3744         else {
3745             scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
3746         }
3747
3748         if (fgDelayIndication) {
3749             if (OP_MODE_IBSS != prAisBssInfo->eCurrentOPMode) {
3750                 prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3751             }
3752         }
3753         else {
3754             prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3755         }
3756     }
3757     else {
3758         prAisBssInfo->fgHoldSameBssidForIBSS = FALSE;
3759     }
3760
3761
3762     //4 <4> Change Media State immediately.
3763     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
3764
3765     //4 <4.1> sync. with firmware
3766     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
3767
3768     if (!fgDelayIndication) {
3769         //4 <5> Deactivate previous AP's STA_RECORD_T or all Clients in Driver if have.
3770         if (prAisBssInfo->prStaRecOfAP) {
3771             //cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
3772
3773             prAisBssInfo->prStaRecOfAP = (P_STA_RECORD_T)NULL;
3774         }
3775     }
3776
3777 #if CFG_SUPPORT_ROAMING
3778     roamingFsmRunEventAbort(prAdapter);
3779
3780     /* clear pending roaming connection request */
3781     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
3782     aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
3783 #endif /* CFG_SUPPORT_ROAMING */
3784
3785     //4 <6> Indicate Disconnected Event to Host
3786     aisIndicationOfMediaStateToHost(prAdapter,
3787             PARAM_MEDIA_STATE_DISCONNECTED,
3788             fgDelayIndication);
3789
3790
3791     //4 <7> Trigger AIS FSM
3792     aisFsmSteps(prAdapter, AIS_STATE_IDLE);
3793
3794     return;
3795 } /* end of aisFsmDisconnect() */
3796
3797
3798 /*----------------------------------------------------------------------------*/
3799 /*!
3800 * @brief This function will indicate an Event of Scan done Time-Out to AIS FSM.
3801 *
3802 * @param[in] u4Param  Unused timer parameter
3803 *
3804 * @return (none)
3805 */
3806 /*----------------------------------------------------------------------------*/
3807 VOID
3808 aisFsmRunEventScanDoneTimeOut (
3809     IN P_ADAPTER_T prAdapter,
3810     UINT_32 u4Param
3811     )
3812 {
3813     DEBUGFUNC("aisFsmRunEventScanDoneTimeOut()");
3814
3815     P_AIS_FSM_INFO_T prAisFsmInfo;
3816     ENUM_AIS_STATE_T eNextState;
3817     P_CONNECTION_SETTINGS_T prConnSettings;
3818
3819     ASSERT(prAdapter);
3820
3821     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3822     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
3823
3824     DBGLOG(AIS, STATE, ("aisFsmRunEventScanDoneTimeOut Current[%d]\n",prAisFsmInfo->eCurrentState));
3825
3826     prConnSettings->fgIsScanReqIssued = FALSE;
3827     kalScanDone(prAdapter->prGlueInfo, KAL_NETWORK_TYPE_AIS_INDEX, WLAN_STATUS_SUCCESS);
3828     eNextState = prAisFsmInfo->eCurrentState;
3829
3830     switch (prAisFsmInfo->eCurrentState) {
3831             case AIS_STATE_SCAN:
3832                 prAisFsmInfo->u4ScanIELength = 0;
3833                 eNextState = AIS_STATE_IDLE;
3834                 break;
3835             case AIS_STATE_ONLINE_SCAN:
3836                 /* reset scan IE buffer */
3837                 prAisFsmInfo->u4ScanIELength = 0;
3838 #if CFG_SUPPORT_ROAMING
3839                 eNextState = aisFsmRoamingScanResultsUpdate(prAdapter);
3840 #else
3841                 eNextState = AIS_STATE_NORMAL_TR;
3842 #endif /* CFG_SUPPORT_ROAMING */
3843                 break;
3844             default:
3845                 break;
3846         }
3847
3848         if (eNextState != prAisFsmInfo->eCurrentState) {
3849             aisFsmSteps(prAdapter, eNextState);
3850         }
3851
3852     return;
3853 } /* end of aisFsmBGSleepTimeout() */
3854
3855
3856 /*----------------------------------------------------------------------------*/
3857 /*!
3858 * @brief This function will indicate an Event of "Background Scan Time-Out" to AIS FSM.
3859 *
3860 * @param[in] u4Param  Unused timer parameter
3861 *
3862 * @return (none)
3863 */
3864 /*----------------------------------------------------------------------------*/
3865 VOID
3866 aisFsmRunEventBGSleepTimeOut (
3867     IN P_ADAPTER_T prAdapter,
3868     UINT_32 u4Param
3869     )
3870 {
3871     P_AIS_FSM_INFO_T prAisFsmInfo;
3872     ENUM_AIS_STATE_T eNextState;
3873
3874     DEBUGFUNC("aisFsmRunEventBGSleepTimeOut()");
3875
3876     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3877
3878     eNextState = prAisFsmInfo->eCurrentState;
3879
3880     switch (prAisFsmInfo->eCurrentState) {
3881     case AIS_STATE_WAIT_FOR_NEXT_SCAN:
3882         DBGLOG(AIS, LOUD, ("EVENT - SCAN TIMER: Idle End - Current Time = %ld\n", kalGetTimeTick()));
3883
3884         eNextState = AIS_STATE_LOOKING_FOR;
3885
3886         SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX);
3887
3888         break;
3889
3890     default:
3891         break;
3892     }
3893
3894     /* Call aisFsmSteps() when we are going to change AIS STATE */
3895     if (eNextState != prAisFsmInfo->eCurrentState) {
3896         aisFsmSteps(prAdapter, eNextState);
3897     }
3898
3899     return;
3900 } /* end of aisFsmBGSleepTimeout() */
3901
3902
3903 /*----------------------------------------------------------------------------*/
3904 /*!
3905 * @brief This function will indicate an Event of "IBSS ALONE Time-Out" to AIS FSM.
3906 *
3907 * @param[in] u4Param  Unused timer parameter
3908 *
3909 * @return (none)
3910 */
3911 /*----------------------------------------------------------------------------*/
3912 VOID
3913 aisFsmRunEventIbssAloneTimeOut (
3914     IN P_ADAPTER_T prAdapter,
3915     UINT_32 u4Param
3916     )
3917 {
3918     P_AIS_FSM_INFO_T prAisFsmInfo;
3919     ENUM_AIS_STATE_T eNextState;
3920
3921     DEBUGFUNC("aisFsmRunEventIbssAloneTimeOut()");
3922
3923     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3924     eNextState = prAisFsmInfo->eCurrentState;
3925
3926     switch(prAisFsmInfo->eCurrentState) {
3927     case AIS_STATE_IBSS_ALONE:
3928
3929         /* There is no one participate in our AdHoc during this TIMEOUT Interval
3930          * so go back to search for a valid IBSS again.
3931          */
3932
3933         DBGLOG(AIS, LOUD, ("EVENT-IBSS ALONE TIMER: Start pairing\n"));
3934
3935         prAisFsmInfo->fgTryScan = TRUE;
3936
3937         /* abort timer */
3938         aisFsmReleaseCh(prAdapter);
3939
3940         /* Pull back to SEARCH to find candidate again */
3941         eNextState = AIS_STATE_SEARCH;
3942
3943         break;
3944
3945     default:
3946         break;
3947     }
3948
3949
3950     /* Call aisFsmSteps() when we are going to change AIS STATE */
3951     if (eNextState != prAisFsmInfo->eCurrentState) {
3952         aisFsmSteps(prAdapter, eNextState);
3953     }
3954
3955     return;
3956 } /* end of aisIbssAloneTimeOut() */
3957
3958
3959 /*----------------------------------------------------------------------------*/
3960 /*!
3961 * @brief This function will indicate an Event of "Join Time-Out" to AIS FSM.
3962 *
3963 * @param[in] u4Param  Unused timer parameter
3964 *
3965 * @return (none)
3966 */
3967 /*----------------------------------------------------------------------------*/
3968 VOID
3969 aisFsmRunEventJoinTimeout (
3970     IN P_ADAPTER_T prAdapter,
3971     UINT_32 u4Param
3972     )
3973 {
3974     P_AIS_FSM_INFO_T prAisFsmInfo;
3975     ENUM_AIS_STATE_T eNextState;
3976
3977     DEBUGFUNC("aisFsmRunEventJoinTimeout()");
3978
3979     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
3980     eNextState = prAisFsmInfo->eCurrentState;
3981
3982     switch(prAisFsmInfo->eCurrentState) {
3983     case AIS_STATE_JOIN:
3984         DBGLOG(AIS, LOUD, ("EVENT- JOIN TIMEOUT\n"));
3985
3986         /* 1. Do abort JOIN */
3987         aisFsmStateAbort_JOIN(prAdapter);
3988
3989         /* 2. Increase Join Failure Count */
3990         prAisFsmInfo->prTargetStaRec->ucJoinFailureCount++;
3991 // For JB nl802.11
3992 #if 0
3993         if(prAisFsmInfo->prTargetStaRec->ucJoinFailureCount < JOIN_MAX_RETRY_FAILURE_COUNT) {
3994             /* 3.1 Retreat to AIS_STATE_SEARCH state for next try */
3995             eNextState = AIS_STATE_SEARCH;
3996         }
3997         else {
3998             /* 3.2 Retreat to AIS_STATE_WAIT_FOR_NEXT_SCAN state for next try */
3999             eNextState = AIS_STATE_WAIT_FOR_NEXT_SCAN;
4000         }
4001 #endif
4002         eNextState = AIS_STATE_IDLE;
4003         break;
4004
4005     case AIS_STATE_NORMAL_TR:
4006         /* 1. release channel */
4007         aisFsmReleaseCh(prAdapter);
4008         prAisFsmInfo->fgIsInfraChannelFinished = TRUE;
4009
4010         /* 2. process if there is pending scan */
4011         if(aisFsmIsRequestPending(prAdapter, AIS_REQUEST_SCAN, TRUE) == TRUE) {
4012             wlanClearScanningResult(prAdapter);
4013             eNextState = AIS_STATE_ONLINE_SCAN;
4014         }
4015
4016         break;
4017
4018     default:
4019         /* release channel */
4020         aisFsmReleaseCh(prAdapter);
4021         break;
4022
4023     }
4024
4025
4026     /* Call aisFsmSteps() when we are going to change AIS STATE */
4027     if (eNextState != prAisFsmInfo->eCurrentState) {
4028         aisFsmSteps(prAdapter, eNextState);
4029     }
4030
4031     return;
4032 } /* end of aisFsmRunEventJoinTimeout() */
4033
4034
4035 #if defined(CFG_TEST_MGMT_FSM) && (CFG_TEST_MGMT_FSM != 0)
4036 /*----------------------------------------------------------------------------*/
4037 /*!
4038 * \brief
4039 *
4040 * \param[in]
4041 *
4042 * \return none
4043 */
4044 /*----------------------------------------------------------------------------*/
4045 VOID
4046 aisTest (
4047     VOID
4048     )
4049 {
4050     P_MSG_AIS_ABORT_T prAisAbortMsg;
4051     P_CONNECTION_SETTINGS_T prConnSettings;
4052     UINT_8 aucSSID[]="pci-11n";
4053     UINT_8 ucSSIDLen=7;
4054
4055     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4056
4057     /* Set Connection Request Issued Flag */
4058     prConnSettings->fgIsConnReqIssued = TRUE;
4059     prConnSettings->ucSSIDLen = ucSSIDLen;
4060     kalMemCopy(prConnSettings->aucSSID, aucSSID, ucSSIDLen);
4061
4062     prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
4063     if (!prAisAbortMsg) {
4064
4065         ASSERT(0); // Can't trigger SCAN FSM
4066         return;
4067     }
4068
4069     prAisAbortMsg->rMsgHdr.eMsgId = MID_HEM_AIS_FSM_ABORT;
4070
4071     mboxSendMsg(prAdapter,
4072             MBOX_ID_0,
4073             (P_MSG_HDR_T) prAisAbortMsg,
4074             MSG_SEND_METHOD_BUF);
4075
4076     wifi_send_msg(INDX_WIFI, MSG_ID_WIFI_IST, 0);
4077
4078     return;
4079 }
4080 #endif /* CFG_TEST_MGMT_FSM */
4081
4082
4083 /*----------------------------------------------------------------------------*/
4084 /*!
4085 * \brief    This function is used to handle OID_802_11_BSSID_LIST_SCAN
4086 *
4087 * \param[in] prAdapter  Pointer of ADAPTER_T
4088 * \param[in] prSsid     Pointer of SSID_T if specified
4089 * \param[in] pucIe      Pointer to buffer of extra information elements to be attached
4090 * \param[in] u4IeLength Length of information elements
4091 *
4092 * \return none
4093 */
4094 /*----------------------------------------------------------------------------*/
4095 VOID
4096 aisFsmScanRequest (
4097     IN P_ADAPTER_T prAdapter,
4098     IN P_PARAM_SSID_T prSsid,
4099     IN PUINT_8  pucIe,
4100     IN UINT_32  u4IeLength
4101     )
4102 {
4103     P_CONNECTION_SETTINGS_T prConnSettings;
4104     P_BSS_INFO_T prAisBssInfo;
4105     P_AIS_FSM_INFO_T prAisFsmInfo;
4106
4107     DEBUGFUNC("aisFsmScanRequest()");
4108
4109     ASSERT(prAdapter);
4110     ASSERT(u4IeLength <= MAX_IE_LENGTH);
4111
4112     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4113     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4114     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4115
4116     if (!prConnSettings->fgIsScanReqIssued) {
4117         prConnSettings->fgIsScanReqIssued = TRUE;
4118
4119         if(prSsid == NULL) {
4120             prAisFsmInfo->ucScanSSIDLen = 0;
4121         }
4122         else {
4123             COPY_SSID(prAisFsmInfo->aucScanSSID,
4124                     prAisFsmInfo->ucScanSSIDLen,
4125                     prSsid->aucSsid,
4126                     (UINT_8)prSsid->u4SsidLen);
4127         }
4128
4129         if(u4IeLength > 0 && u4IeLength <= MAX_IE_LENGTH ) {
4130             prAisFsmInfo->u4ScanIELength = u4IeLength;
4131             kalMemCopy(prAisFsmInfo->aucScanIEBuf, pucIe, u4IeLength);
4132         }
4133         else {
4134             prAisFsmInfo->u4ScanIELength = 0;
4135         }
4136
4137         if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR) {
4138             if(prAisBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE
4139                     && prAisFsmInfo->fgIsInfraChannelFinished == FALSE) {
4140                 // 802.1x might not finished yet, pend it for later handling ..
4141                 aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4142             }
4143             else {
4144                 if(prAisFsmInfo->fgIsChannelGranted == TRUE) {
4145                     DBGLOG(AIS, WARN, ("Scan Request with channel granted for join operation: %d, %d",
4146                                 prAisFsmInfo->fgIsChannelGranted,
4147                                 prAisFsmInfo->fgIsChannelRequested));
4148                 }
4149
4150                 /* start online scan */
4151                 wlanClearScanningResult(prAdapter);
4152                 aisFsmSteps(prAdapter, AIS_STATE_ONLINE_SCAN);
4153             }
4154         }
4155         else if(prAisFsmInfo->eCurrentState == AIS_STATE_IDLE) {
4156             wlanClearScanningResult(prAdapter);
4157             aisFsmSteps(prAdapter, AIS_STATE_SCAN);
4158         }
4159         else {
4160             aisFsmInsertRequest(prAdapter, AIS_REQUEST_SCAN);
4161         }
4162     }
4163     else {
4164         DBGLOG(AIS, WARN, ("Scan Request dropped. (state: %d)\n", prAisFsmInfo->eCurrentState));
4165     }
4166
4167     return;
4168 } /* end of aisFsmScanRequest() */
4169
4170
4171 /*----------------------------------------------------------------------------*/
4172 /*!
4173 * \brief    This function is invoked when CNM granted channel privilege
4174 *
4175 * \param[in] prAdapter  Pointer of ADAPTER_T
4176 *
4177 * \return none
4178 */
4179 /*----------------------------------------------------------------------------*/
4180 VOID
4181 aisFsmRunEventChGrant (
4182     IN P_ADAPTER_T prAdapter,
4183     IN P_MSG_HDR_T prMsgHdr
4184     )
4185 {
4186     P_BSS_INFO_T prAisBssInfo;
4187     P_AIS_FSM_INFO_T prAisFsmInfo;
4188     P_MSG_CH_GRANT_T prMsgChGrant;
4189     UINT_8 ucTokenID;
4190     UINT_32 u4GrantInterval;
4191
4192     ASSERT(prAdapter);
4193     ASSERT(prMsgHdr);
4194
4195     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4196     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4197     prMsgChGrant = (P_MSG_CH_GRANT_T)prMsgHdr;
4198
4199     ucTokenID = prMsgChGrant->ucTokenID;
4200     u4GrantInterval = prMsgChGrant->u4GrantInterval;
4201
4202     /* 1. free message */
4203     cnmMemFree(prAdapter, prMsgHdr);
4204
4205     if(prAisFsmInfo->eCurrentState == AIS_STATE_REQ_CHANNEL_JOIN &&
4206             prAisFsmInfo->ucSeqNumOfChReq == ucTokenID) {
4207         /* 2. channel privilege has been approved */
4208         prAisFsmInfo->u4ChGrantedInterval = u4GrantInterval;
4209
4210         /* 3. state transition to join/ibss-alone/ibss-merge */
4211         /* 3.1 set timeout timer in cases join could not be completed */
4212         cnmTimerStartTimer(prAdapter,
4213                 &prAisFsmInfo->rJoinTimeoutTimer,
4214                 prAisFsmInfo->u4ChGrantedInterval - AIS_JOIN_CH_GRANT_THRESHOLD);
4215         /* 3.2 set local variable to indicate join timer is ticking */
4216         prAisFsmInfo->fgIsInfraChannelFinished = FALSE;
4217
4218         /* 3.3 switch to join state */
4219         aisFsmSteps(prAdapter, AIS_STATE_JOIN);
4220
4221         prAisFsmInfo->fgIsChannelGranted = TRUE;
4222     }
4223     else { /* mismatched grant */
4224         /* 2. return channel privilege to CNM immediately */
4225         aisFsmReleaseCh(prAdapter);
4226     }
4227
4228     return;
4229 } /* end of aisFsmRunEventChGrant() */
4230
4231
4232 /*----------------------------------------------------------------------------*/
4233 /*!
4234 * \brief    This function is to inform CNM that channel privilege
4235 *           has been released
4236 *
4237 * \param[in] prAdapter  Pointer of ADAPTER_T
4238 *
4239 * \return none
4240 */
4241 /*----------------------------------------------------------------------------*/
4242 VOID
4243 aisFsmReleaseCh (
4244     IN P_ADAPTER_T prAdapter
4245     )
4246 {
4247     P_AIS_FSM_INFO_T prAisFsmInfo;
4248     P_MSG_CH_ABORT_T prMsgChAbort;
4249
4250     ASSERT(prAdapter);
4251
4252     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4253
4254     if(prAisFsmInfo->fgIsChannelGranted == TRUE
4255             || prAisFsmInfo->fgIsChannelRequested == TRUE) {
4256
4257         prAisFsmInfo->fgIsChannelRequested = FALSE;
4258         prAisFsmInfo->fgIsChannelGranted = FALSE;
4259
4260         /* 1. return channel privilege to CNM immediately */
4261         prMsgChAbort = (P_MSG_CH_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
4262         if (!prMsgChAbort) {
4263             ASSERT(0); // Can't release Channel to CNM
4264             return;
4265         }
4266
4267         prMsgChAbort->rMsgHdr.eMsgId  = MID_MNY_CNM_CH_ABORT;
4268         prMsgChAbort->ucNetTypeIndex  = NETWORK_TYPE_AIS_INDEX;
4269         prMsgChAbort->ucTokenID       = prAisFsmInfo->ucSeqNumOfChReq;
4270
4271         mboxSendMsg(prAdapter,
4272                 MBOX_ID_0,
4273                 (P_MSG_HDR_T) prMsgChAbort,
4274                 MSG_SEND_METHOD_BUF);
4275     }
4276
4277     return;
4278 } /* end of aisFsmReleaseCh() */
4279
4280
4281 /*----------------------------------------------------------------------------*/
4282 /*!
4283 * \brief    This function is to inform AIS that corresponding beacon has not
4284 *           been received for a while and probing is not successful
4285 *
4286 * \param[in] prAdapter  Pointer of ADAPTER_T
4287 *
4288 * \return none
4289 */
4290 /*----------------------------------------------------------------------------*/
4291 VOID
4292 aisBssBeaconTimeout (
4293     IN P_ADAPTER_T prAdapter
4294     )
4295 {
4296     P_BSS_INFO_T prAisBssInfo;
4297     BOOLEAN fgDoAbortIndication = FALSE;
4298
4299     ASSERT(prAdapter);
4300
4301     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4302
4303     //4 <1> Diagnose Connection for Beacon Timeout Event
4304     if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4305         if (OP_MODE_INFRASTRUCTURE == prAisBssInfo->eCurrentOPMode) {
4306             P_STA_RECORD_T prStaRec = prAisBssInfo->prStaRecOfAP;
4307
4308             if (prStaRec) {
4309                 fgDoAbortIndication = TRUE;
4310             }
4311         }
4312         else if (OP_MODE_IBSS == prAisBssInfo->eCurrentOPMode) {
4313             fgDoAbortIndication = TRUE;
4314         }
4315     }
4316
4317     //4 <2> invoke abort handler
4318     if (fgDoAbortIndication) {
4319         aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_RADIO_LOST, TRUE);
4320     }
4321
4322     return;
4323 } /* end of aisBssBeaconTimeout() */
4324
4325
4326 /*----------------------------------------------------------------------------*/
4327 /*!
4328 * \brief    This function is to inform AIS that DEAUTH frame has been
4329 *           sent and thus state machine could go ahead
4330 *
4331 * \param[in] prAdapter  Pointer of ADAPTER_T
4332 * \param[in] prMsduInfo Pointer of MSDU_INFO_T for DEAUTH frame
4333 * \param[in] prAdapter  Pointer of ADAPTER_T
4334 *
4335 * \return WLAN_STATUS_SUCCESS
4336 */
4337 /*----------------------------------------------------------------------------*/
4338 WLAN_STATUS
4339 aisDeauthXmitComplete (
4340     IN P_ADAPTER_T              prAdapter,
4341     IN P_MSDU_INFO_T            prMsduInfo,
4342     IN ENUM_TX_RESULT_CODE_T    rTxDoneStatus
4343     )
4344 {
4345     P_AIS_FSM_INFO_T prAisFsmInfo;
4346
4347     ASSERT(prAdapter);
4348
4349     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4350
4351     if(prAisFsmInfo->eCurrentState == AIS_STATE_DISCONNECTING) {
4352         if(rTxDoneStatus != TX_RESULT_DROPPED_IN_DRIVER) {
4353             aisFsmStateAbort(prAdapter, DISCONNECT_REASON_CODE_NEW_CONNECTION, FALSE);
4354         }
4355     }
4356     else {
4357         DBGLOG(AIS, WARN, ("DEAUTH frame transmitted without further handling"));
4358     }
4359
4360     return WLAN_STATUS_SUCCESS;
4361
4362 } /* end of aisDeauthXmitComplete() */
4363
4364 #if CFG_SUPPORT_ROAMING
4365 /*----------------------------------------------------------------------------*/
4366 /*!
4367 * @brief This function will indicate an Event of "Looking for a candidate due to weak signal" to AIS FSM.
4368 *
4369 * @param[in] u4ReqScan  Requesting Scan or not
4370 *
4371 * @return (none)
4372 */
4373 /*----------------------------------------------------------------------------*/
4374 VOID
4375 aisFsmRunEventRoamingDiscovery (
4376     IN P_ADAPTER_T prAdapter,
4377     UINT_32 u4ReqScan
4378     )
4379 {
4380     P_AIS_FSM_INFO_T prAisFsmInfo;
4381     P_CONNECTION_SETTINGS_T prConnSettings;
4382     ENUM_AIS_REQUEST_TYPE_T eAisRequest;
4383
4384     DBGLOG(AIS, LOUD, ("aisFsmRunEventRoamingDiscovery()\n"));
4385
4386     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4387     prConnSettings = &(prAdapter->rWifiVar.rConnSettings);
4388
4389     /* search candidates by best rssi */
4390     prConnSettings->eConnectionPolicy = CONNECT_BY_SSID_BEST_RSSI;
4391
4392     /* results are still new */
4393     if (!u4ReqScan) {
4394         roamingFsmRunEventRoam(prAdapter);
4395         eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4396     }
4397     else {
4398         if(prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN
4399                 || prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4400             eAisRequest = AIS_REQUEST_ROAMING_CONNECT;
4401         }
4402         else {
4403             eAisRequest = AIS_REQUEST_ROAMING_SEARCH;
4404         }
4405     }
4406
4407     if(prAisFsmInfo->eCurrentState == AIS_STATE_NORMAL_TR && prAisFsmInfo->fgIsInfraChannelFinished == TRUE) {
4408         if(eAisRequest == AIS_REQUEST_ROAMING_SEARCH) {
4409             aisFsmSteps(prAdapter, AIS_STATE_LOOKING_FOR);
4410         }
4411         else {
4412             aisFsmSteps(prAdapter, AIS_STATE_SEARCH);
4413         }
4414     }
4415     else {
4416         aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_SEARCH, TRUE);
4417         aisFsmIsRequestPending(prAdapter, AIS_REQUEST_ROAMING_CONNECT, TRUE);
4418
4419         aisFsmInsertRequest(prAdapter, eAisRequest);
4420     }
4421
4422     return;
4423 } /* end of aisFsmRunEventRoamingDiscovery() */
4424
4425 /*----------------------------------------------------------------------------*/
4426 /*!
4427 * @brief Update the time of ScanDone for roaming and transit to Roam state.
4428 *
4429 * @param (none)
4430 *
4431 * @return (none)
4432 */
4433 /*----------------------------------------------------------------------------*/
4434 ENUM_AIS_STATE_T
4435 aisFsmRoamingScanResultsUpdate (
4436     IN P_ADAPTER_T prAdapter
4437     )
4438 {
4439           P_AIS_FSM_INFO_T prAisFsmInfo;
4440           P_ROAMING_INFO_T prRoamingFsmInfo;
4441           ENUM_AIS_STATE_T eNextState;
4442
4443     DBGLOG(AIS, LOUD, ("->aisFsmRoamingScanResultsUpdate()\n"));
4444
4445     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4446     prRoamingFsmInfo = (P_ROAMING_INFO_T)&(prAdapter->rWifiVar.rRoamingInfo);
4447
4448     roamingFsmScanResultsUpdate(prAdapter);
4449
4450     eNextState = prAisFsmInfo->eCurrentState;
4451     if (prRoamingFsmInfo->eCurrentState == ROAMING_STATE_DISCOVERY) {
4452         roamingFsmRunEventRoam(prAdapter);
4453         eNextState = AIS_STATE_SEARCH;
4454     }
4455     else if (prAisFsmInfo->eCurrentState == AIS_STATE_LOOKING_FOR) {
4456         eNextState = AIS_STATE_SEARCH;
4457     }
4458     else if (prAisFsmInfo->eCurrentState == AIS_STATE_ONLINE_SCAN) {
4459         eNextState = AIS_STATE_NORMAL_TR;
4460     }
4461
4462     return eNextState;
4463 } /* end of aisFsmRoamingScanResultsUpdate() */
4464
4465 /*----------------------------------------------------------------------------*/
4466 /*!
4467 * @brief This function will modify and update necessary information to firmware
4468 *        for disconnection of last AP before switching to roaming bss.
4469 *
4470 * @param IN prAdapter          Pointer to the Adapter structure.
4471 *           prTargetStaRec     Target of StaRec of roaming
4472 *
4473 * @retval None
4474 */
4475 /*----------------------------------------------------------------------------*/
4476 VOID
4477 aisFsmRoamingDisconnectPrevAP (
4478     IN P_ADAPTER_T prAdapter,
4479     IN P_STA_RECORD_T prTargetStaRec
4480     )
4481 {
4482     P_BSS_INFO_T prAisBssInfo;
4483
4484     DBGLOG(AIS, LOUD, ("aisFsmRoamingDisconnectPrevAP()"));
4485
4486     ASSERT(prAdapter);
4487
4488     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4489
4490     nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_AIS_INDEX);
4491
4492     /* Not invoke rlmBssAborted() here to avoid prAisBssInfo->fg40mBwAllowed
4493      * to be reset. RLM related parameters will be reset again when handling
4494      * association response in rlmProcessAssocRsp(). 20110413
4495      */
4496      //rlmBssAborted(prAdapter, prAisBssInfo);
4497
4498     //4 <3> Unset the fgIsConnected flag of BSS_DESC_T and send Deauth if needed.
4499     if (PARAM_MEDIA_STATE_CONNECTED == prAisBssInfo->eConnectionState) {
4500         scanRemoveConnFlagOfBssDescByBssid(prAdapter, prAisBssInfo->aucBSSID);
4501     }
4502
4503     //4 <4> Change Media State immediately.
4504     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
4505
4506     //4 <4.1> sync. with firmware
4507     prTargetStaRec->ucNetTypeIndex = 0xff; /* Virtial NetType */
4508     nicUpdateBss(prAdapter, NETWORK_TYPE_AIS_INDEX);
4509     prTargetStaRec->ucNetTypeIndex = NETWORK_TYPE_AIS_INDEX; /* Virtial NetType */
4510
4511     return;
4512 } /* end of aisFsmRoamingDisconnectPrevAP() */
4513
4514 /*----------------------------------------------------------------------------*/
4515 /*!
4516 * @brief This function will update the contain of BSS_INFO_T for AIS network once
4517 *        the roaming was completed.
4518 *
4519 * @param IN prAdapter          Pointer to the Adapter structure.
4520 *           prStaRec           StaRec of roaming AP
4521 *           prAssocRspSwRfb
4522 *
4523 * @retval None
4524 */
4525 /*----------------------------------------------------------------------------*/
4526 VOID
4527 aisUpdateBssInfoForRoamingAP (
4528     IN P_ADAPTER_T prAdapter,
4529     IN P_STA_RECORD_T prStaRec,
4530     IN P_SW_RFB_T prAssocRspSwRfb
4531     )
4532 {
4533     P_BSS_INFO_T prAisBssInfo;
4534
4535     DBGLOG(AIS, LOUD, ("aisUpdateBssInfoForRoamingAP()"));
4536
4537     ASSERT(prAdapter);
4538
4539     prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
4540
4541     //4 <1.1> Change FW's Media State immediately.
4542     aisChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
4543
4544     //4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have.
4545     if ((prAisBssInfo->prStaRecOfAP) &&
4546        (prAisBssInfo->prStaRecOfAP != prStaRec) &&
4547        (prAisBssInfo->prStaRecOfAP->fgIsInUse)) {
4548         cnmStaRecChangeState(prAdapter, prAisBssInfo->prStaRecOfAP, STA_STATE_1);
4549     }
4550
4551     //4 <1.3> Update BSS_INFO_T
4552     aisUpdateBssInfoForJOIN(prAdapter, prStaRec, prAssocRspSwRfb);
4553
4554     //4 <1.4> Activate current AP's STA_RECORD_T in Driver.
4555     cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
4556
4557     //4 <1.6> Indicate Connected Event to Host immediately.
4558     /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
4559     aisIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, FALSE);
4560
4561     return;
4562 } /* end of aisFsmRoamingUpdateBss() */
4563
4564 #endif /* CFG_SUPPORT_ROAMING */
4565
4566
4567 /*----------------------------------------------------------------------------*/
4568 /*!
4569 * @brief Check if there is any pending request and remove it (optional)
4570 *
4571 * @param prAdapter
4572 *        eReqType
4573 *        bRemove
4574 *
4575 * @return TRUE
4576 *         FALSE
4577 */
4578 /*----------------------------------------------------------------------------*/
4579 BOOLEAN
4580 aisFsmIsRequestPending (
4581     IN P_ADAPTER_T prAdapter,
4582     IN ENUM_AIS_REQUEST_TYPE_T eReqType,
4583     IN BOOLEAN bRemove
4584     )
4585 {
4586     P_AIS_FSM_INFO_T prAisFsmInfo;
4587     P_AIS_REQ_HDR_T prPendingReqHdr, prPendingReqHdrNext;
4588
4589     ASSERT(prAdapter);
4590     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4591
4592     /* traverse through pending request list */
4593     LINK_FOR_EACH_ENTRY_SAFE(prPendingReqHdr,
4594             prPendingReqHdrNext,
4595             &(prAisFsmInfo->rPendingReqList),
4596             rLinkEntry,
4597             AIS_REQ_HDR_T) {
4598         /* check for specified type */
4599         if(prPendingReqHdr->eReqType == eReqType) {
4600             /* check if need to remove */
4601             if(bRemove == TRUE) {
4602                 LINK_REMOVE_KNOWN_ENTRY(&(prAisFsmInfo->rPendingReqList), &(prPendingReqHdr->rLinkEntry));
4603
4604                 cnmMemFree(prAdapter, prPendingReqHdr);
4605             }
4606
4607             return TRUE;
4608         }
4609     }
4610
4611     return FALSE;
4612 }
4613
4614
4615 /*----------------------------------------------------------------------------*/
4616 /*!
4617 * @brief Get next pending request
4618 *
4619 * @param prAdapter
4620 *
4621 * @return P_AIS_REQ_HDR_T
4622 */
4623 /*----------------------------------------------------------------------------*/
4624 P_AIS_REQ_HDR_T
4625 aisFsmGetNextRequest (
4626     IN P_ADAPTER_T prAdapter
4627     )
4628 {
4629     P_AIS_FSM_INFO_T prAisFsmInfo;
4630     P_AIS_REQ_HDR_T prPendingReqHdr;
4631
4632     ASSERT(prAdapter);
4633     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4634
4635     LINK_REMOVE_HEAD(&(prAisFsmInfo->rPendingReqList), prPendingReqHdr, P_AIS_REQ_HDR_T);
4636
4637     return prPendingReqHdr;
4638 }
4639
4640
4641 /*----------------------------------------------------------------------------*/
4642 /*!
4643 * @brief Insert a new request
4644 *
4645 * @param prAdapter
4646 *        eReqType
4647 *
4648 * @return TRUE
4649 *         FALSE
4650 */
4651 /*----------------------------------------------------------------------------*/
4652 BOOLEAN
4653 aisFsmInsertRequest (
4654     IN P_ADAPTER_T prAdapter,
4655     IN ENUM_AIS_REQUEST_TYPE_T eReqType
4656     )
4657 {
4658     P_AIS_REQ_HDR_T prAisReq;
4659     P_AIS_FSM_INFO_T prAisFsmInfo;
4660
4661     ASSERT(prAdapter);
4662     prAisFsmInfo = &(prAdapter->rWifiVar.rAisFsmInfo);
4663
4664     prAisReq = (P_AIS_REQ_HDR_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(AIS_REQ_HDR_T));
4665
4666     if(!prAisReq) {
4667         ASSERT(0); // Can't generate new message
4668         return FALSE;
4669     }
4670
4671     prAisReq->eReqType = eReqType;
4672
4673     /* attach request into pending request list */
4674     LINK_INSERT_TAIL(&prAisFsmInfo->rPendingReqList, &prAisReq->rLinkEntry);
4675
4676     return TRUE;
4677 }
4678
4679
4680 /*----------------------------------------------------------------------------*/
4681 /*!
4682 * @brief Flush all pending requests
4683 *
4684 * @param prAdapter
4685 *
4686 * @return (none)
4687 */
4688 /*----------------------------------------------------------------------------*/
4689 VOID
4690 aisFsmFlushRequest (
4691     IN P_ADAPTER_T prAdapter
4692     )
4693 {
4694     P_AIS_REQ_HDR_T prAisReq;
4695
4696     ASSERT(prAdapter);
4697
4698     while((prAisReq = aisFsmGetNextRequest(prAdapter)) != NULL) {
4699         cnmMemFree(prAdapter, prAisReq);
4700     }
4701
4702     return;
4703 }
4704
4705